Index: trunk/ippTools/src/dettool.c
===================================================================
--- trunk/ippTools/src/dettool.c	(revision 15866)
+++ trunk/ippTools/src/dettool.c	(revision 16170)
@@ -92,7 +92,4 @@
 static bool register_detrendMode(pxConfig *config);
 
-static detNormalizedStatImfileRow *detStackedToDetNormalizedStatImfile(pxConfig *config, detStackedImfileRow *stackedImfile);
-static  detNormalizedImfileRow *detNormalizedStatToDetNormalizedmfile(pxConfig *config, detNormalizedStatImfileRow *statImfile);
-static detResidExpRow *mdToDetResidExp(pxConfig *config, psMetadata *row);
 static detRunSummaryRow *mdToDetRunSummary(pxConfig *config, psMetadata *row);
 //static psArray *validDetInputClassIds(pxConfig *config, const char *det_id);
@@ -212,5 +209,7 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-     psString query = psStringCopy(
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psString query = psStringCopy(
         "SELECT"
         "   rawExp.*"
@@ -247,14 +246,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "rawExp", !simple)) {
@@ -271,43 +260,14 @@
 static bool definebytagMode(pxConfig *config)
 {
-    bool status     = false;
-
     PS_ASSERT_PTR_NON_NULL(config, false);
 
     // what type of detRun is this?
-    // det_type is required
-    psString det_type = psMetadataLookupStr(&status, config->args, "-det_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_type");
-        return false;
-    }
-    if (!det_type) {
-        psError(PS_ERR_UNKNOWN, true, "-det_type is required");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
 
     // optional
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    // optional
-    psString mode = psMetadataLookupStr(&status, config->args, "-mode");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -mode");
-        return false;
-    }
+    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)) {
@@ -315,193 +275,29 @@
         return false;
     }
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-
-    psString exp_type = psMetadataLookupStr(&status, config->args, "-exp_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_type");
-        return false;
-    }
-
-    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
-        return false;
-    }
-
-    psF32 airmass_min = psMetadataLookupF32(&status, config->args, "-airmass_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_min");
-        return false;
-    }
-
-    psF32 airmass_max = psMetadataLookupF32(&status, config->args, "-airmass_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_max");
-        return false;
-    }
-
-    psF32 exp_time_min = psMetadataLookupF32(&status, config->args, "-exp_time_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_min");
-        return false;
-    }
-
-    psF32 exp_time_max = psMetadataLookupF32(&status, config->args, "-exp_time_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_max");
-        return false;
-    }
-
-    psF32 ccd_temp_min = psMetadataLookupF32(&status, config->args, "-ccd_temp_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_min");
-        return false;
-    }
-
-    psF32 ccd_temp_max = psMetadataLookupF32(&status, config->args, "-ccd_temp_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_max");
-        return false;
-    }
-
-    psF64 posang_min = psMetadataLookupF32(&status, config->args, "-posang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_min");
-        return false;
-    }
-
-    psF64 posang_max = psMetadataLookupF32(&status, config->args, "-posang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_max");
-        return false;
-    }
-    psF64 solang_min = psMetadataLookupF32(&status, config->args, "-solang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_min");
-        return false;
-    }
-
-    psF64 solang_max = psMetadataLookupF32(&status, config->args, "-solang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_max");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-            if (!registered) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", registeredStr);
-                return false;
-            }
-        } else {
-            registered = NULL;
-        }
-    }
-
-    psTime *time_begin = NULL;
-    {
-        psString time_beginStr = psMetadataLookupStr(&status, config->args, "-time_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_beginStr) {
-            time_begin = psTimeFromISO(time_beginStr, PS_TIME_UTC);
-            if (!time_begin) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", time_beginStr);
-                return false;
-            }
-        } else {
-            time_begin = NULL;
-        }
-    }
-
-    psTime *time_end = NULL;
-    {
-        psString time_endStr = psMetadataLookupStr(&status, config->args, "-time_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_endStr) {
-            time_end = psTimeFromISO(time_endStr, PS_TIME_UTC);
-            if (!time_end) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", time_endStr);
-                return false;
-            }
-        } else {
-            time_end = NULL;
-        }
-    }
-
-    psTime *use_begin = NULL;
-    {
-        psString use_beginStr = psMetadataLookupStr(&status, config->args, "-use_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_beginStr) {
-            use_begin = psTimeFromISO(use_beginStr, PS_TIME_UTC);
-            if (!use_begin) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", use_beginStr);
-                return false;
-            }
-        } else {
-            use_begin = NULL;
-        }
-    }
-
-    psTime *use_end = NULL;
-    {
-        psString use_endStr = psMetadataLookupStr(&status, config->args, "-use_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_endStr) {
-            use_end = psTimeFromISO(use_endStr, PS_TIME_UTC);
-            if (!use_end) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", use_endStr);
-                return false;
-            }
-        } else {
-            use_end = NULL;
-        }
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reduction");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", false, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
+    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
+
+    PXOPT_LOOKUP_F32(airmass_min, config->args, "-airmass_min", false, false);
+    PXOPT_LOOKUP_F32(airmass_max, config->args, "-airmass_max", false, false);
+    PXOPT_LOOKUP_F32(exp_time_min, config->args, "-exp_time_min", false, false);
+    PXOPT_LOOKUP_F32(exp_time_max, config->args, "-exp_time_max", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_min, config->args, "-ccd_temp_min", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_max, config->args, "-ccd_temp_max", false, false);
+    PXOPT_LOOKUP_F64(posang_min, config->args, "-posang_min", false, false);
+    PXOPT_LOOKUP_F64(posang_max, config->args, "-posang_max", false, false);
+    PXOPT_LOOKUP_F64(solang_min, config->args, "-solang_min", false, false);
+    PXOPT_LOOKUP_F64(solang_max, config->args, "-solang_max", false, false);
+    PXOPT_LOOKUP_TIME(time_begin, config->args, "-time_begin", false, false);
+    PXOPT_LOOKUP_TIME(time_end, config->args, "-time_end", false, false);
+    PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
+    PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+
+    // default
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     // we have to support multipe exp_ids
@@ -608,9 +404,4 @@
                  0       // parent
         );
-    psFree(registered);
-    psFree(time_begin);
-    psFree(time_end);
-    psFree(use_begin);
-    psFree(use_end);
     psS64 det_id = psDBLastInsertID(config->dbh);
 
@@ -645,14 +436,4 @@
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
-    }
-
-    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;
-        }
     }
 
