Index: trunk/ippdb/src/ippdb.c
===================================================================
--- trunk/ippdb/src/ippdb.c	(revision 18796)
+++ trunk/ippdb/src/ippdb.c	(revision 20205)
@@ -82,6 +82,8 @@
 #define CALRUN_TABLE_NAME "calRun"
 #define FLATCORRRUN_TABLE_NAME "flatcorrRun"
-#define FLATCORREXP_TABLE_NAME "flatcorrExp"
+#define FLATCORRCHIPLINK_TABLE_NAME "flatcorrChipLink"
+#define FLATCORRCAMLINK_TABLE_NAME "flatcorrCamLink"
 #define PSTAMPDATASTORE_TABLE_NAME "pstampDataStore"
+#define PSTAMPPROJECT_TABLE_NAME "pstampProject"
 #define PSTAMPREQUEST_TABLE_NAME "pstampRequest"
 #define PSTAMPJOB_TABLE_NAME "pstampJob"
@@ -3230,5 +3232,5 @@
 static void rawExpRowFree(rawExpRow *object);
 
-rawExpRow *rawExpRowAlloc(psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, const char *filelevel, const char *workdir, const char *reduction, const char *dvodb, const char *tess_id, const char *end_stage, const char *filter, const char *comment, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF32 m1_x, psF32 m1_y, psF32 m1_z, psF32 m1_tip, psF32 m1_tilt, psF32 m2_x, psF32 m2_y, psF32 m2_z, psF32 m2_tip, psF32 m2_tilt, psF32 env_temperature, psF32 env_humidity, psF32 env_wind_speed, psF32 env_wind_dir, psF32 teltemp_m1, psF32 teltemp_m1cell, psF32 teltemp_m2, psF32 teltemp_spider, psF32 teltemp_truss, psF32 teltemp_extra, psF32 pon_time, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, const char *hostname, psS16 fault, psTime* epoch)
+rawExpRow *rawExpRowAlloc(psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, const char *filelevel, const char *workdir, const char *reduction, const char *dvodb, const char *tess_id, const char *end_stage, const char *filter, const char *comment, const char *obs_mode, const char *obs_group, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF32 m1_x, psF32 m1_y, psF32 m1_z, psF32 m1_tip, psF32 m1_tilt, psF32 m2_x, psF32 m2_y, psF32 m2_z, psF32 m2_tip, psF32 m2_tilt, psF32 env_temperature, psF32 env_humidity, psF32 env_wind_speed, psF32 env_wind_dir, psF32 teltemp_m1, psF32 teltemp_m1cell, psF32 teltemp_m2, psF32 teltemp_spider, psF32 teltemp_truss, psF32 teltemp_extra, psF32 pon_time, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 sun_angle, psF32 sun_alt, psF32 moon_angle, psF32 moon_alt, psF32 moon_phase, const char *hostname, psS16 fault, psTime* epoch)
 {
     rawExpRow       *_object;
@@ -3252,4 +3254,6 @@
     _object->filter = psStringCopy(filter);
     _object->comment = psStringCopy(comment);
+    _object->obs_mode = psStringCopy(obs_mode);
+    _object->obs_group = psStringCopy(obs_group);
     _object->airmass = airmass;
     _object->ra = ra;
@@ -3291,5 +3295,9 @@
     _object->user_5 = user_5;
     _object->object = psStringCopy(object);
-    _object->solang = solang;
+    _object->sun_angle = sun_angle;
+    _object->sun_alt = sun_alt;
+    _object->moon_angle = moon_angle;
+    _object->moon_alt = moon_alt;
+    _object->moon_phase = moon_phase;
     _object->hostname = psStringCopy(hostname);
     _object->fault = fault;
@@ -3315,4 +3323,6 @@
     psFree(object->filter);
     psFree(object->comment);
+    psFree(object->obs_mode);
+    psFree(object->obs_group);
     psFree(object->object);
     psFree(object->hostname);
@@ -3398,4 +3408,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, "data usage goal (eg, survey name, engineering, etc)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, "identifier for data block (eg, observation sequence)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
@@ -3593,6 +3613,26 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "solang", PS_DATA_F32, NULL, 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
         psFree(md);
         return false;
@@ -3626,5 +3666,5 @@
 }
 
-bool rawExpInsert(psDB * dbh, psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, const char *filelevel, const char *workdir, const char *reduction, const char *dvodb, const char *tess_id, const char *end_stage, const char *filter, const char *comment, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF32 m1_x, psF32 m1_y, psF32 m1_z, psF32 m1_tip, psF32 m1_tilt, psF32 m2_x, psF32 m2_y, psF32 m2_z, psF32 m2_tip, psF32 m2_tilt, psF32 env_temperature, psF32 env_humidity, psF32 env_wind_speed, psF32 env_wind_dir, psF32 teltemp_m1, psF32 teltemp_m1cell, psF32 teltemp_m2, psF32 teltemp_spider, psF32 teltemp_truss, psF32 teltemp_extra, psF32 pon_time, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, const char *hostname, psS16 fault, psTime* epoch)
+bool rawExpInsert(psDB * dbh, psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, const char *filelevel, const char *workdir, const char *reduction, const char *dvodb, const char *tess_id, const char *end_stage, const char *filter, const char *comment, const char *obs_mode, const char *obs_group, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF32 m1_x, psF32 m1_y, psF32 m1_z, psF32 m1_tip, psF32 m1_tilt, psF32 m2_x, psF32 m2_y, psF32 m2_z, psF32 m2_tip, psF32 m2_tilt, psF32 env_temperature, psF32 env_humidity, psF32 env_wind_speed, psF32 env_wind_dir, psF32 teltemp_m1, psF32 teltemp_m1cell, psF32 teltemp_m2, psF32 teltemp_spider, psF32 teltemp_truss, psF32 teltemp_extra, psF32 pon_time, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 sun_angle, psF32 sun_alt, psF32 moon_angle, psF32 moon_alt, psF32 moon_phase, const char *hostname, psS16 fault, psTime* epoch)
 {
     psMetadata *md = psMetadataAlloc();
@@ -3704,4 +3744,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, NULL, obs_mode)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, NULL, obs_group)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, airmass)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
@@ -3899,6 +3949,26 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "solang", PS_DATA_F32, NULL, solang)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, sun_angle)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, sun_alt)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, moon_angle)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, moon_alt)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, moon_phase)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
         psFree(md);
         return false;
@@ -3942,5 +4012,5 @@
 bool rawExpInsertObject(psDB *dbh, rawExpRow *object)
 {
-    return rawExpInsert(dbh, object->exp_id, object->exp_name, object->camera, object->telescope, object->dateobs, object->exp_tag, object->exp_type, object->filelevel, object->workdir, object->reduction, object->dvodb, object->tess_id, object->end_stage, object->filter, object->comment, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->m1_x, object->m1_y, object->m1_z, object->m1_tip, object->m1_tilt, object->m2_x, object->m2_y, object->m2_z, object->m2_tip, object->m2_tilt, object->env_temperature, object->env_humidity, object->env_wind_speed, object->env_wind_dir, object->teltemp_m1, object->teltemp_m1cell, object->teltemp_m2, object->teltemp_spider, object->teltemp_truss, object->teltemp_extra, object->pon_time, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->solang, object->hostname, object->fault, object->epoch);
+    return rawExpInsert(dbh, object->exp_id, object->exp_name, object->camera, object->telescope, object->dateobs, object->exp_tag, object->exp_type, object->filelevel, object->workdir, object->reduction, object->dvodb, object->tess_id, object->end_stage, object->filter, object->comment, object->obs_mode, object->obs_group, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->m1_x, object->m1_y, object->m1_z, object->m1_tip, object->m1_tilt, object->m2_x, object->m2_y, object->m2_z, object->m2_tip, object->m2_tilt, object->env_temperature, object->env_humidity, object->env_wind_speed, object->env_wind_dir, object->teltemp_m1, object->teltemp_m1cell, object->teltemp_m2, object->teltemp_spider, object->teltemp_truss, object->teltemp_extra, object->pon_time, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->sun_angle, object->sun_alt, object->moon_angle, object->moon_alt, object->moon_phase, object->hostname, object->fault, object->epoch);
 }
 
@@ -4090,4 +4160,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, NULL, object->obs_mode)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, NULL, object->obs_group)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, object->airmass)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
@@ -4285,6 +4365,26 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "solang", PS_DATA_F32, NULL, object->solang)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, object->sun_angle)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, object->sun_alt)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, object->moon_angle)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, object->moon_alt)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, object->moon_phase)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
         psFree(md);
         return false;
@@ -4389,4 +4489,14 @@
         return false;
     }
+    char* obs_mode = psMetadataLookupPtr(&status, md, "obs_mode");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item obs_mode");
+        return false;
+    }
+    char* obs_group = psMetadataLookupPtr(&status, md, "obs_group");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item obs_group");
+        return false;
+    }
     psF32 airmass = psMetadataLookupF32(&status, md, "airmass");
     if (!status) {
@@ -4584,7 +4694,27 @@
         return false;
     }
-    psF32 solang = psMetadataLookupF32(&status, md, "solang");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item solang");
+    psF32 sun_angle = psMetadataLookupF32(&status, md, "sun_angle");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sun_angle");
+        return false;
+    }
+    psF32 sun_alt = psMetadataLookupF32(&status, md, "sun_alt");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sun_alt");
+        return false;
+    }
+    psF32 moon_angle = psMetadataLookupF32(&status, md, "moon_angle");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_angle");
+        return false;
+    }
+    psF32 moon_alt = psMetadataLookupF32(&status, md, "moon_alt");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_alt");
+        return false;
+    }
+    psF32 moon_phase = psMetadataLookupF32(&status, md, "moon_phase");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_phase");
         return false;
     }
@@ -4605,5 +4735,5 @@
     }
 
-    return rawExpRowAlloc(exp_id, exp_name, camera, telescope, dateobs, exp_tag, exp_type, filelevel, workdir, reduction, dvodb, tess_id, end_stage, filter, comment, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, m1_x, m1_y, m1_z, m1_tip, m1_tilt, m2_x, m2_y, m2_z, m2_tip, m2_tilt, env_temperature, env_humidity, env_wind_speed, env_wind_dir, teltemp_m1, teltemp_m1cell, teltemp_m2, teltemp_spider, teltemp_truss, teltemp_extra, pon_time, user_1, user_2, user_3, user_4, user_5, object, solang, hostname, fault, epoch);
+    return rawExpRowAlloc(exp_id, exp_name, camera, telescope, dateobs, exp_tag, exp_type, filelevel, workdir, reduction, dvodb, tess_id, end_stage, filter, comment, obs_mode, obs_group, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, m1_x, m1_y, m1_z, m1_tip, m1_tilt, m2_x, m2_y, m2_z, m2_tip, m2_tilt, env_temperature, env_humidity, env_wind_speed, env_wind_dir, teltemp_m1, teltemp_m1cell, teltemp_m2, teltemp_spider, teltemp_truss, teltemp_extra, pon_time, user_1, user_2, user_3, user_4, user_5, object, sun_angle, sun_alt, moon_angle, moon_alt, moon_phase, hostname, fault, epoch);
 }
 psArray *rawExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -4723,5 +4853,5 @@
 static void rawImfileRowFree(rawImfileRow *object);
 
-rawImfileRow *rawImfileRowAlloc(psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *tmp_class_id, const char *class_id, const char *uri, const char *exp_type, const char *filelevel, const char *filter, const char *comment, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF32 m1_x, psF32 m1_y, psF32 m1_z, psF32 m1_tip, psF32 m1_tilt, psF32 m2_x, psF32 m2_y, psF32 m2_z, psF32 m2_tip, psF32 m2_tilt, psF32 env_temperature, psF32 env_humidity, psF32 env_wind_speed, psF32 env_wind_dir, psF32 teltemp_m1, psF32 teltemp_m1cell, psF32 teltemp_m2, psF32 teltemp_spider, psF32 teltemp_truss, psF32 teltemp_extra, psF32 pon_time, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, const char *hostname, psS16 fault, psTime* epoch)
+rawImfileRow *rawImfileRowAlloc(psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *tmp_class_id, const char *class_id, const char *uri, const char *exp_type, const char *filelevel, const char *filter, const char *comment, const char *obs_mode, const char *obs_group, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF32 m1_x, psF32 m1_y, psF32 m1_z, psF32 m1_tip, psF32 m1_tilt, psF32 m2_x, psF32 m2_y, psF32 m2_z, psF32 m2_tip, psF32 m2_tilt, psF32 env_temperature, psF32 env_humidity, psF32 env_wind_speed, psF32 env_wind_dir, psF32 teltemp_m1, psF32 teltemp_m1cell, psF32 teltemp_m2, psF32 teltemp_spider, psF32 teltemp_truss, psF32 teltemp_extra, psF32 pon_time, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 sun_angle, psF32 sun_alt, psF32 moon_angle, psF32 moon_alt, psF32 moon_phase, const char *hostname, psS16 fault, psTime* epoch)
 {
     rawImfileRow    *_object;
@@ -4742,4 +4872,6 @@
     _object->filter = psStringCopy(filter);
     _object->comment = psStringCopy(comment);
+    _object->obs_mode = psStringCopy(obs_mode);
+    _object->obs_group = psStringCopy(obs_group);
     _object->airmass = airmass;
     _object->ra = ra;
@@ -4781,4 +4913,9 @@
     _object->user_5 = user_5;
     _object->object = psStringCopy(object);
+    _object->sun_angle = sun_angle;
+    _object->sun_alt = sun_alt;
+    _object->moon_angle = moon_angle;
+    _object->moon_alt = moon_alt;
+    _object->moon_phase = moon_phase;
     _object->hostname = psStringCopy(hostname);
     _object->fault = fault;
@@ -4801,4 +4938,6 @@
     psFree(object->filter);
     psFree(object->comment);
+    psFree(object->obs_mode);
+    psFree(object->obs_group);
     psFree(object->object);
     psFree(object->hostname);
@@ -4869,4 +5008,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, "data usage goal (eg, survey name, engineering, etc)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, "identifier for data block (eg, observation sequence)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
@@ -5064,4 +5213,29 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -5092,5 +5266,5 @@
 }
 
-bool rawImfileInsert(psDB * dbh, psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *tmp_class_id, const char *class_id, const char *uri, const char *exp_type, const char *filelevel, const char *filter, const char *comment, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF32 m1_x, psF32 m1_y, psF32 m1_z, psF32 m1_tip, psF32 m1_tilt, psF32 m2_x, psF32 m2_y, psF32 m2_z, psF32 m2_tip, psF32 m2_tilt, psF32 env_temperature, psF32 env_humidity, psF32 env_wind_speed, psF32 env_wind_dir, psF32 teltemp_m1, psF32 teltemp_m1cell, psF32 teltemp_m2, psF32 teltemp_spider, psF32 teltemp_truss, psF32 teltemp_extra, psF32 pon_time, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, const char *hostname, psS16 fault, psTime* epoch)
+bool rawImfileInsert(psDB * dbh, psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *tmp_class_id, const char *class_id, const char *uri, const char *exp_type, const char *filelevel, const char *filter, const char *comment, const char *obs_mode, const char *obs_group, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF32 m1_x, psF32 m1_y, psF32 m1_z, psF32 m1_tip, psF32 m1_tilt, psF32 m2_x, psF32 m2_y, psF32 m2_z, psF32 m2_tip, psF32 m2_tilt, psF32 env_temperature, psF32 env_humidity, psF32 env_wind_speed, psF32 env_wind_dir, psF32 teltemp_m1, psF32 teltemp_m1cell, psF32 teltemp_m2, psF32 teltemp_spider, psF32 teltemp_truss, psF32 teltemp_extra, psF32 pon_time, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 sun_angle, psF32 sun_alt, psF32 moon_angle, psF32 moon_alt, psF32 moon_phase, const char *hostname, psS16 fault, psTime* epoch)
 {
     psMetadata *md = psMetadataAlloc();
@@ -5155,4 +5329,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, NULL, obs_mode)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, NULL, obs_group)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, airmass)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
@@ -5347,4 +5531,29 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "object", PS_DATA_STRING, NULL, object)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item object");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, sun_angle)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, sun_alt)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, moon_angle)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, moon_alt)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, moon_phase)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
         psFree(md);
         return false;
@@ -5388,5 +5597,5 @@
 bool rawImfileInsertObject(psDB *dbh, rawImfileRow *object)
 {
-    return rawImfileInsert(dbh, object->exp_id, object->exp_name, object->camera, object->telescope, object->dateobs, object->tmp_class_id, object->class_id, object->uri, object->exp_type, object->filelevel, object->filter, object->comment, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->m1_x, object->m1_y, object->m1_z, object->m1_tip, object->m1_tilt, object->m2_x, object->m2_y, object->m2_z, object->m2_tip, object->m2_tilt, object->env_temperature, object->env_humidity, object->env_wind_speed, object->env_wind_dir, object->teltemp_m1, object->teltemp_m1cell, object->teltemp_m2, object->teltemp_spider, object->teltemp_truss, object->teltemp_extra, object->pon_time, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->hostname, object->fault, object->epoch);
+    return rawImfileInsert(dbh, object->exp_id, object->exp_name, object->camera, object->telescope, object->dateobs, object->tmp_class_id, object->class_id, object->uri, object->exp_type, object->filelevel, object->filter, object->comment, object->obs_mode, object->obs_group, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->m1_x, object->m1_y, object->m1_z, object->m1_tip, object->m1_tilt, object->m2_x, object->m2_y, object->m2_z, object->m2_tip, object->m2_tilt, object->env_temperature, object->env_humidity, object->env_wind_speed, object->env_wind_dir, object->teltemp_m1, object->teltemp_m1cell, object->teltemp_m2, object->teltemp_spider, object->teltemp_truss, object->teltemp_extra, object->pon_time, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->sun_angle, object->sun_alt, object->moon_angle, object->moon_alt, object->moon_phase, object->hostname, object->fault, object->epoch);
 }
 
