Index: trunk/psModules/src/detrend/pmFlatField.c
===================================================================
--- trunk/psModules/src/detrend/pmFlatField.c	(revision 7604)
+++ trunk/psModules/src/detrend/pmFlatField.c	(revision 7855)
@@ -18,6 +18,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-06-21 03:21:16 $
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-07-10 20:42:47 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -47,26 +47,26 @@
     PS_ASSERT_IMAGE_NON_EMPTY(flat->image, false);
     if (in->mask) {
-        PS_ASSERT_IMAGE_TYPE(in->mask, PS_TYPE_U8, false);
+        PS_ASSERT_IMAGE_TYPE(in->mask, PS_TYPE_MASK, false);
+        PS_ASSERT_IMAGES_SIZE_EQUAL(in->mask, in->image, false);
     }
     PS_ASSERT_IMAGE_TYPE(flat->image, in->image->type.type, false);
-
-    int totOffCol = 0;
-    int totOffRow = 0;
-    psElemType inType;
-    psElemType flatType;
-    psElemType maskType;
-
-    // Check for nulls
-    if (in == NULL) {
-        return true;       // Readout may not have data in it
-    } else if(flat==NULL) {
-        psError( PS_ERR_BAD_PARAMETER_NULL, true,
-                 PS_ERRORTEXT_pmFlatField_NULL_FLAT_READOUT);
-        return false;
-    }
 
     psImage *inImage   = in->image;     // Input image
     psImage *inMask    = in->mask;      // Mask for input image
     psImage *flatImage = flat->image;   // Flat-field image
+
+    // Check input image and its mask are not larger than flat image
+    if (inImage->numRows > flatImage->numRows || inImage->numCols > flatImage->numCols) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_pmFlatField_SIZE_INPUT_IMAGE,
+                inImage->numRows, inImage->numCols, flatImage->numRows, flatImage->numCols);
+        return false;
+    }
+    if (inMask && (inMask->numRows > flatImage->numRows || inMask->numCols > flatImage->numCols)) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_pmFlatField_SIZE_MASK_IMAGE,
+                inMask->numRows, inMask->numCols, flatImage->numRows, flatImage->numCols);
+        return false;
+    }
 
     // Offsets on the chip
@@ -76,74 +76,14 @@
     int y0flat = psMetadataLookupS32(NULL, flat->parent->concepts, "CELL.Y0");
 
-    if (inImage == NULL) {
-        psError( PS_ERR_BAD_PARAMETER_NULL, true,
-                 PS_ERRORTEXT_pmFlatField_NULL_INPUT_IMAGE);
-        return false;
-    } else if(flatImage == NULL) {
-        psError( PS_ERR_BAD_PARAMETER_NULL, true,
-                 PS_ERRORTEXT_pmFlatField_NULL_FLAT_IMAGE);
-        return false;
-    }
-
-    // Check input image and its mask are not larger than flat image
-
-    if (inImage->numRows>flatImage->numRows || inImage->numCols>flatImage->numCols) {
-        psError( PS_ERR_BAD_PARAMETER_SIZE, true,
-                 PS_ERRORTEXT_pmFlatField_SIZE_INPUT_IMAGE,
-                 inImage->numRows, inImage->numCols, flatImage->numRows, flatImage->numCols);
-        return false;
-    }
-    if (inMask && (inMask->numRows > flatImage->numRows || inMask->numCols > flatImage->numCols)) {
-        psError( PS_ERR_BAD_PARAMETER_SIZE, true,
-                 PS_ERRORTEXT_pmFlatField_SIZE_MASK_IMAGE,
-                 inMask->numRows, inMask->numCols, flatImage->numRows, flatImage->numCols);
-        return false;
-    }
-
-    // Determine total offset based on image offset with chip offset
-    totOffCol = inImage->col0 + y0in - flatImage->col0 - y0flat;
-    totOffRow = inImage->row0 + x0in - flatImage->row0 - x0flat;
+    // Determine offset based on image offset with chip offset: input frame to flat frame
+    int yOffset = in->row0 + y0in - flat->col0 - y0flat;
+    int xOffset = in->row0 + x0in - flat->col0 - x0flat;
 
     // Check that offsets are within image limits
