Index: trunk/psModules/src/objects/pmPSF_IO.c
===================================================================
--- trunk/psModules/src/objects/pmPSF_IO.c	(revision 28420)
+++ trunk/psModules/src/objects/pmPSF_IO.c	(revision 28449)
@@ -182,7 +182,6 @@
     pmReadout *ro = pmFPAviewThisReadout(roView, chip->parent); // Readout with analysis data
     psFree(roView);
-    PM_ASSERT_READOUT_NON_NULL(ro, false);
-
-    if (!pmPSFmodelWrite(chip->analysis, ro->analysis, view, file, config)) {
+
+    if (!pmPSFmodelWrite(chip->analysis, ro ? ro->analysis : NULL, view, file, config)) {
         psError(psErrorCodeLast(), false, "Failed to write PSF for chip");
         return false;
@@ -213,6 +212,5 @@
     }
     if (!roAnalysis) {
-        psError(PM_ERR_PROG, true, "No analysis metadata for readout.");
-        return false;
+        psWarning("No analysis metadata for PSF, clump parameters cannot be saved.");
     }
 
@@ -360,25 +358,27 @@
 
         // we now save clump parameters for each region : need to save all of those
-        int nRegions = psMetadataLookupS32 (&status, roAnalysis, "PSF.CLUMP.NREGIONS");
-        psMetadataAddS32 (header, PS_LIST_TAIL, "PSF_CLN", PS_META_REPLACE, "number of psf clump regions", nRegions);
-        for (int i = 0; i < nRegions; i++) {
-            char regionName[64];
-            snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i);
-            psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName);
-
-            psfClump.X  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");   assert (status);
-            psfClump.Y  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");   assert (status);
-            psfClump.dX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");  assert (status);
-            psfClump.dY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");  assert (status);
-
-            char key[16];
-            snprintf (key, 9, "CLX_%03d", i);
-            psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.X);
-            snprintf (key, 9, "CLY_%03d", i);
-            psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.Y);
-            snprintf (key, 9, "CLDX_%03d", i);
-            psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dX);
-            snprintf (key, 9, "CLDY_%03d", i);
-            psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dY);
+        if (roAnalysis) {
+            int nRegions = psMetadataLookupS32 (&status, roAnalysis, "PSF.CLUMP.NREGIONS");
+            psMetadataAddS32 (header, PS_LIST_TAIL, "PSF_CLN", PS_META_REPLACE, "number of psf clump regions", nRegions);
+            for (int i = 0; i < nRegions; i++) {
+                char regionName[64];
+                snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i);
+                psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName);
+
+                psfClump.X  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");   assert (status);
+                psfClump.Y  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");   assert (status);
+                psfClump.dX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");  assert (status);
+                psfClump.dY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");  assert (status);
+
+                char key[16];
+                snprintf (key, 9, "CLX_%03d", i);
+                psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.X);
+                snprintf (key, 9, "CLY_%03d", i);
+                psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.Y);
+                snprintf (key, 9, "CLDX_%03d", i);
+                psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dX);
+                snprintf (key, 9, "CLDY_%03d", i);
+                psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dY);
+            }
         }
 