@@ -5521,4 +5730,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, NULL, object->obs_mode)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, NULL, object->obs_group)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, object->airmass)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
@@ -5716,4 +5935,29 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, object->sun_angle)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, object->sun_alt)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, object->moon_angle)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, object->moon_alt)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, object->moon_phase)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -5800,4 +6044,14 @@
         return false;
     }
+    char* obs_mode = psMetadataLookupPtr(&status, md, "obs_mode");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item obs_mode");
+        return false;
+    }
+    char* obs_group = psMetadataLookupPtr(&status, md, "obs_group");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item obs_group");
+        return false;
+    }
     psF32 airmass = psMetadataLookupF32(&status, md, "airmass");
     if (!status) {
@@ -5995,4 +6249,29 @@
         return false;
     }
+    psF32 sun_angle = psMetadataLookupF32(&status, md, "sun_angle");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sun_angle");
+        return false;
+    }
+    psF32 sun_alt = psMetadataLookupF32(&status, md, "sun_alt");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sun_alt");
+        return false;
+    }
+    psF32 moon_angle = psMetadataLookupF32(&status, md, "moon_angle");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_angle");
+        return false;
+    }
+    psF32 moon_alt = psMetadataLookupF32(&status, md, "moon_alt");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_alt");
+        return false;
+    }
+    psF32 moon_phase = psMetadataLookupF32(&status, md, "moon_phase");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_phase");
+        return false;
+    }
     char* hostname = psMetadataLookupPtr(&status, md, "hostname");
     if (!status) {
@@ -6011,5 +6290,5 @@
     }
 
-    return rawImfileRowAlloc(exp_id, exp_name, camera, telescope, dateobs, tmp_class_id, class_id, uri, exp_type, filelevel, filter, comment, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, m1_x, m1_y, m1_z, m1_tip, m1_tilt, m2_x, m2_y, m2_z, m2_tip, m2_tilt, env_temperature, env_humidity, env_wind_speed, env_wind_dir, teltemp_m1, teltemp_m1cell, teltemp_m2, teltemp_spider, teltemp_truss, teltemp_extra, pon_time, user_1, user_2, user_3, user_4, user_5, object, hostname, fault, epoch);
+    return rawImfileRowAlloc(exp_id, exp_name, camera, telescope, dateobs, tmp_class_id, class_id, uri, exp_type, filelevel, filter, comment, obs_mode, obs_group, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, m1_x, m1_y, m1_z, m1_tip, m1_tilt, m2_x, m2_y, m2_z, m2_tip, m2_tilt, env_temperature, env_humidity, env_wind_speed, env_wind_dir, teltemp_m1, teltemp_m1cell, teltemp_m2, teltemp_spider, teltemp_truss, teltemp_extra, pon_time, user_1, user_2, user_3, user_4, user_5, object, sun_angle, sun_alt, moon_angle, moon_alt, moon_phase, hostname, fault, epoch);
 }
 psArray *rawImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -6949,5 +7228,5 @@
 static void chipProcessedImfileRowFree(chipProcessedImfileRow *object);
 
-chipProcessedImfileRow *chipProcessedImfileRowAlloc(psS64 chip_id, psS64 exp_id, const char *class_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm_major, psF32 fwhm_minor, psF32 dtime_detrend, psF32 dtime_photom, psF32 dtime_astrom, const char *hostname, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
+chipProcessedImfileRow *chipProcessedImfileRowAlloc(psS64 chip_id, psS64 exp_id, const char *class_id, const char *data_state, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 ap_resid, psF32 ap_resid_stdev, psF32 fwhm_major, psF32 fwhm_minor, psF32 iq_m2, psF32 iq_m2_err, psF32 iq_m2_lq, psF32 iq_m2_uq, psF32 iq_m2c, psF32 iq_m2c_err, psF32 iq_m2c_lq, psF32 iq_m2c_uq, psF32 iq_m2s, psF32 iq_m2s_err, psF32 iq_m2s_lq, psF32 iq_m2s_uq, psF32 iq_m3, psF32 iq_m3_err, psF32 iq_m3_lq, psF32 iq_m3_uq, psF32 iq_m4, psF32 iq_m4_err, psF32 iq_m4_lq, psF32 iq_m4_uq, psF32 dtime_detrend, psF32 dtime_photom, psF32 dtime_total, psF32 dtime_script, const char *hostname, psS32 n_stars, psS32 n_psfstars, psS32 n_iqstars, psS32 n_extended, psS32 n_cr, const char *path_base, psS16 fault)
 {
     chipProcessedImfileRow *_object;
@@ -6959,4 +7238,5 @@
     _object->exp_id = exp_id;
     _object->class_id = psStringCopy(class_id);
+    _object->data_state = psStringCopy(data_state);
     _object->uri = psStringCopy(uri);
     _object->bg = bg;
@@ -6968,20 +7248,38 @@
     _object->fringe_1 = fringe_1;
     _object->fringe_2 = fringe_2;
-    _object->sigma_ra = sigma_ra;
-    _object->sigma_dec = sigma_dec;
     _object->ap_resid = ap_resid;
     _object->ap_resid_stdev = ap_resid_stdev;
-    _object->zp_mean = zp_mean;
-    _object->zp_stdev = zp_stdev;
     _object->fwhm_major = fwhm_major;
     _object->fwhm_minor = fwhm_minor;
+    _object->iq_m2 = iq_m2;
+    _object->iq_m2_err = iq_m2_err;
+    _object->iq_m2_lq = iq_m2_lq;
+    _object->iq_m2_uq = iq_m2_uq;
+    _object->iq_m2c = iq_m2c;
+    _object->iq_m2c_err = iq_m2c_err;
+    _object->iq_m2c_lq = iq_m2c_lq;
+    _object->iq_m2c_uq = iq_m2c_uq;
+    _object->iq_m2s = iq_m2s;
+    _object->iq_m2s_err = iq_m2s_err;
+    _object->iq_m2s_lq = iq_m2s_lq;
+    _object->iq_m2s_uq = iq_m2s_uq;
+    _object->iq_m3 = iq_m3;
+    _object->iq_m3_err = iq_m3_err;
+    _object->iq_m3_lq = iq_m3_lq;
+    _object->iq_m3_uq = iq_m3_uq;
+    _object->iq_m4 = iq_m4;
+    _object->iq_m4_err = iq_m4_err;
+    _object->iq_m4_lq = iq_m4_lq;
+    _object->iq_m4_uq = iq_m4_uq;
     _object->dtime_detrend = dtime_detrend;
     _object->dtime_photom = dtime_photom;
-    _object->dtime_astrom = dtime_astrom;
+    _object->dtime_total = dtime_total;
+    _object->dtime_script = dtime_script;
     _object->hostname = psStringCopy(hostname);
     _object->n_stars = n_stars;
+    _object->n_psfstars = n_psfstars;
+    _object->n_iqstars = n_iqstars;
     _object->n_extended = n_extended;
     _object->n_cr = n_cr;
-    _object->n_astrom = n_astrom;
     _object->path_base = psStringCopy(path_base);
     _object->fault = fault;
@@ -6993,4 +7291,5 @@
 {
     psFree(object->class_id);
+    psFree(object->data_state);
     psFree(object->uri);
     psFree(object->hostname);
@@ -7016,4 +7315,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "Key", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
@@ -7061,14 +7365,4 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_ra", PS_DATA_F32, NULL, 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_dec", PS_DATA_F32, NULL, 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "ap_resid", PS_DATA_F32, NULL, 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item ap_resid");
@@ -7081,14 +7375,4 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_mean", PS_DATA_F32, NULL, 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item zp_mean");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_stdev", PS_DATA_F32, NULL, 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item zp_stdev");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm_major", PS_DATA_F32, NULL, 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fwhm_major");
@@ -7101,4 +7385,104 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
@@ -7111,6 +7495,11 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_astrom", PS_DATA_F32, NULL, 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_astrom");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_total", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_total");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
         psFree(md);
         return false;
@@ -7126,4 +7515,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
@@ -7136,9 +7535,4 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_astrom", PS_DATA_S32, NULL, 0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item n_astrom");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, "255")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
@@ -7164,5 +7558,5 @@
 }
 
-bool chipProcessedImfileInsert(psDB * dbh, psS64 chip_id, psS64 exp_id, const char *class_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm_major, psF32 fwhm_minor, psF32 dtime_detrend, psF32 dtime_photom, psF32 dtime_astrom, const char *hostname, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
+bool chipProcessedImfileInsert(psDB * dbh, psS64 chip_id, psS64 exp_id, const char *class_id, const char *data_state, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 ap_resid, psF32 ap_resid_stdev, psF32 fwhm_major, psF32 fwhm_minor, psF32 iq_m2, psF32 iq_m2_err, psF32 iq_m2_lq, psF32 iq_m2_uq, psF32 iq_m2c, psF32 iq_m2c_err, psF32 iq_m2c_lq, psF32 iq_m2c_uq, psF32 iq_m2s, psF32 iq_m2s_err, psF32 iq_m2s_lq, psF32 iq_m2s_uq, psF32 iq_m3, psF32 iq_m3_err, psF32 iq_m3_lq, psF32 iq_m3_uq, psF32 iq_m4, psF32 iq_m4_err, psF32 iq_m4_lq, psF32 iq_m4_uq, psF32 dtime_detrend, psF32 dtime_photom, psF32 dtime_total, psF32 dtime_script, const char *hostname, psS32 n_stars, psS32 n_psfstars, psS32 n_iqstars, psS32 n_extended, psS32 n_cr, const char *path_base, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -7182,4 +7576,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
@@ -7227,14 +7626,4 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_ra", PS_DATA_F32, NULL, sigma_ra)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_dec", PS_DATA_F32, NULL, sigma_dec)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "ap_resid", PS_DATA_F32, NULL, ap_resid)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item ap_resid");
@@ -7247,14 +7636,4 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_mean", PS_DATA_F32, NULL, zp_mean)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item zp_mean");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_stdev", PS_DATA_F32, NULL, zp_stdev)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item zp_stdev");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm_major", PS_DATA_F32, NULL, fwhm_major)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fwhm_major");
@@ -7267,4 +7646,104 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, iq_m2)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, iq_m2_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, iq_m2_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, iq_m2_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, iq_m2c)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, iq_m2c_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, iq_m2c_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, iq_m2c_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, iq_m2s)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, iq_m2s_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, iq_m2s_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, iq_m2s_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, iq_m3)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, iq_m3_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, iq_m3_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, iq_m3_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, iq_m4)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, iq_m4_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, iq_m4_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, iq_m4_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, dtime_detrend)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
@@ -7277,6 +7756,11 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_astrom", PS_DATA_F32, NULL, dtime_astrom)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_astrom");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_total", PS_DATA_F32, NULL, dtime_total)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_total");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
         psFree(md);
         return false;
@@ -7292,4 +7776,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, n_psfstars)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, n_iqstars)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, n_extended)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
@@ -7299,9 +7793,4 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_cr", PS_DATA_S32, NULL, n_cr)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item n_cr");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_astrom", PS_DATA_S32, NULL, n_astrom)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item n_astrom");
         psFree(md);
         return false;
@@ -7340,5 +7829,5 @@
 bool chipProcessedImfileInsertObject(psDB *dbh, chipProcessedImfileRow *object)
 {
-    return chipProcessedImfileInsert(dbh, object->chip_id, object->exp_id, object->class_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bias, object->bias_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->sigma_ra, object->sigma_dec, object->ap_resid, object->ap_resid_stdev, object->zp_mean, object->zp_stdev, object->fwhm_major, object->fwhm_minor, object->dtime_detrend, object->dtime_photom, object->dtime_astrom, object->hostname, object->n_stars, object->n_extended, object->n_cr, object->n_astrom, object->path_base, object->fault);
+    return chipProcessedImfileInsert(dbh, object->chip_id, object->exp_id, object->class_id, object->data_state, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bias, object->bias_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->ap_resid, object->ap_resid_stdev, object->fwhm_major, object->fwhm_minor, object->iq_m2, object->iq_m2_err, object->iq_m2_lq, object->iq_m2_uq, object->iq_m2c, object->iq_m2c_err, object->iq_m2c_lq, object->iq_m2c_uq, object->iq_m2s, object->iq_m2s_err, object->iq_m2s_lq, object->iq_m2s_uq, object->iq_m3, object->iq_m3_err, object->iq_m3_lq, object->iq_m3_uq, object->iq_m4, object->iq_m4_err, object->iq_m4_lq, object->iq_m4_uq, object->dtime_detrend, object->dtime_photom, object->dtime_total, object->dtime_script, object->hostname, object->n_stars, object->n_psfstars, object->n_iqstars, object->n_extended, object->n_cr, object->path_base, object->fault);
 }
 
@@ -7428,4 +7917,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
@@ -7473,14 +7967,4 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_ra", PS_DATA_F32, NULL, object->sigma_ra)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_dec", PS_DATA_F32, NULL, object->sigma_dec)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "ap_resid", PS_DATA_F32, NULL, object->ap_resid)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item ap_resid");
@@ -7493,14 +7977,4 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_mean", PS_DATA_F32, NULL, object->zp_mean)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item zp_mean");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_stdev", PS_DATA_F32, NULL, object->zp_stdev)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item zp_stdev");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm_major", PS_DATA_F32, NULL, object->fwhm_major)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fwhm_major");
@@ -7513,4 +7987,104 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, object->iq_m2)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, object->iq_m2_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, object->iq_m2_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, object->iq_m2_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, object->iq_m2c)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, object->iq_m2c_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, object->iq_m2c_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, object->iq_m2c_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, object->iq_m2s)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, object->iq_m2s_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, object->iq_m2s_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, object->iq_m2s_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, object->iq_m3)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, object->iq_m3_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, object->iq_m3_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, object->iq_m3_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, object->iq_m4)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, object->iq_m4_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, object->iq_m4_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, object->iq_m4_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, object->dtime_detrend)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
@@ -7523,6 +8097,11 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_astrom", PS_DATA_F32, NULL, object->dtime_astrom)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_astrom");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_total", PS_DATA_F32, NULL, object->dtime_total)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_total");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
         psFree(md);
         return false;
@@ -7538,4 +8117,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, object->n_psfstars)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, object->n_iqstars)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, object->n_extended)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
@@ -7548,9 +8137,4 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_astrom", PS_DATA_S32, NULL, object->n_astrom)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item n_astrom");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, object->path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
@@ -7587,4 +8171,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     char* uri = psMetadataLookupPtr(&status, md, "uri");
     if (!status) {
@@ -7632,14 +8221,4 @@
         return false;
     }
-    psF32 sigma_ra = psMetadataLookupF32(&status, md, "sigma_ra");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sigma_ra");
-        return false;
-    }
-    psF32 sigma_dec = psMetadataLookupF32(&status, md, "sigma_dec");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sigma_dec");
-        return false;
-    }
     psF32 ap_resid = psMetadataLookupF32(&status, md, "ap_resid");
     if (!status) {
@@ -7652,14 +8231,4 @@
         return false;
     }
-    psF32 zp_mean = psMetadataLookupF32(&status, md, "zp_mean");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item zp_mean");
-        return false;
-    }
-    psF32 zp_stdev = psMetadataLookupF32(&status, md, "zp_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item zp_stdev");
-        return false;
-    }
     psF32 fwhm_major = psMetadataLookupF32(&status, md, "fwhm_major");
     if (!status) {
@@ -7672,4 +8241,104 @@
         return false;
     }
+    psF32 iq_m2 = psMetadataLookupF32(&status, md, "iq_m2");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2");
+        return false;
+    }
+    psF32 iq_m2_err = psMetadataLookupF32(&status, md, "iq_m2_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_err");
+        return false;
+    }
+    psF32 iq_m2_lq = psMetadataLookupF32(&status, md, "iq_m2_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_lq");
+        return false;
+    }
+    psF32 iq_m2_uq = psMetadataLookupF32(&status, md, "iq_m2_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_uq");
+        return false;
+    }
+    psF32 iq_m2c = psMetadataLookupF32(&status, md, "iq_m2c");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c");
+        return false;
+    }
+    psF32 iq_m2c_err = psMetadataLookupF32(&status, md, "iq_m2c_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_err");
+        return false;
+    }
+    psF32 iq_m2c_lq = psMetadataLookupF32(&status, md, "iq_m2c_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_lq");
+        return false;
+    }
+    psF32 iq_m2c_uq = psMetadataLookupF32(&status, md, "iq_m2c_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_uq");
+        return false;
+    }
+    psF32 iq_m2s = psMetadataLookupF32(&status, md, "iq_m2s");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s");
+        return false;
+    }
+    psF32 iq_m2s_err = psMetadataLookupF32(&status, md, "iq_m2s_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_err");
+        return false;
+    }
+    psF32 iq_m2s_lq = psMetadataLookupF32(&status, md, "iq_m2s_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_lq");
+        return false;
+    }
+    psF32 iq_m2s_uq = psMetadataLookupF32(&status, md, "iq_m2s_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_uq");
+        return false;
+    }
+    psF32 iq_m3 = psMetadataLookupF32(&status, md, "iq_m3");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3");
+        return false;
+    }
+    psF32 iq_m3_err = psMetadataLookupF32(&status, md, "iq_m3_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_err");
+        return false;
+    }
+    psF32 iq_m3_lq = psMetadataLookupF32(&status, md, "iq_m3_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_lq");
+        return false;
+    }
+    psF32 iq_m3_uq = psMetadataLookupF32(&status, md, "iq_m3_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_uq");
+        return false;
+    }
+    psF32 iq_m4 = psMetadataLookupF32(&status, md, "iq_m4");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4");
+        return false;
+    }
+    psF32 iq_m4_err = psMetadataLookupF32(&status, md, "iq_m4_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_err");
+        return false;
+    }
+    psF32 iq_m4_lq = psMetadataLookupF32(&status, md, "iq_m4_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_lq");
+        return false;
+    }
+    psF32 iq_m4_uq = psMetadataLookupF32(&status, md, "iq_m4_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_uq");
+        return false;
+    }
     psF32 dtime_detrend = psMetadataLookupF32(&status, md, "dtime_detrend");
     if (!status) {
@@ -7682,7 +8351,12 @@
         return false;
     }
