Index: trunk/psModules/src/objects/pmSourceIO_CMF.c.in
===================================================================
--- trunk/psModules/src/objects/pmSourceIO_CMF.c.in	(revision 38062)
+++ trunk/psModules/src/objects/pmSourceIO_CMF.c.in	(revision 38114)
@@ -552,4 +552,10 @@
     psMetadataAddStr (outhead, PS_LIST_TAIL, "EXTNAME", PS_META_REPLACE, "xsrc table extension", extname);
 
+    // we can either write out the petrosian mag errors correctly or inverted (by default, psphot writes them out inverted)
+    bool repairMagErrors = psMetadataLookupBool (&status, recipe, "REPAIR.PETROSIAN.MAG.ERRORS");
+    if (repairMagErrors) {
+      psMetadataAddBool (outhead, PS_LIST_TAIL, "REPAIR.PETROSIAN.MAG.ERRORS", PS_META_REPLACE, "", true);
+    }
+
     pmChip *chip = readout->parent->parent;
     pmFPA  *fpa  = chip->parent;
@@ -651,6 +657,16 @@
 		// 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!!
+		// NOTE EAM 20140806 : PETRO_MAG_ERR was inverted!! this allows for it to be repaired
 		float magErr = (extpars->petrosianFlux > 0.0) ? extpars->petrosianFlux / extpars->petrosianFluxErr : NAN; // XXX zero point
+		if (repairMagErrors) {
+		  // I need to add the kron error in quadrature becasue pet_error ignores the object flux
+		  float Krf  = source->moments ? source->moments->KronFlux : NAN;
+		  float dKrf = source->moments ? source->moments->KronFluxErr : NAN;
+		  if (isfinite (Krf) && isfinite (dKrf)) {
+		    magErr = sqrt(PS_SQR(1.0 / magErr) + PS_SQR(dKrf / Krf));
+		  } else {
+		    magErr = 1.0 / magErr;
+		  }
+		}
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG",        PS_DATA_F32, "Petrosian Magnitude", mag);
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG_ERR",    PS_DATA_F32, "Petrosian Magnitude Error", magErr);
@@ -836,4 +852,6 @@
     }
 
+    bool repairMagErrors = psMetadataLookupBool (&status, tableHeader, "REPAIR.PETROSIAN.MAG.ERRORS");
+
     for (long i = 0; i < numSources; i++) {
         psMetadata *row = psFitsReadTableRow(fits, i); // Table row
@@ -867,12 +885,25 @@
         extpars->axes.theta = psMetadataLookupF32(&status, row, "F25_THETA");
 
+	// magErr may have been saved in inverted form
         float mag = psMetadataLookupF32(&status, row, "PETRO_MAG");
         float magErr = psMetadataLookupF32(&status, row, "PETRO_MAG_ERR");
         if (isfinite(mag)) {
-            extpars->petrosianFlux    = pow(10., (magOffset - mag) / 2.5);
-            if (isfinite(magErr)) {
-                extpars->petrosianFluxErr = extpars->petrosianFlux / magErr;
-            }
-        }
+	  extpars->petrosianFlux    = pow(10., (magOffset - mag) / 2.5);
+	  if (isfinite(magErr)) {
+	    if (repairMagErrors) {
+	      // I need to add the kron error in quadrature becasue pet_error ignores the object flux
+	      float Krf  = source->moments ? source->moments->KronFlux : NAN;
+	      float dKrf = source->moments ? source->moments->KronFluxErr : NAN;
+	      if (isfinite (Krf) && isfinite (dKrf)) {
+		magErr = 1.0 / sqrt(PS_SQR(magErr) - PS_SQR(dKrf / Krf));
+	      } else {
+		magErr = 1.0 / magErr;
+	      }
+	      extpars->petrosianFluxErr = extpars->petrosianFlux * magErr;
+	    } else {
+	      extpars->petrosianFluxErr = extpars->petrosianFlux / magErr;
+	    }
+	  }
+	}
 
         extpars->petrosianRadius   = psMetadataLookupF32(&status, row, "PETRO_RADIUS");
