Index: branches/tap_branches/ippTools/src/dettool.c
===================================================================
--- branches/tap_branches/ippTools/src/dettool.c	(revision 25900)
+++ branches/tap_branches/ippTools/src/dettool.c	(revision 27838)
@@ -94,4 +94,5 @@
         MODECASE(DETTOOL_MODE_PENDINGCLEANUP_PROCESSEDEXP, pendingcleanup_processedexpMode);
         MODECASE(DETTOOL_MODE_DONECLEANUP_PROCESSEDEXP, donecleanup_processedexpMode);
+        MODECASE(DETTOOL_MODE_UPDATESTATE_PROCESSED, updatestateprocessedMode);
         // stacked
         MODECASE(DETTOOL_MODE_TOSTACKED,        tostackedMode);
@@ -142,4 +143,5 @@
         MODECASE(DETTOOL_MODE_PENDINGCLEANUP_RESIDEXP, pendingcleanup_residexpMode);
         MODECASE(DETTOOL_MODE_DONECLEANUP_RESIDEXP, donecleanup_residexpMode);
+        MODECASE(DETTOOL_MODE_UPDATESTATE_RESID, updatestateresidMode);
         // detrunsummary
         MODECASE(DETTOOL_MODE_TODETRUNSUMMARY,  todetrunsummaryMode);
@@ -150,5 +152,5 @@
         MODECASE(DETTOOL_MODE_UPDATEDETRUN,     updatedetrunMode);
         MODECASE(DETTOOL_MODE_RERUN,            rerunMode);
-	MODECASE(DETTOOL_MODE_PENDINGCLEANUP_DETRUNSUMMARY, pendingcleanup_detrunsummaryMode);
+        MODECASE(DETTOOL_MODE_PENDINGCLEANUP_DETRUNSUMMARY, pendingcleanup_detrunsummaryMode);
         // register
         MODECASE(DETTOOL_MODE_REGISTER_DETREND, register_detrendMode);
@@ -185,8 +187,8 @@
     psString query = pxDataGet("dettool_pending.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-    
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+        return false;
+    }
+
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
@@ -258,10 +260,10 @@
         psError(PS_ERR_UNKNOWN, false, "verify mode requires both -ref_det_id and -ref_iter");
         return false;
-    } 
+    }
     if (strcmp(mode, "verify") && ((ref_det_id != 0) || (ref_iter != -1))) {
         psError(PS_ERR_UNKNOWN, false, "master mode cannot have -ref_det_id or -ref_iter set");
         return false;
-    } 
-	
+    }
+
     PXOPT_LOOKUP_STR(camera, config->args, "-inst", false, false);
     PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
@@ -308,5 +310,5 @@
         psMetadataItem *mItem = NULL;
         while ((mItem = psListGetAndIncrement(iter))) {
-	    psS64 exp_id = mItem->data.S64;
+            psS64 exp_id = mItem->data.S64;
             if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", PS_META_DUPLICATE_OK, "==", exp_id)) {
                 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
@@ -317,13 +319,13 @@
         }
         psFree(iter);
-    } 
+    }
     if (item->type == PS_DATA_S64) {
-	psS64 exp_id = item->data.S64;
-	if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", PS_META_DUPLICATE_OK, "==", exp_id)) {
-	    psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-	    psFree(where);
-	    return false;
-	}
-    } 
+        psS64 exp_id = item->data.S64;
+        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", PS_META_DUPLICATE_OK, "==", exp_id)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
+            psFree(where);
+            return false;
+        }
+    }
 
     if (psListLength(where->list) < 1) {
@@ -505,9 +507,9 @@
         psError(PS_ERR_UNKNOWN, false, "verify mode requires both -ref_det_id and -ref_iter");
         return false;
-    } 
+    }
     if (strcmp(mode, "verify") && ((ref_det_id != 0) || (ref_iter != -1))) {
         psError(PS_ERR_UNKNOWN, false, "master mode cannot have -ref_det_id or -ref_iter set");
         return false;
-    } 
+    }
 
     PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", false, false);