-    psF32 dtime_astrom = psMetadataLookupF32(&status, md, "dtime_astrom");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_astrom");
+    psF32 dtime_total = psMetadataLookupF32(&status, md, "dtime_total");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_total");
+        return false;
+    }
+    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
         return false;
     }
@@ -7697,4 +8371,14 @@
         return false;
     }
+    psS32 n_psfstars = psMetadataLookupS32(&status, md, "n_psfstars");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_psfstars");
+        return false;
+    }
+    psS32 n_iqstars = psMetadataLookupS32(&status, md, "n_iqstars");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_iqstars");
+        return false;
+    }
     psS32 n_extended = psMetadataLookupS32(&status, md, "n_extended");
     if (!status) {
@@ -7707,9 +8391,4 @@
         return false;
     }
-    psS32 n_astrom = psMetadataLookupS32(&status, md, "n_astrom");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_astrom");
-        return false;
-    }
     char* path_base = psMetadataLookupPtr(&status, md, "path_base");
     if (!status) {
@@ -7723,5 +8402,5 @@
     }
 
-    return chipProcessedImfileRowAlloc(chip_id, exp_id, class_id, uri, bg, bg_stdev, bg_mean_stdev, bias, bias_stdev, fringe_0, fringe_1, fringe_2, sigma_ra, sigma_dec, ap_resid, ap_resid_stdev, zp_mean, zp_stdev, fwhm_major, fwhm_minor, dtime_detrend, dtime_photom, dtime_astrom, hostname, n_stars, n_extended, n_cr, n_astrom, path_base, fault);
+    return chipProcessedImfileRowAlloc(chip_id, exp_id, class_id, data_state, uri, bg, bg_stdev, bg_mean_stdev, bias, bias_stdev, fringe_0, fringe_1, fringe_2, ap_resid, ap_resid_stdev, fwhm_major, fwhm_minor, iq_m2, iq_m2_err, iq_m2_lq, iq_m2_uq, iq_m2c, iq_m2c_err, iq_m2c_lq, iq_m2c_uq, iq_m2s, iq_m2s_err, iq_m2s_lq, iq_m2s_uq, iq_m3, iq_m3_err, iq_m3_lq, iq_m3_uq, iq_m4, iq_m4_err, iq_m4_lq, iq_m4_uq, dtime_detrend, dtime_photom, dtime_total, dtime_script, hostname, n_stars, n_psfstars, n_iqstars, n_extended, n_cr, path_base, fault);
 }
 psArray *chipProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -8619,5 +9298,5 @@
 static void camProcessedExpRowFree(camProcessedExpRow *object);
 
-camProcessedExpRow *camProcessedExpRowAlloc(psS64 cam_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm_major, psF32 fwhm_minor, psF32 dtime_detrend, psF32 dtime_photom, psF32 dtime_astrom, const char *hostname, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
+camProcessedExpRow *camProcessedExpRowAlloc(psS64 cam_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm_major, psF32 fwhm_minor, psF32 iq_m2, psF32 iq_m2_err, psF32 iq_m2_lq, psF32 iq_m2_uq, psF32 iq_m2c, psF32 iq_m2c_err, psF32 iq_m2c_lq, psF32 iq_m2c_uq, psF32 iq_m2s, psF32 iq_m2s_err, psF32 iq_m2s_lq, psF32 iq_m2s_uq, psF32 iq_m3, psF32 iq_m3_err, psF32 iq_m3_lq, psF32 iq_m3_uq, psF32 iq_m4, psF32 iq_m4_err, psF32 iq_m4_lq, psF32 iq_m4_uq, psF32 dtime_script, psF32 dtime_astrom, psF32 dtime_addstar, const char *hostname, psS32 n_stars, psS32 n_psfstars, psS32 n_iqstars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
 {
     camProcessedExpRow *_object;
@@ -8644,9 +9323,31 @@
     _object->fwhm_major = fwhm_major;
     _object->fwhm_minor = fwhm_minor;
-    _object->dtime_detrend = dtime_detrend;
-    _object->dtime_photom = dtime_photom;
+    _object->iq_m2 = iq_m2;
+    _object->iq_m2_err = iq_m2_err;
+    _object->iq_m2_lq = iq_m2_lq;
+    _object->iq_m2_uq = iq_m2_uq;
+    _object->iq_m2c = iq_m2c;
+    _object->iq_m2c_err = iq_m2c_err;
+    _object->iq_m2c_lq = iq_m2c_lq;
+    _object->iq_m2c_uq = iq_m2c_uq;
+    _object->iq_m2s = iq_m2s;
+    _object->iq_m2s_err = iq_m2s_err;
+    _object->iq_m2s_lq = iq_m2s_lq;
+    _object->iq_m2s_uq = iq_m2s_uq;
+    _object->iq_m3 = iq_m3;
+    _object->iq_m3_err = iq_m3_err;
+    _object->iq_m3_lq = iq_m3_lq;
+    _object->iq_m3_uq = iq_m3_uq;
+    _object->iq_m4 = iq_m4;
+    _object->iq_m4_err = iq_m4_err;
+    _object->iq_m4_lq = iq_m4_lq;
+    _object->iq_m4_uq = iq_m4_uq;
+    _object->dtime_script = dtime_script;
     _object->dtime_astrom = dtime_astrom;
+    _object->dtime_addstar = dtime_addstar;
     _object->hostname = psStringCopy(hostname);
     _object->n_stars = n_stars;
+    _object->n_psfstars = n_psfstars;
+    _object->n_iqstars = n_iqstars;
     _object->n_extended = n_extended;
     _object->n_cr = n_cr;
@@ -8758,11 +9459,106 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_photom", PS_DATA_F32, NULL, 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_photom");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
         psFree(md);
         return false;
@@ -8773,4 +9569,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_addstar", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_addstar");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -8783,4 +9584,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
@@ -8821,5 +9632,5 @@
 }
 
-bool camProcessedExpInsert(psDB * dbh, psS64 cam_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm_major, psF32 fwhm_minor, psF32 dtime_detrend, psF32 dtime_photom, psF32 dtime_astrom, const char *hostname, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
+bool camProcessedExpInsert(psDB * dbh, psS64 cam_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm_major, psF32 fwhm_minor, psF32 iq_m2, psF32 iq_m2_err, psF32 iq_m2_lq, psF32 iq_m2_uq, psF32 iq_m2c, psF32 iq_m2c_err, psF32 iq_m2c_lq, psF32 iq_m2c_uq, psF32 iq_m2s, psF32 iq_m2s_err, psF32 iq_m2s_lq, psF32 iq_m2s_uq, psF32 iq_m3, psF32 iq_m3_err, psF32 iq_m3_lq, psF32 iq_m3_uq, psF32 iq_m4, psF32 iq_m4_err, psF32 iq_m4_lq, psF32 iq_m4_uq, psF32 dtime_script, psF32 dtime_astrom, psF32 dtime_addstar, const char *hostname, psS32 n_stars, psS32 n_psfstars, psS32 n_iqstars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -8914,11 +9725,106 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, dtime_detrend)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_photom", PS_DATA_F32, NULL, dtime_photom)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_photom");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, iq_m2)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, iq_m2_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, iq_m2_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, iq_m2_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, iq_m2c)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, iq_m2c_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, iq_m2c_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, iq_m2c_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, iq_m2s)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, iq_m2s_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, iq_m2s_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, iq_m2s_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, iq_m3)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, iq_m3_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, iq_m3_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, iq_m3_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, iq_m4)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, iq_m4_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, iq_m4_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, iq_m4_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
         psFree(md);
         return false;
@@ -8929,4 +9835,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_addstar", PS_DATA_F32, NULL, dtime_addstar)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_addstar");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, hostname)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -8936,4 +9847,14 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_stars", PS_DATA_S32, NULL, n_stars)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item n_stars");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, n_psfstars)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, n_iqstars)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
         psFree(md);
         return false;
@@ -8987,5 +9908,5 @@
 bool camProcessedExpInsertObject(psDB *dbh, camProcessedExpRow *object)
 {
-    return camProcessedExpInsert(dbh, object->cam_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bias, object->bias_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->sigma_ra, object->sigma_dec, object->ap_resid, object->ap_resid_stdev, object->zp_mean, object->zp_stdev, object->fwhm_major, object->fwhm_minor, object->dtime_detrend, object->dtime_photom, object->dtime_astrom, object->hostname, object->n_stars, object->n_extended, object->n_cr, object->n_astrom, object->path_base, object->fault);
+    return camProcessedExpInsert(dbh, object->cam_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bias, object->bias_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->sigma_ra, object->sigma_dec, object->ap_resid, object->ap_resid_stdev, object->zp_mean, object->zp_stdev, object->fwhm_major, object->fwhm_minor, object->iq_m2, object->iq_m2_err, object->iq_m2_lq, object->iq_m2_uq, object->iq_m2c, object->iq_m2c_err, object->iq_m2c_lq, object->iq_m2c_uq, object->iq_m2s, object->iq_m2s_err, object->iq_m2s_lq, object->iq_m2s_uq, object->iq_m3, object->iq_m3_err, object->iq_m3_lq, object->iq_m3_uq, object->iq_m4, object->iq_m4_err, object->iq_m4_lq, object->iq_m4_uq, object->dtime_script, object->dtime_astrom, object->dtime_addstar, object->hostname, object->n_stars, object->n_psfstars, object->n_iqstars, object->n_extended, object->n_cr, object->n_astrom, object->path_base, object->fault);
 }
 
@@ -9150,11 +10071,106 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, object->dtime_detrend)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_photom", PS_DATA_F32, NULL, object->dtime_photom)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_photom");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, object->iq_m2)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, object->iq_m2_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, object->iq_m2_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, object->iq_m2_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, object->iq_m2c)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, object->iq_m2c_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, object->iq_m2c_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, object->iq_m2c_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, object->iq_m2s)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, object->iq_m2s_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, object->iq_m2s_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, object->iq_m2s_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, object->iq_m3)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, object->iq_m3_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, object->iq_m3_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, object->iq_m3_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, object->iq_m4)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, object->iq_m4_err)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, object->iq_m4_lq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, object->iq_m4_uq)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
         psFree(md);
         return false;
@@ -9165,4 +10181,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_addstar", PS_DATA_F32, NULL, object->dtime_addstar)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_addstar");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -9175,4 +10196,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, object->n_psfstars)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, object->n_iqstars)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, object->n_extended)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
@@ -9299,12 +10330,107 @@
         return false;
     }
-    psF32 dtime_detrend = psMetadataLookupF32(&status, md, "dtime_detrend");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_detrend");
-        return false;
-    }
-    psF32 dtime_photom = psMetadataLookupF32(&status, md, "dtime_photom");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_photom");
+    psF32 iq_m2 = psMetadataLookupF32(&status, md, "iq_m2");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2");
+        return false;
+    }
+    psF32 iq_m2_err = psMetadataLookupF32(&status, md, "iq_m2_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_err");
+        return false;
+    }
+    psF32 iq_m2_lq = psMetadataLookupF32(&status, md, "iq_m2_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_lq");
+        return false;
+    }
+    psF32 iq_m2_uq = psMetadataLookupF32(&status, md, "iq_m2_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_uq");
+        return false;
+    }
+    psF32 iq_m2c = psMetadataLookupF32(&status, md, "iq_m2c");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c");
+        return false;
+    }
+    psF32 iq_m2c_err = psMetadataLookupF32(&status, md, "iq_m2c_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_err");
+        return false;
+    }
+    psF32 iq_m2c_lq = psMetadataLookupF32(&status, md, "iq_m2c_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_lq");
+        return false;
+    }
+    psF32 iq_m2c_uq = psMetadataLookupF32(&status, md, "iq_m2c_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_uq");
+        return false;
+    }
+    psF32 iq_m2s = psMetadataLookupF32(&status, md, "iq_m2s");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s");
+        return false;
+    }
+    psF32 iq_m2s_err = psMetadataLookupF32(&status, md, "iq_m2s_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_err");
+        return false;
+    }
+    psF32 iq_m2s_lq = psMetadataLookupF32(&status, md, "iq_m2s_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_lq");
+        return false;
+    }
+    psF32 iq_m2s_uq = psMetadataLookupF32(&status, md, "iq_m2s_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_uq");
+        return false;
+    }
+    psF32 iq_m3 = psMetadataLookupF32(&status, md, "iq_m3");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3");
+        return false;
+    }
+    psF32 iq_m3_err = psMetadataLookupF32(&status, md, "iq_m3_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_err");
+        return false;
+    }
+    psF32 iq_m3_lq = psMetadataLookupF32(&status, md, "iq_m3_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_lq");
+        return false;
+    }
+    psF32 iq_m3_uq = psMetadataLookupF32(&status, md, "iq_m3_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_uq");
+        return false;
+    }
+    psF32 iq_m4 = psMetadataLookupF32(&status, md, "iq_m4");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4");
+        return false;
+    }
+    psF32 iq_m4_err = psMetadataLookupF32(&status, md, "iq_m4_err");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_err");
+        return false;
+    }
+    psF32 iq_m4_lq = psMetadataLookupF32(&status, md, "iq_m4_lq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_lq");
+        return false;
+    }
+    psF32 iq_m4_uq = psMetadataLookupF32(&status, md, "iq_m4_uq");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_uq");
+        return false;
+    }
+    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
         return false;
     }
@@ -9314,4 +10440,9 @@
         return false;
     }
+    psF32 dtime_addstar = psMetadataLookupF32(&status, md, "dtime_addstar");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_addstar");
+        return false;
+    }
     char* hostname = psMetadataLookupPtr(&status, md, "hostname");
     if (!status) {
@@ -9324,4 +10455,14 @@
         return false;
     }
+    psS32 n_psfstars = psMetadataLookupS32(&status, md, "n_psfstars");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_psfstars");
+        return false;
+    }
+    psS32 n_iqstars = psMetadataLookupS32(&status, md, "n_iqstars");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_iqstars");
+        return false;
+    }
     psS32 n_extended = psMetadataLookupS32(&status, md, "n_extended");
     if (!status) {
@@ -9350,5 +10491,5 @@
     }
 
-    return camProcessedExpRowAlloc(cam_id, uri, bg, bg_stdev, bg_mean_stdev, bias, bias_stdev, fringe_0, fringe_1, fringe_2, sigma_ra, sigma_dec, ap_resid, ap_resid_stdev, zp_mean, zp_stdev, fwhm_major, fwhm_minor, dtime_detrend, dtime_photom, dtime_astrom, hostname, n_stars, n_extended, n_cr, n_astrom, path_base, fault);
+    return camProcessedExpRowAlloc(cam_id, uri, bg, bg_stdev, bg_mean_stdev, bias, bias_stdev, fringe_0, fringe_1, fringe_2, sigma_ra, sigma_dec, ap_resid, ap_resid_stdev, zp_mean, zp_stdev, fwhm_major, fwhm_minor, iq_m2, iq_m2_err, iq_m2_lq, iq_m2_uq, iq_m2c, iq_m2c_err, iq_m2c_lq, iq_m2c_uq, iq_m2s, iq_m2s_err, iq_m2s_lq, iq_m2s_uq, iq_m3, iq_m3_err, iq_m3_lq, iq_m3_uq, iq_m4, iq_m4_err, iq_m4_lq, iq_m4_uq, dtime_script, dtime_astrom, dtime_addstar, hostname, n_stars, n_psfstars, n_iqstars, n_extended, n_cr, n_astrom, path_base, fault);
 }
 psArray *camProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -10246,5 +11387,5 @@
 static void fakeProcessedImfileRowFree(fakeProcessedImfileRow *object);
 
-fakeProcessedImfileRow *fakeProcessedImfileRowAlloc(psS64 fake_id, psS64 exp_id, const char *class_id, const char *uri, psF32 dtime_fake, const char *hostname, const char *path_base, psS16 fault, psTime* epoch)
+fakeProcessedImfileRow *fakeProcessedImfileRowAlloc(psS64 fake_id, psS64 exp_id, const char *class_id, const char *uri, psF32 dtime_fake, psF32 dtime_script, const char *hostname, const char *path_base, const char *data_state, psS16 fault, psTime* epoch)
 {
     fakeProcessedImfileRow *_object;
@@ -10258,6 +11399,8 @@
     _object->uri = psStringCopy(uri);
     _object->dtime_fake = dtime_fake;
+    _object->dtime_script = dtime_script;
     _object->hostname = psStringCopy(hostname);
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
     _object->epoch = psTimeCopy(epoch);
@@ -10272,4 +11415,5 @@
     psFree(object->hostname);
     psFree(object->path_base);
+    psFree(object->data_state);
     psFree(object->epoch);
 }
