Index: trunk/ippTools/share/dettool_addprocessedexp.sql
===================================================================
--- trunk/ippTools/share/dettool_addprocessedexp.sql	(revision 19607)
+++ trunk/ippTools/share/dettool_addprocessedexp.sql	(revision 19621)
@@ -21,5 +21,5 @@
 WHERE
   detRun.state = 'run'
-  AND detRun.mode = 'master'
+  AND (detRun.mode = 'master' or detRun.mode = 'verify')
   AND detProcessedExp.det_id IS NULL
   AND detProcessedExp.exp_id IS NULL
Index: trunk/ippTools/share/dettool_childlessrun.sql
===================================================================
--- trunk/ippTools/share/dettool_childlessrun.sql	(revision 19607)
+++ trunk/ippTools/share/dettool_childlessrun.sql	(revision 19621)
@@ -5,5 +5,6 @@
  FROM detRun
  LEFT JOIN detRun as foo
-   ON foo.parent = detRun.det_id
+   ON foo.ref_det_id = detRun.det_id
+-- XXX do we need to restrict to foo.ref_iter = detRun.iteration ?   
  WHERE
    detRun.state = 'stop'
Index: trunk/ippTools/share/dettool_stop_completed_correct_runs.sql
===================================================================
--- trunk/ippTools/share/dettool_stop_completed_correct_runs.sql	(revision 19607)
+++ trunk/ippTools/share/dettool_stop_completed_correct_runs.sql	(revision 19621)
@@ -8,5 +8,6 @@
     FROM detRun AS det1
     INNER JOIN detRun as det2
-        ON det1.parent = det2.det_id 
+        ON det1.ref_det_run = det2.det_id 
+	-- do we need to restrict by iteration?  not clear this logic below is right or tested
     JOIN detNormalizedImfile as imfile
         ON det2.det_id = imfile.det_id
Index: trunk/ippTools/share/dettool_tocorrectimfile.sql
===================================================================
--- trunk/ippTools/share/dettool_tocorrectimfile.sql	(revision 19607)
+++ trunk/ippTools/share/dettool_tocorrectimfile.sql	(revision 19621)
@@ -1,2 +1,3 @@
+-- select imfiles from detRun 1 (the reference detRun) that match the desired correction in detRun 2
 SELECT
     det1.*,
@@ -14,9 +15,9 @@
     imfile.fault
 FROM detRun AS det1
-INNER JOIN detRun as det2
-    ON det1.parent = det2.det_id 
+JOIN detRun as det2
+    ON det1.ref_det_id = det2.det_id 
 JOIN detNormalizedImfile as imfile
-    ON det2.det_id = imfile.det_id
-    AND det2.iteration = imfile.iteration
+    ON det1.ref_det_id = imfile.det_id
+    AND det1.ref_iter = imfile.iteration
 LEFT JOIN detRegisteredImfile
     ON det1.det_id = detRegisteredImfile.det_id
Index: trunk/ippTools/share/dettool_toprocessedexp.sql
===================================================================
--- trunk/ippTools/share/dettool_toprocessedexp.sql	(revision 19607)
+++ trunk/ippTools/share/dettool_toprocessedexp.sql	(revision 19621)
@@ -48,5 +48,5 @@
     WHERE
         detRun.state = 'run'
-        AND detRun.mode = 'master'
+        AND (detRun.mode = 'master' or detRun.mode = 'verify')
         AND detProcessedExp.det_id IS NULL
         AND detProcessedExp.exp_id IS NULL
Index: trunk/ippTools/share/dettool_toprocessedimfile.sql
===================================================================
--- trunk/ippTools/share/dettool_toprocessedimfile.sql	(revision 19607)
+++ trunk/ippTools/share/dettool_toprocessedimfile.sql	(revision 19621)
@@ -19,5 +19,5 @@
 WHERE
     detRun.state = 'run'
