Index: /trunk/ippTools/src/Makefile.am
===================================================================
--- /trunk/ippTools/src/Makefile.am	(revision 8660)
+++ /trunk/ippTools/src/Makefile.am	(revision 8661)
@@ -28,7 +28,5 @@
 libpxtools_la_LDFLAGS   = -release $(PACKAGE_VERSION)
 libpxtools_la_SOURCES   = \
-    p2searchDoneFrames.c \
 	p2insertPendingFrames.c \
-    p2pendingToDone.c \
     p2searchPendingFrames.c \
 	pxconfig.c \
Index: /trunk/ippTools/src/chiptool.c
===================================================================
--- /trunk/ippTools/src/chiptool.c	(revision 8660)
+++ /trunk/ippTools/src/chiptool.c	(revision 8661)
@@ -12,5 +12,6 @@
 static bool pendingimfileMode(pxConfig *config);
 static bool addprocessedimfileMode(pxConfig *config);
-static p2DoneImfileRow *p2pendingToDoneImfile(pxConfig *config, p2PendingImfileRow *imfile);
+static p2ProcessedImfileRow *p2pendingToProcessedImfile(pxConfig *config, p2PendingImfileRow *imfile);
+static p2ProcessedExpRow *p2PendingToProcessedExp(pxConfig *config, p2PendingExpRow *pendingExp);
 
 # define MODECASE(caseName, func) \
@@ -70,4 +71,5 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, NULL);
+#if 0
 
     psArray *rawFrames = rawScienceFrameSearch(config);
@@ -132,6 +134,8 @@
     }
 
+#endif
     return true;
 }
+
 
 static bool pendingimfileMode(pxConfig *config)
@@ -166,25 +170,80 @@
 static bool addprocessedimfileMode(pxConfig *config)
 {
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-
-    // -uri is always required
-    bool status = false;
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return NULL;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return NULL;
-    }
-    // get exp_id/class/class_id/uri from the CLI
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // select * from p2ProcessedImfiles
+    // where
+    // exp_id & class_id are not in p2PendingImfile
+
     // add the completed imfile to
-    // the p2DoneImfile tables
+    // the p2ProcessedeImfile tables
     // remove corresponding entries from the
     // p2PendingImfile table 
     // check to see if any p2PendingExps have no
     // associated p2PendingImfiles 
-    // if so move the p2PendingExp(s) to p2DoneExp
+    // if so move the p2PendingExp(s) to p2ProcessedExp
+    
+    psString query = psStringCopy(
+        "SELECT DISTINCT"
+        "   p2PendingImfile.*"
+        " FROM p2PendingImfile "
+        " LEFT JOIN p2ProcessedImfile"
+        "   USING(exp_id, class_id)"
+        " WHERE"
+        "  p2ProcessedImfile.exp_id IS NULL"
+        "  AND p2ProcessedImfile.class_id IS NULL"
+        );
+    {
+        psMetadata *where = psMetadataAlloc();
+        bool status = false;        
+        psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
+            psFree(query);
+            return false;
+        }
+        if (exp_id) {
+            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
+                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
+                psFree(where);
+                psFree(query);
+                return false;
+            }
+        }
+        psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
+            psFree(query);
+            return false;
+        }
+        if (class_id) {
+            if (!psMetadataAddStr(where, PS_LIST_TAIL, "class_id", 0, "==", class_id)) {
+                psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
+                psFree(where);
+                psFree(query);
+                return false;
+            }
+        }
+
+        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "p2PendingImfile");
+        psFree(where)
+        if (whereClaus) {
+            psStringAppend(&query, " AND %s", whereClause);
+            psFree(whereClause);
+        }
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    psArray *output = p_psDBFetchResult(config->dbh);
+    if (!output) {
+        // XXX check psError here
+        psError(PS_ERR_UNKNOWN, false, "no pending rawDetrendExp rows found");
+        return false;
+    }
 
     // find pending
