Index: branches/eam_branches/ipp-20121130/ippTools/configure.ac
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/configure.ac	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/configure.ac	(revision 34839)
@@ -1,5 +1,5 @@
 AC_PREREQ(2.61)
 
-AC_INIT([ipptools], [1.1.71], [ipp-support@ifa.hawaii.edu])
+AC_INIT([ipptools], [1.1.73], [ipp-support@ifa.hawaii.edu])
 AC_CONFIG_SRCDIR([autogen.sh])
 
Index: branches/eam_branches/ipp-20121130/ippTools/share/Makefile.am
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/Makefile.am	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/Makefile.am	(revision 34839)
@@ -88,4 +88,5 @@
 	chiptool_listrun.sql \
 	chiptool_pendingcleanupimfile.sql \
+	chiptool_pendingcleanupimfile_all.sql \
 	chiptool_pendingcleanuprun.sql \
 	chiptool_pendingimfile.sql \
@@ -172,4 +173,5 @@
 	difftool_pendingcleanuprun.sql \
 	difftool_pendingcleanupskyfile.sql \
+	difftool_pendingcleanupskyfile_all.sql \
 	difftool_revertdiffskyfile_delete.sql \
 	difftool_revertdiffskyfile_updated.sql \
@@ -391,4 +393,5 @@
 	stacktool_sassskyfile.sql \
 	stacktool_tosum.sql \
+	stacktool_tobkg.sql \
 	stacktool_tosummary.sql \
 	stacktool_addsummary.sql \
@@ -423,4 +426,5 @@
 	warptool_pendingcleanuprun.sql \
 	warptool_pendingcleanupskyfile.sql \
+	warptool_pendingcleanupskyfile_all.sql \
 	warptool_revertoverlap.sql \
 	warptool_revertwarped_delete.sql \
Index: branches/eam_branches/ipp-20121130/ippTools/share/camtool_pendingcleanuprun.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/camtool_pendingcleanuprun.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/camtool_pendingcleanuprun.sql	(revision 34839)
@@ -2,4 +2,6 @@
     camRun.cam_id,
     rawExp.camera,
+    rawExp.exp_tag,
+    camRun.workdir,
     camRun.state
 FROM camRun
Index: branches/eam_branches/ipp-20121130/ippTools/share/chiptool_pendingcleanupimfile_all.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/chiptool_pendingcleanupimfile_all.sql	(revision 34839)
+++ branches/eam_branches/ipp-20121130/ippTools/share/chiptool_pendingcleanupimfile_all.sql	(revision 34839)
@@ -0,0 +1,16 @@
+-- list of chipProcessedImfiles for runs in a goto_cleaned like state without regard to 
+-- data_state or quality. Used for confirming that a run is really in the cleaned state
+SELECT
+    chipProcessedImfile.*,
+    chipRun.state,
+    chipRun.workdir,
+    chipRun.label,
+    chipRun.reduction,
+    chipRun.expgroup,
+    chipRun.dvodb,
+    chipRun.tess_id,
+    chipRun.end_stage
+FROM chipRun
+JOIN chipProcessedImfile
+    USING(chip_id)
+WHERE ( chipRun.state = 'goto_cleaned' OR chipRun.state = 'goto_scrubbed' OR chipRun.state = 'goto_purged' )
Index: branches/eam_branches/ipp-20121130/ippTools/share/chiptool_pendingcleanuprun.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/chiptool_pendingcleanuprun.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/chiptool_pendingcleanuprun.sql	(revision 34839)
@@ -1,6 +1,8 @@
-SELECT
+SELECT DISTINCT
     chipRun.chip_id,
     rawExp.camera,
-    chipRun.state
+    rawExp.exp_tag,
+    chipRun.state,
+    chipRun.workdir
 FROM chipRun
 JOIN rawExp 
Index: branches/eam_branches/ipp-20121130/ippTools/share/difftool_pendingcleanuprun.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/difftool_pendingcleanuprun.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/difftool_pendingcleanuprun.sql	(revision 34839)
@@ -6,4 +6,6 @@
 	    rawExp.camera,
 	    diffRun.state,
+            diffRun.workdir,
+            diffRun.tess_id,
 	    diffRun.label
 	FROM diffRun
@@ -35,4 +37,6 @@
 	    rawExp.camera,
 	    diffRun.state,
+            diffRun.workdir,
+            diffRun.tess_id,
 	    diffRun.label
 	FROM diffRun
@@ -64,4 +68,6 @@
 	    rawExp.camera,
 	    diffRun.state,
+            diffRun.workdir,
+            diffRun.tess_id,
 	    diffRun.label
 	FROM diffRun
