Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/concepts/pmConcepts.c
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/concepts/pmConcepts.c	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/concepts/pmConcepts.c	(revision 37828)
@@ -312,4 +312,7 @@
         conceptRegisterEnum("FPA.TIMESYS", "Time system", p_pmConceptParse_TIMESYS, p_pmConceptFormat_TIMESYS, p_pmConceptCopy_TIMESYS, false, PM_FPA_LEVEL_FPA);
         conceptRegisterTime("FPA.TIME", "Time of exposure", false, PM_FPA_LEVEL_FPA);
+
+        conceptRegisterStr("FPA.SHUTOUTC", "Time of exposure", NULL,NULL,NULL,false, PM_FPA_LEVEL_FPA);
+
         conceptRegisterF32("FPA.TEMP", "Temperature of focal plane", NULL, NULL, NULL, false, PM_FPA_LEVEL_FPA);
         conceptRegisterF32("FPA.M1X", "Primary Mirror X Position", NULL, NULL, NULL, false, PM_FPA_LEVEL_FPA);
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/imcombine/pmSubtraction.c
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/imcombine/pmSubtraction.c	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/imcombine/pmSubtraction.c	(revision 37828)
@@ -995,4 +995,19 @@
 
     }
+
+    if (0) { 
+      FILE *f = fopen ("vector.dat", "w");
+      psAssert (f, "should not fail to open test file");
+      
+      for (int qq = 0; qq < match->chisq->n; qq++) {
+	fprintf (f, "%f %f : %f %f : %d\n", 
+		 match->chisq->data.F32[qq], match->fluxes->data.F32[qq], 
+		 logchisq->data.F32[qq], logflux->data.F32[qq], 
+		 match->stampMask->data.PS_TYPE_VECTOR_MASK_DATA[qq]);
+      }
+      fclose (f);
+    }
+
+
     bool result = psVectorClipFitPolynomial1D(model, stats, match->stampMask, 0xff, logchisq, NULL, logflux);
     if (!result) {
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/Makefile.am
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/Makefile.am	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/Makefile.am	(revision 37828)
@@ -53,4 +53,5 @@
 	pmSourceIO_CMF_PS1_SV2.c \
 	pmSourceIO_CMF_PS1_SV3.c \
+	pmSourceIO_CMF_PS1_SV4.c \
 	pmSourceIO_CMF_PS1_DV1.c \
 	pmSourceIO_CMF_PS1_DV2.c \
@@ -157,5 +158,6 @@
 pmSourceIO_CMF_PS1_SV1.c \
 pmSourceIO_CMF_PS1_SV2.c \
-pmSourceIO_CMF_PS1_SV3.c
+pmSourceIO_CMF_PS1_SV3.c \
+pmSourceIO_CMF_PS1_SV4.c
 
 pmSourceIO_CMF_PS1_V1.c : pmSourceIO_CMF.c.in mksource.pl
@@ -195,3 +197,6 @@
 	mksource.pl pmSourceIO_CMF.c.in PS1_SV3 pmSourceIO_CMF_PS1_SV3.c
 
+pmSourceIO_CMF_PS1_SV4.c : pmSourceIO_CMF.c.in mksource.pl
+	mksource.pl pmSourceIO_CMF.c.in PS1_SV4 pmSourceIO_CMF_PS1_SV4.c
+
 # EXTRA_DIST = pmErrorCodes.h.in pmErrorCodes.dat pmErrorCodes.c.in
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/mksource.pl
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/mksource.pl	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/mksource.pl	(revision 37828)
@@ -29,4 +29,5 @@
 		"PS1_SV2", 2,
 		"PS1_SV3", 3,
+		"PS1_SV4", 4,
     );
 
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmPSFtryMakePSF.c
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmPSFtryMakePSF.c	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmPSFtryMakePSF.c	(revision 37828)
@@ -45,4 +45,6 @@
 #include "pmSourceVisual.h"
 
