Index: branches/cnb_branch_20081104/ippTools/configure.ac
===================================================================
--- branches/cnb_branch_20081011/ippTools/configure.ac	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/configure.ac	(revision 20530)
@@ -18,5 +18,5 @@
 PKG_CHECK_MODULES([PSLIB], [pslib >= 1.1.0])
 PKG_CHECK_MODULES([PSMODULES], [psmodules >= 1.1.0])
-PKG_CHECK_MODULES([IPPDB], [ippdb >= 1.1.43]) 
+PKG_CHECK_MODULES([IPPDB], [ippdb >= 1.1.46]) 
 
 PXTOOLS_CFLAGS="${PSLIB_CFLAGS=} ${PSMODULES_CFLAGS=} ${IPPDB_CFLAGS=}"
Index: branches/cnb_branch_20081104/ippTools/share/Makefile.am
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/Makefile.am	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/Makefile.am	(revision 20530)
@@ -95,4 +95,6 @@
      flatcorr_pendingprocess.sql \
      flatcorr_inputimfile.sql \
+     flatcorr_dropchip.sql \
+     flatcorr_dropcamera.sql \
      magictool_addmask.sql \
      magictool_create_tmp_warpcomplete.sql \
Index: branches/cnb_branch_20081104/ippTools/share/dettool_stop_completed_correct_runs.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/dettool_stop_completed_correct_runs.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/dettool_stop_completed_correct_runs.sql	(revision 20530)
@@ -1,2 +1,3 @@
+-- det1 is the 'correction' detRun, det2 is the 'parent' detRun 
 UPDATE detRun
 SET state = 'stop'
@@ -8,5 +9,5 @@
     FROM detRun AS det1
     INNER JOIN detRun as det2
-        ON det1.ref_det_run = det2.det_id 
+        ON det1.ref_det_id = det2.det_id 
 	-- do we need to restrict by iteration?  not clear this logic below is right or tested
     JOIN detNormalizedImfile as imfile
Index: branches/cnb_branch_20081104/ippTools/share/difftool_skyfile.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/difftool_skyfile.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/difftool_skyfile.sql	(revision 20530)
@@ -4,22 +4,16 @@
     diffRun.state,
     diffSkyfile.*,
-    rawExp.exp_id,
-    rawExp.camera,
-    warpRun.warp_id
+    (SELECT warp_id FROM diffInputSkyfile WHERE diffInputSkyfile.diff_id = diffRun.diff_id
+        AND diffInputSkyfile.template = 0 ) AS warp_id_temp_0,
+    (SELECT stack_id FROM diffInputSkyfile WHERE diffInputSkyfile.diff_id = diffRun.diff_id
+        AND diffInputSkyfile.template = 0 ) AS stack_id_temp_0,
+    (SELECT warp_id FROM diffInputSkyfile WHERE diffInputSkyfile.diff_id = diffRun.diff_id
+        AND diffInputSkyfile.template = 1 ) AS warp_id_temp_1,
+    (SELECT stack_id FROM diffInputSkyfile WHERE diffInputSkyfile.diff_id = diffRun.diff_id
+        AND diffInputSkyfile.template = 1 ) AS stack_id_temp_1
 FROM diffRun
 JOIN diffSkyfile
     USING(diff_id)
--- WS: my new stuff begins here
 JOIN diffInputSkyfile
     ON diffInputSkyfile.diff_id = diffRun.diff_id
     AND diffInputSkyfile.template = 0
-JOIN warpRun
-    ON diffInputSkyfile.warp_id = warpRun.warp_id
-JOIN fakeRun
-    ON warpRun.fake_id = fakeRun.fake_id
-JOIN camRun
-    ON camRun.cam_id = fakeRun.cam_id
-JOIN chipRun
-    ON camRun.chip_id = chipRun.chip_id
-JOIN rawExp
-    ON chipRun.exp_id = rawExp.exp_id
Index: branches/cnb_branch_20081104/ippTools/share/flatcorr_chiprundone.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/flatcorr_chiprundone.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/flatcorr_chiprundone.sql	(revision 20530)
@@ -12,4 +12,5 @@
 WHERE
     flatcorrRun.state = 'new'
+    AND flatcorrChipLink.include = 1
     AND chipRun.state = 'full'
     AND camRun.cam_id is NULL;
Index: branches/cnb_branch_20081104/ippTools/share/flatcorr_dropcamera.sql
===================================================================
--- branches/cnb_branch_20081104/ippTools/share/flatcorr_dropcamera.sql	(revision 20530)
+++ branches/cnb_branch_20081104/ippTools/share/flatcorr_dropcamera.sql	(revision 20530)
@@ -0,0 +1,5 @@
+
+UPDATE flatcorrCamLink
+  SET include = 0
+WHERE corr_id = %lld 
+  AND cam_id = %lld
Index: branches/cnb_branch_20081104/ippTools/share/flatcorr_dropchip.sql
===================================================================
--- branches/cnb_branch_20081104/ippTools/share/flatcorr_dropchip.sql	(revision 20530)
+++ branches/cnb_branch_20081104/ippTools/share/flatcorr_dropchip.sql	(revision 20530)
@@ -0,0 +1,5 @@
+
+UPDATE flatcorrChipLink
+  SET include = 0
+WHERE corr_id = %lld 
+  AND chip_id = %lld
Index: branches/cnb_branch_20081104/ippTools/share/flatcorr_pendingprocess.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/flatcorr_pendingprocess.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/flatcorr_pendingprocess.sql	(revision 20530)
@@ -1,5 +1,7 @@
 SELECT 
   corr_id,
+  det_type,
   dvodb,
+  camera,
   filter,
   state,
@@ -18,4 +20,5 @@
    JOIN flatcorrChipLink
      ON flatcorrChipLink.corr_id = flatcorrRun.corr_id
+  WHERE flatcorrChipLink.include = 1
    GROUP BY
      flatcorrChipLink.corr_id) AS t1
@@ -28,4 +31,5 @@
        ON flatcorrCamLink.cam_id = camRun.cam_id
    WHERE camRun.state = 'full'
+     AND flatcorrCamLink.include = 1
    GROUP BY
        flatcorrCamLink.corr_id) AS t2
Index: branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/magictool_definebyquery.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery.sql	(revision 20530)
@@ -75,5 +75,5 @@
     WHERE
         warpSkyfile.ignored = 0
