Index: trunk/psModules/src/objects/pmSourceIO.c
===================================================================
--- trunk/psModules/src/objects/pmSourceIO.c	(revision 6960)
+++ trunk/psModules/src/objects/pmSourceIO.c	(revision 7011)
@@ -3,6 +3,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-04-23 01:07:51 $
+ *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-04-30 22:08:02 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -290,7 +290,5 @@
 bool pmFPAReadObjects (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file)
 {
-
     for (int i = 0; i < fpa->chips->n; i++) {
-
         pmChip *chip = fpa->chips->data[i];
         pmChipReadObjects (chip, view, file);
@@ -302,7 +300,5 @@
 bool pmChipReadObjects (pmChip *chip, const pmFPAview *view, pmFPAfile *file)
 {
-
     for (int i = 0; i < chip->cells->n; i++) {
-
         pmCell *cell = chip->cells->data[i];
         pmCellReadObjects (cell, view, file);
@@ -314,9 +310,19 @@
 bool pmCellReadObjects (pmCell *cell, const pmFPAview *view, pmFPAfile *file)
 {
-
+    // determine the number of readouts:
+    switch (file->type) {
+    case PM_FPA_FILE_CMP: {
+            pmReadout *readout;
+            readout = pmReadoutAlloc (cell);
+            psFree (readout);
+            break;
+        }
+    default:
+        psAbort ("pmSourceIO", "n readouts is not yet defined\n");
+    }
     for (int i = 0; i < cell->readouts->n; i++) {
-
         pmReadout *readout = cell->readouts->data[i];
         pmReadoutReadObjects (readout, view, file);
+        cell->data_exists = true;
     }
     return true;
@@ -345,11 +351,28 @@
         // read in header, if not yet loaded
         hdu = pmFPAviewThisHDU (view, file->fpa);
-
-        char *filename = pmFPAfileNameFromRule (file->filerule, file, view);
-        file->fits = psFitsOpen (filename, "r");
+        if (file->filename)
+            psFree (file->filename);
+        file->filename = pmFPAfileNameFromRule (file->filerule, file, view);
+
+        // indirect filenames
+        if (!strcasecmp (file->filename, "@FILES")) {
+            psFree (file->filename);
+            char *extra = pmFPAfileNameFromRule (file->filextra, file, view);
+            file->filename = psMetadataLookupStr (&status, file->names, extra);
+            psFree (extra);
+            if (file->filename == NULL)
+                return false;
+            // psMetadataLookupStr just returns a view, file->filename must be protected
+            psMemIncrRefCounter (file->filename);
+        }
+        file->fits = psFitsOpen (file->filename, "r");
+        if (hdu->header != NULL) {
+            psFree (hdu->header);
+        }
         hdu->header = psFitsReadHeader (NULL, file->fits);
         psFitsClose (file->fits);
-        sources  = pmSourcesReadCMP (filename, hdu->header);
-        psFree (filename);
+        file->fits = NULL;
+
+        sources = pmSourcesReadCMP (file->filename, hdu->header);
         break;
 
@@ -366,5 +389,5 @@
         char *dataname = pmFPAfileNameFromRule (file->extrule, file, view);
         psFitsMoveExtName (file->fits, dataname);
-        sources  = pmSourcesReadCMF (file->fits, hdu->header);
+        sources = pmSourcesReadCMF (file->fits, hdu->header);
         psFree (dataname);
         break;
@@ -374,7 +397,9 @@
         break;
     }
+    readout->data_exists = true;
     status = psMetadataAdd (readout->analysis, PS_LIST_TAIL, "PSPHOT.SOURCES", PS_DATA_ARRAY, "psphot sources", sources);
-    return true;
-}
-
-
+    psFree (sources);
+    return true;
+}
+
+