@@ -550,4 +552,5 @@
     PXOPT_COPY_F32(config->args, where, "-select_airmass_max", "airmass", "<=");
     PXOPT_COPY_F32(config->args, where, "-select_sat_pixel_frac_max", "sat_pixel_frac", "<=");
+    PXOPT_COPY_F32(config->args, where, "-select_sat_pixel_frac_min", "sat_pixel_frac", ">=");
     PXOPT_COPY_F32(config->args, where, "-select_exp_time_min", "exp_time", ">=");
     PXOPT_COPY_F32(config->args, where, "-select_exp_time_max", "exp_time", "<=");
@@ -673,5 +676,5 @@
                  label,
                  ref_det_id,
-		 ref_iter
+                 ref_iter
         );
     psS64 det_id = psDBLastInsertID(config->dbh);
@@ -742,5 +745,5 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-    
+
     // XXX this mode is not well-tested: probably need to specify iteration here
     PXOPT_LOOKUP_S64(det_id, config->args, "-det_id", true, false); // required
@@ -759,9 +762,9 @@
         psError(PS_ERR_UNKNOWN, false, "verify mode requires both -ref_det_id and -ref_iter");
         return false;
-    } 
+    }
     if (strcmp(mode, "verify") && ((ref_det_id != 0) || (ref_iter != -1))) {
         psError(PS_ERR_UNKNOWN, false, "master mode cannot have -ref_det_id or -ref_iter set");
         return false;
-    } 
+    }
 
     // the new detRun may have different values for these limits:
@@ -817,5 +820,5 @@
 
     if (iteration < 0) {
-	iteration = detRun->iteration;
+        iteration = detRun->iteration;
     }
 