@@ -93,4 +99,6 @@
 	    rawExp.camera,
 	    diffRun.state,
+            diffRun.workdir,
+            diffRun.tess_id,
 	    diffRun.label
 	FROM diffRun
Index: branches/eam_branches/ipp-20121130/ippTools/share/difftool_pendingcleanupskyfile_all.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/difftool_pendingcleanupskyfile_all.sql	(revision 34839)
+++ branches/eam_branches/ipp-20121130/ippTools/share/difftool_pendingcleanupskyfile_all.sql	(revision 34839)
@@ -0,0 +1,10 @@
+SELECT
+    diffSkyfile.*,
+    diffRun.state,
+    diffRun.workdir,
+    diffRun.dvodb,
+    diffRun.tess_id
+FROM diffRun
+JOIN diffSkyfile
+    USING(diff_id)
+WHERE ( diffRun.state = 'goto_cleaned' OR diffRun.state = 'goto_scrubbed' OR diffRun.state = 'goto_purged')
Index: branches/eam_branches/ipp-20121130/ippTools/share/pstamptool_revertdependent.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/pstamptool_revertdependent.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/pstamptool_revertdependent.sql	(revision 34839)
@@ -4,4 +4,6 @@
 SET pstampDependent.fault = 0
 -- fault count hook %s
-WHERE pstampDependent.state = 'new'
+WHERE pstampRequest.state ='run'
+    AND pstampJob.state ='run'
+    AND pstampDependent.state = 'new'
     AND (pstampDependent.fault > 0)
Index: branches/eam_branches/ipp-20121130/ippTools/share/pxadmin_create_tables.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/pxadmin_create_tables.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/pxadmin_create_tables.sql	(revision 34839)
@@ -2119,4 +2119,5 @@
       n_detections INT,
       n_extended INT,
+      n_forced INT,
       zpt_obs FLOAT,
       zpt_stdev FLOAT,
Index: branches/eam_branches/ipp-20121130/ippTools/share/stacktool_inputskyfile.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/stacktool_inputskyfile.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/stacktool_inputskyfile.sql	(revision 34839)
@@ -4,4 +4,5 @@
     rawExp.exp_id,
     rawExp.exp_name,
+    rawExp.exp_time,
     rawExp.object,
     rawExp.dateobs,
Index: branches/eam_branches/ipp-20121130/ippTools/share/stacktool_pendingcleanuprun.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/stacktool_pendingcleanuprun.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/stacktool_pendingcleanuprun.sql	(revision 34839)
@@ -8,6 +8,8 @@
     stackRun.stack_id,
     rawExp.camera,
-    stackRun.state
+    stackRun.state,
+    stackSumSkyfile.path_base
 FROM stackRun
+JOIN stackSumSkyfile using(stack_id)
 JOIN stackInputSkyfile
     USING(stack_id)
Index: branches/eam_branches/ipp-20121130/ippTools/share/stacktool_tobkg.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/stacktool_tobkg.sql	(revision 34839)
+++ branches/eam_branches/ipp-20121130/ippTools/share/stacktool_tobkg.sql	(revision 34839)
@@ -0,0 +1,29 @@
+SELECT
+    stackRun.stack_id,
+    stackRun.tess_id,
+    stackRun.skycell_id,
+    stackRun.workdir,
+    stackRun.reduction,
+    stackRun.label,
+    stackRun.state,
+    stackSumSkyfile.path_base,
+    rawExp.camera,
+    IFNULL(Label.priority, 10000) AS priority
+FROM stackRun
+JOIN stackInputSkyfile USING(stack_id)
+JOIN warpRun USING(warp_id)
+JOIN warpSkyfile USING(warp_id,skycell_id)
+JOIN fakeRun USING(fake_id)
+JOIN camRun USING(cam_id)
+JOIN chipRun USING(chip_id)
+JOIN rawExp USING(exp_id)
+LEFT JOIN stackSumSkyfile USING(stack_id)
+LEFT JOIN Label ON Label.label = stackRun.label
+WHERE
+    ((stackRun.state = 'full' AND stackSumSkyfile.fault = 0 AND stackSumSkyfile.quality = 0 AND stackSumSkyfile.background_model != 1))
+    AND (Label.active OR Label.active IS NULL)
+    -- WHERE hook %s
+GROUP BY stack_id
+HAVING (SUM(IF(warpRun.state = 'full', 1, 0)) = COUNT(stackInputSkyfile.warp_id) AND
+        SUM(IF(warpSkyfile.background_model = 1, 1, 0)) = COUNT(stackInputSkyfile.warp_id))
+
Index: branches/eam_branches/ipp-20121130/ippTools/share/staticskytool_defineskycalrun.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/staticskytool_defineskycalrun.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/staticskytool_defineskycalrun.sql	(revision 34839)
@@ -2,4 +2,6 @@
     sky_id,
     stack_id,
