Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c	(revision 30703)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c	(revision 30704)
@@ -556,5 +556,5 @@
 	}
         psMetadataAdd (row, PS_LIST_TAIL, "F25_ARATIO",       PS_DATA_F32, "Axial Ratio of radial profile",              AxialRatio);
-        psMetadataAdd (row, PS_LIST_TAIL, "F25_THETA",        PS_DATA_F32, "Angle of radial profile ellipse",                  AxialTheta);
+        psMetadataAdd (row, PS_LIST_TAIL, "F25_THETA",        PS_DATA_F32, "Angle of radial profile ellipse",            AxialTheta);
 
         // Petrosian measurements
@@ -567,21 +567,23 @@
 		float mag = (extpars->petrosianFlux > 0.0) ? -2.5*log10(extpars->petrosianFlux) + magOffset : NAN; // XXX zero point
 		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);
-                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG_ERR",    PS_DATA_F32, "Petrosian Magnitude Error", magErr);
-                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS",     PS_DATA_F32, "Petrosian Radius (pix)", extpars->petrosianRadius);
-                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_ERR", PS_DATA_F32, "Petrosian Radius Error (pix)", extpars->petrosianRadiusErr);
+                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);
+                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS",     	 PS_DATA_F32, "Petrosian Radius (pix)", extpars->petrosianRadius);
+                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_ERR", 	 PS_DATA_F32, "Petrosian Radius Error (pix)", extpars->petrosianRadiusErr);
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_50",     PS_DATA_F32, "Petrosian R50 (pix)", extpars->petrosianR50);
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_50_ERR", PS_DATA_F32, "Petrosian R50 Error (pix)", extpars->petrosianR50Err);
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_90",     PS_DATA_F32, "Petrosian R90 (pix)", extpars->petrosianR90);
                 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);
             } else {
-                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG",        PS_DATA_F32, "Petrosian Magnitude",       NAN);
-                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG_ERR",    PS_DATA_F32, "Petrosian Magnitude Error", NAN);
-                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS",     PS_DATA_F32, "Petrosian Radius",          NAN);
-                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_ERR", PS_DATA_F32, "Petrosian Radius Error",    NAN);
+                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG",        	 PS_DATA_F32, "Petrosian Magnitude",       NAN);
+                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_MAG_ERR",    	 PS_DATA_F32, "Petrosian Magnitude Error", NAN);
+                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS",     	 PS_DATA_F32, "Petrosian Radius",          NAN);
+                psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_ERR", 	 PS_DATA_F32, "Petrosian Radius Error",    NAN);
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_50",     PS_DATA_F32, "Petrosian R50 (pix)", NAN);
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_50_ERR", PS_DATA_F32, "Petrosian R50 Error (pix)",NAN); 
                 psMetadataAdd (row, PS_LIST_TAIL, "PETRO_RADIUS_90",     PS_DATA_F32, "Petrosian R90 (pix)", NAN);
                 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);
             }
         }
@@ -747,14 +749,21 @@
 
                 if (k < model->params->n) {
-                    psMetadataAdd (row, PS_LIST_TAIL, name, PS_DATA_F32, "", model->params->data.F32[k]);
+                    psMetadataAddF32 (row, PS_LIST_TAIL, name, 0, "", model->params->data.F32[k]);
                 } else {
-                    psMetadataAddF32 (row, PS_LIST_TAIL, name, PS_DATA_F32, "", NAN);
+                    psMetadataAddF32 (row, PS_LIST_TAIL, name, 0, "", NAN);
                 }
             }
 
-            // XXX other parameters which may be set.
-            // XXX flag / value to define the model
-            // XXX write out the model type, fit status flags
-
+	    // optionally, write out the covariance matrix values
+	    // XXX do I need to pad this to match the biggest covar matrix?
+	    if (model->covar) {
+		for (int iy = 0; iy < model->covar->numCols; iy++) {
+		    for (int ix = iy; ix < model->covar->numCols; ix++) {
+			snprintf (name, 64, "EXT_COVAR_%02d_%02d", iy, ix);
+			psMetadataAddF32 (row, PS_LIST_TAIL, name, 0, "", model->covar->data.F32[iy][ix]);
+
+		    }
+		}		    
+	    }
             psArrayAdd (table, 100, row);
             psFree (row);
@@ -790,5 +799,5 @@
 bool pmSourcesWrite_CMF_PS1_SV1_XRAD(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname, psMetadata *recipe)
 {
-
+    bool status = false;
     psArray *table;
     psMetadata *row;
@@ -796,4 +805,10 @@
     char keyword1[80], keyword2[80];
 
+    // perform full non-linear fits / extended source analysis?
+    if (!psMetadataLookupBool (&status, recipe, "RADIAL_APERTURES")) {
+	psLogMsg ("psphot", PS_LOG_INFO, "radial apertures were not measured, skipping\n");
+	return true;
+    }
+
     // create a header to hold the output data
     psMetadata *outhead = psMetadataAlloc ();
@@ -803,5 +818,4 @@
 
     // we use this just to define the output vectors (which must be present for all objects)
-    bool status = false;
     psVector *radMin = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.LOWER");
     psVector *radMax = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.UPPER");
@@ -818,9 +832,6 @@
     }
 
