Index: /tags/ipp-ps1-20210510/psastro/src/psastroLoadCrosstalk.c
===================================================================
--- /tags/ipp-ps1-20210510/psastro/src/psastroLoadCrosstalk.c	(revision 41632)
+++ /tags/ipp-ps1-20210510/psastro/src/psastroLoadCrosstalk.c	(revision 41633)
@@ -559,5 +559,5 @@
                     // TdB20210304: This should not be relevant for faint crosstalk rules. Do this rather ad hoc right now by placing a limit at 8 mags of difference
                     if( crossMagOffset[k] > 8.) { continue; }
-	            if (cal->Mag < SPIKE_MAX_MAG) {	      
+	            if ((cal->Mag + MagOffset) < SPIKE_MAX_MAG) {	      
 	              int Xt = X;
 	              int Yt = Y;
@@ -597,5 +597,5 @@
 		        pmAstromObj *crosstalk = pmAstromObjAlloc();
 		
-		        crosstalk->Mag = cal->Mag;
+		        crosstalk->Mag = cal->Mag + MagOffset;
 		        crosstalk->chip->x = x_t_chip;
 		        crosstalk->chip->y = y_t_chip;
@@ -777,5 +777,5 @@
 		        pmAstromObj *crosstalk = pmAstromObjAlloc();
 		
-		        crosstalk->Mag = ref->Mag - MagOffset;
+		        crosstalk->Mag = ref->Mag ;
 		        crosstalk->chip->x = x_t_chip;
 		        crosstalk->chip->y = y_t_chip;
Index: /tags/ipp-ps1-20210510/psastro/src/psastroLoadGhosts.c
===================================================================
--- /tags/ipp-ps1-20210510/psastro/src/psastroLoadGhosts.c	(revision 41632)
+++ /tags/ipp-ps1-20210510/psastro/src/psastroLoadGhosts.c	(revision 41633)
@@ -144,4 +144,14 @@
     pmFPA *fpa = astrom->fpa;
 
+    // select the reference mask fpa :: we use this to determine cell boundaries
+    pmFPAfile *refMask = psMetadataLookupPtr (NULL, config->files, "PSASTRO.REFMASK");
+    if (!refMask) {
+      psError(PSASTRO_ERR_CONFIG, true, "Can't find mask reference");
+      return false;
+    }
+    // Activate the reference mask to generate an FPA structure we can use to map stars down to cells
+    pmFPAfileActivate (config->files, false, NULL);
+    pmFPAfileActivate (config->files, true, "PSASTRO.REFMASK");
+
     // raise an error if the config is broken
     if (!psastroZeroPointFromRecipe (&zeropt, &exptime, &INSTR_MAX_MAG, NULL, fpa, recipe)) {
@@ -161,4 +171,15 @@
         if (!chip->fromFPA) { continue; }
 
+        // Get the current chip's name, and parse out the grid location.
+        pmChip *refChip  = pmFPAviewThisChip (view, refMask->fpa);
+        const char *chipName = psMetadataLookupStr(NULL,refChip->concepts, "CHIP.NAME");
+        int X = chipName[2] - '0';
+        int Y = chipName[3] - '0';
+
+        //Check if we are in the central 8 chips, where old ghost-style locations work better
+        int cenChip = 0;
+        if ( (Y >= 3)&&(Y <=4)&&(X >= 2)&&(X <= 5) ) {cenChip = 1;}
+        
+
         while ((cell = pmFPAviewNextCell (view, fpa, 1)) != NULL) {
             psTrace ("psastro", 4, "Cell %d: %x %x\n", view->cell, cell->file_exists, cell->process);
@@ -200,5 +221,5 @@
 		        ghost->FP->y = ghost_y_fpa_mirror + psPolynomial2DEval(centerY, ghost_x_fpa_mirror, ghost_y_fpa_mirror);
                     }  
-                    if(!mirCheck) {
+                    if(!mirCheck | cenChip) {
                         //Use the old-style ghost position determination
                         ghost->FP->x = -cal->FP->x + psPolynomial2DEval(centerX, -cal->FP->x, -cal->FP->y);
Index: /tags/ipp-ps1-20210510/psastro/src/psastroMaskUpdates.c
===================================================================
--- /tags/ipp-ps1-20210510/psastro/src/psastroMaskUpdates.c	(revision 41632)
+++ /tags/ipp-ps1-20210510/psastro/src/psastroMaskUpdates.c	(revision 41633)
@@ -479,5 +479,6 @@
                             ref->chip->x,ref->chip->y,ref->Mag,radius);
                     // XXX for now, assume cell binning is 1x1 relative to chip
-                    psastroMaskCircle (readoutMask->mask, crosstalkMaskValue, ref->chip->x, ref->chip->y, radius, radius);
+                    //For the moment, make the crostalk masks into ovals by doing a simple 1:2 scaling with radius. Not ideal, but better until we can get more examples.
+                    psastroMaskCircle (readoutMask->mask, crosstalkMaskValue, ref->chip->x, ref->chip->y, radius/2., radius);
                   }
                 }