@@ -205,5 +264,5 @@
     // insert into done
     for (long i = 0; i < psArrayLength(pendingImfiles); i++) {
-        p2DoneImfileRow *imfile = p2pendingToDoneImfile(config, pendingImfiles->data[0]);
+        p2ProcessedImfileRow *imfile = p2pendingToProcessedImfile(config, pendingImfiles->data[0]);
         if (!imfile) {
             // rollback
@@ -211,9 +270,9 @@
                 psError(PS_ERR_UNKNOWN, false, "database error");
             }
-            psError(PS_ERR_UNKNOWN, false, "failed to convert p2PendingImfile to p2DoneImfile");
+            psError(PS_ERR_UNKNOWN, false, "failed to convert p2PendingImfile to p2ProcessedImfile");
             psFree(pendingImfiles);
             return false;
         }
-        if (!p2DoneImfileInsertObject(config->dbh, imfile)) {
+        if (!p2ProcessedImfileInsertObject(config->dbh, imfile)) {
             // rollback
             if (!psDBRollback(config->dbh)) {
@@ -280,5 +339,5 @@
             }
 
-            p2DoneExpRow *doneExp = p2pendingToDoneExp(pendingExp);
+            p2ProcessedExpRow *doneExp = p2PendingToProcessedExp(config, pendingExp);
             if (!doneExp) {
                 // rollback
@@ -286,9 +345,9 @@
                     psError(PS_ERR_UNKNOWN, false, "database error");
                 }
-                psError(PS_ERR_UNKNOWN, false, "p2PendingExp -> p2DoneExp failed");
+                psError(PS_ERR_UNKNOWN, false, "p2PendingExp -> p2ProcessedExp failed");
                 psFree(pendingExps);
                 return false;
             }
-            if (!p2DoneExpInsertObject(config->dbh, doneExp)) {
+            if (!p2ProcessedExpInsertObject(config->dbh, doneExp)) {
                 // rollback
                 if (!psDBRollback(config->dbh)) {
@@ -308,6 +367,6 @@
     psFree(pendingExps);
 
-    // point of no return for p2PendingImfile -> p2DoneImfile 
-    // point of no return for p2PendingExp -> p2DoneExp
+    // point of no return for p2PendingImfile -> p2ProcessedImfile 
+    // point of no return for p2PendingExp -> p2ProcessedExp
     if (!psDBCommit(config->dbh)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -330,6 +389,5 @@
 }
 
-// XXX the filename layout is defined by this code
-static p2DoneImfileRow *p2pendingToDoneImfile(pxConfig *config, p2PendingImfileRow *imfile)
+static p2ProcessedImfileRow *p2pendingToProcessedImfile(pxConfig *config, p2PendingImfileRow *imfile)
 {
     PS_ASSERT_PTR_NON_NULL(config, NULL);
@@ -340,18 +398,88 @@
     if (!status) {
         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return NULL;
+        return false;
     }
     if (!uri) {
         psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return NULL;
-    }
-
-    return p2DoneImfileRowAlloc(
+        return false;
+    }
+
+    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
+        return false;
+    }
+    if (!recipe) {
+        psError(PS_ERR_UNKNOWN, true, "-recip is required");
+        return false;
+    }
+
+    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
+        return false;
+    }
+    if (isnan(bg)) {
+        psError(PS_ERR_UNKNOWN, true, "-bg is required");
+        return false;
+    }
+
+    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
+        return false;
+    }
+    if (isnan(bg_stdev)) {
+        psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
+        return false;
+    }
+
+    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
+        return false;
+    }
+    if (isnan(bg_mean_stdev)) {
+        psError(PS_ERR_UNKNOWN, true, "-bg_mean_stdev is required");
+        return false;
+    }
+
+    // optional
+    psString b1_uri = psMetadataLookupStr(&status, config->args, "-b1_uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -b1_uri");
+        return false;
+    }
+
+    psString b2_uri = psMetadataLookupStr(&status, config->args, "-b2_uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -b2_uri");
+        return false;
+    }
+
+    return p2ProcessedImfileRowAlloc(
         imfile->exp_id,
         imfile->class_id,
         uri,
-        "my recipe", // recipe
+        recipe,
+        bg,
+        bg_stdev,
+        bg_mean_stdev,
+        b1_uri,
+        b2_uri,
         imfile->p1_version,
         imfile->p2_version
     );
 }
