Index: /branches/rel10_ifa/psModules/src/astrom/pmFPARead.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmFPARead.c	(revision 6839)
+++ /branches/rel10_ifa/psModules/src/astrom/pmFPARead.c	(revision 6840)
@@ -156,475 +156,2 @@
 }
 
-
-#if 0
-// Don't know that we need these
-
-// Read the PHU into the nominated HDU
-static bool readPHU(pmHDU *hdu,         // HDU to read into
-                    psFits *fits        // FITS file from which to read
-                   )
-{
-    if (! hdu || ! hdu->phu) {
-        return false;                   // Nothing to see here, move along
-    }
-    if (hdu->header) {
-        return true;                    // Already something to see here, no need to gawk at it...  (;
-    }
-    // Read the PHU
-    psFitsMoveExtNum(fits, 0, false);
-    hdu->header = psFitsReadHeader(hdu->header, fits);
-    return true;
-}
-
-// Read the PHU into a cell
-bool pmCellReadPHU(pmCell *cell,        // Cell to read into
-                   psFits *fits         // FITS file from which to read
-                  )
-{
-    return readPHU(cell->hdu, fits) || readPHU(cell->parent->hdu, fits) ||
-           readPHU(cell->parent->parent->hdu, fits);
-
-}
-
-// Read the PHU into a chip
-bool pmChipReadPHU(pmChip *chip,        // Chip to read into
-                   psFits *fits         // FITS file from which to read
-                  )
-{
-    return readPHU(chip->hdu, fits) || readPHU(chip->parent->hdu, fits);
-}
-
-// Read the PHU into an FPA
-bool pmFPAReadPHU(pmFPA *fpa,           // FPA to read into
-                  psFits *fits          // FITS file from which to read
-                 )
-{
-    return readPHU(fpa->hdu, fits);
-}
-
-// Translate a name from the configuration file, containing something like "%a_%d" to a real value
-psString p_pmFPATranslateName(const psString name, // The name to translate
-                              const pmCell *cell // The cell for which to translate
-                             )
-{
-    // %a is the FPA.NAME
-    // %b is the CHIP.NAME
-    // %c is the CELL.NAME
-    // %d is the chip number
-    // %e if the cell number
-    // %f is the extension name
-
-    psString translation = psMemIncrRefCounter(name); // The translated string
-    char *temp = NULL;                  // Temporary string
-
-    pmChip *chip = cell->parent;        // Chip of interest
-    pmFPA *fpa = chip->parent;          // FPA of interest
-
-    // FPA.NAME
-    if ((temp = strstr(translation, "%a"))) {
-        // This is not particularly friendly to the memory allocation, but the cache should make it OK,
-        // and there's not much of it anyway...
-        psFree(translation);
-        translation = psStringNCopy(name, strlen(name) - strlen(temp)); // Copy first part of string
-        psString fpaName = psMetadataLookupStr(NULL, fpa->concepts, "FPA.NAME"); // The value of FPA.NAME
-        psStringAppend(&translation, "%s%s", fpaName, temp + 2);
-        // So "translation" now contains the first part, the replaced string, and the last part.
-    }
-
-    // CHIP.NAME
-    if ((temp = strstr(translation, "%b"))) {
-        // This is not particularly friendly to the memory allocation, but the cache should make it OK,
-        // and there's not much of it anyway...
-        psFree(translation);
-        translation = psStringNCopy(name, strlen(name) - strlen(temp)); // Copy first part of string
-        psString chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // CHIP.NAME's value
-        psStringAppend(&translation, "%s%s", chipName, temp + 2);
-        // So "translation" now contains the first part, the replaced string, and the last part.
-    }
-
-    // CELL.NAME
-    if ((temp = strstr(translation, "%c"))) {
-        // This is not particularly friendly to the memory allocation, but the cache should make it OK,
-        // and there's not much of it anyway...
-        psFree(translation);
-        translation = psStringNCopy(name, strlen(name) - strlen(temp)); // Copy first part of string
-        psString cellName = psMetadataLookupStr(NULL, cell->concepts, "CELL.NAME"); // CELL.NAME's value
-        psStringAppend(&translation, "%s%s", cellName, temp + 2);
-        // So "translation" now contains the first part, the replaced string, and the last part.
-    }
-
-    // Chip number
-    if ((temp = strstr(translation, "%d"))) {
-        // This is not particularly friendly to the memory allocation, but the cache should make it OK,
-        // and there's not much of it anyway...
-        psFree(translation);
-        translation = psStringNCopy(name, strlen(name) - strlen(temp)); // Copy first part of string
-        // Search for the pointer to get the chip number
-        int chipNum = -1;
-        psArray *chips = fpa->chips;    // The array of chips
-        for (int i = 0; i < chips->n && chipNum < 0; i++) {
-            if (chips->data[i] == chip) {
-                chipNum = i;
-            }
-        }
-        if (chipNum < 0) {
-            psError(PS_ERR_IO, true, "Unable to find chip to get name: %s\n", name);
-            // Try to muddle on by leaving the number out
-            psStringAppend(&translation, "%s", temp + 2);
-        } else {
-            psStringAppend(&translation, "%d%s", chipNum, temp + 2);
-        }
-        // So "translation" now contains the first part, the replaced string, and the last part.
-    }
-
-    // Cell number
-    if ((temp = strstr(translation, "%e"))) {
-        // This is not particularly friendly to the memory allocation, but the cache should make it OK,
-        // and there's not much of it anyway...
-        psFree(translation);
-        translation = psStringNCopy(name, strlen(name) - strlen(temp)); // Copy first part of string
-        // Search for the pointer to get the cell number
-        int cellNum = -1;
-        psArray *cells = chip->cells;   // The array of cells
-        for (int i = 0; i < cells->n && cellNum < 0; i++) {
-            if (cells->data[i] == cell) {
-                cellNum = i;
-            }
-        }
-        if (cellNum < 0) {
-            psError(PS_ERR_IO, true, "Unable to find cell to get name: %s\n", name);
-            // Try to muddle on by leaving the number out
-            psStringAppend(&translation, "%s", temp + 2);
-        } else {
-            psStringAppend(&translation, "%d%s", cellNum, temp + 2);
-        }
-        // So "translation" now contains the first part, the replaced string, and the last part.
-    }
-
-    // Extension name
-    if ((temp = strstr(translation, "%f"))) {
-        // This is not particularly friendly to the memory allocation, but the cache should make it OK,
-        // and there's not much of it anyway...
-        psFree(translation);
-        translation = psStringNCopy(name, strlen(name) - strlen(temp)); // Copy first part of string
-        const char *extname = NULL;
-        if (cell->hdu) {
-            extname = cell->hdu->extname;
-        } else if (chip->hdu) {
-            extname = chip->hdu->extname;
-        } else if (fpa->hdu) {
-            extname = fpa->hdu->extname;
-        }
-        psStringAppend(&translation, "%s%s", extname, temp + 2);
-        // So "translation" now contains the first part, the replaced string, and the last part.
-    }
-
-    return translation;
-}
-
-// Get filename and extension out of "somefile.fits:ext"
-psString p_pmFPATranslateFileExt(psString *extName, // Extension name, to be returned
-                                 const psString name, // The string to be translated and then parsed
-                                 const pmCell *cell // The cell
-                                )
-{
-    psString filenameExt = p_pmFPATranslateName(name, cell);
-    const char *colon = strchr(filenameExt, ':'); // Pointer to a colon in the filename-extn
-    psString filename = NULL;           // The filename
-    if (extName && *extName) {
-        psFree(*extName);
-    }
-    if (extName) {
-        *extName = NULL;
-    }
-
-    if (colon) {
-        filename = psStringNCopy(filenameExt, strlen(filenameExt) - strlen(colon));
-        if (strlen(colon) > 1) {
-            if (extName) {
-                *extName = psStringCopy(colon + 1);
-            }
-        }
-    } else {
-        filename = psMemIncrRefCounter(filenameExt);
-    }
-
-    return filename;
-}
-
-// Read a mask into the FPA
-bool pmFPAReadMask(pmFPA *fpa,          // FPA to read into
-                   psFits *source       // Source FITS file (for the original data)
-                  )
-{
-    const psMetadata *camera = fpa->camera; // Camera configuration for FPA
-    bool mdok = false;                  // Status of MD lookup
-
-    // Get the required information from the camera configuration
-    psMetadata *supps = psMetadataLookupMD(&mdok, camera, "SUPPLEMENTARY"); // Rules for supplementary data
-    if (! mdok || ! supps) {
-        psError(PS_ERR_IO, false, "Unable to find SUPPLEMENTARY in camera configuration!\n");
-        return false;
-    }
-    psString sourceType = psMetadataLookupStr(&mdok, supps, "MASK.SOURCE"); // Type of source: EXT | FILE
-    if (! mdok || strlen(sourceType) <= 0) {
-        psError(PS_ERR_IO, false, "Unable to find MASK.SOURCE in SUPPLEMENTARY section of camera "
-                "configuration!\n");
-        return false;
-    }
-    psString name = psMetadataLookupStr(&mdok, supps, "MASK.NAME"); // Name of mask
-    if (! mdok || strlen(sourceType) <= 0) {
-        psError(PS_ERR_IO, false, "Unable to find MASK.NAME in SUPPLEMENTARY section of camera "
-                "configuration!\n");
-        return false;
-    }
-
-    // Go through the FPA to each cell/readout to get the mask
-    p_pmHDU *hdu = fpa->hdu;            // The HDU into which we will read the mask
-    psArray *chips = fpa->chips;        // Array of chips
-    for (int chipNum = 0; chipNum < chips->n; chipNum++) {
-        pmChip *chip = chips->data[chipNum]; // The current chip of interest
-        if (chip->process && !chip->data_exists) {
-            if (chip->hdu) {
-                hdu = chip->hdu;
-            }
-            psArray *cells = chip->cells;       // Array of cells
-            for (int cellNum = 0; cellNum < cells->n; cellNum++) {
-                pmCell *cell = cells->data[cellNum]; // The current cell of interest
-                if (cell->process && !cell->data_exists) {
-                    if (cell->hdu) {
-                        hdu = cell->hdu;
-                    }
-
-                    // Now, need to find out where to get the pixels
-                    psFits *maskSource = psMemIncrRefCounter(source); // Source of mask image
-                    if (strcasecmp(sourceType, "FILE") == 0) {
-                        // Source is a file (with optional extension, e.g., "myMaskFile.fits:thisExt"
-                        psString extname = NULL; // Extension name
-                        psString filename = p_pmFPATranslateFileExt(&extname, name, cell); // The filename
-
-                        psFree(maskSource);
-                        maskSource = psFitsOpen(filename, "r");
-                        if (extname) {
-                            if (! psFitsMoveExtName(maskSource, extname)) {
-                                psLogMsg(__func__, PS_LOG_WARN, "Unable to find extension %s to read mask.\n",
-                                         extname);
-                                return false;
-                            }
-                        }
-                        psFree(filename);
-                        psFree(extname);
-                    } else if (strncasecmp(sourceType, "EXT", 3) == 0) {
-                        // Source is an extension in the original file
-                        psString extname = p_pmFPATranslateName(name, cell);
-                        psFitsMoveExtName(maskSource, extname);
-                    }
-
-                    // We've arrived where the pixels are.  Now we need to read them in.
-                    psMetadata *header = psFitsReadHeader(NULL, maskSource); // The header
-                    bool mdStatus = false;
-                    int nAxis = psMetadataLookupS32(&mdStatus, header, "NAXIS");
-                    if (!mdStatus) {
-                        psLogMsg(__func__, PS_LOG_WARN, "There is no NAXIS keyword in the FITS header for "
-                                 "mask (%s)!\n", name);
-                    }
-                    if (nAxis != 2 && nAxis != 3) {
-                        psLogMsg(__func__, PS_LOG_WARN, "Image is not 2- or 3-dimensional --- reading into "
-                                 "a single image anyway.\n");
-                    }
-
-                    int numPlanes = 1;  // Number of planes
-                    if (nAxis == 3) {
-                        numPlanes = psMetadataLookupS32(&mdStatus, header, "NAXIS3");
-                        if (!mdStatus) {
-                            psError(PS_ERR_IO, false, "Unable to read NAXIS3 for 3-dimensional image!\n");
-                            // Try to proceed by taking only the first plane
-                            numPlanes = 1;
-                        }
-                        if (numPlanes != 1 && numPlanes != cell->readouts->n) {
-                            psError(PS_ERR_IO, false, "Number of masks (%d) does not match number of "
-                                    "readouts (%d)\n", numPlanes, cell->readouts->n);
-                            // Try to proceed by taking only the first plane
-                            numPlanes = 1;
-                        }
-                    }
-
-                    hdu->masks = psArrayAlloc(hdu->images->n);
-
-                    // Read each plane into the array
-                    psArray *readouts = cell->readouts; // The array of readouts
-                    for (int i = 0; i < hdu->masks->n; i++) {
-                        psImage *mask = NULL; // The mask to be added
-                        if (i < numPlanes) {
-                            // Read the mask from the file
-                            psTrace(__func__, 9, "Reading plane %d\n", i);
-                            psRegion region = {0, 0, 0, 0};
-                            mask = psFitsReadImage(NULL, maskSource, region, i);
-                        } else {
-                            // One mask in the file is provided for all planes in the original image
-                            psTrace(__func__, 9, "Copying plane 0 into plane %d\n", i);
-                            psImage *original = hdu->masks->data[0];
-                            mask = psImageCopy(NULL, original, original->type.type);
-                        }
-                        hdu->masks->data[0] = mask;
-                        pmReadout *readout = readouts->data[i];
-                        readout->mask = mask;
-                        // Check the dimensions
-                        // XXX: Perhaps this check should be against the CELL.TRIMSEC, not the image size?
-                        if (mask->numCols < readout->image->numCols ||
-                                mask->numRows < readout->image->numRows) {
-                            psError(PS_ERR_IO, false, "Mask size (%dx%d) not compatible with image (%dx%d)\n",
-                                    mask->numCols, mask->numRows, readout->image->numCols,
-                                    readout->image->numRows);
-                            return false;
-                        }
-                    } // Iterating over readouts
-                    psFree(maskSource);
-                } // Valid cells
-            } // Iterating over cells
-        } // Valid chips
-    } // Iterating over chips
-
-    return true;
-}
-
-
-// Read a mask into the FPA
-// This is just a copy of the above pmFPAReadMask, replacing "mask" with "weight" throughout.
-bool pmFPAReadWeight(pmFPA *fpa,        // FPA to read into
-                     psFits *source     // Source FITS file (for the original data)
-                    )
-{
-    const psMetadata *camera = fpa->camera; // Camera configuration for FPA
-    bool mdok = false;                  // Status of MD lookup
-
-    // Get the required information from the camera configuration
-    psMetadata *supps = psMetadataLookupMD(&mdok, camera, "SUPPLEMENTARY"); // Rules for supplementary data
-    if (! mdok || ! supps) {
-        psError(PS_ERR_IO, false, "Unable to find SUPPLEMENTARY in camera configuration!\n");
-        return false;
-    }
-    psString sourceType = psMetadataLookupStr(&mdok, supps, "WEIGHT.SOURCE"); // Type of source: EXT | FILE
-    if (! mdok || strlen(sourceType) <= 0) {
-        psError(PS_ERR_IO, false, "Unable to find WEIGHT.SOURCE in SUPPLEMENTARY section of camera "
-                "configuration!\n");
-        return false;
-    }
-    psString name = psMetadataLookupStr(&mdok, supps, "WEIGHT.NAME"); // Name of weight
-    if (! mdok || strlen(sourceType) <= 0) {
-        psError(PS_ERR_IO, false, "Unable to find WEIGHT.NAME in SUPPLEMENTARY section of camera "
-                "configuration!\n");
-        return false;
-    }
-
-    // Go through the FPA to each cell/readout to get the weight
-    p_pmHDU *hdu = fpa->hdu;            // The HDU into which we will read the weight
-    psArray *chips = fpa->chips;        // Array of chips
-    for (int chipNum = 0; chipNum < chips->n; chipNum++) {
-        pmChip *chip = chips->data[chipNum]; // The current chip of interest
-        if (chip->process && !chip->data_exists) {
-            if (chip->hdu) {
-                hdu = chip->hdu;
-            }
-            psArray *cells = chip->cells;       // Array of cells
-            for (int cellNum = 0; cellNum < cells->n; cellNum++) {
-                pmCell *cell = cells->data[cellNum]; // The current cell of interest
-                if (cell->process && !cell->data_exists) {
-                    if (cell->hdu) {
-                        hdu = cell->hdu;
-                    }
-
-                    // Now, need to find out where to get the pixels
-                    psFits *weightSource = psMemIncrRefCounter(source); // Source of weight image
-                    if (strcasecmp(sourceType, "FILE") == 0) {
-                        // Source is a file (with optional extension, e.g., "myWeightFile.fits:thisExt"
-                        psString extname = NULL; // Extension name
-                        psString filename = p_pmFPATranslateFileExt(&extname, name, cell); // The filename
-
-                        psFree(weightSource);
-                        weightSource = psFitsOpen(filename, "r");
-                        if (extname) {
-                            if (! psFitsMoveExtName(weightSource, extname)) {
-                                psLogMsg(__func__, PS_LOG_WARN, "Unable to find extension %s to read "
-                                         "weight.\n", extname);
-                                return false;
-                            }
-                        }
-                        psFree(filename);
-                        psFree(extname);
-                    } else if (strncasecmp(sourceType, "EXT", 3) == 0) {
-                        // Source is an extension in the original file
-                        psString extname = p_pmFPATranslateName(name, cell);
-                        psFitsMoveExtName(weightSource, extname);
-                    }
-
-                    // We've arrived where the pixels are.  Now we need to read them in.
-                    psMetadata *header = psFitsReadHeader(NULL, weightSource); // The header
-                    bool mdStatus = false;
-                    int nAxis = psMetadataLookupS32(&mdStatus, header, "NAXIS");
-                    if (!mdStatus) {
-                        psLogMsg(__func__, PS_LOG_WARN, "There is no NAXIS keyword in the FITS header for "
-                                 "weight (%s)!\n", name);
-                    }
-                    if (nAxis != 2 && nAxis != 3) {
-                        psLogMsg(__func__, PS_LOG_WARN, "Image is not 2- or 3-dimensional --- reading into "
-                                 "a single image anyway.\n");
-                    }
-
-                    int numPlanes = 1;  // Number of planes
-                    if (nAxis == 3) {
-                        numPlanes = psMetadataLookupS32(&mdStatus, header, "NAXIS3");
-                        if (!mdStatus) {
-                            psError(PS_ERR_IO, false, "Unable to read NAXIS3 for 3-dimensional image!\n");
-                            // Try to proceed by taking only the first plane
-                            numPlanes = 1;
-                        }
-                        if (numPlanes != 1 && numPlanes != cell->readouts->n) {
-                            psError(PS_ERR_IO, false, "Number of weights (%d) does not match number of "
-                                    "readouts (%d)\n", numPlanes, cell->readouts->n);
-                            // Try to proceed by taking only the first plane
-                            numPlanes = 1;
-                        }
-                    }
-
-                    hdu->weights = psArrayAlloc(hdu->images->n);
-
-                    // Read each plane into the array
-                    psArray *readouts = cell->readouts; // The array of readouts
-                    for (int i = 0; i < hdu->weights->n; i++) {
-                        psImage *weight = NULL; // The weight to be added
-                        if (i < numPlanes) {
-                            // Read the weight from the file
-                            psTrace(__func__, 9, "Reading plane %d\n", i);
-                            psRegion region = {0, 0, 0, 0};
-                            weight = psFitsReadImage(NULL, weightSource, region, i);
-                        } else {
-                            // One weight in the file is provided for all planes in the original image
-                            psTrace(__func__, 9, "Copying plane 0 into plane %d\n", i);
-                            psImage *original = hdu->weights->data[0];
-                            weight = psImageCopy(NULL, original, original->type.type);
-                        }
-                        hdu->weights->data[0] = weight;
-                        pmReadout *readout = readouts->data[i];
-                        readout->weight = weight;
-                        // Check the dimensions
-                        // XXX: Perhaps this check should be against the CELL.TRIMSEC, not the image size?
-                        if (weight->numCols < readout->image->numCols ||
-                                weight->numRows < readout->image->numRows) {
-                            psError(PS_ERR_IO, false, "Weight size (%dx%d) not compatible with image "
-                                    "(%dx%d)\n", weight->numCols, weight->numRows, readout->image->numCols,
-                                    readout->image->numRows);
-                            return false;
-                        }
-                    } // Iterating over readouts
-                    psFree(weightSource);
-                } // Valid cells
-            } // Iterating over cells
-        } // Valid chips
-    } // Iterating over chips
-
-    return true;
-}
-
-
-#endif
Index: /branches/rel10_ifa/psModules/src/astrom/pmFPAWrite.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmFPAWrite.c	(revision 6839)
+++ /branches/rel10_ifa/psModules/src/astrom/pmFPAWrite.c	(revision 6840)
@@ -77,258 +77,2 @@
 }
 
