Index: trunk/psModules/src/objects/pmSourceIO_CMF_PS1_DV2.c
===================================================================
--- trunk/psModules/src/objects/pmSourceIO_CMF_PS1_DV2.c	(revision 29602)
+++ trunk/psModules/src/objects/pmSourceIO_CMF_PS1_DV2.c	(revision 29620)
@@ -69,5 +69,5 @@
     psF32 xPos, yPos;
     psF32 xErr, yErr;
-    psF32 errMag, chisq, apRadius;
+    psF32 chisq, apRadius;
     psS32 nPix, nDOF;
 
@@ -87,4 +87,20 @@
     }
     float zeroptErr = psMetadataLookupF32 (&status2, imageHeader, "ZPT_ERR");
+
+    // we need a measure of the image quality (FWHM) for this image, in order to get the positional errors
+    float fwhmMajor = psMetadataLookupF32(&status1, readout->analysis, "FWHM_MAJ");
+    if (!status1) {
+	fwhmMajor = psMetadataLookupF32(&status1, readout->analysis, "IQ_FW1");
+	if (!status1) {
+	    fwhmMajor = 5.0; // XXX just a guess!
+	}
+    }
+    float fwhmMinor = psMetadataLookupF32(&status1, readout->analysis, "FWHM_MIN");
+    if (!status1) {
+	fwhmMinor = psMetadataLookupF32(&status1, readout->analysis, "IQ_FW2");
+	if (!status1) {
+	    fwhmMinor = 5.0; // XXX just a guess!
+	}
+    }
 
     // if the sequence is defined, write these in seq order; otherwise
@@ -128,6 +144,6 @@
             } else {
               // in linear-fit mode, there is no error on the centroid
-              xErr = source->peak->dx;
-              yErr = source->peak->dy;
+		xErr = fwhmMajor * source->errMag / 2.35;
+		yErr = fwhmMinor * source->errMag / 2.35;
             }
             if (isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX])) {
@@ -142,10 +158,21 @@
             nPix = model->nPix;
             apRadius = source->apRadius;
-            errMag = model->dparams->data.F32[PM_PAR_I0] / model->params->data.F32[PM_PAR_I0];
         } else {
-            xPos = source->peak->xf;
-            yPos = source->peak->yf;
-            xErr = source->peak->dx;
-            yErr = source->peak->dy;
+	    bool useMoments = true;
+	    useMoments = (useMoments && source->moments);          // can't if there are no moments
+	    useMoments = (useMoments && source->moments->nPixels); // can't if the moments were not measured
+	    useMoments = (useMoments && !(source->mode && PM_SOURCE_MODE_MOMENTS_FAILURE)); // can't if the moments failed...
+
+	    if (useMoments) {
+		xPos = source->moments->Mx;
+		yPos = source->moments->My;
+		xErr = fwhmMajor * source->errMag / 2.35;
+		yErr = fwhmMinor * source->errMag / 2.35;
+	    } else {
+		xPos = source->peak->xf;
+		yPos = source->peak->yf;
+		xErr = source->peak->dx;
+		yErr = source->peak->dy;
+	    }
             axes.major = NAN;
             axes.minor = NAN;
@@ -155,5 +182,4 @@
             nPix = 0;
             apRadius = NAN;
-            errMag = NAN;
         }
 
@@ -182,5 +208,5 @@
         psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE",         PS_DATA_F32, "plate scale at source (arcsec/pixel)",       pltScale*PS_DEG_RAD*3600.0);
         psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG",     PS_DATA_F32, "PSF fit instrumental magnitude",             source->psfMag);
-        psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude",        errMag);
+        psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude",        source->errMag);
         psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_FLUX",    PS_DATA_F32, "PSF fit instrumental magnitude",             source->psfFlux);
         psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_FLUX_SIG",PS_DATA_F32, "Sigma of PSF instrumental magnitude",        source->psfFluxErr);
Index: trunk/psModules/src/objects/pmSourceIO_CMF_PS1_V3.c
===================================================================
--- trunk/psModules/src/objects/pmSourceIO_CMF_PS1_V3.c	(revision 29602)
+++ trunk/psModules/src/objects/pmSourceIO_CMF_PS1_V3.c	(revision 29620)
@@ -89,8 +89,14 @@
     if (!status1) {
 	fwhmMajor = psMetadataLookupF32(&status1, readout->analysis, "IQ_FW1");
+	if (!status1) {
+	    fwhmMajor = 5.0; // XXX just a guess!
+	}
     }
     float fwhmMinor = psMetadataLookupF32(&status1, readout->analysis, "FWHM_MIN");
     if (!status1) {
 	fwhmMinor = psMetadataLookupF32(&status1, readout->analysis, "IQ_FW2");
+	if (!status1) {
+	    fwhmMinor = 5.0; // XXX just a guess!
+	}
     }
 
@@ -154,5 +160,5 @@
 	    useMoments = (useMoments && !(source->mode && PM_SOURCE_MODE_MOMENTS_FAILURE)); // can't if the moments failed...
 
-	    if (source->moments) {
+	    if (useMoments) {
 		xPos = source->moments->Mx;
 		yPos = source->moments->My;