@@ -721,316 +502,63 @@
 static bool definebyqueryMode(pxConfig *config)
 {
-    bool status     = false;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // what type of detRun is this?
-    // det_type is required
-    psString det_type = psMetadataLookupStr(&status, config->args, "-det_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_type");
-        return false;
-    }
-    if (!det_type) {
-        psError(PS_ERR_UNKNOWN, true, "-det_type is required");
-        return false;
-    }
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
 
     // optional
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, false, "-inst is required");
-        return 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(filelevel, config->args, "-filelevel", false, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
+    PXOPT_LOOKUP_F32(airmass_min, config->args, "-airmass_min", false, false);
+    PXOPT_LOOKUP_F32(airmass_max, config->args, "-airmass_max", false, false);
+    PXOPT_LOOKUP_F32(exp_time_min, config->args, "-exp_time_min", false, false);
+    PXOPT_LOOKUP_F32(exp_time_max, config->args, "-exp_time_max", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_min, config->args, "-ccd_temp_min", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_max, config->args, "-ccd_temp_max", false, false);
+    PXOPT_LOOKUP_F64(posang_min, config->args, "-posang_min", false, false);
+    PXOPT_LOOKUP_F64(posang_max, config->args, "-posang_max", false, false);
+    PXOPT_LOOKUP_F64(solang_min, config->args, "-solang_min", false, false);
+    PXOPT_LOOKUP_F64(solang_max, config->args, "-solang_max", false, false);
+
+    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_TIME(time_begin, config->args, "-time_begin", false, false);
+    PXOPT_LOOKUP_TIME(time_end, config->args, "-time_end", false, false);
+    PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
+    PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
 
     psMetadata *where = psMetadataAlloc();
-    {
-        bool status = false;
-        psString exp_type = psMetadataLookupStr(&status, config->args, "-select_exp_type");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_exp_type");
-            return false;
-        }
-        if (exp_type) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_type", 0, "==", exp_type)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
-                psFree(where);
-                return false;
-            }
-        }
-
-        // map -inst -> camera
-        psString camera = psMetadataLookupStr(&status, config->args, "-select_inst");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_inst");
-            return false;
-        }
-        if (camera) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "camera", 0, "==", camera)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item inst");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psString telescope = psMetadataLookupStr(&status, config->args, "-select_telescope");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_telescope");
-            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;
-            }
-        }
-
-        psString filter = psMetadataLookupStr(&status, config->args, "-select_filter");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_filter");
-            return false;
-        }
-        if (filter) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "filter", 0, "==", filter)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psString uri = psMetadataLookupStr(&status, config->args, "-select_uri");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_uri");
-            return false;
-        }
-        if (uri) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "uri", 0, "==", uri)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psString dateobs_begin = psMetadataLookupStr(&status, config->args, "-select_dateobs_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_dateobs_begin");
-            psFree(where);
-            return false;
-        }
-        if (dateobs_begin) {
-            psTime *time = psTimeFromISO(dateobs_begin, PS_TIME_UTC);
-            if (!time) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", dateobs_begin);
-                psFree(time);
-                psFree(where);
-                return false;
-            }
-            if (!psMetadataAddTime(where, PS_LIST_TAIL, "dateobs", PS_META_DUPLICATE_OK, ">=", time)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
-                psFree(time);
-                psFree(where);
-                return false;
-            }
-            psFree(time);
-        }
-
-        psString dateobs_end = psMetadataLookupStr(&status, config->args, "-select_dateobs_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_dateobs_end");
-            psFree(where);
-            return false;
-        }
-        if (dateobs_end) {
-            psTime *time = psTimeFromISO(dateobs_end, PS_TIME_UTC);
-            if (!time) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", dateobs_end);
-                psFree(time);
-                psFree(where);
-                return false;
-            }
-            if (!psMetadataAddTime(where, PS_LIST_TAIL, "dateobs", PS_META_DUPLICATE_OK, "<", time)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
-                psFree(time);
-                psFree(where);
-                return false;
-            }
-            psFree(time);
-        }
-
-        /** selection based on airmass range **/
-        psF32 select_airmass_min = psMetadataLookupF32(&status, config->args, "-select_airmass_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_airmass_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_airmass_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "airmass", PS_META_DUPLICATE_OK, ">=", select_airmass_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_airmass_max = psMetadataLookupF32(&status, config->args, "-select_airmass_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_airmass_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_airmass_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "airmass", PS_META_DUPLICATE_OK, "<=", select_airmass_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psF32 select_sat_pixel_frac_max = psMetadataLookupF32(&status, config->args, "-select_sat_pixel_frac_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_sat_pixel_frac_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_sat_pixel_frac_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "sat_pixel_frac", PS_META_DUPLICATE_OK, "<=", select_sat_pixel_frac_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item sat_pixel_frac");
-                psFree(where);
-                return false;
-            }
-        }
-
-        /** selection based on exp_time range **/
-        psF32 select_exp_time_min = psMetadataLookupF32(&status, config->args, "-select_exp_time_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_exp_time_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_exp_time_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "exp_time", PS_META_DUPLICATE_OK, ">=", select_exp_time_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_time");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_exp_time_max = psMetadataLookupF32(&status, config->args, "-select_exp_time_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_exp_time_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_exp_time_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "exp_time", PS_META_DUPLICATE_OK, "<=", select_exp_time_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_time");
-                psFree(where);
-                return false;
-            }
-        }
-
-        /** selection based on ccd_temp range **/
-        psF32 select_ccd_temp_min = psMetadataLookupF32(&status, config->args, "-select_ccd_temp_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_ccd_temp_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_ccd_temp_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "ccd_temp", PS_META_DUPLICATE_OK, ">=", select_ccd_temp_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item ccd_temp");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_ccd_temp_max = psMetadataLookupF32(&status, config->args, "-select_ccd_temp_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_ccd_temp_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_ccd_temp_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "ccd_temp", PS_META_DUPLICATE_OK, "<=", select_ccd_temp_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item ccd_temp");
-                psFree(where);
-                return false;
-            }
-        }
-
-        /** selection based on posang **/
-        psF32 select_posang_min = psMetadataLookupF32(&status, config->args, "-select_posang_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_posang_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_posang_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "posang", PS_META_DUPLICATE_OK, ">=", select_posang_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item posang");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_posang_max = psMetadataLookupF32(&status, config->args, "-select_posang_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_posang_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_posang_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "posang", PS_META_DUPLICATE_OK, "<=", select_posang_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item posang");
-                psFree(where);
-                return false;
-            }
-        }
-
-        /** selection based on solang **/
-        psF32 select_solang_min = psMetadataLookupF32(&status, config->args, "-select_solang_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_solang_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_solang_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "solang", PS_META_DUPLICATE_OK, ">=", select_solang_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_solang_max = psMetadataLookupF32(&status, config->args, "-select_solang_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_solang_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_solang_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "solang", PS_META_DUPLICATE_OK, "<=", select_solang_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
-                psFree(where);
-                return false;
-            }
-        }
-
-    }
+    PXOPT_COPY_STR(config->args, where, "-select_exp_type", "exp_type", "==");
+    // map -inst -> camera
+    PXOPT_COPY_STR(config->args, where, "-select_inst", "camera", "==");
+    PXOPT_COPY_STR(config->args, where, "-select_telescope", "telescope", "==");
+    PXOPT_COPY_STR(config->args, where, "-select_filter", "filter", "==");
+    PXOPT_COPY_STR(config->args, where, "-select_uri", "uri", "==");
+    PXOPT_COPY_TIME(config->args, where, "-select_dateobs_begin", "dateobs", ">=");
+    PXOPT_COPY_TIME(config->args, where, "-select_dateobs_end", "dateobs", "<");
+    PXOPT_COPY_F32(config->args, where, "-select_airmass_min", "airmass", ">=");
+    PXOPT_COPY_F32(config->args, where, "-select_airmass_max", "airmass", "<=");
+    PXOPT_COPY_F32(config->args, where, "-select_sat_pixel_frac_max", "sat_pixel_frac", "<=");
+    PXOPT_COPY_F32(config->args, where, "-select_exp_time_min", "exp_time", ">=");
+    PXOPT_COPY_F32(config->args, where, "-select_exp_time_max", "exp_time", "<=");
+    PXOPT_COPY_F32(config->args, where, "-select_ccd_temp_min", "ccd_temp", ">=");
+    PXOPT_COPY_F32(config->args, where, "-select_ccd_temp_max", "ccd_temp", "<=");
+    PXOPT_COPY_F32(config->args, where, "-select_posang_min", "posang", ">=");
+    PXOPT_COPY_F32(config->args, where, "-select_posang_max", "posang", "<=");
+    PXOPT_COPY_F32(config->args, where, "-select_solang_min", "solang", ">=");
+    PXOPT_COPY_F32(config->args, where, "-select_solang_max", "solang", "<=");
 
     if (!psListLength(where->list)) {
@@ -1043,213 +571,4 @@
     // like to assign values to so I've seperated them but prepending set- to
     // the assigned values
-
-    // optional
-    psString mode = psMetadataLookupStr(&status, config->args, "-mode");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -mode");
-        return false;
-    }
-    // check mode
-    if (mode && !isValidMode(config, mode)) {
-        psError(PS_ERR_UNKNOWN, false, "invalud mode");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-
-    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
-        return false;
-    }
-
-    psF32 airmass_min = psMetadataLookupF32(&status, config->args, "-airmass_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_min");
-        return false;
-    }
-
-    psF32 airmass_max = psMetadataLookupF32(&status, config->args, "-airmass_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_max");
-        return false;
-    }
-
-    psF32 exp_time_min = psMetadataLookupF32(&status, config->args, "-exp_time_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_min");
-        return false;
-    }
-
-    psF32 exp_time_max = psMetadataLookupF32(&status, config->args, "-exp_time_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_max");
-        return false;
-    }
-
-    psF32 ccd_temp_min = psMetadataLookupF32(&status, config->args, "-ccd_temp_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_min");
-        return false;
-    }
-
-    psF32 ccd_temp_max = psMetadataLookupF32(&status, config->args, "-ccd_temp_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_max");
-        return false;
-    }
-
-    psF64 posang_min = psMetadataLookupF32(&status, config->args, "-posang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_min");
-        return false;
-    }
-
-    psF64 posang_max = psMetadataLookupF32(&status, config->args, "-posang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_max");
-        return false;
-    }
-
-    psF64 solang_min = psMetadataLookupF32(&status, config->args, "-solang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_min");
-        return false;
-    }
-
-    psF64 solang_max = psMetadataLookupF32(&status, config->args, "-solang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_max");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-            if (!registered) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", registeredStr);
-                return false;
-            }
-        } else {
-            registered = NULL;
-        }
-    }
-
-    psTime *time_begin = NULL;
-    {
-        psString time_beginStr = psMetadataLookupStr(&status, config->args, "-time_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_beginStr) {
-            time_begin = psTimeFromISO(time_beginStr, PS_TIME_UTC);
-            if (!time_begin) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", time_beginStr);
-                return false;
-            }
-        } else {
-            time_begin = NULL;
-        }
-    }
-
-    psTime *time_end = NULL;
-    {
-        psString time_endStr = psMetadataLookupStr(&status, config->args, "-time_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_endStr) {
-            time_end = psTimeFromISO(time_endStr, PS_TIME_UTC);
-            if (!time_end) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", time_endStr);
-                return false;
-            }
-        } else {
-            time_end = NULL;
-        }
-    }
-
-    psTime *use_begin = NULL;
-    {
-        psString use_beginStr = psMetadataLookupStr(&status, config->args, "-use_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_beginStr) {
-            use_begin = psTimeFromISO(use_beginStr, PS_TIME_UTC);
-            if (!use_begin) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", use_beginStr);
-                return false;
-            }
-        } else {
-            use_begin = NULL;
-        }
-    }
-
-    psTime *use_end = NULL;
-    {
-        psString use_endStr = psMetadataLookupStr(&status, config->args, "-use_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_endStr) {
-            use_end = psTimeFromISO(use_endStr, PS_TIME_UTC);
-            if (!use_end) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", use_endStr);
-                return false;
-            }
-        } else {
-            use_end = NULL;
-        }
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reduction");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-
-    bool simple = psMetadataLookupBool(&status, config->args, "-simple");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
-        return false;
-    }
-
-    bool pretend = psMetadataLookupBool(&status, config->args, "-pretend");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -pretend");
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
-        return false;
-    }
 
     // search for rawExps with the specified options