@@ -10303,4 +11447,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -10313,4 +11462,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "Key", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -10336,5 +11490,5 @@
 }
 
-bool fakeProcessedImfileInsert(psDB * dbh, psS64 fake_id, psS64 exp_id, const char *class_id, const char *uri, psF32 dtime_fake, const char *hostname, const char *path_base, psS16 fault, psTime* epoch)
+bool fakeProcessedImfileInsert(psDB * dbh, psS64 fake_id, psS64 exp_id, const char *class_id, const char *uri, psF32 dtime_fake, psF32 dtime_script, const char *hostname, const char *path_base, const char *data_state, psS16 fault, psTime* epoch)
 {
     psMetadata *md = psMetadataAlloc();
@@ -10364,4 +11518,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, hostname)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -10371,4 +11530,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -10407,5 +11571,5 @@
 bool fakeProcessedImfileInsertObject(psDB *dbh, fakeProcessedImfileRow *object)
 {
-    return fakeProcessedImfileInsert(dbh, object->fake_id, object->exp_id, object->class_id, object->uri, object->dtime_fake, object->hostname, object->path_base, object->fault, object->epoch);
+    return fakeProcessedImfileInsert(dbh, object->fake_id, object->exp_id, object->class_id, object->uri, object->dtime_fake, object->dtime_script, object->hostname, object->path_base, object->data_state, object->fault, object->epoch);
 }
 
@@ -10505,4 +11669,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -10515,4 +11684,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -10559,4 +11733,9 @@
         return false;
     }
+    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
+        return false;
+    }
     char* hostname = psMetadataLookupPtr(&status, md, "hostname");
     if (!status) {
@@ -10569,4 +11748,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -10580,5 +11764,5 @@
     }
 
-    return fakeProcessedImfileRowAlloc(fake_id, exp_id, class_id, uri, dtime_fake, hostname, path_base, fault, epoch);
+    return fakeProcessedImfileRowAlloc(fake_id, exp_id, class_id, uri, dtime_fake, dtime_script, hostname, path_base, data_state, fault, epoch);
 }
 psArray *fakeProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -11863,5 +13047,5 @@
 static void warpSkyfileRowFree(warpSkyfileRow *object);
 
-warpSkyfileRow *warpSkyfileRowAlloc(psS64 warp_id, const char *skycell_id, const char *tess_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psF32 dtime_warp, const char *hostname, psF32 good_frac, psS32 xmin, psS32 xmax, psS32 ymin, psS32 ymax, bool ignored, psS16 fault)
+warpSkyfileRow *warpSkyfileRowAlloc(psS64 warp_id, const char *skycell_id, const char *tess_id, const char *uri, const char *path_base, const char *data_state, psF64 bg, psF64 bg_stdev, psF32 dtime_warp, psF32 dtime_script, const char *hostname, psF32 good_frac, psS32 xmin, psS32 xmax, psS32 ymin, psS32 ymax, bool ignored, psS16 fault)
 {
     warpSkyfileRow  *_object;
@@ -11875,7 +13059,9 @@
     _object->uri = psStringCopy(uri);
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->bg = bg;
     _object->bg_stdev = bg_stdev;
     _object->dtime_warp = dtime_warp;
+    _object->dtime_script = dtime_script;
     _object->hostname = psStringCopy(hostname);
     _object->good_frac = good_frac;
@@ -11896,4 +13082,5 @@
     psFree(object->uri);
     psFree(object->path_base);
+    psFree(object->data_state);
     psFree(object->hostname);
 }
@@ -11927,4 +13114,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "Key", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
@@ -11942,4 +13134,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -11995,5 +13192,5 @@
 }
 
-bool warpSkyfileInsert(psDB * dbh, psS64 warp_id, const char *skycell_id, const char *tess_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psF32 dtime_warp, const char *hostname, psF32 good_frac, psS32 xmin, psS32 xmax, psS32 ymin, psS32 ymax, bool ignored, psS16 fault)
+bool warpSkyfileInsert(psDB * dbh, psS64 warp_id, const char *skycell_id, const char *tess_id, const char *uri, const char *path_base, const char *data_state, psF64 bg, psF64 bg_stdev, psF32 dtime_warp, psF32 dtime_script, const char *hostname, psF32 good_frac, psS32 xmin, psS32 xmax, psS32 ymin, psS32 ymax, bool ignored, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -12023,4 +13220,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, bg)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
@@ -12035,4 +13237,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_warp", PS_DATA_F32, NULL, dtime_warp)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_warp");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
         psFree(md);
         return false;
@@ -12101,5 +13308,5 @@
 bool warpSkyfileInsertObject(psDB *dbh, warpSkyfileRow *object)
 {
-    return warpSkyfileInsert(dbh, object->warp_id, object->skycell_id, object->tess_id, object->uri, object->path_base, object->bg, object->bg_stdev, object->dtime_warp, object->hostname, object->good_frac, object->xmin, object->xmax, object->ymin, object->ymax, object->ignored, object->fault);
+    return warpSkyfileInsert(dbh, object->warp_id, object->skycell_id, object->tess_id, object->uri, object->path_base, object->data_state, object->bg, object->bg_stdev, object->dtime_warp, object->dtime_script, object->hostname, object->good_frac, object->xmin, object->xmax, object->ymin, object->ymax, object->ignored, object->fault);
 }
 
@@ -12199,4 +13406,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
@@ -12214,4 +13426,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -12288,4 +13505,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psF64 bg = psMetadataLookupF64(&status, md, "bg");
     if (!status) {
@@ -12303,4 +13525,9 @@
         return false;
     }
+    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
+        return false;
+    }
     char* hostname = psMetadataLookupPtr(&status, md, "hostname");
     if (!status) {
@@ -12344,5 +13571,5 @@
     }
 
-    return warpSkyfileRowAlloc(warp_id, skycell_id, tess_id, uri, path_base, bg, bg_stdev, dtime_warp, hostname, good_frac, xmin, xmax, ymin, ymax, ignored, fault);
+    return warpSkyfileRowAlloc(warp_id, skycell_id, tess_id, uri, path_base, data_state, bg, bg_stdev, dtime_warp, dtime_script, hostname, good_frac, xmin, xmax, ymin, ymax, ignored, fault);
 }
 psArray *warpSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -12742,5 +13969,5 @@
 static void diffRunRowFree(diffRunRow *object);
 
-diffRunRow *diffRunRowAlloc(psS64 diff_id, const char *state, const char *workdir, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id)
+diffRunRow *diffRunRowAlloc(psS64 diff_id, const char *state, const char *label, const char *reduction, const char *workdir, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id)
 {
     diffRunRow      *_object;
@@ -12751,4 +13978,6 @@
     _object->diff_id = diff_id;
     _object->state = psStringCopy(state);
+    _object->label = psStringCopy(label);
+    _object->reduction = psStringCopy(reduction);
     _object->workdir = psStringCopy(workdir);
     _object->dvodb = psStringCopy(dvodb);
@@ -12763,4 +13992,6 @@
 {
     psFree(object->state);
+    psFree(object->label);
+    psFree(object->reduction);
     psFree(object->workdir);
     psFree(object->dvodb);
@@ -12783,4 +14014,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "Key", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, "Reduction class", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
@@ -12821,5 +14062,5 @@
 }
 
-bool diffRunInsert(psDB * dbh, psS64 diff_id, const char *state, const char *workdir, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id)
+bool diffRunInsert(psDB * dbh, psS64 diff_id, const char *state, const char *label, const char *reduction, const char *workdir, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id)
 {
     psMetadata *md = psMetadataAlloc();
@@ -12831,4 +14072,14 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item state");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
         psFree(md);
         return false;
@@ -12882,5 +14133,5 @@
 bool diffRunInsertObject(psDB *dbh, diffRunRow *object)
 {
-    return diffRunInsert(dbh, object->diff_id, object->state, object->workdir, object->dvodb, object->registered, object->skycell_id, object->tess_id);
+    return diffRunInsert(dbh, object->diff_id, object->state, object->label, object->reduction, object->workdir, object->dvodb, object->registered, object->skycell_id, object->tess_id);
 }
 
@@ -12965,4 +14216,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
@@ -13009,4 +14270,14 @@
         return false;
     }
+    char* label = psMetadataLookupPtr(&status, md, "label");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
+        return false;
+    }
+    char* reduction = psMetadataLookupPtr(&status, md, "reduction");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
+        return false;
+    }
     char* workdir = psMetadataLookupPtr(&status, md, "workdir");
     if (!status) {
@@ -13035,5 +14306,5 @@
     }
 
-    return diffRunRowAlloc(diff_id, state, workdir, dvodb, registered, skycell_id, tess_id);
+    return diffRunRowAlloc(diff_id, state, label, reduction, workdir, dvodb, registered, skycell_id, tess_id);
 }
 psArray *diffRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -13561,5 +14832,5 @@
 static void diffSkyfileRowFree(diffSkyfileRow *object);
 
-diffSkyfileRow *diffSkyfileRowAlloc(psS64 diff_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psS32 stamps_num, psF32 stamps_rms, psS32 sources, psF32 dtime_diff, const char *hostname, psF32 good_frac, psS16 fault)
+diffSkyfileRow *diffSkyfileRowAlloc(psS64 diff_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psS32 stamps_num, psF32 stamps_mean, psF32 stamps_rms, psF32 norm, psF32 bg_diff, psF32 kernel_x, psF32 kernel_y, psF32 kernel_xx, psF32 kernel_xy, psF32 kernel_yy, psS32 sources, psF32 dtime_diff, psF32 dtime_match, psF32 dtime_phot, psF32 dtime_script, const char *hostname, psF32 good_frac, psS16 fault)
 {
     diffSkyfileRow  *_object;
@@ -13574,7 +14845,18 @@
     _object->bg_stdev = bg_stdev;
     _object->stamps_num = stamps_num;
+    _object->stamps_mean = stamps_mean;
     _object->stamps_rms = stamps_rms;
+    _object->norm = norm;
+    _object->bg_diff = bg_diff;
+    _object->kernel_x = kernel_x;
+    _object->kernel_y = kernel_y;
+    _object->kernel_xx = kernel_xx;
+    _object->kernel_xy = kernel_xy;
+    _object->kernel_yy = kernel_yy;
     _object->sources = sources;
     _object->dtime_diff = dtime_diff;
+    _object->dtime_match = dtime_match;
+    _object->dtime_phot = dtime_phot;
+    _object->dtime_script = dtime_script;
     _object->hostname = psStringCopy(hostname);
     _object->good_frac = good_frac;
@@ -13624,4 +14906,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_rms", PS_DATA_F32, NULL, 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_rms");
@@ -13629,4 +14916,39 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "norm", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_diff", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_diff");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_x", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_x");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_y", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_y");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xx", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xx");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xy", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xy");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_yy", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_yy");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
@@ -13639,4 +14961,19 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -13667,5 +15004,5 @@
 }
 
-bool diffSkyfileInsert(psDB * dbh, psS64 diff_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psS32 stamps_num, psF32 stamps_rms, psS32 sources, psF32 dtime_diff, const char *hostname, psF32 good_frac, psS16 fault)
+bool diffSkyfileInsert(psDB * dbh, psS64 diff_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psS32 stamps_num, psF32 stamps_mean, psF32 stamps_rms, psF32 norm, psF32 bg_diff, psF32 kernel_x, psF32 kernel_y, psF32 kernel_xx, psF32 kernel_xy, psF32 kernel_yy, psS32 sources, psF32 dtime_diff, psF32 dtime_match, psF32 dtime_phot, psF32 dtime_script, const char *hostname, psF32 good_frac, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -13700,4 +15037,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, stamps_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_rms", PS_DATA_F32, NULL, stamps_rms)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_rms");
@@ -13705,4 +15047,39 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "norm", PS_DATA_F32, NULL, norm)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_diff", PS_DATA_F32, NULL, bg_diff)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_diff");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_x", PS_DATA_F32, NULL, kernel_x)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_x");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_y", PS_DATA_F32, NULL, kernel_y)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_y");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xx", PS_DATA_F32, NULL, kernel_xx)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xx");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xy", PS_DATA_F32, NULL, kernel_xy)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xy");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_yy", PS_DATA_F32, NULL, kernel_yy)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_yy");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, sources)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
@@ -13712,4 +15089,19 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_diff", PS_DATA_F32, NULL, dtime_diff)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_diff");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match", PS_DATA_F32, NULL, dtime_match)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, dtime_phot)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
         psFree(md);
         return false;
@@ -13753,5 +15145,5 @@
 bool diffSkyfileInsertObject(psDB *dbh, diffSkyfileRow *object)
 {
-    return diffSkyfileInsert(dbh, object->diff_id, object->uri, object->path_base, object->bg, object->bg_stdev, object->stamps_num, object->stamps_rms, object->sources, object->dtime_diff, object->hostname, object->good_frac, object->fault);
+    return diffSkyfileInsert(dbh, object->diff_id, object->uri, object->path_base, object->bg, object->bg_stdev, object->stamps_num, object->stamps_mean, object->stamps_rms, object->norm, object->bg_diff, object->kernel_x, object->kernel_y, object->kernel_xx, object->kernel_xy, object->kernel_yy, object->sources, object->dtime_diff, object->dtime_match, object->dtime_phot, object->dtime_script, object->hostname, object->good_frac, object->fault);
 }
 
@@ -13856,4 +15248,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, object->stamps_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_rms", PS_DATA_F32, NULL, object->stamps_rms)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_rms");
@@ -13861,4 +15258,39 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "norm", PS_DATA_F32, NULL, object->norm)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_diff", PS_DATA_F32, NULL, object->bg_diff)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_diff");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_x", PS_DATA_F32, NULL, object->kernel_x)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_x");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_y", PS_DATA_F32, NULL, object->kernel_y)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_y");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xx", PS_DATA_F32, NULL, object->kernel_xx)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xx");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xy", PS_DATA_F32, NULL, object->kernel_xy)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xy");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_yy", PS_DATA_F32, NULL, object->kernel_yy)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_yy");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, object->sources)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
@@ -13871,4 +15303,19 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match", PS_DATA_F32, NULL, object->dtime_match)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, object->dtime_phot)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -13925,4 +15372,9 @@
         return false;
     }
+    psF32 stamps_mean = psMetadataLookupF32(&status, md, "stamps_mean");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stamps_mean");
+        return false;
+    }
     psF32 stamps_rms = psMetadataLookupF32(&status, md, "stamps_rms");
     if (!status) {
@@ -13930,4 +15382,39 @@
         return false;
     }
+    psF32 norm = psMetadataLookupF32(&status, md, "norm");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item norm");
+        return false;
+    }
+    psF32 bg_diff = psMetadataLookupF32(&status, md, "bg_diff");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_diff");
+        return false;
+    }
+    psF32 kernel_x = psMetadataLookupF32(&status, md, "kernel_x");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_x");
+        return false;
+    }
+    psF32 kernel_y = psMetadataLookupF32(&status, md, "kernel_y");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_y");
+        return false;
+    }
+    psF32 kernel_xx = psMetadataLookupF32(&status, md, "kernel_xx");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_xx");
+        return false;
+    }
+    psF32 kernel_xy = psMetadataLookupF32(&status, md, "kernel_xy");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_xy");
+        return false;
+    }
+    psF32 kernel_yy = psMetadataLookupF32(&status, md, "kernel_yy");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_yy");
+        return false;
+    }
     psS32 sources = psMetadataLookupS32(&status, md, "sources");
     if (!status) {
@@ -13940,4 +15427,19 @@
         return false;
     }
+    psF32 dtime_match = psMetadataLookupF32(&status, md, "dtime_match");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_match");
+        return false;
+    }
+    psF32 dtime_phot = psMetadataLookupF32(&status, md, "dtime_phot");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_phot");
+        return false;
+    }
+    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
+        return false;
+    }
     char* hostname = psMetadataLookupPtr(&status, md, "hostname");
     if (!status) {
@@ -13956,5 +15458,5 @@
     }
 
-    return diffSkyfileRowAlloc(diff_id, uri, path_base, bg, bg_stdev, stamps_num, stamps_rms, sources, dtime_diff, hostname, good_frac, fault);
+    return diffSkyfileRowAlloc(diff_id, uri, path_base, bg, bg_stdev, stamps_num, stamps_mean, stamps_rms, norm, bg_diff, kernel_x, kernel_y, kernel_xx, kernel_xy, kernel_yy, sources, dtime_diff, dtime_match, dtime_phot, dtime_script, hostname, good_frac, fault);
 }
 psArray *diffSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -14074,5 +15576,5 @@
 static void stackRunRowFree(stackRunRow *object);
 
