Index: trunk/archive/scripts/src/phase2/pmFPAConstruct.c
===================================================================
--- trunk/archive/scripts/src/phase2/pmFPAConstruct.c	(revision 4820)
+++ trunk/archive/scripts/src/phase2/pmFPAConstruct.c	(revision 5104)
@@ -30,5 +30,27 @@
 	psError(PS_ERR_IO, false, "Unable to find specs for cell %s: ignored\n", cellName);
     }
+
+#if 0
+    // Need to create a new instance, so that each cell can work with its own
+    psMetadata *copy = psMetadataAlloc();
+    psMetadataIterator *iter = psMetadataIteratorAlloc(cellData, PS_LIST_HEAD, NULL); // Iterator
+    psMetadataItem *item = NULL;	// Item from iteration
+    while (item = psMetadataGetAndIncrement(iter)) {
+	if (item->type == PS_META_MULTI || item->type == PS_META_META) {
+	    psLogMsg(__func__, PS_LOG_WARN, "PS_META_MULTI and PS_META_META are not supported in a cell "
+		     "definition --- %s ignored.\n", item->name);
+	    continue;
+	}
+	if (! psMetadataAdd(copy, PS_LIST_TAIL, item->name, item->type, item->comment, item->data.V)) {
+	    psAbort(__func__, "Should never reach here!\n");
+	}
+    }
+    psFree(iter);
+
+    return copy;
+#else
     return cellData;
+#endif
+
 }
 