@@ -1259,7 +578,4 @@
     if (!detrendExps) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
         return false;
     }
@@ -1267,7 +583,4 @@
         psTrace("dettool", PS_LOG_INFO, "no rows found");
         psFree(detrendExps);
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
         return true;
     }
@@ -1283,13 +596,7 @@
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(detrendExps);
-            psFree(registered);
-            psFree(use_begin);
-            psFree(use_end);
             return false;
         }
         psFree(detrendExps);
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
         return true;
     }
@@ -1299,7 +606,4 @@
         psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(detrendExps);
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
         return false;
     }
@@ -1338,10 +642,4 @@
                  0       // parent
         );
-    psFree(registered);
-    psFree(time_begin);
-    psFree(time_end);
-    psFree(use_end);
-    psFree(use_begin);
-    psFree(use_end);
     psS64 det_id = psDBLastInsertID(config->dbh);
 
@@ -1417,18 +715,43 @@
 static bool definebydetrunMode(pxConfig *config)
 {
-    bool status     = false;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // det_id is the only required input
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-        return false;
-    }
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+
+    // optional
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_STR(det_type, config->args, "-set_det_type", false, false);
+    PXOPT_LOOKUP_STR(mode, config->args, "-set_mode", false, false);
+    // check mode
+    if (mode && !isValidMode(config, mode)) {
+        psError(PS_ERR_UNKNOWN, false, "invalud mode");
+        return false;
+    }
+    PXOPT_LOOKUP_STR(camera, config->args, "-set_inst", false, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-set_telescope", false, false);
+    PXOPT_LOOKUP_STR(exp_type, config->args, "-set_exp_type", false, false);
+    PXOPT_LOOKUP_STR(filelevel, config->args, "-set_filelevel", false, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-set_filter", false, false);
+
+    PXOPT_LOOKUP_F32(airmass_min, config->args, "-set_airmass_min", false, false);
+    PXOPT_LOOKUP_F32(airmass_max, config->args, "-set_airmass_max", false, false);
+    PXOPT_LOOKUP_F32(exp_time_min, config->args, "-set_exp_time_min", false, false);
+    PXOPT_LOOKUP_F32(exp_time_max, config->args, "-set_exp_time_max", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_min, config->args, "-set_ccd_temp_min", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_max, config->args, "-set_ccd_temp_max", false, false);
+    PXOPT_LOOKUP_F32(posang_min, config->args, "-set_posang_min", false, false);
+    PXOPT_LOOKUP_F32(posang_max, config->args, "-set_posang_max", false, false);
+    PXOPT_LOOKUP_F32(solang_min, config->args, "-set_solang_min", false, false);
+    PXOPT_LOOKUP_F32(solang_max, config->args, "-set_solang_max", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-set_registered", false, false);
+    PXOPT_LOOKUP_TIME(time_begin, config->args, "-set_time_begin", false, false);
+    PXOPT_LOOKUP_TIME(time_end, config->args, "-set_end", false, false);
+    PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
+    PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
+
 
     // lookup the detRun that we will be basing this one on
@@ -1467,9 +790,4 @@
 
     // walk through the optional values and update the detRun as required
-    psString det_type = psMetadataLookupStr(&status, config->args, "-set_det_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_det_type");
-        return false;
-    }
     if (det_type) {
         psFree(detRun->det_type);
@@ -1477,14 +795,4 @@
     }
 
-    psString mode = psMetadataLookupStr(&status, config->args, "-set_mode");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_mode");
-        return false;
-    }
-    // check mode
-    if (mode && !isValidMode(config, mode)) {
-        psError(PS_ERR_UNKNOWN, false, "invalud mode");
-        return false;
-    }
     if (mode) {
         psFree(detRun->mode);
@@ -1492,9 +800,4 @@
     }
 
-    psString camera = psMetadataLookupStr(&status, config->args, "-set_inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_inst");
-        return false;
-    }
     if (camera) {
         psFree(detRun->camera);
@@ -1502,9 +805,4 @@
     }
 
-    psString telescope = psMetadataLookupStr(&status, config->args, "-set_telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_telescope");
-        return false;
-    }
     if (telescope) {
         psFree(detRun->telescope);
@@ -1512,9 +810,4 @@
     }
 