-    AND detRun.mode = 'master'
+    AND (detRun.mode = 'master' or detRun.mode = 'verify')
     AND detProcessedImfile.det_id IS NULL
     AND detProcessedImfile.exp_id IS NULL
Index: trunk/ippTools/share/dettool_toresidimfile.sql
===================================================================
--- trunk/ippTools/share/dettool_toresidimfile.sql	(revision 19607)
+++ trunk/ippTools/share/dettool_toresidimfile.sql	(revision 19621)
@@ -14,4 +14,6 @@
     detProcessedImfile.uri,
     detNormalizedImfile.uri AS det_uri,
+    detRun.det_id AS ref_det_id,
+    detRun.iteration AS ref_iter,
     rawExp.camera,
     rawExp.exp_tag
@@ -53,30 +55,40 @@
     detRun.workdir,
     detRun.reduction,
-    rawImfile.exp_id,
-    rawImfile.class_id,
-    rawImfile.uri,
-    'NULL' AS det_uri,
+    detProcessedImfile.exp_id,
+    detProcessedImfile.class_id,
+    detProcessedImfile.uri,
+    detNormalizedImfile.uri AS det_uri,
+    detRun.ref_det_id,
+    detRun.ref_iter,
     rawExp.camera,
     rawExp.exp_tag
 FROM detRun
+JOIN detRun AS detRunRef
+  ON detRunRef.det_id = detRun.ref_det_id
 JOIN detInputExp
-    USING(det_id, iteration)
+  ON detInputExp.det_id    = detRun.det_id
+ AND detInputExp.iteration = detRun.iteration
 JOIN rawExp
-    ON detInputExp.exp_id = rawExp.exp_id
-JOIN rawImfile
-    ON detInputExp.exp_id = rawImfile.exp_id
+  ON rawExp.exp_id = detInputExp.exp_id
+JOIN detProcessedImfile
+  ON detProcessedImfile.det_id    = detRun.det_id
+ AND detProcessedImfile.exp_id    = detInputExp.exp_id
+JOIN detNormalizedImfile
+  ON detNormalizedImfile.det_id    = detRun.ref_det_id
+ AND detNormalizedImfile.iteration = detRun.ref_iter
+ AND detNormalizedImfile.class_id  = detProcessedImfile.class_id
 LEFT JOIN detResidImfile
-    ON detRun.det_id = detResidImfile.det_id
-    AND detRun.iteration = detResidImfile.iteration
-    AND rawImfile.exp_id = detResidImfile.exp_id
-    AND rawImfile.class_id = detResidImfile.class_id
+  ON detResidImfile.det_id    = detRun.det_id      
+ AND detResidImfile.iteration = detRun.iteration   
+ AND detResidImfile.exp_id    = detProcessedImfile.exp_id   
+ AND detResidImfile.class_id  = detProcessedImfile.class_id 
 WHERE
-    detRun.state = 'run'
-    AND detRun.mode = 'verify'
-    -- AND detNormalizedImfile.fault = 0
-    -- AND detNormalizedExp.fault = 0
-    AND detResidImfile.det_id IS NULL
-    AND detResidImfile.iteration IS NULL
-    AND detResidImfile.exp_id IS NULL
-    AND detResidImfile.class_id IS NULL
+ detRun.state = 'run'
+ AND detRun.mode = 'verify'
+ AND detRunRef.state = 'stop'
+ AND detNormalizedImfile.fault = 0
+ AND detResidImfile.det_id IS NULL
+ AND detResidImfile.iteration IS NULL
+ AND detResidImfile.exp_id IS NULL
+ AND detResidImfile.class_id IS NULL
 ORDER BY exp_id
Index: trunk/ippTools/share/pxadmin_create_tables.sql
===================================================================
--- trunk/ippTools/share/pxadmin_create_tables.sql	(revision 19607)
+++ trunk/ippTools/share/pxadmin_create_tables.sql	(revision 19621)
@@ -444,5 +444,7 @@
     solang_max FLOAT,
     label VARCHAR(64),
