Index: /trunk/psModules/src/camera/Makefile.am
===================================================================
--- /trunk/psModules/src/camera/Makefile.am	(revision 9584)
+++ /trunk/psModules/src/camera/Makefile.am	(revision 9585)
@@ -17,4 +17,5 @@
 	pmHDUGenerate.c \
 	pmFPA_JPEG.c \
+	pmFPA_MANAPLOT.c \
 	pmFPAview.c \
 	pmFPAfile.c \
@@ -39,4 +40,5 @@
 	pmHDUGenerate.h \
 	pmFPA_JPEG.h \
+	pmFPA_MANAPLOT.h \
 	pmFPAview.h \
 	pmFPAfile.h \
Index: /trunk/psModules/src/camera/pmFPA_JPEG.c
===================================================================
--- /trunk/psModules/src/camera/pmFPA_JPEG.c	(revision 9584)
+++ /trunk/psModules/src/camera/pmFPA_JPEG.c	(revision 9585)
@@ -5,6 +5,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-09-25 20:23:10 $
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-10-17 00:41:05 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -124,65 +124,62 @@
     PS_ASSERT_PTR_NON_NULL(file, false);
 
-    switch (file->type) {
-    case PM_FPA_FILE_JPEG: {
-            // XXX we need to decide where the scale will come from in the long term
-            psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
-            psStats *stats = psImageBackground(readout->image, NULL, 0, 0.25, 0.75, 10000, rng);
-            psFree(rng);
+    if (file->type != PM_FPA_FILE_JPEG) {
+        psError(PS_ERR_UNKNOWN, true, "warning: type mismatch");
+        return false;
+    }
 
-            if (!isfinite(stats->robustMedian) || !isfinite(stats->robustUQ) || !isfinite(stats->robustLQ)) {
-                psError(PS_ERR_UNKNOWN, false, "Unable to measure statistics for image.\n");
-                psFree(stats);
-                return false;
-            }
-            float delta = stats->robustUQ - stats->robustLQ; // Inter-quartile range
-            float min, max;                 // Minimum and maximum for stretch
+    // XXX we need to decide where the scale will come from in the long term
+    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+    psStats *stats = psImageBackground(readout->image, NULL, 0, 0.25, 0.75, 10000, rng);
+    psFree(rng);
 
-            psString mode = pmFPAfileNameFromRule (file->extrule, file, view);
-            psString word = pmFPAfileNameFromRule (file->extxtra, file, view);
-            psArray *range = psStringSplitArray (word, ":", false);
+    if (!isfinite(stats->robustMedian) || !isfinite(stats->robustUQ) || !isfinite(stats->robustLQ)) {
+        psError(PS_ERR_UNKNOWN, false, "Unable to measure statistics for image.\n");
+        psFree(stats);
+        return false;
+    }
+    float delta = stats->robustUQ - stats->robustLQ; // Inter-quartile range
+    float min, max;                 // Minimum and maximum for stretch
 
-            if (!strcasecmp (mode, "RANGE") && range) {
-                float fmin = atof(range->data[0]);
-                float fmax = atof(range->data[1]);
-                min = stats->robustMedian + fmin*delta;
-                max = stats->robustMedian + fmax*delta;
-            } else if (!strcasecmp (mode, "FRACTION")) {
-                float fmin = atof(range->data[0]);
-                float fmax = atof(range->data[1]);
-                min = fmin*stats->robustMedian;
-                max = fmax*stats->robustMedian;
-            } else {
-                min = stats->robustMedian - 3*delta;
-                max = stats->robustMedian + 6*delta;
-            }
-            psFree(mode);
-            psFree(word);
-            psFree(range);
-            psFree(stats);
+    psString mode = pmFPAfileNameFromRule (file->extrule, file, view);
+    psString word = pmFPAfileNameFromRule (file->extxtra, file, view);
+    psArray *range = psStringSplitArray (word, ":", false);
 
-            if (!isfinite(min) || !isfinite(max)) {
-                psError(PS_ERR_UNKNOWN, true, "The stretch parameters are not both finite.\n");
-                return false;
-            }
+    if (!strcasecmp (mode, "RANGE") && range) {
+        float fmin = atof(range->data[0]);
+        float fmax = atof(range->data[1]);
+        min = stats->robustMedian + fmin*delta;
+        max = stats->robustMedian + fmax*delta;
+    } else if (!strcasecmp (mode, "FRACTION")) {
+        float fmin = atof(range->data[0]);
+        float fmax = atof(range->data[1]);
+        min = fmin*stats->robustMedian;
+        max = fmax*stats->robustMedian;
+    } else {
+        min = stats->robustMedian - 3*delta;
+        max = stats->robustMedian + 6*delta;
+    }
+    psFree(mode);
+    psFree(word);
+    psFree(range);
+    psFree(stats);
 
-            psString name = pmFPAfileNameFromRule (file->filerule, file, view);
-            psString mapname = pmFPAfileNameFromRule (file->filextra, file, view);
-            psImageJpegColormap *map = psImageJpegColormapSet (NULL, mapname);
-            psFree(mapname);
-            if (!map) {
-                map = psImageJpegColormapSet (NULL, "-greyscale");
-            }
+    if (!isfinite(min) || !isfinite(max)) {
+        psError(PS_ERR_UNKNOWN, true, "The stretch parameters are not both finite.\n");
+        return false;
+    }
 
-            psImageJpeg (map, readout->image, name, min, max);
-            psFree(name);
-            psFree(map);
+    psString name = pmFPAfileNameFromRule (file->filerule, file, view);
+    psString mapname = pmFPAfileNameFromRule (file->filextra, file, view);
+    psImageJpegColormap *map = psImageJpegColormapSet (NULL, mapname);
+    psFree(mapname);
+    if (!map) {
+        map = psImageJpegColormapSet (NULL, "-greyscale");
+    }
 
-            return true;
-        }
-    default:
-        fprintf (stderr, "warning: type mismatch\n");
-        break;
-    }
-    return false;
+    psImageJpeg (map, readout->image, name, min, max);
+    psFree(name);
+    psFree(map);
+
+    return true;
 }