+    skycell_id,
+    filter,
     staticskyRun.workdir,
     staticskyRun.label,
@@ -11,4 +13,5 @@
     JOIN stackRun USING(stack_id)
     JOIN stackSumSkyfile USING(stack_id)
+    JOIN skycell USING(tess_id, skycell_id)
     LEFT JOIN skycalRun USING(sky_id, stack_id)
 WHERE staticskyRun.state = 'full'
Index: branches/eam_branches/ipp-20121130/ippTools/share/staticskytool_pendingskycalrun.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/staticskytool_pendingskycalrun.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/staticskytool_pendingskycalrun.sql	(revision 34839)
@@ -6,5 +6,5 @@
     staticskyResult.path_base,
     rawExp.camera,
-    0 AS  singlefilter
+    staticskyResult.num_inputs = 1 AS singlefilter
 FROM skycalRun
 JOIN staticskyRun USING (sky_id)
Index: branches/eam_branches/ipp-20121130/ippTools/share/warptool_pendingcleanuprun.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/warptool_pendingcleanuprun.sql	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/share/warptool_pendingcleanuprun.sql	(revision 34839)
@@ -1,5 +1,7 @@
 SELECT
     warpRun.warp_id,
+    warpRun.workdir,
     rawExp.camera,
+    rawExp.exp_tag,
     warpRun.state
 FROM warpRun
Index: branches/eam_branches/ipp-20121130/ippTools/share/warptool_pendingcleanupskyfile_all.sql
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/share/warptool_pendingcleanupskyfile_all.sql	(revision 34839)
+++ branches/eam_branches/ipp-20121130/ippTools/share/warptool_pendingcleanupskyfile_all.sql	(revision 34839)
@@ -0,0 +1,11 @@
+SELECT
+    warpSkyfile.*,
+    warpRun.state,
+    warpRun.workdir,
+    warpRun.label,
+    warpRun.dvodb,
+    warpRun.end_stage
+FROM warpRun
+JOIN warpSkyfile
+    USING(warp_id)
+WHERE (warpRun.state = 'goto_cleaned' OR warpRun.state = 'goto_scrubbed' OR warpRun.state = 'goto_purged')
Index: branches/eam_branches/ipp-20121130/ippTools/src/chiptool.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/chiptool.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/chiptool.c	(revision 34839)
@@ -1311,4 +1311,5 @@
     PXOPT_LOOKUP_S64(chip_id, config->args, "-chip_id", false, false);
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
@@ -1319,5 +1320,6 @@
     pxAddLabelSearchArgs (config, where, "-label", "label", "==");
 
