Index: /trunk/psModules/src/objects/pmSourceIO.c
===================================================================
--- /trunk/psModules/src/objects/pmSourceIO.c	(revision 32976)
+++ /trunk/psModules/src/objects/pmSourceIO.c	(revision 32977)
@@ -59,5 +59,5 @@
 static bool pmReadoutReadXSRC(pmFPAfile *file, char * exttype, psMetadata *hduHeader, psString xsrcname, psArray *sources, long *sourceIndex);
 static bool pmReadoutReadXFIT(pmFPAfile *file, char * exttype, psMetadata *hduHeader, psString xfitname, psArray *sources, long *sourceIndex);
-static bool pmReadoutReadXRAD(pmFPAfile *file, char * exttype, psMetadata *hduHeader, psString xfitname, psArray *sources, long *sourceIndex);
+static bool pmReadoutReadXRAD(pmFPAfile *file, pmReadout *readout, char * exttype, psMetadata *hduHeader, psString xfitname, psArray *sources, long *sourceIndex);
 
 // lookup the EXTNAME values used for table data and image header segments
@@ -1097,5 +1097,5 @@
             }
             if (XRAD_OUTPUT && xradname) {
-                if (!pmReadoutReadXRAD(file, exttype, hdu->header, xradname, sources, sourceIndex)) {
+                if (!pmReadoutReadXRAD(file, readout, exttype, hdu->header, xradname, sources, sourceIndex)) {
                     // XXX: is this an error?
                     psErrorClear();
@@ -1253,38 +1253,7 @@
     bool status = false;
     if (file->type == PM_FPA_FILE_CMF) {
-#ifdef notyet
-        if (!strcmp (exttype, "SMPDATA")) {
-            status  = pmSourcesRead_SMPDATA_XSRC (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DEV_0")) {
-            status  = pmSourcesRead_PS1_DEV_0_XSRC (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DEV_1")) {
-            status  = pmSourcesRead_PS1_DEV_1_XSRC (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V1")) {
-            status  = pmSourcesRead_CMF_PS1_V1_XSRC (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V2")) {
-            status  = pmSourcesRead_CMF_PS1_V2_XSRC (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V3")) {
-            status  = pmSourcesRead_CMF_PS1_V3_XSRC (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V4")) {
-            status  = pmSourcesRead_CMF_PS1_V4_XSRC (file->fits, hduHeader, sources);
-        }
-#endif // notyet
         if (!strcmp (exttype, "PS1_SV1")) {
             status  = pmSourcesRead_CMF_PS1_SV1_XSRC (file->fits, hduHeader, sources, sourceIndex);
         }
-#ifdef notyet
-        if (!strcmp (exttype, "PS1_DV1")) {
-            status  = pmSourcesRead_CMF_PS1_DV1_XSRC (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DV2")) {
-            status  = pmSourcesRead_CMF_PS1_DV2_XSRC (file->fits, hduHeader, sources);
-        }
-#endif // notyet
     }
     psFree(tableHeader);
@@ -1312,43 +1281,12 @@
     bool status = false;
     if (file->type == PM_FPA_FILE_CMF) {
-#ifdef notyet
-        if (!strcmp (exttype, "SMPDATA")) {
-            status  = pmSourcesRead_SMPDATA_XFIT (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DEV_0")) {
-            status  = pmSourcesRead_PS1_DEV_0_XFIT (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DEV_1")) {
-            status  = pmSourcesRead_PS1_DEV_1_XFIT (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V1")) {
-            status  = pmSourcesRead_CMF_PS1_V1_XFIT (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V2")) {
-            status  = pmSourcesRead_CMF_PS1_V2_XFIT (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V3")) {
-            status  = pmSourcesRead_CMF_PS1_V3_XFIT (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V4")) {
-            status  = pmSourcesRead_CMF_PS1_V4_XFIT (file->fits, hduHeader, sources);
-        }
-#endif // notyet
         if (!strcmp (exttype, "PS1_SV1")) {
             status  = pmSourcesRead_CMF_PS1_SV1_XFIT (file->fits, hduHeader, sources, sourceIndex);
         }
-#ifdef notyet
-        if (!strcmp (exttype, "PS1_DV1")) {
-            status  = pmSourcesRead_CMF_PS1_DV1_XFIT (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DV2")) {
-            status  = pmSourcesRead_CMF_PS1_DV2_XFIT (file->fits, hduHeader, sources);
-        }
-#endif // notyet
     }
     psFree(tableHeader);
     return status;
 }
-static bool pmReadoutReadXRAD(pmFPAfile *file, char *exttype, psMetadata *hduHeader, psString extname, psArray *sources, long *sourceIndex) 
+static bool pmReadoutReadXRAD(pmFPAfile *file, pmReadout *readout, char *exttype, psMetadata *hduHeader, psString extname, psArray *sources, long *sourceIndex) 
 {
     if (!psFitsMoveExtName (file->fits, extname)) {
@@ -1370,38 +1308,7 @@
     bool status = false;
     if (file->type == PM_FPA_FILE_CMF) {
-#ifdef notyet
-        if (!strcmp (exttype, "SMPDATA")) {
-            status  = pmSourcesRead_SMPDATA_XRAD (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DEV_0")) {
-            status  = pmSourcesRead_PS1_DEV_0_XRAD (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DEV_1")) {
-            status  = pmSourcesRead_PS1_DEV_1_XRAD (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V1")) {
-            status  = pmSourcesRead_CMF_PS1_V1_XRAD (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V2")) {
-            status  = pmSourcesRead_CMF_PS1_V2_XRAD (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V3")) {
-            status  = pmSourcesRead_CMF_PS1_V3_XRAD (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_V4")) {
-            status  = pmSourcesRead_CMF_PS1_V4_XRAD (file->fits, hduHeader, sources);
-        }
-#endif // notyet
         if (!strcmp (exttype, "PS1_SV1")) {
-            status  = pmSourcesRead_CMF_PS1_SV1_XRAD (file->fits, hduHeader, sources, sourceIndex);
-        }
-#ifdef notyet
-        if (!strcmp (exttype, "PS1_DV1")) {
-            status  = pmSourcesRead_CMF_PS1_DV1_XRAD (file->fits, hduHeader, sources);
-        }
-        if (!strcmp (exttype, "PS1_DV2")) {
-            status  = pmSourcesRead_CMF_PS1_DV2_XRAD (file->fits, hduHeader, sources);
-        }
-#endif // notyet
+            status  = pmSourcesRead_CMF_PS1_SV1_XRAD (file->fits, readout, hduHeader, sources, sourceIndex);
+        }
     }
     psFree(tableHeader);
Index: /trunk/psModules/src/objects/pmSourceIO.h
===================================================================
--- /trunk/psModules/src/objects/pmSourceIO.h	(revision 32976)
+++ /trunk/psModules/src/objects/pmSourceIO.h	(revision 32977)
@@ -95,5 +95,5 @@
 bool pmSourcesRead_CMF_PS1_SV1_XSRC (psFits *fits, psMetadata *header, psArray *sources, long *);
 bool pmSourcesRead_CMF_PS1_SV1_XFIT (psFits *fits, psMetadata *header, psArray *sources, long *);
-bool pmSourcesRead_CMF_PS1_SV1_XRAD (psFits *fits, psMetadata *header, psArray *sources, long *);
+bool pmSourcesRead_CMF_PS1_SV1_XRAD (psFits *fits, pmReadout *readout, psMetadata *header, psArray *sources, long *);
 psArray *pmSourcesRead_CMF_PS1_DV1 (psFits *fits, psMetadata *header);
 psArray *pmSourcesRead_CMF_PS1_DV2 (psFits *fits, psMetadata *header);
Index: /trunk/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c
===================================================================
--- /trunk/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c	(revision 32976)
+++ /trunk/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c	(revision 32977)
@@ -1026,5 +1026,5 @@
 }
 
-bool pmSourcesRead_CMF_PS1_SV1_XRAD(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex)
+bool pmSourcesRead_CMF_PS1_SV1_XRAD(psFits *fits, pmReadout *readout, psMetadata *hduHeader, psArray *sources, long *sourceIndex)
 {
     PS_ASSERT_PTR_NON_NULL(fits, false);
@@ -1037,4 +1037,10 @@
         return false;
     }
+
+    long       seq_first = -1;
+    long       seq_last = -1;
+    psVector   *fwhmValues = psVectorAllocEmpty(10, PS_TYPE_F32);
+    long       max_entries = -1;
+    long       num_entries = -1;
 
     for (long i = 0; i < numSources; i++) {
@@ -1061,4 +1067,21 @@
             return false;
         }
+        if (seq_first == -1) {
+            seq_first = seq;
+        }
+        if (seq == seq_first) {
+            psF32 value = psMetadataLookupF32(&status, row, "PSF_FWHM");
+            psVectorAppend(fwhmValues, value);
+        }
+        if (seq == seq_last) {
+            num_entries++;
+        } else {
+            num_entries = 1;
+            seq_last = seq;
+        }
+        if (num_entries > max_entries) {
+            max_entries = num_entries;
+        }
+
         if (!source->radialAper) {
             // XXX: where to find the number of models to expect?
@@ -1078,4 +1101,18 @@
     }
 
+    // check for consistency between the length of fwhmValues and the maximum number of entries for each row
+    if (fwhmValues->n != max_entries) {
+        psError(PS_ERR_PROGRAMMING, true, "number of PSF_FWHM values found %ld does not match expected number: %ld\n",
+            fwhmValues->n, max_entries);
+        psAssert(0, "fixme");
+    }
+
+    if (!readout->analysis) {
+        readout->analysis = psMetadataAlloc();
+    }
+
+    psMetadataAddVector(readout->analysis, PS_LIST_TAIL, "STACK.PSF.FWHM.VALUES", PS_META_REPLACE, "PSF sizes", fwhmValues);
+    psFree(fwhmValues);
+
     return true;
 }