-stackRunRow *stackRunRowAlloc(psS64 stack_id, const char *state, const char *workdir, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id, const char *filter)
+stackRunRow *stackRunRowAlloc(psS64 stack_id, const char *state, const char *workdir, const char *label, const char *reduction, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id, const char *filter)
 {
     stackRunRow     *_object;
@@ -14084,4 +15586,6 @@
     _object->state = psStringCopy(state);
     _object->workdir = psStringCopy(workdir);
+    _object->label = psStringCopy(label);
+    _object->reduction = psStringCopy(reduction);
     _object->dvodb = psStringCopy(dvodb);
     _object->registered = psTimeCopy(registered);
@@ -14097,4 +15601,6 @@
     psFree(object->state);
     psFree(object->workdir);
+    psFree(object->label);
+    psFree(object->reduction);
     psFree(object->dvodb);
     psFree(object->registered);
@@ -14122,4 +15628,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "Key", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, "Reduction class", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "255")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
@@ -14160,5 +15676,5 @@
 }
 
-bool stackRunInsert(psDB * dbh, psS64 stack_id, const char *state, const char *workdir, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id, const char *filter)
+bool stackRunInsert(psDB * dbh, psS64 stack_id, const char *state, const char *workdir, const char *label, const char *reduction, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id, const char *filter)
 {
     psMetadata *md = psMetadataAlloc();
@@ -14175,4 +15691,14 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
         psFree(md);
         return false;
@@ -14226,5 +15752,5 @@
 bool stackRunInsertObject(psDB *dbh, stackRunRow *object)
 {
-    return stackRunInsert(dbh, object->stack_id, object->state, object->workdir, object->dvodb, object->registered, object->skycell_id, object->tess_id, object->filter);
+    return stackRunInsert(dbh, object->stack_id, object->state, object->workdir, object->label, object->reduction, object->dvodb, object->registered, object->skycell_id, object->tess_id, object->filter);
 }
 
@@ -14314,4 +15840,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
@@ -14363,4 +15899,14 @@
         return false;
     }
+    char* label = psMetadataLookupPtr(&status, md, "label");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
+        return false;
+    }
+    char* reduction = psMetadataLookupPtr(&status, md, "reduction");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
+        return false;
+    }
     char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");
     if (!status) {
@@ -14389,5 +15935,5 @@
     }
 
-    return stackRunRowAlloc(stack_id, state, workdir, dvodb, registered, skycell_id, tess_id, filter);
+    return stackRunRowAlloc(stack_id, state, workdir, label, reduction, dvodb, registered, skycell_id, tess_id, filter);
 }
 psArray *stackRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -14807,5 +16353,5 @@
 static void stackSumSkyfileRowFree(stackSumSkyfileRow *object);
 
-stackSumSkyfileRow *stackSumSkyfileRowAlloc(psS64 stack_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psF32 dtime_stack, const char *hostname, psF32 good_frac, psS16 fault)
+stackSumSkyfileRow *stackSumSkyfileRowAlloc(psS64 stack_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psF32 dtime_stack, psF32 dtime_match_mean, psF32 dtime_match_stdev, psF32 dtime_initial, psF32 dtime_reject, psF32 dtime_final, psF32 dtime_phot, psF32 dtime_script, psF32 match_mean, psF32 match_stdev, psF32 match_rms, psF32 stamps_mean, psF32 stamps_stdev, psS32 stamps_min, psS32 reject_images, psF32 reject_pix_mean, psF32 reject_pix_stdev, psS32 sources, const char *hostname, psF32 good_frac, psS16 fault)
 {
     stackSumSkyfileRow *_object;
@@ -14820,4 +16366,21 @@
     _object->bg_stdev = bg_stdev;
     _object->dtime_stack = dtime_stack;
+    _object->dtime_match_mean = dtime_match_mean;
+    _object->dtime_match_stdev = dtime_match_stdev;
+    _object->dtime_initial = dtime_initial;
+    _object->dtime_reject = dtime_reject;
+    _object->dtime_final = dtime_final;
+    _object->dtime_phot = dtime_phot;
+    _object->dtime_script = dtime_script;
+    _object->match_mean = match_mean;
+    _object->match_stdev = match_stdev;
+    _object->match_rms = match_rms;
+    _object->stamps_mean = stamps_mean;
+    _object->stamps_stdev = stamps_stdev;
+    _object->stamps_min = stamps_min;
+    _object->reject_images = reject_images;
+    _object->reject_pix_mean = reject_pix_mean;
+    _object->reject_pix_stdev = reject_pix_stdev;
+    _object->sources = sources;
     _object->hostname = psStringCopy(hostname);
     _object->good_frac = good_frac;
@@ -14867,4 +16430,89 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_mean", PS_DATA_F32, "Key", 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_stdev", PS_DATA_F32, "Key", 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_initial", PS_DATA_F32, "Key", 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_initial");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_reject", PS_DATA_F32, "Key", 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_reject");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_final", PS_DATA_F32, "Key", 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_final");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, "Key", 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_mean", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_stdev", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_rms", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_rms");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_stdev", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_min", PS_DATA_S32, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_min");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_images", PS_DATA_S32, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_images");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_mean", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_stdev", PS_DATA_F32, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -14895,5 +16543,5 @@
 }
 
-bool stackSumSkyfileInsert(psDB * dbh, psS64 stack_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psF32 dtime_stack, const char *hostname, psF32 good_frac, psS16 fault)
+bool stackSumSkyfileInsert(psDB * dbh, psS64 stack_id, const char *uri, const char *path_base, psF64 bg, psF64 bg_stdev, psF32 dtime_stack, psF32 dtime_match_mean, psF32 dtime_match_stdev, psF32 dtime_initial, psF32 dtime_reject, psF32 dtime_final, psF32 dtime_phot, psF32 dtime_script, psF32 match_mean, psF32 match_stdev, psF32 match_rms, psF32 stamps_mean, psF32 stamps_stdev, psS32 stamps_min, psS32 reject_images, psF32 reject_pix_mean, psF32 reject_pix_stdev, psS32 sources, const char *hostname, psF32 good_frac, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -14925,4 +16573,89 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_stack", PS_DATA_F32, NULL, dtime_stack)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_stack");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_mean", PS_DATA_F32, NULL, dtime_match_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_stdev", PS_DATA_F32, NULL, dtime_match_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_initial", PS_DATA_F32, NULL, dtime_initial)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_initial");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_reject", PS_DATA_F32, NULL, dtime_reject)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_reject");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_final", PS_DATA_F32, NULL, dtime_final)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_final");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, dtime_phot)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_mean", PS_DATA_F32, NULL, match_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_stdev", PS_DATA_F32, NULL, match_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_rms", PS_DATA_F32, NULL, match_rms)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_rms");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, stamps_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_stdev", PS_DATA_F32, NULL, stamps_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_min", PS_DATA_S32, NULL, stamps_min)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_min");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_images", PS_DATA_S32, NULL, reject_images)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_images");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_mean", PS_DATA_F32, NULL, reject_pix_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_stdev", PS_DATA_F32, NULL, reject_pix_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, sources)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
         psFree(md);
         return false;
@@ -14966,5 +16699,5 @@
 bool stackSumSkyfileInsertObject(psDB *dbh, stackSumSkyfileRow *object)
 {
-    return stackSumSkyfileInsert(dbh, object->stack_id, object->uri, object->path_base, object->bg, object->bg_stdev, object->dtime_stack, object->hostname, object->good_frac, object->fault);
+    return stackSumSkyfileInsert(dbh, object->stack_id, object->uri, object->path_base, object->bg, object->bg_stdev, object->dtime_stack, object->dtime_match_mean, object->dtime_match_stdev, object->dtime_initial, object->dtime_reject, object->dtime_final, object->dtime_phot, object->dtime_script, object->match_mean, object->match_stdev, object->match_rms, object->stamps_mean, object->stamps_stdev, object->stamps_min, object->reject_images, object->reject_pix_mean, object->reject_pix_stdev, object->sources, object->hostname, object->good_frac, object->fault);
 }
 
@@ -15069,4 +16802,89 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_mean", PS_DATA_F32, NULL, object->dtime_match_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_stdev", PS_DATA_F32, NULL, object->dtime_match_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_initial", PS_DATA_F32, NULL, object->dtime_initial)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_initial");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_reject", PS_DATA_F32, NULL, object->dtime_reject)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_reject");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_final", PS_DATA_F32, NULL, object->dtime_final)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_final");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, object->dtime_phot)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_mean", PS_DATA_F32, NULL, object->match_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_stdev", PS_DATA_F32, NULL, object->match_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_rms", PS_DATA_F32, NULL, object->match_rms)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item match_rms");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, object->stamps_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_stdev", PS_DATA_F32, NULL, object->stamps_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_min", PS_DATA_S32, NULL, object->stamps_min)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_min");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_images", PS_DATA_S32, NULL, object->reject_images)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_images");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_mean", PS_DATA_F32, NULL, object->reject_pix_mean)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_mean");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_stdev", PS_DATA_F32, NULL, object->reject_pix_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, object->sources)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
@@ -15123,4 +16941,89 @@
         return false;
     }
+    psF32 dtime_match_mean = psMetadataLookupF32(&status, md, "dtime_match_mean");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_match_mean");
+        return false;
+    }
+    psF32 dtime_match_stdev = psMetadataLookupF32(&status, md, "dtime_match_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_match_stdev");
+        return false;
+    }
+    psF32 dtime_initial = psMetadataLookupF32(&status, md, "dtime_initial");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_initial");
+        return false;
+    }
+    psF32 dtime_reject = psMetadataLookupF32(&status, md, "dtime_reject");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_reject");
+        return false;
+    }
+    psF32 dtime_final = psMetadataLookupF32(&status, md, "dtime_final");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_final");
+        return false;
+    }
+    psF32 dtime_phot = psMetadataLookupF32(&status, md, "dtime_phot");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_phot");
+        return false;
+    }
+    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
+        return false;
+    }
+    psF32 match_mean = psMetadataLookupF32(&status, md, "match_mean");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item match_mean");
+        return false;
+    }
+    psF32 match_stdev = psMetadataLookupF32(&status, md, "match_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item match_stdev");
+        return false;
+    }
+    psF32 match_rms = psMetadataLookupF32(&status, md, "match_rms");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item match_rms");
+        return false;
+    }
+    psF32 stamps_mean = psMetadataLookupF32(&status, md, "stamps_mean");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stamps_mean");
+        return false;
+    }
+    psF32 stamps_stdev = psMetadataLookupF32(&status, md, "stamps_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stamps_stdev");
+        return false;
+    }
+    psS32 stamps_min = psMetadataLookupS32(&status, md, "stamps_min");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stamps_min");
+        return false;
+    }
+    psS32 reject_images = psMetadataLookupS32(&status, md, "reject_images");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reject_images");
+        return false;
+    }
+    psF32 reject_pix_mean = psMetadataLookupF32(&status, md, "reject_pix_mean");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reject_pix_mean");
+        return false;
+    }
+    psF32 reject_pix_stdev = psMetadataLookupF32(&status, md, "reject_pix_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reject_pix_stdev");
+        return false;
+    }
+    psS32 sources = psMetadataLookupS32(&status, md, "sources");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sources");
+        return false;
+    }
     char* hostname = psMetadataLookupPtr(&status, md, "hostname");
     if (!status) {
@@ -15139,5 +17042,5 @@
     }
 
-    return stackSumSkyfileRowAlloc(stack_id, uri, path_base, bg, bg_stdev, dtime_stack, hostname, good_frac, fault);
+    return stackSumSkyfileRowAlloc(stack_id, uri, path_base, bg, bg_stdev, dtime_stack, dtime_match_mean, dtime_match_stdev, dtime_initial, dtime_reject, dtime_final, dtime_phot, dtime_script, match_mean, match_stdev, match_rms, stamps_mean, stamps_stdev, stamps_min, reject_images, reject_pix_mean, reject_pix_stdev, sources, hostname, good_frac, fault);
 }
 psArray *stackSumSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -15257,5 +17160,5 @@
 static void detRunRowFree(detRunRow *object);
 
-detRunRow *detRunRowAlloc(psS64 det_id, psS32 iteration, const char *det_type, const char *mode, const char *state, const char *filelevel, const char *workdir, const char *camera, const char *telescope, const char *exp_type, const char *reduction, const char *filter, psF32 airmass_min, psF32 airmass_max, psF32 exp_time_min, psF32 exp_time_max, psF32 ccd_temp_min, psF32 ccd_temp_max, psF64 posang_min, psF64 posang_max, psTime* registered, psTime* time_begin, psTime* time_end, psTime* use_begin, psTime* use_end, psF32 solang_min, psF32 solang_max, const char *label, psS32 parent)
+detRunRow *detRunRowAlloc(psS64 det_id, psS32 iteration, const char *det_type, const char *mode, const char *state, const char *filelevel, const char *workdir, const char *camera, const char *telescope, const char *exp_type, const char *reduction, const char *filter, psF32 airmass_min, psF32 airmass_max, psF32 exp_time_min, psF32 exp_time_max, psF32 ccd_temp_min, psF32 ccd_temp_max, psF64 posang_min, psF64 posang_max, psTime* registered, psTime* time_begin, psTime* time_end, psTime* use_begin, psTime* use_end, psF32 solang_min, psF32 solang_max, const char *label, psS64 ref_det_id, psS32 ref_iter)
 {
     detRunRow       *_object;
@@ -15292,5 +17195,6 @@
     _object->solang_max = solang_max;
     _object->label = psStringCopy(label);
-    _object->parent = parent;
+    _object->ref_det_id = ref_det_id;
+    _object->ref_iter = ref_iter;
 
     return _object;
@@ -15460,6 +17364,11 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "parent", PS_DATA_S32, "Key", 0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item parent");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, "reference for 'verify' and 'correction' analysis", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, "reference for 'verify' and 'correction' analysis", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
         psFree(md);
         return false;
@@ -15478,5 +17387,5 @@
 }
 
-bool detRunInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *det_type, const char *mode, const char *state, const char *filelevel, const char *workdir, const char *camera, const char *telescope, const char *exp_type, const char *reduction, const char *filter, psF32 airmass_min, psF32 airmass_max, psF32 exp_time_min, psF32 exp_time_max, psF32 ccd_temp_min, psF32 ccd_temp_max, psF64 posang_min, psF64 posang_max, psTime* registered, psTime* time_begin, psTime* time_end, psTime* use_begin, psTime* use_end, psF32 solang_min, psF32 solang_max, const char *label, psS32 parent)
+bool detRunInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *det_type, const char *mode, const char *state, const char *filelevel, const char *workdir, const char *camera, const char *telescope, const char *exp_type, const char *reduction, const char *filter, psF32 airmass_min, psF32 airmass_max, psF32 exp_time_min, psF32 exp_time_max, psF32 ccd_temp_min, psF32 ccd_temp_max, psF64 posang_min, psF64 posang_max, psTime* registered, psTime* time_begin, psTime* time_end, psTime* use_begin, psTime* use_end, psF32 solang_min, psF32 solang_max, const char *label, psS64 ref_det_id, psS32 ref_iter)
 {
     psMetadata *md = psMetadataAlloc();
@@ -15621,6 +17530,11 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "parent", PS_DATA_S32, NULL, parent)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item parent");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, NULL, ref_det_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, NULL, ref_iter)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
         psFree(md);
         return false;
@@ -15649,5 +17563,5 @@
 bool detRunInsertObject(psDB *dbh, detRunRow *object)
 {
-    return detRunInsert(dbh, object->det_id, object->iteration, object->det_type, object->mode, object->state, object->filelevel, object->workdir, object->camera, object->telescope, object->exp_type, object->reduction, object->filter, object->airmass_min, object->airmass_max, object->exp_time_min, object->exp_time_max, object->ccd_temp_min, object->ccd_temp_max, object->posang_min, object->posang_max, object->registered, object->time_begin, object->time_end, object->use_begin, object->use_end, object->solang_min, object->solang_max, object->label, object->parent);
+    return detRunInsert(dbh, object->det_id, object->iteration, object->det_type, object->mode, object->state, object->filelevel, object->workdir, object->camera, object->telescope, object->exp_type, object->reduction, object->filter, object->airmass_min, object->airmass_max, object->exp_time_min, object->exp_time_max, object->ccd_temp_min, object->ccd_temp_max, object->posang_min, object->posang_max, object->registered, object->time_begin, object->time_end, object->use_begin, object->use_end, object->solang_min, object->solang_max, object->label, object->ref_det_id, object->ref_iter);
 }
 
@@ -15862,6 +17776,11 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "parent", PS_DATA_S32, NULL, object->parent)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item parent");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, NULL, object->ref_det_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, NULL, object->ref_iter)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
         psFree(md);
         return false;
@@ -16016,11 +17935,16 @@
         return false;
     }
-    psS32 parent = psMetadataLookupS32(&status, md, "parent");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item parent");
-        return false;
-    }
-
-    return detRunRowAlloc(det_id, iteration, det_type, mode, state, filelevel, workdir, camera, telescope, exp_type, reduction, filter, airmass_min, airmass_max, exp_time_min, exp_time_max, ccd_temp_min, ccd_temp_max, posang_min, posang_max, registered, time_begin, time_end, use_begin, use_end, solang_min, solang_max, label, parent);
+    psS64 ref_det_id = psMetadataLookupS64(&status, md, "ref_det_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item ref_det_id");
+        return false;
+    }
+    psS32 ref_iter = psMetadataLookupS32(&status, md, "ref_iter");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item ref_iter");
+        return false;
+    }
+
+    return detRunRowAlloc(det_id, iteration, det_type, mode, state, filelevel, workdir, camera, telescope, exp_type, reduction, filter, airmass_min, airmass_max, exp_time_min, exp_time_max, ccd_temp_min, ccd_temp_max, posang_min, posang_max, registered, time_begin, time_end, use_begin, use_end, solang_min, solang_max, label, ref_det_id, ref_iter);
 }
 psArray *detRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -16482,5 +18406,5 @@
 static void detProcessedImfileRowFree(detProcessedImfileRow *object);
 