-    psString exp_type = psMetadataLookupStr(&status, config->args, "-set_exp_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_exp_type");
-        return false;
-    }
     if (exp_type) {
         psFree(detRun->exp_type);
@@ -1522,9 +815,4 @@
     }
 
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-set_filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_filelevel");
-        return false;
-    }
     if (filelevel) {
         psFree(detRun->filelevel);
@@ -1532,9 +820,4 @@
     }
 
-    psString workdir = psMetadataLookupStr(&status, config->args, "-set_workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_workdir");
-        return false;
-    }
     if (workdir) {
         psFree(detRun->workdir);
@@ -1542,9 +825,4 @@
     }
 
-    psString filter = psMetadataLookupStr(&status, config->args, "-set_filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_filter");
-        return false;
-    }
     if (filter) {
         psFree(detRun->filter);
@@ -1552,188 +830,74 @@
     }
 
-    psF32 airmass_min = psMetadataLookupF32(&status, config->args, "-set_airmass_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_airmass_min");
-        return false;
-    }
     if (!isnan(airmass_min)) {
         detRun->airmass_min = airmass_min;
     }
 
-    psF32 airmass_max = psMetadataLookupF32(&status, config->args, "-set_airmass_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_airmass_max");
-        return false;
-    }
     if (!isnan(airmass_max)) {
         detRun->airmass_max = airmass_max;
     }
 
-    psF32 exp_time_min = psMetadataLookupF32(&status, config->args, "-set_exp_time_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_exp_time_min");
-        return false;
-    }
     if (!isnan(exp_time_min)) {
         detRun->exp_time_min = exp_time_min;
     }
 
-    psF32 exp_time_max = psMetadataLookupF32(&status, config->args, "-set_exp_time_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_exp_time_max");
-        return false;
-    }
     if (!isnan(exp_time_max)) {
         detRun->exp_time_max = exp_time_max;
     }
 
-    psF32 ccd_temp_min = psMetadataLookupF32(&status, config->args, "-set_ccd_temp_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_ccd_temp_min");
-        return false;
-    }
     if (!isnan(ccd_temp_min)) {
         detRun->ccd_temp_min = ccd_temp_min;
     }
 
-    psF32 ccd_temp_max = psMetadataLookupF32(&status, config->args, "-set_ccd_temp_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_ccd_temp_max");
-        return false;
-    }
     if (!isnan(ccd_temp_max)) {
         detRun->ccd_temp_max = ccd_temp_max;
     }
 
-    psF64 posang_min = psMetadataLookupF32(&status, config->args, "-set_posang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_posang_min");
-        return false;
-    }
     if (!isnan(posang_min)) {
         detRun->posang_min = posang_min;
     }
 
-    psF64 posang_max = psMetadataLookupF32(&status, config->args, "-set_posang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_posang_max");
-        return false;
-    }
     if (!isnan(posang_max)) {
         detRun->posang_max = posang_max;
     }
 
-    psF64 solang_min = psMetadataLookupF32(&status, config->args, "-set_solang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_solang_min");
-        return false;
-    }
     if (!isnan(solang_min)) {
         detRun->solang_min = solang_min;
     }
 
-    psF64 solang_max = psMetadataLookupF32(&status, config->args, "-set_solang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_solang_max");
-        return false;
-    }
     if (!isnan(solang_max)) {
         detRun->solang_max = solang_max;
     }
 
-    psString label = psMetadataLookupStr(&status, config->args, "-set_label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_label");
-        return false;
-    }
     if (label) {
+        psFree(detRun->label);
         detRun->label = label;
     }
 
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-set_registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            psFree(detRun->registered);
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-            detRun->registered = psMemIncrRefCounter(registered);
-            psFree(registered);
-        }
-    }
-
-    psTime *time_begin = NULL;
-    {
-        psString time_beginStr = psMetadataLookupStr(&status, config->args, "-set_time_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_time_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_beginStr) {
-            psFree(detRun->time_begin);
-            time_begin = psTimeFromISO(time_beginStr, PS_TIME_UTC);
-            detRun->time_begin = psMemIncrRefCounter(time_begin);
-            psFree(time_begin);
-        }
-    }
-
-    psTime *time_end = NULL;
-    {
-        psString time_endStr = psMetadataLookupStr(&status, config->args, "-set_time_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_time_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_endStr) {
-            psFree(detRun->time_end);
-            time_end = psTimeFromISO(time_endStr, PS_TIME_UTC);
-            detRun->time_end = psMemIncrRefCounter(time_end);
-            psFree(time_end);
-        }
-    }
-
-    psTime *use_begin = NULL;
-    {
-        psString use_beginStr = psMetadataLookupStr(&status, config->args, "-set_use_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_use_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_beginStr) {
-            psFree(detRun->use_begin);
-            use_begin = psTimeFromISO(use_beginStr, PS_TIME_UTC);
-            detRun->use_begin = psMemIncrRefCounter(use_begin);
-            psFree(use_begin);
-        }
-    }
-
-    psTime *use_end = NULL;
-    {
-        psString use_endStr = psMetadataLookupStr(&status, config->args, "-set_use_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_use_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_endStr) {
-            psFree(detRun->use_end);
-            use_end = psTimeFromISO(use_endStr, PS_TIME_UTC);
-            detRun->use_end = psMemIncrRefCounter(use_end);
-            psFree(use_end);
-        }
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-set_reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_reduction");
-        return false;
-    }
+    if (registered) {
+        psFree(detRun->registered);
+        detRun->registered = psMemIncrRefCounter(registered);
+    }
+
+    if (time_begin) {
+        psFree(detRun->time_begin);
+        detRun->time_begin = psMemIncrRefCounter(time_begin);
+    }
+
+    if (time_end) {
+        psFree(detRun->time_end);
+        detRun->time_end = psMemIncrRefCounter(time_end);
+    }
+
+    if (use_begin) {
+        psFree(detRun->use_begin);
+        detRun->use_begin = psMemIncrRefCounter(use_begin);
+    }
+
+    if (use_end) {
+        psFree(detRun->use_end);
+        detRun->use_end = psMemIncrRefCounter(use_end);
+    }
+
     if (reduction) {
         psFree(detRun->reduction);
@@ -1745,42 +909,8 @@
     psMetadata *time_filter = psMetadataAlloc();
 
-    {
-        psString timeStr = psMetadataLookupStr(&status, config->args, "-filter_input_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter_input_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (timeStr) {
-            psTime *time = psTimeFromISO(timeStr, PS_TIME_UTC);
-            if (!psMetadataAddTime(time_filter, PS_LIST_TAIL, "dateobs", PS_META_DUPLICATE_OK, ">=", time)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
-                psFree(time);
-                psFree(time_filter);
-                return false;
-            }
-            psFree(time);
-        }
-    }
-
-    {
-        psString timeStr = psMetadataLookupStr(&status, config->args, "-filter_input_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter_input_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (timeStr) {
-            psTime *time = psTimeFromISO(timeStr, PS_TIME_UTC);
-            if (!psMetadataAddTime(time_filter, PS_LIST_TAIL, "dateobs", PS_META_DUPLICATE_OK, "<", time)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
-                psFree(time);
-                psFree(time_filter);
-                return false;
-            }
-            psFree(time);
-        }
-    }
-
+    // XXX: possible mem leak: PXOPT_COPY* will free time_filter but NOTHING
+    // that has previously been allocated
+    PXOPT_COPY_TIME(config->args, time_filter, "-filter_input_begin", "dateobs", ">=");
+    PXOPT_COPY_TIME(config->args, time_filter, "-filter_input_end", "dateobs", "<");
 
     // start a transaction so we don't end up with childlessed det_ids
@@ -1840,14 +970,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;
-        }
-    }
-
     // print the new det_id
     psArray *newDetRuns = NULL;
@@ -1890,4 +1010,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
     // XXX fix the hard coding of the table name
     psArray *runs = psDBSelectRows(config->dbh, "detRun", config->where, 0);