@@ -38,9 +60,8 @@
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-pmFPA *pmFPAConstruct(const psMetadata *camera, // The camera configuration
-		      psDB *db		// Database handle
+pmFPA *pmFPAConstruct(const psMetadata *camera // The camera configuration
     )
 {
-    pmFPA *fpa = pmFPAAlloc(camera, db); // The FPA to fill out
+    pmFPA *fpa = pmFPAAlloc(camera); // The FPA to fill out
     bool mdStatus = true;		// Status from metadata lookups
     const char *phuType = psMetadataLookupString(&mdStatus, camera, "PHU"); // What is the PHU?
@@ -67,5 +88,5 @@
 		psString extName = contentItem->name; // The name of the extension
 		pmChip *chip = pmChipAlloc(fpa, extName); // The chip
-		chip->extname = extName;// Mark chip to receive FITS data
+		chip->private = p_pmHDUAlloc(extName); // Prepare chip to receive FITS data
 		if (contentItem->type != PS_META_STR) {
 		    psLogMsg(__func__, PS_LOG_WARN, "Type of content item (%x) is not string: ignored\n",
@@ -83,4 +104,5 @@
 		    psMetadata *cellData = getCellData(camera, cellName);
 		    pmCell *cell = pmCellAlloc(chip, cellData, cellName); // The cell
+//		    psFree(cellData);
 		}
 		psFree(cellNamesIter);
@@ -102,5 +124,5 @@
 		const char *content = contentItem->data.V; // The content of the extension
 		psList *contents = papSplit(content, ": "); // Split the name from the type
-		if (contents->size != 2) {
+		if (contents->n != 2) {
 		    psLogMsg(__func__, PS_LOG_WARN, "Unable to read contents of %s: ignored.\n", extName);
 		} else {
@@ -123,10 +145,9 @@
 		    psMetadata *cellData = getCellData(camera, cellType);
 		    pmCell *cell = pmCellAlloc(chip, cellData, extName); // The cell
-		    cell->extname = extName; // Mark cell to receive FITS data
+//		    psFree(cellData);
+		    cell->private = p_pmHDUAlloc(extName); // Prepare cell to receive FITS data
 
 		    psFree(chip);
 		    psFree(cell);
-		    psFree(chipName);
-		    psFree(cellType);
 		}
 		psFree(contents);
@@ -136,5 +157,5 @@
 	} else if (strcasecmp(extType, "NONE") == 0) {
 	    // No extensions; Content contains metadata, each entry is a chip with its component cells
-	    fpa->extname = "PHU";
+	    fpa->private = p_pmHDUAlloc("PHU");	// Prepare FPA to receive FITS data
 	    while (contentItem = psMetadataGetAndIncrement(contentsIter)) {
 		psString chipName = contentItem->name; // The name of the chip
@@ -155,4 +176,5 @@
 		    psMetadata *cellData = getCellData(camera, cellName);
 		    pmCell *cell = pmCellAlloc(chip, cellData, cellName); // The cell
+//		    psFree(cellData);
 		}
 		psFree(cellNamesIter);
@@ -174,5 +196,5 @@
 	if (strcasecmp(extType, "NONE") == 0) {
 	    // There are no extensions --- only the PHU
-	    chip->extname = "PHU";
+	    chip->private = p_pmHDUAlloc("PHU");
 
 	    const char *contents = psMetadataLookupString(&mdStatus, camera, "CONTENTS");
@@ -188,4 +210,5 @@
 		psMetadata *cellData = getCellData(camera, cellName);
 		pmCell *cell = pmCellAlloc(chip, cellData, cellName); // The cell
+//		psFree(cellData);
 	    }
 	    psFree(cellIter);
@@ -223,5 +246,6 @@
 		psMetadata *cellData = getCellData(camera, cellType);
 		pmCell *cell = pmCellAlloc(chip, cellData, extName); // The cell
-		cell->extname = extName; // Mark cell to receive FITS data
+//		psFree(cellData);
+		cell->private = p_pmHDUAlloc(extName); // Prepare cell to receive FITS data
 	    } // Iterating through contents
 	    psFree(contentsIter);
@@ -249,8 +273,8 @@
 {
     psTrace(__func__, 0, "FPA:\n");
-    if (fpa->extname) {
-	psTrace(__func__, 1, "---> FPA is extension %s.\n", fpa->extname);
-	if (! fpa->pixels) {
-	    psTrace(__func__, 1, "---> NO PIXELS for extension %s\n", fpa->extname);
+    if (fpa->private) {
+	psTrace(__func__, 1, "---> FPA is extension %s.\n", fpa->private->extname);
+	if (! fpa->private->pixels) {
+	    psTrace(__func__, 1, "---> NO PIXELS for extension %s\n", fpa->private->extname);
 	}
     }
@@ -261,8 +285,8 @@
 	psTrace(__func__, 1, "Chip: %d\n", i);
 	pmChip *chip = chips->data[i]; // The chip
-	if (chip->extname) {
-	    psTrace(__func__, 2, "---> Chip is extension %s.\n", chip->extname);
-	    if (! chip->pixels) {
-		psTrace(__func__, 2, "---> NO PIXELS for extension %s\n", chip->extname);
+	if (chip->private) {
+	    psTrace(__func__, 2, "---> Chip is extension %s.\n", chip->private->extname);
+	    if (! chip->private->pixels) {
+		psTrace(__func__, 2, "---> NO PIXELS for extension %s\n", chip->private->extname);
 	    }
 	}
@@ -272,11 +296,11 @@
 	    psTrace(__func__, 2, "Cell: %d\n", j);
 	    pmCell *cell = cells->data[j]; // The cell
-	    if (cell->extname) {
-		psTrace(__func__, 3, "---> Cell is extension %s.\n", cell->extname);
-		if (! cell->pixels) {
-		    psTrace(__func__, 3, "---> NO PIXELS for extension %s\n", cell->extname);
-		}
-	    }
-	    psMetadataPrint(cell->values, 3);
+	    if (cell->private) {
+		psTrace(__func__, 3, "---> Cell is extension %s.\n", cell->private->extname);
+		if (! cell->private->pixels) {
+		    psTrace(__func__, 3, "---> NO PIXELS for extension %s\n", cell->private->extname);
+		}
+	    }
+	    psMetadataPrint(cell->concepts, 3);
 	    psTrace(__func__, 3, "Readouts:\n");
 	    psArray *readouts = cell->readouts;	// Array of readouts