-detProcessedImfileRow *detProcessedImfileRowAlloc(psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+detProcessedImfileRow *detProcessedImfileRowAlloc(psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     detProcessedImfileRow *_object;
@@ -16506,4 +18430,5 @@
     _object->user_5 = user_5;
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
 
@@ -16517,4 +18442,5 @@
     psFree(object->recipe);
     psFree(object->path_base);
+    psFree(object->data_state);
 }
 
@@ -16607,4 +18533,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -16625,5 +18556,5 @@
 }
 
-bool detProcessedImfileInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+bool detProcessedImfileInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -16710,4 +18641,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -16741,5 +18677,5 @@
 bool detProcessedImfileInsertObject(psDB *dbh, detProcessedImfileRow *object)
 {
-    return detProcessedImfileInsert(dbh, object->det_id, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
+    return detProcessedImfileInsert(dbh, object->det_id, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->data_state, object->fault);
 }
 
@@ -16899,4 +18835,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -16998,4 +18939,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -17004,5 +18950,5 @@
     }
 
-    return detProcessedImfileRowAlloc(det_id, exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
+    return detProcessedImfileRowAlloc(det_id, exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, data_state, fault);
 }
 psArray *detProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -17122,5 +19068,5 @@
 static void detProcessedExpRowFree(detProcessedExpRow *object);
 
-detProcessedExpRow *detProcessedExpRowAlloc(psS64 det_id, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+detProcessedExpRow *detProcessedExpRowAlloc(psS64 det_id, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     detProcessedExpRow *_object;
@@ -17144,4 +19090,5 @@
     _object->user_5 = user_5;
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
 
@@ -17153,4 +19100,5 @@
     psFree(object->recipe);
     psFree(object->path_base);
+    psFree(object->data_state);
 }
 
@@ -17233,4 +19181,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -17251,5 +19204,5 @@
 }
 
-bool detProcessedExpInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+bool detProcessedExpInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -17326,4 +19279,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -17357,5 +19315,5 @@
 bool detProcessedExpInsertObject(psDB *dbh, detProcessedExpRow *object)
 {
-    return detProcessedExpInsert(dbh, object->det_id, object->exp_id, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
+    return detProcessedExpInsert(dbh, object->det_id, object->exp_id, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->data_state, object->fault);
 }
 
@@ -17505,4 +19463,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -17594,4 +19557,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -17600,5 +19568,5 @@
     }
 
-    return detProcessedExpRowAlloc(det_id, exp_id, recipe, bg, bg_stdev, bg_mean_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
+    return detProcessedExpRowAlloc(det_id, exp_id, recipe, bg, bg_stdev, bg_mean_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, data_state, fault);
 }
 psArray *detProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -17718,5 +19686,5 @@
 static void detStackedImfileRowFree(detStackedImfileRow *object);
 
-detStackedImfileRow *detStackedImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, psS16 fault)
+detStackedImfileRow *detStackedImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *data_state, psS16 fault)
 {
     detStackedImfileRow *_object;
@@ -17738,4 +19706,5 @@
     _object->user_4 = user_4;
     _object->user_5 = user_5;
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
 
@@ -17748,4 +19717,5 @@
     psFree(object->uri);
     psFree(object->recipe);
+    psFree(object->data_state);
 }
 
@@ -17818,4 +19788,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -17836,5 +19811,5 @@
 }
 
-bool detStackedImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, psS16 fault)
+bool detStackedImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *data_state, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -17901,4 +19876,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "user_5", PS_DATA_F64, NULL, user_5)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item user_5");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -17932,5 +19912,5 @@
 bool detStackedImfileInsertObject(psDB *dbh, detStackedImfileRow *object)
 {
-    return detStackedImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->fault);
+    return detStackedImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->data_state, object->fault);
 }
 
@@ -18070,4 +20050,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -18149,4 +20134,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -18155,5 +20145,5 @@
     }
 
-    return detStackedImfileRowAlloc(det_id, iteration, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, fault);
+    return detStackedImfileRowAlloc(det_id, iteration, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, data_state, fault);
 }
 psArray *detStackedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -18273,5 +20263,5 @@
 static void detNormalizedStatImfileRowFree(detNormalizedStatImfileRow *object);
 
-detNormalizedStatImfileRow *detNormalizedStatImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, psF32 norm, psS16 fault)
+detNormalizedStatImfileRow *detNormalizedStatImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, psF32 norm, const char *data_state, psS16 fault)
 {
     detNormalizedStatImfileRow *_object;
@@ -18284,4 +20274,5 @@
     _object->class_id = psStringCopy(class_id);
     _object->norm = norm;
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
 
@@ -18292,4 +20283,5 @@
 {
     psFree(object->class_id);
+    psFree(object->data_state);
 }
 
@@ -18317,4 +20309,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -18335,5 +20332,5 @@
 }
 
-bool detNormalizedStatImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, psF32 norm, psS16 fault)
+bool detNormalizedStatImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, psF32 norm, const char *data_state, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -18355,4 +20352,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "norm", PS_DATA_F32, NULL, norm)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -18386,5 +20388,5 @@
 bool detNormalizedStatImfileInsertObject(psDB *dbh, detNormalizedStatImfileRow *object)
 {
-    return detNormalizedStatImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->norm, object->fault);
+    return detNormalizedStatImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->norm, object->data_state, object->fault);
 }
 
@@ -18479,4 +20481,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -18513,4 +20520,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -18519,5 +20531,5 @@
     }
 
-    return detNormalizedStatImfileRowAlloc(det_id, iteration, class_id, norm, fault);
+    return detNormalizedStatImfileRowAlloc(det_id, iteration, class_id, norm, data_state, fault);
 }
 psArray *detNormalizedStatImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -18637,5 +20649,5 @@
 static void detNormalizedImfileRowFree(detNormalizedImfileRow *object);
 
-detNormalizedImfileRow *detNormalizedImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+detNormalizedImfileRow *detNormalizedImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     detNormalizedImfileRow *_object;
@@ -18657,4 +20669,5 @@
     _object->user_5 = user_5;
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
 
@@ -18667,4 +20680,5 @@
     psFree(object->uri);
     psFree(object->path_base);
+    psFree(object->data_state);
 }
 
@@ -18737,4 +20751,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -18755,5 +20774,5 @@
 }
 
-bool detNormalizedImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+bool detNormalizedImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -18820,4 +20839,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -18851,5 +20875,5 @@
 bool detNormalizedImfileInsertObject(psDB *dbh, detNormalizedImfileRow *object)
 {
-    return detNormalizedImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
+    return detNormalizedImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->data_state, object->fault);
 }
 
@@ -18989,4 +21013,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -19068,4 +21097,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -19074,5 +21108,5 @@
     }
 
-    return detNormalizedImfileRowAlloc(det_id, iteration, class_id, uri, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, path_base, fault);
+    return detNormalizedImfileRowAlloc(det_id, iteration, class_id, uri, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, path_base, data_state, fault);
 }
 psArray *detNormalizedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -19192,5 +21226,5 @@
 static void detNormalizedExpRowFree(detNormalizedExpRow *object);
 
-detNormalizedExpRow *detNormalizedExpRowAlloc(psS64 det_id, psS32 iteration, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+detNormalizedExpRow *detNormalizedExpRowAlloc(psS64 det_id, psS32 iteration, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     detNormalizedExpRow *_object;
@@ -19211,4 +21245,5 @@
     _object->user_5 = user_5;
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
 
@@ -19220,4 +21255,5 @@
     psFree(object->recipe);
     psFree(object->path_base);
+    psFree(object->data_state);
 }
 
@@ -19285,4 +21321,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -19303,5 +21344,5 @@
 }
 
-bool detNormalizedExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+bool detNormalizedExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -19363,4 +21404,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -19394,5 +21440,5 @@
 bool detNormalizedExpInsertObject(psDB *dbh, detNormalizedExpRow *object)
 {
-    return detNormalizedExpInsert(dbh, object->det_id, object->iteration, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
+    return detNormalizedExpInsert(dbh, object->det_id, object->iteration, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->data_state, object->fault);
 }
 
@@ -19527,4 +21573,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -19601,4 +21652,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -19607,5 +21663,5 @@
     }
 
-    return detNormalizedExpRowAlloc(det_id, iteration, recipe, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, path_base, fault);
+    return detNormalizedExpRowAlloc(det_id, iteration, recipe, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, path_base, data_state, fault);
 }
 psArray *detNormalizedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -19725,5 +21781,5 @@
 static void detResidImfileRowFree(detResidImfileRow *object);
 
-detResidImfileRow *detResidImfileRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bg_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+detResidImfileRow *detResidImfileRowAlloc(psS64 det_id, psS32 iteration, psS64 ref_det_id, psS32 ref_iter, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bg_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     detResidImfileRow *_object;
@@ -19734,4 +21790,6 @@
     _object->det_id = det_id;
     _object->iteration = iteration;
+    _object->ref_det_id = ref_det_id;
+    _object->ref_iter = ref_iter;
     _object->exp_id = exp_id;
     _object->class_id = psStringCopy(class_id);
@@ -19756,4 +21814,5 @@
     _object->user_5 = user_5;
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
 
@@ -19767,4 +21826,5 @@
     psFree(object->recipe);
     psFree(object->path_base);
+    psFree(object->data_state);
 }
 
@@ -19782,4 +21842,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, "detrend master actually applied (same as above for 'master', but not for 'verify')", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, "detrend master actually applied (same as above for 'master', but not for 'verify')", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration) ref detNormalizedExp(det_id, iteration)", 64)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
@@ -19892,4 +21962,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -19910,5 +21985,5 @@
 }
 
-bool detResidImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bg_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+bool detResidImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 ref_det_id, psS32 ref_iter, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bg_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -19923,4 +21998,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, NULL, ref_det_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, NULL, ref_iter)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
@@ -20030,4 +22115,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -20061,5 +22151,5 @@
 bool detResidImfileInsertObject(psDB *dbh, detResidImfileRow *object)
 {
-    return detResidImfileInsert(dbh, object->det_id, object->iteration, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bg_skewness, object->bg_kurtosis, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->fringe_resid_0, object->fringe_resid_1, object->fringe_resid_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
+    return detResidImfileInsert(dbh, object->det_id, object->iteration, object->ref_det_id, object->ref_iter, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bg_skewness, object->bg_kurtosis, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->fringe_resid_0, object->fringe_resid_1, object->fringe_resid_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->data_state, object->fault);
 }
 
@@ -20144,4 +22234,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, NULL, object->ref_det_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, NULL, object->ref_iter)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
@@ -20254,4 +22354,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -20278,4 +22383,14 @@
         return false;
     }
+    psS64 ref_det_id = psMetadataLookupS64(&status, md, "ref_det_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item ref_det_id");
+        return false;
+    }
+    psS32 ref_iter = psMetadataLookupS32(&status, md, "ref_iter");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item ref_iter");
+        return false;
+    }
     psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     if (!status) {
@@ -20388,4 +22503,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -20394,5 +22514,5 @@
     }
 
-    return detResidImfileRowAlloc(det_id, iteration, exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, bg_skewness, bg_kurtosis, bin_stdev, fringe_0, fringe_1, fringe_2, fringe_resid_0, fringe_resid_1, fringe_resid_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
+    return detResidImfileRowAlloc(det_id, iteration, ref_det_id, ref_iter, exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, bg_skewness, bg_kurtosis, bin_stdev, fringe_0, fringe_1, fringe_2, fringe_resid_0, fringe_resid_1, fringe_resid_2, user_1, user_2, user_3, user_4, user_5, path_base, data_state, fault);
 }
 psArray *detResidImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -20512,5 +22632,5 @@
 static void detResidExpRowFree(detResidExpRow *object);
 
-detResidExpRow *detResidExpRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bg_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault)
+detResidExpRow *detResidExpRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bg_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, bool accept, psS16 fault)
 {
     detResidExpRow  *_object;
@@ -20541,4 +22661,5 @@
     _object->user_5 = user_5;
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->accept = accept;
     _object->fault = fault;
@@ -20551,4 +22672,5 @@
     psFree(object->recipe);
     psFree(object->path_base);
+    psFree(object->data_state);
 }
 
@@ -20666,4 +22788,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "accept", PS_DATA_BOOL, NULL, 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
@@ -20689,5 +22816,5 @@
 }
 
-bool detResidExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bg_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault)
+bool detResidExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bg_skewness, psF64 bg_kurtosis, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 fringe_resid_0, psF64 fringe_resid_1, psF64 fringe_resid_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, bool accept, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -20799,4 +22926,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -20835,5 +22967,5 @@
 bool detResidExpInsertObject(psDB *dbh, detResidExpRow *object)
 {
-    return detResidExpInsert(dbh, object->det_id, object->iteration, object->exp_id, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bg_skewness, object->bg_kurtosis, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->fringe_resid_0, object->fringe_resid_1, object->fringe_resid_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->accept, object->fault);
+    return detResidExpInsert(dbh, object->det_id, object->iteration, object->exp_id, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bg_skewness, object->bg_kurtosis, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->fringe_resid_0, object->fringe_resid_1, object->fringe_resid_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->data_state, object->accept, object->fault);
 }
 
@@ -21018,4 +23150,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "accept", PS_DATA_BOOL, NULL, object->accept)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
@@ -21147,4 +23284,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     bool accept = psMetadataLookupBool(&status, md, "accept");
     if (!status) {
@@ -21158,5 +23300,5 @@
     }
 
-    return detResidExpRowAlloc(det_id, iteration, exp_id, recipe, bg, bg_stdev, bg_mean_stdev, bg_skewness, bg_kurtosis, bin_stdev, fringe_0, fringe_1, fringe_2, fringe_resid_0, fringe_resid_1, fringe_resid_2, user_1, user_2, user_3, user_4, user_5, path_base, accept, fault);
+    return detResidExpRowAlloc(det_id, iteration, exp_id, recipe, bg, bg_stdev, bg_mean_stdev, bg_skewness, bg_kurtosis, bin_stdev, fringe_0, fringe_1, fringe_2, fringe_resid_0, fringe_resid_1, fringe_resid_2, user_1, user_2, user_3, user_4, user_5, path_base, data_state, accept, fault);
 }
 psArray *detResidExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -21276,5 +23418,5 @@
 static void detRunSummaryRowFree(detRunSummaryRow *object);
 
-detRunSummaryRow *detRunSummaryRowAlloc(psS64 det_id, psS32 iteration, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, bool accept, psS16 fault)
+detRunSummaryRow *detRunSummaryRowAlloc(psS64 det_id, psS32 iteration, const char *data_state, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, bool accept, psS16 fault)
 {
     detRunSummaryRow *_object;
@@ -21285,4 +23427,5 @@
     _object->det_id = det_id;
     _object->iteration = iteration;
+    _object->data_state = psStringCopy(data_state);
     _object->bg = bg;
     _object->bg_stdev = bg_stdev;
@@ -21296,4 +23439,5 @@
 static void detRunSummaryRowFree(detRunSummaryRow *object)
 {
+    psFree(object->data_state);
 }
 
@@ -21311,4 +23455,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, goto_cleaned, cleaned, goto_full, goto_purged, purged", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
@@ -21349,5 +23498,5 @@
 }
 
-bool detRunSummaryInsert(psDB * dbh, psS64 det_id, psS32 iteration, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, bool accept, psS16 fault)
+bool detRunSummaryInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *data_state, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, bool accept, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -21359,4 +23508,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, NULL, iteration)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -21410,5 +23564,5 @@
 bool detRunSummaryInsertObject(psDB *dbh, detRunSummaryRow *object)
 {
-    return detRunSummaryInsert(dbh, object->det_id, object->iteration, object->bg, object->bg_stdev, object->bg_mean_stdev, object->accept, object->fault);
+    return detRunSummaryInsert(dbh, object->det_id, object->iteration, object->data_state, object->bg, object->bg_stdev, object->bg_mean_stdev, object->accept, object->fault);
 }
 
@@ -21493,4 +23647,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
@@ -21537,4 +23696,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psF64 bg = psMetadataLookupF64(&status, md, "bg");
     if (!status) {
@@ -21563,5 +23727,5 @@
     }
 
-    return detRunSummaryRowAlloc(det_id, iteration, bg, bg_stdev, bg_mean_stdev, accept, fault);
+    return detRunSummaryRowAlloc(det_id, iteration, data_state, bg, bg_stdev, bg_mean_stdev, accept, fault);
 }
 psArray *detRunSummarySelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -21681,5 +23845,5 @@
 static void detRegisteredImfileRowFree(detRegisteredImfileRow *object);
 
-detRegisteredImfileRow *detRegisteredImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+detRegisteredImfileRow *detRegisteredImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     detRegisteredImfileRow *_object;
@@ -21701,4 +23865,5 @@
     _object->user_5 = user_5;
     _object->path_base = psStringCopy(path_base);
+    _object->data_state = psStringCopy(data_state);
     _object->fault = fault;
 
@@ -21711,4 +23876,5 @@
     psFree(object->uri);
     psFree(object->path_base);
+    psFree(object->data_state);
 }
 