@@ -1910,14 +1032,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, runs, "detRun", !simple)) {
@@ -1936,10 +1048,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = psStringCopy(
@@ -1993,15 +1101,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");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detRun", !simple)) {
@@ -2032,4 +1129,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
     // select detInputExp.*
     // select rawExp.*
@@ -2068,14 +1167,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detInputExp", !simple)) {
@@ -2093,4 +1182,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = pxDataGet("dettool_raw.sql");
@@ -2124,14 +1215,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "rawImfile", !simple)) {
@@ -2150,10 +1231,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = pxDataGet("dettool_toprocessedimfile.sql");
@@ -2192,14 +1269,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;
-        }
     }
 
@@ -2267,122 +1334,26 @@
     // det_id, exp_id, class_id, uri, recipe, -bg, -bg_stdev
     // are required
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_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;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_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);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
+ 
     // optional
-    psF64 fringe_0 = psMetadataLookupF64(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-    psF64 fringe_1 = psMetadataLookupF64(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-    psF64 fringe_2 = psMetadataLookupF64(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    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_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F64(fringe_0, config->args, "-fringe_0", false, false);
+    PXOPT_LOOKUP_F64(fringe_1, config->args, "-fringe_1", false, false);
+    PXOPT_LOOKUP_F64(fringe_2, config->args, "-fringe_2", false, false);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
+
+    // default values
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     // find the matching rawImfile by exp_id/class_id
@@ -2396,11 +1367,4 @@
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(where);
-        return 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;
     }
@@ -2453,10 +1417,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = pxDataGet("dettool_toprocessedexp.sql");
@@ -2500,14 +1460,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detPendingProcessedExp", !simple)) {
@@ -2528,110 +1478,24 @@
     // det_id, exp_id, recip, -bg, -bg_stdev
     // are required
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_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 recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
+
     // optional
-    psF64 fringe_0 = psMetadataLookupF64(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-    psF64 fringe_1 = psMetadataLookupF64(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-    psF64 fringe_2 = psMetadataLookupF64(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    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_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F64(fringe_0, config->args, "-fringe_0", false, false);
+    PXOPT_LOOKUP_F64(fringe_1, config->args, "-fringe_1", false, false);
+    PXOPT_LOOKUP_F64(fringe_2, config->args, "-fringe_2", false, false);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", true, 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);
 
     psString query = psStringCopy(
@@ -2727,16 +1591,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = psStringCopy("SELECT * FROM detProcessedExp");
@@ -2781,14 +1636,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detProcessedExp", !simple)) {
@@ -2840,10 +1685,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = pxDataGet("dettool_tostacked.sql");
@@ -2887,14 +1728,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detPendingStackedImfile", !simple)) {
@@ -2914,17 +1745,8 @@
 
     char *value = 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);
 
     psString query = psStringCopy(
@@ -2947,13 +1769,16 @@
 
     // add the two required restrictions: detRun.state and detRun.mode
-    if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
-        psStringAppend(&query, " detRun.state = '%s'", value);
-    } else {
-        psStringAppend(&query, " 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'");
+    {
+        bool status;
+        if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
+            psStringAppend(&query, " detRun.state = '%s'", value);
+        } else {
+            psStringAppend(&query, " 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'");
+        }
     }
 
@@ -3010,14 +1835,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "rawImfile", !simple)) {
@@ -3070,104 +1885,22 @@
 
     // det_id, class_id, uri, & recipe are required
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_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;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    // optional values
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
+ 
+    // optional
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
 
     // default values
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     // correlate the class_id against the input exposure(s)
@@ -3246,16 +1979,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     // select detStackedImfile.*
@@ -3313,15 +2037,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");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "rawImfile", !simple)) {
@@ -3372,10 +2085,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = pxDataGet("dettool_tonormalizedstat.sql");
@@ -3419,14 +2128,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detPendingNormStatImfile", !simple)) {
@@ -3445,117 +2144,27 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    // select * from detStackedImfile
-    // by det_id, iteration, class_id
-    // where det_id, iteration, class_id is not in detNormalizedStatImfile
-    psString query = psStringCopy(
-        "SELECT DISTINCT"
-        "   detStackedImfile.*"
-        " FROM detStackedImfile"
-        " LEFT JOIN detNormalizedStatImfile"
-        "   USING(det_id, iteration, class_id)"
-        " WHERE"
-        "  detNormalizedStatImfile.det_id IS NULL"
-        "  AND detNormalizedStatImfile.iteration IS NULL"
-        "  AND detNormalizedStatImfile.class_id IS NULL"
-        );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detStackedImfile");
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
-
-    psArray *output = p_psDBFetchResult(config->dbh);
-    if (!output) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-    if (!psArrayLength(output)) {
-        psTrace("dettool", PS_LOG_INFO, "no rows found");
-        psFree(output);
-        return true;
-    }
-
-    // start a transaction so it's all rows or nothing
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
-
-    for (long i = 0; i < psArrayLength(output); i++) {
-        psMetadata *row = output->data[i];
-        // convert metadata into a detStackedImfile object
-        detStackedImfileRow *stackedImfile = detStackedImfileObjectFromMetadata(row);
-        // convert detStackedImfile object into a detNormalizedStat object
-        detNormalizedStatImfileRow *stat = detStackedToDetNormalizedStatImfile(config, stackedImfile);
-        psFree(stackedImfile);
-        if (!stat) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to convert detStackedImfile to detNormalizedStatImfile");
-            psFree(output);
-            return false;
-        }
-        // insert detNormlized Stat object into the database
-        if (!detNormalizedStatImfileInsertObject(config->dbh, stat)) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "database error");
-            psFree(stat);
-            psFree(output);
-        }
-        psFree(stat);
-    }
-
-    psFree(output);
-
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-static detNormalizedStatImfileRow *detStackedToDetNormalizedStatImfile(pxConfig *config, detStackedImfileRow *stackedImfile)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    PS_ASSERT_PTR_NON_NULL(stackedImfile, NULL);
-
-    bool status = false;
-    psF32 norm = psMetadataLookupF32(&status, config->args, "-norm");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -norm");
-        return false;
-    }
-    //if (isnan(norm)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-norm is required");
-    //  return 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;
-    }
-
-    return detNormalizedStatImfileRowAlloc(
-        stackedImfile->det_id,
-        stackedImfile->iteration,
-        stackedImfile->class_id,
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+
+    // optional
+    PXOPT_LOOKUP_F32(norm, config->args, "-norm", false, false);
+
+    // default
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    if (!detNormalizedStatImfileInsert(config->dbh,
+        (psS64)atoll(det_id),
+        iteration,
+        class_id,
         norm,
         code
-    );
+    )) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
 }
 
