Index: trunk/ippTools/src/chiptool.c
===================================================================
--- trunk/ippTools/src/chiptool.c	(revision 14214)
+++ trunk/ippTools/src/chiptool.c	(revision 16170)
@@ -93,59 +93,15 @@
 }
 
-#define ADDRENAMEPARAMSTR(from, to, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    psString str = psMetadataLookupStr(&status, from, "-" oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
-        return false; \
-    } \
-    if (str) { \
-        if (!psMetadataAddStr(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, str)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-            psFree(to); \
-            return false; \
-        } \
-    } \
-}
-
-#define ADDPARAMSTR(from, to, name) \
-  ADDRENAMEPARAMSTR(from, to, name, name, "==")
-
-#define ADDRENAMEPARAMF(from, to, type, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    ps##type var = psMetadataLookup##type(&status, from, "-" oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
-        return false; \
-    } \
-    if (!isnan(var)) { \
-        if (!psMetadataAdd##type(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, var)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-            psFree(to); \
-            return false; \
-        } \
-    } \
-}
-
-#define ADDPARAMF(from, to, type, name) \
-  ADDRENAMEPARAMF(from, to, type, name, name, "==")
 
 static bool queueMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, NULL);
+
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
 
     psMetadata *where = psMetadataAlloc();
     // convert exp_id into a psS64
-{
-    bool status = false;
-    psString var = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (var) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(var))) {
+    if (exp_id) {
+        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
             psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
             psFree(where);
@@ -153,42 +109,42 @@
         }
     }