@@ -977,5 +980,5 @@
     psString query = pxDataGet("dettool_definebydetrun.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -989,5 +992,5 @@
 
     if (only_accepted) {
-	psStringAppend(&query, " AND accept = 1");
+        psStringAppend(&query, " AND accept = 1");
     }
 
@@ -1068,5 +1071,5 @@
     psString query = pxDataGet("dettool_runs.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -1138,5 +1141,5 @@
     psString query = pxDataGet("dettool_childlessrun.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         psFree(where);
         return false;
@@ -1212,5 +1215,5 @@
     psString query = pxDataGet("dettool_input.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         psFree(where);
         return false;
@@ -1264,5 +1267,5 @@
     psString query = pxDataGet("dettool_raw.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -1338,5 +1341,5 @@
 }
 
-// used by updatedetrunMode 
+// used by updatedetrunMode
 bool startNewIteration(pxConfig *config, psS64 det_id)
 {
@@ -1345,5 +1348,5 @@
     psString query = pxDataGet("dettool_start_new_iteration.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -1564,5 +1567,5 @@
         }
         detInputExpRow *newInputExp = detInputExpRowAlloc(
-	    det_id,
+            det_id,
             newIteration,
             inputExp->exp_id,
@@ -1662,6 +1665,6 @@
                       solang_max,
                       label,
-		      ref_det_id,
-		      ref_iter
+                      ref_det_id,
+                      ref_iter
             )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -1713,5 +1716,5 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-    
+
     PXOPT_LOOKUP_S64(det_id, config->args, "-det_id", true, false); // required
     PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false); // required
@@ -1728,20 +1731,20 @@
 
     if (!detRegisteredImfileInsert(config->dbh,
-				   det_id,
-				   0,  // the iteration is fixed at 0
-				   class_id,
-				   uri,
-				   bg,
-				   bg_stdev,
-				   bg_mean_stdev,
-				   user_1,
-				   user_2,
-				   user_3,
-				   user_4,
-				   user_5,
-				   path_base,
-				   "full",				   
-				   0       // fault code
-	    )) {
+                                   det_id,
+                                   0,  // the iteration is fixed at 0
+                                   class_id,
+                                   uri,
+                                   bg,
+                                   bg_stdev,
+                                   bg_mean_stdev,
+                                   user_1,
+                                   user_2,
+                                   user_3,
+                                   user_4,
+                                   user_5,
+                                   path_base,
+                                   "full",
+                                   0       // fault code
+            )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
@@ -1858,47 +1861,113 @@
 
 
-bool setProcessedImfileDataState(pxConfig *config, psS64 det_id, psS64 exp_id, const char *class_id, const char *data_state)
+bool setProcessedImfileDataState(pxConfig *config, psMetadata *where, const char *data_state)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+    PS_ASSERT_PTR_NON_NULL(where, false);
     PS_ASSERT_PTR_NON_NULL(data_state, false);
-    PS_ASSERT_PTR_NON_NULL(class_id, false);
 
     if (!isValidDataState (data_state)) return false;
-    
-    char *query = "UPDATE detProcessedImfile SET data_state = '%s'"
-	" WHERE det_id = %" PRId64
-	" AND exp_id = %" PRId64 
-	" AND class_id = '%s'";
-    if (!p_psDBRunQueryF(config->dbh, query, data_state, det_id, exp_id, class_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for det_id %" PRId64 ", exp_id %" PRId64 ", class_id %s", 
-		det_id, exp_id, class_id);
-        return false;
-    }
-
-    return true;
-}
-
-bool setProcessedExpDataState(pxConfig *config, psS64 det_id, psS64 exp_id, const char *data_state)
+
+    psString query = psStringCopy("UPDATE detProcessedImfile SET data_state = '%s'");
+    if (where && psListLength(where->list) > 0) {
+      psString whereClause = psDBGenerateWhereSQL(where,NULL);
+      psStringAppend(&query," %s",whereClause);
+      psFree(whereClause);
+    } else {
+      psError(PS_ERR_UNKNOWN, true, "search parameters are required");
+      return(false);
+    }
+
+    if (!p_psDBRunQueryF(config->dbh, query, data_state)) {
+      psFree(query);
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return(false);
+    }
+    psFree(query);
+    return(true);
+}
+
+bool setProcessedExpDataState(pxConfig *config, psMetadata *where, const char *data_state)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+    PS_ASSERT_PTR_NON_NULL(where, false);
     PS_ASSERT_PTR_NON_NULL(data_state, false);
 
     if (!isValidDataState (data_state)) return false;
 
-    char *query = "UPDATE detProcessedExp SET data_state = '%s'"
-	" WHERE det_id = %" PRId64
-	" AND exp_id = %" PRId64;
-    if (!p_psDBRunQueryF(config->dbh, query, data_state, det_id, exp_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for det_id %" PRId64 ", exp_id %" PRId64, 
-		det_id, exp_id);
-        return false;
-    }
-
-    return true;
-}
-
-
+    psString query = psStringCopy("UPDATE detProcessedExp SET data_state = '%s'");
+    if (where && psListLength(where->list) > 0) {
+      psString whereClause = psDBGenerateWhereSQL(where,NULL);
+      psStringAppend(&query," %s",whereClause);
+      psFree(whereClause);
+    } else {
+      psError(PS_ERR_UNKNOWN, true, "search parameters are required");
+      return(false);
+    }
+
+    if (!p_psDBRunQueryF(config->dbh, query, data_state)) {
+      psFree(query);
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return(false);
+    }
+    psFree(query);
+    return(true);
+}
+
+bool setResidImfileDataState(pxConfig *config, psMetadata *where, const char *data_state)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    PS_ASSERT_PTR_NON_NULL(where,false);
+    PS_ASSERT_PTR_NON_NULL(data_state, false);
+
+    if (!isValidDataState (data_state)) return false;
+
+    psString query = psStringCopy("UPDATE detResidImfile SET data_state = '%s'");
+    if (where && psListLength(where->list) > 0) {
+      psString whereClause = psDBGenerateWhereSQL(where,NULL);
+      psStringAppend(&query," %s",whereClause);
+      psFree(whereClause);
+    } else {
+      psError(PS_ERR_UNKNOWN, true, "search parameters are required");
+      return(false);
+    }
+
+    if (!p_psDBRunQueryF(config->dbh, query, data_state)) {
+      psFree(query);
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return(false);
+    }
+    psFree(query);
+    return(true);
+}
+// This function apparently not used anymore.
+bool setResidExpDataState(pxConfig *config, psMetadata *where, const char *data_state)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    PS_ASSERT_PTR_NON_NULL(where,false);
+    PS_ASSERT_PTR_NON_NULL(data_state, false);
+
+    if (!isValidDataState (data_state)) return false;
+
+    psString query = psStringCopy("UPDATE detResidExp SET data_state = '%s'");
+    if (where && psListLength(where->list) > 0) {
+      psString whereClause = psDBGenerateWhereSQL(where,NULL);
+      psStringAppend(&query," %s",whereClause);
+      psFree(whereClause);
+    } else {
+      psError(PS_ERR_UNKNOWN, true, "search parameters are required");
+      return(false);
+    }
+
+    if (!p_psDBRunQueryF(config->dbh, query, data_state)) {
+      psFree(query);
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return(false);
+    }
+    psFree(query);
+    return(true);
+}
+
+// Not yet updated for cleaning
 bool setStackedImfileDataState(pxConfig *config, psS64 det_id, psS32 iteration, const char *class_id, const char *data_state)
 {
@@ -1910,11 +1979,11 @@
 
     char *query = "UPDATE detStackedImfile SET data_state = '%s'"
-	" WHERE det_id = %" PRId64
-	" AND iteration = %" PRId32
-	" AND class_id = '%s'";
+        " WHERE det_id = %" PRId64
+        " AND iteration = %" PRId32
+        " AND class_id = '%s'";
     if (!p_psDBRunQueryF(config->dbh, query, data_state, det_id, iteration, class_id)) {
         psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for det_id %" PRId64 ", iteration %" PRId32 "class_id %s", 
-		det_id, iteration, class_id);
+                "failed to change state for det_id %" PRId64 ", iteration %" PRId32 "class_id %s",
+                det_id, iteration, class_id);
         return false;
     }