@@ -3565,16 +2174,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = pxDataGet("dettool_normalizedstat.sql");
@@ -3623,15 +2223,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");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detNormalizedStatImfile", !simple)) {
@@ -3681,10 +2270,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     // select detNormalizedStatImfile.*
@@ -3755,15 +2340,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");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detPendingNormImfile", !simple)) {
@@ -3873,133 +2447,40 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // make sure that there is a respondoing entry in detNormalizedStatImfile
-    // select * from detNormalizedStatImfile
-    // by det_id, iteration, class_id
-    // where det_id, iteration, class_id is not in detNormalizedImfile
-    psString query = psStringCopy(
-        "SELECT"
-        "   detNormalizedStatImfile.*"
-        " FROM detNormalizedStatImfile"
-        " LEFT JOIN detNormalizedImfile"
-        "   USING(det_id, iteration, class_id)"
-        " WHERE"
-        "  detNormalizedImfile.det_id IS NULL"
-        "  AND detNormalizedImfile.iteration IS NULL"
-        "  AND detNormalizedImfile.class_id IS NULL"
-        );
-
-    {
-        // build a query to search by det_id, iteration, class_id
-        psMetadata *where = psMetadataAlloc();
-        bool status = false;
-        psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        if (det_id) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "det_id", 0, "==", det_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
-        psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        // always set iteration
-        if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        if (class_id) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "class_id", 0, "==", class_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
-
-        // there's not
-        psString whereClause = psDBGenerateWhereConditionSQL(where, "detNormalizedStatImfile");
-        psFree(where);
-        if (whereClause) {
-            psStringAppend(&query, " AND %s", whereClause);
-            psFree(whereClause);
-        }
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
-
-    psArray *output = p_psDBFetchResult(config->dbh);
-    if (!output) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-    if (!psArrayLength(output)) {
-        psTrace("dettool", PS_LOG_INFO, "no rows found");
-        psFree(output);
-        return true;
-    }
-
-    // start a transaction so it's all rows or nothing
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
-
-    for (long i = 0; i < psArrayLength(output); i++) {
-        psMetadata *row = output->data[i];
-        // convert metadata into a detNormalizedStatImfile object
-        detNormalizedStatImfileRow *statImfile = detNormalizedStatImfileObjectFromMetadata(row);
-        // convert detNormalizedStatImfile object into a detNormalizedImfile
-        detNormalizedImfileRow *normalizedImfile  = detNormalizedStatToDetNormalizedmfile(config, statImfile);
-        psFree(statImfile);
-        if (!normalizedImfile) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to convert detStackedImfile to detNormalizedStatImfile");
-            psFree(output);
-            return false;
-        }
-        // insert detNormlized Stat object into the database
-        if (!detNormalizedImfileInsertObject(config->dbh, normalizedImfile)) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "database error");
-            psFree(normalizedImfile);
-            psFree(output);
-        }
-        psFree(normalizedImfile);
-    }
-
-    psFree(output);
-
-    if (!psDBCommit(config->dbh)) {
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+
+    // optional
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
+
+    // default values
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    if (!detNormalizedImfileInsert(config->dbh,
+        (psS64)atoll(det_id),
+        iteration,
+        class_id,
+        uri,
+        bg,
+        bg_stdev,
+        bg_mean_stdev,
+        user_1,
+        user_2,
+        user_3,
+        user_4,
+        user_5,
+        path_base,
+        code
+    )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
@@ -4014,16 +2495,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = psStringCopy(
@@ -4083,14 +2555,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detNormalizedImfile", !simple)) {
@@ -4142,10 +2604,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = pxDataGet("dettool_tonormalizedexp.sql");
@@ -4189,14 +2647,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detPendingNormExp", !simple)) {
@@ -4215,94 +2663,22 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // det_id, recip, -bg, -bg_stdev
-    // are required
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-        return false;
-    }
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
 
     // optional
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    // iteration has a default value
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");        return false;
-    }
-
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return 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_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
+
+    // default values
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     psString query = pxDataGet("dettool_tonormalizedexp.sql");
@@ -4336,7 +2712,7 @@
     psFree(output);
 
-    // create a new detProcessedImfile object
-    detNormalizedExpRow *detRow = detNormalizedExpRowAlloc(
-        (psS32)atoll(det_id),
+    // insert the new row into the detProcessedImfile table
+    if (!detNormalizedExpInsert(config->dbh,
+        (psS64)atoll(det_id),
         iteration,
         recipe,
@@ -4351,14 +2727,8 @@
         path_base,
         code
-    );
-
-    // insert the new row into the detProcessedImfile table
-    if (!detNormalizedExpInsertObject(config->dbh, detRow)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(detRow);
-        return false;
-    }
-
-    psFree(detRow);
+    )) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
 
     return true;
@@ -4370,16 +2740,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = psStringCopy(
@@ -4433,14 +2794,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detNormalizedExp", !simple)) {
@@ -4455,101 +2806,4 @@
 }
 
-
-static  detNormalizedImfileRow *detNormalizedStatToDetNormalizedmfile(pxConfig *config, detNormalizedStatImfileRow *statImfile)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    PS_ASSERT_PTR_NON_NULL(statImfile, NULL);
-
-    bool status = false;
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-    // optional
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return 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;
-    }
-
-    // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    return detNormalizedImfileRowAlloc(
-        statImfile->det_id,
-        statImfile->iteration,
-        statImfile->class_id,
-        uri,
-        bg,
-        bg_stdev,
-        bg_mean_stdev,
-        user_1,
-        user_2,
-        user_3,
-        user_4,
-        user_5,
-        path_base,
-        code
-    );
-}
 
 
@@ -4590,10 +2844,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = pxDataGet("dettool_toresidimfile.sql");
@@ -4637,15 +2887,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");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detPendingResidImfile", !simple)) {
@@ -4665,174 +2904,38 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-        return false;
-    }
-
-    // defaults to 0
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        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, false, "-class_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 uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-    psF64 bg_skewness = psMetadataLookupF64(&status, config->args, "-bg_skewness");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_skewness");
-        return false;
-    }
-    psF64 bg_kurtosis = psMetadataLookupF64(&status, config->args, "-bg_kurtosis");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_kurtosis");
-        return false;
-    }
-    psF64 bin_stdev = psMetadataLookupF64(&status, config->args, "-bin_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bin_stdev");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", 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;
-    }
-
-    // optional
-    psF64 fringe_0 = psMetadataLookupF64(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-    psF64 fringe_1 = psMetadataLookupF64(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-    psF64 fringe_2 = psMetadataLookupF64(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF64 fringe_resid_0 = psMetadataLookupF64(&status, config->args, "-fringe_resid_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_0");
-        return false;
-    }
-    psF64 fringe_resid_1 = psMetadataLookupF64(&status, config->args, "-fringe_resid_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_1");
-        return false;
-    }
-    psF64 fringe_resid_2 = psMetadataLookupF64(&status, config->args, "-fringe_resid_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_2");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_skewness, config->args, "-bg_skewness", false, false);
+    PXOPT_LOOKUP_F64(bg_kurtosis, config->args, "-bg_kurtosis", false, false);
+    PXOPT_LOOKUP_F64(bin_stdev, config->args, "-bin_stdev", false, false);
+
+    PXOPT_LOOKUP_F64(fringe_0, config->args, "-fringe_0", false, false);
+    PXOPT_LOOKUP_F64(fringe_1, config->args, "-fringe_1", false, false);
+    PXOPT_LOOKUP_F64(fringe_2, config->args, "-fringe_2", false, false);
+    PXOPT_LOOKUP_F64(fringe_resid_0, config->args, "-fringe_resid_0", false, false);
+    PXOPT_LOOKUP_F64(fringe_resid_1, config->args, "-fringe_resid_1", false, false);
+    PXOPT_LOOKUP_F64(fringe_resid_2, config->args, "-fringe_resid_2", false, false);
+
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", 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;
-    }
-
-    // create a new detResidImfileRow and insert it
-    if (!detResidImfileInsert(
-            config->dbh,
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    if (!detResidImfileInsert(config->dbh,
             (psS64)atoll(det_id),
             iteration,
@@ -4868,21 +2971,12 @@
 }
 
+
 static bool residimfileMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    char *value = 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);
 
     // select detResidImfile.*
@@ -4905,5 +2999,8 @@
     // NOTE the above WHERE is completed with the following line:
 
+    char *value = NULL;
+
     // add the two required restrictions: detRun.state and detRun.mode
+    bool status;
     if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
         psStringAppend(&query, " detRun.state = '%s'", value);
@@ -4951,15 +3048,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");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "rawResidImfile", !simple)) {
@@ -5018,11 +3104,6 @@
     */
 
-
-    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);
 
     psString query = pxDataGet("dettool_toresidexp.sql");
@@ -5066,14 +3147,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detPendingResidExp", !simple)) {
@@ -5091,4 +3162,36 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
+
+    // optional
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_skewness, config->args, "-bg_skewness", false, false);
+    PXOPT_LOOKUP_F64(bg_kurtosis, config->args, "-bg_kurtosis", false, false);
+    PXOPT_LOOKUP_F64(bin_stdev, config->args, "-bin_stdev", false, false);
+
+    PXOPT_LOOKUP_F64(fringe_0, config->args, "-fringe_0", false, false);
+    PXOPT_LOOKUP_F64(fringe_1, config->args, "-fringe_1", false, false);
+    PXOPT_LOOKUP_F64(fringe_2, config->args, "-fringe_2", false, false);
+    PXOPT_LOOKUP_F64(fringe_resid_0, config->args, "-fringe_resid_0", false, false);
+    PXOPT_LOOKUP_F64(fringe_resid_1, config->args, "-fringe_resid_1", false, false);
+    PXOPT_LOOKUP_F64(fringe_resid_2, config->args, "-fringe_resid_2", false, false);
+
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
+
+    // default values
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+    PXOPT_LOOKUP_BOOL(reject, config->args, "-reject", false);
 
     /*
@@ -5099,17 +3202,4 @@
     */
 