Index: /trunk/psModules/src/camera/pmFPA_MANAPLOT.c
===================================================================
--- /trunk/psModules/src/camera/pmFPA_MANAPLOT.c	(revision 9585)
+++ /trunk/psModules/src/camera/pmFPA_MANAPLOT.c	(revision 9585)
@@ -0,0 +1,163 @@
+/** @file  pmFPA_MANAPLOT.c
+ *
+ * This file contains functions to write MANAPLOT images.
+ *
+ *  @author EAM, IfA
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-10-17 00:41:05 $
+ *
+ *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/*****************************************************************************/
+/* INCLUDE FILES                                                             */
+/*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <pslib.h>
+
+#include "pmHDU.h"
+#include "pmFPA.h"
+#include "pmFPAfile.h"
+#include "pmFPAview.h"
+#include "pmFPA_MANAPLOT.h"
+
+
+bool pmFPAviewWriteMANAPLOT(const pmFPAview *view, pmFPAfile *file)
+{
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+
+    pmFPA *fpa = file->fpa;
+
+    if (view->chip == -1) {
+        pmFPAWriteMANAPLOT (fpa, view, file);
+        return true;
+    }
+
+    if (view->chip >= fpa->chips->n) {
+        return false;
+    }
+    pmChip *chip = fpa->chips->data[view->chip];
+
+    if (view->cell == -1) {
+        pmChipWriteMANAPLOT (chip, view, file);
+        return true;
+    }
+
+    if (view->cell >= chip->cells->n) {
+        return false;
+    }
+    pmCell *cell = chip->cells->data[view->cell];
+
+    if (view->readout == -1) {
+        pmCellWriteMANAPLOT (cell, view, file);
+        return true;
+    }
+
+    if (view->readout >= cell->readouts->n) {
+        return false;
+    }
+    pmReadout *readout = cell->readouts->data[view->readout];
+
+    pmReadoutWriteMANAPLOT (readout, view, file);
+    return true;
+}
+
+// read in all chip-level MANAPLOT files for this FPA
+bool pmFPAWriteMANAPLOT (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file)
+{
+    PS_ASSERT_PTR_NON_NULL(fpa, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+
+    for (int i = 0; i < fpa->chips->n; i++) {
+
+        pmChip *chip = fpa->chips->data[i];
+        pmChipWriteMANAPLOT (chip, view, file);
+    }
+    return true;
+}
+
+// read in all cell-level MANAPLOT files for this chip
+bool pmChipWriteMANAPLOT (pmChip *chip, const pmFPAview *view, pmFPAfile *file)
+{
+    PS_ASSERT_PTR_NON_NULL(chip, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+
+    for (int i = 0; i < chip->cells->n; i++) {
+
+        pmCell *cell = chip->cells->data[i];
+        pmCellWriteMANAPLOT (cell, view, file);
+    }
+    return true;
+}
+
+// read in all readout-level MANAPLOT files for this cell
+bool pmCellWriteMANAPLOT (pmCell *cell, const pmFPAview *view, pmFPAfile *file)
+{
+    PS_ASSERT_PTR_NON_NULL(cell, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+
+    for (int i = 0; i < cell->readouts->n; i++) {
+
+        pmReadout *readout = cell->readouts->data[i];
+        pmReadoutWriteMANAPLOT (readout, view, file);
+    }
+    return true;
+}
+
+// read in all readout-level Objects files for this cell
+bool pmReadoutWriteMANAPLOT (pmReadout *readout, const pmFPAview *view, pmFPAfile *file)
+{
+    PS_ASSERT_PTR_NON_NULL(readout, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+
+    if (file->type != PM_FPA_FILE_MANAPLOT) {
+        psError(PS_ERR_UNKNOWN, true, "warning: type mismatch");
+        return false;
+    }
+
+    // XXX does not have to be a mana script...
+    // this function will call a mana script of the form:
+    // scriptname (input) (output)
+    // scriptname : extname
+    // input : filextra
+    // output : filerule
+
+    psString input = pmFPAfileNameFromRule (file->filextra, file, view);
+    psString output = pmFPAfileNameFromRule (file->filerule, file, view);
+    psString script = pmFPAfileNameFromRule (file->extname, file, view);
+
+    psString line = NULL;
+    psStringAppend (&line, "%s %s %s", script, input, output);
+
+    // capture the stdout and stderr?
+    // XXX use psPipe instead?
+    int status = system (line);
+    if (status == -1) {
+        psError(PS_ERR_UNKNOWN, true, "fork failure: %s", script);
+        return false;
+    }
+    if (WEXITSTATUS(status) != 0) {
+        psError(PS_ERR_UNKNOWN, true, "error running: %s", script);
+        return false;
+    }
+
+    psFree(line);
+    psFree(input);
+    psFree(output);
+    psFree(script);
+
+    return true;
+}
Index: /trunk/psModules/src/camera/pmFPA_MANAPLOT.h
===================================================================
--- /trunk/psModules/src/camera/pmFPA_MANAPLOT.h	(revision 9585)
+++ /trunk/psModules/src/camera/pmFPA_MANAPLOT.h	(revision 9585)
@@ -0,0 +1,27 @@
+/** @file  pmFPAview.h
+*
+*  @brief Tools to manipulate the FPA structure elements.
+*
+*  @ingroup AstroImage
+*
+*  @author EAM, IfA
+*
+*  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2006-10-17 00:41:05 $
+*
+*  Copyright 2004-2005 Institute for Astronomy, University of Hawaii
+*/
+
+#ifndef PM_FPA_MANAPLOT_H
+#define PM_FPA_MANAPLOT_H
+
+/// @addtogroup AstroImage
+/// @{
+
+bool pmFPAviewWriteMANAPLOT (const pmFPAview *view, pmFPAfile *file);
+bool pmFPAWriteMANAPLOT (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file);
+bool pmChipWriteMANAPLOT (pmChip *chip, const pmFPAview *view, pmFPAfile *file);
+bool pmCellWriteMANAPLOT (pmCell *cell, const pmFPAview *view, pmFPAfile *file);
+bool pmReadoutWriteMANAPLOT (pmReadout *readout, const pmFPAview *view, pmFPAfile *file);
+
+# endif
Index: /trunk/psModules/src/camera/pmFPAfile.h
===================================================================
--- /trunk/psModules/src/camera/pmFPAfile.h	(revision 9584)
+++ /trunk/psModules/src/camera/pmFPAfile.h	(revision 9585)
@@ -7,6 +7,6 @@
 *  @author EAM, IfA
 *