@@ -1932,12 +2001,12 @@
 
     char *query = "UPDATE detNormalizedStatImfile SET data_state = '%s'"
-	" WHERE det_id = %" PRId64
-	" AND iteration = %" PRId32
-	" AND class_id = '%s'";
+        " WHERE det_id = %" PRId64
+        " AND iteration = %" PRId32
+        " AND class_id = '%s'";
 /*     fprintf(stderr,"DETTOOL SAYS: %s\n",query); */
     if (!p_psDBRunQueryF(config->dbh, query, data_state, det_id, iteration,class_id)) {
         psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for det_id %" PRId64 ", iteration %" PRId32, 
-		det_id, iteration);
+                "failed to change state for det_id %" PRId64 ", iteration %" PRId32,
+                det_id, iteration);
         return false;
     }
@@ -1955,11 +2024,11 @@
 
     char *query = "UPDATE detNormalizedImfile SET data_state = '%s'"
-	" WHERE det_id = %" PRId64
-	" AND iteration = %" PRId32
-	" AND class_id = '%s'";
+        " WHERE det_id = %" PRId64
+        " AND iteration = %" PRId32
+        " AND class_id = '%s'";
     if (!p_psDBRunQueryF(config->dbh, query, data_state, det_id, iteration, class_id)) {
         psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for det_id %" PRId64 ", iteration %" PRId32 " class %s", 
-		det_id, iteration, class_id);
+                "failed to change state for det_id %" PRId64 ", iteration %" PRId32 " class %s",
+                det_id, iteration, class_id);
         return false;
     }
@@ -1976,10 +2045,10 @@
 
     char *query = "UPDATE detNormalizedExp SET data_state = '%s'"
-	" WHERE det_id = %" PRId64
-	" AND iteration = %" PRId32;
+        " WHERE det_id = %" PRId64
+        " AND iteration = %" PRId32;
     if (!p_psDBRunQueryF(config->dbh, query, data_state, det_id, iteration)) {
         psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for det_id %" PRId64 ", iteration %" PRId32, 
-		det_id, iteration);
+                "failed to change state for det_id %" PRId64 ", iteration %" PRId32,
+                det_id, iteration);
         return false;
     }
@@ -1987,48 +2056,5 @@
     return true;
 }