-
-    // select detRun.det_id
-    // select detRun.iteration
-    // select detRun.det_type
-    // select detInputExp.exp_id
-    // select detInputExp.include
-    // by:
-    // find the current iteration bassed on det_id
-    // find all exp_ids in the current det_id/iteration from detInputExp
-    // compare to detInputExp.imfiles to derResidImfile by class_id
-    // and:
-    // detResidImfile.{det_id, iteration, exp_id} is not in detResidExp
-
     psString query = pxDataGet("dettool_toresidexp.sql");
     if (!query) {
@@ -5121,50 +3211,9 @@
         // build a query to search by det_id, iteration, exp_id
         psMetadata *where = psMetadataAlloc();
-        bool status = false;
-        psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-            return false;
-        }
-        if (!det_id) {
-            psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-            return false;
-        }
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", (psS64)atoll(det_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-
-        psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        // always set iteration
-        if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-            psFree(where);
-            psFree(query);
-            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");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        if (exp_id) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
+
+        PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+        PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+        PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
+
 
         // there's not
@@ -5195,212 +3244,10 @@
         return false;
     }
-
-    // start a transaction so it's all rows or nothing
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
-
-    for (long i = 0; i < psArrayLength(output); i++) {
-        psMetadata *row = output->data[i];
-        // convert metadata into a detResidExp object
-        detResidExpRow *residExp = mdToDetResidExp(config, row);
-        if (!residExp) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to convert metadata to detResidExp");
-            psFree(output);
-            return false;
-        }
-        // insert detResidExp object into the database
-        if (!detResidExpInsertObject(config->dbh, residExp)) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "database error");
-            psFree(residExp);
-            psFree(output);
-        }
-        psFree(residExp);
-    }
-
     psFree(output);
 
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-static detResidExpRow *mdToDetResidExp(pxConfig *config, psMetadata *row)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    PS_ASSERT_PTR_NON_NULL(row, NULL);
-
-    bool status = false;
-    // values from row
-    psS64 det_id = psMetadataLookupS64(&status, row, "det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for det_id");
-        return false;
-    }
-    //if (isnan(det_id)) {
-    //  psError(PS_ERR_UNKNOWN, true, "det_id is required");
-    //  return false;
-    //}
-    psS32 iteration = psMetadataLookupS32(&status, row, "iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for iteration");
-        return false;
-    }
-    psS64 exp_id = psMetadataLookupS64(&status, row, "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;
-    }
-
-    // values from config
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-    psF64 bg_skewness = psMetadataLookupF64(&status, config->args, "-bg_skewness");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_skewness");
-        return false;
-    }
-    psF64 bg_kurtosis = psMetadataLookupF64(&status, config->args, "-bg_kurtosis");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_kurtosis");
-        return false;
-    }
-    psF64 bin_stdev = psMetadataLookupF64(&status, config->args, "-bin_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bin_stdev");
-        return false;
-    }
-    // optional
-    psF64 fringe_0 = psMetadataLookupF64(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-    psF64 fringe_1 = psMetadataLookupF64(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-    psF64 fringe_2 = psMetadataLookupF64(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF64 fringe_resid_0 = psMetadataLookupF64(&status, config->args, "-fringe_resid_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_0");
-        return false;
-    }
-    psF64 fringe_resid_1 = psMetadataLookupF64(&status, config->args, "-fringe_resid_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_1");
-        return false;
-    }
-    psF64 fringe_resid_2 = psMetadataLookupF64(&status, config->args, "-fringe_resid_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_2");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    // optional
-    bool reject = psMetadataLookupBool(&status, config->args, "-reject");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reject");
-        return false;
-    }
-    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;
-    }
-    if (!path_base) {
-        psError(PS_ERR_UNKNOWN, true, "-path_base is required");
-        return 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;
-    }
-
-    // create a new detResidImfileRow and insert it
-    return detResidExpRowAlloc(
-            det_id,
+    if (!detResidExpInsert(config->dbh,
+            (psS64)atoll(det_id),
             iteration,
-            exp_id,
+            (psS64)atoll(exp_id),
             recipe,
             bg,
@@ -5424,5 +3271,10 @@
             !reject,
             code
-        );
+        )) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
 }
 