@@ -778,5 +778,4 @@
 {
     PS_ASSERT_METADATA_NON_NULL(chipAnalysis, false);
-    PS_ASSERT_METADATA_NON_NULL(roAnalysis, false);
     PS_ASSERT_PTR_NON_NULL(view, false);
     PS_ASSERT_PTR_NON_NULL(file, false);
@@ -843,38 +842,12 @@
 
     // read the psf clump data for each region
-    int nRegions = psMetadataLookupS32 (&status, header, "PSF_CLN");
-    if (!status) {
-        // read old-style psf clump data
-
-        char regionName[64];
-        snprintf (regionName, 64, "PSF.CLUMP.REGION.000");
-        psMetadataAddS32 (roAnalysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS",  PS_META_REPLACE, "psf clump regions", 1);
-
-        psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName);
-        if (!regionMD) {
-            regionMD = psMetadataAlloc();
-            psMetadataAddMetadata (roAnalysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD);
-            psFree (regionMD);
-        }
-
-        // psf clump data
-        pmPSFClump psfClump;
-
-        psfClump.X  = psMetadataLookupF32 (&status, header, "PSF_CLX" );  assert(status);
-        psfClump.Y  = psMetadataLookupF32 (&status, header, "PSF_CLY" );  assert(status);
-        psfClump.dX = psMetadataLookupF32 (&status, header, "PSF_CLDX");  assert(status);
-        psfClump.dY = psMetadataLookupF32 (&status, header, "PSF_CLDY");  assert(status);
-
-        psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X",  PS_META_REPLACE, "psf clump center", psfClump.X);
-        psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.Y",  PS_META_REPLACE, "psf clump center", psfClump.Y);
-        psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX);
-        psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY);
-    } else {
-        psMetadataAddS32 (roAnalysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS",  PS_META_REPLACE, "psf clump regions", nRegions);
-
-        for (int i = 0; i < nRegions; i++) {
-            char key[10];
+    if (roAnalysis) {
+        int nRegions = psMetadataLookupS32 (&status, header, "PSF_CLN");
+        if (!status) {
+            // read old-style psf clump data
+
             char regionName[64];
-            snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i);
+            snprintf (regionName, 64, "PSF.CLUMP.REGION.000");
+            psMetadataAddS32 (roAnalysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS",  PS_META_REPLACE, "psf clump regions", 1);
 
             psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName);
@@ -888,12 +861,8 @@
             pmPSFClump psfClump;
 
-            snprintf (key, 9, "CLX_%03d", i);
-            psfClump.X  = psMetadataLookupF32 (&status, header, key);  assert(status);
-            snprintf (key, 9, "CLY_%03d", i);
-            psfClump.Y  = psMetadataLookupF32 (&status, header, key);  assert(status);
-            snprintf (key, 9, "CLDX_%03d", i);
-            psfClump.dX = psMetadataLookupF32 (&status, header, key);  assert(status);
-            snprintf (key, 9, "CLDY_%03d", i);
-            psfClump.dY = psMetadataLookupF32 (&status, header, key);  assert(status);
+            psfClump.X  = psMetadataLookupF32 (&status, header, "PSF_CLX" );  assert(status);
+            psfClump.Y  = psMetadataLookupF32 (&status, header, "PSF_CLY" );  assert(status);
+            psfClump.dX = psMetadataLookupF32 (&status, header, "PSF_CLDX");  assert(status);
+            psfClump.dY = psMetadataLookupF32 (&status, header, "PSF_CLDY");  assert(status);
 
             psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X",  PS_META_REPLACE, "psf clump center", psfClump.X);
@@ -901,4 +870,36 @@
             psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX);
             psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY);
+        } else {
+            psMetadataAddS32 (roAnalysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS",  PS_META_REPLACE, "psf clump regions", nRegions);
+
+            for (int i = 0; i < nRegions; i++) {
+                char key[10];
+                char regionName[64];
+                snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i);
+
+                psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName);
+                if (!regionMD) {
+                    regionMD = psMetadataAlloc();
+                    psMetadataAddMetadata (roAnalysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD);
+                    psFree (regionMD);
+                }
+
+                // psf clump data
+                pmPSFClump psfClump;
+
+                snprintf (key, 9, "CLX_%03d", i);
+                psfClump.X  = psMetadataLookupF32 (&status, header, key);  assert(status);
+                snprintf (key, 9, "CLY_%03d", i);
+                psfClump.Y  = psMetadataLookupF32 (&status, header, key);  assert(status);
+                snprintf (key, 9, "CLDX_%03d", i);
+                psfClump.dX = psMetadataLookupF32 (&status, header, key);  assert(status);
+                snprintf (key, 9, "CLDY_%03d", i);
+                psfClump.dY = psMetadataLookupF32 (&status, header, key);  assert(status);
+
+                psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X",  PS_META_REPLACE, "psf clump center", psfClump.X);
+                psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.Y",  PS_META_REPLACE, "psf clump center", psfClump.Y);
+                psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX);
+                psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY);
+            }
         }
     }
