Index: trunk/ppImage/src/ppImage.h
===================================================================
--- trunk/ppImage/src/ppImage.h	(revision 5857)
+++ trunk/ppImage/src/ppImage.h	(revision 5858)
@@ -23,4 +23,11 @@
 #define RECIPE "PHASE2"                 // Name of the recipe to use
 
+typedef enum {
+    PP_LOAD_NONE,
+    PP_LOAD_FPA,
+    PP_LOAD_CHIP,
+    PP_LOAD_CELL,
+} ppImageLoadDepth;
+
 typedef struct {
     psMetadata *site;
@@ -33,12 +40,13 @@
 typedef struct {
     bool doMask;			// Mask bad pixles
-    bool doNonLin;			// Non-linearity correction
     bool doBias;			// Bias subtraction
     bool doDark;			// Dark subtraction
-    bool doOverscan;			// Overscan subtraction
     bool doFlat;			// Flat-field normalisation
     bool doFringe;			// Fringe subtraction
     bool doSource;			// Source identification and photometry
     bool doAstrom;			// Astrometry
+    bool preLoad;
+
+    bool doOverscan;			// Overscan subtraction
     int overscanBins;			// Number of pixels per bin for overscan
     psStats *overscanStats;		// Statistics for overscan
@@ -47,27 +55,56 @@
     pmOverscanAxis overscanMode;	// Axis for overscan
 
-    char *maskName;
-    char *biasName;
-    char *darkName;
-    char *flatName;
-} ppRecipe;
+    bool doNonLin;			// Non-linearity correction
+    psDataType nonLinearType;
+    psMetadataItem *nonLinearData;
+    void *nonLinearSource;
+
+    ppImageLoadDepth imageLoadDepth;
+
+} ppOptions;
 
 typedef struct {
+    char *filename;
+    pmFPA *fpa;
+    psFits *fits;
     psMetadata *header;
+} ppFPA; 
 
-    pmFPA *input;
-    pmFPA *weight;
-    pmFPA *mask;
-    pmFPA *bias;
-    pmFPA *dark;
-    pmFPA *flat;
-    pmFPA *fringe;
+typedef struct {
+    ppFPA *input;
+    ppFPA *mask;
+    ppFPA *bias;
+    ppFPA *dark;
+    ppFPA *flat;
+    ppFPA *fringe;
+    ppFPA *process;
+} ppData;
 
-    psFits *inputFile;
-    psFits *weightFile;
-    psFits *maskFile;
-    psFits *biasFile;
-    psFits *darkFile;
-    psFits *flatFile;
-    psFits *fringeFile;
-} ppData;
+typedef struct {
+    pmCell *input;
+    pmCell *mask;
+    pmCell *bias;
+    pmCell *dark;
+    pmCell *flat;
+} ppDetrend;
+
+bool ppImageConfig (ppConfig *config, int argc, char **argv);
+bool ppImageLoadPixels (ppFPA *input, ppFPA *process, psDB *db, int nChip, int nCell);
+bool ppImageLoop (ppData *data, ppOptions *options, ppConfig *config);
+bool ppImageOptions (ppData *data, ppOptions *options, ppConfig *config);
+bool ppImageParseCamera (ppData *data, ppConfig *config, char **argv);
+bool ppImageParseDetrend (ppData *data, ppOptions *options, ppConfig *config);
+
+bool ppReadoutWeights (pmReadout *readout);
+
+bool ppDetrendCell (ppDetrend *detrend, ppOptions *options, ppConfig *config);
+
+bool ppDetrendMask (pmCell *cell, pmReadout *input, pmReadout *mask);
+bool ppDetrendNonLinear (pmCell *cell, pmReadout *input, ppOptions *options);
+bool ppDetrendNonLinearLookup (pmReadout *input, psMetadataItem *dataItem);
+bool ppDetrendNonLinearPolynomial (pmReadout *input, psMetadataItem *dataItem);
+bool ppDetrendBias (pmCell *inputCell, pmReadout *inputReadout, pmReadout *pedestal, ppOptions *options);
+pmReadout* ppDetrendPedestal (pmReadout *pedestal, pmCell *input, pmReadout *bias, pmReadout *dark, float darkTime, ppOptions *options);
+pmReadout* ppDetrendSelectFirst (pmCell *cell, char *name, bool doThis);
+
+bool ppFPAOpen (ppFPA *fpa, psMetadata *camera, char *name, bool doThis);