-}
-    ADDPARAMSTR(config->args, where, "exp_name");
-    ADDRENAMEPARAMSTR(config->args, where, "inst", "camera", "==");
-    ADDPARAMSTR(config->args, where, "telescope");
-    ADDPARAMSTR(config->args, where, "dateobs_begin");
-    ADDPARAMSTR(config->args, where, "dateobs_end");
-    ADDPARAMSTR(config->args, where, "exp_tag");
-    ADDPARAMSTR(config->args, where, "exp_type");
-    ADDPARAMSTR(config->args, where, "filelevel");
-    ADDPARAMSTR(config->args, where, "reduction");
-    ADDPARAMSTR(config->args, where, "filter");
-    ADDRENAMEPARAMF(config->args, where, F64, "airmass_min", "airmass", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "airmass_max", "airmass", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "ra_min", "ra", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "ra_max", "ra", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "decl_min", "decl", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "decl_max", "decl", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "exp_time_min", "exp_time", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "exp_time_max", "exp_time", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "sat_pixel_frac_min", "sat_pixel_frac", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "sat_pixel_frac_max", "sat_pixel_frac", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_min", "bt", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_max", "bt", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_stdev_min", "bg_stdev", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_stdev_max", "bg_stdev", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_mean_stdev_min", "bg_mean_stdev", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_mean_stdev_max", "bg_mean_stdev", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "alt_min", "alt", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "alt_max", "alt", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "az_min", "az", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "az_max", "az", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "ccd_temp_min", "ccd_temp", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "ccd_temp_max", "ccd_temp", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "posang_min", "posang", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "posang_max", "posang", "<");
-    ADDPARAMSTR(config->args, where, "object");
-    ADDRENAMEPARAMF(config->args, where, F32, "solang_min", "solang", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "solang_max", "solang", "<");
+
+    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", "==");
+    PXOPT_COPY_STR(config->args, where, "-dateobs_begin", "dateobs", ">=");
+    PXOPT_COPY_STR(config->args, where, "-dateobs_end", "dateobs", "<=");
+    PXOPT_COPY_STR(config->args, where, "-exp_tag", "exp_tag", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_type", "exp_type", "==");
+    PXOPT_COPY_STR(config->args, where, "-filelevel", "filelevel", "==");
+    PXOPT_COPY_STR(config->args, where, "-reduction", "reduction", "==");
+    PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
+    PXOPT_COPY_F64(config->args, where, "-airmass_min", "airmass", ">=");
+    PXOPT_COPY_F64(config->args, where, "-airmass_max", "airmass", "<");
+    PXOPT_COPY_F64(config->args, where, "-ra_min", "ra", ">=");
+    PXOPT_COPY_F64(config->args, where, "-ra_max", "ra", "<");
+    PXOPT_COPY_F64(config->args, where, "-decl_min", "decl", ">=");
+    PXOPT_COPY_F64(config->args, where, "-decl_max", "decl", "<");
+    PXOPT_COPY_F32(config->args, where, "-exp_time_min", "exp_time", ">=");
+    PXOPT_COPY_F32(config->args, where, "-exp_time_max", "exp_time", "<");
+    PXOPT_COPY_F32(config->args, where, "-sat_pixel_frac_min", "sat_pixel_frac", ">=");
+    PXOPT_COPY_F32(config->args, where, "-sat_pixel_frac_max", "sat_pixel_frac", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_min", "bt", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_max", "bt", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_stdev_min", "bg_stdev", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_stdev_max", "bg_stdev", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_mean_stdev_min", "bg_mean_stdev", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_mean_stdev_max", "bg_mean_stdev", "<");
+    PXOPT_COPY_F64(config->args, where, "-alt_min", "alt", ">=");
+    PXOPT_COPY_F64(config->args, where, "-alt_max", "alt", "<");
+    PXOPT_COPY_F64(config->args, where, "-az_min", "az", ">=");
+    PXOPT_COPY_F64(config->args, where, "-az_max", "az", "<");
+    PXOPT_COPY_F32(config->args, where, "-ccd_temp_min", "ccd_temp", ">=");
+    PXOPT_COPY_F32(config->args, where, "-ccd_temp_max", "ccd_temp", "<");
+    PXOPT_COPY_F64(config->args, where, "-posang_min", "posang", ">=");
+    PXOPT_COPY_F64(config->args, where, "-posang_max", "posang", "<");
+    PXOPT_COPY_STR(config->args, where, "-object", "object", "==");
+    PXOPT_COPY_F32(config->args, where, "-solang_min", "solang", ">=");
+    PXOPT_COPY_F32(config->args, where, "-solang_max", "solang", "<");
 
     if (where->list->n < 1) {
@@ -197,34 +153,11 @@
     }
 
-    bool status = false;
-    psString workdir = psMetadataLookupStr(&status, config->args, "-set_workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_workdir");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-set_label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_label");
-        return false;
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-set_reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_reduction");
-        return false;
-    }
-
-    psString expgroup = psMetadataLookupStr(&status, config->args, "-set_expgroup");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_expgroup");
-        return false;
-    }
-
-    psString dvodb = psMetadataLookupStr(&status, config->args, "-set_dvodb");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_dvodb");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
+    PXOPT_LOOKUP_STR(expgroup, config->args, "-set_expgroup", false, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", false, false);
+    PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
+    PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", false, false);
 
     // find the exp_id of all the exposures that we want to queue up.
@@ -272,4 +205,5 @@
         psMetadata *md = output->data[i];
 
+        bool status;
         psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
         if (!status) {
@@ -280,5 +214,5 @@
 
         // queue the exp
-        if (!pxchipQueueByExpTag(config, exp_id, workdir, label, reduction, expgroup, dvodb)) {
+        if (!pxchipQueueByExpTag(config, exp_id, workdir, label, reduction, expgroup, dvodb, tess_id, end_stage)) {
             if (!psDBRollback(config->dbh)) {
                 psError(PS_ERR_UNKNOWN, false, "database error");
@@ -304,10 +238,6 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     // XXX does this need to be constrained so that it won't return any results
@@ -350,14 +280,4 @@
     }
 
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            return false;
-        }
-    }
-
     if (!convertIdToStr(output)) {
         psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
@@ -383,163 +303,33 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
     // chip_id, ext_tag, class_id are required
-    psString chip_id = psMetadataLookupStr(&status, config->args, "-chip_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -chip_id");
-        return false;
-    }
-    if (!chip_id) {
-        psError(PS_ERR_UNKNOWN, true, "-chip_id is required");
-        return false;
-    }
-
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
-        return false;
-    }
-
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return false;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-class_id is required");
-        return false;
-    }
-
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
-
-    psF32 bg = psMetadataLookupF32(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF32 bg_stdev = psMetadataLookupF32(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF32 bg_mean_stdev = psMetadataLookupF32(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    psF32 bias = psMetadataLookupF32(&status, config->args, "-bias");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bias");
-        return false;
-    }
-
-    psF32 bias_stdev = psMetadataLookupF32(&status, config->args, "-bias_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bias_stdev");
-        return false;
-    }
-
-    psF32 fringe_0 = psMetadataLookupF32(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-
-    psF32 fringe_1 = psMetadataLookupF32(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-
-    psF32 fringe_2 = psMetadataLookupF32(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF32 sigma_ra = psMetadataLookupF32(&status, config->args, "-sigma_ra");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sigma_ra");
-        return false;
-    }
-
-    psF32 sigma_dec = psMetadataLookupF32(&status, config->args, "-sigma_dec");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sigma_dec");
-        return false;
-    }
-
-    psF32 ap_resid = psMetadataLookupF32(&status, config->args, "-ap_resid");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ap_resid");
-        return false;
-    }
-
-    psF32 ap_resid_stdev = psMetadataLookupF32(&status, config->args, "-ap_resid_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ap_resid_stdev");
-        return false;
-    }
-
-    psF32 fwhm = psMetadataLookupF32(&status, config->args, "-fwhm");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fwhm");
-        return false;
-    }
-
-    psF32 fwhm_range = psMetadataLookupF32(&status, config->args, "-fwhm_range");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fwhm_range");
-        return false;
-    }
-
-    psS32 n_stars = psMetadataLookupS32(&status, config->args, "-n_stars");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_stars");
-        return false;
-    }
-
-    psS32 n_extended = psMetadataLookupS32(&status, config->args, "-n_extended");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_extended");
-        return false;
-    }
-
-    psS32 n_cr = psMetadataLookupS32(&status, config->args, "-n_cr");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_cr");
-        return false;
-    }
-
-    psS32 n_astrom = psMetadataLookupS32(&status, config->args, "-n_astrom");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_astrom");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", true, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
 
     // optional
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
+    PXOPT_LOOKUP_F32(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F32(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F32(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F32(bias, config->args, "-bias", false, false);
+    PXOPT_LOOKUP_F32(bias_stdev, config->args, "-bias_stdev", false, false);
+    PXOPT_LOOKUP_F32(fringe_0, config->args, "-fringe_0", false, false);
+    PXOPT_LOOKUP_F32(fringe_1, config->args, "-fringe_1", false, false);
+    PXOPT_LOOKUP_F32(fringe_2, config->args, "-fringe_2", false, false);
+    PXOPT_LOOKUP_F32(sigma_ra, config->args, "-sigma_ra", false, false);
+    PXOPT_LOOKUP_F32(sigma_dec, config->args, "-sigma_dec", false, false);
+    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, config->args, "-fwhm", false, false);
+    PXOPT_LOOKUP_F32(fwhm_range, config->args, "-fwhm_range", false, false);
+    PXOPT_LOOKUP_F32(n_stars, config->args, "-n_stars", false, false);
+    PXOPT_LOOKUP_F32(n_extended, config->args, "-n_extended", false, false);
+    PXOPT_LOOKUP_F32(n_cr, config->args, "-n_cr", false, false);
+    PXOPT_LOOKUP_F32(n_astrom, config->args, "-n_astrom", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
 
     // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     if (!psDBTransaction(config->dbh)) {
@@ -548,5 +338,5 @@
     }
 
-    chipProcessedImfileRow *imfile = chipProcessedImfileRowAlloc(
+    if (!chipProcessedImfileInsert(config->dbh,
         (psS64)atoll(chip_id),
         (psS64)atoll(exp_id),
@@ -573,24 +363,12 @@
         path_base,
         code
-    );
-    if (!imfile) {
+    )) {
         // rollback
         if (!psDBRollback(config->dbh)) {
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
-        psError(PS_ERR_UNKNOWN, false, "failed to alloc chipProcessedImfileRow object");
-        return false;
-    }
-    if (!chipProcessedImfileInsertObject(config->dbh, imfile)) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(imfile);
-        return false;
-    }
-
-
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
 
     // XXX I've decided to make the transaction cover the Exp migration as
@@ -621,16 +399,7 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return false;
-    }
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
     // XXX does this need to be constrained so that it won't return any results
@@ -681,14 +450,4 @@
     }
 
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            return false;
-        }
-    }
-
     if (!convertIdToStr(output)) {
         psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
@@ -744,14 +503,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-    if (code == INT16_MAX) {
-        psError(PS_ERR_UNKNOWN, true, "-code is required");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
     if (!pxSetFaultCode(config->dbh, "chipProcessedImfile", config->where, code)) {
@@ -768,14 +518,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-    if (!label) {
-        psError(PS_ERR_UNKNOWN, true, "-label is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(label, config->args, "-label", true, false);
 
     if (!chipMaskInsert(config->dbh, label)) {
@@ -791,4 +532,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = psStringCopy("SELECT * FROM chipMask");
@@ -810,14 +553,4 @@
         psFree(output);
         return true;
-    }
-
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            return false;
-        }
     }
 
@@ -845,14 +578,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-    if (!label) {
-        psError(PS_ERR_UNKNOWN, true, "-label is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(label, config->args, "-label", true, false);
 
     char *query = "DELETE FROM chipMask WHERE label = '%s'";
@@ -860,5 +584,4 @@
     if (!p_psDBRunQuery(config->dbh, query, label)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
         return false;
     }
@@ -909,4 +632,11 @@
             return false;
         }
+
+        // should we stop here or proceed on to the cam stage?
+        if (psStrcasestr(chipRun->end_stage, "chip")) {
+            psFree(chipRun);
+            continue;
+        }
+        // else continue on...
 
         // camQueueChipID() can only be run after chipRun.state has been set to
@@ -918,5 +648,7 @@
                     chipRun->reduction,
                     chipRun->expgroup,
-                    chipRun->dvodb
+                    chipRun->dvodb,
+                    chipRun->tess_id,
+                    chipRun->end_stage
         )) {
             // rollback