@@ -21781,4 +23947,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, cleaned, purged (only track end states; request states are in detRunSummary by iteration)", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -21799,5 +23970,5 @@
 }
 
-bool detRegisteredImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
+bool detRegisteredImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, const char *uri, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, const char *data_state, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -21864,4 +24035,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
         psFree(md);
         return false;
@@ -21895,5 +24071,5 @@
 bool detRegisteredImfileInsertObject(psDB *dbh, detRegisteredImfileRow *object)
 {
-    return detRegisteredImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
+    return detRegisteredImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->data_state, object->fault);
 }
 
@@ -22033,4 +24209,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
@@ -22112,4 +24293,9 @@
         return false;
     }
+    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
+        return false;
+    }
     psS16 fault = psMetadataLookupS16(&status, md, "fault");
     if (!status) {
@@ -22118,5 +24304,5 @@
     }
 
-    return detRegisteredImfileRowAlloc(det_id, iteration, class_id, uri, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, path_base, fault);
+    return detRegisteredImfileRowAlloc(det_id, iteration, class_id, uri, bg, bg_stdev, bg_mean_stdev, user_1, user_2, user_3, user_4, user_5, path_base, data_state, fault);
 }
 psArray *detRegisteredImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -25506,5 +27692,5 @@
 static void flatcorrRunRowFree(flatcorrRunRow *object);
 
-flatcorrRunRow *flatcorrRunRowAlloc(psS64 corr_id, const char *dvodb, const char *filter, const char *state, const char *workdir, const char *label, const char *stats, const char *region)
+flatcorrRunRow *flatcorrRunRowAlloc(psS64 corr_id, const char *dvodb, const char *filter, const char *state, const char *workdir, const char *label, const char *reduction, const char *region, const char *hostname, psS16 fault)
 {
     flatcorrRunRow  *_object;
@@ -25519,6 +27705,8 @@
     _object->workdir = psStringCopy(workdir);
     _object->label = psStringCopy(label);
-    _object->stats = psStringCopy(stats);
+    _object->reduction = psStringCopy(reduction);
     _object->region = psStringCopy(region);
+    _object->hostname = psStringCopy(hostname);
+    _object->fault = fault;
 
     return _object;
@@ -25532,6 +27720,7 @@
     psFree(object->workdir);
     psFree(object->label);
-    psFree(object->stats);
+    psFree(object->reduction);
     psFree(object->region);
+    psFree(object->hostname);
 }
 
@@ -25569,14 +27758,24 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "stats", PS_DATA_STRING, NULL, "255")) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "region", PS_DATA_STRING, NULL, "255")) {
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "region", PS_DATA_STRING, NULL, "64")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item region");
         psFree(md);
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
+        psFree(md);
+        return false;
+    }
 
     bool status = psDBCreateTable(dbh, FLATCORRRUN_TABLE_NAME, md);
@@ -25592,5 +27791,5 @@
 }
 
-bool flatcorrRunInsert(psDB * dbh, psS64 corr_id, const char *dvodb, const char *filter, const char *state, const char *workdir, const char *label, const char *stats, const char *region)
+bool flatcorrRunInsert(psDB * dbh, psS64 corr_id, const char *dvodb, const char *filter, const char *state, const char *workdir, const char *label, const char *reduction, const char *region, const char *hostname, psS16 fault)
 {
     psMetadata *md = psMetadataAlloc();
@@ -25625,6 +27824,6 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "stats", PS_DATA_STRING, NULL, stats)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
         psFree(md);
         return false;
@@ -25632,4 +27831,14 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "region", PS_DATA_STRING, NULL, region)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item region");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, hostname)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
         psFree(md);
         return false;
@@ -25658,5 +27867,5 @@
 bool flatcorrRunInsertObject(psDB *dbh, flatcorrRunRow *object)
 {
-    return flatcorrRunInsert(dbh, object->corr_id, object->dvodb, object->filter, object->state, object->workdir, object->label, object->stats, object->region);
+    return flatcorrRunInsert(dbh, object->corr_id, object->dvodb, object->filter, object->state, object->workdir, object->label, object->reduction, object->region, object->hostname, object->fault);
 }
 
@@ -25761,6 +27970,6 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "stats", PS_DATA_STRING, NULL, object->stats)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
         psFree(md);
         return false;
@@ -25771,4 +27980,14 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
+        psFree(md);
+        return false;
+    }
 
 
@@ -25810,7 +28029,7 @@
         return false;
     }
-    char* stats = psMetadataLookupPtr(&status, md, "stats");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stats");
+    char* reduction = psMetadataLookupPtr(&status, md, "reduction");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
         return false;
     }
@@ -25820,6 +28039,16 @@
         return false;
     }
-
-    return flatcorrRunRowAlloc(corr_id, dvodb, filter, state, workdir, label, stats, region);
+    char* hostname = psMetadataLookupPtr(&status, md, "hostname");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item hostname");
+        return false;
+    }
+    psS16 fault = psMetadataLookupS16(&status, md, "fault");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault");
+        return false;
+    }
+
+    return flatcorrRunRowAlloc(corr_id, dvodb, filter, state, workdir, label, reduction, region, hostname, fault);
 }
 psArray *flatcorrRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -25937,12 +28166,12 @@
     return true;
 }
-static void flatcorrExpRowFree(flatcorrExpRow *object);
-
-flatcorrExpRow *flatcorrExpRowAlloc(psS64 corr_id, psS64 chip_id)
-{
-    flatcorrExpRow  *_object;
-
-    _object = psAlloc(sizeof(flatcorrExpRow));
-    psMemSetDeallocator(_object, (psFreeFunc)flatcorrExpRowFree);
+static void flatcorrChipLinkRowFree(flatcorrChipLinkRow *object);
+
+flatcorrChipLinkRow *flatcorrChipLinkRowAlloc(psS64 corr_id, psS64 chip_id)
+{
+    flatcorrChipLinkRow *_object;
+
+    _object = psAlloc(sizeof(flatcorrChipLinkRow));
+    psMemSetDeallocator(_object, (psFreeFunc)flatcorrChipLinkRowFree);
 
     _object->corr_id = corr_id;
@@ -25952,9 +28181,9 @@
 }
 
-static void flatcorrExpRowFree(flatcorrExpRow *object)
-{
-}
-
-bool flatcorrExpCreateTable(psDB *dbh)
+static void flatcorrChipLinkRowFree(flatcorrChipLinkRow *object)
+{
+}
+
+bool flatcorrChipLinkCreateTable(psDB *dbh)
 {
     psMetadata *md = psMetadataAlloc();
@@ -25964,5 +28193,5 @@
         return false;
     }
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 64)) {
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
         psFree(md);
@@ -25970,5 +28199,5 @@
     }
 
-    bool status = psDBCreateTable(dbh, FLATCORREXP_TABLE_NAME, md);
+    bool status = psDBCreateTable(dbh, FLATCORRCHIPLINK_TABLE_NAME, md);
 
     psFree(md);
@@ -25977,10 +28206,10 @@
 }
 
-bool flatcorrExpDropTable(psDB *dbh)
-{
-    return psDBDropTable(dbh, FLATCORREXP_TABLE_NAME);
-}
-
-bool flatcorrExpInsert(psDB * dbh, psS64 corr_id, psS64 chip_id)
+bool flatcorrChipLinkDropTable(psDB *dbh)
+{
+    return psDBDropTable(dbh, FLATCORRCHIPLINK_TABLE_NAME);
+}
+
+bool flatcorrChipLinkInsert(psDB * dbh, psS64 corr_id, psS64 chip_id)
 {
     psMetadata *md = psMetadataAlloc();
@@ -25996,5 +28225,5 @@
     }
 
-    bool status = psDBInsertOneRow(dbh, FLATCORREXP_TABLE_NAME, md);
+    bool status = psDBInsertOneRow(dbh, FLATCORRCHIPLINK_TABLE_NAME, md);
     psFree(md);
 
@@ -26002,11 +28231,11 @@
 }
 
-long long flatcorrExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
+long long flatcorrChipLinkDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
 {
     long long       deleted = 0;
 
-    long long count = psDBDeleteRows(dbh, FLATCORREXP_TABLE_NAME, where, limit);
+    long long count = psDBDeleteRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, limit);
     if (count < 0) {
-        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrExp");
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrChipLink");
         return count;
 
@@ -26016,13 +28245,13 @@
     return deleted;
 }
-bool flatcorrExpInsertObject(psDB *dbh, flatcorrExpRow *object)
-{
-    return flatcorrExpInsert(dbh, object->corr_id, object->chip_id);
-}
-
-bool flatcorrExpInsertObjects(psDB *dbh, psArray *objects)
+bool flatcorrChipLinkInsertObject(psDB *dbh, flatcorrChipLinkRow *object)
+{
+    return flatcorrChipLinkInsert(dbh, object->corr_id, object->chip_id);
+}
+
+bool flatcorrChipLinkInsertObjects(psDB *dbh, psArray *objects)
 {
     for (long i = 0; i < psArrayLength(objects); i++) {
-        if (!flatcorrExpInsertObject(dbh, objects->data[i])) {
+        if (!flatcorrChipLinkInsertObject(dbh, objects->data[i])) {
             return false;
         }
@@ -26032,11 +28261,11 @@
 }
 
-bool flatcorrExpInsertFits(psDB *dbh, const psFits *fits)
+bool flatcorrChipLinkInsertFits(psDB *dbh, const psFits *fits)
 {
     psArray         *rowSet;
 
-    // move to (the first?) extension named  FLATCORREXP_TABLE_NAME
-    if (!psFitsMoveExtName(fits, FLATCORREXP_TABLE_NAME)) {
-        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", FLATCORREXP_TABLE_NAME);
+    // move to (the first?) extension named  FLATCORRCHIPLINK_TABLE_NAME
+    if (!psFitsMoveExtName(fits, FLATCORRCHIPLINK_TABLE_NAME)) {
+        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", FLATCORRCHIPLINK_TABLE_NAME);
         return false;
     }
@@ -26056,5 +28285,5 @@
     }
 
-    if (!psDBInsertRows(dbh, FLATCORREXP_TABLE_NAME, rowSet)) {
+    if (!psDBInsertRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, rowSet)) {
         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
         psFree(rowSet);
@@ -26067,9 +28296,9 @@
 }
 
-bool flatcorrExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
+bool flatcorrChipLinkSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
 {
     psArray         *rowSet;
 
-    rowSet = psDBSelectRows(dbh, FLATCORREXP_TABLE_NAME, where, limit);
+    rowSet = psDBSelectRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, limit);
     if (!rowSet) {
         return false;
@@ -26077,5 +28306,5 @@
 
     // output to fits
-    if (!psFitsWriteTable(fits, NULL, rowSet, FLATCORREXP_TABLE_NAME)) {
+    if (!psFitsWriteTable(fits, NULL, rowSet, FLATCORRCHIPLINK_TABLE_NAME)) {
         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
         psFree(rowSet);
@@ -26088,5 +28317,5 @@
 }
 
-psMetadata *flatcorrExpMetadataFromObject(const flatcorrExpRow *object)
+psMetadata *flatcorrChipLinkMetadataFromObject(const flatcorrChipLinkRow *object)
 {
     psMetadata *md = psMetadataAlloc();
@@ -26106,5 +28335,5 @@
 }
 
-flatcorrExpRow *flatcorrExpObjectFromMetadata(psMetadata *md)
+flatcorrChipLinkRow *flatcorrChipLinkObjectFromMetadata(psMetadata *md)
 {
 
@@ -26121,7 +28350,7 @@
     }
 
-    return flatcorrExpRowAlloc(corr_id, chip_id);
-}
-psArray *flatcorrExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
+    return flatcorrChipLinkRowAlloc(corr_id, chip_id);
+}
+psArray *flatcorrChipLinkSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
 {
     psArray         *rowSet;
@@ -26129,5 +28358,5 @@
     psU64           i;
 
-    rowSet = psDBSelectRows(dbh, FLATCORREXP_TABLE_NAME, where, limit);
+    rowSet = psDBSelectRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, limit);
     if (!rowSet) {
         return NULL;
@@ -26139,5 +28368,5 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        flatcorrExpRow *object = flatcorrExpObjectFromMetadata(rowSet->data[i]);
+        flatcorrChipLinkRow *object = flatcorrChipLinkObjectFromMetadata(rowSet->data[i]);
         if (!object) {
             psFree(object);
@@ -26154,11 +28383,11 @@
     return returnSet;
 }
-bool flatcorrExpDeleteObject(psDB *dbh, const flatcorrExpRow *object)
-{
-    psMetadata *where = flatcorrExpMetadataFromObject(object);
-    long long count = psDBDeleteRows(dbh, FLATCORREXP_TABLE_NAME, where, 0);
+bool flatcorrChipLinkDeleteObject(psDB *dbh, const flatcorrChipLinkRow *object)
+{
+    psMetadata *where = flatcorrChipLinkMetadataFromObject(object);
+    long long count = psDBDeleteRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, 0);
     psFree(where);
     if (count < 0) {
-        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrExp");
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrChipLink");
         return false;
     }
@@ -26166,21 +28395,21 @@
         // XXX should this be a psAbort() instead?  It is possible that
         // having an object match multiple rows was by design.
-        psError(PS_ERR_UNKNOWN, true, "flatcorrExpRow object matched more then one row.  Check your database schema");
-        return false;
-    }
-
-    return true;
-}
-long long flatcorrExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
+        psError(PS_ERR_UNKNOWN, true, "flatcorrChipLinkRow object matched more then one row.  Check your database schema");
+        return false;
+    }
+
+    return true;
+}
+long long flatcorrChipLinkDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
 {
     long long       deleted = 0;
 
     for (long long i = 0; i < objects->n; i++) {
-        flatcorrExpRow *object = objects->data[i];
-        psMetadata *where = flatcorrExpMetadataFromObject(object);
-        long long count = psDBDeleteRows(dbh, FLATCORREXP_TABLE_NAME, where, limit);
+        flatcorrChipLinkRow *object = objects->data[i];
+        psMetadata *where = flatcorrChipLinkMetadataFromObject(object);
+        long long count = psDBDeleteRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, limit);
         psFree(where);
         if (count < 0) {
-            psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrExp");
+            psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrChipLink");
             return count;
         }
@@ -26191,5 +28420,5 @@
     return deleted;
 }
-bool flatcorrExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
+bool flatcorrChipLinkPrintObjects(FILE *stream, psArray *objects, bool mdcf)
 {
     PS_ASSERT_PTR_NON_NULL(objects, false);
@@ -26197,9 +28426,9 @@
     psMetadata *output = psMetadataAlloc();
     for (long i = 0; i < psArrayLength(objects); i++) {
-        psMetadata *md = flatcorrExpMetadataFromObject(objects->data[i]);
+        psMetadata *md = flatcorrChipLinkMetadataFromObject(objects->data[i]);
         if (!psMetadataAddMetadata(
             output,
             PS_LIST_TAIL,
-            FLATCORREXP_TABLE_NAME,
+            FLATCORRCHIPLINK_TABLE_NAME,
             PS_META_DUPLICATE_OK,
             NULL,
@@ -26222,9 +28451,330 @@
     return true;
 }
-bool flatcorrExpPrintObject(FILE *stream, flatcorrExpRow *object, bool mdcf)
+bool flatcorrChipLinkPrintObject(FILE *stream, flatcorrChipLinkRow *object, bool mdcf)
 {
     PS_ASSERT_PTR_NON_NULL(object, false);
 
-    psMetadata *md = flatcorrExpMetadataFromObject(object);
+    psMetadata *md = flatcorrChipLinkMetadataFromObject(object);
+
+    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
+        psFree(md);
+    }
+
+    psFree(md);
+
+    return true;
+}
+static void flatcorrCamLinkRowFree(flatcorrCamLinkRow *object);
+
+flatcorrCamLinkRow *flatcorrCamLinkRowAlloc(psS64 corr_id, psS64 chip_id, psS64 cam_id)
+{
+    flatcorrCamLinkRow *_object;
+
+    _object = psAlloc(sizeof(flatcorrCamLinkRow));
+    psMemSetDeallocator(_object, (psFreeFunc)flatcorrCamLinkRowFree);
+
+    _object->corr_id = corr_id;
+    _object->chip_id = chip_id;
+    _object->cam_id = cam_id;
+
+    return _object;
+}
+
+static void flatcorrCamLinkRowFree(flatcorrCamLinkRow *object)
+{
+}
+
+bool flatcorrCamLinkCreateTable(psDB *dbh)
+{
+    psMetadata *md = psMetadataAlloc();
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, "Primary Key fkey(corr_id) ref flatcorrRun(corr_id)", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
+        psFree(md);
+        return false;
+    }
+
+    bool status = psDBCreateTable(dbh, FLATCORRCAMLINK_TABLE_NAME, md);
+
+    psFree(md);
+
+    return status;
+}
+
+bool flatcorrCamLinkDropTable(psDB *dbh)
+{
+    return psDBDropTable(dbh, FLATCORRCAMLINK_TABLE_NAME);
+}
+
+bool flatcorrCamLinkInsert(psDB * dbh, psS64 corr_id, psS64 chip_id, psS64 cam_id)
+{
+    psMetadata *md = psMetadataAlloc();
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, corr_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, NULL, cam_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
+        psFree(md);
+        return false;
+    }
+
+    bool status = psDBInsertOneRow(dbh, FLATCORRCAMLINK_TABLE_NAME, md);
+    psFree(md);
+
+    return status;
+}
+
+long long flatcorrCamLinkDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
+{
+    long long       deleted = 0;
+
+    long long count = psDBDeleteRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, limit);
+    if (count < 0) {
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrCamLink");
+        return count;
+
+        deleted += count;
+    }
+
+    return deleted;
+}
+bool flatcorrCamLinkInsertObject(psDB *dbh, flatcorrCamLinkRow *object)
+{
+    return flatcorrCamLinkInsert(dbh, object->corr_id, object->chip_id, object->cam_id);
+}
+
+bool flatcorrCamLinkInsertObjects(psDB *dbh, psArray *objects)
+{
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        if (!flatcorrCamLinkInsertObject(dbh, objects->data[i])) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool flatcorrCamLinkInsertFits(psDB *dbh, const psFits *fits)
+{
+    psArray         *rowSet;
+
+    // move to (the first?) extension named  FLATCORRCAMLINK_TABLE_NAME
+    if (!psFitsMoveExtName(fits, FLATCORRCAMLINK_TABLE_NAME)) {
+        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", FLATCORRCAMLINK_TABLE_NAME);
+        return false;
+    }
+
+    // check HDU type
+    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
+        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
+        return false;
+    }
+
+    // read fits table
+    rowSet = psFitsReadTable(fits);
+    if (!rowSet) {
+        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
+        psFree(rowSet);
+        return false;
+    }
+
+    if (!psDBInsertRows(dbh, FLATCORRCAMLINK_TABLE_NAME, rowSet)) {
+        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
+        psFree(rowSet);
+        return false;
+    }
+
+    psFree(rowSet);
+
+    return true;
+}
+
+bool flatcorrCamLinkSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
+{
+    psArray         *rowSet;
+
+    rowSet = psDBSelectRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, limit);
+    if (!rowSet) {
+        return false;
+    }
+
+    // output to fits
+    if (!psFitsWriteTable(fits, NULL, rowSet, FLATCORRCAMLINK_TABLE_NAME)) {
+        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
+        psFree(rowSet);
+        return false;
+    }
+
+    psFree(rowSet);
+
+    return true;
+}
+
+psMetadata *flatcorrCamLinkMetadataFromObject(const flatcorrCamLinkRow *object)
+{
+    psMetadata *md = psMetadataAlloc();
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, object->corr_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, object->chip_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, NULL, object->cam_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
+        psFree(md);
+        return false;
+    }
+
+
+    return md;
+}
+
+flatcorrCamLinkRow *flatcorrCamLinkObjectFromMetadata(psMetadata *md)
+{
+
+bool status = false;
+    psS64 corr_id = psMetadataLookupS64(&status, md, "corr_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item corr_id");
+        return false;
+    }
+    psS64 chip_id = psMetadataLookupS64(&status, md, "chip_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item chip_id");
+        return false;
+    }
+    psS64 cam_id = psMetadataLookupS64(&status, md, "cam_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item cam_id");
+        return false;
+    }
+
+    return flatcorrCamLinkRowAlloc(corr_id, chip_id, cam_id);
+}
+psArray *flatcorrCamLinkSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
+{
+    psArray         *rowSet;
+    psArray         *returnSet;
+    psU64           i;
+
+    rowSet = psDBSelectRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, limit);
+    if (!rowSet) {
+        return NULL;
+    }
+
+    // convert psMetadata rows to row objects
+
+    returnSet = psArrayAllocEmpty(rowSet->n);
+
+    for (i = 0; i < rowSet->n; i++) {
+        flatcorrCamLinkRow *object = flatcorrCamLinkObjectFromMetadata(rowSet->data[i]);
+        if (!object) {
+            psFree(object);
+            psFree(returnSet);
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            return NULL;
+        }
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
+    }
+
+    psFree(rowSet);
+
+    return returnSet;
+}
+bool flatcorrCamLinkDeleteObject(psDB *dbh, const flatcorrCamLinkRow *object)
+{
+    psMetadata *where = flatcorrCamLinkMetadataFromObject(object);
+    long long count = psDBDeleteRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, 0);
+    psFree(where);
+    if (count < 0) {
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrCamLink");
+        return false;
+    }
+    if (count > 1) {
+        // XXX should this be a psAbort() instead?  It is possible that
+        // having an object match multiple rows was by design.
+        psError(PS_ERR_UNKNOWN, true, "flatcorrCamLinkRow object matched more then one row.  Check your database schema");
+        return false;
+    }
+
+    return true;
+}
+long long flatcorrCamLinkDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
+{
+    long long       deleted = 0;
+
+    for (long long i = 0; i < objects->n; i++) {
+        flatcorrCamLinkRow *object = objects->data[i];
+        psMetadata *where = flatcorrCamLinkMetadataFromObject(object);
+        long long count = psDBDeleteRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, limit);
+        psFree(where);
+        if (count < 0) {
+            psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrCamLink");
+            return count;
+        }
+
+        deleted += count;
+    }
+
+    return deleted;
+}
+bool flatcorrCamLinkPrintObjects(FILE *stream, psArray *objects, bool mdcf)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = flatcorrCamLinkMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            FLATCORRCAMLINK_TABLE_NAME,
+            PS_META_DUPLICATE_OK,
+            NULL,
+            md
+        )) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
+            psFree(md);
+            psFree(output);
+            return false;
+        }
+        psFree(md);
+    }
+
+    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
+        psFree(output);
+    }
+    psFree(output);
+
+    return true;
+}
+bool flatcorrCamLinkPrintObject(FILE *stream, flatcorrCamLinkRow *object, bool mdcf)
+{
+    PS_ASSERT_PTR_NON_NULL(object, false);
+
+    psMetadata *md = flatcorrCamLinkMetadataFromObject(object);
 
     if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
@@ -26604,4 +29154,436 @@
     return true;
 }
