Index: trunk/psastro/src/psastroMaskUpdates.c
===================================================================
--- trunk/psastro/src/psastroMaskUpdates.c	(revision 40490)
+++ trunk/psastro/src/psastroMaskUpdates.c	(revision 41338)
@@ -134,6 +134,7 @@
     
     double REFSTAR_MASK_MAX_MAG            = psMetadataLookupF32 (&status, recipe, "REFSTAR_MASK_MAX_MAG");
-    double REFSTAR_MASK_SATSTAR_MAG_SLOPE  = psMetadataLookupF32 (&status, recipe, "REFSTAR_MASK_SATSTAR_MAG_SLOPE");
     double REFSTAR_MASK_SATSTAR_MAG_MAX    = psMetadataLookupF32 (&status, recipe, "REFSTAR_MASK_SATSTAR_MAG_MAX");
+    double REFSTAR_MASK_SATSTAR_RAD_OFFSET = psMetadataLookupF32 (&status, recipe, "REFSTAR_MASK_SATSTAR_RAD_OFFSET");
+    double REFSTAR_MASK_SATSTAR_EXP        = psMetadataLookupF32 (&status, recipe, "REFSTAR_MASK_SATSTAR_EXP");
     double REFSTAR_MASK_SATSTAR_POS_ZERO   = psMetadataLookupF32 (&status, recipe, "REFSTAR_MASK_SATSTAR_POS_ZERO");
     double REFSTAR_MASK_SATSPIKE_MAG_SLOPE = psMetadataLookupF32 (&status, recipe, "REFSTAR_MASK_SATSPIKE_MAG_SLOPE");
@@ -232,4 +233,14 @@
     double ROTANGLE = PM_RAD_DEG * psMetadataLookupF64 (&status, fpa->concepts, "FPA.ROTANGLE");
     psAssert (status, "ROTANGLE missing");
+    int ROT_PARITY = psMetadataLookupS32(&status, recipe, "PSASTRO.MODEL.ROT.PARITY");
+    if (!status) psAbort ("Can't find recipe option PSASTRO.MODEL.ROT.PARITY");
+
+    //select the astromeric rotation angle from the header
+    psMetadata *header = psMetadataLookupMetadata (&status, fpa->analysis, "PSASTRO.HEADER");
+    if (!header) {
+        psError(PSASTRO_ERR_CONFIG, true, "Can't find PSASTRO header");
+        return false;
+    }
+    float AST_T0 = PM_RAD_DEG * psMetadataLookupF32(&status, header, "AST_T0");
 
     // de-activate all files except PSASTRO.INPUT.MASK and PSASTRO.OUTPUT.MASK
@@ -327,5 +338,5 @@
 
                     // CIRCLE around the stars (scaled by magnitude)
-                    float radius = REFSTAR_MASK_SATSTAR_MAG_SLOPE * (REFSTAR_MASK_SATSTAR_MAG_MAX - ref->Mag);
+                    float radius = REFSTAR_MASK_SATSTAR_RAD_OFFSET + pow(REFSTAR_MASK_SATSTAR_EXP,(REFSTAR_MASK_SATSTAR_MAG_MAX - ref->Mag));
 
                     // XXX for now, assume cell binning is 1x1 relative to chip
@@ -333,9 +344,8 @@
 
                     for (float theta = 0.0; theta < 2*M_PI; theta += M_PI / 2.0) {
-
-                        float Theta = theta - ROTANGLE - REFSTAR_MASK_SATSTAR_POS_ZERO;
+                        float Theta = theta - (ROT_PARITY * ROTANGLE) - AST_T0 - REFSTAR_MASK_SATSTAR_POS_ZERO;
 
                         // LINE for boundaries of the saturation spikes (scaled by magnitude)
-                        // float MAG_MAX = (theta == 0.0) || (theta == M_PI) ? REFSTAR_MASK_SATSPIKE_MAG_MAX1 : REFSTAR_MASK_SATSPIKE_MAG_MAX2;
+                        //float MAG_MAX = (theta == 0.0) || (theta == M_PI) ? REFSTAR_MASK_SATSPIKE_MAG_MAX1 : REFSTAR_MASK_SATSPIKE_MAG_MAX2;
 
                         float MAG_MAX = REFSTAR_MASK_SATSPIKE_MAG_MAX;
@@ -400,4 +410,5 @@
                         }
                     }
+
                 }
 
@@ -412,4 +423,7 @@
                     for (int i = 0; i < ghosts->n; i++) {
                         psastroGhost *ghost = ghosts->data[i];
+                        //offset the ghost angles with the astrometric rotation angle
+                        ghost->inner.theta -= (ROT_PARITY * ROTANGLE)
+                        ghost->outer.theta -= (ROT_PARITY * ROTANGLE)
                         // XXX bright vs faint ghost bits? (OR with SUSPECT)
                         psastroMaskEllipticalAnnulus (readoutMask->mask, ghostMaskValue, ghost->chip->x, ghost->chip->y, ghost->inner, ghost->outer);
@@ -418,5 +432,5 @@
 
                 // Select the glint mask regions for this readout (loaded in
-                // psastroExtractGlints.c).  These glint regions are defined as rectangular
+                // psastroChooseGlintStars.c).  These glint regions are defined as rectangular
                 // boxes and are generated for each chip based on the position of the bright
                 // stars beyond the edge of the focal plane.  This masking is currently very
@@ -426,6 +440,11 @@
                     // mask the glints on this readout
                     for (int i = 0; i < glints->n; i++) {
-                        psRegion *glint = glints->data[i];
-                        psastroMaskRectangle (readoutMask->mask, glintMaskValue, glint->x0, glint->y0, glint->x1, glint->y1);
+                        psVector *glint = glints->data[i];
+                        //psLogMsg ("psastro", 3, "glint: %f %f %f %f\n", glint->x0, glint->y0, glint->x1, glint->y1);
+                        //psastroMaskRectangle (readoutMask->mask, glintMaskValue, glint->x0, glint->y0, glint->x1, glint->y1);
+
+		        psastroMaskBox (readoutMask->mask, glintMaskValue, glint->data.F32[0], glint->data.F32[1],
+				    glint->data.F32[2], glint->data.F32[3], glint->data.F32[4]);
+
                     }
                 }
