Index: /trunk/ippScripts/scripts/detrend_resid_imfile.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_resid_imfile.pl	(revision 19620)
+++ /trunk/ippScripts/scripts/detrend_resid_imfile.pl	(revision 19621)
@@ -24,9 +24,11 @@
 use Pod::Usage qw( pod2usage );
 
-my ( $det_id, $iter, $exp_id, $exp_tag, $class_id, $det_type, $detrend, $input_uri, $camera, $mode, $outroot,
+my ( $det_id, $iter, $ref_det_id, $ref_iter, $exp_id, $exp_tag, $class_id, $det_type, $detrend, $input_uri, $camera, $mode, $outroot,
      $dbname, $reduction, $threads, $verbose, $no_update, $no_op, $redirect );
 GetOptions(
     'det_id|d=s'        => \$det_id,
     'iteration=s'       => \$iter,
+    'ref_det_id=s'      => \$ref_det_id,
+    'ref_iter=s'        => \$ref_iter,
     'exp_id|e=s'        => \$exp_id,
     'exp_tag|=s'        => \$exp_tag,
@@ -48,17 +50,19 @@
 
 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV;
-pod2usage( -msg => "Required options: --det_id --iteration --exp_id --exp_tag --class_id --det_type --camera --input_uri --mode --detrend --outroot (not for 'verify' mode)",
+pod2usage( -msg => "Required options: --det_id --iteration --ref_det_id --ref_iter --exp_id --exp_tag --class_id --det_type --camera --input_uri --mode --detrend --outroot (not for 'verify' mode)",
            -exitval => 3) unless
-    defined $det_id    and
-    defined $iter      and
-    defined $exp_id    and
-    defined $exp_tag   and
-    defined $class_id  and
-    defined $det_type  and
-    defined $input_uri and
-    defined $camera    and
-    defined $mode      and
-    defined $outroot   and
-    (defined $detrend or lc($mode) eq 'verify');
+    defined $det_id     and
+    defined $iter       and
+    defined $ref_det_id and
+    defined $ref_iter   and
+    defined $exp_id     and
+    defined $exp_tag    and
+    defined $class_id   and
+    defined $det_type   and
+    defined $input_uri  and
+    defined $camera     and
+    defined $mode       and
+    defined $outroot    and
+    defined $detrend;
 
 $ipprc->define_camera($camera);
@@ -69,4 +73,5 @@
 
 # Recipes to use as a function of detrend type and mode
+# XXX probably can drop the distinct 'verify' recipes
 $reduction = 'DETREND' unless defined $reduction;
 my $recipe;                     # Name of recipe to use
@@ -78,5 +83,8 @@
     &my_die("Unrecognised mode: $mode", $det_id, $iter, $exp_id, $class_id, $PS_EXIT_PROG_ERROR);
 }
+
+print "raw recipe: $recipe\n";
 $recipe = $ipprc->reduction($reduction, $recipe);
+print "real recipe: $recipe\n";
 
 # values to extract from output metadata and the stats to calculate
@@ -166,9 +174,7 @@
 
     # Detrend to use in processing
-    if (lc($mode) ne 'verify') {
-        my $detFlag = DETRENDS->{lc($det_type)};
-        &my_die("Unrecognised detrend type: $det_type", $det_id, $iter, $exp_id, $class_id, $PS_EXIT_PROG_ERROR) unless defined $detFlag;
-        $command .= " $detFlag $detrend";
-    }
+    my $detFlag = DETRENDS->{lc($det_type)};
+    &my_die("Unrecognised detrend type: $det_type", $det_id, $iter, $exp_id, $class_id, $PS_EXIT_PROG_ERROR) unless defined $detFlag;
+    $command .= " $detFlag $detrend";
 
     my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
@@ -216,4 +222,6 @@
 $command .= " -det_id $det_id";
 $command .= " -iteration $iter";
+$command .= " -ref_det_id $ref_det_id";
+$command .= " -ref_iter $ref_iter";
 $command .= " -exp_id $exp_id";
 $command .= " -class_id $class_id";
@@ -252,4 +260,6 @@
         $command .= " -det_id $det_id";
         $command .= " -iteration $iter";
+	$command .= " -ref_det_id $ref_det_id";
+	$command .= " -ref_iter $ref_iter";
         $command .= " -exp_id $exp_id";
         $command .= " -class_id $class_id";
Index: /trunk/ippTasks/Makefile.am
===================================================================
--- /trunk/ippTasks/Makefile.am	(revision 19620)
+++ /trunk/ippTasks/Makefile.am	(revision 19621)
@@ -28,4 +28,6 @@
 	simtest.basic.config \
 	simtest.basic.auto \
+	simtest.detverify.config \
+	simtest.detverify.auto \
 	simtest.flatcorr.config \
 	simtest.flatcorr.auto
Index: /trunk/ippTasks/automate.pro
===================================================================
--- /trunk/ippTasks/automate.pro	(revision 19620)
+++ /trunk/ippTasks/automate.pro	(revision 19621)
@@ -264,4 +264,12 @@
       end
       book setword automate $pageName pantaskState INIT.LAUNCH
+
+      if ($Ncheck == 1) 
+        # XXX this is a somewhat hackish way to carry information from the 'check' to the 'launch'
+        book getword tmpCheck page.000 det_id -var DET_ID
+        book getword tmpCheck page.000 iteration -var ITERATION
+        book setword automate $pageName det_id $DET_ID
+        book setword automate $pageName iteration $ITERATION
+      end
     end
 
@@ -326,4 +334,19 @@
     end
 
+    # modify the launch command to replace certain elements from the page
+    book getword automate $pageName det_id -var DET_ID
+    if ("$DET_ID" != "NULL") 
+      echo '$launchCommand'
+      strsub "$launchCommand" @det_id@ $DET_ID -var launchCommand
+    end
+
+    book getword automate $pageName iteration -var ITERATION
+    if ("$ITERATION" != "NULL") 
+      echo '$launchCommand'
+      strsub "$launchCommand" @iteration@ $ITERATION -var launchCommand
+    end
+
+    echo '$launchCommand'
+
     book setword automate $pageName pantaskState RUN.LAUNCH
 
Index: /trunk/ippTasks/detrend.resid.pro
===================================================================
--- /trunk/ippTasks/detrend.resid.pro	(revision 19620)
+++ /trunk/ippTasks/detrend.resid.pro	(revision 19621)
@@ -153,17 +153,19 @@
 
     book setword detPendingResidImfile $pageName pantaskState RUN
-    book getword detPendingResidImfile $pageName det_id    -var DET_ID   
-    book getword detPendingResidImfile $pageName exp_id    -var EXP_ID  
-    book getword detPendingResidImfile $pageName iteration -var ITERATION     
-    book getword detPendingResidImfile $pageName det_type  -var DET_TYPE 
-    book getword detPendingResidImfile $pageName mode      -var MODE     
-    book getword detPendingResidImfile $pageName exp_tag   -var EXP_TAG  
-    book getword detPendingResidImfile $pageName class_id  -var CLASS_ID 
-    book getword detPendingResidImfile $pageName uri       -var URI      
-    book getword detPendingResidImfile $pageName det_uri   -var DET_URI  
-    book getword detPendingResidImfile $pageName camera    -var CAMERA   
-    book getword detPendingResidImfile $pageName workdir   -var WORKDIR_TEMPLATE
-    book getword detPendingResidImfile $pageName dbname    -var DBNAME
-    book getword detPendingResidImfile $pageName reduction -var REDUCTION
+    book getword detPendingResidImfile $pageName det_id     -var DET_ID   
+    book getword detPendingResidImfile $pageName exp_id     -var EXP_ID  
+    book getword detPendingResidImfile $pageName iteration  -var ITERATION     
+    book getword detPendingResidImfile $pageName det_type   -var DET_TYPE 
+    book getword detPendingResidImfile $pageName mode       -var MODE     
+    book getword detPendingResidImfile $pageName exp_tag    -var EXP_TAG  
+    book getword detPendingResidImfile $pageName class_id   -var CLASS_ID 
+    book getword detPendingResidImfile $pageName uri        -var URI      
+    book getword detPendingResidImfile $pageName det_uri    -var DET_URI  
+    book getword detPendingResidImfile $pageName ref_det_id -var REF_DET_ID   
+    book getword detPendingResidImfile $pageName ref_iter   -var REF_ITER
+    book getword detPendingResidImfile $pageName camera     -var CAMERA   
+    book getword detPendingResidImfile $pageName workdir    -var WORKDIR_TEMPLATE
+    book getword detPendingResidImfile $pageName dbname     -var DBNAME
+    book getword detPendingResidImfile $pageName reduction  -var REDUCTION
 
     # specify choice of local or remote host based on camera and chip (class_id)
@@ -179,5 +181,5 @@
     stderr $LOGDIR/detrend.resid.imfile.log
 
-    $run = detrend_resid_imfile.pl --threads @MAX_THREADS@ --det_id $DET_ID --iteration $ITERATION --exp_id $EXP_ID --exp_tag $EXP_TAG --class_id $CLASS_ID --det_type $DET_TYPE --detrend $DET_URI --input_uri $URI --camera $CAMERA --mode $MODE --outroot $outroot --redirect-output --verbose
+    $run = detrend_resid_imfile.pl --threads @MAX_THREADS@ --det_id $DET_ID --iteration $ITERATION --ref_det_id $REF_DET_ID --ref_iter $REF_ITER --exp_id $EXP_ID --exp_tag $EXP_TAG --class_id $CLASS_ID --det_type $DET_TYPE --detrend $DET_URI --input_uri $URI --camera $CAMERA --mode $MODE --outroot $outroot --redirect-output --verbose
 
     if ("$REDUCTION" != "NULL")
Index: /trunk/ippTasks/simtest.detverify.auto
===================================================================
--- /trunk/ippTasks/simtest.detverify.auto	(revision 19621)
+++ /trunk/ippTasks/simtest.detverify.auto	(revision 19621)
@@ -0,0 +1,78 @@
+
+automate MULTI
+
+# we run in the sequence BLOCK -> CHECK -> LAUNCH -> BLOCK -> CHECK
+# success on CHECK -> LAUNCH
+# failure on BLOCK -> CHECK
+
+automate METADATA
+  name       STR BIAS
+  check      STR "regtool -processedexp -exp_type BIAS -inst @CAMERA@ -dbname @DBNAME@"
+  ncheck     S32 20
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type BIAS -select_exp_type BIAS -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type BIAS -mode master -dbname @DBNAME@"
+END
+
+automate METADATA
+  name       STR BIAS_VERIFY
+  check      STR "detselect -search -inst @CAMERA@ -det_type BIAS -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type BIAS -select_exp_type BIAS -mode verify -ref_det_id @det_id@ -ref_iter @iteration@ -dbname @DBNAME@" 
+  block      STR "dettool -runs -active -det_type BIAS -mode verify -dbname @DBNAME@"
+END
+ 
+automate METADATA
+  name       STR DARK
+  check      STR "detselect -search -inst @CAMERA@ -det_type BIAS -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type DARK -select_exp_type DARK -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type DARK -mode master -dbname @DBNAME@"
+END
+ 
+automate METADATA
+  name       STR DARK_VERIFY
+  check      STR "detselect -search -inst @CAMERA@ -det_type DARK -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type DARK -select_exp_type DARK -mode verify -ref_det_id @det_id@ -ref_iter @iteration@ -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type DARK -mode verify -dbname @DBNAME@"
+END
+
+automate METADATA
+  name       STR SHUTTER
+  check      STR "detselect -search -inst @CAMERA@ -det_type DARK -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type SHUTTER -filter r -select_exp_type FLAT -select_filter r -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type SHUTTER -mode master -dbname @DBNAME@"
+END
+
+automate METADATA
+  name       STR SHUTTER_VERIFY
+  check      STR "detselect -search -inst @CAMERA@ -det_type SHUTTER -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type SHUTTER -filter r -select_exp_type FLAT -select_filter r -mode verify -ref_det_id @det_id@ -ref_iter @iteration@ -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type FLAT -filter r -mode verify -dbname @DBNAME@"
+END
+
+automate METADATA
+  name       STR FLAT-r
+  check      STR "detselect -search -inst @CAMERA@ -det_type SHUTTER -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type FLAT -filter r -select_exp_type FLAT -select_filter r -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type FLAT -filter r -mode master -dbname @DBNAME@"
+END
+
+automate METADATA
+  name       STR FLAT-i
+  check      STR "detselect -search -inst @CAMERA@ -det_type SHUTTER -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type FLAT -filter i -select_exp_type FLAT -select_filter i -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type FLAT -filter i -mode master -dbname @DBNAME@"
+END
+
+automate METADATA
+  name       STR FLAT_VERIFY-r
+  check      STR "detselect -search -inst @CAMERA@ -det_type FLAT -filter r -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type FLAT -filter r -select_exp_type FLAT -select_filter r -mode verify -ref_det_id @det_id@ -ref_iter @iteration@ -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type FLAT -filter r -mode verify -dbname @DBNAME@"
+END
+
+automate METADATA
+  name       STR FLAT_VERIFY-i
+  check      STR "detselect -search -inst @CAMERA@ -det_type FLAT -filter i -dbname @DBNAME@"
+  launch     STR "dettool -definebyquery -workdir file://@CWD@/detwork -inst @CAMERA@ -det_type FLAT -filter i -select_exp_type FLAT -select_filter i -mode verify -ref_det_id @det_id@ -ref_iter @iteration@ -dbname @DBNAME@"
+  block      STR "dettool -runs -active -det_type FLAT -filter i -mode verify -dbname @DBNAME@"
+END
+
Index: /trunk/ippTasks/simtest.detverify.config
===================================================================
--- /trunk/ippTasks/simtest.detverify.config	(revision 19621)
+++ /trunk/ippTasks/simtest.detverify.config	(revision 19621)
@@ -0,0 +1,37 @@
+
+# define the simulated data to be generated
+SEQUENCE MULTI
+
+SEQUENCE METADATA
+  OBSTYPE    STR BIAS
+  CAMERA     STR SIMTEST
+  NIMAGES    S32  20
+END
+
+SEQUENCE METADATA
+  OBSTYPE    STR DARK
+  CAMERA     STR SIMTEST
+  @EXPTIMES  F32  30.0, 300.0
+  @NIMAGES   S32  10,   10
+END
+
+SEQUENCE METADATA
+  OBSTYPE    STR FLAT
+  CAMERA     STR SIMTEST
+
+  FILTERS    STR r,r,i
+  @EXPTIMES  F32 0.1,20.0,20.0
+
+  NSETUP     S32 5
+END
+
+SEQUENCE METADATA
+  OBSTYPE    STR FLAT
+  CAMERA     STR SIMTEST
+
+  FILTERS    STR r,r,r,r,r
+  @EXPTIMES  F32 0.5,1.0,2.0,5.0,10.0
+
+  NSETUP     S32 1
+END
+
Index: /trunk/ippTasks/simtest.pro
===================================================================
--- /trunk/ippTasks/simtest.pro	(revision 19620)
+++ /trunk/ippTasks/simtest.pro	(revision 19621)
@@ -40,4 +40,9 @@
     echo "  SIMTEST_AUTO     : define the analysis steps to perform (simtest.auto)"
     echo "  SIMTEST_THREADS  : set the number of threads for the processing node (0)"
+    echo ""
+    echo "the following macros can be used to set up specific simtest suites:"
+    echo "  simtest.setup.basic : run standard simtest suite"
+    echo "  simtest.setup.detverify : run detrend creation and detrend verification"
+    echo "  simtest.setup.flatcorr : run a flat-field correction demonstration"
     break
   end
@@ -109,4 +114,16 @@
 # auto: simtest.basic.auto, simtest.flatcorr.auto
 
+macro simtest.setup.basic
+  $PPSIM_RECIPE = default
+  $SIMTEST_SEQUENCE = simtest.basic.config
+  $SIMTEST_AUTO = simtest.basic.auto
+end
+
+macro simtest.setup.detverify
+  $PPSIM_RECIPE = default
+  $SIMTEST_SEQUENCE = simtest.detverify.config
+  $SIMTEST_AUTO = simtest.detverify.auto
+end
+
 macro simtest.setup.flatcorr
   $PPSIM_RECIPE = FLATCORR
@@ -114,2 +131,3 @@
   $SIMTEST_AUTO = simtest.flatcorr.auto
 end
+
Index: /trunk/ippTools/share/dettool_addprocessedexp.sql
===================================================================
--- /trunk/ippTools/share/dettool_addprocessedexp.sql	(revision 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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 19620)
+++ /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,