-
-
-
-#if 0
-static bool writeHDU(psFits *fits,      // FITS file to which to write
-                     pmHDU *hdu         // Pixel data to write
-                    )
-{
-    bool status = true;                 // Status of write, to return
-    for (int i = 0; i < hdu->images->n; i++) {
-        status &= psFitsWriteImage(fits, hdu->header, hdu->images->data[i], i);
-        // XXX: Insert here the writing on mask and weight images
-    }
-
-    return status;
-}
-
-
-bool pmFPAWrite(psFits *fits,           // FITS file to which to write
-                pmFPA *fpa,             // FPA to write
-                psDB *db                // Database to update
-               )
-{
-    bool status = true;                 // Status of writing, to return
-
-    psTrace(__func__, 1, "Writing FPA...\n");
-
-    psTrace(__func__, 7, "Outgesting FPA concepts...\n");
-    pmConceptsWriteFPA(fpa, db);
-
-    // Write the primary header
-    if (fpa->phu) {
-        status &= psFitsMoveExtNum(fits, 0, false);
-        status &= psFitsWriteHeader(fpa->phu, fits);
-    }
-
-    psArray *chips = fpa->chips;        // Array of component chips
-    for (int i = 0; i < chips->n; i++) {
-        pmChip *chip = chips->data[i];  // The component chip
-        if (chip && chip->exists && chip->process) {
-            psTrace(__func__, 1, "Writing out chip %d...\n", i);
-
-            pmConceptsWriteChip(chip, db);
-
-            psArray *cells = chip->cells;       // Array of component cells
-            for (int j = 0; j < cells->n; j++) {
-                pmCell *cell = cells->data[j]; // The component cell
-                if (cell && cell->exists && cell->process) {
-                    psTrace(__func__, 2, "Writing out cell, %d...\n", j);
-
-                    pmConceptsWriteCell(cell, db);
-
-                    if (cell->hdu && strlen(cell->hdu->extname) > 0) {
-                        status &= writeHDU(fits, cell->hdu);
-                    }
-                }
-            }
-
-            if (chip->hdu && strlen(chip->hdu->extname) > 0) {
-                status &= writeHDU(fits, chip->hdu);
-            }
-        }
-
-    }
-
-    if (fpa->hdu && strlen(fpa->hdu->extname) > 0) {
-        status &= writeHDU(fits, fpa->hdu);
-    }
-
-    psTrace(__func__, 1, "Done writing FPA...\n");
-
-    return status;
-}
-
-
-bool pmFPAWriteMask(pmFPA *fpa,         // FPA containing mask to write
-                    psFits *fits        // FITS file for image
-                   )
-{
-    const psMetadata *camera = fpa->camera; // Camera configuration for FPA
-    bool mdok = false;                  // Status of MD lookup
-
-    // Get the required information from the camera configuration
-    psMetadata *supps = psMetadataLookupMD(&mdok, camera, "SUPPLEMENTARY"); // Rules for supplementary data
-    if (! mdok || ! supps) {
-        psError(PS_ERR_IO, false, "Unable to find SUPPLEMENTARY in camera configuration!\n");
-        return false;
-    }
-    psString sourceType = psMetadataLookupStr(&mdok, supps, "MASK.SOURCE"); // Type of source: EXT | FILE
-    if (! mdok || strlen(sourceType) <= 0) {
-        psError(PS_ERR_IO, false, "Unable to find MASK.SOURCE in SUPPLEMENTARY section of camera "
-                "configuration!\n");
-        return false;
-    }
-    psString name = psMetadataLookupStr(&mdok, supps, "MASK.NAME"); // Name of mask
-    if (! mdok || strlen(sourceType) <= 0) {
-        psError(PS_ERR_IO, false, "Unable to find MASK.NAME in SUPPLEMENTARY section of camera "
-                "configuration!\n");
-        return false;
-    }
-
-    // Go through the FPA to each cell/readout to get the mask
-    p_pmHDU *hdu = fpa->hdu;            // The HDU into which we will read the mask
-    psArray *chips = fpa->chips;        // Array of chips
-    for (int chipNum = 0; chipNum < chips->n; chipNum++) {
-        pmChip *chip = chips->data[chipNum]; // The current chip of interest
-        if (chip->exists && chip->process) {
-            if (chip->hdu) {
-                hdu = chip->hdu;
-            }
-            psArray *cells = chip->cells;       // Array of cells
-            for (int cellNum = 0; cellNum < cells->n; cellNum++) {
-                pmCell *cell = cells->data[cellNum]; // The current cell of interest
-                if (cell->exists && cell->process) {
-                    if (cell->hdu) {
-                        hdu = cell->hdu;
-                    }
-
-                    // Now, need to find out where to write the pixels
-                    psFits *maskDest = psMemIncrRefCounter(fits); // Destination of mask image
-                    psMetadata *header = psMetadataAlloc(); // A dummy header, containing the extension name
-                    if (strcasecmp(sourceType, "FILE") == 0) {
-                        // Source is a file (with optional extension, e.g., "myMaskFile.fits:thisExt"
-                        psString extname = NULL; // Extension name
-                        psString filename = p_pmFPATranslateFileExt(&extname, name, cell); // The filename
-                        psFree(maskDest);
-                        maskDest = psFitsOpen(filename, "rw");
-                        if (extname) {
-                            psMetadataAddStr(header, PS_LIST_TAIL, "EXTNAME", 0, "Extension name", extname);
-                        }
-                        psFree(filename);
-                        psFree(extname);
-                    } else if (strncasecmp(sourceType, "EXT", 3) == 0) {
-                        // Source is an extension in the original file
-                        psString extname = p_pmFPATranslateName(name, cell);
-                        psMetadataAddStr(header, PS_LIST_TAIL, "EXTNAME", 0, "Extension name", extname);
-                        psFree(extname);
-                    }
-
-                    // We've arrived where the pixels are.  Now we need to write them out.
-                    psArray *readouts = cell->readouts; // The array of readouts
-                    for (int readNum = 0; readNum < readouts->n; readNum++) {
-                        pmReadout *readout = readouts->data[readNum]; // The readout of interest
-                        if (! readout->mask) {
-                            psLogMsg(__func__, PS_LOG_WARN, "No mask to write out in %d,%d,%d\n",
-                                     chipNum, cellNum, readNum);
-                        } else {
-                            // XXX: Need to add the extname to the existing header
-                            if (! psFitsWriteImage(maskDest, header, readout->mask, readNum)) {
-                                psError(PS_ERR_IO, false, "Unable to write mask plane %d in extension %s\n",
-                                        readNum, hdu->extname);
-                                return false;
-                            }
-                        }
-                    } // Iterating over readouts
-                    psFree(header);
-                    psFree(maskDest);
-                } // Valid cells
-            } // Iterating over cells
-        } // Valid chips
-    } // Iterating over chips
-
-    return true;
-}
-
-
-bool pmFPAWriteWeight(pmFPA *fpa,       // FPA containing mask to write
-                      psFits *fits      // FITS file for image
-                     )
-{
-    const psMetadata *camera = fpa->camera; // Camera configuration for FPA
-    bool mdok = false;                  // Status of MD lookup
-
-    // Get the required information from the camera configuration
-    psMetadata *supps = psMetadataLookupMD(&mdok, camera, "SUPPLEMENTARY"); // Rules for supplementary data
-    if (! mdok || ! supps) {
-        psError(PS_ERR_IO, false, "Unable to find SUPPLEMENTARY in camera configuration!\n");
-        return false;
-    }
-    psString sourceType = psMetadataLookupStr(&mdok, supps, "WEIGHT.SOURCE"); // Type of source: EXT | FILE
-    if (! mdok || strlen(sourceType) <= 0) {
-        psError(PS_ERR_IO, false, "Unable to find WEIGHT.SOURCE in SUPPLEMENTARY section of camera "
-                "configuration!\n");
-        return false;
-    }
-    psString name = psMetadataLookupStr(&mdok, supps, "WEIGHT.NAME"); // Name of weight
-    if (! mdok || strlen(sourceType) <= 0) {
-        psError(PS_ERR_IO, false, "Unable to find WEIGHT.NAME in SUPPLEMENTARY section of camera "
-                "configuration!\n");
-        return false;
-    }
-
-    // Go through the FPA to each cell/readout to get the weight
-    p_pmHDU *hdu = fpa->hdu;            // The HDU into which we will read the weight
-    psArray *chips = fpa->chips;        // Array of chips
-    for (int chipNum = 0; chipNum < chips->n; chipNum++) {
-        pmChip *chip = chips->data[chipNum]; // The current chip of interest
-        if (chip->exists && chip->process) {
-            if (chip->hdu) {
-                hdu = chip->hdu;
-            }
-            psArray *cells = chip->cells;       // Array of cells
-            for (int cellNum = 0; cellNum < cells->n; cellNum++) {
-                pmCell *cell = cells->data[cellNum]; // The current cell of interest
-                if (cell->exists && cell->process) {
-                    if (cell->hdu) {
-                        hdu = cell->hdu;
-                    }
-
-                    // Now, need to find out where to write the pixels
-                    psFits *weightDest = psMemIncrRefCounter(fits); // Destination of weight image
-                    psMetadata *header = psMetadataAlloc(); // A dummy header, containing the extension name
-                    if (strcasecmp(sourceType, "FILE") == 0) {
-                        // Source is a file (with optional extension, e.g., "myWeightFile.fits:thisExt"
-                        psString extname = NULL; // Extension name
-                        psString filename = p_pmFPATranslateFileExt(&extname, name, cell); // The filename
-
-                        psFree(weightDest);
-                        weightDest = psFitsOpen(filename, "rw");
-                        if (extname) {
-                            psMetadataAddStr(header, PS_LIST_TAIL, "EXTNAME", 0, "Extension name", extname);
-                        }
-                        psFree(filename);
-                        psFree(extname);
-                    } else if (strncasecmp(sourceType, "EXT", 3) == 0) {
-                        // Source is an extension in the original file
-                        psString extname = p_pmFPATranslateName(name, cell);
-                        psMetadataAddStr(header, PS_LIST_TAIL, "EXTNAME", 0, "Extension name", extname);
-                        psFree(extname);
-                    }
-
-                    // We've arrived where the pixels are.  Now we need to write them out.
-                    psArray *readouts = cell->readouts; // The array of readouts
-                    for (int readNum = 0; readNum < readouts->n; readNum++) {
-                        pmReadout *readout = readouts->data[readNum]; // The readout of interest
-                        if (! readout->weight) {
-                            psLogMsg(__func__, PS_LOG_WARN, "No weight image to write out in %d,%d,%d\n",
-                                     chipNum, cellNum, readNum);
-                        } else {
-                            if (! psFitsWriteImage(weightDest, header, readout->weight, readNum)) {
-                                psError(PS_ERR_IO, false, "Unable to write weight plane %d in extension %s\n",
-                                        readNum, hdu->extname);
-                                return false;
-                            }
-                        }
-                    } // Iterating over readouts
-                    psFree(header);
-                    psFree(weightDest);
-                } // Valid cells
-            } // Iterating over cells
-        } // Valid chips
-    } // Iterating over chips
-
-    return true;
-}
-#endif