-    psString query = pxDataGet("chiptool_pendingcleanupimfile.sql");
+    char *sql_file = all ? "chiptool_pendingcleanupimfile_all.sql" : "chiptool_pendingcleanupimfile.sql";
+    psString query = pxDataGet(sql_file);
     if (!query) {
         psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
Index: branches/eam_branches/ipp-20121130/ippTools/src/chiptoolConfig.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/chiptoolConfig.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/chiptoolConfig.c	(revision 34839)
@@ -296,4 +296,5 @@
     psMetadataAddS64(pendingcleanupimfileArgs, PS_LIST_TAIL, "-chip_id", 0,          "search by chip ID", 0);
     psMetadataAddStr(pendingcleanupimfileArgs, PS_LIST_TAIL, "-exp_id",                 0,            "search by exp_id", NULL);
+    psMetadataAddBool(pendingcleanupimfileArgs, PS_LIST_TAIL, "-all",  0,            "list all components regardless of data_state", false);
     psMetadataAddBool(pendingcleanupimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
     psMetadataAddU64(pendingcleanupimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
Index: branches/eam_branches/ipp-20121130/ippTools/src/difftool.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/difftool.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/difftool.c	(revision 34839)
@@ -2561,4 +2561,5 @@
 
     PXOPT_LOOKUP_S64(diff_id, config->args, "-diff_id", false, false);
+    PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -2570,5 +2571,6 @@
     pxAddLabelSearchArgs (config, where, "-label", "diffRun.label", "==");
 
-    psString query = pxDataGet("difftool_pendingcleanupskyfile.sql");
+    char * sql_file  = all ? "difftool_pendingcleanupskyfile_all.sql": "difftool_pendingcleanupskyfile.sql" ;
+    psString query = pxDataGet(sql_file);
     if (!query) {
         psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
@@ -2740,17 +2742,35 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_S16(fault, config->args, "-fault", true, false);
-    PXOPT_LOOKUP_S16(quality, config->args, "-set_quality", false, false);
-
-    psMetadata *where = psMetadataAlloc();
-    PXOPT_COPY_S64(config->args, where, "-diff_id",   "diff_id",   "==");
-    PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id",   "==");
-
-    if (!pxSetFaultCode(config->dbh, "diffSkyfile", where, fault, quality)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
+    PXOPT_LOOKUP_STR(state, config->args, "-set_state", false, false);
+
+    if (!state) {
+        psMetadata *where = psMetadataAlloc();
+        PXOPT_COPY_S64(config->args, where, "-diff_id",   "diff_id",   "==");
+        PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id",   "==");
+
+        PXOPT_LOOKUP_S16(fault, config->args, "-fault", true, false);
+        PXOPT_LOOKUP_S16(quality, config->args, "-set_quality", false, false);
+
+        if (!pxSetFaultCode(config->dbh, "diffSkyfile", where, fault, quality)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
+            psFree (where);
+            return false;
+        }
         psFree (where);
-        return false;
-    }
-    psFree (where);
+    } else {
+      if (strcmp(state,"error_cleaned") == 0) {
+        change_skyfile_data_state(config,"error_cleaned", "goto_cleaned");
+      }
+      else if (strcmp(state, "error_scrubbed") == 0) {
+        change_skyfile_data_state(config,"error_scrubbed", "goto_scrubbed");
+      }
+      else if (strcmp(state, "error_purged") == 0) {
+        change_skyfile_data_state(config,"error_purged", "goto_purged");
+      }
+      else {
+        psError(PS_ERR_UNKNOWN, false, "unhandled state given");
+        return(false);
+      }
+    }
 
     return true;
Index: branches/eam_branches/ipp-20121130/ippTools/src/difftoolConfig.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/difftoolConfig.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/difftoolConfig.c	(revision 34839)
@@ -395,4 +395,5 @@
     psMetadataAddStr(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "list blocks for specified label", NULL);
     psMetadataAddS64(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,          "search by diff ID", 0);
+    psMetadataAddBool(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-all",  0,            "list all skycells regardless of data_state", false);
     psMetadataAddBool(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
     psMetadataAddU64(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
@@ -411,4 +412,5 @@
     psMetadataAddBool(donecleanupArgs, PS_LIST_TAIL, "-simple",  0,          "use the simple output format", false);
     psMetadataAddU64(donecleanupArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+
     // -updatediffskyfile
     psMetadata *updatediffskyfileArgs = psMetadataAlloc();
@@ -416,5 +418,6 @@
     psMetadataAddStr(updatediffskyfileArgs, PS_LIST_TAIL, "-skycell_id", 0,   "search by skycell ID", NULL);
     psMetadataAddS16(updatediffskyfileArgs, PS_LIST_TAIL, "-fault", 0,        "set fault code (required)", 0);
-    psMetadataAddS16(updatediffskyfileArgs, PS_LIST_TAIL, "-set_quality", 0,      "set quality", 0);
+    psMetadataAddS16(updatediffskyfileArgs, PS_LIST_TAIL, "-set_quality", 0,  "set quality", 0);
+    psMetadataAddStr(updatediffskyfileArgs, PS_LIST_TAIL, "-set_state", 0,    "set data_state state", NULL);
 
     // -tocleanedskyfile
Index: branches/eam_branches/ipp-20121130/ippTools/src/stacktool.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/stacktool.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/stacktool.c	(revision 34839)
@@ -37,4 +37,5 @@
 static bool inputskyfileMode(pxConfig *config);
 static bool tosumMode(pxConfig *config);
+static bool tobkgMode(pxConfig *config);
 static bool addsumskyfileMode(pxConfig *config);
 static bool sumskyfileMode(pxConfig *config);
@@ -76,4 +77,5 @@
         MODECASE(STACKTOOL_MODE_INPUTSKYFILE,          inputskyfileMode);
         MODECASE(STACKTOOL_MODE_TOSUM,                 tosumMode);
+	MODECASE(STACKTOOL_MODE_TOBKG,                 tobkgMode);
         MODECASE(STACKTOOL_MODE_ADDSUMSKYFILE,         addsumskyfileMode);
         MODECASE(STACKTOOL_MODE_SUMSKYFILE,            sumskyfileMode);
@@ -952,4 +954,79 @@
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "stackSumSkyfile", !simple)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print array");
+            psFree(output);
+            return false;
+        }
+    }
+
+    psFree(output);
+
+    return true;
+}
+
+static bool tobkgMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-stack_id", "stack_id", "==");
+    pxAddLabelSearchArgs (config, where, "-label", "stackRun.label", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psString query = pxDataGet("stacktool_tobkg.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    psString whereClause = psStringCopy(""); // WHERE conditions to add
+    if (psListLength(where->list)) {
+        psString new = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&whereClause, "\nAND %s", new);
+        psFree(new);
+    }
+    psFree(where);
+
+    psStringAppend(&query, "\nORDER by priority DESC, stack_id");
+
+    // treat limit == 0 as "no limit"
+    if (limit) {
+        psString limitString = psDBGenerateLimitSQL(limit);
+        psStringAppend(&query, " %s", limitString);
+        psFree(limitString);
+    }
+
+    if (!p_psDBRunQueryF(config->dbh, query, whereClause)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    psArray *output = p_psDBFetchResult(config->dbh);
+    if (!output) {
+        psErrorCode err = psErrorCodeLast();
+        switch (err) {
+            case PS_ERR_DB_CLIENT:
+                psError(PXTOOLS_ERR_SYS, false, "database error");
+            case PS_ERR_DB_SERVER:
+                psError(PXTOOLS_ERR_PROG, false, "database error");
+            default:
+                psError(PXTOOLS_ERR_PROG, false, "unknown error");
+        }
+
+        return false;
+    }
+    if (!psArrayLength(output)) {
+        psTrace("stacktool", PS_LOG_INFO, "no rows found");
+        psFree(output);
+        return true;
+    }
+
+    if (psArrayLength(output)) {
+        // negative simple so the default is true
+        if (!ippdbPrintMetadatas(stdout, output, "stackBkgSkyfile", !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(output);
@@ -1681,12 +1758,26 @@
     PXOPT_LOOKUP_S16(fault, config->args, "-fault", true, false);
     PXOPT_LOOKUP_S16(quality, config->args, "-set_quality", false, false);
+    PXOPT_LOOKUP_S16(background_model, config->args, "-set_background_model", false, false);
 
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_S64(config->args, where, "-stack_id",   "stack_id",   "==");
 
-    if (!pxSetFaultCode(config->dbh, "stackSumSkyfile", where, fault, quality)) {
+    if (background_model) {
+      psMetadata *values = psMetadataAlloc();
+      PXOPT_COPY_S16(config->args, values, "-set_background_model", "background_model", "==");
+      long rows = psDBUpdateRows(config->dbh,"stackSumSkyfile", where, values);
+      psFree(values);
+      if (!rows) {
+	// This maybe should rollback and error if rows != 1
+	psError(PS_ERR_UNKNOWN, true, "no rows changed");
+	return false;
+      }
+    }
+    else {    
+      if (!pxSetFaultCode(config->dbh, "stackSumSkyfile", where, fault, quality)) {
         psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
         psFree (where);
         return false;
+      }
     }
     psFree (where);
Index: branches/eam_branches/ipp-20121130/ippTools/src/stacktool.h
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/stacktool.h	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/stacktool.h	(revision 34839)
@@ -31,4 +31,5 @@
     STACKTOOL_MODE_INPUTSKYFILE,
     STACKTOOL_MODE_TOSUM,
+    STACKTOOL_MODE_TOBKG,
     STACKTOOL_MODE_ADDSUMSKYFILE,
     STACKTOOL_MODE_SUMSKYFILE,
Index: branches/eam_branches/ipp-20121130/ippTools/src/stacktoolConfig.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/stacktoolConfig.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/stacktoolConfig.c	(revision 34839)
@@ -150,4 +150,11 @@
     psMetadataAddBool(tosumArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
+    // -tobkg
+    psMetadata *tobkgArgs = psMetadataAlloc();
+    psMetadataAddS64(tobkgArgs, PS_LIST_TAIL, "-stack_id", 0,            "search by stack ID", 0);
+    psMetadataAddStr(tobkgArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "search by label", NULL);
+    psMetadataAddU64(tobkgArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tobkgArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+    
     // -addsumskyfile
     psMetadata *addsumskyfileArgs = psMetadataAlloc();
@@ -280,5 +287,6 @@
     psMetadataAddS16(updatesumskyfileArgs, PS_LIST_TAIL, "-fault", 0,            "set fault code (required)", 0);
     psMetadataAddS16(updatesumskyfileArgs, PS_LIST_TAIL, "-set_quality", 0,            "set quality", 0);
-
+    psMetadataAddS16(updatesumskyfileArgs, PS_LIST_TAIL, "-set_background_model", 0,   "set background model", 0);
+    
     // -exportrun
     psMetadata *exportrunArgs = psMetadataAlloc();
@@ -304,4 +312,5 @@
     PXOPT_ADD_MODE("-inputskyfile",    "", STACKTOOL_MODE_INPUTSKYFILE,    inputskyfileArgs);
     PXOPT_ADD_MODE("-tosum",           "", STACKTOOL_MODE_TOSUM,          tosumArgs);
+    PXOPT_ADD_MODE("-tobkg",           "", STACKTOOL_MODE_TOBKG,          tobkgArgs);
     PXOPT_ADD_MODE("-addsumskyfile",   "", STACKTOOL_MODE_ADDSUMSKYFILE,   addsumskyfileArgs);
     PXOPT_ADD_MODE("-sumskyfile",      "list results of stackRun", STACKTOOL_MODE_SUMSKYFILE,      sumskyfileArgs);
Index: branches/eam_branches/ipp-20121130/ippTools/src/staticskytool.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/staticskytool.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/staticskytool.c	(revision 34839)
@@ -132,14 +132,4 @@
     pxAddLabelSearchArgs(config, whereMD, "-select_data_group",    "stackRun.data_group",       "LIKE");
     pxAddLabelSearchArgs(config, whereMD, "-select_filter",        "stackRun.filter",           "LIKE");
-#ifdef notdef
-    PXOPT_COPY_F32(config->args, whereMD, "-select_glat_min",      "skycell.glat",              ">=");
-    PXOPT_COPY_F32(config->args, whereMD, "-select_glat_max",      "skycell.glat",              "<=");
-    PXOPT_COPY_F32(config->args, whereMD, "-select_rahours_min",   "skycell.radeg/15",          ">=");
-    PXOPT_COPY_F32(config->args, whereMD, "-select_rahours_max",   "skycell.radeg/15",          "<=");
-    PXOPT_COPY_F32(config->args, whereMD, "-select_radeg_min",     "skycell.radeg",             ">=");
-    PXOPT_COPY_F32(config->args, whereMD, "-select_radeg_max",     "skycell.radeg",             "<=");
-    PXOPT_COPY_F32(config->args, whereMD, "-select_decdeg_min",    "skycell.decdeg",             ">=");
-    PXOPT_COPY_F32(config->args, whereMD, "-select_decdeg_max",    "skycell.decdeg",             "<=");
-#endif
     if (!pxskycellAddWhere(config, whereMD)) {
         psError(PXTOOLS_ERR_CONFIG, false, "failed to add skycell search arguments");
@@ -686,5 +676,5 @@
     psStringAppend(&query, "\nGROUP BY sky_id");
     if (num_filters) {
-        psStringAppend(&query, "\nHAVING COUNT(filter) >= %d", num_filters);
+        psStringAppend(&query, "\nHAVING COUNT(filter) = %d", num_filters);
     }
         
@@ -1049,4 +1039,8 @@
     pxAddLabelSearchArgs(config, whereMD, "-select_data_group",    "staticskyRun.data_group",       "LIKE");
     pxAddLabelSearchArgs(config, whereMD, "-select_filter",        "stackRun.filter",           "LIKE");
+    if (!pxskycellAddWhere(config, whereMD)) {
+        psError(PXTOOLS_ERR_CONFIG, false, "failed to add skycell search arguments");
+        return false;
+    }
 
     PXOPT_LOOKUP_BOOL(rerun, config->args, "-rerun", false);
@@ -1128,4 +1122,5 @@
         psString sky_label =  psMetadataLookupStr(&status, row, "label");
         psString sky_data_group =  psMetadataLookupStr(&status, row, "data_group");
+        psString sky_dist_group =  psMetadataLookupStr(&status, row, "dist_group");
 
 	// create a staticskyRun
@@ -1138,5 +1133,5 @@
 				label ? label : sky_label,
 				data_group ? data_group : sky_data_group,
-				dist_group,
+				dist_group ? dist_group : sky_dist_group,
 				reduction,
 				registered,
@@ -1159,7 +1154,13 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_COPY_S64(config->args, where, "-skycal_id",  "skycal_id",   "==");
-    PXOPT_COPY_STR(config->args, where, "-label",   "label",    "==");
-    PXOPT_COPY_STR(config->args, where, "-state",   "state",    "==");
+    PXOPT_COPY_S64(config->args, where, "-skycal_id", "skycal_id",   "==");
+    PXOPT_COPY_S64(config->args, where, "-sky_id",   "sky_id",   "==");
+    PXOPT_COPY_S64(config->args, where, "-stack_id", "stack_id",   "==");
+    PXOPT_COPY_STR(config->args, where, "-label",   "skycalRun.label",    "==");
+    PXOPT_COPY_STR(config->args, where, "-state",   "skycalRun.state",    "==");
+    if (!pxskycellAddWhere(config, where)) {
+        psError(PXTOOLS_ERR_CONFIG, false, "failed to add skycell search arguments");
+        return false;
+    }
     if (!psListLength(where->list)) {
         psFree(where);
@@ -1168,5 +1169,5 @@
     }
 
-    psString query = psStringCopy("UPDATE skycalRun");
+    psString query = psStringCopy("UPDATE skycalRun JOIN stackRun using(stack_id) join skycell using(tess_id, skycell_id)");
 
     // pxUpdateRun gets parameters from config->args and updates
@@ -1276,6 +1277,7 @@
     PXOPT_LOOKUP_STR(hostname, config->args,    "-hostname", false, false);
     PXOPT_LOOKUP_S32(n_astrom, config->args,    "-n_astrom", false, false);
-    PXOPT_LOOKUP_S32(n_detections, config->args,    "-n_detections", false, false);
-    PXOPT_LOOKUP_S32(n_extended, config->args,    "-n_extended", false, false);
+    PXOPT_LOOKUP_S32(n_detections, config->args,"-n_detections", false, false);
+    PXOPT_LOOKUP_S32(n_extended, config->args,  "-n_extended", false, false);
+    PXOPT_LOOKUP_S32(n_forced, config->args,    "-n_forced", false, false);
 
     PXOPT_LOOKUP_STR(path_base, config->args,   "-path_base", false, false);
@@ -1318,4 +1320,5 @@
         n_detections,
         n_extended,
+        n_forced,
         zpt_obs,
         zpt_stdev,
Index: branches/eam_branches/ipp-20121130/ippTools/src/staticskytoolConfig.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/staticskytoolConfig.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/staticskytoolConfig.c	(revision 34839)
@@ -126,5 +126,5 @@
     psMetadataAddStr(resultArgs, PS_LIST_TAIL, "-label", 0, "search by label", NULL);
     psMetadataAddStr(resultArgs, PS_LIST_TAIL, "-data_group", 0, "search by data_group (LIKE comparison)", NULL);
-    psMetadataAddS16(resultArgs, PS_LIST_TAIL, "-num_filters", 0, "search by number of filters in the inputs (>=)", 0);
+    psMetadataAddS16(resultArgs, PS_LIST_TAIL, "-num_filters", 0, "search by number of filters in the inputs", 0);
     pxskycellAddArguments(resultArgs);
     psMetadataAddS16(resultArgs, PS_LIST_TAIL, "-fault", 0, "search by fault code", 0);
@@ -166,4 +166,5 @@
     psMetadataAddStr(defineskycalrunArgs,  PS_LIST_TAIL, "-select_data_group", PS_META_DUPLICATE_OK, "search by stackRun data_group (LIKE comparison, multiple OK)", NULL);
     psMetadataAddStr(defineskycalrunArgs,  PS_LIST_TAIL, "-select_filter", PS_META_DUPLICATE_OK, "search by filter (LIKE comparison, multiple OK)", NULL);
+    pxskycellAddArguments(defineskycalrunArgs);
     psMetadataAddStr(defineskycalrunArgs,  PS_LIST_TAIL, "-set_workdir", 0, "define workdir", NULL);
     psMetadataAddStr(defineskycalrunArgs,  PS_LIST_TAIL, "-set_label", 0, "define label", NULL);
@@ -181,6 +182,9 @@
     psMetadata *updateskycalrunArgs = psMetadataAlloc();
     psMetadataAddS64(updateskycalrunArgs, PS_LIST_TAIL, "-skycal_id", 0, "search by skycal ID", 0);
+    psMetadataAddS64(updateskycalrunArgs, PS_LIST_TAIL, "-sky_id", 0,    "search by sky ID", 0);
+    psMetadataAddS64(updateskycalrunArgs, PS_LIST_TAIL, "-stack_id", 0,  "search by stack ID", 0);
     psMetadataAddStr(updateskycalrunArgs, PS_LIST_TAIL, "-state", 0, "search by state", NULL);
     psMetadataAddStr(updateskycalrunArgs, PS_LIST_TAIL, "-label", 0, "search by label", 0);
+    pxskycellAddArguments(updateskycalrunArgs);
     psMetadataAddStr(updateskycalrunArgs, PS_LIST_TAIL, "-set_label", 0, "define new value for label", NULL);
     psMetadataAddStr(updateskycalrunArgs, PS_LIST_TAIL, "-set_state", 0, "define new state", NULL);
@@ -215,4 +219,5 @@
     psMetadataAddS32(addskycalresultArgs, PS_LIST_TAIL, "-n_detections", 0,        "define number of detections", 0);
     psMetadataAddS32(addskycalresultArgs, PS_LIST_TAIL, "-n_extended", 0,          "define number of extended detections", 0);
+    psMetadataAddS32(addskycalresultArgs, PS_LIST_TAIL, "-n_forced", 0,            "define number of forced detections", 0);
 
     psMetadataAddStr(addskycalresultArgs, PS_LIST_TAIL, "-path_base", 0,            "define base output location", NULL);
Index: branches/eam_branches/ipp-20121130/ippTools/src/warptool.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/warptool.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/warptool.c	(revision 34839)
@@ -1838,4 +1838,5 @@
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
 
     psMetadata *where = psMetadataAlloc();
@@ -1843,5 +1844,6 @@
     pxAddLabelSearchArgs (config, where, "-label", "warpRun.label", "==");
 
-    psString query = pxDataGet("warptool_pendingcleanupskyfile.sql");
+    char * sql_file = all ? "warptool_pendingcleanupskyfile_all.sql" : "warptool_pendingcleanupskyfile.sql";
+    psString query = pxDataGet(sql_file);
     if (!query) {
         psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
@@ -2057,4 +2059,5 @@
         PXOPT_LOOKUP_S64(magicked, config->args, "-set_magicked", false, false);
 	PXOPT_LOOKUP_S16(quality, config->args, "-set_quality", false, false);
+
         if (magicked) {
             psStringAppend(&set_magicked_skyfile, "\n , warpSkyfile.magicked = %" PRId64, magicked);
@@ -2063,4 +2066,8 @@
 	if (quality) {
 	  psStringAppend(&set_magicked_skyfile, "\n , warpSkyfile.quality = %"PRId16, quality);
+	}
+	PXOPT_LOOKUP_S16(background_model, config->args, "-set_background_model", false, false);
+	if (background_model) {
+	  psStringAppend(&set_magicked_skyfile, "\n , warpSkyfile.background_model = %"PRId16, background_model);
 	}
     } else if (!strcmp(data_state, "cleaned") || !strcmp(data_state, "purged")) {
@@ -2123,6 +2130,22 @@
     // warp_id, skycell_id, fault are required
     PXOPT_LOOKUP_STR(state, config->args, "-set_state", false, false);
-
-    if (!state) {
+    PXOPT_LOOKUP_S16(background_model, config->args, "-set_background_model", false, false);
+    if (background_model) {
+      // CZW 2012-12-06: I'm unclear why we don't use this form for all updates?
+      psMetadata *where = psMetadataAlloc();
+      psMetadata *values = psMetadataAlloc();
+      PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+      PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
+      PXOPT_COPY_S16(config->args, values, "-set_background_model", "background_model", "==");
+      long rows = psDBUpdateRows(config->dbh,"warpSkyfile", where, values);
+      psFree(values);
+      psFree(where);
+      if (!rows) {
+	// This maybe should rollback and error if rows != 1
+	psError(PS_ERR_UNKNOWN, true, "no rows changed");
+	return false;
+      }
+    }
+    else if (!state) {
       psMetadata *where = psMetadataAlloc();
       PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
Index: branches/eam_branches/ipp-20121130/ippTools/src/warptoolConfig.c
===================================================================
--- branches/eam_branches/ipp-20121130/ippTools/src/warptoolConfig.c	(revision 34755)
+++ branches/eam_branches/ipp-20121130/ippTools/src/warptoolConfig.c	(revision 34839)
@@ -364,4 +364,5 @@
     psMetadataAddStr(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "list blocks for specified label", NULL);
     psMetadataAddS64(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,          "search by warp ID (required)", 0);
+    psMetadataAddBool(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-all",  0,            "list all skycells regardless of data_state", false);
     psMetadataAddBool(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
     psMetadataAddU64(pendingcleanupskyfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
@@ -409,5 +410,5 @@
     psMetadataAddS16(updateskyfileArgs, PS_LIST_TAIL, "-set_quality",  0,"new quality value", 0);
     psMetadataAddStr(updateskyfileArgs, PS_LIST_TAIL, "-set_state", 0,   "set state", 0);
-
+    psMetadataAddS16(updateskyfileArgs, PS_LIST_TAIL, "-set_background_model", 0, "set the background_model value", 0);
     // -exportrun
     psMetadata *exportrunArgs = psMetadataAlloc();