+    // the FWHM values are available if we measured a psf-matched convolved set
     psVector *fwhmValues = psMetadataLookupVector(&status, readout->analysis, "STACK.PSF.FWHM.VALUES");
-    if (!fwhmValues) {
-	psError (PM_ERR_CONFIG, true, "convolved or measured FWHM is not defined for this readout");
-	return false;
-    }
 
     // let's write these out in S/N order
@@ -836,7 +847,7 @@
         // skip sources without radial aper measurements (or insufficient)
         if (source->radialAper == NULL) continue;
-        psAssert (source->radialAper->n == fwhmValues->n, "inconsistent radial aperture set");
-
-	for (int entry = 0; entry < fwhmValues->n; entry++) {
+        // psAssert (source->radialAper->n == fwhmValues->n, "inconsistent radial aperture set");
+
+	for (int entry = 0; entry < source->radialAper->n; entry++) {
 
 	    // choose the convolved EXT model, if available, otherwise the simple one
@@ -863,10 +874,15 @@
 	    psMetadataAddF32 (row, PS_LIST_TAIL, "X_APER",           0, "Center of aperture measurements",            xPos);
 	    psMetadataAddF32 (row, PS_LIST_TAIL, "Y_APER",           0, "Center of aperture measurements",            yPos);
-	    psMetadataAddF32 (row, PS_LIST_TAIL, "PSF_FWHM",         0, "FWHM of matched PSF",                        fwhmValues->data.F32[entry]);
+	    if (fwhmValues) {
+		psMetadataAddF32 (row, PS_LIST_TAIL, "PSF_FWHM",         0, "FWHM of matched PSF",                    fwhmValues->data.F32[entry]);
+	    } else {
+		psMetadataAddF32 (row, PS_LIST_TAIL, "PSF_FWHM",         0, "image is not FWHM-matched",              NAN);
+	    }
 
 	    // XXX if we have raw radial apertures, write them out here
-	    psVector *radFlux    = psVectorAlloc(radMax->n, PS_TYPE_F32);
-	    psVector *radFluxErr = psVectorAlloc(radMax->n, PS_TYPE_F32);
-	    psVector *radFill    = psVectorAlloc(radMax->n, PS_TYPE_F32);
+	    psVector *radFlux      = psVectorAlloc(radMax->n, PS_TYPE_F32);
+	    psVector *radFluxErr   = psVectorAlloc(radMax->n, PS_TYPE_F32);
+	    psVector *radFill      = psVectorAlloc(radMax->n, PS_TYPE_F32);
+	    psVector *radFluxStdev = psVectorAlloc(radMax->n, PS_TYPE_F32);
 	    psVectorInit (radFlux,    NAN);
 	    psVectorInit (radFluxErr, NAN);
@@ -879,15 +895,18 @@
 	    // copy the data from fluxVal (which is not guaranteed to be the full length) to radFlux
 	    for (int j = 0; j < radialAper->flux->n; j++) {
-		radFlux->data.F32[j]    = radialAper->flux->data.F32[j];
-		radFluxErr->data.F32[j] = radialAper->fluxErr->data.F32[j];
-		radFill->data.F32[j]    = radialAper->fill->data.F32[j];
+		radFlux->data.F32[j]      = radialAper->flux->data.F32[j];
+		radFluxErr->data.F32[j]   = radialAper->fluxErr->data.F32[j];
+		radFluxStdev->data.F32[j] = radialAper->fluxStdev->data.F32[j];
+		radFill->data.F32[j]      = radialAper->fill->data.F32[j];
 	    }
 
 	write_annuli:
-	    psMetadataAdd (row, PS_LIST_TAIL, "APER_FLUX",     PS_DATA_VECTOR, "flux within annuli",    radFlux);
-	    psMetadataAdd (row, PS_LIST_TAIL, "APER_FLUX_ERR", PS_DATA_VECTOR, "flux error in annuli",  radFluxErr);
-	    psMetadataAdd (row, PS_LIST_TAIL, "APER_FILL",     PS_DATA_VECTOR, "fill factor of annuli", radFill);
+	    psMetadataAdd (row, PS_LIST_TAIL, "APER_FLUX",     	 PS_DATA_VECTOR, "flux within annuli",       radFlux);
+	    psMetadataAdd (row, PS_LIST_TAIL, "APER_FLUX_ERR", 	 PS_DATA_VECTOR, "flux error in annuli",     radFluxErr);
+	    psMetadataAdd (row, PS_LIST_TAIL, "APER_FLUX_STDEV", PS_DATA_VECTOR, "flux standard deviation",  radFluxStdev);
+	    psMetadataAdd (row, PS_LIST_TAIL, "APER_FILL",       PS_DATA_VECTOR, "fill factor of annuli",    radFill);
 	    psFree (radFlux);
 	    psFree (radFluxErr);
+	    psFree (radFluxStdev);
 	    psFree (radFill);
 