@@ -5431,16 +3283,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = psStringCopy(
@@ -5497,14 +3340,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detResidExp", !simple)) {
@@ -5556,10 +3389,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     /* which returns a list of detrend runs (with detrend id, iteration and
@@ -5607,14 +3436,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detRejectExp", !simple)) {
@@ -5633,45 +3452,11 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(reject, config->args, "-reject", false);
+
     // build a query to search by det_id, iteration, exp_id
     psMetadata *where = psMetadataAlloc();
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        psFree(where);
-        return false;
-    }
-    if (det_id) {
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "det_id", 0, "==", det_id)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-            psFree(where);
-            return false;
-        }
-    }
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        psFree(where);
-        return false;
-    }
-    // always where iteration
-    if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-        psFree(where);
-        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");
-        psFree(where);
-        return false;
-    }
-    if (exp_id) {
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
+    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
 
     // find the values we're going to set
@@ -5679,91 +3464,12 @@
     // remove the '-' prefix
     psMetadata *set = psMetadataAlloc();
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (recipe) {
-        if (!psMetadataAddStr(set, PS_LIST_TAIL, "recipe", 0, "==", recipe)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (!isnan(bg)) {
-        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg", 0, "==", bg)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (!isnan(bg_stdev)) {
-        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg_stdev", 0, "==", bg_stdev)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (!isnan(bg_mean_stdev)) {
-        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg_mean_stdev", 0, "==", bg_mean_stdev)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (path_base) {
-        if (!psMetadataAddStr(set, PS_LIST_TAIL, "path_base", 0, "==", path_base)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    bool reject = psMetadataLookupBool(&status, config->args, "-reject");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reject");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
+    // XXX if PXOPT_COPY_* errors here the where md will leak
+    PXOPT_COPY_STR(config->args, set, "-recip", "recipe", "==");
+    PXOPT_COPY_F64(config->args, set, "-bg", "bg", "==");
+    PXOPT_COPY_F64(config->args, set, "-bg_stdev", "bg_stdev", "==");
+    PXOPT_COPY_F64(config->args, set, "-bg_mean_stdev", "bg_mean_stdev", "==");
+    PXOPT_COPY_STR(config->args, set, "-path_base", "path_base", "==");
+
+    // this can't be PXOPT_ macro-ized as reject is !'d
     if (!psMetadataAddBool(set, PS_LIST_TAIL, "accept", 0, "==", !reject)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
@@ -5790,21 +3496,8 @@
 
     // required
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
 
     // optional
-    bool again = psMetadataLookupBool(&status, config->args, "-again");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -again");
-        return false;
-    }
+    PXOPT_LOOKUP_BOOL(again, config->args, "-again", false);
 
     psString query = pxDataGet("dettool_find_completed_runs.sql");
@@ -5814,31 +3507,10 @@
     }
 
+    // build a query to search by det_id, iteration, exp_id
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+
     {
-        // build a query to search by det_id, iteration, exp_id
-        psMetadata *where = psMetadataAlloc();
-        bool status = false;
-        if (det_id) {
-            if (!psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", (psS64)atoll(det_id))) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
-        psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        // always set iteration
-        if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-
         // there's not
         psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
@@ -5946,40 +3618,11 @@
     }
 
-    // from config->args
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return NULL;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return NULL;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return NULL;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return NULL;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return NULL;
-    }
     // optional
-    bool accept = psMetadataLookupBool(&status, config->args, "-accept");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -accept");
-        return NULL;
-    }
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", 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_BOOL(accept, config->args, "-accept", false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     return detRunSummaryRowAlloc(
@@ -5998,16 +3641,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    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);
 
     psString query = psStringCopy(
@@ -6062,14 +3696,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "rawDetrendImfile", !simple)) {
@@ -6124,25 +3748,9 @@
     // XXX this isn't strictly nessicary but not having the det_id complicates
     // incrementing the iteration number
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+
+    PXOPT_LOOKUP_BOOL(again, config->args, "-again", false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", false, false);
     // either -rerun or -state must be specified
-    bool again = psMetadataLookupBool(&status, config->args, "-again");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -again");
-        return false;
-    }
-    psString state = psMetadataLookupStr(&status, config->args, "-state");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -state");
-        return false;
-    }
     if (!(again || state)) {
         psError(PS_ERR_UNKNOWN, true, "either -again or -state must be specified");
@@ -6283,14 +3891,5 @@
 
     // det_id is required
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
 
     // we have to support multipe exp_ids
@@ -6443,202 +4042,34 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    bool status = false;
-    psString det_type = psMetadataLookupStr(&status, config->args, "-det_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_type");
-        return false;
-    }
-    if (!det_type) {
-        psError(PS_ERR_UNKNOWN, true, "-det_type is required");
-        return false;
-    }
-
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
-        return false;
-    }
-    if (!filelevel) {
-        psError(PS_ERR_UNKNOWN, true, "-filelevel is required");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-
-    psString exp_type = psMetadataLookupStr(&status, config->args, "-exp_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_type");
-        return false;
-    }
-
-    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
-        return false;
-    }
-
-    psF32 airmass_min = psMetadataLookupF32(&status, config->args, "-airmass_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_min");
-        return false;
-    }
-
-    psF32 airmass_max = psMetadataLookupF32(&status, config->args, "-airmass_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_max");
-        return false;
-    }
-
-    psF32 exp_time_min = psMetadataLookupF32(&status, config->args, "-exp_time_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_min");
-        return false;
-    }
-
-    psF32 exp_time_max = psMetadataLookupF32(&status, config->args, "-exp_time_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_max");
-        return false;
-    }
-
-    psF32 ccd_temp_min = psMetadataLookupF32(&status, config->args, "-ccd_temp_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_min");
-        return false;
-    }
-
-    psF32 ccd_temp_max = psMetadataLookupF32(&status, config->args, "-ccd_temp_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_max");
-        return false;
-    }
-
-    psF64 posang_min = psMetadataLookupF32(&status, config->args, "-posang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_min");
-        return false;
-    }
-
-    psF64 posang_max = psMetadataLookupF32(&status, config->args, "-posang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_max");
-        return false;
-    }
-
-    psF64 solang_min = psMetadataLookupF32(&status, config->args, "-solang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_min");
-        return false;
-    }
-
-    psF64 solang_max = psMetadataLookupF32(&status, config->args, "-solang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_max");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-        } else {
-            registered = NULL;
-        }
-    }
-
-    psTime *time_begin = NULL;
-    {
-        psString time_beginStr = psMetadataLookupStr(&status, config->args, "-time_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_beginStr) {
-            time_begin = psTimeFromISO(time_beginStr, PS_TIME_UTC);
-        } else {
-            time_begin = NULL;
-        }
-    }
-
-    psTime *time_end = NULL;
-    {
-        psString time_endStr = psMetadataLookupStr(&status, config->args, "-time_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_endStr) {
-            time_end = psTimeFromISO(time_endStr, PS_TIME_UTC);
-        } else {
-            time_end = NULL;
-        }
-    }
-
-    psTime *use_begin = NULL;
-    {
-        psString use_beginStr = psMetadataLookupStr(&status, config->args, "-use_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_beginStr) {
-            use_begin = psTimeFromISO(use_beginStr, PS_TIME_UTC);
-        } else {
-            use_begin = NULL;
-        }
-    }
-
-    psTime *use_end = NULL;
-    {
-        psString use_endStr = psMetadataLookupStr(&status, config->args, "-use_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_endStr) {
-            use_end = psTimeFromISO(use_endStr, PS_TIME_UTC);
-        } else {
-            use_end = NULL;
-        }
-    }
-
-    psString parent = psMetadataLookupStr(&status, config->args, "-parent");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -parent");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false);
+    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", false, false);
+
+    // optional
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", false, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", false, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
+    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
+    PXOPT_LOOKUP_F32(airmass_min, config->args, "-airmass_min", false, false);
+    PXOPT_LOOKUP_F32(airmass_max, config->args, "-airmass_max", false, false);
+    PXOPT_LOOKUP_F32(exp_time_min, config->args, "-exp_time_min", false, false);
+    PXOPT_LOOKUP_F32(exp_time_max, config->args, "-exp_time_max", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_min, config->args, "-ccd_temp_min", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_max, config->args, "-ccd_temp_max", false, false);
+    PXOPT_LOOKUP_F64(posang_min, config->args, "-posang_min", false, false);
+    PXOPT_LOOKUP_F64(posang_max, config->args, "-posang_max", false, false);
+    PXOPT_LOOKUP_F64(solang_min, config->args, "-solang_min", false, false);
+    PXOPT_LOOKUP_F64(solang_max, config->args, "-solang_max", false, false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_TIME(time_begin, config->args, "-time_begin", false, false);
+    PXOPT_LOOKUP_TIME(time_end, config->args, "-time_end", false, false);
+    PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
+    PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
+    PXOPT_LOOKUP_STR(parent, config->args, "-parent", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+
+    // default
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     if (!psDBTransaction(config->dbh)) {
@@ -6683,8 +4114,6 @@
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
-        psFree(registered);
-        return false;
-    }
-    psFree(registered);
+        return false;
+    }
 
     // print the new detRun
@@ -6719,14 +4148,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;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, detRuns, "detRun", !simple)) {
@@ -6744,103 +4163,36 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_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;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-
-    // everything else is optional
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    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;
-    }
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+
+    // optional
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
 
     if (!detRegisteredImfileInsert(config->dbh,
-                                   (psS64)atoll(det_id),
-                                   0,  // the iteration is fixed at 0
-                                   class_id,
-                                   uri,
-                                   bg,
-                                   bg_stdev,
-                                   bg_mean_stdev,
-                                   user_1,
-                                   user_2,
-                                   user_3,
-                                   user_4,
-                                   user_5,
-                                   path_base,
-                                   0       // fault code
-            )) {
+        (psS64)atoll(det_id),
+        0,  // the iteration is fixed at 0
+        class_id,
+        uri,
+        bg,
+        bg_stdev,
+        bg_mean_stdev,
+        user_1,
+        user_2,
+        user_3,
+        user_4,
+        user_5,
+        path_base,
+        0       // fault code
+    )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