+
+static p2ProcessedExpRow *p2PendingToProcessedExp(pxConfig *config, p2PendingExpRow *pendingExp)
+{
+    PS_ASSERT_PTR_NON_NULL(pendingExp, NULL);
+
+    return p2ProcessedExpRowAlloc(
+        pendingExp->exp_id,
+        "my recipe",
+        pendingExp->p1_version,
+        pendingExp->p2_version
+    );
+}
Index: /trunk/ippTools/src/pxframes.c
===================================================================
--- /trunk/ippTools/src/pxframes.c	(revision 8660)
+++ /trunk/ippTools/src/pxframes.c	(revision 8661)
@@ -41,5 +41,4 @@
 PX_FRAME_ALLOC(rawScienceFrame, rawScienceExp);
 PX_FRAME_ALLOC(p2PendingFrame, p2PendingExp);
-PX_FRAME_ALLOC(p2DoneFrame, p2DoneExp);
 
 #define PX_FRAME_PRINT(frametype, imfiletype) \
Index: /trunk/ippTools/src/pxtables.c
===================================================================
--- /trunk/ippTools/src/pxtables.c	(revision 8660)
+++ /trunk/ippTools/src/pxtables.c	(revision 8661)
@@ -33,6 +33,6 @@
     CREATE_TABLE(p2PendingExpCreateTable);
     CREATE_TABLE(p2PendingImfileCreateTable);
-    CREATE_TABLE(p2DoneExpCreateTable);
-    CREATE_TABLE(p2DoneImfileCreateTable);
+    CREATE_TABLE(p2ProcessedExpCreateTable);
+    CREATE_TABLE(p2ProcessedImfileCreateTable);
     CREATE_TABLE(p3PendingExpCreateTable);
     CREATE_TABLE(detRunCreateTable);
@@ -88,6 +88,6 @@
     DROP_TABLE(p2PendingExpDropTable);
     DROP_TABLE(p2PendingImfileDropTable);
-    DROP_TABLE(p2DoneExpDropTable);
-    DROP_TABLE(p2DoneImfileDropTable);
+    DROP_TABLE(p2ProcessedExpDropTable);
+    DROP_TABLE(p2ProcessedImfileDropTable);
     DROP_TABLE(p3PendingExpDropTable);
     DROP_TABLE(detRunDropTable);
Index: /trunk/ippTools/src/pxtools.h
===================================================================
--- /trunk/ippTools/src/pxtools.h	(revision 8660)
+++ /trunk/ippTools/src/pxtools.h	(revision 8661)
@@ -91,14 +91,4 @@
 );
 
-typedef struct {
-    p2DoneExpRow *exposure;
-    psArray *images;
-} p2DoneFrame;
-
-p2DoneFrame *p2DoneFrameAlloc(
-    p2DoneExpRow *exposure,
-    psArray *images
-);
-
 pxConfig *pxConfigAlloc(void);
 
@@ -115,5 +105,4 @@
 psArray *p2searchPendingImfiles(pxConfig *config);
 psArray *p2searchPendingExp(pxConfig *config);
-p2DoneExpRow *p2pendingToDoneExp(p2PendingExpRow *pendingExp);
 
 bool pzPendingFramePrint(FILE *stream, pxConfig *config, psArray *frames);
Index: /trunk/ippTools/src/regtool.c
===================================================================
--- /trunk/ippTools/src/regtool.c	(revision 8660)
+++ /trunk/ippTools/src/regtool.c	(revision 8661)
@@ -446,5 +446,4 @@
         ); // WHERE class is generated from exp_id, class, & class_id
 
-    char *whereClaus = NULL;
     {
         // build a query to search by exp_id, class, class_id
@@ -495,5 +494,5 @@
 
         // there's not
-        whereClaus = psDBGenerateWhereSQL(where, NULL);
+        psString whereClaus = psDBGenerateWhereSQL(where, NULL);
         psFree(where);
         if (whereClaus) {