-
-bool setResidImfileDataState(pxConfig *config, psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *data_state)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_PTR_NON_NULL(data_state, false);
-    PS_ASSERT_PTR_NON_NULL(class_id, false);
-
-    if (!isValidDataState (data_state)) return false;
-
-    char *query = "UPDATE detResidImfile SET data_state = '%s'"
-	" WHERE det_id = %" PRId64
-	" AND iteration = %" PRId32 
-	" AND exp_id = %" PRId64 
-	" AND class_id = '%s'";
-    if (!p_psDBRunQueryF(config->dbh, query, data_state, det_id, iteration, exp_id, class_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for det_id %" PRId64 ", iteration %" PRId32 ", exp_id %" PRId64 ", class_id %s", 
-		det_id, iteration, exp_id, class_id);
-        return false;
-    }
-
-    return true;
-}
-
-bool setResidExpDataState(pxConfig *config, psS64 det_id, psS32 iteration, psS64 exp_id, const char *data_state)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_PTR_NON_NULL(data_state, false);
-
-    if (!isValidDataState (data_state)) return false;
-
-    char *query = "UPDATE detResidExp SET data_state = '%s'"
-	" WHERE det_id = %" PRId64
-	" AND iteration = %" PRId32 
-	" AND exp_id = %" PRId64;
-    if (!p_psDBRunQueryF(config->dbh, query, data_state, det_id, iteration, exp_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for det_id %" PRId64 ", iteration %" PRId32 ", exp_id %" PRId64, 
-		det_id, iteration, exp_id);
-        return false;
-    }
-
-    return true;
-}
+// End not yet modified for cleanup.
 
 bool exportrunMode(pxConfig *config)
@@ -2038,5 +2064,5 @@
     char sqlFilename[80];
   } ExportTable;
-  
+
   int numExportTables = 12;
 
@@ -2074,5 +2100,5 @@
     psString query = pxDataGet(tables[i].sqlFilename);
     if (!query) {
-      psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+      psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
       return false;
     }
@@ -2116,5 +2142,5 @@
     }
     psFree(output);
-  
+
   }
 
@@ -2127,7 +2153,7 @@
 {
   unsigned int nFail;
-  
+
   int numImportTables = 11;
-  
+
   char tables[11] [80] = {"detInputExp", "detNormalizedExp",
     "detNormalizedImfile", "detNormalizedStatImfile", "detProcessedExp",
@@ -2136,5 +2162,5 @@
 
   PS_ASSERT_PTR_NON_NULL(config, NULL);
-  
+
   PXOPT_LOOKUP_STR(infile, config->args, "-infile", true,  false);
 
@@ -2143,5 +2169,5 @@
   fprintf (stdout, "---- input ----\n");
   psMetadataPrint (stderr, input, 1);
-  
+
   psMetadataItem *item = psMetadataLookup (input, "detRun");
   psAssert (item, "entry not in input?");
@@ -2153,5 +2179,5 @@
   detRunRow *detRun = detRunObjectFromMetadata (entry->data.md);
   detRunInsertObject (config->dbh, detRun);
-  
+
   // fprintf (stdout, "---- det run ----\n");
   // psMetadataPrint (stderr, entry->data.md, 1);
@@ -2161,5 +2187,5 @@
     psAssert (item, "entry not in input?");
     psAssert (item->type == PS_DATA_METADATA_MULTI, "entry not multi?");
-  
+
     switch (i) {
       case 0:
@@ -2175,5 +2201,5 @@
         }
         break;
-  
+
       case 1:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2188,5 +2214,5 @@
         }
         break;
-        
+
       case 2:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2201,5 +2227,5 @@
         }
         break;
- 
+
       case 3:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2214,5 +2240,5 @@
         }
         break;
-        
+
       case 4:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2227,5 +2253,5 @@
         }
         break;
-        
+
       case 5:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2240,5 +2266,5 @@
         }
         break;
-        
+
       case 6:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2253,5 +2279,5 @@
         }
         break;
-        
+
       case 7:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2266,5 +2292,5 @@
         }
         break;
-        
+
       case 8:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2279,5 +2305,5 @@
         }
         break;
-        
+
       case 9:
         for (int i = 0; i < item->data.list->n; i++) {
@@ -2292,5 +2318,5 @@
         }
         break;
-        
+
       case 10:
         for (int i = 0; i < item->data.list->n; i++) {