-    parent INT,
+    ref_det_id BIGINT,
+    ref_iter INT,
+    -- parent INT, :: dropping this
     PRIMARY KEY(det_id),
     KEY(det_id),
@@ -452,5 +454,5 @@
     KEY(state),
     KEY(label),
-    KEY(parent),
+    -- KEY(parent), :: dropping this
     INDEX(det_id, iteration))
 ENGINE=innodb DEFAULT CHARSET=latin1;
@@ -616,4 +618,6 @@
     det_id BIGINT,
     iteration INT,
+    ref_det_id BIGINT,
+    ref_iter INT,
     exp_id BIGINT,
     class_id VARCHAR(64),
@@ -647,5 +651,5 @@
     FOREIGN KEY (det_id, exp_id, class_id)
     REFERENCES  detProcessedImfile(det_id, exp_id, class_id),
-    FOREIGN KEY (det_id, iteration)
+    FOREIGN KEY (ref_det_id, ref_iter)
     REFERENCES  detNormalizedExp(det_id, iteration)
 ) ENGINE=innodb DEFAULT CHARSET=latin1;
Index: trunk/ippTools/src/dettool.c
===================================================================
--- trunk/ippTools/src/dettool.c	(revision 19607)
+++ trunk/ippTools/src/dettool.c	(revision 19621)
@@ -234,10 +234,24 @@
     // optional
     PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", false, false);
-    PXOPT_LOOKUP_STR(mode, config->args, "-mode", false, false);
+
     // check mode