-*  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2006-06-28 19:22:11 $
+*  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2006-10-17 00:41:05 $
 *
 *  Copyright 2004-2005 Institute for Astronomy, University of Hawaii
@@ -36,4 +36,5 @@
     PM_FPA_FILE_PSF,
     PM_FPA_FILE_JPEG,
+    PM_FPA_FILE_MANAPLOT,
 } pmFPAfileType;
 
Index: /trunk/psModules/src/camera/pmFPAfileIO.c
===================================================================
--- /trunk/psModules/src/camera/pmFPAfileIO.c	(revision 9584)
+++ /trunk/psModules/src/camera/pmFPAfileIO.c	(revision 9585)
@@ -27,5 +27,6 @@
 #include "pmPSF_IO.h"
 #include "pmFPA_JPEG.h"
-# include "pmDetrendDB.h"
+#include "pmFPA_MANAPLOT.h"
+#include "pmDetrendDB.h"
 
 // open file (if not already opened)
@@ -232,4 +233,5 @@
     case PM_FPA_FILE_PSF:
     case PM_FPA_FILE_JPEG:
+    case PM_FPA_FILE_MANAPLOT:
         psTrace ("pmFPAfile", 5, "defer opening %s\n", file->filename);
         break;
@@ -315,4 +317,5 @@
 
     case PM_FPA_FILE_JPEG:
+    case PM_FPA_FILE_MANAPLOT:
         break;
 
@@ -375,4 +378,5 @@
     case PM_FPA_FILE_PSF:
     case PM_FPA_FILE_JPEG:
+    case PM_FPA_FILE_MANAPLOT:
         break;
 
@@ -454,5 +458,10 @@
     case PM_FPA_FILE_JPEG:
         pmFPAviewWriteJPEG (view, file);
-        psTrace ("pmFPAfile", 5, "wrote PSF %s (fpa: %p)\n", file->filename, file->fpa);
+        psTrace ("pmFPAfile", 5, "wrote JPEG %s (fpa: %p)\n", file->filename, file->fpa);
+        break;
+
+    case PM_FPA_FILE_MANAPLOT:
+        pmFPAviewWriteMANAPLOT (view, file);
+        psTrace ("pmFPAfile", 5, "wrote MANAPLOT %s (fpa: %p)\n", file->filename, file->fpa);
         break;
 
@@ -517,4 +526,5 @@
     case PM_FPA_FILE_PSF:
     case PM_FPA_FILE_JPEG:
+    case PM_FPA_FILE_MANAPLOT:
         break;
 
@@ -573,4 +583,5 @@
     case PM_FPA_FILE_PSF:
     case PM_FPA_FILE_JPEG:
+    case PM_FPA_FILE_MANAPLOT:
         break;
 