-        AND warpRun.state = 'stop'
+        AND warpRun.state = 'full'
     -- INSERT HERE any additional restrictions (e.g., exp_id, warpSkyfile.good_frac)
 -----        AND warpSkyfile.good_frac > 0.5
Index: branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery_select_part1.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/magictool_definebyquery_select_part1.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery_select_part1.sql	(revision 20530)
@@ -11,5 +11,5 @@
         exp_id,
         filter,
-        COUNT(skycell_id) AS num_todo
+        COUNT(DISTINCT skycell_id) AS num_todo
     FROM rawExp
     JOIN chipRun USING(exp_id)
@@ -21,5 +21,5 @@
     WHERE
         warpSkyfile.ignored = 0
-        AND warpRun.state = 'stop'
-    -- INSERT HERE any additional restrictions (e.g., exp_id, warpSkyfile.good_frac)
+    AND warpRun.state = 'full'
+-- INSERT HERE any additional restrictions (e.g., exp_id, warpSkyfile.good_frac)
 -- INSERT HERE magictool_definebyquery_select_part2.sql
Index: branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery_select_test.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/magictool_definebyquery_select_test.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery_select_test.sql	(revision 20530)
@@ -26,5 +26,5 @@
     WHERE
         warpSkyfile.ignored = 0
-        AND warpRun.state = 'stop'
+        AND warpRun.state = 'full'
     -- INSERT HERE any additional restrictions (e.g., exp_id, warpSkyfile.good_frac)
 -- magictool_definebyquery_select_part2.sql
Index: branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery_temp_create.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/magictool_definebyquery_temp_create.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery_temp_create.sql	(revision 20530)
@@ -3,4 +3,5 @@
 skycell_id VARCHAR(64),
 tess_id VARCHAR(64),
+warp_id BIGINT,
 diff_id BIGINT,
 PRIMARY KEY(exp_id, skycell_id, tess_id)
Index: branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery_temp_insert.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/magictool_definebyquery_temp_insert.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/magictool_definebyquery_temp_insert.sql	(revision 20530)
@@ -5,4 +5,5 @@
     warpSkyfile.skycell_id,
     warpSkyfile.tess_id,
+    warpRun.warp_id AS warp_id,
     MAX(diffSkyfile.diff_id) AS diff_id
 FROM rawExp
Index: branches/cnb_branch_20081104/ippTools/share/magictool_totree.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/magictool_totree.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/magictool_totree.sql	(revision 20530)
@@ -3,5 +3,5 @@
     exp_id,
     camera,
-    workdir,
+    magicRun.workdir,
     ra,
     decl,
Index: branches/cnb_branch_20081104/ippTools/share/pxadmin_create_tables.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/pxadmin_create_tables.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/pxadmin_create_tables.sql	(revision 20530)
@@ -59,4 +59,5 @@
     fault SMALLINT NOT NULL,
     epoch TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    hostname VARCHAR(64),
     PRIMARY KEY(exp_name, camera, telescope, class, class_id),
     KEY(fault),
@@ -117,4 +118,6 @@
     filter VARCHAR(64),
     comment VARCHAR(80),
+    obs_mode VARCHAR(64),
+    obs_group VARCHAR(64),
     airmass FLOAT,
     ra DOUBLE,
@@ -185,4 +188,6 @@
     filter VARCHAR(64),
     comment VARCHAR(80),
+    obs_mode VARCHAR(64),
+    obs_group VARCHAR(64),
     airmass FLOAT,
     ra DOUBLE,
@@ -283,5 +288,13 @@
     ap_resid_stdev FLOAT,
     fwhm_major FLOAT,
+    fwhm_major_lq FLOAT,
+    fwhm_major_uq FLOAT,
     fwhm_minor FLOAT,
+    fwhm_minor_lq FLOAT,
+    fwhm_minor_uq FLOAT,
+    iq_fwhm_major FLOAT,
+    iq_fwhm_major_err FLOAT,
+    iq_fwhm_minor FLOAT,
+    iq_fwhm_minor_err FLOAT,
     iq_m2 FLOAT,
     iq_m2_err FLOAT,
@@ -370,8 +383,18 @@
     ap_resid FLOAT,
     ap_resid_stdev FLOAT,
-    zp_mean FLOAT,
-    zp_stdev FLOAT,
+    zpt_obs FLOAT,
+    zpt_stdev FLOAT,
+    zpt_lq FLOAT,
+    zpt_uq FLOAT,
     fwhm_major FLOAT,
+    fwhm_major_lq FLOAT,
+    fwhm_major_uq FLOAT,
     fwhm_minor FLOAT,
+    fwhm_minor_lq FLOAT,
+    fwhm_minor_uq FLOAT,
+    iq_fwhm_major FLOAT,
+    iq_fwhm_major_err FLOAT,
+    iq_fwhm_minor FLOAT,
+    iq_fwhm_minor_err FLOAT,
     iq_m2 FLOAT,
     iq_m2_err FLOAT,