-    if (mode && !isValidMode(config, mode)) {
-        psError(PS_ERR_UNKNOWN, false, "invalud mode");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(mode, config->args, "-mode", true, false); // default ('master') is supplied
+    if (!isValidMode(config, mode)) {
+        psError(PS_ERR_UNKNOWN, false, "invalid mode");
+        return false;
+    }
+
+    // get -ref_det_id and -ref_iter : required for 'verify' mode / disallowed otherwise
+    PXOPT_LOOKUP_S64(ref_det_id, config->args, "-ref_det_id", true, false);
+    PXOPT_LOOKUP_S32(ref_iter, config->args, "-ref_iter", true, false);
+    if (!strncmp(mode, "verify", 7) && ((ref_det_id == 0) || (ref_iter == -1))) {
+        psError(PS_ERR_UNKNOWN, false, "verify mode requires both -ref_det_id and -ref_iter");
+        return false;
+    } 
+    if (strncmp(mode, "verify", 7) && ((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);
@@ -368,5 +382,6 @@
                  solang_max,
                  label,
-                 0       // parent
+                 ref_det_id,
+                 ref_iter
         );
     psS64 det_id = psDBLastInsertID(config->dbh);
@@ -469,11 +484,23 @@
     PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
 
-    // optional
-    PXOPT_LOOKUP_STR(mode, config->args, "-mode", false, false);
     // check mode
-    if (mode && !isValidMode(config, mode)) {
+    PXOPT_LOOKUP_STR(mode, config->args, "-mode", true, false); // default ('master') is supplied
+    if (!isValidMode(config, mode)) {
         psError(PS_ERR_UNKNOWN, false, "invalid mode");
         return false;
     }
+
+    // get -ref_det_id and -ref_iter : required for 'verify' mode / disallowed otherwise
+    PXOPT_LOOKUP_S64(ref_det_id, config->args, "-ref_det_id", false, false);
+    PXOPT_LOOKUP_S32(ref_iter, config->args, "-ref_iter", false, false);
+    if (!strncmp(mode, "verify", 7) && ((ref_det_id == 0) || (ref_iter == -1))) {
+        psError(PS_ERR_UNKNOWN, false, "verify mode requires both -ref_det_id and -ref_iter");
+        return false;
+    } 
+    if (strncmp(mode, "verify", 7) && ((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);
     PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
@@ -623,5 +650,6 @@
                  solang_max,
                  label,
-                 0       // parent
+                 ref_det_id,
+		 ref_iter
         );
     psS64 det_id = psDBLastInsertID(config->dbh);
@@ -692,6 +720,7 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-
     
+    // XXX this mode is not well-tested: probably need to specify iteration here
+    // XXX pass the supplied det_id and iteration as ref_det_id, or get from command line?
     PXOPT_LOOKUP_S64(det_id, config->args, "-det_id", true, false); // required
     PXOPT_LOOKUP_STR(det_type, config->args, "-set_det_type", false, false); // optional
@@ -745,4 +774,5 @@
 
     // pull the detRun object out the result array
+    // XXX need to assign or re-assign the ref_det_id and ref_iter values
     detRunRow *detRun = psMemIncrRefCounter(detRuns->data[0]);
 
@@ -962,4 +992,5 @@
 
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
+    PXOPT_COPY_STR(config->args, where, "-mode", "mode", "==");
     PXOPT_COPY_STR(config->args, where, "-telescope", "telescope", "==");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
@@ -1541,5 +1572,6 @@
     PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
     PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
-    PXOPT_LOOKUP_S64(parent, config->args, "-parent", false, false);
+    PXOPT_LOOKUP_S64(ref_det_id, config->args, "-ref_det_id", false, false);
+    PXOPT_LOOKUP_S32(ref_iter, config->args, "-ref_iter", false, false);
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -1578,6 +1610,7 @@
                       solang_min,
                       solang_max,
-                      label,      // label
-                      parent
+                      label,
+		      ref_det_id,
+		      ref_iter
             )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -1751,15 +1784,9 @@
 
     // check that state is a valid string value
-    if (!(
-            (strncmp(mode, "master", 7) == 0)
-            || (strncmp(mode, "verify", 7) == 0)
-        )
-    ) {
-        psError(PS_ERR_UNKNOWN, false,
-                "invalid detRun mode: %s", mode);
-        return false;
-    }
-
-    return true;
+    if (!strncmp(mode, "master", 7)) return true;
+    if (!strncmp(mode, "verify", 7)) return true;
+
+    psError(PS_ERR_UNKNOWN, false, "invalid detRun mode: %s", mode);
+    return false;
 }
 
Index: trunk/ippTools/src/dettoolConfig.c
===================================================================
--- trunk/ippTools/src/dettoolConfig.c	(revision 19607)
+++ trunk/ippTools/src/dettoolConfig.c	(revision 19621)
@@ -78,4 +78,7 @@
     psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-label",  0,            "define detrun label", NULL);
     psMetadataAddBool(definebytagArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+
+    psMetadataAddS64(definebytagArgs, PS_LIST_TAIL, "-ref_det_id", 0,           "define reference detrend (verify mode only)", 0);
+    psMetadataAddS32(definebytagArgs, PS_LIST_TAIL, "-ref_iter", 0,           "define reference detrend (verify mode only)", -1);
 
     // -definebyquery
@@ -129,4 +132,6 @@
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-random_subset",  0,            "use a random subset of elements", false);
     psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-random_limit",  0,            "use this number of random elements", 20);
+    psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-ref_det_id", 0,           "define reference detrend (verify mode only)", 0);
+    psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-ref_iter", 0,           "define reference detrend (verify mode only)", -1);
 
     // -definebydetrun
@@ -163,5 +168,6 @@
     // -makecorrection
     psMetadata *makecorrectionArgs = psMetadataAlloc();
-    psMetadataAddS64(makecorrectionArgs, PS_LIST_TAIL, "-det_id",  0,            "det ID to be corrected (required)", 0);
+    psMetadataAddS64(makecorrectionArgs, PS_LIST_TAIL, "-det_id",  0,     "detRun det_id to be corrected (required)", 0);
+    psMetadataAddS32(makecorrectionArgs, PS_LIST_TAIL, "-iteration",  0,  "detRun iteration to be corrected (required)", -1);;
     psMetadataAddBool(makecorrectionArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
@@ -203,4 +209,5 @@
     psMetadataAddF32(runsArgs, PS_LIST_TAIL, "-ccd_temp", 0,            "match ccd temp", NAN);
     psMetadataAddF64(runsArgs, PS_LIST_TAIL, "-posang", 0,            "match posang", NAN);
+    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-mode", 0,            "search for det run by mode", NULL);
     psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
     psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-active",  0,            "only return active detRuns", false);
@@ -216,5 +223,5 @@
     psMetadata *inputArgs = psMetadataAlloc();
     psMetadataAddS64(inputArgs, PS_LIST_TAIL, "-det_id", 0,            "search for detrend ID", 0);
-    psMetadataAddS32(inputArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddS32(inputArgs, PS_LIST_TAIL, "-iteration",  0,            "search for iteration number (default 0)", 0);
     psMetadataAddS64(inputArgs, PS_LIST_TAIL, "-exp_id",  0,            "search for exp ID", 0);
     psMetadataAddBool(inputArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
@@ -591,13 +598,16 @@
 
     // -addresidimfile
+    // XXX does a default value of 0 mean the entry is not instatiated? what about a supplied value of 0?
     psMetadata *addresidimfileArgs = psMetadataAlloc();
     psMetadataAddS64(addresidimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", 0);
-    psMetadataAddS32(addresidimfileArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddS32(addresidimfileArgs, PS_LIST_TAIL, "-iteration",  0,         "define iteration number", 0);
+    psMetadataAddS64(addresidimfileArgs, PS_LIST_TAIL, "-ref_det_id",  0,        "define reference detrend ID (required)", 0);
+    psMetadataAddS32(addresidimfileArgs, PS_LIST_TAIL, "-ref_iter",  0,          "define reference iteration number (required)", -1);
     psMetadataAddS64(addresidimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "define detrend ID (required)", 0);
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "define class ID (required)", NULL);
-    psMetadataAddS16(addresidimfileArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-uri",  0,            "define resid file URI", NULL);
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-recip",  0,            "define recipe", NULL);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-class_id",  0,          "define class ID (required)", NULL);
+    psMetadataAddS16(addresidimfileArgs, PS_LIST_TAIL, "-code",  0,              "set fault code", 0);
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-uri",  0,               "define resid file URI", NULL);
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-recip",  0,             "define recipe", NULL);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg",  0,                "define exposure background", NAN);
     psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
     psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
@@ -815,5 +825,6 @@
     psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-use_begin",  0,            "start of detrend run applicable period", NULL);
     psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-use_end",  0,            "end of detrend run applicable period", NULL);
-    psMetadataAddS64(register_detrendArgs, PS_LIST_TAIL, "-parent",  0,            "define parent det_id", 0);
+    psMetadataAddS64(register_detrendArgs, PS_LIST_TAIL, "-ref_det_id",  0,            "define reference det_id", 0);
+    psMetadataAddS32(register_detrendArgs, PS_LIST_TAIL, "-ref_iter",  0,            "define reference iteration", -1);
     psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-label",  0,            "define detrun label", NULL);
     psMetadataAddBool(register_detrendArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
Index: trunk/ippTools/src/dettool_correction.c
===================================================================
--- trunk/ippTools/src/dettool_correction.c	(revision 19607)
+++ trunk/ippTools/src/dettool_correction.c	(revision 19621)
@@ -24,10 +24,12 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_S64(det_id, config->args, "-det_id", true, false); // required
+    PXOPT_LOOKUP_S64(ref_det_id, config->args, "-det_id", true, false); // required
+    PXOPT_LOOKUP_S32(ref_iter, config->args, "-iteration", true, false); // required
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false); // optional
 
     // build the needed where 
     psMetadata *where = psMetadataAlloc();
-    psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", det_id);
+    psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", ref_det_id);
+    psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", ref_iter);
     psArray *runs = detRunSelectRowObjects(config->dbh, where, 1);
     psFree (where);
@@ -74,5 +76,6 @@
          detRun->solang_max,
          detRun->label,
-         detRun->det_id // parent
+	 detRun->det_id, // ref_det_id
+	 detRun->iteration // ref_iter
     );
 
Index: trunk/ippTools/src/dettool_processedimfile.c
===================================================================
--- trunk/ippTools/src/dettool_processedimfile.c	(revision 19607)
+++ trunk/ippTools/src/dettool_processedimfile.c	(revision 19621)
@@ -165,5 +165,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    char *value = NULL;
+    bool hasWhere = false;
 
     PXOPT_LOOKUP_BOOL(included, config->args, "-included", false);
@@ -173,7 +173,9 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_COPY_S64(config->args, where, "-det_id", "det_id", "==");
-    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-det_id", "detProcessedImfile.det_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "detProcessedImfile.exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "detProcessedImfile.class_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-select_state", "detRun.state", "==");
+    PXOPT_COPY_STR(config->args, where, "-select_mode", "detRun.mode", "==");
 
     psString query = pxDataGet("dettool_processedimfile.sql");
@@ -184,24 +186,9 @@
     }
 
-    // add the two required restrictions: detRun.state and detRun.mode
-    // NOTE the above query requires one of the following two WHERE statements
-    {
-        bool status;
-        if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
-            psStringAppend(&query, " WHERE detRun.state = '%s'", value);
-        } else {
-            psStringAppend(&query, " WHERE detRun.state = 'run'");
-        }
-        if ((value = psMetadataLookupStr(&status, config->args, "-select_mode"))) {
-            psStringAppend(&query, " AND detRun.mode = '%s'", value);
-        } else {
-            psStringAppend(&query, " AND detRun.mode = 'master'");
-        }
-    }
-
     if (psListLength(where->list)) {
-        psString whereClause = psDBGenerateWhereConditionSQL(where, "detProcessedImfile");
-        psStringAppend(&query, " AND %s", whereClause);
+        psString whereClause = psDBGenerateWhereSQL(where, NULL);
+        psStringAppend(&query, " %s", whereClause);
         psFree(whereClause);
+	hasWhere = true;
     }
     psFree (where);
@@ -209,13 +196,23 @@
     // restrict search to included imfiles
     if (included) {
-	psStringAppend(&query, " AND detInputExp.include = 1");
+	if (hasWhere) {
+	    psStringAppend(&query, " AND detInputExp.include = 1");
+	} else {
+	    psStringAppend(&query, " WHERE detInputExp.include = 1");
+	}
+	hasWhere = true;
+    }
+
+    if (hasWhere) {
+	psStringAppend(&query, " AND");
+    } else {
+	psStringAppend(&query, " WHERE");
     }
 
     if (faulted) {
-        // list only faulted rows
-        psStringAppend(&query, " %s", "AND detProcessedImfile.fault != 0");
+	psStringAppend(&query, " %s", " detProcessedImfile.fault != 0");
     } else {
         // don't list faulted rows
-        psStringAppend(&query, " %s", "AND detProcessedImfile.fault = 0");
+        psStringAppend(&query, " %s", " detProcessedImfile.fault = 0");
     }
 
Index: trunk/ippTools/src/dettool_residimfile.c
===================================================================
--- trunk/ippTools/src/dettool_residimfile.c	(revision 19607)
+++ trunk/ippTools/src/dettool_residimfile.c	(revision 19621)
@@ -78,4 +78,8 @@
     PXOPT_LOOKUP_S64(det_id, config->args, "-det_id", true, false); // required
     PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+
+    PXOPT_LOOKUP_S64(ref_det_id, config->args, "-ref_det_id", true, false); // required
+    PXOPT_LOOKUP_S32(ref_iter, config->args, "-ref_iter", true, false);
+
     PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", true, false); // required
     PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false); // required
@@ -106,4 +110,6 @@
             det_id,
             iteration,
+            ref_det_id,
+            ref_iter,
             exp_id,
             class_id,