+static void pstampProjectRowFree(pstampProjectRow *object);
+
+pstampProjectRow *pstampProjectRowAlloc(psS64 proj_id, const char *name, const char *state, const char *dbname, const char *dvodb, const char *camera, const char *telescope, bool need_magic)
+{
+    pstampProjectRow *_object;
+
+    _object = psAlloc(sizeof(pstampProjectRow));
+    psMemSetDeallocator(_object, (psFreeFunc)pstampProjectRowFree);
+
+    _object->proj_id = proj_id;
+    _object->name = psStringCopy(name);
+    _object->state = psStringCopy(state);
+    _object->dbname = psStringCopy(dbname);
+    _object->dvodb = psStringCopy(dvodb);
+    _object->camera = psStringCopy(camera);
+    _object->telescope = psStringCopy(telescope);
+    _object->need_magic = need_magic;
+
+    return _object;
+}
+
+static void pstampProjectRowFree(pstampProjectRow *object)
+{
+    psFree(object->name);
+    psFree(object->state);
+    psFree(object->dbname);
+    psFree(object->dvodb);
+    psFree(object->camera);
+    psFree(object->telescope);
+}
+
+bool pstampProjectCreateTable(psDB *dbh)
+{
+    psMetadata *md = psMetadataAlloc();
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "proj_id", PS_DATA_S64, "Primary Key AUTO_INCREMENT", 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item proj_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "name", PS_DATA_STRING, "UNIQUE", "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item name");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dbname", PS_DATA_STRING, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dbname");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "need_magic", PS_DATA_BOOL, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item need_magic");
+        psFree(md);
+        return false;
+    }
+
+    bool status = psDBCreateTable(dbh, PSTAMPPROJECT_TABLE_NAME, md);
+
+    psFree(md);
+
+    return status;
+}
+
+bool pstampProjectDropTable(psDB *dbh)
+{
+    return psDBDropTable(dbh, PSTAMPPROJECT_TABLE_NAME);
+}
+
+bool pstampProjectInsert(psDB * dbh, psS64 proj_id, const char *name, const char *state, const char *dbname, const char *dvodb, const char *camera, const char *telescope, bool need_magic)
+{
+    psMetadata *md = psMetadataAlloc();
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "proj_id", PS_DATA_S64, NULL, proj_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item proj_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "name", PS_DATA_STRING, NULL, name)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item name");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dbname", PS_DATA_STRING, NULL, dbname)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dbname");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, dvodb)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, camera)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, telescope)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "need_magic", PS_DATA_BOOL, NULL, need_magic)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item need_magic");
+        psFree(md);
+        return false;
+    }
+
+    bool status = psDBInsertOneRow(dbh, PSTAMPPROJECT_TABLE_NAME, md);
+    psFree(md);
+
+    return status;
+}
+
+long long pstampProjectDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
+{
+    long long       deleted = 0;
+
+    long long count = psDBDeleteRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, limit);
+    if (count < 0) {
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from pstampProject");
+        return count;
+
+        deleted += count;
+    }
+
+    return deleted;
+}
+bool pstampProjectInsertObject(psDB *dbh, pstampProjectRow *object)
+{
+    return pstampProjectInsert(dbh, object->proj_id, object->name, object->state, object->dbname, object->dvodb, object->camera, object->telescope, object->need_magic);
+}
+
+bool pstampProjectInsertObjects(psDB *dbh, psArray *objects)
+{
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        if (!pstampProjectInsertObject(dbh, objects->data[i])) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool pstampProjectInsertFits(psDB *dbh, const psFits *fits)
+{
+    psArray         *rowSet;
+
+    // move to (the first?) extension named  PSTAMPPROJECT_TABLE_NAME
+    if (!psFitsMoveExtName(fits, PSTAMPPROJECT_TABLE_NAME)) {
+        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", PSTAMPPROJECT_TABLE_NAME);
+        return false;
+    }
+
+    // check HDU type
+    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
+        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
+        return false;
+    }
+
+    // read fits table
+    rowSet = psFitsReadTable(fits);
+    if (!rowSet) {
+        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
+        psFree(rowSet);
+        return false;
+    }
+
+    if (!psDBInsertRows(dbh, PSTAMPPROJECT_TABLE_NAME, rowSet)) {
+        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
+        psFree(rowSet);
+        return false;
+    }
+
+    psFree(rowSet);
+
+    return true;
+}
+
+bool pstampProjectSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
+{
+    psArray         *rowSet;
+
+    rowSet = psDBSelectRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, limit);
+    if (!rowSet) {
+        return false;
+    }
+
+    // output to fits
+    if (!psFitsWriteTable(fits, NULL, rowSet, PSTAMPPROJECT_TABLE_NAME)) {
+        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
+        psFree(rowSet);
+        return false;
+    }
+
+    psFree(rowSet);
+
+    return true;
+}
+
+psMetadata *pstampProjectMetadataFromObject(const pstampProjectRow *object)
+{
+    psMetadata *md = psMetadataAlloc();
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "proj_id", PS_DATA_S64, NULL, object->proj_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item proj_id");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "name", PS_DATA_STRING, NULL, object->name)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item name");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dbname", PS_DATA_STRING, NULL, object->dbname)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dbname");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, object->camera)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, object->telescope)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "need_magic", PS_DATA_BOOL, NULL, object->need_magic)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item need_magic");
+        psFree(md);
+        return false;
+    }
+
+
+    return md;
+}
+
+pstampProjectRow *pstampProjectObjectFromMetadata(psMetadata *md)
+{
+
+bool status = false;
+    psS64 proj_id = psMetadataLookupS64(&status, md, "proj_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item proj_id");
+        return false;
+    }
+    char* name = psMetadataLookupPtr(&status, md, "name");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item name");
+        return false;
+    }
+    char* state = psMetadataLookupPtr(&status, md, "state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");
+        return false;
+    }
+    char* dbname = psMetadataLookupPtr(&status, md, "dbname");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dbname");
+        return false;
+    }
+    char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dvodb");
+        return false;
+    }
+    char* camera = psMetadataLookupPtr(&status, md, "camera");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
+        return false;
+    }
+    char* telescope = psMetadataLookupPtr(&status, md, "telescope");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
+        return false;
+    }
+    bool need_magic = psMetadataLookupBool(&status, md, "need_magic");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item need_magic");
+        return false;
+    }
+
+    return pstampProjectRowAlloc(proj_id, name, state, dbname, dvodb, camera, telescope, need_magic);
+}
+psArray *pstampProjectSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
+{
+    psArray         *rowSet;
+    psArray         *returnSet;
+    psU64           i;
+
+    rowSet = psDBSelectRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, limit);
+    if (!rowSet) {
+        return NULL;
+    }
+
+    // convert psMetadata rows to row objects
+
+    returnSet = psArrayAllocEmpty(rowSet->n);
+
+    for (i = 0; i < rowSet->n; i++) {
+        pstampProjectRow *object = pstampProjectObjectFromMetadata(rowSet->data[i]);
+        if (!object) {
+            psFree(object);
+            psFree(returnSet);
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            return NULL;
+        }
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
+    }
+
+    psFree(rowSet);
+
+    return returnSet;
+}
+bool pstampProjectDeleteObject(psDB *dbh, const pstampProjectRow *object)
+{
+    psMetadata *where = pstampProjectMetadataFromObject(object);
+    long long count = psDBDeleteRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, 0);
+    psFree(where);
+    if (count < 0) {
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from pstampProject");
+        return false;
+    }
+    if (count > 1) {
+        // XXX should this be a psAbort() instead?  It is possible that
+        // having an object match multiple rows was by design.
+        psError(PS_ERR_UNKNOWN, true, "pstampProjectRow object matched more then one row.  Check your database schema");
+        return false;
+    }
+
+    return true;
+}
+long long pstampProjectDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
+{
+    long long       deleted = 0;
+
+    for (long long i = 0; i < objects->n; i++) {
+        pstampProjectRow *object = objects->data[i];
+        psMetadata *where = pstampProjectMetadataFromObject(object);
+        long long count = psDBDeleteRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, limit);
+        psFree(where);
+        if (count < 0) {
+            psError(PS_ERR_UNKNOWN, true, "failed to delete row from pstampProject");
+            return count;
+        }
+
+        deleted += count;
+    }
+
+    return deleted;
+}
+bool pstampProjectPrintObjects(FILE *stream, psArray *objects, bool mdcf)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = pstampProjectMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            PSTAMPPROJECT_TABLE_NAME,
+            PS_META_DUPLICATE_OK,
+            NULL,
+            md
+        )) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
+            psFree(md);
+            psFree(output);
+            return false;
+        }
+        psFree(md);
+    }
+
+    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
+        psFree(output);
+    }
+    psFree(output);
+
+    return true;
+}
+bool pstampProjectPrintObject(FILE *stream, pstampProjectRow *object, bool mdcf)
+{
+    PS_ASSERT_PTR_NON_NULL(object, false);
+
+    psMetadata *md = pstampProjectMetadataFromObject(object);
+
+    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
+        psFree(md);
+    }
+
+    psFree(md);
+
+    return true;
+}
 static void pstampRequestRowFree(pstampRequestRow *object);
 
@@ -27037,5 +30019,5 @@
 static void pstampJobRowFree(pstampJobRow *object);
 
-pstampJobRow *pstampJobRowAlloc(psS64 job_id, psS64 req_id, const char *rownum, const char *state, const char *jobType, psS32 fault, const char *uri, const char *outputBase, const char *args)
+pstampJobRow *pstampJobRowAlloc(psS64 job_id, psS64 req_id, const char *rownum, const char *state, const char *jobType, psS32 fault, const char *uri, psS64 exp_id, const char *outputBase, const char *args)
 {
     pstampJobRow    *_object;
@@ -27051,4 +30033,5 @@
     _object->fault = fault;
     _object->uri = psStringCopy(uri);
+    _object->exp_id = exp_id;
     _object->outputBase = psStringCopy(outputBase);
     _object->args = psStringCopy(args);
@@ -27105,4 +30088,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "outputBase", PS_DATA_STRING, NULL, "255")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item outputBase");
@@ -27128,5 +30116,5 @@
 }
 
-bool pstampJobInsert(psDB * dbh, psS64 job_id, psS64 req_id, const char *rownum, const char *state, const char *jobType, psS32 fault, const char *uri, const char *outputBase, const char *args)
+bool pstampJobInsert(psDB * dbh, psS64 job_id, psS64 req_id, const char *rownum, const char *state, const char *jobType, psS32 fault, const char *uri, psS64 exp_id, const char *outputBase, const char *args)
 {
     psMetadata *md = psMetadataAlloc();
@@ -27163,4 +30151,9 @@
     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
@@ -27199,5 +30192,5 @@
 bool pstampJobInsertObject(psDB *dbh, pstampJobRow *object)
 {
-    return pstampJobInsert(dbh, object->job_id, object->req_id, object->rownum, object->state, object->jobType, object->fault, object->uri, object->outputBase, object->args);
+    return pstampJobInsert(dbh, object->job_id, object->req_id, object->rownum, object->state, object->jobType, object->fault, object->uri, object->exp_id, object->outputBase, object->args);
 }
 
@@ -27307,4 +30300,9 @@
         return false;
     }
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAdd(md, PS_LIST_TAIL, "outputBase", PS_DATA_STRING, NULL, object->outputBase)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item outputBase");
@@ -27361,4 +30359,9 @@
         return false;
     }
+    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
+        return false;
+    }
     char* outputBase = psMetadataLookupPtr(&status, md, "outputBase");
     if (!status) {
@@ -27372,5 +30375,5 @@
     }
 
-    return pstampJobRowAlloc(job_id, req_id, rownum, state, jobType, fault, uri, outputBase, args);
+    return pstampJobRowAlloc(job_id, req_id, rownum, state, jobType, fault, uri, exp_id, outputBase, args);
 }
 psArray *pstampJobSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