-    if(totOffRow>=flatImage->numRows || totOffCol>=flatImage->numCols) {
-        psError( PS_ERR_BAD_PARAMETER_SIZE, true,
-                 PS_ERRORTEXT_pmFlatField_OFFSET_FLAT_IMAGE,
-                 totOffRow, totOffCol, flatImage->numRows, flatImage->numCols);
-        return false;
-    } else if(totOffRow>=inImage->numRows || totOffCol>=inImage->numCols) {
-        psError( PS_ERR_BAD_PARAMETER_SIZE, true,
-                 PS_ERRORTEXT_pmFlatField_OFFSET_INPUT_IMAGE,
-                 totOffRow, totOffCol, inImage->numRows, inImage->numCols);
-        return false;
-    } else if(inMask && (totOffRow>=inMask->numRows || totOffCol>=inMask->numCols)) {
-        psError( PS_ERR_BAD_PARAMETER_SIZE, true,
-                 PS_ERRORTEXT_pmFlatField_OFFSET_MASK_IMAGE,
-                 totOffRow, totOffCol, inMask->numRows, inMask->numCols);
-        return false;
-    }
-
-    // Check for incorrect types
-    inType = inImage->type.type;
-    flatType = flatImage->type.type;
-    maskType = inMask->type.type;
-    if(PS_IS_PSELEMTYPE_COMPLEX(inType)) {
-        psError( PS_ERR_BAD_PARAMETER_TYPE, true,
-                 PS_ERRORTEXT_pmFlatField_TYPE_INPUT_IMAGE,
-                 inType);
-        return false;
-    } else if(PS_IS_PSELEMTYPE_COMPLEX(flatType)) {
-        psError( PS_ERR_BAD_PARAMETER_TYPE, true,
-                 PS_ERRORTEXT_pmFlatField_TYPE_FLAT_IMAGE,
-                 flatType);
-        return false;
-    } else if(inMask && inMask->type.type != PS_TYPE_MASK) {
-        psError( PS_ERR_BAD_PARAMETER_TYPE, true,
-                 PS_ERRORTEXT_pmFlatField_TYPE_MASK_IMAGE,
-                 maskType);
-        return false;
-    } else if(inType != flatType) {
-        psError( PS_ERR_BAD_PARAMETER_TYPE, true,
-                 PS_ERRORTEXT_pmFlatField_TYPE_MISMATCH,
-                 inType, flatType);
+    if (inImage->numRows + yOffset >= flatImage->numRows ||
+            inImage->numCols + xOffset >= flatImage->numCols) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_pmFlatField_OFFSET_FLAT_IMAGE,
+                yOffset, xOffset, flatImage->numRows, flatImage->numCols);
         return false;
     }
@@ -152,15 +92,13 @@
     #define FLAT_DIVISION_CASE(TYPE) \
 case PS_TYPE_##TYPE: \
-    for (long j = totOffRow; j < inImage->numRows; j++) { \
-        for (long i = totOffCol; i < inImage->numCols; i++) { \
+    for (int j = 0; j < inImage->numRows; j++) { \
+        for (int i = 0; i < inImage->numCols; i++) { \
             if (flatImage->data.TYPE[j][i] <= 0.0) { \
                 if (inMask) { \
                     inMask->data.U8[j][i] |= PM_MASK_FLAT; \
                 } \
-                flatImage->data.TYPE[j][i] = 0.0; \
+                inImage->data.TYPE[j][i] = NAN; \
             } else { \
-                if (!inMask || !inMask->data.U8[j][i]) { \
-                    inImage->data.TYPE[j][i] /= flatImage->data.TYPE[j][i]; \
-                } \
+                inImage->data.TYPE[j][i] /= flatImage->data.TYPE[j][i]; \
             } \
         } \
@@ -168,5 +106,5 @@
     break;
 
-    switch(inType) {
+    switch (inImage->type.type) {
         FLAT_DIVISION_CASE(U8);
         FLAT_DIVISION_CASE(U16);
@@ -180,7 +118,8 @@
         FLAT_DIVISION_CASE(F64);
     default:
-        psError( PS_ERR_BAD_PARAMETER_TYPE, true,
-                 PS_ERRORTEXT_pmFlatField_TYPE_UNSUPPORTED,
-                 inType);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_pmFlatField_TYPE_UNSUPPORTED,
+                inImage->type.type);
+        return false;
     }
 