@@ -1056,5 +1079,9 @@
 CREATE TABLE flatcorrRun (
         corr_id BIGINT AUTO_INCREMENT,
+        det_type VARCHAR(64),
         dvodb VARCHAR(64),
+    	camera VARCHAR(64),
+    	telescope VARCHAR(64),
+	epoch TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
         filter VARCHAR(64),
         state VARCHAR(64),
@@ -1073,4 +1100,5 @@
         corr_id BIGINT,
         chip_id BIGINT,
+	include TINYINT,
         PRIMARY KEY(corr_id, chip_id),
         FOREIGN KEY (corr_id)  REFERENCES  flatcorrRun(corr_id),
@@ -1082,4 +1110,5 @@
         chip_id BIGINT,
         cam_id BIGINT,
+	include TINYINT,
         PRIMARY KEY(corr_id, cam_id),
         FOREIGN KEY (corr_id)  REFERENCES  flatcorrRun(corr_id),
Index: branches/cnb_branch_20081104/ippTools/share/regtool_pendingexp.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/regtool_pendingexp.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/regtool_pendingexp.sql	(revision 20530)
@@ -1,3 +1,2 @@
--- output should match the format of newExp
 SELECT DISTINCT
     exp_id,
@@ -13,10 +12,20 @@
     end_stage,
     label,
-    epoch
+    camera,
+    filter,
+    obs_mode,
+    obs_group,
+    epoch,
+    dateobs
 FROM
     (SELECT
        newExp.*,
        newImfile.tmp_class_id,
-       rawImfile.tmp_class_id as raw_tmp_class_id
+       rawImfile.tmp_class_id as raw_tmp_class_id,
+       rawImfile.camera,
+       rawImfile.filter,
+       rawImfile.dateobs,
+       rawImfile.obs_mode,
+       rawImfile.obs_group
     FROM newExp
     JOIN newImfile
Index: branches/cnb_branch_20081104/ippTools/share/stacktool_sumskyfile.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/stacktool_sumskyfile.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/stacktool_sumskyfile.sql	(revision 20530)
@@ -2,18 +2,14 @@
     stackSumSkyfile.*,
     stackRun.state,
-    rawExp.camera
+    (SELECT rawExp.camera FROM 
+        stackInputSkyfile 
+        JOIN warpRun USING(warp_id)
+        JOIN fakeRun ON warpRun.fake_id = fakeRun.fake_id
+        JOIN camRun ON camRun.cam_id = fakeRun.cam_id
+        JOIN chipRun ON camRun.chip_id  = chipRun.chip_id
+        JOIN rawExp ON chipRun.exp_id  = rawExp.exp_id
+        where stack_id = stackRun.stack_id limit 1
+    ) as camera
 FROM stackRun
 JOIN stackSumSkyfile
-    USING(stack_id)
-JOIN stackInputSkyfile
-    USING(stack_id)
-JOIN warpRun
-    USING(warp_id)
-JOIN fakeRun
-    ON warpRun.fake_id = fakeRun.fake_id
-JOIN camRun
-    ON camRun.cam_id   = fakeRun.cam_id
-JOIN chipRun
-    ON camRun.chip_id  = chipRun.chip_id
-JOIN rawExp
-    ON chipRun.exp_id  = rawExp.exp_id
+USING(stack_id)
Index: branches/cnb_branch_20081104/ippTools/share/warptool_warped.sql
===================================================================
--- branches/cnb_branch_20081011/ippTools/share/warptool_warped.sql	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/share/warptool_warped.sql	(revision 20530)
@@ -3,4 +3,5 @@
     warpRun.state,
     rawExp.exp_id,
+    rawExp.exp_name,
     rawExp.camera
 FROM warpRun
Index: branches/cnb_branch_20081104/ippTools/src/camtool.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/camtool.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/camtool.c	(revision 20530)
@@ -403,8 +403,22 @@
     PXOPT_LOOKUP_F32(ap_resid, config->args,       "-ap_resid", false, false);
     PXOPT_LOOKUP_F32(ap_resid_stdev, config->args, "-ap_resid_stdev", false, false);
-    PXOPT_LOOKUP_F32(zp_mean, config->args, "-zp_mean", false, false);
-    PXOPT_LOOKUP_F32(zp_stdev, config->args, "-zp_stdev", false, false);
-    PXOPT_LOOKUP_F32(fwhm_major, config->args, "-fwhm_major", false, false);
-    PXOPT_LOOKUP_F32(fwhm_minor, config->args, "-fwhm_minor", false, false);
+
+    PXOPT_LOOKUP_F32(zpt_obs, config->args,       "-zpt_obs", false, false);
+    PXOPT_LOOKUP_F32(zpt_err, config->args,       "-zpt_err", false, false);
+    PXOPT_LOOKUP_F32(zpt_uq,  config->args,       "-zpt_uq", false, false);
+    PXOPT_LOOKUP_F32(zpt_lq,  config->args,       "-zpt_lq", false, false);
+
+    PXOPT_LOOKUP_F32(fwhm_major, config->args,     "-fwhm_major", false, false);
+    PXOPT_LOOKUP_F32(fwhm_major_lq, config->args,     "-fwhm_major_lq", false, false);
+    PXOPT_LOOKUP_F32(fwhm_major_uq, config->args,     "-fwhm_major_uq", false, false);
+
+    PXOPT_LOOKUP_F32(fwhm_minor,    config->args,     "-fwhm_minor", false, false);
+    PXOPT_LOOKUP_F32(fwhm_minor_lq, config->args,     "-fwhm_minor_lq", false, false);
+    PXOPT_LOOKUP_F32(fwhm_minor_uq, config->args,     "-fwhm_minor_uq", false, false);
+
+    PXOPT_LOOKUP_F32(iq_fwhm_major,     config->args,      "-iq_fwhm_major",     false, false);
+    PXOPT_LOOKUP_F32(iq_fwhm_major_err, config->args,      "-iq_fwhm_major_err",     false, false);
+    PXOPT_LOOKUP_F32(iq_fwhm_minor,     config->args,      "-iq_fwhm_minor",     false, false);
+    PXOPT_LOOKUP_F32(iq_fwhm_minor_err, config->args,      "-iq_fwhm_minor_err",     false, false);
 
     PXOPT_LOOKUP_F32(iq_m2,     config->args,      "-iq_m2",     false, false);
@@ -444,4 +458,5 @@
     PXOPT_LOOKUP_S32(n_cr, config->args,           "-n_cr", false, false);
     PXOPT_LOOKUP_S32(n_astrom, config->args,       "-n_astrom", false, false);
+
     PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
@@ -506,8 +521,20 @@
         ap_resid,
         ap_resid_stdev,
-        zp_mean,
-        zp_stdev,
-        fwhm_major,
-        fwhm_minor,
+        zpt_obs,
+        zpt_err,
+        zpt_lq,
+        zpt_uq,
+	fwhm_major,
+	fwhm_major_lq,
+	fwhm_major_uq,
+	fwhm_minor,
+	fwhm_minor_lq,
+	fwhm_minor_uq,
+
+	iq_fwhm_major,
+	iq_fwhm_major_err,
+	iq_fwhm_minor,
+	iq_fwhm_minor_err,
+
         iq_m2,
         iq_m2_err,
Index: branches/cnb_branch_20081104/ippTools/src/camtoolConfig.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/camtoolConfig.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/camtoolConfig.c	(revision 20530)
@@ -110,8 +110,20 @@
     psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-ap_resid",  0,            "define aperture residual", NAN);
     psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-ap_resid_stdev",  0,            "define aperture residual stdev", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zp_mean", 0,            "define zero point mean", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zp_stdev", 0,            "define zero point stdev", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_major", 0,            "define FWHM (major axis; arcsec)", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_minor", 0,            "define FWHM (minor axis; arcsec)", NAN);
+
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zpt_obs", 0,   "define observed zero point", 0);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zpt_err", 0,   "define observed zero point error", 0);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zpt_uq", 0,   "define observed zero point upper quartile", 0);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zpt_lq", 0,   "define observed zero point lower quartile", 0);
+
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_major",  0,            "define fwhm (major axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_major_lq",  0,            "define fwhm (major axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_major_uq",  0,            "define fwhm (major axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_minor",  0,            "define fwhm (minor axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_minor_lq",  0,            "define fwhm (minor axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_minor_uq",  0,            "define fwhm (minor axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-iq_fwhm_major",     0,  "define moment value m2 mean", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-iq_fwhm_major_err",     0,  "define moment value m2 mean", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-iq_fwhm_minor",     0,  "define moment value m2 mean", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-iq_fwhm_minor_err",     0,  "define moment value m2 mean", NAN);
 
     psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-iq_m2",     0,  "define moment value m2 mean", NAN);
@@ -146,4 +158,5 @@
     psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_cr", 0,            "define number of cosmic rays", 0);
     psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_astrom", 0,            "define number of astrometry reference objects", 0);
+
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-path_base", 0,            "define base output location", NULL);
     psMetadataAddS16(addprocessedexpArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
Index: branches/cnb_branch_20081104/ippTools/src/chiptool.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/chiptool.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/chiptool.c	(revision 20530)
@@ -360,6 +360,17 @@
     PXOPT_LOOKUP_F32(ap_resid, config->args,       "-ap_resid", false, false);
     PXOPT_LOOKUP_F32(ap_resid_stdev, config->args, "-ap_resid_stdev", false, false);
+
     PXOPT_LOOKUP_F32(fwhm_major, config->args,     "-fwhm_major", false, false);
-    PXOPT_LOOKUP_F32(fwhm_minor, config->args,     "-fwhm_minor", false, false);
+    PXOPT_LOOKUP_F32(fwhm_major_lq, config->args,     "-fwhm_major_lq", false, false);
+    PXOPT_LOOKUP_F32(fwhm_major_uq, config->args,     "-fwhm_major_uq", false, false);
+
+    PXOPT_LOOKUP_F32(fwhm_minor,    config->args,     "-fwhm_minor", false, false);
+    PXOPT_LOOKUP_F32(fwhm_minor_lq, config->args,     "-fwhm_minor_lq", false, false);
+    PXOPT_LOOKUP_F32(fwhm_minor_uq, config->args,     "-fwhm_minor_uq", false, false);
+
+    PXOPT_LOOKUP_F32(iq_fwhm_major,     config->args,      "-iq_fwhm_major",     false, false);
+    PXOPT_LOOKUP_F32(iq_fwhm_major_err, config->args,      "-iq_fwhm_major_err",     false, false);
+    PXOPT_LOOKUP_F32(iq_fwhm_minor,     config->args,      "-iq_fwhm_minor",     false, false);
+    PXOPT_LOOKUP_F32(iq_fwhm_minor_err, config->args,      "-iq_fwhm_minor_err",     false, false);
 
     PXOPT_LOOKUP_F32(iq_m2,     config->args,      "-iq_m2",     false, false);
@@ -424,6 +435,17 @@
                                    ap_resid,
                                    ap_resid_stdev,
+
                                    fwhm_major,
+                                   fwhm_major_lq,
+                                   fwhm_major_uq,
                                    fwhm_minor,
+                                   fwhm_minor_lq,
+                                   fwhm_minor_uq,
+
+				   iq_fwhm_major,
+				   iq_fwhm_major_err,
+				   iq_fwhm_minor,
+				   iq_fwhm_minor_err,
+
 				   iq_m2,
 				   iq_m2_err,
Index: branches/cnb_branch_20081104/ippTools/src/chiptoolConfig.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/chiptoolConfig.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/chiptoolConfig.c	(revision 20530)
@@ -97,5 +97,15 @@
     psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-ap_resid_stdev",  0,            "define aperture residual stdev", NAN);
     psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-fwhm_major",  0,            "define fwhm (major axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-fwhm_major_lq",  0,            "define fwhm (major axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-fwhm_major_uq",  0,            "define fwhm (major axis; arcsec)", NAN);
+
     psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-fwhm_minor",  0,            "define fwhm (minor axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-fwhm_minor_lq",  0,            "define fwhm (minor axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-fwhm_minor_uq",  0,            "define fwhm (minor axis; arcsec)", NAN);
+
+    psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-iq_fwhm_major",     0,  "define moment value m2 mean", NAN);
+    psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-iq_fwhm_major_err",     0,  "define moment value m2 mean", NAN);
+    psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-iq_fwhm_minor",     0,  "define moment value m2 mean", NAN);
+    psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-iq_fwhm_minor_err",     0,  "define moment value m2 mean", NAN);
 
     psMetadataAddF32(addprocessedimfileArgs, PS_LIST_TAIL, "-iq_m2",     0,  "define moment value m2 mean", NAN);
Index: branches/cnb_branch_20081104/ippTools/src/dettoolConfig.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/dettoolConfig.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/dettoolConfig.c	(revision 20530)
@@ -172,7 +172,12 @@
     // -makecorrection
     psMetadata *makecorrectionArgs = psMetadataAlloc();
+    psMetadataAddStr(makecorrectionArgs, PS_LIST_TAIL, "-det_type",  0,   "set detrend type of corrected detRun", NULL);
     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);
+
+    psMetadataAddStr(makecorrectionArgs, PS_LIST_TAIL, "-workdir",  0,   "set workdir", NULL);
+    psMetadataAddStr(makecorrectionArgs, PS_LIST_TAIL, "-reduction",  0, "set reduction", NULL);
+    psMetadataAddStr(makecorrectionArgs, PS_LIST_TAIL, "-label",  0,     "set label", NULL);
 
     // -tocorrectexp
@@ -184,4 +189,5 @@
     psMetadata *tocorrectimfileArgs = psMetadataAlloc();
     psMetadataAddS64(tocorrectimfileArgs, PS_LIST_TAIL, "-det_id", 0,            "search for detrend ID", 0);
+    psMetadataAddStr(tocorrectimfileArgs, PS_LIST_TAIL, "-det_type",  0,   "search by type of corrected detRun", NULL);
     psMetadataAddU64(tocorrectimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
     psMetadataAddBool(tocorrectimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
Index: branches/cnb_branch_20081104/ippTools/src/dettool_correction.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/dettool_correction.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/dettool_correction.c	(revision 20530)
@@ -26,5 +26,11 @@
     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_STR(det_type, config->args, "-det_type", true, false); // required
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false); // optional
+
+    // optional modifications
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
 
     // build the needed where 
@@ -32,4 +38,6 @@
     psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", ref_det_id);
     psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", ref_iter);
+
+    // select the detRun that matches
     psArray *runs = detRunSelectRowObjects(config->dbh, where, 1);
     psFree (where);
@@ -46,17 +54,21 @@
         return false;
     }
+
+    char *use_workdir   = (workdir)   ? workdir   : detRun->workdir;
+    char *use_reduction = (reduction) ? reduction : detRun->reduction;
+    char *use_label     = (label)     ? label     : detRun->label;
 
     detRunInsert(config->dbh,
          0,             // det_id
          0,             // iteration
-         detRun->det_type,
+         det_type,
          "correction",  // mode
          "run",         // state
          detRun->filelevel,
-         detRun->workdir,
+         use_workdir,
          detRun->camera,
          detRun->telescope,
          detRun->exp_type,
-         detRun->reduction,
+         use_reduction,
          detRun->filter,
          detRun->airmass_min,
@@ -75,9 +87,8 @@
          detRun->solang_min,
          detRun->solang_max,
-         detRun->label,
+         use_label,
 	 detRun->det_id, // ref_det_id
 	 detRun->iteration // ref_iter
     );
-
     psFree(runs);
 
@@ -91,5 +102,5 @@
 
     psMetadata *where_new = psMetadataAlloc();
-    psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", new_det_id);
+    psMetadataAddS64(where_new, PS_LIST_TAIL, "det_id", 0, "==", new_det_id);
     psArray *detRuns = psDBSelectRows(config->dbh, "detRun", where_new, 0);
     psFree(where_new);
@@ -116,16 +127,28 @@
 }
 
-bool tocorrectexpMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
+bool tocorrectimfileMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-det_type", "det_type", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    psString query = pxDataGet("dettool_tocorrectexp.sql");
+    psString query = pxDataGet("dettool_tocorrectimfile.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
         return false;
     }
+
+    if (psListLength(where->list)) {
+	// NOTE the SQL uses an intermediate table 'det1' for this query
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "det1"); 
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree (where);
 
     // treat limit == 0 as "no limit"
@@ -155,5 +178,5 @@
 
     // negative simple so the default is true
-    if (!ippdbPrintMetadatas(stdout, output, "detRun", !simple)) {
+    if (!ippdbPrintMetadatas(stdout, output, "detPendingCorrectImfile", !simple)) {
         psError(PS_ERR_UNKNOWN, false, "failed to print array");
         psFree(output);
@@ -166,27 +189,16 @@
 }
 
-bool tocorrectimfileMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psMetadata *where = psMetadataAlloc();
-    PXOPT_COPY_STR(config->args, where, "-det_type", "det_type", "==");
+bool tocorrectexpMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    psString query = pxDataGet("dettool_tocorrectimfile.sql");
+    psString query = pxDataGet("dettool_tocorrectexp.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
         return false;
     }
-
-    if (psListLength(where->list)) {
-	// NOTE the SQL uses an intermediate table 'det1' for this query
-        psString whereClause = psDBGenerateWhereConditionSQL(where, "det1"); 
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-    psFree (where);
 
     // treat limit == 0 as "no limit"
@@ -216,5 +228,5 @@
 
     // negative simple so the default is true
-    if (!ippdbPrintMetadatas(stdout, output, "detPendingCorrectImfile", !simple)) {
+    if (!ippdbPrintMetadatas(stdout, output, "detRun", !simple)) {
         psError(PS_ERR_UNKNOWN, false, "failed to print array");
         psFree(output);
Index: branches/cnb_branch_20081104/ippTools/src/flatcorr.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/flatcorr.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/flatcorr.c	(revision 20530)
@@ -39,4 +39,6 @@
 static bool addchipMode(pxConfig *config);
 static bool addcameraMode(pxConfig *config);
+static bool dropchipMode(pxConfig *config);
+static bool dropcameraMode(pxConfig *config);
 static bool pendingprocessMode(pxConfig *config);
 static bool addprocessMode(pxConfig *config);
@@ -69,4 +71,6 @@
         MODECASE(FLATCORR_MODE_ADDCHIP,        addchipMode);
         MODECASE(FLATCORR_MODE_ADDCAMERA,      addcameraMode);
+        MODECASE(FLATCORR_MODE_DROPCHIP,       dropchipMode);
+        MODECASE(FLATCORR_MODE_DROPCAMERA,     dropcameraMode);
         MODECASE(FLATCORR_MODE_PENDINGPROCESS, pendingprocessMode);
         MODECASE(FLATCORR_MODE_ADDPROCESS,     addprocessMode);
@@ -109,4 +113,10 @@
     }
 
+    // require the camera to be defined: this analysis does not make sense 
+    // across multiple cameras
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false);
+
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
     PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
     PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
@@ -117,5 +127,4 @@
     PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
     PXOPT_LOOKUP_STR(region, config->args, "-set_region", false, false);
-    // XXX probably should make the region in -set_region match ra_min, ra_max, etc
 
     PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
@@ -180,5 +189,9 @@
 	    config->dbh,
             0,      // corr_id
+	    det_type,
             dvodb,
+	    camera,
+	    telescope,
+	    NULL,
             filter,
             "reg",  // state
@@ -227,6 +240,6 @@
         }
 
-        // add a flatcorrChipLink to the flatcorr Run we just created
-        if (!flatcorrChipLinkInsert(config->dbh, corr_id, chip_id)) {
+        // add a flatcorrChipLink to the flatcorr Run we just created (initial state has include = TRUE)
+        if (!flatcorrChipLinkInsert(config->dbh, corr_id, chip_id, 1)) {
             if (!psDBRollback(config->dbh)) {
                 psError(PS_ERR_UNKNOWN, false, "database error");
@@ -260,4 +273,10 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    // require the camera to be defined: this analysis does not make sense across multiple
+    // cameras
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false);
+
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
     PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
     PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
@@ -282,5 +301,9 @@
     flatcorrRunRow *row = flatcorrRunRowAlloc(
 	0,      // corr_id
+	det_type,
 	dvodb,
+	camera,
+	telescope,
+	NULL,
 	filter,
 	"reg",  // state
@@ -318,6 +341,31 @@
     PXOPT_LOOKUP_S64(chip_id, config->args, "-chip_id", true, false);
 
-    if (!flatcorrChipLinkInsert(config->dbh, corr_id, chip_id)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
+    // add a flatcorrChipLink (initial state has include = TRUE)
+    if (!flatcorrChipLinkInsert(config->dbh, corr_id, chip_id, 1)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
+}
+
+static bool dropchipMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_S64(corr_id, config->args, "-corr_id", true, false);
+    PXOPT_LOOKUP_S64(chip_id, config->args, "-chip_id", true, false);
+
+    // UPDATE flatcorrChipLink set include = 0 where corr_id = %lld AND chip_id = %lld
+    psString query = pxDataGet("flatcorr_dropchip.sql");
+    if (!query) {
+	psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query, (long long) corr_id, (long long) chip_id)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
         return false;
     }
@@ -429,6 +477,6 @@
 	psS64 cam_id = psDBLastInsertID(config->dbh);
 
-	// add the camRun entry to the flatcorrCamLink table:
-        if (!flatcorrCamLinkInsert(config->dbh, corr_id, row->chip_id, cam_id)) {
+	// add the camRun entry to the flatcorrCamLink table (include is TRUE)
+        if (!flatcorrCamLinkInsert(config->dbh, corr_id, row->chip_id, cam_id, 1)) {
             if (!psDBRollback(config->dbh)) {
                 psError(PS_ERR_UNKNOWN, false, "database error");
@@ -448,4 +496,28 @@
 
     return false;
+}
+
+static bool dropcameraMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_S64(corr_id, config->args, "-corr_id", true, false);
+    PXOPT_LOOKUP_S64(cam_id, config->args, "-cam_id", true, false);
+
+    // UPDATE flatcorrCamLink set include = 0 where corr_id = %lld AND cam_id = %lld
+    psString query = pxDataGet("flatcorr_dropcamera.sql");
+    if (!query) {
+	psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query, (long long) corr_id, (long long) cam_id)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+
+    return true;
 }
 
Index: branches/cnb_branch_20081104/ippTools/src/flatcorr.h
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/flatcorr.h	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/flatcorr.h	(revision 20530)
@@ -29,4 +29,6 @@
     FLATCORR_MODE_ADDCHIP,
     FLATCORR_MODE_ADDCAMERA,
+    FLATCORR_MODE_DROPCHIP,
+    FLATCORR_MODE_DROPCAMERA,
     FLATCORR_MODE_PENDINGPROCESS,
     FLATCORR_MODE_ADDPROCESS,
Index: branches/cnb_branch_20081104/ippTools/src/flatcorrConfig.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/flatcorrConfig.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/flatcorrConfig.c	(revision 20530)
@@ -50,4 +50,5 @@
     pxchipSetSearchArgs (definebyqueryArgs);
 
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-det_type",     0,            "define detrend type to be generated", NULL);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_workdir",  0,            "define workdir", NULL);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_label",    0,            "define label", NULL);
@@ -64,4 +65,5 @@
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-det_type",     0,            "define detrend type to be generated", NULL);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_workdir",  0,            "define workdir", NULL);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_label",  0,            "define label", NULL);
@@ -79,4 +81,9 @@
     psMetadataAddS64(addchipArgs, PS_LIST_TAIL, "-chip_id", 0,            "define Chip ID (required)", 0);
 
+    // -dropchip
+    psMetadata *dropchipArgs = psMetadataAlloc();
+    psMetadataAddS64(dropchipArgs, PS_LIST_TAIL, "-corr_id", 0,            "define Flat Correction ID (required)", 0);
+    psMetadataAddS64(dropchipArgs, PS_LIST_TAIL, "-chip_id", 0,            "define Chip ID (required)", 0);
+
     // -addcamera
     psMetadata *addcameraArgs = psMetadataAlloc();
@@ -84,4 +91,9 @@
     psMetadataAddBool(addcameraArgs, PS_LIST_TAIL, "-simple",  0, "use the simple output format", false);
     psMetadataAddBool(addcameraArgs, PS_LIST_TAIL, "-pretend", 0, "use the simple output format", false);
+
+    // -dropcamera
+    psMetadata *dropcameraArgs = psMetadataAlloc();
+    psMetadataAddS64(dropcameraArgs, PS_LIST_TAIL, "-corr_id", 0,      "define Flat Correction ID (required)", 0);
+    psMetadataAddS64(dropcameraArgs, PS_LIST_TAIL, "-cam_id", 0,       "define Camera ID (required)", 0);
 
     // -pendingprocess
@@ -122,4 +134,6 @@
     PXOPT_ADD_MODE("-addchip",        "add a chip to a flat correction run",               FLATCORR_MODE_ADDCHIP,        addchipArgs);
     PXOPT_ADD_MODE("-addcamera",      "migrate completed chips to camera stage analysis",  FLATCORR_MODE_ADDCAMERA,      addcameraArgs);
+    PXOPT_ADD_MODE("-dropchip",       "drop a chip from a flat correction run",            FLATCORR_MODE_DROPCHIP,       dropchipArgs);
+    PXOPT_ADD_MODE("-dropcamera",     "drop an exposure (camera stage analysis)",          FLATCORR_MODE_DROPCAMERA,     dropcameraArgs);
     PXOPT_ADD_MODE("-pendingprocess", "show flat correction runs needing to be processed", FLATCORR_MODE_PENDINGPROCESS, pendingprocessArgs);
     PXOPT_ADD_MODE("-addprocess",     "report completed flat correction analysis",         FLATCORR_MODE_ADDPROCESS,     addprocessArgs);
Index: branches/cnb_branch_20081104/ippTools/src/pstamptool.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/pstamptool.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/pstamptool.c	(revision 20530)
@@ -320,8 +320,5 @@
 
     psString query = NULL;
-    psStringAppend(&query, 
-		   "SELECT * FROM pstampRequest WHERE state = 'run' AND "
-		   "(SELECT count(*) FROM pstampJob WHERE pstampJob.req_id = pstampRequest.req_id "
-		   " AND pstampJob.state != 'stop') = 0" );
+    psStringAppend(&query, "SELECT * from pstampRequest WHERE req_id = %" PRId64, req_id);
     
     // treat limit == 0 as "no limit"
Index: branches/cnb_branch_20081104/ippTools/src/pstamptoolConfig.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/pstamptoolConfig.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/pstamptoolConfig.c	(revision 20530)
@@ -75,5 +75,5 @@
     // -listreq
     psMetadata *listreqArgs = psMetadataAlloc();
-    psMetadataAddS64(listreqArgs, PS_LIST_TAIL, "-req_id", 0,            "define req_id", 0); 
+    psMetadataAddS64(listreqArgs, PS_LIST_TAIL, "-req_id", 0,            "define req_id (required)", 0); 
     psMetadataAddU64(listreqArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
     psMetadataAddBool(listreqArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
Index: branches/cnb_branch_20081104/ippTools/src/pxtools.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/pxtools.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/pxtools.c	(revision 20530)
@@ -32,15 +32,15 @@
     // XXX replace strncmp with strcmp
 
-    if (!((strncmp(state, "new", 4) == 0)
-    || (strncmp(state, "reg", 3) == 0)
-    || (strncmp(state, "full", 5) == 0)
-    || (strncmp(state, "goto_cleaned", 8) == 0)
-    || (strncmp(state, "cleaned", 8) == 0)
-    || (strncmp(state, "update", 7) == 0)
-    || (strncmp(state, "purged", 7) == 0)
-    || (strncmp(state, "goto_purged", 12) == 0))) {
-        return false;
-    }
+    if (!strcmp(state, "new")) return true;
+    if (!strcmp(state, "reg")) return true;
+    if (!strcmp(state, "full")) return true;
+    if (!strcmp(state, "drop")) return true;
+    if (!strcmp(state, "wait")) return true;
+    if (!strcmp(state, "goto_cleaned")) return true;
+    if (!strcmp(state, "cleaned")) return true;
+    if (!strcmp(state, "update")) return true;
+    if (!strcmp(state, "purged")) return true;
+    if (!strcmp(state, "goto_purged")) return true;
 
-    return true;
+    return false;
 }
Index: branches/cnb_branch_20081104/ippTools/src/pztool.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/pztool.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/pztool.c	(revision 20530)
@@ -46,5 +46,5 @@
 static bool advanceMode(pxConfig *config);
 
-static bool copydoneCompleteExp(pxConfig *config, const char *exp_name, const char *camera, const char *telescope);
+static bool copydoneCompleteExp(pxConfig *config);
 static psArray *pzGetPendingCameras(pxConfig *config);
 static psArray *pzArrayZip(psArray *arraySet, psS64 limit);
@@ -397,4 +397,6 @@
     PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
     PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+    PXOPT_LOOKUP_STR(hostname, config->args, "-hostname", false, false);
+    PXOPT_LOOKUP_BOOL(row_lock, config->args, "-row_lock", false);
 
     // default values
@@ -402,4 +404,47 @@
 
     // NOTE : the rest of the command-line args are parsed in copydoneCompleteExp
+
+    // start a transaction early so it will contain any row level locks
+    if (!psDBTransaction(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+    
+    // query to get an excluse lock on this exposure in
+    // pzDownloadExp
+    psString lock_query = NULL;
+    if (row_lock) {
+        lock_query = psStringCopy("SELECT * FROM pzDownloadExp");
+
+        psMetadata *where = psMetadataAlloc();
+        PXOPT_COPY_STR(config->args, where,  "-exp_name", "exp_name", "==");
+        PXOPT_COPY_STR(config->args, where,  "-inst", "camera", "==");
+        PXOPT_COPY_STR(config->args, where,  "-telescope", "telescope", "==");
+        
+        if (psListLength(where->list)) {
+            psString whereClause = psDBGenerateWhereSQL(where, NULL);
+            psStringAppend(&lock_query, " %s FOR UPDATE", whereClause);
+            psFree(whereClause);
+        }
+        psFree(where);
+
+        // aquire a lock on the pzDownloadExp record
+        // lock persists until the transaction is committed
+        if (!p_psDBRunQuery(config->dbh, lock_query)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            psFree(lock_query);
+            return false;
+        }
+        psFree(lock_query);
+
+        // we must fetch the result set from aquiring the row level lock or
+        // MySQL will barf all over us.
+        psArray *output = p_psDBFetchResult(config->dbh);
+        if (!output) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            return false;
+        }
+        psFree(output);
+    }
 
     if (!pzDownloadImfileInsert(config->dbh,
@@ -411,5 +456,6 @@
             uri,
             code,
-            NULL    // epoch
+            NULL,    // epoch
+            hostname
     )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -417,11 +463,5 @@
     }
 
-    // start a transaction so it's all rows or nothing
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    if (!copydoneCompleteExp(config, exp_name, camera, telescope)) {
+    if (!copydoneCompleteExp(config)) {
         // rollback
         if (!psDBRollback(config->dbh)) {
@@ -445,5 +485,5 @@
 }
 
-static bool copydoneCompleteExp(pxConfig *config, const char *exp_name, const char *camera, const char *telescope)
+static bool copydoneCompleteExp(pxConfig *config)
 {
     // THIS FUNCTION MUST BE INVOKED FROM INSIDE A TRANSACTION!!!
@@ -471,30 +511,8 @@
     }
 
-    // XXX this is a bit ugly : could just use the PXOPT_COPY_* methods 
-    // and not pass exp_name, camera, or telescope as additional args
     psMetadata *where = psMetadataAlloc();
-    if (exp_name) {
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_name", 0, "==", exp_name)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
-            psFree(where);
-            return false;
-        }
-    }
-
-    if (camera) {
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "camera", 0, "==", camera)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
-            psFree(where);
-            return false;
-        }
-    }
-
-    if (telescope) {
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "telescope", 0, "==", telescope)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
-            psFree(where);
-            return false;
-        }
-    }
+    PXOPT_COPY_STR(config->args, where,  "-exp_name", "exp_name", "==");
+    PXOPT_COPY_STR(config->args, where,  "-inst", "camera", "==");
+    PXOPT_COPY_STR(config->args, where,  "-telescope", "telescope", "==");
 
     if (psListLength(where->list)) {
@@ -505,4 +523,5 @@
     psFree(where);
 
+    // find completed exps
     if (!p_psDBRunQuery(config->dbh, query)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -855,5 +874,5 @@
     }
 
-    if (!copydoneCompleteExp(config, NULL, NULL, NULL)) {
+    if (!copydoneCompleteExp(config)) {
         // rollback
         if (!psDBRollback(config->dbh)) {
Index: branches/cnb_branch_20081104/ippTools/src/pztoolConfig.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/pztoolConfig.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/pztoolConfig.c	(revision 20530)
@@ -94,5 +94,7 @@
     psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-end_stage",  0,        "define the end goal processing step", NULL);
     psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-label",  0,        "define the label for the chip stage", NULL);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-hostname",  0,     "define the host that copied the image", NULL);
     psMetadataAddS16(copydoneArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddBool(copydoneArgs, PS_LIST_TAIL, "-row_lock", 0,     "lock pzDownImfile rows while advancing an exposure", false);
 
     // -copied
Index: branches/cnb_branch_20081104/ippTools/src/regtool.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/regtool.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/regtool.c	(revision 20530)
@@ -183,4 +183,6 @@
     PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
     PXOPT_LOOKUP_STR(comment, config->args, "-comment", false, false);
+    PXOPT_LOOKUP_STR(obs_mode, config->args, "-obs_mode", false, false);
+    PXOPT_LOOKUP_STR(obs_group, config->args, "-obs_group", false, false);
 
     PXOPT_LOOKUP_F32(airmass, config->args, "-airmass", false, false);
@@ -247,4 +249,6 @@
         filter,
         comment,
+        obs_mode,
+        obs_group,
         airmass,
         ra,
@@ -544,4 +548,6 @@
     PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
     PXOPT_LOOKUP_STR(comment, config->args, "-comment", false, false);
+    PXOPT_LOOKUP_STR(obs_mode, config->args, "-obs_mode", false, false);
+    PXOPT_LOOKUP_STR(obs_group, config->args, "-obs_group", false, false);
     PXOPT_LOOKUP_F32(airmass, config->args, "-airmass", false, false);
     PXOPT_LOOKUP_F64(ra, config->args, "-ra", false, false);
@@ -703,4 +709,6 @@
         filter,
         comment,
+        obs_mode,
+        obs_group,
         airmass,
         ra,
Index: branches/cnb_branch_20081104/ippTools/src/regtoolConfig.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/regtoolConfig.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/regtoolConfig.c	(revision 20530)
@@ -71,4 +71,6 @@
     ADD_OPT(Str,  addprocessedimfileArgs, "-filter",         "define filter ",                 NULL);
     ADD_OPT(Str,  addprocessedimfileArgs, "-comment",        "define comment ",             NULL);
+    ADD_OPT(Str,  addprocessedimfileArgs, "-obs_mode",       "define observing mode (data usage goal)",             NULL);
+    ADD_OPT(Str,  addprocessedimfileArgs, "-obs_group",      "define observing group (set of associated observations)",             NULL);
 
     ADD_OPT(F32,  addprocessedimfileArgs, "-airmass",        "define airmass",                 NAN);
@@ -169,4 +171,7 @@
     ADD_OPT(Str,  addprocessedexpArgs, "-filter",           "define filter ", NULL);
     ADD_OPT(Str,  addprocessedexpArgs, "-comment",          "define comment ", NULL);
+    ADD_OPT(Str,  addprocessedexpArgs, "-obs_mode",         "define observing mode (data usage goal)",             NULL);
+    ADD_OPT(Str,  addprocessedexpArgs, "-obs_group",        "define observing group (set of associated observations)",             NULL);
+
     ADD_OPT(F32,  addprocessedexpArgs, "-airmass",          "define airmass", NAN);
     ADD_OPT(F64,  addprocessedexpArgs, "-ra",               "define RA", NAN);
Index: branches/cnb_branch_20081104/ippTools/src/warptool.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/warptool.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/warptool.c	(revision 20530)
@@ -749,4 +749,5 @@
     PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
     PXOPT_COPY_STR(config->args, where, "-tess_id", "tess_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
@@ -910,5 +911,5 @@
     PXOPT_LOOKUP_STR(hostname, config->args, "-hostname", false, false);
     PXOPT_LOOKUP_F32(good_frac, config->args, "-good_frac", false, false);
-    PXOPT_LOOKUP_BOOL(ignore, config->args, "-ignore", false);
+    PXOPT_LOOKUP_BOOL(accept, config->args, "-accept", false);
 
     // default values
@@ -940,5 +941,5 @@
                            ymin,
                            ymax,
-                           ignore,
+                           !accept,
                            code
         )) {
Index: branches/cnb_branch_20081104/ippTools/src/warptoolConfig.c
===================================================================
--- branches/cnb_branch_20081011/ippTools/src/warptoolConfig.c	(revision 20067)
+++ branches/cnb_branch_20081104/ippTools/src/warptoolConfig.c	(revision 20530)
@@ -208,4 +208,5 @@
     psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-skycell_id", 0,            "search by skycell ID", NULL);
     psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-tess_id", 0,            "search by tess ID", NULL);
+    psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-class_id", 0,            "search by class ID", NULL);
     psMetadataAddU64(scmapArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
     psMetadataAddBool(scmapArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
@@ -235,5 +236,5 @@
     psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-hostname", 0,            "define hostname", 0);
     psMetadataAddF32(addwarpedArgs, PS_LIST_TAIL, "-good_frac",  0,            "define %% of good pixels", NAN);
-    psMetadataAddBool(addwarpedArgs, PS_LIST_TAIL, "-ignore",  0,            "define if this skycell should be ignored", false);
+    psMetadataAddBool(addwarpedArgs, PS_LIST_TAIL, "-accept",  0, "define if this skycell should be accepted", false);
     psMetadataAddS16(addwarpedArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
 