+bool pmPSF_DataDump (char *filename, psVector *x, psVector *y, psVector *e0, psVector *e1, psVector *e2, psVector *mask);
+
 /*****************************************************************************
 pmPSFFromPSFtry (psfTry): build a PSF model from a collection of source->modelEXT entries
@@ -356,2 +358,21 @@
 }
 
+bool pmPSF_DataDump (char *filename, psVector *x, psVector *y, psVector *e0, psVector *e1, psVector *e2, psVector *mask) {
+
+
+  FILE *f = fopen (filename, "w");
+  if (!f) return false;
+
+  for (int i = 0; i < x->n; i++) {
+
+    fprintf (f, "%6.1f %6.1f : %5.2f %5.2f %5.2f : %2d\n", 
+	     x->data.F32[i], 
+	     y->data.F32[i], 
+	     e0->data.F32[i], 
+	     e1->data.F32[i], 
+	     e2->data.F32[i], 
+	     mask->data.U8[i]);
+  }
+  fclose (f);
+  return true;
+}
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSource.c
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSource.c	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSource.c	(revision 37828)
@@ -176,4 +176,7 @@
     source->parent = NULL;
     source->tmpPtr = NULL;
+    source->chipNum = -1;
+    source->chipX = -1000;
+    source->chipY = -1000;
     source->imageID = -1;
     source->nFrames = 0;
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSource.h
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSource.h	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSource.h	(revision 37828)
@@ -127,4 +127,7 @@
     pmSource *parent;			///< reference to the master source from which this is derived
     psPtr *tmpPtr;                      ///< pointer that may be used to store data in a particular module. e.g. psphotKronIterate.
+    short chipNum;                      ///< camera dependent of chip suppling pixels for fullforce source
+    short chipX;                        ///< chip space X coord of fullforce source
+    short chipY;                        ///< chip space Y coord of fullforce source
     int imageID;
     psU16 nFrames;
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceExtendedPars.c
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceExtendedPars.c	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceExtendedPars.c	(revision 37828)
@@ -226,4 +226,10 @@
     pars->petrosianR50 = NAN;
     pars->petrosianR50Err = NAN;
+    pars->ghalfLightRadius = NAN;
+    pars->gRT = NAN;
+    pars->gRA = NAN;
+    pars->gS2 = NAN;
+    pars->gA = NAN;
+    pars->gbumpy = NAN;
     return pars;
 }
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceExtendedPars.h
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceExtendedPars.h	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceExtendedPars.h	(revision 37828)
@@ -65,4 +65,10 @@
     float petrosianR50Err;
     float petrosianFill;
+    float ghalfLightRadius;                 
+    float gRT;                           // total residual (from eliptically symmetric model) Simard 2002
+    float gRA;                           // assymetric residual (from eliptically symmetric model) Simard 2002
+    float gS2;                           // (un) smoothness  (Simard, 2011 Cheng 2011)
+    float gA;                            // assymetry index (Gyory & Bell 2010)
+    float gbumpy;                        // Blakeslee bumpiness
 } pmSourceExtendedPars;
 
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO.c
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO.c	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO.c	(revision 37828)
@@ -602,4 +602,5 @@
 	    PM_SOURCES_WRITE("PS1_SV2",   CMF_PS1_SV2);
 	    PM_SOURCES_WRITE("PS1_SV3",   CMF_PS1_SV3);
+	    PM_SOURCES_WRITE("PS1_SV4",   CMF_PS1_SV4);
 	    PM_SOURCES_WRITE("PS1_DV1",   CMF_PS1_DV1);
 	    PM_SOURCES_WRITE("PS1_DV2",   CMF_PS1_DV2);
@@ -1124,4 +1125,5 @@
 	    PM_SOURCES_READ_PSF("PS1_SV2",   CMF_PS1_SV2);
 	    PM_SOURCES_READ_PSF("PS1_SV3",   CMF_PS1_SV3);
+	    PM_SOURCES_READ_PSF("PS1_SV4",   CMF_PS1_SV4);
 	    PM_SOURCES_READ_PSF("PS1_DV1",   CMF_PS1_DV1);
 	    PM_SOURCES_READ_PSF("PS1_DV2",   CMF_PS1_DV2);
@@ -1412,4 +1414,5 @@
 	PM_SOURCES_READ_XSRC("PS1_SV2",   CMF_PS1_SV2);
 	PM_SOURCES_READ_XSRC("PS1_SV3",   CMF_PS1_SV3);
+	PM_SOURCES_READ_XSRC("PS1_SV4",   CMF_PS1_SV4);
 	PM_SOURCES_READ_XSRC("PS1_DV1",   CMF_PS1_DV1);
 	PM_SOURCES_READ_XSRC("PS1_DV2",   CMF_PS1_DV2);
@@ -1454,4 +1457,5 @@
 	PM_SOURCES_READ_XFIT("PS1_SV2",   CMF_PS1_SV2);
 	PM_SOURCES_READ_XFIT("PS1_SV3",   CMF_PS1_SV3);
+	PM_SOURCES_READ_XFIT("PS1_SV4",   CMF_PS1_SV4);
 	PM_SOURCES_READ_XFIT("PS1_DV1",   CMF_PS1_DV1);
 	PM_SOURCES_READ_XFIT("PS1_DV2",   CMF_PS1_DV2);
@@ -1495,4 +1499,5 @@
 	PM_SOURCES_READ_XRAD("PS1_SV2",   CMF_PS1_SV2);
 	PM_SOURCES_READ_XRAD("PS1_SV3",   CMF_PS1_SV3);
+	PM_SOURCES_READ_XRAD("PS1_SV4",   CMF_PS1_SV4);
 	PM_SOURCES_READ_XRAD("PS1_DV1",   CMF_PS1_DV1);
 	PM_SOURCES_READ_XRAD("PS1_DV2",   CMF_PS1_DV2);
@@ -1536,4 +1541,5 @@
 	PM_SOURCES_READ_XGAL("PS1_SV2",   CMF_PS1_SV2);
 	PM_SOURCES_READ_XGAL("PS1_SV3",   CMF_PS1_SV3);
+	PM_SOURCES_READ_XGAL("PS1_SV4",   CMF_PS1_SV4);
 	PM_SOURCES_READ_XGAL("PS1_DV1",   CMF_PS1_DV1);
 	PM_SOURCES_READ_XGAL("PS1_DV2",   CMF_PS1_DV2);
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO.h
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO.h	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO.h	(revision 37828)
@@ -41,4 +41,5 @@
 MK_PROTO(CMF_PS1_SV2);
 MK_PROTO(CMF_PS1_SV3);
+MK_PROTO(CMF_PS1_SV4);
 MK_PROTO(CMF_PS1_DV1);
 MK_PROTO(CMF_PS1_DV2);
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO_CMF.c.in
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO_CMF.c.in	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmSourceIO_CMF.c.in	(revision 37828)
@@ -222,4 +222,12 @@
 	}
 
+        // if lensing params exist also include the backmapped chipID and chip coordinates
+	if (source->lensingPSF && source->lensingPSF->shear) {
+            @>PS1_V4@               psMetadataAdd (row, PS_LIST_TAIL, "SRC_CHIP_NUM",   PS_DATA_S16, "id of warp input chip",     source->chipNum); 
+            @>PS1_V4@               psMetadataAdd (row, PS_LIST_TAIL, "SRC_CHIP_X",    PS_DATA_S16, "x coord in warp input chip",     source->chipX); 
+            @>PS1_V4@               psMetadataAdd (row, PS_LIST_TAIL, "SRC_CHIP_Y",    PS_DATA_S16, "y coord in warp input chip",     source->chipY); 
+            @>PS1_V4@               psMetadataAdd (row, PS_LIST_TAIL, "PADDING3",      PS_DATA_S16, "more padding", 0);
+        }
+
         @>PS1_V2,PS1_SV?,>PS1_DV1@ psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_R1",       PS_DATA_F32, "first radial moment",                        moments.Mrf);
         @>PS1_V2,PS1_SV?,>PS1_DV1@ psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_RH",       PS_DATA_F32, "half radial moment",                         moments.Mrh);
@@ -311,5 +319,6 @@
 
     // define PSF model type
-    int modelType = pmModelClassGetType ("PS_MODEL_GAUSS");
+    int defaultModelType = pmModelClassGetType ("PS_MODEL_GAUSS");
+    int modelType = -1;
 
     // if header does not define the model, default to a gaussian
@@ -318,5 +327,9 @@
         modelType = pmModelClassGetType (PSF_NAME);
     }
-    assert (modelType > -1);
+    // work around bug in psphotFullForce
+    if (modelType < 0) {
+    	modelType = defaultModelType;
+    }
+    // assert (modelType > -1);
 
     // do we expect to find lensing parameters?
@@ -448,4 +461,8 @@
 	  @>PS1_V4@ source->lensingOBJ->shear->e2  = psMetadataLookupF32 (&status, row, "LENS_E2_SH_OBJ");
 	}
+
+	@>PS1_V4@ source->chipNum = psMetadataLookupS16 (&status, row, "SRC_CHIP_NUM");
+	@>PS1_V4@ source->chipX = psMetadataLookupS16 (&status, row, "SRC_CHIP_X");
+	@>PS1_V4@ source->chipY = psMetadataLookupS16 (&status, row, "SRC_CHIP_Y");
 
 	if (haveLensPSF) {
@@ -620,4 +637,5 @@
 		// XXX note that this mag is either calibrated or instrumental depending on existence of zero point 
 		float mag = (extpars->petrosianFlux > 0.0) ? -2.5*log10(extpars->petrosianFlux) + magOffset : NAN; // XXX zero point
+		// XXX NOTE EAM 20140806 : PETRO_MAG_ERR is inverted!! oops!!
 		float magErr = (extpars->petrosianFlux > 0.0) ? extpars->petrosianFlux / extpars->petrosianFluxErr : NAN; // XXX zero point
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG",        PS_DATA_F32, "Petrosian Magnitude", mag);
@@ -630,4 +648,10 @@
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_90_ERR", PS_DATA_F32, "Petrosian R90 Error (pix)", extpars->petrosianR90Err);
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_FILL",          PS_DATA_F32, "Petrosian Fill Factor", extpars->petrosianFill);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "HALF_LIGHT_RADIUS", 0, "Half Light Radius", extpars->ghalfLightRadius);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_RT", 0, "total residual Sersic Model", extpars->gRT);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_RA", 0, "assymetric residual Sersic Model", extpars->gRA);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_S2", 0, "(un)smoothness paramter residual Sersic Model", extpars->gS2);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_A", 0, "assymetry index", extpars->gA);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_BUMPY", 0, "bumpiness", extpars->gbumpy);
             } else {
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG",        PS_DATA_F32, "Petrosian Magnitude",       NAN);
@@ -640,4 +664,10 @@
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_90_ERR", PS_DATA_F32, "Petrosian R90 Error (pix)",NAN); 
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_FILL",          PS_DATA_F32, "Petrosian Fill Factor", NAN);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "HALF_LIGHT_RADIUS", 0, "Half Light Radius", NAN);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_RT", 0, "total residual Sersic Model", NAN);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_RA", 0, "assymetric residual Sersic Model", NAN);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_S2", 0, "(un)smoothness paramter residual Sersic Model", NAN);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_A", 0, "assymetry index", NAN);
+                @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "G_BUMPY", 0, "bumpiness", NAN);
             }
         }
@@ -839,4 +869,10 @@
         extpars->petrosianR90Err   = psMetadataLookupF32(&status, row, "PETRO_RADIUS_90_ERR");
         extpars->petrosianFill     = psMetadataLookupF32(&status, row, "PETRO_FILL");
+        extpars->ghalfLightRadius  = psMetadataLookupF32(&status, row, "HALF_LIGHT_RADIUS");
+        extpars->gRT               = psMetadataLookupF32(&status, row, "G_RT");
+        extpars->gRA               = psMetadataLookupF32(&status, row, "G_RA");
+        extpars->gS2               = psMetadataLookupF32(&status, row, "G_S2");
+        extpars->gA                = psMetadataLookupF32(&status, row, "G_A");
+        extpars->gbumpy            = psMetadataLookupF32(&status, row, "G_BUMPY");
 
         psVector *radSB   = psMetadataLookupVector(&status, row, "PROF_SB");
@@ -906,5 +942,5 @@
     }
 
-    @>PS1_DV2@ pmChip *chip = readout->parent->parent;
+    @>PS1_DV2,>PS1_SV3@ pmChip *chip = readout->parent->parent;
 
     pmModelStatus badModel = PM_MODEL_STATUS_NONE;
@@ -965,12 +1001,12 @@
 	    }
 
-	    @>PS1_DV2@ psSphere ptSky = {0.0, 0.0, 0.0, 0.0};
-	    @>PS1_DV2@ float posAngle = 0.0;
-	    @>PS1_DV2@ float pltScale = 0.0;
-	    @>PS1_DV2@ pmSourceLocalAstrometry (&ptSky, &posAngle, &pltScale, chip, xPos, yPos);
-	    @>PS1_DV2@ double raPos = ptSky.r*PS_DEG_RAD;
-	    @>PS1_DV2@ double decPos = ptSky.d*PS_DEG_RAD;
-	    @>PS1_DV2@ posAngle *= PS_DEG_RAD;
-	    @>PS1_DV2@ pltScale *= PS_DEG_RAD*3600.0;
+	    @>PS1_DV2,>PS1_SV3@ psSphere ptSky = {0.0, 0.0, 0.0, 0.0};
+	    @>PS1_DV2,>PS1_SV3@ float posAngle = 0.0;
+	    @>PS1_DV2,>PS1_SV3@ float pltScale = 0.0;
+	    @>PS1_DV2,>PS1_SV3@ pmSourceLocalAstrometry (&ptSky, &posAngle, &pltScale, chip, xPos, yPos);
+	    @>PS1_DV2,>PS1_SV3@ double raPos = ptSky.r*PS_DEG_RAD;
+	    @>PS1_DV2,>PS1_SV3@ double decPos = ptSky.d*PS_DEG_RAD;
+	    @>PS1_DV2,>PS1_SV3@ posAngle *= PS_DEG_RAD;
+	    @>PS1_DV2,>PS1_SV3@ pltScale *= PS_DEG_RAD*3600.0;
 
 	    float kronFlux = source->moments ? source->moments->KronFlux : NAN;
@@ -986,6 +1022,7 @@
             psMetadataAddF32 (row, PS_LIST_TAIL, "X_EXT_SIG",        0, "Sigma in EXT x coordinate",                  xErr);
             psMetadataAddF32 (row, PS_LIST_TAIL, "Y_EXT_SIG",        0, "Sigma in EXT y coordinate",                  yErr);
-            @>PS1_DV2@ psMetadataAddF32 (row, PS_LIST_TAIL, "RA_EXT",           0, "EXT model ra coordinate",                    raPos);
-            @>PS1_DV2@ psMetadataAddF32 (row, PS_LIST_TAIL, "DEC_EXT",          0, "EXT model dec coordinate",                   decPos);
+            @>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "SKY_EXT",        0, "EXT fit sky value",                  PAR ? PAR[PM_PAR_SKY] : NAN);
+            @>PS1_DV2,>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "RA_EXT",           0, "EXT model ra coordinate",                    raPos);
+            @>PS1_DV2,>PS1_SV3@ psMetadataAddF32 (row, PS_LIST_TAIL, "DEC_EXT",          0, "EXT model dec coordinate",                   decPos);
 	    @>PS1_DV2@ float instFlux = isfinite(model->mag) ? pow(10.0, -0.4*model->mag) : NAN;
 	    @>PS1_DV2@ psMetadataAddF32 (row, PS_LIST_TAIL, "EXT_INST_FLUX",    0, "EXT fit instrumental counts",                instFlux);
Index: /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmTrend2D.c
===================================================================
--- /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmTrend2D.c	(revision 37827)
+++ /branches/eam_branches/ipp-pv3-20140717-merge/psModules/src/objects/pmTrend2D.c	(revision 37828)
@@ -211,4 +211,17 @@
         // XXX need to add the API which adjusts the scale
         status = psImageMapClipFit(pGoodFit, trend->map, trend->stats, mask, maskVal, x, y, f, df);
+	if (!status) {
+	  psError(PS_ERR_UNKNOWN, true, "failed to build PSF model map");
+	  return false;
+	}
+
+	// the psf model map can have nan pixels: repair this by extrapolation / interpolation
+	// XXX TEST: p_psImagePrint(0, trend->map->map, "before");
+	status = psImageMapRepair (trend->map->map);
+	// XXX TEST: p_psImagePrint(0, trend->map->map, "after");
+	if (!status) {
+	  psError(PS_ERR_UNKNOWN, true, "failed to repair PSF model map");
+	  return false;
+	}
         break;
 
@@ -217,4 +230,57 @@
     }
     return status;
+}
+
+bool psImageMapRepair (psImage *map) {
+
+
+  // XXX why is my repair not working??
+
+    // patch over bad regions (use average of 8 possible neighbor pixels)
+    // XXX consider testing all pixels against the 8 neighbors and replacing outliers...
+    double Count = 0;                   // number of good pixels
+    double Value = 0;                   // sum of good pixel's value
+    for (int iy = 0; iy < map->numRows; iy++) {
+        for (int ix = 0; ix < map->numCols; ix++) {
+            if (isfinite(map->data.F32[iy][ix])) {
+                Value += map->data.F32[iy][ix];
+                Count++;
+                continue;
+            }
+
+            double value = 0;
+            double count = 0;
+            for (int jy = iy - 1; jy <= iy + 1; jy++) {
+                if (jy <   0) continue;
+                if (jy >= map->numRows) continue;
+                for (int jx = ix - 1; jx <= ix + 1; jx++) {
+                    if (!jx && !jy) continue;
+                    if (jx   <   0) continue;
+                    if (jx   >= map->numCols) continue;
+		    if (!isfinite(map->data.F32[jy][jx])) continue;
+                    value += map->data.F32[jy][jx];
+                    count += 1.0;
+                }
+            }
+            if (count > 0) {
+	      // psLogMsg ("psphot", PS_LOG_DETAIL, "patching image map %d, %d: %f (%d pts)\n", ix, iy, (value / count), (int) count);
+		map->data.F32[iy][ix] = value / count;
+	    }
+        }
+    }
+    if (Count == 0) {
+        psError(PS_ERR_UNKNOWN, true, "failed to repair PSF model map");
+        return false;
+    }
+    Value /= Count;
+
+    // patch over remaining bad regions (use global average)
+    for (int iy = 0; iy < map->numRows; iy++) {
+        for (int ix = 0; ix < map->numCols; ix++) {
+            if (!isnan(map->data.F32[iy][ix])) continue;
+            map->data.F32[iy][ix] = Value;
+        }
+    }
+    return true;
 }
 
