IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 16, 2008, 12:32:27 PM (18 years ago)
Author:
jhoblitt
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippdb/src/ippdb.c

    r18796 r20205  
    8282#define CALRUN_TABLE_NAME "calRun"
    8383#define FLATCORRRUN_TABLE_NAME "flatcorrRun"
    84 #define FLATCORREXP_TABLE_NAME "flatcorrExp"
     84#define FLATCORRCHIPLINK_TABLE_NAME "flatcorrChipLink"
     85#define FLATCORRCAMLINK_TABLE_NAME "flatcorrCamLink"
    8586#define PSTAMPDATASTORE_TABLE_NAME "pstampDataStore"
     87#define PSTAMPPROJECT_TABLE_NAME "pstampProject"
    8688#define PSTAMPREQUEST_TABLE_NAME "pstampRequest"
    8789#define PSTAMPJOB_TABLE_NAME "pstampJob"
     
    32303232static void rawExpRowFree(rawExpRow *object);
    32313233
    3232 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)
     3234rawExpRow *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)
    32333235{
    32343236    rawExpRow       *_object;
     
    32523254    _object->filter = psStringCopy(filter);
    32533255    _object->comment = psStringCopy(comment);
     3256    _object->obs_mode = psStringCopy(obs_mode);
     3257    _object->obs_group = psStringCopy(obs_group);
    32543258    _object->airmass = airmass;
    32553259    _object->ra = ra;
     
    32913295    _object->user_5 = user_5;
    32923296    _object->object = psStringCopy(object);
    3293     _object->solang = solang;
     3297    _object->sun_angle = sun_angle;
     3298    _object->sun_alt = sun_alt;
     3299    _object->moon_angle = moon_angle;
     3300    _object->moon_alt = moon_alt;
     3301    _object->moon_phase = moon_phase;
    32943302    _object->hostname = psStringCopy(hostname);
    32953303    _object->fault = fault;
     
    33153323    psFree(object->filter);
    33163324    psFree(object->comment);
     3325    psFree(object->obs_mode);
     3326    psFree(object->obs_group);
    33173327    psFree(object->object);
    33183328    psFree(object->hostname);
     
    33983408        return false;
    33993409    }
     3410    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, "data usage goal (eg, survey name, engineering, etc)", "64")) {
     3411        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
     3412        psFree(md);
     3413        return false;
     3414    }
     3415    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, "identifier for data block (eg, observation sequence)", "64")) {
     3416        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
     3417        psFree(md);
     3418        return false;
     3419    }
    34003420    if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, 0.0)) {
    34013421        psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
     
    35933613        return false;
    35943614    }
    3595     if (!psMetadataAdd(md, PS_LIST_TAIL, "solang", PS_DATA_F32, NULL, 0.0)) {
    3596         psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
     3615    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, 0.0)) {
     3616        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
     3617        psFree(md);
     3618        return false;
     3619    }
     3620    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, 0.0)) {
     3621        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
     3622        psFree(md);
     3623        return false;
     3624    }
     3625    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, 0.0)) {
     3626        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
     3627        psFree(md);
     3628        return false;
     3629    }
     3630    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, 0.0)) {
     3631        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
     3632        psFree(md);
     3633        return false;
     3634    }
     3635    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, 0.0)) {
     3636        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
    35973637        psFree(md);
    35983638        return false;
     
    36263666}
    36273667
    3628 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)
     3668bool 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)
    36293669{
    36303670    psMetadata *md = psMetadataAlloc();
     
    37043744        return false;
    37053745    }
     3746    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, NULL, obs_mode)) {
     3747        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
     3748        psFree(md);
     3749        return false;
     3750    }
     3751    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, NULL, obs_group)) {
     3752        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
     3753        psFree(md);
     3754        return false;
     3755    }
    37063756    if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, airmass)) {
    37073757        psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
     
    38993949        return false;
    39003950    }
    3901     if (!psMetadataAdd(md, PS_LIST_TAIL, "solang", PS_DATA_F32, NULL, solang)) {
    3902         psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
     3951    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, sun_angle)) {
     3952        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
     3953        psFree(md);
     3954        return false;
     3955    }
     3956    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, sun_alt)) {
     3957        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
     3958        psFree(md);
     3959        return false;
     3960    }
     3961    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, moon_angle)) {
     3962        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
     3963        psFree(md);
     3964        return false;
     3965    }
     3966    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, moon_alt)) {
     3967        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
     3968        psFree(md);
     3969        return false;
     3970    }
     3971    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, moon_phase)) {
     3972        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
    39033973        psFree(md);
    39043974        return false;
     
    39424012bool rawExpInsertObject(psDB *dbh, rawExpRow *object)
    39434013{
    3944     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);
     4014    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);
    39454015}
    39464016
     
    40904160        return false;
    40914161    }
     4162    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, NULL, object->obs_mode)) {
     4163        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
     4164        psFree(md);
     4165        return false;
     4166    }
     4167    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, NULL, object->obs_group)) {
     4168        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
     4169        psFree(md);
     4170        return false;
     4171    }
    40924172    if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, object->airmass)) {
    40934173        psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
     
    42854365        return false;
    42864366    }
    4287     if (!psMetadataAdd(md, PS_LIST_TAIL, "solang", PS_DATA_F32, NULL, object->solang)) {
    4288         psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
     4367    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, object->sun_angle)) {
     4368        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
     4369        psFree(md);
     4370        return false;
     4371    }
     4372    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, object->sun_alt)) {
     4373        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
     4374        psFree(md);
     4375        return false;
     4376    }
     4377    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, object->moon_angle)) {
     4378        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
     4379        psFree(md);
     4380        return false;
     4381    }
     4382    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, object->moon_alt)) {
     4383        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
     4384        psFree(md);
     4385        return false;
     4386    }
     4387    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, object->moon_phase)) {
     4388        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
    42894389        psFree(md);
    42904390        return false;
     
    43894489        return false;
    43904490    }
     4491    char* obs_mode = psMetadataLookupPtr(&status, md, "obs_mode");
     4492    if (!status) {
     4493        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item obs_mode");
     4494        return false;
     4495    }
     4496    char* obs_group = psMetadataLookupPtr(&status, md, "obs_group");
     4497    if (!status) {
     4498        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item obs_group");
     4499        return false;
     4500    }
    43914501    psF32 airmass = psMetadataLookupF32(&status, md, "airmass");
    43924502    if (!status) {
     
    45844694        return false;
    45854695    }
    4586     psF32 solang = psMetadataLookupF32(&status, md, "solang");
    4587     if (!status) {
    4588         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item solang");
     4696    psF32 sun_angle = psMetadataLookupF32(&status, md, "sun_angle");
     4697    if (!status) {
     4698        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sun_angle");
     4699        return false;
     4700    }
     4701    psF32 sun_alt = psMetadataLookupF32(&status, md, "sun_alt");
     4702    if (!status) {
     4703        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sun_alt");
     4704        return false;
     4705    }
     4706    psF32 moon_angle = psMetadataLookupF32(&status, md, "moon_angle");
     4707    if (!status) {
     4708        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_angle");
     4709        return false;
     4710    }
     4711    psF32 moon_alt = psMetadataLookupF32(&status, md, "moon_alt");
     4712    if (!status) {
     4713        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_alt");
     4714        return false;
     4715    }
     4716    psF32 moon_phase = psMetadataLookupF32(&status, md, "moon_phase");
     4717    if (!status) {
     4718        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_phase");
    45894719        return false;
    45904720    }
     
    46054735    }
    46064736
    4607     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);
     4737    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);
    46084738}
    46094739psArray *rawExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    47234853static void rawImfileRowFree(rawImfileRow *object);
    47244854
    4725 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)
     4855rawImfileRow *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)
    47264856{
    47274857    rawImfileRow    *_object;
     
    47424872    _object->filter = psStringCopy(filter);
    47434873    _object->comment = psStringCopy(comment);
     4874    _object->obs_mode = psStringCopy(obs_mode);
     4875    _object->obs_group = psStringCopy(obs_group);
    47444876    _object->airmass = airmass;
    47454877    _object->ra = ra;
     
    47814913    _object->user_5 = user_5;
    47824914    _object->object = psStringCopy(object);
     4915    _object->sun_angle = sun_angle;
     4916    _object->sun_alt = sun_alt;
     4917    _object->moon_angle = moon_angle;
     4918    _object->moon_alt = moon_alt;
     4919    _object->moon_phase = moon_phase;
    47834920    _object->hostname = psStringCopy(hostname);
    47844921    _object->fault = fault;
     
    48014938    psFree(object->filter);
    48024939    psFree(object->comment);
     4940    psFree(object->obs_mode);
     4941    psFree(object->obs_group);
    48034942    psFree(object->object);
    48044943    psFree(object->hostname);
     
    48695008        return false;
    48705009    }
     5010    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, "data usage goal (eg, survey name, engineering, etc)", "64")) {
     5011        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
     5012        psFree(md);
     5013        return false;
     5014    }
     5015    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, "identifier for data block (eg, observation sequence)", "64")) {
     5016        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
     5017        psFree(md);
     5018        return false;
     5019    }
    48715020    if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, 0.0)) {
    48725021        psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
     
    50645213        return false;
    50655214    }
     5215    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, 0.0)) {
     5216        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
     5217        psFree(md);
     5218        return false;
     5219    }
     5220    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, 0.0)) {
     5221        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
     5222        psFree(md);
     5223        return false;
     5224    }
     5225    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, 0.0)) {
     5226        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
     5227        psFree(md);
     5228        return false;
     5229    }
     5230    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, 0.0)) {
     5231        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
     5232        psFree(md);
     5233        return false;
     5234    }
     5235    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, 0.0)) {
     5236        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
     5237        psFree(md);
     5238        return false;
     5239    }
    50665240    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
    50675241        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    50925266}
    50935267
    5094 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)
     5268bool 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)
    50955269{
    50965270    psMetadata *md = psMetadataAlloc();
     
    51555329        return false;
    51565330    }
     5331    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, NULL, obs_mode)) {
     5332        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
     5333        psFree(md);
     5334        return false;
     5335    }
     5336    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, NULL, obs_group)) {
     5337        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
     5338        psFree(md);
     5339        return false;
     5340    }
    51575341    if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, airmass)) {
    51585342        psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
     
    53475531    if (!psMetadataAdd(md, PS_LIST_TAIL, "object", PS_DATA_STRING, NULL, object)) {
    53485532        psError(PS_ERR_UNKNOWN, false, "failed to add item object");
     5533        psFree(md);
     5534        return false;
     5535    }
     5536    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, sun_angle)) {
     5537        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
     5538        psFree(md);
     5539        return false;
     5540    }
     5541    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, sun_alt)) {
     5542        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
     5543        psFree(md);
     5544        return false;
     5545    }
     5546    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, moon_angle)) {
     5547        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
     5548        psFree(md);
     5549        return false;
     5550    }
     5551    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, moon_alt)) {
     5552        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
     5553        psFree(md);
     5554        return false;
     5555    }
     5556    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, moon_phase)) {
     5557        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
    53495558        psFree(md);
    53505559        return false;
     
    53885597bool rawImfileInsertObject(psDB *dbh, rawImfileRow *object)
    53895598{
    5390     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);
     5599    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);
    53915600}
    53925601
     
    55215730        return false;
    55225731    }
     5732    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_mode", PS_DATA_STRING, NULL, object->obs_mode)) {
     5733        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_mode");
     5734        psFree(md);
     5735        return false;
     5736    }
     5737    if (!psMetadataAdd(md, PS_LIST_TAIL, "obs_group", PS_DATA_STRING, NULL, object->obs_group)) {
     5738        psError(PS_ERR_UNKNOWN, false, "failed to add item obs_group");
     5739        psFree(md);
     5740        return false;
     5741    }
    55235742    if (!psMetadataAdd(md, PS_LIST_TAIL, "airmass", PS_DATA_F32, NULL, object->airmass)) {
    55245743        psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
     
    57165935        return false;
    57175936    }
     5937    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_angle", PS_DATA_F32, NULL, object->sun_angle)) {
     5938        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_angle");
     5939        psFree(md);
     5940        return false;
     5941    }
     5942    if (!psMetadataAdd(md, PS_LIST_TAIL, "sun_alt", PS_DATA_F32, NULL, object->sun_alt)) {
     5943        psError(PS_ERR_UNKNOWN, false, "failed to add item sun_alt");
     5944        psFree(md);
     5945        return false;
     5946    }
     5947    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_angle", PS_DATA_F32, NULL, object->moon_angle)) {
     5948        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_angle");
     5949        psFree(md);
     5950        return false;
     5951    }
     5952    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_alt", PS_DATA_F32, NULL, object->moon_alt)) {
     5953        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_alt");
     5954        psFree(md);
     5955        return false;
     5956    }
     5957    if (!psMetadataAdd(md, PS_LIST_TAIL, "moon_phase", PS_DATA_F32, NULL, object->moon_phase)) {
     5958        psError(PS_ERR_UNKNOWN, false, "failed to add item moon_phase");
     5959        psFree(md);
     5960        return false;
     5961    }
    57185962    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
    57195963        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    58006044        return false;
    58016045    }
     6046    char* obs_mode = psMetadataLookupPtr(&status, md, "obs_mode");
     6047    if (!status) {
     6048        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item obs_mode");
     6049        return false;
     6050    }
     6051    char* obs_group = psMetadataLookupPtr(&status, md, "obs_group");
     6052    if (!status) {
     6053        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item obs_group");
     6054        return false;
     6055    }
    58026056    psF32 airmass = psMetadataLookupF32(&status, md, "airmass");
    58036057    if (!status) {
     
    59956249        return false;
    59966250    }
     6251    psF32 sun_angle = psMetadataLookupF32(&status, md, "sun_angle");
     6252    if (!status) {
     6253        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sun_angle");
     6254        return false;
     6255    }
     6256    psF32 sun_alt = psMetadataLookupF32(&status, md, "sun_alt");
     6257    if (!status) {
     6258        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sun_alt");
     6259        return false;
     6260    }
     6261    psF32 moon_angle = psMetadataLookupF32(&status, md, "moon_angle");
     6262    if (!status) {
     6263        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_angle");
     6264        return false;
     6265    }
     6266    psF32 moon_alt = psMetadataLookupF32(&status, md, "moon_alt");
     6267    if (!status) {
     6268        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_alt");
     6269        return false;
     6270    }
     6271    psF32 moon_phase = psMetadataLookupF32(&status, md, "moon_phase");
     6272    if (!status) {
     6273        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item moon_phase");
     6274        return false;
     6275    }
    59976276    char* hostname = psMetadataLookupPtr(&status, md, "hostname");
    59986277    if (!status) {
     
    60116290    }
    60126291
    6013     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);
     6292    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);
    60146293}
    60156294psArray *rawImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    69497228static void chipProcessedImfileRowFree(chipProcessedImfileRow *object);
    69507229
    6951 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)
     7230chipProcessedImfileRow *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)
    69527231{
    69537232    chipProcessedImfileRow *_object;
     
    69597238    _object->exp_id = exp_id;
    69607239    _object->class_id = psStringCopy(class_id);
     7240    _object->data_state = psStringCopy(data_state);
    69617241    _object->uri = psStringCopy(uri);
    69627242    _object->bg = bg;
     
    69687248    _object->fringe_1 = fringe_1;
    69697249    _object->fringe_2 = fringe_2;
    6970     _object->sigma_ra = sigma_ra;
    6971     _object->sigma_dec = sigma_dec;
    69727250    _object->ap_resid = ap_resid;
    69737251    _object->ap_resid_stdev = ap_resid_stdev;
    6974     _object->zp_mean = zp_mean;
    6975     _object->zp_stdev = zp_stdev;
    69767252    _object->fwhm_major = fwhm_major;
    69777253    _object->fwhm_minor = fwhm_minor;
     7254    _object->iq_m2 = iq_m2;
     7255    _object->iq_m2_err = iq_m2_err;
     7256    _object->iq_m2_lq = iq_m2_lq;
     7257    _object->iq_m2_uq = iq_m2_uq;
     7258    _object->iq_m2c = iq_m2c;
     7259    _object->iq_m2c_err = iq_m2c_err;
     7260    _object->iq_m2c_lq = iq_m2c_lq;
     7261    _object->iq_m2c_uq = iq_m2c_uq;
     7262    _object->iq_m2s = iq_m2s;
     7263    _object->iq_m2s_err = iq_m2s_err;
     7264    _object->iq_m2s_lq = iq_m2s_lq;
     7265    _object->iq_m2s_uq = iq_m2s_uq;
     7266    _object->iq_m3 = iq_m3;
     7267    _object->iq_m3_err = iq_m3_err;
     7268    _object->iq_m3_lq = iq_m3_lq;
     7269    _object->iq_m3_uq = iq_m3_uq;
     7270    _object->iq_m4 = iq_m4;
     7271    _object->iq_m4_err = iq_m4_err;
     7272    _object->iq_m4_lq = iq_m4_lq;
     7273    _object->iq_m4_uq = iq_m4_uq;
    69787274    _object->dtime_detrend = dtime_detrend;
    69797275    _object->dtime_photom = dtime_photom;
    6980     _object->dtime_astrom = dtime_astrom;
     7276    _object->dtime_total = dtime_total;
     7277    _object->dtime_script = dtime_script;
    69817278    _object->hostname = psStringCopy(hostname);
    69827279    _object->n_stars = n_stars;
     7280    _object->n_psfstars = n_psfstars;
     7281    _object->n_iqstars = n_iqstars;
    69837282    _object->n_extended = n_extended;
    69847283    _object->n_cr = n_cr;
    6985     _object->n_astrom = n_astrom;
    69867284    _object->path_base = psStringCopy(path_base);
    69877285    _object->fault = fault;
     
    69937291{
    69947292    psFree(object->class_id);
     7293    psFree(object->data_state);
    69957294    psFree(object->uri);
    69967295    psFree(object->hostname);
     
    70167315        return false;
    70177316    }
     7317    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "Key", "64")) {
     7318        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     7319        psFree(md);
     7320        return false;
     7321    }
    70187322    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {
    70197323        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     
    70617365        return false;
    70627366    }
    7063     if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_ra", PS_DATA_F32, NULL, 0.0)) {
    7064         psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra");
    7065         psFree(md);
    7066         return false;
    7067     }
    7068     if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_dec", PS_DATA_F32, NULL, 0.0)) {
    7069         psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec");
    7070         psFree(md);
    7071         return false;
    7072     }
    70737367    if (!psMetadataAdd(md, PS_LIST_TAIL, "ap_resid", PS_DATA_F32, NULL, 0.0)) {
    70747368        psError(PS_ERR_UNKNOWN, false, "failed to add item ap_resid");
     
    70817375        return false;
    70827376    }
    7083     if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_mean", PS_DATA_F32, NULL, 0.0)) {
    7084         psError(PS_ERR_UNKNOWN, false, "failed to add item zp_mean");
    7085         psFree(md);
    7086         return false;
    7087     }
    7088     if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_stdev", PS_DATA_F32, NULL, 0.0)) {
    7089         psError(PS_ERR_UNKNOWN, false, "failed to add item zp_stdev");
    7090         psFree(md);
    7091         return false;
    7092     }
    70937377    if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm_major", PS_DATA_F32, NULL, 0.0)) {
    70947378        psError(PS_ERR_UNKNOWN, false, "failed to add item fwhm_major");
     
    71017385        return false;
    71027386    }
     7387    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, 0.0)) {
     7388        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
     7389        psFree(md);
     7390        return false;
     7391    }
     7392    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, 0.0)) {
     7393        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
     7394        psFree(md);
     7395        return false;
     7396    }
     7397    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, 0.0)) {
     7398        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
     7399        psFree(md);
     7400        return false;
     7401    }
     7402    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, 0.0)) {
     7403        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
     7404        psFree(md);
     7405        return false;
     7406    }
     7407    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, 0.0)) {
     7408        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
     7409        psFree(md);
     7410        return false;
     7411    }
     7412    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, 0.0)) {
     7413        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
     7414        psFree(md);
     7415        return false;
     7416    }
     7417    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, 0.0)) {
     7418        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
     7419        psFree(md);
     7420        return false;
     7421    }
     7422    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, 0.0)) {
     7423        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
     7424        psFree(md);
     7425        return false;
     7426    }
     7427    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, 0.0)) {
     7428        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
     7429        psFree(md);
     7430        return false;
     7431    }
     7432    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, 0.0)) {
     7433        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
     7434        psFree(md);
     7435        return false;
     7436    }
     7437    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, 0.0)) {
     7438        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
     7439        psFree(md);
     7440        return false;
     7441    }
     7442    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, 0.0)) {
     7443        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
     7444        psFree(md);
     7445        return false;
     7446    }
     7447    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, 0.0)) {
     7448        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
     7449        psFree(md);
     7450        return false;
     7451    }
     7452    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, 0.0)) {
     7453        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
     7454        psFree(md);
     7455        return false;
     7456    }
     7457    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, 0.0)) {
     7458        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
     7459        psFree(md);
     7460        return false;
     7461    }
     7462    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, 0.0)) {
     7463        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
     7464        psFree(md);
     7465        return false;
     7466    }
     7467    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, 0.0)) {
     7468        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
     7469        psFree(md);
     7470        return false;
     7471    }
     7472    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, 0.0)) {
     7473        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
     7474        psFree(md);
     7475        return false;
     7476    }
     7477    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, 0.0)) {
     7478        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
     7479        psFree(md);
     7480        return false;
     7481    }
     7482    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, 0.0)) {
     7483        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
     7484        psFree(md);
     7485        return false;
     7486    }
    71037487    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, 0.0)) {
    71047488        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
     
    71117495        return false;
    71127496    }
    7113     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_astrom", PS_DATA_F32, NULL, 0.0)) {
    7114         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_astrom");
     7497    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_total", PS_DATA_F32, NULL, 0.0)) {
     7498        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_total");
     7499        psFree(md);
     7500        return false;
     7501    }
     7502    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
     7503        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
    71157504        psFree(md);
    71167505        return false;
     
    71267515        return false;
    71277516    }
     7517    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, 0)) {
     7518        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
     7519        psFree(md);
     7520        return false;
     7521    }
     7522    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, 0)) {
     7523        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
     7524        psFree(md);
     7525        return false;
     7526    }
    71287527    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, 0)) {
    71297528        psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
     
    71367535        return false;
    71377536    }
    7138     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_astrom", PS_DATA_S32, NULL, 0)) {
    7139         psError(PS_ERR_UNKNOWN, false, "failed to add item n_astrom");
    7140         psFree(md);
    7141         return false;
    7142     }
    71437537    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, "255")) {
    71447538        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     
    71647558}
    71657559
    7166 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)
     7560bool 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)
    71677561{
    71687562    psMetadata *md = psMetadataAlloc();
     
    71827576        return false;
    71837577    }
     7578    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     7579        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     7580        psFree(md);
     7581        return false;
     7582    }
    71847583    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
    71857584        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     
    72277626        return false;
    72287627    }
    7229     if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_ra", PS_DATA_F32, NULL, sigma_ra)) {
    7230         psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra");
    7231         psFree(md);
    7232         return false;
    7233     }
    7234     if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_dec", PS_DATA_F32, NULL, sigma_dec)) {
    7235         psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec");
    7236         psFree(md);
    7237         return false;
    7238     }
    72397628    if (!psMetadataAdd(md, PS_LIST_TAIL, "ap_resid", PS_DATA_F32, NULL, ap_resid)) {
    72407629        psError(PS_ERR_UNKNOWN, false, "failed to add item ap_resid");
     
    72477636        return false;
    72487637    }
    7249     if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_mean", PS_DATA_F32, NULL, zp_mean)) {
    7250         psError(PS_ERR_UNKNOWN, false, "failed to add item zp_mean");
    7251         psFree(md);
    7252         return false;
    7253     }
    7254     if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_stdev", PS_DATA_F32, NULL, zp_stdev)) {
    7255         psError(PS_ERR_UNKNOWN, false, "failed to add item zp_stdev");
    7256         psFree(md);
    7257         return false;
    7258     }
    72597638    if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm_major", PS_DATA_F32, NULL, fwhm_major)) {
    72607639        psError(PS_ERR_UNKNOWN, false, "failed to add item fwhm_major");
     
    72677646        return false;
    72687647    }
     7648    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, iq_m2)) {
     7649        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
     7650        psFree(md);
     7651        return false;
     7652    }
     7653    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, iq_m2_err)) {
     7654        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
     7655        psFree(md);
     7656        return false;
     7657    }
     7658    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, iq_m2_lq)) {
     7659        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
     7660        psFree(md);
     7661        return false;
     7662    }
     7663    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, iq_m2_uq)) {
     7664        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
     7665        psFree(md);
     7666        return false;
     7667    }
     7668    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, iq_m2c)) {
     7669        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
     7670        psFree(md);
     7671        return false;
     7672    }
     7673    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, iq_m2c_err)) {
     7674        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
     7675        psFree(md);
     7676        return false;
     7677    }
     7678    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, iq_m2c_lq)) {
     7679        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
     7680        psFree(md);
     7681        return false;
     7682    }
     7683    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, iq_m2c_uq)) {
     7684        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
     7685        psFree(md);
     7686        return false;
     7687    }
     7688    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, iq_m2s)) {
     7689        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
     7690        psFree(md);
     7691        return false;
     7692    }
     7693    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, iq_m2s_err)) {
     7694        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
     7695        psFree(md);
     7696        return false;
     7697    }
     7698    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, iq_m2s_lq)) {
     7699        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
     7700        psFree(md);
     7701        return false;
     7702    }
     7703    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, iq_m2s_uq)) {
     7704        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
     7705        psFree(md);
     7706        return false;
     7707    }
     7708    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, iq_m3)) {
     7709        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
     7710        psFree(md);
     7711        return false;
     7712    }
     7713    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, iq_m3_err)) {
     7714        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
     7715        psFree(md);
     7716        return false;
     7717    }
     7718    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, iq_m3_lq)) {
     7719        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
     7720        psFree(md);
     7721        return false;
     7722    }
     7723    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, iq_m3_uq)) {
     7724        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
     7725        psFree(md);
     7726        return false;
     7727    }
     7728    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, iq_m4)) {
     7729        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
     7730        psFree(md);
     7731        return false;
     7732    }
     7733    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, iq_m4_err)) {
     7734        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
     7735        psFree(md);
     7736        return false;
     7737    }
     7738    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, iq_m4_lq)) {
     7739        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
     7740        psFree(md);
     7741        return false;
     7742    }
     7743    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, iq_m4_uq)) {
     7744        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
     7745        psFree(md);
     7746        return false;
     7747    }
    72697748    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, dtime_detrend)) {
    72707749        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
     
    72777756        return false;
    72787757    }
    7279     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_astrom", PS_DATA_F32, NULL, dtime_astrom)) {
    7280         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_astrom");
     7758    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_total", PS_DATA_F32, NULL, dtime_total)) {
     7759        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_total");
     7760        psFree(md);
     7761        return false;
     7762    }
     7763    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
     7764        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
    72817765        psFree(md);
    72827766        return false;
     
    72927776        return false;
    72937777    }
     7778    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, n_psfstars)) {
     7779        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
     7780        psFree(md);
     7781        return false;
     7782    }
     7783    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, n_iqstars)) {
     7784        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
     7785        psFree(md);
     7786        return false;
     7787    }
    72947788    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, n_extended)) {
    72957789        psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
     
    72997793    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_cr", PS_DATA_S32, NULL, n_cr)) {
    73007794        psError(PS_ERR_UNKNOWN, false, "failed to add item n_cr");
    7301         psFree(md);
    7302         return false;
    7303     }
    7304     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_astrom", PS_DATA_S32, NULL, n_astrom)) {
    7305         psError(PS_ERR_UNKNOWN, false, "failed to add item n_astrom");
    73067795        psFree(md);
    73077796        return false;
     
    73407829bool chipProcessedImfileInsertObject(psDB *dbh, chipProcessedImfileRow *object)
    73417830{
    7342     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);
     7831    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);
    73437832}
    73447833
     
    74287917        return false;
    74297918    }
     7919    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     7920        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     7921        psFree(md);
     7922        return false;
     7923    }
    74307924    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
    74317925        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     
    74737967        return false;
    74747968    }
    7475     if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_ra", PS_DATA_F32, NULL, object->sigma_ra)) {
    7476         psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_ra");
    7477         psFree(md);
    7478         return false;
    7479     }
    7480     if (!psMetadataAdd(md, PS_LIST_TAIL, "sigma_dec", PS_DATA_F32, NULL, object->sigma_dec)) {
    7481         psError(PS_ERR_UNKNOWN, false, "failed to add item sigma_dec");
    7482         psFree(md);
    7483         return false;
    7484     }
    74857969    if (!psMetadataAdd(md, PS_LIST_TAIL, "ap_resid", PS_DATA_F32, NULL, object->ap_resid)) {
    74867970        psError(PS_ERR_UNKNOWN, false, "failed to add item ap_resid");
     
    74937977        return false;
    74947978    }
    7495     if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_mean", PS_DATA_F32, NULL, object->zp_mean)) {
    7496         psError(PS_ERR_UNKNOWN, false, "failed to add item zp_mean");
    7497         psFree(md);
    7498         return false;
    7499     }
    7500     if (!psMetadataAdd(md, PS_LIST_TAIL, "zp_stdev", PS_DATA_F32, NULL, object->zp_stdev)) {
    7501         psError(PS_ERR_UNKNOWN, false, "failed to add item zp_stdev");
    7502         psFree(md);
    7503         return false;
    7504     }
    75057979    if (!psMetadataAdd(md, PS_LIST_TAIL, "fwhm_major", PS_DATA_F32, NULL, object->fwhm_major)) {
    75067980        psError(PS_ERR_UNKNOWN, false, "failed to add item fwhm_major");
     
    75137987        return false;
    75147988    }
     7989    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, object->iq_m2)) {
     7990        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
     7991        psFree(md);
     7992        return false;
     7993    }
     7994    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, object->iq_m2_err)) {
     7995        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
     7996        psFree(md);
     7997        return false;
     7998    }
     7999    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, object->iq_m2_lq)) {
     8000        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
     8001        psFree(md);
     8002        return false;
     8003    }
     8004    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, object->iq_m2_uq)) {
     8005        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
     8006        psFree(md);
     8007        return false;
     8008    }
     8009    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, object->iq_m2c)) {
     8010        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
     8011        psFree(md);
     8012        return false;
     8013    }
     8014    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, object->iq_m2c_err)) {
     8015        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
     8016        psFree(md);
     8017        return false;
     8018    }
     8019    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, object->iq_m2c_lq)) {
     8020        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
     8021        psFree(md);
     8022        return false;
     8023    }
     8024    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, object->iq_m2c_uq)) {
     8025        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
     8026        psFree(md);
     8027        return false;
     8028    }
     8029    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, object->iq_m2s)) {
     8030        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
     8031        psFree(md);
     8032        return false;
     8033    }
     8034    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, object->iq_m2s_err)) {
     8035        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
     8036        psFree(md);
     8037        return false;
     8038    }
     8039    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, object->iq_m2s_lq)) {
     8040        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
     8041        psFree(md);
     8042        return false;
     8043    }
     8044    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, object->iq_m2s_uq)) {
     8045        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
     8046        psFree(md);
     8047        return false;
     8048    }
     8049    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, object->iq_m3)) {
     8050        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
     8051        psFree(md);
     8052        return false;
     8053    }
     8054    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, object->iq_m3_err)) {
     8055        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
     8056        psFree(md);
     8057        return false;
     8058    }
     8059    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, object->iq_m3_lq)) {
     8060        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
     8061        psFree(md);
     8062        return false;
     8063    }
     8064    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, object->iq_m3_uq)) {
     8065        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
     8066        psFree(md);
     8067        return false;
     8068    }
     8069    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, object->iq_m4)) {
     8070        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
     8071        psFree(md);
     8072        return false;
     8073    }
     8074    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, object->iq_m4_err)) {
     8075        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
     8076        psFree(md);
     8077        return false;
     8078    }
     8079    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, object->iq_m4_lq)) {
     8080        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
     8081        psFree(md);
     8082        return false;
     8083    }
     8084    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, object->iq_m4_uq)) {
     8085        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
     8086        psFree(md);
     8087        return false;
     8088    }
    75158089    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, object->dtime_detrend)) {
    75168090        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
     
    75238097        return false;
    75248098    }
    7525     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_astrom", PS_DATA_F32, NULL, object->dtime_astrom)) {
    7526         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_astrom");
     8099    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_total", PS_DATA_F32, NULL, object->dtime_total)) {
     8100        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_total");
     8101        psFree(md);
     8102        return false;
     8103    }
     8104    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
     8105        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
    75278106        psFree(md);
    75288107        return false;
     
    75388117        return false;
    75398118    }
     8119    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, object->n_psfstars)) {
     8120        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
     8121        psFree(md);
     8122        return false;
     8123    }
     8124    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, object->n_iqstars)) {
     8125        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
     8126        psFree(md);
     8127        return false;
     8128    }
    75408129    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, object->n_extended)) {
    75418130        psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
     
    75488137        return false;
    75498138    }
    7550     if (!psMetadataAdd(md, PS_LIST_TAIL, "n_astrom", PS_DATA_S32, NULL, object->n_astrom)) {
    7551         psError(PS_ERR_UNKNOWN, false, "failed to add item n_astrom");
    7552         psFree(md);
    7553         return false;
    7554     }
    75558139    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, object->path_base)) {
    75568140        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     
    75878171        return false;
    75888172    }
     8173    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     8174    if (!status) {
     8175        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     8176        return false;
     8177    }
    75898178    char* uri = psMetadataLookupPtr(&status, md, "uri");
    75908179    if (!status) {
     
    76328221        return false;
    76338222    }
    7634     psF32 sigma_ra = psMetadataLookupF32(&status, md, "sigma_ra");
    7635     if (!status) {
    7636         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sigma_ra");
    7637         return false;
    7638     }
    7639     psF32 sigma_dec = psMetadataLookupF32(&status, md, "sigma_dec");
    7640     if (!status) {
    7641         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sigma_dec");
    7642         return false;
    7643     }
    76448223    psF32 ap_resid = psMetadataLookupF32(&status, md, "ap_resid");
    76458224    if (!status) {
     
    76528231        return false;
    76538232    }
    7654     psF32 zp_mean = psMetadataLookupF32(&status, md, "zp_mean");
    7655     if (!status) {
    7656         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item zp_mean");
    7657         return false;
    7658     }
    7659     psF32 zp_stdev = psMetadataLookupF32(&status, md, "zp_stdev");
    7660     if (!status) {
    7661         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item zp_stdev");
    7662         return false;
    7663     }
    76648233    psF32 fwhm_major = psMetadataLookupF32(&status, md, "fwhm_major");
    76658234    if (!status) {
     
    76728241        return false;
    76738242    }
     8243    psF32 iq_m2 = psMetadataLookupF32(&status, md, "iq_m2");
     8244    if (!status) {
     8245        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2");
     8246        return false;
     8247    }
     8248    psF32 iq_m2_err = psMetadataLookupF32(&status, md, "iq_m2_err");
     8249    if (!status) {
     8250        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_err");
     8251        return false;
     8252    }
     8253    psF32 iq_m2_lq = psMetadataLookupF32(&status, md, "iq_m2_lq");
     8254    if (!status) {
     8255        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_lq");
     8256        return false;
     8257    }
     8258    psF32 iq_m2_uq = psMetadataLookupF32(&status, md, "iq_m2_uq");
     8259    if (!status) {
     8260        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_uq");
     8261        return false;
     8262    }
     8263    psF32 iq_m2c = psMetadataLookupF32(&status, md, "iq_m2c");
     8264    if (!status) {
     8265        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c");
     8266        return false;
     8267    }
     8268    psF32 iq_m2c_err = psMetadataLookupF32(&status, md, "iq_m2c_err");
     8269    if (!status) {
     8270        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_err");
     8271        return false;
     8272    }
     8273    psF32 iq_m2c_lq = psMetadataLookupF32(&status, md, "iq_m2c_lq");
     8274    if (!status) {
     8275        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_lq");
     8276        return false;
     8277    }
     8278    psF32 iq_m2c_uq = psMetadataLookupF32(&status, md, "iq_m2c_uq");
     8279    if (!status) {
     8280        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_uq");
     8281        return false;
     8282    }
     8283    psF32 iq_m2s = psMetadataLookupF32(&status, md, "iq_m2s");
     8284    if (!status) {
     8285        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s");
     8286        return false;
     8287    }
     8288    psF32 iq_m2s_err = psMetadataLookupF32(&status, md, "iq_m2s_err");
     8289    if (!status) {
     8290        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_err");
     8291        return false;
     8292    }
     8293    psF32 iq_m2s_lq = psMetadataLookupF32(&status, md, "iq_m2s_lq");
     8294    if (!status) {
     8295        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_lq");
     8296        return false;
     8297    }
     8298    psF32 iq_m2s_uq = psMetadataLookupF32(&status, md, "iq_m2s_uq");
     8299    if (!status) {
     8300        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_uq");
     8301        return false;
     8302    }
     8303    psF32 iq_m3 = psMetadataLookupF32(&status, md, "iq_m3");
     8304    if (!status) {
     8305        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3");
     8306        return false;
     8307    }
     8308    psF32 iq_m3_err = psMetadataLookupF32(&status, md, "iq_m3_err");
     8309    if (!status) {
     8310        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_err");
     8311        return false;
     8312    }
     8313    psF32 iq_m3_lq = psMetadataLookupF32(&status, md, "iq_m3_lq");
     8314    if (!status) {
     8315        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_lq");
     8316        return false;
     8317    }
     8318    psF32 iq_m3_uq = psMetadataLookupF32(&status, md, "iq_m3_uq");
     8319    if (!status) {
     8320        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_uq");
     8321        return false;
     8322    }
     8323    psF32 iq_m4 = psMetadataLookupF32(&status, md, "iq_m4");
     8324    if (!status) {
     8325        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4");
     8326        return false;
     8327    }
     8328    psF32 iq_m4_err = psMetadataLookupF32(&status, md, "iq_m4_err");
     8329    if (!status) {
     8330        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_err");
     8331        return false;
     8332    }
     8333    psF32 iq_m4_lq = psMetadataLookupF32(&status, md, "iq_m4_lq");
     8334    if (!status) {
     8335        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_lq");
     8336        return false;
     8337    }
     8338    psF32 iq_m4_uq = psMetadataLookupF32(&status, md, "iq_m4_uq");
     8339    if (!status) {
     8340        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_uq");
     8341        return false;
     8342    }
    76748343    psF32 dtime_detrend = psMetadataLookupF32(&status, md, "dtime_detrend");
    76758344    if (!status) {
     
    76828351        return false;
    76838352    }
    7684     psF32 dtime_astrom = psMetadataLookupF32(&status, md, "dtime_astrom");
    7685     if (!status) {
    7686         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_astrom");
     8353    psF32 dtime_total = psMetadataLookupF32(&status, md, "dtime_total");
     8354    if (!status) {
     8355        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_total");
     8356        return false;
     8357    }
     8358    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
     8359    if (!status) {
     8360        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
    76878361        return false;
    76888362    }
     
    76978371        return false;
    76988372    }
     8373    psS32 n_psfstars = psMetadataLookupS32(&status, md, "n_psfstars");
     8374    if (!status) {
     8375        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_psfstars");
     8376        return false;
     8377    }
     8378    psS32 n_iqstars = psMetadataLookupS32(&status, md, "n_iqstars");
     8379    if (!status) {
     8380        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_iqstars");
     8381        return false;
     8382    }
    76998383    psS32 n_extended = psMetadataLookupS32(&status, md, "n_extended");
    77008384    if (!status) {
     
    77078391        return false;
    77088392    }
    7709     psS32 n_astrom = psMetadataLookupS32(&status, md, "n_astrom");
    7710     if (!status) {
    7711         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_astrom");
    7712         return false;
    7713     }
    77148393    char* path_base = psMetadataLookupPtr(&status, md, "path_base");
    77158394    if (!status) {
     
    77238402    }
    77248403
    7725     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);
     8404    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);
    77268405}
    77278406psArray *chipProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    86199298static void camProcessedExpRowFree(camProcessedExpRow *object);
    86209299
    8621 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)
     9300camProcessedExpRow *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)
    86229301{
    86239302    camProcessedExpRow *_object;
     
    86449323    _object->fwhm_major = fwhm_major;
    86459324    _object->fwhm_minor = fwhm_minor;
    8646     _object->dtime_detrend = dtime_detrend;
    8647     _object->dtime_photom = dtime_photom;
     9325    _object->iq_m2 = iq_m2;
     9326    _object->iq_m2_err = iq_m2_err;
     9327    _object->iq_m2_lq = iq_m2_lq;
     9328    _object->iq_m2_uq = iq_m2_uq;
     9329    _object->iq_m2c = iq_m2c;
     9330    _object->iq_m2c_err = iq_m2c_err;
     9331    _object->iq_m2c_lq = iq_m2c_lq;
     9332    _object->iq_m2c_uq = iq_m2c_uq;
     9333    _object->iq_m2s = iq_m2s;
     9334    _object->iq_m2s_err = iq_m2s_err;
     9335    _object->iq_m2s_lq = iq_m2s_lq;
     9336    _object->iq_m2s_uq = iq_m2s_uq;
     9337    _object->iq_m3 = iq_m3;
     9338    _object->iq_m3_err = iq_m3_err;
     9339    _object->iq_m3_lq = iq_m3_lq;
     9340    _object->iq_m3_uq = iq_m3_uq;
     9341    _object->iq_m4 = iq_m4;
     9342    _object->iq_m4_err = iq_m4_err;
     9343    _object->iq_m4_lq = iq_m4_lq;
     9344    _object->iq_m4_uq = iq_m4_uq;
     9345    _object->dtime_script = dtime_script;
    86489346    _object->dtime_astrom = dtime_astrom;
     9347    _object->dtime_addstar = dtime_addstar;
    86499348    _object->hostname = psStringCopy(hostname);
    86509349    _object->n_stars = n_stars;
     9350    _object->n_psfstars = n_psfstars;
     9351    _object->n_iqstars = n_iqstars;
    86519352    _object->n_extended = n_extended;
    86529353    _object->n_cr = n_cr;
     
    87589459        return false;
    87599460    }
    8760     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, 0.0)) {
    8761         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
    8762         psFree(md);
    8763         return false;
    8764     }
    8765     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_photom", PS_DATA_F32, NULL, 0.0)) {
    8766         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_photom");
     9461    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, 0.0)) {
     9462        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
     9463        psFree(md);
     9464        return false;
     9465    }
     9466    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, 0.0)) {
     9467        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
     9468        psFree(md);
     9469        return false;
     9470    }
     9471    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, 0.0)) {
     9472        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
     9473        psFree(md);
     9474        return false;
     9475    }
     9476    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, 0.0)) {
     9477        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
     9478        psFree(md);
     9479        return false;
     9480    }
     9481    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, 0.0)) {
     9482        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
     9483        psFree(md);
     9484        return false;
     9485    }
     9486    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, 0.0)) {
     9487        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
     9488        psFree(md);
     9489        return false;
     9490    }
     9491    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, 0.0)) {
     9492        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
     9493        psFree(md);
     9494        return false;
     9495    }
     9496    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, 0.0)) {
     9497        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
     9498        psFree(md);
     9499        return false;
     9500    }
     9501    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, 0.0)) {
     9502        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
     9503        psFree(md);
     9504        return false;
     9505    }
     9506    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, 0.0)) {
     9507        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
     9508        psFree(md);
     9509        return false;
     9510    }
     9511    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, 0.0)) {
     9512        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
     9513        psFree(md);
     9514        return false;
     9515    }
     9516    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, 0.0)) {
     9517        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
     9518        psFree(md);
     9519        return false;
     9520    }
     9521    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, 0.0)) {
     9522        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
     9523        psFree(md);
     9524        return false;
     9525    }
     9526    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, 0.0)) {
     9527        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
     9528        psFree(md);
     9529        return false;
     9530    }
     9531    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, 0.0)) {
     9532        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
     9533        psFree(md);
     9534        return false;
     9535    }
     9536    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, 0.0)) {
     9537        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
     9538        psFree(md);
     9539        return false;
     9540    }
     9541    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, 0.0)) {
     9542        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
     9543        psFree(md);
     9544        return false;
     9545    }
     9546    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, 0.0)) {
     9547        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
     9548        psFree(md);
     9549        return false;
     9550    }
     9551    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, 0.0)) {
     9552        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
     9553        psFree(md);
     9554        return false;
     9555    }
     9556    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, 0.0)) {
     9557        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
     9558        psFree(md);
     9559        return false;
     9560    }
     9561    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
     9562        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
    87679563        psFree(md);
    87689564        return false;
     
    87739569        return false;
    87749570    }
     9571    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_addstar", PS_DATA_F32, NULL, 0.0)) {
     9572        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_addstar");
     9573        psFree(md);
     9574        return false;
     9575    }
    87759576    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
    87769577        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    87839584        return false;
    87849585    }
     9586    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, 0)) {
     9587        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
     9588        psFree(md);
     9589        return false;
     9590    }
     9591    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, 0)) {
     9592        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
     9593        psFree(md);
     9594        return false;
     9595    }
    87859596    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, 0)) {
    87869597        psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
     
    88219632}
    88229633
    8823 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)
     9634bool 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)
    88249635{
    88259636    psMetadata *md = psMetadataAlloc();
     
    89149725        return false;
    89159726    }
    8916     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, dtime_detrend)) {
    8917         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
    8918         psFree(md);
    8919         return false;
    8920     }
    8921     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_photom", PS_DATA_F32, NULL, dtime_photom)) {
    8922         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_photom");
     9727    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, iq_m2)) {
     9728        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
     9729        psFree(md);
     9730        return false;
     9731    }
     9732    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, iq_m2_err)) {
     9733        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
     9734        psFree(md);
     9735        return false;
     9736    }
     9737    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, iq_m2_lq)) {
     9738        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
     9739        psFree(md);
     9740        return false;
     9741    }
     9742    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, iq_m2_uq)) {
     9743        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
     9744        psFree(md);
     9745        return false;
     9746    }
     9747    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, iq_m2c)) {
     9748        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
     9749        psFree(md);
     9750        return false;
     9751    }
     9752    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, iq_m2c_err)) {
     9753        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
     9754        psFree(md);
     9755        return false;
     9756    }
     9757    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, iq_m2c_lq)) {
     9758        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
     9759        psFree(md);
     9760        return false;
     9761    }
     9762    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, iq_m2c_uq)) {
     9763        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
     9764        psFree(md);
     9765        return false;
     9766    }
     9767    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, iq_m2s)) {
     9768        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
     9769        psFree(md);
     9770        return false;
     9771    }
     9772    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, iq_m2s_err)) {
     9773        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
     9774        psFree(md);
     9775        return false;
     9776    }
     9777    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, iq_m2s_lq)) {
     9778        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
     9779        psFree(md);
     9780        return false;
     9781    }
     9782    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, iq_m2s_uq)) {
     9783        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
     9784        psFree(md);
     9785        return false;
     9786    }
     9787    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, iq_m3)) {
     9788        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
     9789        psFree(md);
     9790        return false;
     9791    }
     9792    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, iq_m3_err)) {
     9793        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
     9794        psFree(md);
     9795        return false;
     9796    }
     9797    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, iq_m3_lq)) {
     9798        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
     9799        psFree(md);
     9800        return false;
     9801    }
     9802    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, iq_m3_uq)) {
     9803        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
     9804        psFree(md);
     9805        return false;
     9806    }
     9807    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, iq_m4)) {
     9808        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
     9809        psFree(md);
     9810        return false;
     9811    }
     9812    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, iq_m4_err)) {
     9813        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
     9814        psFree(md);
     9815        return false;
     9816    }
     9817    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, iq_m4_lq)) {
     9818        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
     9819        psFree(md);
     9820        return false;
     9821    }
     9822    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, iq_m4_uq)) {
     9823        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
     9824        psFree(md);
     9825        return false;
     9826    }
     9827    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
     9828        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
    89239829        psFree(md);
    89249830        return false;
     
    89299835        return false;
    89309836    }
     9837    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_addstar", PS_DATA_F32, NULL, dtime_addstar)) {
     9838        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_addstar");
     9839        psFree(md);
     9840        return false;
     9841    }
    89319842    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, hostname)) {
    89329843        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    89369847    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_stars", PS_DATA_S32, NULL, n_stars)) {
    89379848        psError(PS_ERR_UNKNOWN, false, "failed to add item n_stars");
     9849        psFree(md);
     9850        return false;
     9851    }
     9852    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, n_psfstars)) {
     9853        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
     9854        psFree(md);
     9855        return false;
     9856    }
     9857    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, n_iqstars)) {
     9858        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
    89389859        psFree(md);
    89399860        return false;
     
    89879908bool camProcessedExpInsertObject(psDB *dbh, camProcessedExpRow *object)
    89889909{
    8989     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);
     9910    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);
    89909911}
    89919912
     
    915010071        return false;
    915110072    }
    9152     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_detrend", PS_DATA_F32, NULL, object->dtime_detrend)) {
    9153         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_detrend");
    9154         psFree(md);
    9155         return false;
    9156     }
    9157     if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_photom", PS_DATA_F32, NULL, object->dtime_photom)) {
    9158         psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_photom");
     10073    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2", PS_DATA_F32, NULL, object->iq_m2)) {
     10074        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2");
     10075        psFree(md);
     10076        return false;
     10077    }
     10078    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_err", PS_DATA_F32, NULL, object->iq_m2_err)) {
     10079        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_err");
     10080        psFree(md);
     10081        return false;
     10082    }
     10083    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_lq", PS_DATA_F32, NULL, object->iq_m2_lq)) {
     10084        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_lq");
     10085        psFree(md);
     10086        return false;
     10087    }
     10088    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2_uq", PS_DATA_F32, NULL, object->iq_m2_uq)) {
     10089        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2_uq");
     10090        psFree(md);
     10091        return false;
     10092    }
     10093    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c", PS_DATA_F32, NULL, object->iq_m2c)) {
     10094        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c");
     10095        psFree(md);
     10096        return false;
     10097    }
     10098    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_err", PS_DATA_F32, NULL, object->iq_m2c_err)) {
     10099        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_err");
     10100        psFree(md);
     10101        return false;
     10102    }
     10103    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_lq", PS_DATA_F32, NULL, object->iq_m2c_lq)) {
     10104        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_lq");
     10105        psFree(md);
     10106        return false;
     10107    }
     10108    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2c_uq", PS_DATA_F32, NULL, object->iq_m2c_uq)) {
     10109        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2c_uq");
     10110        psFree(md);
     10111        return false;
     10112    }
     10113    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s", PS_DATA_F32, NULL, object->iq_m2s)) {
     10114        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s");
     10115        psFree(md);
     10116        return false;
     10117    }
     10118    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_err", PS_DATA_F32, NULL, object->iq_m2s_err)) {
     10119        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_err");
     10120        psFree(md);
     10121        return false;
     10122    }
     10123    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_lq", PS_DATA_F32, NULL, object->iq_m2s_lq)) {
     10124        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_lq");
     10125        psFree(md);
     10126        return false;
     10127    }
     10128    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m2s_uq", PS_DATA_F32, NULL, object->iq_m2s_uq)) {
     10129        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m2s_uq");
     10130        psFree(md);
     10131        return false;
     10132    }
     10133    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3", PS_DATA_F32, NULL, object->iq_m3)) {
     10134        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3");
     10135        psFree(md);
     10136        return false;
     10137    }
     10138    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_err", PS_DATA_F32, NULL, object->iq_m3_err)) {
     10139        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_err");
     10140        psFree(md);
     10141        return false;
     10142    }
     10143    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_lq", PS_DATA_F32, NULL, object->iq_m3_lq)) {
     10144        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_lq");
     10145        psFree(md);
     10146        return false;
     10147    }
     10148    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m3_uq", PS_DATA_F32, NULL, object->iq_m3_uq)) {
     10149        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m3_uq");
     10150        psFree(md);
     10151        return false;
     10152    }
     10153    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4", PS_DATA_F32, NULL, object->iq_m4)) {
     10154        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4");
     10155        psFree(md);
     10156        return false;
     10157    }
     10158    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_err", PS_DATA_F32, NULL, object->iq_m4_err)) {
     10159        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_err");
     10160        psFree(md);
     10161        return false;
     10162    }
     10163    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_lq", PS_DATA_F32, NULL, object->iq_m4_lq)) {
     10164        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_lq");
     10165        psFree(md);
     10166        return false;
     10167    }
     10168    if (!psMetadataAdd(md, PS_LIST_TAIL, "iq_m4_uq", PS_DATA_F32, NULL, object->iq_m4_uq)) {
     10169        psError(PS_ERR_UNKNOWN, false, "failed to add item iq_m4_uq");
     10170        psFree(md);
     10171        return false;
     10172    }
     10173    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
     10174        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
    915910175        psFree(md);
    916010176        return false;
     
    916510181        return false;
    916610182    }
     10183    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_addstar", PS_DATA_F32, NULL, object->dtime_addstar)) {
     10184        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_addstar");
     10185        psFree(md);
     10186        return false;
     10187    }
    916710188    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
    916810189        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    917510196        return false;
    917610197    }
     10198    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_psfstars", PS_DATA_S32, NULL, object->n_psfstars)) {
     10199        psError(PS_ERR_UNKNOWN, false, "failed to add item n_psfstars");
     10200        psFree(md);
     10201        return false;
     10202    }
     10203    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_iqstars", PS_DATA_S32, NULL, object->n_iqstars)) {
     10204        psError(PS_ERR_UNKNOWN, false, "failed to add item n_iqstars");
     10205        psFree(md);
     10206        return false;
     10207    }
    917710208    if (!psMetadataAdd(md, PS_LIST_TAIL, "n_extended", PS_DATA_S32, NULL, object->n_extended)) {
    917810209        psError(PS_ERR_UNKNOWN, false, "failed to add item n_extended");
     
    929910330        return false;
    930010331    }
    9301     psF32 dtime_detrend = psMetadataLookupF32(&status, md, "dtime_detrend");
    9302     if (!status) {
    9303         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_detrend");
    9304         return false;
    9305     }
    9306     psF32 dtime_photom = psMetadataLookupF32(&status, md, "dtime_photom");
    9307     if (!status) {
    9308         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_photom");
     10332    psF32 iq_m2 = psMetadataLookupF32(&status, md, "iq_m2");
     10333    if (!status) {
     10334        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2");
     10335        return false;
     10336    }
     10337    psF32 iq_m2_err = psMetadataLookupF32(&status, md, "iq_m2_err");
     10338    if (!status) {
     10339        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_err");
     10340        return false;
     10341    }
     10342    psF32 iq_m2_lq = psMetadataLookupF32(&status, md, "iq_m2_lq");
     10343    if (!status) {
     10344        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_lq");
     10345        return false;
     10346    }
     10347    psF32 iq_m2_uq = psMetadataLookupF32(&status, md, "iq_m2_uq");
     10348    if (!status) {
     10349        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2_uq");
     10350        return false;
     10351    }
     10352    psF32 iq_m2c = psMetadataLookupF32(&status, md, "iq_m2c");
     10353    if (!status) {
     10354        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c");
     10355        return false;
     10356    }
     10357    psF32 iq_m2c_err = psMetadataLookupF32(&status, md, "iq_m2c_err");
     10358    if (!status) {
     10359        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_err");
     10360        return false;
     10361    }
     10362    psF32 iq_m2c_lq = psMetadataLookupF32(&status, md, "iq_m2c_lq");
     10363    if (!status) {
     10364        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_lq");
     10365        return false;
     10366    }
     10367    psF32 iq_m2c_uq = psMetadataLookupF32(&status, md, "iq_m2c_uq");
     10368    if (!status) {
     10369        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2c_uq");
     10370        return false;
     10371    }
     10372    psF32 iq_m2s = psMetadataLookupF32(&status, md, "iq_m2s");
     10373    if (!status) {
     10374        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s");
     10375        return false;
     10376    }
     10377    psF32 iq_m2s_err = psMetadataLookupF32(&status, md, "iq_m2s_err");
     10378    if (!status) {
     10379        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_err");
     10380        return false;
     10381    }
     10382    psF32 iq_m2s_lq = psMetadataLookupF32(&status, md, "iq_m2s_lq");
     10383    if (!status) {
     10384        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_lq");
     10385        return false;
     10386    }
     10387    psF32 iq_m2s_uq = psMetadataLookupF32(&status, md, "iq_m2s_uq");
     10388    if (!status) {
     10389        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m2s_uq");
     10390        return false;
     10391    }
     10392    psF32 iq_m3 = psMetadataLookupF32(&status, md, "iq_m3");
     10393    if (!status) {
     10394        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3");
     10395        return false;
     10396    }
     10397    psF32 iq_m3_err = psMetadataLookupF32(&status, md, "iq_m3_err");
     10398    if (!status) {
     10399        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_err");
     10400        return false;
     10401    }
     10402    psF32 iq_m3_lq = psMetadataLookupF32(&status, md, "iq_m3_lq");
     10403    if (!status) {
     10404        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_lq");
     10405        return false;
     10406    }
     10407    psF32 iq_m3_uq = psMetadataLookupF32(&status, md, "iq_m3_uq");
     10408    if (!status) {
     10409        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m3_uq");
     10410        return false;
     10411    }
     10412    psF32 iq_m4 = psMetadataLookupF32(&status, md, "iq_m4");
     10413    if (!status) {
     10414        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4");
     10415        return false;
     10416    }
     10417    psF32 iq_m4_err = psMetadataLookupF32(&status, md, "iq_m4_err");
     10418    if (!status) {
     10419        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_err");
     10420        return false;
     10421    }
     10422    psF32 iq_m4_lq = psMetadataLookupF32(&status, md, "iq_m4_lq");
     10423    if (!status) {
     10424        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_lq");
     10425        return false;
     10426    }
     10427    psF32 iq_m4_uq = psMetadataLookupF32(&status, md, "iq_m4_uq");
     10428    if (!status) {
     10429        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iq_m4_uq");
     10430        return false;
     10431    }
     10432    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
     10433    if (!status) {
     10434        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
    930910435        return false;
    931010436    }
     
    931410440        return false;
    931510441    }
     10442    psF32 dtime_addstar = psMetadataLookupF32(&status, md, "dtime_addstar");
     10443    if (!status) {
     10444        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_addstar");
     10445        return false;
     10446    }
    931610447    char* hostname = psMetadataLookupPtr(&status, md, "hostname");
    931710448    if (!status) {
     
    932410455        return false;
    932510456    }
     10457    psS32 n_psfstars = psMetadataLookupS32(&status, md, "n_psfstars");
     10458    if (!status) {
     10459        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_psfstars");
     10460        return false;
     10461    }
     10462    psS32 n_iqstars = psMetadataLookupS32(&status, md, "n_iqstars");
     10463    if (!status) {
     10464        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item n_iqstars");
     10465        return false;
     10466    }
    932610467    psS32 n_extended = psMetadataLookupS32(&status, md, "n_extended");
    932710468    if (!status) {
     
    935010491    }
    935110492
    9352     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);
     10493    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);
    935310494}
    935410495psArray *camProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1024611387static void fakeProcessedImfileRowFree(fakeProcessedImfileRow *object);
    1024711388
    10248 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)
     11389fakeProcessedImfileRow *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)
    1024911390{
    1025011391    fakeProcessedImfileRow *_object;
     
    1025811399    _object->uri = psStringCopy(uri);
    1025911400    _object->dtime_fake = dtime_fake;
     11401    _object->dtime_script = dtime_script;
    1026011402    _object->hostname = psStringCopy(hostname);
    1026111403    _object->path_base = psStringCopy(path_base);
     11404    _object->data_state = psStringCopy(data_state);
    1026211405    _object->fault = fault;
    1026311406    _object->epoch = psTimeCopy(epoch);
     
    1027211415    psFree(object->hostname);
    1027311416    psFree(object->path_base);
     11417    psFree(object->data_state);
    1027411418    psFree(object->epoch);
    1027511419}
     
    1030311447        return false;
    1030411448    }
     11449    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
     11450        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     11451        psFree(md);
     11452        return false;
     11453    }
    1030511454    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
    1030611455        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1031311462        return false;
    1031411463    }
     11464    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "Key", "64")) {
     11465        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     11466        psFree(md);
     11467        return false;
     11468    }
    1031511469    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    1031611470        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1033611490}
    1033711491
    10338 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)
     11492bool 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)
    1033911493{
    1034011494    psMetadata *md = psMetadataAlloc();
     
    1036411518        return false;
    1036511519    }
     11520    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
     11521        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     11522        psFree(md);
     11523        return false;
     11524    }
    1036611525    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, hostname)) {
    1036711526        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1037111530    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
    1037211531        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     11532        psFree(md);
     11533        return false;
     11534    }
     11535    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     11536        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    1037311537        psFree(md);
    1037411538        return false;
     
    1040711571bool fakeProcessedImfileInsertObject(psDB *dbh, fakeProcessedImfileRow *object)
    1040811572{
    10409     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);
     11573    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);
    1041011574}
    1041111575
     
    1050511669        return false;
    1050611670    }
     11671    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
     11672        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     11673        psFree(md);
     11674        return false;
     11675    }
    1050711676    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
    1050811677        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1051511684        return false;
    1051611685    }
     11686    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     11687        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     11688        psFree(md);
     11689        return false;
     11690    }
    1051711691    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    1051811692        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1055911733        return false;
    1056011734    }
     11735    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
     11736    if (!status) {
     11737        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
     11738        return false;
     11739    }
    1056111740    char* hostname = psMetadataLookupPtr(&status, md, "hostname");
    1056211741    if (!status) {
     
    1056911748        return false;
    1057011749    }
     11750    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     11751    if (!status) {
     11752        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     11753        return false;
     11754    }
    1057111755    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    1057211756    if (!status) {
     
    1058011764    }
    1058111765
    10582     return fakeProcessedImfileRowAlloc(fake_id, exp_id, class_id, uri, dtime_fake, hostname, path_base, fault, epoch);
     11766    return fakeProcessedImfileRowAlloc(fake_id, exp_id, class_id, uri, dtime_fake, dtime_script, hostname, path_base, data_state, fault, epoch);
    1058311767}
    1058411768psArray *fakeProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1186313047static void warpSkyfileRowFree(warpSkyfileRow *object);
    1186413048
    11865 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)
     13049warpSkyfileRow *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)
    1186613050{
    1186713051    warpSkyfileRow  *_object;
     
    1187513059    _object->uri = psStringCopy(uri);
    1187613060    _object->path_base = psStringCopy(path_base);
     13061    _object->data_state = psStringCopy(data_state);
    1187713062    _object->bg = bg;
    1187813063    _object->bg_stdev = bg_stdev;
    1187913064    _object->dtime_warp = dtime_warp;
     13065    _object->dtime_script = dtime_script;
    1188013066    _object->hostname = psStringCopy(hostname);
    1188113067    _object->good_frac = good_frac;
     
    1189613082    psFree(object->uri);
    1189713083    psFree(object->path_base);
     13084    psFree(object->data_state);
    1189813085    psFree(object->hostname);
    1189913086}
     
    1192713114        return false;
    1192813115    }
     13116    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "Key", "64")) {
     13117        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     13118        psFree(md);
     13119        return false;
     13120    }
    1192913121    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) {
    1193013122        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     
    1194213134        return false;
    1194313135    }
     13136    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
     13137        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     13138        psFree(md);
     13139        return false;
     13140    }
    1194413141    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
    1194513142        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1199513192}
    1199613193
    11997 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)
     13194bool 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)
    1199813195{
    1199913196    psMetadata *md = psMetadataAlloc();
     
    1202313220        return false;
    1202413221    }
     13222    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     13223        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     13224        psFree(md);
     13225        return false;
     13226    }
    1202513227    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, bg)) {
    1202613228        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     
    1203513237    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_warp", PS_DATA_F32, NULL, dtime_warp)) {
    1203613238        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_warp");
     13239        psFree(md);
     13240        return false;
     13241    }
     13242    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
     13243        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
    1203713244        psFree(md);
    1203813245        return false;
     
    1210113308bool warpSkyfileInsertObject(psDB *dbh, warpSkyfileRow *object)
    1210213309{
    12103     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);
     13310    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);
    1210413311}
    1210513312
     
    1219913406        return false;
    1220013407    }
     13408    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     13409        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     13410        psFree(md);
     13411        return false;
     13412    }
    1220113413    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) {
    1220213414        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     
    1221413426        return false;
    1221513427    }
     13428    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
     13429        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     13430        psFree(md);
     13431        return false;
     13432    }
    1221613433    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
    1221713434        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1228813505        return false;
    1228913506    }
     13507    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     13508    if (!status) {
     13509        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     13510        return false;
     13511    }
    1229013512    psF64 bg = psMetadataLookupF64(&status, md, "bg");
    1229113513    if (!status) {
     
    1230313525        return false;
    1230413526    }
     13527    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
     13528    if (!status) {
     13529        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
     13530        return false;
     13531    }
    1230513532    char* hostname = psMetadataLookupPtr(&status, md, "hostname");
    1230613533    if (!status) {
     
    1234413571    }
    1234513572
    12346     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);
     13573    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);
    1234713574}
    1234813575psArray *warpSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1274213969static void diffRunRowFree(diffRunRow *object);
    1274313970
    12744 diffRunRow *diffRunRowAlloc(psS64 diff_id, const char *state, const char *workdir, const char *dvodb, psTime* registered, const char *skycell_id, const char *tess_id)
     13971diffRunRow *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)
    1274513972{
    1274613973    diffRunRow      *_object;
     
    1275113978    _object->diff_id = diff_id;
    1275213979    _object->state = psStringCopy(state);
     13980    _object->label = psStringCopy(label);
     13981    _object->reduction = psStringCopy(reduction);
    1275313982    _object->workdir = psStringCopy(workdir);
    1275413983    _object->dvodb = psStringCopy(dvodb);
     
    1276313992{
    1276413993    psFree(object->state);
     13994    psFree(object->label);
     13995    psFree(object->reduction);
    1276513996    psFree(object->workdir);
    1276613997    psFree(object->dvodb);
     
    1278314014        return false;
    1278414015    }
     14016    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "Key", "64")) {
     14017        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     14018        psFree(md);
     14019        return false;
     14020    }
     14021    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, "Reduction class", "64")) {
     14022        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
     14023        psFree(md);
     14024        return false;
     14025    }
    1278514026    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
    1278614027        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     
    1282114062}
    1282214063
    12823 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)
     14064bool 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)
    1282414065{
    1282514066    psMetadata *md = psMetadataAlloc();
     
    1283114072    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
    1283214073        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     14074        psFree(md);
     14075        return false;
     14076    }
     14077    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
     14078        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     14079        psFree(md);
     14080        return false;
     14081    }
     14082    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
     14083        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    1283314084        psFree(md);
    1283414085        return false;
     
    1288214133bool diffRunInsertObject(psDB *dbh, diffRunRow *object)
    1288314134{
    12884     return diffRunInsert(dbh, object->diff_id, object->state, object->workdir, object->dvodb, object->registered, object->skycell_id, object->tess_id);
     14135    return diffRunInsert(dbh, object->diff_id, object->state, object->label, object->reduction, object->workdir, object->dvodb, object->registered, object->skycell_id, object->tess_id);
    1288514136}
    1288614137
     
    1296514216        return false;
    1296614217    }
     14218    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
     14219        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     14220        psFree(md);
     14221        return false;
     14222    }
     14223    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
     14224        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
     14225        psFree(md);
     14226        return false;
     14227    }
    1296714228    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
    1296814229        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     
    1300914270        return false;
    1301014271    }
     14272    char* label = psMetadataLookupPtr(&status, md, "label");
     14273    if (!status) {
     14274        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
     14275        return false;
     14276    }
     14277    char* reduction = psMetadataLookupPtr(&status, md, "reduction");
     14278    if (!status) {
     14279        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
     14280        return false;
     14281    }
    1301114282    char* workdir = psMetadataLookupPtr(&status, md, "workdir");
    1301214283    if (!status) {
     
    1303514306    }
    1303614307
    13037     return diffRunRowAlloc(diff_id, state, workdir, dvodb, registered, skycell_id, tess_id);
     14308    return diffRunRowAlloc(diff_id, state, label, reduction, workdir, dvodb, registered, skycell_id, tess_id);
    1303814309}
    1303914310psArray *diffRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1356114832static void diffSkyfileRowFree(diffSkyfileRow *object);
    1356214833
    13563 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)
     14834diffSkyfileRow *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)
    1356414835{
    1356514836    diffSkyfileRow  *_object;
     
    1357414845    _object->bg_stdev = bg_stdev;
    1357514846    _object->stamps_num = stamps_num;
     14847    _object->stamps_mean = stamps_mean;
    1357614848    _object->stamps_rms = stamps_rms;
     14849    _object->norm = norm;
     14850    _object->bg_diff = bg_diff;
     14851    _object->kernel_x = kernel_x;
     14852    _object->kernel_y = kernel_y;
     14853    _object->kernel_xx = kernel_xx;
     14854    _object->kernel_xy = kernel_xy;
     14855    _object->kernel_yy = kernel_yy;
    1357714856    _object->sources = sources;
    1357814857    _object->dtime_diff = dtime_diff;
     14858    _object->dtime_match = dtime_match;
     14859    _object->dtime_phot = dtime_phot;
     14860    _object->dtime_script = dtime_script;
    1357914861    _object->hostname = psStringCopy(hostname);
    1358014862    _object->good_frac = good_frac;
     
    1362414906        return false;
    1362514907    }
     14908    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, 0.0)) {
     14909        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
     14910        psFree(md);
     14911        return false;
     14912    }
    1362614913    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_rms", PS_DATA_F32, NULL, 0.0)) {
    1362714914        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_rms");
     
    1362914916        return false;
    1363014917    }
     14918    if (!psMetadataAdd(md, PS_LIST_TAIL, "norm", PS_DATA_F32, NULL, 0.0)) {
     14919        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
     14920        psFree(md);
     14921        return false;
     14922    }
     14923    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_diff", PS_DATA_F32, NULL, 0.0)) {
     14924        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_diff");
     14925        psFree(md);
     14926        return false;
     14927    }
     14928    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_x", PS_DATA_F32, NULL, 0.0)) {
     14929        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_x");
     14930        psFree(md);
     14931        return false;
     14932    }
     14933    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_y", PS_DATA_F32, NULL, 0.0)) {
     14934        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_y");
     14935        psFree(md);
     14936        return false;
     14937    }
     14938    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xx", PS_DATA_F32, NULL, 0.0)) {
     14939        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xx");
     14940        psFree(md);
     14941        return false;
     14942    }
     14943    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xy", PS_DATA_F32, NULL, 0.0)) {
     14944        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xy");
     14945        psFree(md);
     14946        return false;
     14947    }
     14948    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_yy", PS_DATA_F32, NULL, 0.0)) {
     14949        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_yy");
     14950        psFree(md);
     14951        return false;
     14952    }
    1363114953    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, 0)) {
    1363214954        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
     
    1363914961        return false;
    1364014962    }
     14963    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match", PS_DATA_F32, NULL, 0.0)) {
     14964        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match");
     14965        psFree(md);
     14966        return false;
     14967    }
     14968    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, 0.0)) {
     14969        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
     14970        psFree(md);
     14971        return false;
     14972    }
     14973    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
     14974        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     14975        psFree(md);
     14976        return false;
     14977    }
    1364114978    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
    1364214979        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1366715004}
    1366815005
    13669 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)
     15006bool 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)
    1367015007{
    1367115008    psMetadata *md = psMetadataAlloc();
     
    1370015037        return false;
    1370115038    }
     15039    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, stamps_mean)) {
     15040        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
     15041        psFree(md);
     15042        return false;
     15043    }
    1370215044    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_rms", PS_DATA_F32, NULL, stamps_rms)) {
    1370315045        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_rms");
     
    1370515047        return false;
    1370615048    }
     15049    if (!psMetadataAdd(md, PS_LIST_TAIL, "norm", PS_DATA_F32, NULL, norm)) {
     15050        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
     15051        psFree(md);
     15052        return false;
     15053    }
     15054    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_diff", PS_DATA_F32, NULL, bg_diff)) {
     15055        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_diff");
     15056        psFree(md);
     15057        return false;
     15058    }
     15059    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_x", PS_DATA_F32, NULL, kernel_x)) {
     15060        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_x");
     15061        psFree(md);
     15062        return false;
     15063    }
     15064    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_y", PS_DATA_F32, NULL, kernel_y)) {
     15065        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_y");
     15066        psFree(md);
     15067        return false;
     15068    }
     15069    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xx", PS_DATA_F32, NULL, kernel_xx)) {
     15070        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xx");
     15071        psFree(md);
     15072        return false;
     15073    }
     15074    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xy", PS_DATA_F32, NULL, kernel_xy)) {
     15075        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xy");
     15076        psFree(md);
     15077        return false;
     15078    }
     15079    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_yy", PS_DATA_F32, NULL, kernel_yy)) {
     15080        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_yy");
     15081        psFree(md);
     15082        return false;
     15083    }
    1370715084    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, sources)) {
    1370815085        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
     
    1371215089    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_diff", PS_DATA_F32, NULL, dtime_diff)) {
    1371315090        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_diff");
     15091        psFree(md);
     15092        return false;
     15093    }
     15094    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match", PS_DATA_F32, NULL, dtime_match)) {
     15095        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match");
     15096        psFree(md);
     15097        return false;
     15098    }
     15099    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, dtime_phot)) {
     15100        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
     15101        psFree(md);
     15102        return false;
     15103    }
     15104    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
     15105        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
    1371415106        psFree(md);
    1371515107        return false;
     
    1375315145bool diffSkyfileInsertObject(psDB *dbh, diffSkyfileRow *object)
    1375415146{
    13755     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);
     15147    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);
    1375615148}
    1375715149
     
    1385615248        return false;
    1385715249    }
     15250    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, object->stamps_mean)) {
     15251        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
     15252        psFree(md);
     15253        return false;
     15254    }
    1385815255    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_rms", PS_DATA_F32, NULL, object->stamps_rms)) {
    1385915256        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_rms");
     
    1386115258        return false;
    1386215259    }
     15260    if (!psMetadataAdd(md, PS_LIST_TAIL, "norm", PS_DATA_F32, NULL, object->norm)) {
     15261        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
     15262        psFree(md);
     15263        return false;
     15264    }
     15265    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_diff", PS_DATA_F32, NULL, object->bg_diff)) {
     15266        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_diff");
     15267        psFree(md);
     15268        return false;
     15269    }
     15270    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_x", PS_DATA_F32, NULL, object->kernel_x)) {
     15271        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_x");
     15272        psFree(md);
     15273        return false;
     15274    }
     15275    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_y", PS_DATA_F32, NULL, object->kernel_y)) {
     15276        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_y");
     15277        psFree(md);
     15278        return false;
     15279    }
     15280    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xx", PS_DATA_F32, NULL, object->kernel_xx)) {
     15281        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xx");
     15282        psFree(md);
     15283        return false;
     15284    }
     15285    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_xy", PS_DATA_F32, NULL, object->kernel_xy)) {
     15286        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_xy");
     15287        psFree(md);
     15288        return false;
     15289    }
     15290    if (!psMetadataAdd(md, PS_LIST_TAIL, "kernel_yy", PS_DATA_F32, NULL, object->kernel_yy)) {
     15291        psError(PS_ERR_UNKNOWN, false, "failed to add item kernel_yy");
     15292        psFree(md);
     15293        return false;
     15294    }
    1386315295    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, object->sources)) {
    1386415296        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
     
    1387115303        return false;
    1387215304    }
     15305    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match", PS_DATA_F32, NULL, object->dtime_match)) {
     15306        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match");
     15307        psFree(md);
     15308        return false;
     15309    }
     15310    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, object->dtime_phot)) {
     15311        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
     15312        psFree(md);
     15313        return false;
     15314    }
     15315    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
     15316        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     15317        psFree(md);
     15318        return false;
     15319    }
    1387315320    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
    1387415321        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1392515372        return false;
    1392615373    }
     15374    psF32 stamps_mean = psMetadataLookupF32(&status, md, "stamps_mean");
     15375    if (!status) {
     15376        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stamps_mean");
     15377        return false;
     15378    }
    1392715379    psF32 stamps_rms = psMetadataLookupF32(&status, md, "stamps_rms");
    1392815380    if (!status) {
     
    1393015382        return false;
    1393115383    }
     15384    psF32 norm = psMetadataLookupF32(&status, md, "norm");
     15385    if (!status) {
     15386        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item norm");
     15387        return false;
     15388    }
     15389    psF32 bg_diff = psMetadataLookupF32(&status, md, "bg_diff");
     15390    if (!status) {
     15391        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_diff");
     15392        return false;
     15393    }
     15394    psF32 kernel_x = psMetadataLookupF32(&status, md, "kernel_x");
     15395    if (!status) {
     15396        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_x");
     15397        return false;
     15398    }
     15399    psF32 kernel_y = psMetadataLookupF32(&status, md, "kernel_y");
     15400    if (!status) {
     15401        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_y");
     15402        return false;
     15403    }
     15404    psF32 kernel_xx = psMetadataLookupF32(&status, md, "kernel_xx");
     15405    if (!status) {
     15406        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_xx");
     15407        return false;
     15408    }
     15409    psF32 kernel_xy = psMetadataLookupF32(&status, md, "kernel_xy");
     15410    if (!status) {
     15411        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_xy");
     15412        return false;
     15413    }
     15414    psF32 kernel_yy = psMetadataLookupF32(&status, md, "kernel_yy");
     15415    if (!status) {
     15416        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kernel_yy");
     15417        return false;
     15418    }
    1393215419    psS32 sources = psMetadataLookupS32(&status, md, "sources");
    1393315420    if (!status) {
     
    1394015427        return false;
    1394115428    }
     15429    psF32 dtime_match = psMetadataLookupF32(&status, md, "dtime_match");
     15430    if (!status) {
     15431        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_match");
     15432        return false;
     15433    }
     15434    psF32 dtime_phot = psMetadataLookupF32(&status, md, "dtime_phot");
     15435    if (!status) {
     15436        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_phot");
     15437        return false;
     15438    }
     15439    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
     15440    if (!status) {
     15441        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
     15442        return false;
     15443    }
    1394215444    char* hostname = psMetadataLookupPtr(&status, md, "hostname");
    1394315445    if (!status) {
     
    1395615458    }
    1395715459
    13958     return diffSkyfileRowAlloc(diff_id, uri, path_base, bg, bg_stdev, stamps_num, stamps_rms, sources, dtime_diff, hostname, good_frac, fault);
     15460    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);
    1395915461}
    1396015462psArray *diffSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1407415576static void stackRunRowFree(stackRunRow *object);
    1407515577
    14076 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)
     15578stackRunRow *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)
    1407715579{
    1407815580    stackRunRow     *_object;
     
    1408415586    _object->state = psStringCopy(state);
    1408515587    _object->workdir = psStringCopy(workdir);
     15588    _object->label = psStringCopy(label);
     15589    _object->reduction = psStringCopy(reduction);
    1408615590    _object->dvodb = psStringCopy(dvodb);
    1408715591    _object->registered = psTimeCopy(registered);
     
    1409715601    psFree(object->state);
    1409815602    psFree(object->workdir);
     15603    psFree(object->label);
     15604    psFree(object->reduction);
    1409915605    psFree(object->dvodb);
    1410015606    psFree(object->registered);
     
    1412215628        return false;
    1412315629    }
     15630    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "Key", "64")) {
     15631        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     15632        psFree(md);
     15633        return false;
     15634    }
     15635    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, "Reduction class", "64")) {
     15636        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
     15637        psFree(md);
     15638        return false;
     15639    }
    1412415640    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "255")) {
    1412515641        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
     
    1416015676}
    1416115677
    14162 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)
     15678bool 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)
    1416315679{
    1416415680    psMetadata *md = psMetadataAlloc();
     
    1417515691    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
    1417615692        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     15693        psFree(md);
     15694        return false;
     15695    }
     15696    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
     15697        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     15698        psFree(md);
     15699        return false;
     15700    }
     15701    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
     15702        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    1417715703        psFree(md);
    1417815704        return false;
     
    1422615752bool stackRunInsertObject(psDB *dbh, stackRunRow *object)
    1422715753{
    14228     return stackRunInsert(dbh, object->stack_id, object->state, object->workdir, object->dvodb, object->registered, object->skycell_id, object->tess_id, object->filter);
     15754    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);
    1422915755}
    1423015756
     
    1431415840        return false;
    1431515841    }
     15842    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
     15843        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     15844        psFree(md);
     15845        return false;
     15846    }
     15847    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
     15848        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
     15849        psFree(md);
     15850        return false;
     15851    }
    1431615852    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {
    1431715853        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
     
    1436315899        return false;
    1436415900    }
     15901    char* label = psMetadataLookupPtr(&status, md, "label");
     15902    if (!status) {
     15903        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
     15904        return false;
     15905    }
     15906    char* reduction = psMetadataLookupPtr(&status, md, "reduction");
     15907    if (!status) {
     15908        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
     15909        return false;
     15910    }
    1436515911    char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");
    1436615912    if (!status) {
     
    1438915935    }
    1439015936
    14391     return stackRunRowAlloc(stack_id, state, workdir, dvodb, registered, skycell_id, tess_id, filter);
     15937    return stackRunRowAlloc(stack_id, state, workdir, label, reduction, dvodb, registered, skycell_id, tess_id, filter);
    1439215938}
    1439315939psArray *stackRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1480716353static void stackSumSkyfileRowFree(stackSumSkyfileRow *object);
    1480816354
    14809 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)
     16355stackSumSkyfileRow *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)
    1481016356{
    1481116357    stackSumSkyfileRow *_object;
     
    1482016366    _object->bg_stdev = bg_stdev;
    1482116367    _object->dtime_stack = dtime_stack;
     16368    _object->dtime_match_mean = dtime_match_mean;
     16369    _object->dtime_match_stdev = dtime_match_stdev;
     16370    _object->dtime_initial = dtime_initial;
     16371    _object->dtime_reject = dtime_reject;
     16372    _object->dtime_final = dtime_final;
     16373    _object->dtime_phot = dtime_phot;
     16374    _object->dtime_script = dtime_script;
     16375    _object->match_mean = match_mean;
     16376    _object->match_stdev = match_stdev;
     16377    _object->match_rms = match_rms;
     16378    _object->stamps_mean = stamps_mean;
     16379    _object->stamps_stdev = stamps_stdev;
     16380    _object->stamps_min = stamps_min;
     16381    _object->reject_images = reject_images;
     16382    _object->reject_pix_mean = reject_pix_mean;
     16383    _object->reject_pix_stdev = reject_pix_stdev;
     16384    _object->sources = sources;
    1482216385    _object->hostname = psStringCopy(hostname);
    1482316386    _object->good_frac = good_frac;
     
    1486716430        return false;
    1486816431    }
     16432    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_mean", PS_DATA_F32, "Key", 0.0)) {
     16433        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_mean");
     16434        psFree(md);
     16435        return false;
     16436    }
     16437    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_stdev", PS_DATA_F32, "Key", 0.0)) {
     16438        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_stdev");
     16439        psFree(md);
     16440        return false;
     16441    }
     16442    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_initial", PS_DATA_F32, "Key", 0.0)) {
     16443        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_initial");
     16444        psFree(md);
     16445        return false;
     16446    }
     16447    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_reject", PS_DATA_F32, "Key", 0.0)) {
     16448        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_reject");
     16449        psFree(md);
     16450        return false;
     16451    }
     16452    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_final", PS_DATA_F32, "Key", 0.0)) {
     16453        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_final");
     16454        psFree(md);
     16455        return false;
     16456    }
     16457    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, "Key", 0.0)) {
     16458        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
     16459        psFree(md);
     16460        return false;
     16461    }
     16462    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, 0.0)) {
     16463        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     16464        psFree(md);
     16465        return false;
     16466    }
     16467    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_mean", PS_DATA_F32, NULL, 0.0)) {
     16468        psError(PS_ERR_UNKNOWN, false, "failed to add item match_mean");
     16469        psFree(md);
     16470        return false;
     16471    }
     16472    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_stdev", PS_DATA_F32, NULL, 0.0)) {
     16473        psError(PS_ERR_UNKNOWN, false, "failed to add item match_stdev");
     16474        psFree(md);
     16475        return false;
     16476    }
     16477    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_rms", PS_DATA_F32, NULL, 0.0)) {
     16478        psError(PS_ERR_UNKNOWN, false, "failed to add item match_rms");
     16479        psFree(md);
     16480        return false;
     16481    }
     16482    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, 0.0)) {
     16483        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
     16484        psFree(md);
     16485        return false;
     16486    }
     16487    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_stdev", PS_DATA_F32, NULL, 0.0)) {
     16488        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_stdev");
     16489        psFree(md);
     16490        return false;
     16491    }
     16492    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_min", PS_DATA_S32, NULL, 0)) {
     16493        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_min");
     16494        psFree(md);
     16495        return false;
     16496    }
     16497    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_images", PS_DATA_S32, NULL, 0)) {
     16498        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_images");
     16499        psFree(md);
     16500        return false;
     16501    }
     16502    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_mean", PS_DATA_F32, NULL, 0.0)) {
     16503        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_mean");
     16504        psFree(md);
     16505        return false;
     16506    }
     16507    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_stdev", PS_DATA_F32, NULL, 0.0)) {
     16508        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_stdev");
     16509        psFree(md);
     16510        return false;
     16511    }
     16512    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, 0)) {
     16513        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
     16514        psFree(md);
     16515        return false;
     16516    }
    1486916517    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
    1487016518        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1489516543}
    1489616544
    14897 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)
     16545bool 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)
    1489816546{
    1489916547    psMetadata *md = psMetadataAlloc();
     
    1492516573    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_stack", PS_DATA_F32, NULL, dtime_stack)) {
    1492616574        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_stack");
     16575        psFree(md);
     16576        return false;
     16577    }
     16578    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_mean", PS_DATA_F32, NULL, dtime_match_mean)) {
     16579        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_mean");
     16580        psFree(md);
     16581        return false;
     16582    }
     16583    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_stdev", PS_DATA_F32, NULL, dtime_match_stdev)) {
     16584        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_stdev");
     16585        psFree(md);
     16586        return false;
     16587    }
     16588    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_initial", PS_DATA_F32, NULL, dtime_initial)) {
     16589        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_initial");
     16590        psFree(md);
     16591        return false;
     16592    }
     16593    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_reject", PS_DATA_F32, NULL, dtime_reject)) {
     16594        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_reject");
     16595        psFree(md);
     16596        return false;
     16597    }
     16598    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_final", PS_DATA_F32, NULL, dtime_final)) {
     16599        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_final");
     16600        psFree(md);
     16601        return false;
     16602    }
     16603    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, dtime_phot)) {
     16604        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
     16605        psFree(md);
     16606        return false;
     16607    }
     16608    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, dtime_script)) {
     16609        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     16610        psFree(md);
     16611        return false;
     16612    }
     16613    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_mean", PS_DATA_F32, NULL, match_mean)) {
     16614        psError(PS_ERR_UNKNOWN, false, "failed to add item match_mean");
     16615        psFree(md);
     16616        return false;
     16617    }
     16618    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_stdev", PS_DATA_F32, NULL, match_stdev)) {
     16619        psError(PS_ERR_UNKNOWN, false, "failed to add item match_stdev");
     16620        psFree(md);
     16621        return false;
     16622    }
     16623    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_rms", PS_DATA_F32, NULL, match_rms)) {
     16624        psError(PS_ERR_UNKNOWN, false, "failed to add item match_rms");
     16625        psFree(md);
     16626        return false;
     16627    }
     16628    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, stamps_mean)) {
     16629        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
     16630        psFree(md);
     16631        return false;
     16632    }
     16633    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_stdev", PS_DATA_F32, NULL, stamps_stdev)) {
     16634        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_stdev");
     16635        psFree(md);
     16636        return false;
     16637    }
     16638    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_min", PS_DATA_S32, NULL, stamps_min)) {
     16639        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_min");
     16640        psFree(md);
     16641        return false;
     16642    }
     16643    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_images", PS_DATA_S32, NULL, reject_images)) {
     16644        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_images");
     16645        psFree(md);
     16646        return false;
     16647    }
     16648    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_mean", PS_DATA_F32, NULL, reject_pix_mean)) {
     16649        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_mean");
     16650        psFree(md);
     16651        return false;
     16652    }
     16653    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_stdev", PS_DATA_F32, NULL, reject_pix_stdev)) {
     16654        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_stdev");
     16655        psFree(md);
     16656        return false;
     16657    }
     16658    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, sources)) {
     16659        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
    1492716660        psFree(md);
    1492816661        return false;
     
    1496616699bool stackSumSkyfileInsertObject(psDB *dbh, stackSumSkyfileRow *object)
    1496716700{
    14968     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);
     16701    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);
    1496916702}
    1497016703
     
    1506916802        return false;
    1507016803    }
     16804    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_mean", PS_DATA_F32, NULL, object->dtime_match_mean)) {
     16805        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_mean");
     16806        psFree(md);
     16807        return false;
     16808    }
     16809    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_match_stdev", PS_DATA_F32, NULL, object->dtime_match_stdev)) {
     16810        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_match_stdev");
     16811        psFree(md);
     16812        return false;
     16813    }
     16814    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_initial", PS_DATA_F32, NULL, object->dtime_initial)) {
     16815        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_initial");
     16816        psFree(md);
     16817        return false;
     16818    }
     16819    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_reject", PS_DATA_F32, NULL, object->dtime_reject)) {
     16820        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_reject");
     16821        psFree(md);
     16822        return false;
     16823    }
     16824    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_final", PS_DATA_F32, NULL, object->dtime_final)) {
     16825        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_final");
     16826        psFree(md);
     16827        return false;
     16828    }
     16829    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_phot", PS_DATA_F32, NULL, object->dtime_phot)) {
     16830        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_phot");
     16831        psFree(md);
     16832        return false;
     16833    }
     16834    if (!psMetadataAdd(md, PS_LIST_TAIL, "dtime_script", PS_DATA_F32, NULL, object->dtime_script)) {
     16835        psError(PS_ERR_UNKNOWN, false, "failed to add item dtime_script");
     16836        psFree(md);
     16837        return false;
     16838    }
     16839    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_mean", PS_DATA_F32, NULL, object->match_mean)) {
     16840        psError(PS_ERR_UNKNOWN, false, "failed to add item match_mean");
     16841        psFree(md);
     16842        return false;
     16843    }
     16844    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_stdev", PS_DATA_F32, NULL, object->match_stdev)) {
     16845        psError(PS_ERR_UNKNOWN, false, "failed to add item match_stdev");
     16846        psFree(md);
     16847        return false;
     16848    }
     16849    if (!psMetadataAdd(md, PS_LIST_TAIL, "match_rms", PS_DATA_F32, NULL, object->match_rms)) {
     16850        psError(PS_ERR_UNKNOWN, false, "failed to add item match_rms");
     16851        psFree(md);
     16852        return false;
     16853    }
     16854    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_mean", PS_DATA_F32, NULL, object->stamps_mean)) {
     16855        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_mean");
     16856        psFree(md);
     16857        return false;
     16858    }
     16859    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_stdev", PS_DATA_F32, NULL, object->stamps_stdev)) {
     16860        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_stdev");
     16861        psFree(md);
     16862        return false;
     16863    }
     16864    if (!psMetadataAdd(md, PS_LIST_TAIL, "stamps_min", PS_DATA_S32, NULL, object->stamps_min)) {
     16865        psError(PS_ERR_UNKNOWN, false, "failed to add item stamps_min");
     16866        psFree(md);
     16867        return false;
     16868    }
     16869    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_images", PS_DATA_S32, NULL, object->reject_images)) {
     16870        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_images");
     16871        psFree(md);
     16872        return false;
     16873    }
     16874    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_mean", PS_DATA_F32, NULL, object->reject_pix_mean)) {
     16875        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_mean");
     16876        psFree(md);
     16877        return false;
     16878    }
     16879    if (!psMetadataAdd(md, PS_LIST_TAIL, "reject_pix_stdev", PS_DATA_F32, NULL, object->reject_pix_stdev)) {
     16880        psError(PS_ERR_UNKNOWN, false, "failed to add item reject_pix_stdev");
     16881        psFree(md);
     16882        return false;
     16883    }
     16884    if (!psMetadataAdd(md, PS_LIST_TAIL, "sources", PS_DATA_S32, NULL, object->sources)) {
     16885        psError(PS_ERR_UNKNOWN, false, "failed to add item sources");
     16886        psFree(md);
     16887        return false;
     16888    }
    1507116889    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
    1507216890        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     
    1512316941        return false;
    1512416942    }
     16943    psF32 dtime_match_mean = psMetadataLookupF32(&status, md, "dtime_match_mean");
     16944    if (!status) {
     16945        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_match_mean");
     16946        return false;
     16947    }
     16948    psF32 dtime_match_stdev = psMetadataLookupF32(&status, md, "dtime_match_stdev");
     16949    if (!status) {
     16950        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_match_stdev");
     16951        return false;
     16952    }
     16953    psF32 dtime_initial = psMetadataLookupF32(&status, md, "dtime_initial");
     16954    if (!status) {
     16955        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_initial");
     16956        return false;
     16957    }
     16958    psF32 dtime_reject = psMetadataLookupF32(&status, md, "dtime_reject");
     16959    if (!status) {
     16960        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_reject");
     16961        return false;
     16962    }
     16963    psF32 dtime_final = psMetadataLookupF32(&status, md, "dtime_final");
     16964    if (!status) {
     16965        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_final");
     16966        return false;
     16967    }
     16968    psF32 dtime_phot = psMetadataLookupF32(&status, md, "dtime_phot");
     16969    if (!status) {
     16970        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_phot");
     16971        return false;
     16972    }
     16973    psF32 dtime_script = psMetadataLookupF32(&status, md, "dtime_script");
     16974    if (!status) {
     16975        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dtime_script");
     16976        return false;
     16977    }
     16978    psF32 match_mean = psMetadataLookupF32(&status, md, "match_mean");
     16979    if (!status) {
     16980        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item match_mean");
     16981        return false;
     16982    }
     16983    psF32 match_stdev = psMetadataLookupF32(&status, md, "match_stdev");
     16984    if (!status) {
     16985        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item match_stdev");
     16986        return false;
     16987    }
     16988    psF32 match_rms = psMetadataLookupF32(&status, md, "match_rms");
     16989    if (!status) {
     16990        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item match_rms");
     16991        return false;
     16992    }
     16993    psF32 stamps_mean = psMetadataLookupF32(&status, md, "stamps_mean");
     16994    if (!status) {
     16995        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stamps_mean");
     16996        return false;
     16997    }
     16998    psF32 stamps_stdev = psMetadataLookupF32(&status, md, "stamps_stdev");
     16999    if (!status) {
     17000        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stamps_stdev");
     17001        return false;
     17002    }
     17003    psS32 stamps_min = psMetadataLookupS32(&status, md, "stamps_min");
     17004    if (!status) {
     17005        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stamps_min");
     17006        return false;
     17007    }
     17008    psS32 reject_images = psMetadataLookupS32(&status, md, "reject_images");
     17009    if (!status) {
     17010        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reject_images");
     17011        return false;
     17012    }
     17013    psF32 reject_pix_mean = psMetadataLookupF32(&status, md, "reject_pix_mean");
     17014    if (!status) {
     17015        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reject_pix_mean");
     17016        return false;
     17017    }
     17018    psF32 reject_pix_stdev = psMetadataLookupF32(&status, md, "reject_pix_stdev");
     17019    if (!status) {
     17020        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reject_pix_stdev");
     17021        return false;
     17022    }
     17023    psS32 sources = psMetadataLookupS32(&status, md, "sources");
     17024    if (!status) {
     17025        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item sources");
     17026        return false;
     17027    }
    1512517028    char* hostname = psMetadataLookupPtr(&status, md, "hostname");
    1512617029    if (!status) {
     
    1513917042    }
    1514017043
    15141     return stackSumSkyfileRowAlloc(stack_id, uri, path_base, bg, bg_stdev, dtime_stack, hostname, good_frac, fault);
     17044    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);
    1514217045}
    1514317046psArray *stackSumSkyfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1525717160static void detRunRowFree(detRunRow *object);
    1525817161
    15259 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)
     17162detRunRow *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)
    1526017163{
    1526117164    detRunRow       *_object;
     
    1529217195    _object->solang_max = solang_max;
    1529317196    _object->label = psStringCopy(label);
    15294     _object->parent = parent;
     17197    _object->ref_det_id = ref_det_id;
     17198    _object->ref_iter = ref_iter;
    1529517199
    1529617200    return _object;
     
    1546017364        return false;
    1546117365    }
    15462     if (!psMetadataAdd(md, PS_LIST_TAIL, "parent", PS_DATA_S32, "Key", 0)) {
    15463         psError(PS_ERR_UNKNOWN, false, "failed to add item parent");
     17366    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, "reference for 'verify' and 'correction' analysis", 0)) {
     17367        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
     17368        psFree(md);
     17369        return false;
     17370    }
     17371    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, "reference for 'verify' and 'correction' analysis", 0)) {
     17372        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
    1546417373        psFree(md);
    1546517374        return false;
     
    1547817387}
    1547917388
    15480 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)
     17389bool 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)
    1548117390{
    1548217391    psMetadata *md = psMetadataAlloc();
     
    1562117530        return false;
    1562217531    }
    15623     if (!psMetadataAdd(md, PS_LIST_TAIL, "parent", PS_DATA_S32, NULL, parent)) {
    15624         psError(PS_ERR_UNKNOWN, false, "failed to add item parent");
     17532    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, NULL, ref_det_id)) {
     17533        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
     17534        psFree(md);
     17535        return false;
     17536    }
     17537    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, NULL, ref_iter)) {
     17538        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
    1562517539        psFree(md);
    1562617540        return false;
     
    1564917563bool detRunInsertObject(psDB *dbh, detRunRow *object)
    1565017564{
    15651     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);
     17565    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);
    1565217566}
    1565317567
     
    1586217776        return false;
    1586317777    }
    15864     if (!psMetadataAdd(md, PS_LIST_TAIL, "parent", PS_DATA_S32, NULL, object->parent)) {
    15865         psError(PS_ERR_UNKNOWN, false, "failed to add item parent");
     17778    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, NULL, object->ref_det_id)) {
     17779        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
     17780        psFree(md);
     17781        return false;
     17782    }
     17783    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, NULL, object->ref_iter)) {
     17784        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
    1586617785        psFree(md);
    1586717786        return false;
     
    1601617935        return false;
    1601717936    }
    16018     psS32 parent = psMetadataLookupS32(&status, md, "parent");
    16019     if (!status) {
    16020         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item parent");
    16021         return false;
    16022     }
    16023 
    16024     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);
     17937    psS64 ref_det_id = psMetadataLookupS64(&status, md, "ref_det_id");
     17938    if (!status) {
     17939        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item ref_det_id");
     17940        return false;
     17941    }
     17942    psS32 ref_iter = psMetadataLookupS32(&status, md, "ref_iter");
     17943    if (!status) {
     17944        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item ref_iter");
     17945        return false;
     17946    }
     17947
     17948    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);
    1602517949}
    1602617950psArray *detRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1648218406static void detProcessedImfileRowFree(detProcessedImfileRow *object);
    1648318407
    16484 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)
     18408detProcessedImfileRow *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)
    1648518409{
    1648618410    detProcessedImfileRow *_object;
     
    1650618430    _object->user_5 = user_5;
    1650718431    _object->path_base = psStringCopy(path_base);
     18432    _object->data_state = psStringCopy(data_state);
    1650818433    _object->fault = fault;
    1650918434
     
    1651718442    psFree(object->recipe);
    1651818443    psFree(object->path_base);
     18444    psFree(object->data_state);
    1651918445}
    1652018446
     
    1660718533        return false;
    1660818534    }
     18535    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")) {
     18536        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     18537        psFree(md);
     18538        return false;
     18539    }
    1660918540    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    1661018541        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1662518556}
    1662618557
    16627 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)
     18558bool 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)
    1662818559{
    1662918560    psMetadata *md = psMetadataAlloc();
     
    1671018641    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
    1671118642        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     18643        psFree(md);
     18644        return false;
     18645    }
     18646    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     18647        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    1671218648        psFree(md);
    1671318649        return false;
     
    1674118677bool detProcessedImfileInsertObject(psDB *dbh, detProcessedImfileRow *object)
    1674218678{
    16743     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);
     18679    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);
    1674418680}
    1674518681
     
    1689918835        return false;
    1690018836    }
     18837    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     18838        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     18839        psFree(md);
     18840        return false;
     18841    }
    1690118842    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    1690218843        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1699818939        return false;
    1699918940    }
     18941    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     18942    if (!status) {
     18943        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     18944        return false;
     18945    }
    1700018946    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    1700118947    if (!status) {
     
    1700418950    }
    1700518951
    17006     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);
     18952    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);
    1700718953}
    1700818954psArray *detProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1712219068static void detProcessedExpRowFree(detProcessedExpRow *object);
    1712319069
    17124 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)
     19070detProcessedExpRow *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)
    1712519071{
    1712619072    detProcessedExpRow *_object;
     
    1714419090    _object->user_5 = user_5;
    1714519091    _object->path_base = psStringCopy(path_base);
     19092    _object->data_state = psStringCopy(data_state);
    1714619093    _object->fault = fault;
    1714719094
     
    1715319100    psFree(object->recipe);
    1715419101    psFree(object->path_base);
     19102    psFree(object->data_state);
    1715519103}
    1715619104
     
    1723319181        return false;
    1723419182    }
     19183    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")) {
     19184        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     19185        psFree(md);
     19186        return false;
     19187    }
    1723519188    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    1723619189        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1725119204}
    1725219205
    17253 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)
     19206bool 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)
    1725419207{
    1725519208    psMetadata *md = psMetadataAlloc();
     
    1732619279    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
    1732719280        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     19281        psFree(md);
     19282        return false;
     19283    }
     19284    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     19285        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    1732819286        psFree(md);
    1732919287        return false;
     
    1735719315bool detProcessedExpInsertObject(psDB *dbh, detProcessedExpRow *object)
    1735819316{
    17359     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);
     19317    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);
    1736019318}
    1736119319
     
    1750519463        return false;
    1750619464    }
     19465    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     19466        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     19467        psFree(md);
     19468        return false;
     19469    }
    1750719470    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    1750819471        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1759419557        return false;
    1759519558    }
     19559    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     19560    if (!status) {
     19561        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     19562        return false;
     19563    }
    1759619564    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    1759719565    if (!status) {
     
    1760019568    }
    1760119569
    17602     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);
     19570    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);
    1760319571}
    1760419572psArray *detProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1771819686static void detStackedImfileRowFree(detStackedImfileRow *object);
    1771919687
    17720 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)
     19688detStackedImfileRow *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)
    1772119689{
    1772219690    detStackedImfileRow *_object;
     
    1773819706    _object->user_4 = user_4;
    1773919707    _object->user_5 = user_5;
     19708    _object->data_state = psStringCopy(data_state);
    1774019709    _object->fault = fault;
    1774119710
     
    1774819717    psFree(object->uri);
    1774919718    psFree(object->recipe);
     19719    psFree(object->data_state);
    1775019720}
    1775119721
     
    1781819788        return false;
    1781919789    }
     19790    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")) {
     19791        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     19792        psFree(md);
     19793        return false;
     19794    }
    1782019795    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    1782119796        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1783619811}
    1783719812
    17838 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)
     19813bool 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)
    1783919814{
    1784019815    psMetadata *md = psMetadataAlloc();
     
    1790119876    if (!psMetadataAdd(md, PS_LIST_TAIL, "user_5", PS_DATA_F64, NULL, user_5)) {
    1790219877        psError(PS_ERR_UNKNOWN, false, "failed to add item user_5");
     19878        psFree(md);
     19879        return false;
     19880    }
     19881    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     19882        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    1790319883        psFree(md);
    1790419884        return false;
     
    1793219912bool detStackedImfileInsertObject(psDB *dbh, detStackedImfileRow *object)
    1793319913{
    17934     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);
     19914    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);
    1793519915}
    1793619916
     
    1807020050        return false;
    1807120051    }
     20052    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     20053        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     20054        psFree(md);
     20055        return false;
     20056    }
    1807220057    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    1807320058        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1814920134        return false;
    1815020135    }
     20136    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     20137    if (!status) {
     20138        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     20139        return false;
     20140    }
    1815120141    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    1815220142    if (!status) {
     
    1815520145    }
    1815620146
    18157     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);
     20147    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);
    1815820148}
    1815920149psArray *detStackedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1827320263static void detNormalizedStatImfileRowFree(detNormalizedStatImfileRow *object);
    1827420264
    18275 detNormalizedStatImfileRow *detNormalizedStatImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, psF32 norm, psS16 fault)
     20265detNormalizedStatImfileRow *detNormalizedStatImfileRowAlloc(psS64 det_id, psS32 iteration, const char *class_id, psF32 norm, const char *data_state, psS16 fault)
    1827620266{
    1827720267    detNormalizedStatImfileRow *_object;
     
    1828420274    _object->class_id = psStringCopy(class_id);
    1828520275    _object->norm = norm;
     20276    _object->data_state = psStringCopy(data_state);
    1828620277    _object->fault = fault;
    1828720278
     
    1829220283{
    1829320284    psFree(object->class_id);
     20285    psFree(object->data_state);
    1829420286}
    1829520287
     
    1831720309        return false;
    1831820310    }
     20311    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")) {
     20312        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     20313        psFree(md);
     20314        return false;
     20315    }
    1831920316    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    1832020317        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1833520332}
    1833620333
    18337 bool detNormalizedStatImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, psF32 norm, psS16 fault)
     20334bool detNormalizedStatImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *class_id, psF32 norm, const char *data_state, psS16 fault)
    1833820335{
    1833920336    psMetadata *md = psMetadataAlloc();
     
    1835520352    if (!psMetadataAdd(md, PS_LIST_TAIL, "norm", PS_DATA_F32, NULL, norm)) {
    1835620353        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
     20354        psFree(md);
     20355        return false;
     20356    }
     20357    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     20358        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    1835720359        psFree(md);
    1835820360        return false;
     
    1838620388bool detNormalizedStatImfileInsertObject(psDB *dbh, detNormalizedStatImfileRow *object)
    1838720389{
    18388     return detNormalizedStatImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->norm, object->fault);
     20390    return detNormalizedStatImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->norm, object->data_state, object->fault);
    1838920391}
    1839020392
     
    1847920481        return false;
    1848020482    }
     20483    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     20484        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     20485        psFree(md);
     20486        return false;
     20487    }
    1848120488    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    1848220489        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1851320520        return false;
    1851420521    }
     20522    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     20523    if (!status) {
     20524        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     20525        return false;
     20526    }
    1851520527    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    1851620528    if (!status) {
     
    1851920531    }
    1852020532
    18521     return detNormalizedStatImfileRowAlloc(det_id, iteration, class_id, norm, fault);
     20533    return detNormalizedStatImfileRowAlloc(det_id, iteration, class_id, norm, data_state, fault);
    1852220534}
    1852320535psArray *detNormalizedStatImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1863720649static void detNormalizedImfileRowFree(detNormalizedImfileRow *object);
    1863820650
    18639 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)
     20651detNormalizedImfileRow *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)
    1864020652{
    1864120653    detNormalizedImfileRow *_object;
     
    1865720669    _object->user_5 = user_5;
    1865820670    _object->path_base = psStringCopy(path_base);
     20671    _object->data_state = psStringCopy(data_state);
    1865920672    _object->fault = fault;
    1866020673
     
    1866720680    psFree(object->uri);
    1866820681    psFree(object->path_base);
     20682    psFree(object->data_state);
    1866920683}
    1867020684
     
    1873720751        return false;
    1873820752    }
     20753    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")) {
     20754        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     20755        psFree(md);
     20756        return false;
     20757    }
    1873920758    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    1874020759        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1875520774}
    1875620775
    18757 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)
     20776bool 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)
    1875820777{
    1875920778    psMetadata *md = psMetadataAlloc();
     
    1882020839    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
    1882120840        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     20841        psFree(md);
     20842        return false;
     20843    }
     20844    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     20845        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    1882220846        psFree(md);
    1882320847        return false;
     
    1885120875bool detNormalizedImfileInsertObject(psDB *dbh, detNormalizedImfileRow *object)
    1885220876{
    18853     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);
     20877    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);
    1885420878}
    1885520879
     
    1898921013        return false;
    1899021014    }
     21015    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     21016        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     21017        psFree(md);
     21018        return false;
     21019    }
    1899121020    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    1899221021        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1906821097        return false;
    1906921098    }
     21099    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     21100    if (!status) {
     21101        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     21102        return false;
     21103    }
    1907021104    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    1907121105    if (!status) {
     
    1907421108    }
    1907521109
    19076     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);
     21110    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);
    1907721111}
    1907821112psArray *detNormalizedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1919221226static void detNormalizedExpRowFree(detNormalizedExpRow *object);
    1919321227
    19194 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)
     21228detNormalizedExpRow *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)
    1919521229{
    1919621230    detNormalizedExpRow *_object;
     
    1921121245    _object->user_5 = user_5;
    1921221246    _object->path_base = psStringCopy(path_base);
     21247    _object->data_state = psStringCopy(data_state);
    1921321248    _object->fault = fault;
    1921421249
     
    1922021255    psFree(object->recipe);
    1922121256    psFree(object->path_base);
     21257    psFree(object->data_state);
    1922221258}
    1922321259
     
    1928521321        return false;
    1928621322    }
     21323    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")) {
     21324        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     21325        psFree(md);
     21326        return false;
     21327    }
    1928721328    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    1928821329        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1930321344}
    1930421345
    19305 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)
     21346bool 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)
    1930621347{
    1930721348    psMetadata *md = psMetadataAlloc();
     
    1936321404    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
    1936421405        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     21406        psFree(md);
     21407        return false;
     21408    }
     21409    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     21410        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    1936521411        psFree(md);
    1936621412        return false;
     
    1939421440bool detNormalizedExpInsertObject(psDB *dbh, detNormalizedExpRow *object)
    1939521441{
    19396     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);
     21442    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);
    1939721443}
    1939821444
     
    1952721573        return false;
    1952821574    }
     21575    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     21576        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     21577        psFree(md);
     21578        return false;
     21579    }
    1952921580    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    1953021581        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1960121652        return false;
    1960221653    }
     21654    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     21655    if (!status) {
     21656        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     21657        return false;
     21658    }
    1960321659    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    1960421660    if (!status) {
     
    1960721663    }
    1960821664
    19609     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);
     21665    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);
    1961021666}
    1961121667psArray *detNormalizedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1972521781static void detResidImfileRowFree(detResidImfileRow *object);
    1972621782
    19727 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)
     21783detResidImfileRow *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)
    1972821784{
    1972921785    detResidImfileRow *_object;
     
    1973421790    _object->det_id = det_id;
    1973521791    _object->iteration = iteration;
     21792    _object->ref_det_id = ref_det_id;
     21793    _object->ref_iter = ref_iter;
    1973621794    _object->exp_id = exp_id;
    1973721795    _object->class_id = psStringCopy(class_id);
     
    1975621814    _object->user_5 = user_5;
    1975721815    _object->path_base = psStringCopy(path_base);
     21816    _object->data_state = psStringCopy(data_state);
    1975821817    _object->fault = fault;
    1975921818
     
    1976721826    psFree(object->recipe);
    1976821827    psFree(object->path_base);
     21828    psFree(object->data_state);
    1976921829}
    1977021830
     
    1978221842        return false;
    1978321843    }
     21844    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)) {
     21845        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
     21846        psFree(md);
     21847        return false;
     21848    }
     21849    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)) {
     21850        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
     21851        psFree(md);
     21852        return false;
     21853    }
    1978421854    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(det_id, iteration) ref detNormalizedExp(det_id, iteration)", 64)) {
    1978521855        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     
    1989221962        return false;
    1989321963    }
     21964    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")) {
     21965        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     21966        psFree(md);
     21967        return false;
     21968    }
    1989421969    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    1989521970        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    1991021985}
    1991121986
    19912 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)
     21987bool 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)
    1991321988{
    1991421989    psMetadata *md = psMetadataAlloc();
     
    1992321998        return false;
    1992421999    }
     22000    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, NULL, ref_det_id)) {
     22001        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
     22002        psFree(md);
     22003        return false;
     22004    }
     22005    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, NULL, ref_iter)) {
     22006        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
     22007        psFree(md);
     22008        return false;
     22009    }
    1992522010    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
    1992622011        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     
    2003022115    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
    2003122116        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     22117        psFree(md);
     22118        return false;
     22119    }
     22120    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     22121        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    2003222122        psFree(md);
    2003322123        return false;
     
    2006122151bool detResidImfileInsertObject(psDB *dbh, detResidImfileRow *object)
    2006222152{
    20063     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);
     22153    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);
    2006422154}
    2006522155
     
    2014422234        return false;
    2014522235    }
     22236    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_det_id", PS_DATA_S64, NULL, object->ref_det_id)) {
     22237        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_det_id");
     22238        psFree(md);
     22239        return false;
     22240    }
     22241    if (!psMetadataAdd(md, PS_LIST_TAIL, "ref_iter", PS_DATA_S32, NULL, object->ref_iter)) {
     22242        psError(PS_ERR_UNKNOWN, false, "failed to add item ref_iter");
     22243        psFree(md);
     22244        return false;
     22245    }
    2014622246    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
    2014722247        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     
    2025422354        return false;
    2025522355    }
     22356    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     22357        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     22358        psFree(md);
     22359        return false;
     22360    }
    2025622361    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    2025722362        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    2027822383        return false;
    2027922384    }
     22385    psS64 ref_det_id = psMetadataLookupS64(&status, md, "ref_det_id");
     22386    if (!status) {
     22387        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item ref_det_id");
     22388        return false;
     22389    }
     22390    psS32 ref_iter = psMetadataLookupS32(&status, md, "ref_iter");
     22391    if (!status) {
     22392        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item ref_iter");
     22393        return false;
     22394    }
    2028022395    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
    2028122396    if (!status) {
     
    2038822503        return false;
    2038922504    }
     22505    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     22506    if (!status) {
     22507        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     22508        return false;
     22509    }
    2039022510    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    2039122511    if (!status) {
     
    2039422514    }
    2039522515
    20396     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);
     22516    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);
    2039722517}
    2039822518psArray *detResidImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    2051222632static void detResidExpRowFree(detResidExpRow *object);
    2051322633
    20514 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)
     22634detResidExpRow *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)
    2051522635{
    2051622636    detResidExpRow  *_object;
     
    2054122661    _object->user_5 = user_5;
    2054222662    _object->path_base = psStringCopy(path_base);
     22663    _object->data_state = psStringCopy(data_state);
    2054322664    _object->accept = accept;
    2054422665    _object->fault = fault;
     
    2055122672    psFree(object->recipe);
    2055222673    psFree(object->path_base);
     22674    psFree(object->data_state);
    2055322675}
    2055422676
     
    2066622788        return false;
    2066722789    }
     22790    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")) {
     22791        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     22792        psFree(md);
     22793        return false;
     22794    }
    2066822795    if (!psMetadataAdd(md, PS_LIST_TAIL, "accept", PS_DATA_BOOL, NULL, 0)) {
    2066922796        psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
     
    2068922816}
    2069022817
    20691 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)
     22818bool 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)
    2069222819{
    2069322820    psMetadata *md = psMetadataAlloc();
     
    2079922926    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
    2080022927        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     22928        psFree(md);
     22929        return false;
     22930    }
     22931    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     22932        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    2080122933        psFree(md);
    2080222934        return false;
     
    2083522967bool detResidExpInsertObject(psDB *dbh, detResidExpRow *object)
    2083622968{
    20837     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);
     22969    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);
    2083822970}
    2083922971
     
    2101823150        return false;
    2101923151    }
     23152    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     23153        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     23154        psFree(md);
     23155        return false;
     23156    }
    2102023157    if (!psMetadataAdd(md, PS_LIST_TAIL, "accept", PS_DATA_BOOL, NULL, object->accept)) {
    2102123158        psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
     
    2114723284        return false;
    2114823285    }
     23286    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     23287    if (!status) {
     23288        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     23289        return false;
     23290    }
    2114923291    bool accept = psMetadataLookupBool(&status, md, "accept");
    2115023292    if (!status) {
     
    2115823300    }
    2115923301
    21160     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);
     23302    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);
    2116123303}
    2116223304psArray *detResidExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    2127623418static void detRunSummaryRowFree(detRunSummaryRow *object);
    2127723419
    21278 detRunSummaryRow *detRunSummaryRowAlloc(psS64 det_id, psS32 iteration, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, bool accept, psS16 fault)
     23420detRunSummaryRow *detRunSummaryRowAlloc(psS64 det_id, psS32 iteration, const char *data_state, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, bool accept, psS16 fault)
    2127923421{
    2128023422    detRunSummaryRow *_object;
     
    2128523427    _object->det_id = det_id;
    2128623428    _object->iteration = iteration;
     23429    _object->data_state = psStringCopy(data_state);
    2128723430    _object->bg = bg;
    2128823431    _object->bg_stdev = bg_stdev;
     
    2129623439static void detRunSummaryRowFree(detRunSummaryRow *object)
    2129723440{
     23441    psFree(object->data_state);
    2129823442}
    2129923443
     
    2131123455        return false;
    2131223456    }
     23457    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, "full, goto_cleaned, cleaned, goto_full, goto_purged, purged", "64")) {
     23458        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     23459        psFree(md);
     23460        return false;
     23461    }
    2131323462    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) {
    2131423463        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     
    2134923498}
    2135023499
    21351 bool detRunSummaryInsert(psDB * dbh, psS64 det_id, psS32 iteration, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, bool accept, psS16 fault)
     23500bool 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)
    2135223501{
    2135323502    psMetadata *md = psMetadataAlloc();
     
    2135923508    if (!psMetadataAdd(md, PS_LIST_TAIL, "iteration", PS_DATA_S32, NULL, iteration)) {
    2136023509        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
     23510        psFree(md);
     23511        return false;
     23512    }
     23513    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     23514        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    2136123515        psFree(md);
    2136223516        return false;
     
    2141023564bool detRunSummaryInsertObject(psDB *dbh, detRunSummaryRow *object)
    2141123565{
    21412     return detRunSummaryInsert(dbh, object->det_id, object->iteration, object->bg, object->bg_stdev, object->bg_mean_stdev, object->accept, object->fault);
     23566    return detRunSummaryInsert(dbh, object->det_id, object->iteration, object->data_state, object->bg, object->bg_stdev, object->bg_mean_stdev, object->accept, object->fault);
    2141323567}
    2141423568
     
    2149323647        return false;
    2149423648    }
     23649    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     23650        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     23651        psFree(md);
     23652        return false;
     23653    }
    2149523654    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) {
    2149623655        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     
    2153723696        return false;
    2153823697    }
     23698    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     23699    if (!status) {
     23700        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     23701        return false;
     23702    }
    2153923703    psF64 bg = psMetadataLookupF64(&status, md, "bg");
    2154023704    if (!status) {
     
    2156323727    }
    2156423728
    21565     return detRunSummaryRowAlloc(det_id, iteration, bg, bg_stdev, bg_mean_stdev, accept, fault);
     23729    return detRunSummaryRowAlloc(det_id, iteration, data_state, bg, bg_stdev, bg_mean_stdev, accept, fault);
    2156623730}
    2156723731psArray *detRunSummarySelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    2168123845static void detRegisteredImfileRowFree(detRegisteredImfileRow *object);
    2168223846
    21683 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)
     23847detRegisteredImfileRow *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)
    2168423848{
    2168523849    detRegisteredImfileRow *_object;
     
    2170123865    _object->user_5 = user_5;
    2170223866    _object->path_base = psStringCopy(path_base);
     23867    _object->data_state = psStringCopy(data_state);
    2170323868    _object->fault = fault;
    2170423869
     
    2171123876    psFree(object->uri);
    2171223877    psFree(object->path_base);
     23878    psFree(object->data_state);
    2171323879}
    2171423880
     
    2178123947        return false;
    2178223948    }
     23949    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")) {
     23950        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     23951        psFree(md);
     23952        return false;
     23953    }
    2178323954    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    2178423955        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    2179923970}
    2180023971
    21801 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)
     23972bool 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)
    2180223973{
    2180323974    psMetadata *md = psMetadataAlloc();
     
    2186424035    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
    2186524036        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     24037        psFree(md);
     24038        return false;
     24039    }
     24040    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, data_state)) {
     24041        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
    2186624042        psFree(md);
    2186724043        return false;
     
    2189524071bool detRegisteredImfileInsertObject(psDB *dbh, detRegisteredImfileRow *object)
    2189624072{
    21897     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);
     24073    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);
    2189824074}
    2189924075
     
    2203324209        return false;
    2203424210    }
     24211    if (!psMetadataAdd(md, PS_LIST_TAIL, "data_state", PS_DATA_STRING, NULL, object->data_state)) {
     24212        psError(PS_ERR_UNKNOWN, false, "failed to add item data_state");
     24213        psFree(md);
     24214        return false;
     24215    }
    2203524216    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    2203624217        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    2211224293        return false;
    2211324294    }
     24295    char* data_state = psMetadataLookupPtr(&status, md, "data_state");
     24296    if (!status) {
     24297        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item data_state");
     24298        return false;
     24299    }
    2211424300    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    2211524301    if (!status) {
     
    2211824304    }
    2211924305
    22120     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);
     24306    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);
    2212124307}
    2212224308psArray *detRegisteredImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    2550627692static void flatcorrRunRowFree(flatcorrRunRow *object);
    2550727693
    25508 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)
     27694flatcorrRunRow *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)
    2550927695{
    2551027696    flatcorrRunRow  *_object;
     
    2551927705    _object->workdir = psStringCopy(workdir);
    2552027706    _object->label = psStringCopy(label);
    25521     _object->stats = psStringCopy(stats);
     27707    _object->reduction = psStringCopy(reduction);
    2552227708    _object->region = psStringCopy(region);
     27709    _object->hostname = psStringCopy(hostname);
     27710    _object->fault = fault;
    2552327711
    2552427712    return _object;
     
    2553227720    psFree(object->workdir);
    2553327721    psFree(object->label);
    25534     psFree(object->stats);
     27722    psFree(object->reduction);
    2553527723    psFree(object->region);
     27724    psFree(object->hostname);
    2553627725}
    2553727726
     
    2556927758        return false;
    2557027759    }
    25571     if (!psMetadataAdd(md, PS_LIST_TAIL, "stats", PS_DATA_STRING, NULL, "255")) {
    25572         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
    25573         psFree(md);
    25574         return false;
    25575     }
    25576     if (!psMetadataAdd(md, PS_LIST_TAIL, "region", PS_DATA_STRING, NULL, "255")) {
     27760    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, "64")) {
     27761        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
     27762        psFree(md);
     27763        return false;
     27764    }
     27765    if (!psMetadataAdd(md, PS_LIST_TAIL, "region", PS_DATA_STRING, NULL, "64")) {
    2557727766        psError(PS_ERR_UNKNOWN, false, "failed to add item region");
    2557827767        psFree(md);
    2557927768        return false;
    2558027769    }
     27770    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, "64")) {
     27771        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     27772        psFree(md);
     27773        return false;
     27774    }
     27775    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
     27776        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     27777        psFree(md);
     27778        return false;
     27779    }
    2558127780
    2558227781    bool status = psDBCreateTable(dbh, FLATCORRRUN_TABLE_NAME, md);
     
    2559227791}
    2559327792
    25594 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)
     27793bool 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)
    2559527794{
    2559627795    psMetadata *md = psMetadataAlloc();
     
    2562527824        return false;
    2562627825    }
    25627     if (!psMetadataAdd(md, PS_LIST_TAIL, "stats", PS_DATA_STRING, NULL, stats)) {
    25628         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
     27826    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
     27827        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    2562927828        psFree(md);
    2563027829        return false;
     
    2563227831    if (!psMetadataAdd(md, PS_LIST_TAIL, "region", PS_DATA_STRING, NULL, region)) {
    2563327832        psError(PS_ERR_UNKNOWN, false, "failed to add item region");
     27833        psFree(md);
     27834        return false;
     27835    }
     27836    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, hostname)) {
     27837        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     27838        psFree(md);
     27839        return false;
     27840    }
     27841    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) {
     27842        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
    2563427843        psFree(md);
    2563527844        return false;
     
    2565827867bool flatcorrRunInsertObject(psDB *dbh, flatcorrRunRow *object)
    2565927868{
    25660     return flatcorrRunInsert(dbh, object->corr_id, object->dvodb, object->filter, object->state, object->workdir, object->label, object->stats, object->region);
     27869    return flatcorrRunInsert(dbh, object->corr_id, object->dvodb, object->filter, object->state, object->workdir, object->label, object->reduction, object->region, object->hostname, object->fault);
    2566127870}
    2566227871
     
    2576127970        return false;
    2576227971    }
    25763     if (!psMetadataAdd(md, PS_LIST_TAIL, "stats", PS_DATA_STRING, NULL, object->stats)) {
    25764         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
     27972    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
     27973        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    2576527974        psFree(md);
    2576627975        return false;
     
    2577127980        return false;
    2577227981    }
     27982    if (!psMetadataAdd(md, PS_LIST_TAIL, "hostname", PS_DATA_STRING, NULL, object->hostname)) {
     27983        psError(PS_ERR_UNKNOWN, false, "failed to add item hostname");
     27984        psFree(md);
     27985        return false;
     27986    }
     27987    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
     27988        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     27989        psFree(md);
     27990        return false;
     27991    }
    2577327992
    2577427993
     
    2581028029        return false;
    2581128030    }
    25812     char* stats = psMetadataLookupPtr(&status, md, "stats");
    25813     if (!status) {
    25814         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item stats");
     28031    char* reduction = psMetadataLookupPtr(&status, md, "reduction");
     28032    if (!status) {
     28033        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
    2581528034        return false;
    2581628035    }
     
    2582028039        return false;
    2582128040    }
    25822 
    25823     return flatcorrRunRowAlloc(corr_id, dvodb, filter, state, workdir, label, stats, region);
     28041    char* hostname = psMetadataLookupPtr(&status, md, "hostname");
     28042    if (!status) {
     28043        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item hostname");
     28044        return false;
     28045    }
     28046    psS16 fault = psMetadataLookupS16(&status, md, "fault");
     28047    if (!status) {
     28048        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault");
     28049        return false;
     28050    }
     28051
     28052    return flatcorrRunRowAlloc(corr_id, dvodb, filter, state, workdir, label, reduction, region, hostname, fault);
    2582428053}
    2582528054psArray *flatcorrRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    2593728166    return true;
    2593828167}
    25939 static void flatcorrExpRowFree(flatcorrExpRow *object);
    25940 
    25941 flatcorrExpRow *flatcorrExpRowAlloc(psS64 corr_id, psS64 chip_id)
    25942 {
    25943     flatcorrExpRow *_object;
    25944 
    25945     _object = psAlloc(sizeof(flatcorrExpRow));
    25946     psMemSetDeallocator(_object, (psFreeFunc)flatcorrExpRowFree);
     28168static void flatcorrChipLinkRowFree(flatcorrChipLinkRow *object);
     28169
     28170flatcorrChipLinkRow *flatcorrChipLinkRowAlloc(psS64 corr_id, psS64 chip_id)
     28171{
     28172    flatcorrChipLinkRow *_object;
     28173
     28174    _object = psAlloc(sizeof(flatcorrChipLinkRow));
     28175    psMemSetDeallocator(_object, (psFreeFunc)flatcorrChipLinkRowFree);
    2594728176
    2594828177    _object->corr_id = corr_id;
     
    2595228181}
    2595328182
    25954 static void flatcorrExpRowFree(flatcorrExpRow *object)
    25955 {
    25956 }
    25957 
    25958 bool flatcorrExpCreateTable(psDB *dbh)
     28183static void flatcorrChipLinkRowFree(flatcorrChipLinkRow *object)
     28184{
     28185}
     28186
     28187bool flatcorrChipLinkCreateTable(psDB *dbh)
    2595928188{
    2596028189    psMetadata *md = psMetadataAlloc();
     
    2596428193        return false;
    2596528194    }
    25966     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 64)) {
     28195    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 0)) {
    2596728196        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    2596828197        psFree(md);
     
    2597028199    }
    2597128200
    25972     bool status = psDBCreateTable(dbh, FLATCORREXP_TABLE_NAME, md);
     28201    bool status = psDBCreateTable(dbh, FLATCORRCHIPLINK_TABLE_NAME, md);
    2597328202
    2597428203    psFree(md);
     
    2597728206}
    2597828207
    25979 bool flatcorrExpDropTable(psDB *dbh)
    25980 {
    25981     return psDBDropTable(dbh, FLATCORREXP_TABLE_NAME);
    25982 }
    25983 
    25984 bool flatcorrExpInsert(psDB * dbh, psS64 corr_id, psS64 chip_id)
     28208bool flatcorrChipLinkDropTable(psDB *dbh)
     28209{
     28210    return psDBDropTable(dbh, FLATCORRCHIPLINK_TABLE_NAME);
     28211}
     28212
     28213bool flatcorrChipLinkInsert(psDB * dbh, psS64 corr_id, psS64 chip_id)
    2598528214{
    2598628215    psMetadata *md = psMetadataAlloc();
     
    2599628225    }
    2599728226
    25998     bool status = psDBInsertOneRow(dbh, FLATCORREXP_TABLE_NAME, md);
     28227    bool status = psDBInsertOneRow(dbh, FLATCORRCHIPLINK_TABLE_NAME, md);
    2599928228    psFree(md);
    2600028229
     
    2600228231}
    2600328232
    26004 long long flatcorrExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     28233long long flatcorrChipLinkDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    2600528234{
    2600628235    long long       deleted = 0;
    2600728236
    26008     long long count = psDBDeleteRows(dbh, FLATCORREXP_TABLE_NAME, where, limit);
     28237    long long count = psDBDeleteRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, limit);
    2600928238    if (count < 0) {
    26010         psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrExp");
     28239        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrChipLink");
    2601128240        return count;
    2601228241
     
    2601628245    return deleted;
    2601728246}
    26018 bool flatcorrExpInsertObject(psDB *dbh, flatcorrExpRow *object)
    26019 {
    26020     return flatcorrExpInsert(dbh, object->corr_id, object->chip_id);
    26021 }
    26022 
    26023 bool flatcorrExpInsertObjects(psDB *dbh, psArray *objects)
     28247bool flatcorrChipLinkInsertObject(psDB *dbh, flatcorrChipLinkRow *object)
     28248{
     28249    return flatcorrChipLinkInsert(dbh, object->corr_id, object->chip_id);
     28250}
     28251
     28252bool flatcorrChipLinkInsertObjects(psDB *dbh, psArray *objects)
    2602428253{
    2602528254    for (long i = 0; i < psArrayLength(objects); i++) {
    26026         if (!flatcorrExpInsertObject(dbh, objects->data[i])) {
     28255        if (!flatcorrChipLinkInsertObject(dbh, objects->data[i])) {
    2602728256            return false;
    2602828257        }
     
    2603228261}
    2603328262
    26034 bool flatcorrExpInsertFits(psDB *dbh, const psFits *fits)
     28263bool flatcorrChipLinkInsertFits(psDB *dbh, const psFits *fits)
    2603528264{
    2603628265    psArray         *rowSet;
    2603728266
    26038     // move to (the first?) extension named  FLATCORREXP_TABLE_NAME
    26039     if (!psFitsMoveExtName(fits, FLATCORREXP_TABLE_NAME)) {
    26040         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", FLATCORREXP_TABLE_NAME);
     28267    // move to (the first?) extension named  FLATCORRCHIPLINK_TABLE_NAME
     28268    if (!psFitsMoveExtName(fits, FLATCORRCHIPLINK_TABLE_NAME)) {
     28269        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", FLATCORRCHIPLINK_TABLE_NAME);
    2604128270        return false;
    2604228271    }
     
    2605628285    }
    2605728286
    26058     if (!psDBInsertRows(dbh, FLATCORREXP_TABLE_NAME, rowSet)) {
     28287    if (!psDBInsertRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, rowSet)) {
    2605928288        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    2606028289        psFree(rowSet);
     
    2606728296}
    2606828297
    26069 bool flatcorrExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     28298bool flatcorrChipLinkSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    2607028299{
    2607128300    psArray         *rowSet;
    2607228301
    26073     rowSet = psDBSelectRows(dbh, FLATCORREXP_TABLE_NAME, where, limit);
     28302    rowSet = psDBSelectRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, limit);
    2607428303    if (!rowSet) {
    2607528304        return false;
     
    2607728306
    2607828307    // output to fits
    26079     if (!psFitsWriteTable(fits, NULL, rowSet, FLATCORREXP_TABLE_NAME)) {
     28308    if (!psFitsWriteTable(fits, NULL, rowSet, FLATCORRCHIPLINK_TABLE_NAME)) {
    2608028309        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    2608128310        psFree(rowSet);
     
    2608828317}
    2608928318
    26090 psMetadata *flatcorrExpMetadataFromObject(const flatcorrExpRow *object)
     28319psMetadata *flatcorrChipLinkMetadataFromObject(const flatcorrChipLinkRow *object)
    2609128320{
    2609228321    psMetadata *md = psMetadataAlloc();
     
    2610628335}
    2610728336
    26108 flatcorrExpRow *flatcorrExpObjectFromMetadata(psMetadata *md)
     28337flatcorrChipLinkRow *flatcorrChipLinkObjectFromMetadata(psMetadata *md)
    2610928338{
    2611028339
     
    2612128350    }
    2612228351
    26123     return flatcorrExpRowAlloc(corr_id, chip_id);
    26124 }
    26125 psArray *flatcorrExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     28352    return flatcorrChipLinkRowAlloc(corr_id, chip_id);
     28353}
     28354psArray *flatcorrChipLinkSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    2612628355{
    2612728356    psArray         *rowSet;
     
    2612928358    psU64           i;
    2613028359
    26131     rowSet = psDBSelectRows(dbh, FLATCORREXP_TABLE_NAME, where, limit);
     28360    rowSet = psDBSelectRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, limit);
    2613228361    if (!rowSet) {
    2613328362        return NULL;
     
    2613928368
    2614028369    for (i = 0; i < rowSet->n; i++) {
    26141         flatcorrExpRow *object = flatcorrExpObjectFromMetadata(rowSet->data[i]);
     28370        flatcorrChipLinkRow *object = flatcorrChipLinkObjectFromMetadata(rowSet->data[i]);
    2614228371        if (!object) {
    2614328372            psFree(object);
     
    2615428383    return returnSet;
    2615528384}
    26156 bool flatcorrExpDeleteObject(psDB *dbh, const flatcorrExpRow *object)
    26157 {
    26158     psMetadata *where = flatcorrExpMetadataFromObject(object);
    26159     long long count = psDBDeleteRows(dbh, FLATCORREXP_TABLE_NAME, where, 0);
     28385bool flatcorrChipLinkDeleteObject(psDB *dbh, const flatcorrChipLinkRow *object)
     28386{
     28387    psMetadata *where = flatcorrChipLinkMetadataFromObject(object);
     28388    long long count = psDBDeleteRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, 0);
    2616028389    psFree(where);
    2616128390    if (count < 0) {
    26162         psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrExp");
     28391        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrChipLink");
    2616328392        return false;
    2616428393    }
     
    2616628395        // XXX should this be a psAbort() instead?  It is possible that
    2616728396        // having an object match multiple rows was by design.
    26168         psError(PS_ERR_UNKNOWN, true, "flatcorrExpRow object matched more then one row.  Check your database schema");
    26169         return false;
    26170     }
    26171 
    26172     return true;
    26173 }
    26174 long long flatcorrExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     28397        psError(PS_ERR_UNKNOWN, true, "flatcorrChipLinkRow object matched more then one row.  Check your database schema");
     28398        return false;
     28399    }
     28400
     28401    return true;
     28402}
     28403long long flatcorrChipLinkDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    2617528404{
    2617628405    long long       deleted = 0;
    2617728406
    2617828407    for (long long i = 0; i < objects->n; i++) {
    26179         flatcorrExpRow *object = objects->data[i];
    26180         psMetadata *where = flatcorrExpMetadataFromObject(object);
    26181         long long count = psDBDeleteRows(dbh, FLATCORREXP_TABLE_NAME, where, limit);
     28408        flatcorrChipLinkRow *object = objects->data[i];
     28409        psMetadata *where = flatcorrChipLinkMetadataFromObject(object);
     28410        long long count = psDBDeleteRows(dbh, FLATCORRCHIPLINK_TABLE_NAME, where, limit);
    2618228411        psFree(where);
    2618328412        if (count < 0) {
    26184             psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrExp");
     28413            psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrChipLink");
    2618528414            return count;
    2618628415        }
     
    2619128420    return deleted;
    2619228421}
    26193 bool flatcorrExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     28422bool flatcorrChipLinkPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    2619428423{
    2619528424    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    2619728426    psMetadata *output = psMetadataAlloc();
    2619828427    for (long i = 0; i < psArrayLength(objects); i++) {
    26199         psMetadata *md = flatcorrExpMetadataFromObject(objects->data[i]);
     28428        psMetadata *md = flatcorrChipLinkMetadataFromObject(objects->data[i]);
    2620028429        if (!psMetadataAddMetadata(
    2620128430            output,
    2620228431            PS_LIST_TAIL,
    26203             FLATCORREXP_TABLE_NAME,
     28432            FLATCORRCHIPLINK_TABLE_NAME,
    2620428433            PS_META_DUPLICATE_OK,
    2620528434            NULL,
     
    2622228451    return true;
    2622328452}
    26224 bool flatcorrExpPrintObject(FILE *stream, flatcorrExpRow *object, bool mdcf)
     28453bool flatcorrChipLinkPrintObject(FILE *stream, flatcorrChipLinkRow *object, bool mdcf)
    2622528454{
    2622628455    PS_ASSERT_PTR_NON_NULL(object, false);
    2622728456
    26228     psMetadata *md = flatcorrExpMetadataFromObject(object);
     28457    psMetadata *md = flatcorrChipLinkMetadataFromObject(object);
     28458
     28459    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     28460        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     28461        psFree(md);
     28462    }
     28463
     28464    psFree(md);
     28465
     28466    return true;
     28467}
     28468static void flatcorrCamLinkRowFree(flatcorrCamLinkRow *object);
     28469
     28470flatcorrCamLinkRow *flatcorrCamLinkRowAlloc(psS64 corr_id, psS64 chip_id, psS64 cam_id)
     28471{
     28472    flatcorrCamLinkRow *_object;
     28473
     28474    _object = psAlloc(sizeof(flatcorrCamLinkRow));
     28475    psMemSetDeallocator(_object, (psFreeFunc)flatcorrCamLinkRowFree);
     28476
     28477    _object->corr_id = corr_id;
     28478    _object->chip_id = chip_id;
     28479    _object->cam_id = cam_id;
     28480
     28481    return _object;
     28482}
     28483
     28484static void flatcorrCamLinkRowFree(flatcorrCamLinkRow *object)
     28485{
     28486}
     28487
     28488bool flatcorrCamLinkCreateTable(psDB *dbh)
     28489{
     28490    psMetadata *md = psMetadataAlloc();
     28491    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, "Primary Key fkey(corr_id) ref flatcorrRun(corr_id)", 0)) {
     28492        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
     28493        psFree(md);
     28494        return false;
     28495    }
     28496    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 0)) {
     28497        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     28498        psFree(md);
     28499        return false;
     28500    }
     28501    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 0)) {
     28502        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
     28503        psFree(md);
     28504        return false;
     28505    }
     28506
     28507    bool status = psDBCreateTable(dbh, FLATCORRCAMLINK_TABLE_NAME, md);
     28508
     28509    psFree(md);
     28510
     28511    return status;
     28512}
     28513
     28514bool flatcorrCamLinkDropTable(psDB *dbh)
     28515{
     28516    return psDBDropTable(dbh, FLATCORRCAMLINK_TABLE_NAME);
     28517}
     28518
     28519bool flatcorrCamLinkInsert(psDB * dbh, psS64 corr_id, psS64 chip_id, psS64 cam_id)
     28520{
     28521    psMetadata *md = psMetadataAlloc();
     28522    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, corr_id)) {
     28523        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
     28524        psFree(md);
     28525        return false;
     28526    }
     28527    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) {
     28528        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     28529        psFree(md);
     28530        return false;
     28531    }
     28532    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, NULL, cam_id)) {
     28533        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
     28534        psFree(md);
     28535        return false;
     28536    }
     28537
     28538    bool status = psDBInsertOneRow(dbh, FLATCORRCAMLINK_TABLE_NAME, md);
     28539    psFree(md);
     28540
     28541    return status;
     28542}
     28543
     28544long long flatcorrCamLinkDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     28545{
     28546    long long       deleted = 0;
     28547
     28548    long long count = psDBDeleteRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, limit);
     28549    if (count < 0) {
     28550        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrCamLink");
     28551        return count;
     28552
     28553        deleted += count;
     28554    }
     28555
     28556    return deleted;
     28557}
     28558bool flatcorrCamLinkInsertObject(psDB *dbh, flatcorrCamLinkRow *object)
     28559{
     28560    return flatcorrCamLinkInsert(dbh, object->corr_id, object->chip_id, object->cam_id);
     28561}
     28562
     28563bool flatcorrCamLinkInsertObjects(psDB *dbh, psArray *objects)
     28564{
     28565    for (long i = 0; i < psArrayLength(objects); i++) {
     28566        if (!flatcorrCamLinkInsertObject(dbh, objects->data[i])) {
     28567            return false;
     28568        }
     28569    }
     28570
     28571    return true;
     28572}
     28573
     28574bool flatcorrCamLinkInsertFits(psDB *dbh, const psFits *fits)
     28575{
     28576    psArray         *rowSet;
     28577
     28578    // move to (the first?) extension named  FLATCORRCAMLINK_TABLE_NAME
     28579    if (!psFitsMoveExtName(fits, FLATCORRCAMLINK_TABLE_NAME)) {
     28580        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", FLATCORRCAMLINK_TABLE_NAME);
     28581        return false;
     28582    }
     28583
     28584    // check HDU type
     28585    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     28586        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     28587        return false;
     28588    }
     28589
     28590    // read fits table
     28591    rowSet = psFitsReadTable(fits);
     28592    if (!rowSet) {
     28593        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     28594        psFree(rowSet);
     28595        return false;
     28596    }
     28597
     28598    if (!psDBInsertRows(dbh, FLATCORRCAMLINK_TABLE_NAME, rowSet)) {
     28599        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     28600        psFree(rowSet);
     28601        return false;
     28602    }
     28603
     28604    psFree(rowSet);
     28605
     28606    return true;
     28607}
     28608
     28609bool flatcorrCamLinkSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     28610{
     28611    psArray         *rowSet;
     28612
     28613    rowSet = psDBSelectRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, limit);
     28614    if (!rowSet) {
     28615        return false;
     28616    }
     28617
     28618    // output to fits
     28619    if (!psFitsWriteTable(fits, NULL, rowSet, FLATCORRCAMLINK_TABLE_NAME)) {
     28620        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     28621        psFree(rowSet);
     28622        return false;
     28623    }
     28624
     28625    psFree(rowSet);
     28626
     28627    return true;
     28628}
     28629
     28630psMetadata *flatcorrCamLinkMetadataFromObject(const flatcorrCamLinkRow *object)
     28631{
     28632    psMetadata *md = psMetadataAlloc();
     28633    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, object->corr_id)) {
     28634        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
     28635        psFree(md);
     28636        return false;
     28637    }
     28638    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, object->chip_id)) {
     28639        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     28640        psFree(md);
     28641        return false;
     28642    }
     28643    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, NULL, object->cam_id)) {
     28644        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
     28645        psFree(md);
     28646        return false;
     28647    }
     28648
     28649
     28650    return md;
     28651}
     28652
     28653flatcorrCamLinkRow *flatcorrCamLinkObjectFromMetadata(psMetadata *md)
     28654{
     28655
     28656bool status = false;
     28657    psS64 corr_id = psMetadataLookupS64(&status, md, "corr_id");
     28658    if (!status) {
     28659        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item corr_id");
     28660        return false;
     28661    }
     28662    psS64 chip_id = psMetadataLookupS64(&status, md, "chip_id");
     28663    if (!status) {
     28664        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item chip_id");
     28665        return false;
     28666    }
     28667    psS64 cam_id = psMetadataLookupS64(&status, md, "cam_id");
     28668    if (!status) {
     28669        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item cam_id");
     28670        return false;
     28671    }
     28672
     28673    return flatcorrCamLinkRowAlloc(corr_id, chip_id, cam_id);
     28674}
     28675psArray *flatcorrCamLinkSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     28676{
     28677    psArray         *rowSet;
     28678    psArray         *returnSet;
     28679    psU64           i;
     28680
     28681    rowSet = psDBSelectRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, limit);
     28682    if (!rowSet) {
     28683        return NULL;
     28684    }
     28685
     28686    // convert psMetadata rows to row objects
     28687
     28688    returnSet = psArrayAllocEmpty(rowSet->n);
     28689
     28690    for (i = 0; i < rowSet->n; i++) {
     28691        flatcorrCamLinkRow *object = flatcorrCamLinkObjectFromMetadata(rowSet->data[i]);
     28692        if (!object) {
     28693            psFree(object);
     28694            psFree(returnSet);
     28695            psError(PS_ERR_UNKNOWN, false, "database error");
     28696            return NULL;
     28697        }
     28698        psArrayAdd(returnSet, 0, object);
     28699        psFree(object);
     28700    }
     28701
     28702    psFree(rowSet);
     28703
     28704    return returnSet;
     28705}
     28706bool flatcorrCamLinkDeleteObject(psDB *dbh, const flatcorrCamLinkRow *object)
     28707{
     28708    psMetadata *where = flatcorrCamLinkMetadataFromObject(object);
     28709    long long count = psDBDeleteRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, 0);
     28710    psFree(where);
     28711    if (count < 0) {
     28712        psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrCamLink");
     28713        return false;
     28714    }
     28715    if (count > 1) {
     28716        // XXX should this be a psAbort() instead?  It is possible that
     28717        // having an object match multiple rows was by design.
     28718        psError(PS_ERR_UNKNOWN, true, "flatcorrCamLinkRow object matched more then one row.  Check your database schema");
     28719        return false;
     28720    }
     28721
     28722    return true;
     28723}
     28724long long flatcorrCamLinkDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     28725{
     28726    long long       deleted = 0;
     28727
     28728    for (long long i = 0; i < objects->n; i++) {
     28729        flatcorrCamLinkRow *object = objects->data[i];
     28730        psMetadata *where = flatcorrCamLinkMetadataFromObject(object);
     28731        long long count = psDBDeleteRows(dbh, FLATCORRCAMLINK_TABLE_NAME, where, limit);
     28732        psFree(where);
     28733        if (count < 0) {
     28734            psError(PS_ERR_UNKNOWN, true, "failed to delete row from flatcorrCamLink");
     28735            return count;
     28736        }
     28737
     28738        deleted += count;
     28739    }
     28740
     28741    return deleted;
     28742}
     28743bool flatcorrCamLinkPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     28744{
     28745    PS_ASSERT_PTR_NON_NULL(objects, false);
     28746
     28747    psMetadata *output = psMetadataAlloc();
     28748    for (long i = 0; i < psArrayLength(objects); i++) {
     28749        psMetadata *md = flatcorrCamLinkMetadataFromObject(objects->data[i]);
     28750        if (!psMetadataAddMetadata(
     28751            output,
     28752            PS_LIST_TAIL,
     28753            FLATCORRCAMLINK_TABLE_NAME,
     28754            PS_META_DUPLICATE_OK,
     28755            NULL,
     28756            md
     28757        )) {
     28758            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     28759            psFree(md);
     28760            psFree(output);
     28761            return false;
     28762        }
     28763        psFree(md);
     28764    }
     28765
     28766    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     28767        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     28768        psFree(output);
     28769    }
     28770    psFree(output);
     28771
     28772    return true;
     28773}
     28774bool flatcorrCamLinkPrintObject(FILE *stream, flatcorrCamLinkRow *object, bool mdcf)
     28775{
     28776    PS_ASSERT_PTR_NON_NULL(object, false);
     28777
     28778    psMetadata *md = flatcorrCamLinkMetadataFromObject(object);
    2622928779
    2623028780    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     
    2660429154    return true;
    2660529155}
     29156static void pstampProjectRowFree(pstampProjectRow *object);
     29157
     29158pstampProjectRow *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)
     29159{
     29160    pstampProjectRow *_object;
     29161
     29162    _object = psAlloc(sizeof(pstampProjectRow));
     29163    psMemSetDeallocator(_object, (psFreeFunc)pstampProjectRowFree);
     29164
     29165    _object->proj_id = proj_id;
     29166    _object->name = psStringCopy(name);
     29167    _object->state = psStringCopy(state);
     29168    _object->dbname = psStringCopy(dbname);
     29169    _object->dvodb = psStringCopy(dvodb);
     29170    _object->camera = psStringCopy(camera);
     29171    _object->telescope = psStringCopy(telescope);
     29172    _object->need_magic = need_magic;
     29173
     29174    return _object;
     29175}
     29176
     29177static void pstampProjectRowFree(pstampProjectRow *object)
     29178{
     29179    psFree(object->name);
     29180    psFree(object->state);
     29181    psFree(object->dbname);
     29182    psFree(object->dvodb);
     29183    psFree(object->camera);
     29184    psFree(object->telescope);
     29185}
     29186
     29187bool pstampProjectCreateTable(psDB *dbh)
     29188{
     29189    psMetadata *md = psMetadataAlloc();
     29190    if (!psMetadataAdd(md, PS_LIST_TAIL, "proj_id", PS_DATA_S64, "Primary Key AUTO_INCREMENT", 0)) {
     29191        psError(PS_ERR_UNKNOWN, false, "failed to add item proj_id");
     29192        psFree(md);
     29193        return false;
     29194    }
     29195    if (!psMetadataAdd(md, PS_LIST_TAIL, "name", PS_DATA_STRING, "UNIQUE", "64")) {
     29196        psError(PS_ERR_UNKNOWN, false, "failed to add item name");
     29197        psFree(md);
     29198        return false;
     29199    }
     29200    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, "64")) {
     29201        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     29202        psFree(md);
     29203        return false;
     29204    }
     29205    if (!psMetadataAdd(md, PS_LIST_TAIL, "dbname", PS_DATA_STRING, NULL, "64")) {
     29206        psError(PS_ERR_UNKNOWN, false, "failed to add item dbname");
     29207        psFree(md);
     29208        return false;
     29209    }
     29210    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "64")) {
     29211        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
     29212        psFree(md);
     29213        return false;
     29214    }
     29215    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, "64")) {
     29216        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     29217        psFree(md);
     29218        return false;
     29219    }
     29220    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, "64")) {
     29221        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     29222        psFree(md);
     29223        return false;
     29224    }
     29225    if (!psMetadataAdd(md, PS_LIST_TAIL, "need_magic", PS_DATA_BOOL, NULL, 0)) {
     29226        psError(PS_ERR_UNKNOWN, false, "failed to add item need_magic");
     29227        psFree(md);
     29228        return false;
     29229    }
     29230
     29231    bool status = psDBCreateTable(dbh, PSTAMPPROJECT_TABLE_NAME, md);
     29232
     29233    psFree(md);
     29234
     29235    return status;
     29236}
     29237
     29238bool pstampProjectDropTable(psDB *dbh)
     29239{
     29240    return psDBDropTable(dbh, PSTAMPPROJECT_TABLE_NAME);
     29241}
     29242
     29243bool 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)
     29244{
     29245    psMetadata *md = psMetadataAlloc();
     29246    if (!psMetadataAdd(md, PS_LIST_TAIL, "proj_id", PS_DATA_S64, NULL, proj_id)) {
     29247        psError(PS_ERR_UNKNOWN, false, "failed to add item proj_id");
     29248        psFree(md);
     29249        return false;
     29250    }
     29251    if (!psMetadataAdd(md, PS_LIST_TAIL, "name", PS_DATA_STRING, NULL, name)) {
     29252        psError(PS_ERR_UNKNOWN, false, "failed to add item name");
     29253        psFree(md);
     29254        return false;
     29255    }
     29256    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
     29257        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     29258        psFree(md);
     29259        return false;
     29260    }
     29261    if (!psMetadataAdd(md, PS_LIST_TAIL, "dbname", PS_DATA_STRING, NULL, dbname)) {
     29262        psError(PS_ERR_UNKNOWN, false, "failed to add item dbname");
     29263        psFree(md);
     29264        return false;
     29265    }
     29266    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, dvodb)) {
     29267        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
     29268        psFree(md);
     29269        return false;
     29270    }
     29271    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, camera)) {
     29272        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     29273        psFree(md);
     29274        return false;
     29275    }
     29276    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, telescope)) {
     29277        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     29278        psFree(md);
     29279        return false;
     29280    }
     29281    if (!psMetadataAdd(md, PS_LIST_TAIL, "need_magic", PS_DATA_BOOL, NULL, need_magic)) {
     29282        psError(PS_ERR_UNKNOWN, false, "failed to add item need_magic");
     29283        psFree(md);
     29284        return false;
     29285    }
     29286
     29287    bool status = psDBInsertOneRow(dbh, PSTAMPPROJECT_TABLE_NAME, md);
     29288    psFree(md);
     29289
     29290    return status;
     29291}
     29292
     29293long long pstampProjectDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     29294{
     29295    long long       deleted = 0;
     29296
     29297    long long count = psDBDeleteRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, limit);
     29298    if (count < 0) {
     29299        psError(PS_ERR_UNKNOWN, true, "failed to delete row from pstampProject");
     29300        return count;
     29301
     29302        deleted += count;
     29303    }
     29304
     29305    return deleted;
     29306}
     29307bool pstampProjectInsertObject(psDB *dbh, pstampProjectRow *object)
     29308{
     29309    return pstampProjectInsert(dbh, object->proj_id, object->name, object->state, object->dbname, object->dvodb, object->camera, object->telescope, object->need_magic);
     29310}
     29311
     29312bool pstampProjectInsertObjects(psDB *dbh, psArray *objects)
     29313{
     29314    for (long i = 0; i < psArrayLength(objects); i++) {
     29315        if (!pstampProjectInsertObject(dbh, objects->data[i])) {
     29316            return false;
     29317        }
     29318    }
     29319
     29320    return true;
     29321}
     29322
     29323bool pstampProjectInsertFits(psDB *dbh, const psFits *fits)
     29324{
     29325    psArray         *rowSet;
     29326
     29327    // move to (the first?) extension named  PSTAMPPROJECT_TABLE_NAME
     29328    if (!psFitsMoveExtName(fits, PSTAMPPROJECT_TABLE_NAME)) {
     29329        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", PSTAMPPROJECT_TABLE_NAME);
     29330        return false;
     29331    }
     29332
     29333    // check HDU type
     29334    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     29335        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     29336        return false;
     29337    }
     29338
     29339    // read fits table
     29340    rowSet = psFitsReadTable(fits);
     29341    if (!rowSet) {
     29342        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     29343        psFree(rowSet);
     29344        return false;
     29345    }
     29346
     29347    if (!psDBInsertRows(dbh, PSTAMPPROJECT_TABLE_NAME, rowSet)) {
     29348        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     29349        psFree(rowSet);
     29350        return false;
     29351    }
     29352
     29353    psFree(rowSet);
     29354
     29355    return true;
     29356}
     29357
     29358bool pstampProjectSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     29359{
     29360    psArray         *rowSet;
     29361
     29362    rowSet = psDBSelectRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, limit);
     29363    if (!rowSet) {
     29364        return false;
     29365    }
     29366
     29367    // output to fits
     29368    if (!psFitsWriteTable(fits, NULL, rowSet, PSTAMPPROJECT_TABLE_NAME)) {
     29369        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     29370        psFree(rowSet);
     29371        return false;
     29372    }
     29373
     29374    psFree(rowSet);
     29375
     29376    return true;
     29377}
     29378
     29379psMetadata *pstampProjectMetadataFromObject(const pstampProjectRow *object)
     29380{
     29381    psMetadata *md = psMetadataAlloc();
     29382    if (!psMetadataAdd(md, PS_LIST_TAIL, "proj_id", PS_DATA_S64, NULL, object->proj_id)) {
     29383        psError(PS_ERR_UNKNOWN, false, "failed to add item proj_id");
     29384        psFree(md);
     29385        return false;
     29386    }
     29387    if (!psMetadataAdd(md, PS_LIST_TAIL, "name", PS_DATA_STRING, NULL, object->name)) {
     29388        psError(PS_ERR_UNKNOWN, false, "failed to add item name");
     29389        psFree(md);
     29390        return false;
     29391    }
     29392    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
     29393        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     29394        psFree(md);
     29395        return false;
     29396    }
     29397    if (!psMetadataAdd(md, PS_LIST_TAIL, "dbname", PS_DATA_STRING, NULL, object->dbname)) {
     29398        psError(PS_ERR_UNKNOWN, false, "failed to add item dbname");
     29399        psFree(md);
     29400        return false;
     29401    }
     29402    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {
     29403        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
     29404        psFree(md);
     29405        return false;
     29406    }
     29407    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, object->camera)) {
     29408        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     29409        psFree(md);
     29410        return false;
     29411    }
     29412    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, object->telescope)) {
     29413        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     29414        psFree(md);
     29415        return false;
     29416    }
     29417    if (!psMetadataAdd(md, PS_LIST_TAIL, "need_magic", PS_DATA_BOOL, NULL, object->need_magic)) {
     29418        psError(PS_ERR_UNKNOWN, false, "failed to add item need_magic");
     29419        psFree(md);
     29420        return false;
     29421    }
     29422
     29423
     29424    return md;
     29425}
     29426
     29427pstampProjectRow *pstampProjectObjectFromMetadata(psMetadata *md)
     29428{
     29429
     29430bool status = false;
     29431    psS64 proj_id = psMetadataLookupS64(&status, md, "proj_id");
     29432    if (!status) {
     29433        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item proj_id");
     29434        return false;
     29435    }
     29436    char* name = psMetadataLookupPtr(&status, md, "name");
     29437    if (!status) {
     29438        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item name");
     29439        return false;
     29440    }
     29441    char* state = psMetadataLookupPtr(&status, md, "state");
     29442    if (!status) {
     29443        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");
     29444        return false;
     29445    }
     29446    char* dbname = psMetadataLookupPtr(&status, md, "dbname");
     29447    if (!status) {
     29448        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dbname");
     29449        return false;
     29450    }
     29451    char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");
     29452    if (!status) {
     29453        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dvodb");
     29454        return false;
     29455    }
     29456    char* camera = psMetadataLookupPtr(&status, md, "camera");
     29457    if (!status) {
     29458        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
     29459        return false;
     29460    }
     29461    char* telescope = psMetadataLookupPtr(&status, md, "telescope");
     29462    if (!status) {
     29463        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
     29464        return false;
     29465    }
     29466    bool need_magic = psMetadataLookupBool(&status, md, "need_magic");
     29467    if (!status) {
     29468        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item need_magic");
     29469        return false;
     29470    }
     29471
     29472    return pstampProjectRowAlloc(proj_id, name, state, dbname, dvodb, camera, telescope, need_magic);
     29473}
     29474psArray *pstampProjectSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     29475{
     29476    psArray         *rowSet;
     29477    psArray         *returnSet;
     29478    psU64           i;
     29479
     29480    rowSet = psDBSelectRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, limit);
     29481    if (!rowSet) {
     29482        return NULL;
     29483    }
     29484
     29485    // convert psMetadata rows to row objects
     29486
     29487    returnSet = psArrayAllocEmpty(rowSet->n);
     29488
     29489    for (i = 0; i < rowSet->n; i++) {
     29490        pstampProjectRow *object = pstampProjectObjectFromMetadata(rowSet->data[i]);
     29491        if (!object) {
     29492            psFree(object);
     29493            psFree(returnSet);
     29494            psError(PS_ERR_UNKNOWN, false, "database error");
     29495            return NULL;
     29496        }
     29497        psArrayAdd(returnSet, 0, object);
     29498        psFree(object);
     29499    }
     29500
     29501    psFree(rowSet);
     29502
     29503    return returnSet;
     29504}
     29505bool pstampProjectDeleteObject(psDB *dbh, const pstampProjectRow *object)
     29506{
     29507    psMetadata *where = pstampProjectMetadataFromObject(object);
     29508    long long count = psDBDeleteRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, 0);
     29509    psFree(where);
     29510    if (count < 0) {
     29511        psError(PS_ERR_UNKNOWN, true, "failed to delete row from pstampProject");
     29512        return false;
     29513    }
     29514    if (count > 1) {
     29515        // XXX should this be a psAbort() instead?  It is possible that
     29516        // having an object match multiple rows was by design.
     29517        psError(PS_ERR_UNKNOWN, true, "pstampProjectRow object matched more then one row.  Check your database schema");
     29518        return false;
     29519    }
     29520
     29521    return true;
     29522}
     29523long long pstampProjectDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     29524{
     29525    long long       deleted = 0;
     29526
     29527    for (long long i = 0; i < objects->n; i++) {
     29528        pstampProjectRow *object = objects->data[i];
     29529        psMetadata *where = pstampProjectMetadataFromObject(object);
     29530        long long count = psDBDeleteRows(dbh, PSTAMPPROJECT_TABLE_NAME, where, limit);
     29531        psFree(where);
     29532        if (count < 0) {
     29533            psError(PS_ERR_UNKNOWN, true, "failed to delete row from pstampProject");
     29534            return count;
     29535        }
     29536
     29537        deleted += count;
     29538    }
     29539
     29540    return deleted;
     29541}
     29542bool pstampProjectPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     29543{
     29544    PS_ASSERT_PTR_NON_NULL(objects, false);
     29545
     29546    psMetadata *output = psMetadataAlloc();
     29547    for (long i = 0; i < psArrayLength(objects); i++) {
     29548        psMetadata *md = pstampProjectMetadataFromObject(objects->data[i]);
     29549        if (!psMetadataAddMetadata(
     29550            output,
     29551            PS_LIST_TAIL,
     29552            PSTAMPPROJECT_TABLE_NAME,
     29553            PS_META_DUPLICATE_OK,
     29554            NULL,
     29555            md
     29556        )) {
     29557            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     29558            psFree(md);
     29559            psFree(output);
     29560            return false;
     29561        }
     29562        psFree(md);
     29563    }
     29564
     29565    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     29566        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     29567        psFree(output);
     29568    }
     29569    psFree(output);
     29570
     29571    return true;
     29572}
     29573bool pstampProjectPrintObject(FILE *stream, pstampProjectRow *object, bool mdcf)
     29574{
     29575    PS_ASSERT_PTR_NON_NULL(object, false);
     29576
     29577    psMetadata *md = pstampProjectMetadataFromObject(object);
     29578
     29579    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     29580        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     29581        psFree(md);
     29582    }
     29583
     29584    psFree(md);
     29585
     29586    return true;
     29587}
    2660629588static void pstampRequestRowFree(pstampRequestRow *object);
    2660729589
     
    2703730019static void pstampJobRowFree(pstampJobRow *object);
    2703830020
    27039 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)
     30021pstampJobRow *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)
    2704030022{
    2704130023    pstampJobRow    *_object;
     
    2705130033    _object->fault = fault;
    2705230034    _object->uri = psStringCopy(uri);
     30035    _object->exp_id = exp_id;
    2705330036    _object->outputBase = psStringCopy(outputBase);
    2705430037    _object->args = psStringCopy(args);
     
    2710530088        return false;
    2710630089    }
     30090    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, 0)) {
     30091        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     30092        psFree(md);
     30093        return false;
     30094    }
    2710730095    if (!psMetadataAdd(md, PS_LIST_TAIL, "outputBase", PS_DATA_STRING, NULL, "255")) {
    2710830096        psError(PS_ERR_UNKNOWN, false, "failed to add item outputBase");
     
    2712830116}
    2712930117
    27130 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)
     30118bool 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)
    2713130119{
    2713230120    psMetadata *md = psMetadataAlloc();
     
    2716330151    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
    2716430152        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     30153        psFree(md);
     30154        return false;
     30155    }
     30156    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     30157        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    2716530158        psFree(md);
    2716630159        return false;
     
    2719930192bool pstampJobInsertObject(psDB *dbh, pstampJobRow *object)
    2720030193{
    27201     return pstampJobInsert(dbh, object->job_id, object->req_id, object->rownum, object->state, object->jobType, object->fault, object->uri, object->outputBase, object->args);
     30194    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);
    2720230195}
    2720330196
     
    2730730300        return false;
    2730830301    }
     30302    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     30303        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     30304        psFree(md);
     30305        return false;
     30306    }
    2730930307    if (!psMetadataAdd(md, PS_LIST_TAIL, "outputBase", PS_DATA_STRING, NULL, object->outputBase)) {
    2731030308        psError(PS_ERR_UNKNOWN, false, "failed to add item outputBase");
     
    2736130359        return false;
    2736230360    }
     30361    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     30362    if (!status) {
     30363        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     30364        return false;
     30365    }
    2736330366    char* outputBase = psMetadataLookupPtr(&status, md, "outputBase");
    2736430367    if (!status) {
     
    2737230375    }
    2737330376
    27374     return pstampJobRowAlloc(job_id, req_id, rownum, state, jobType, fault, uri, outputBase, args);
     30377    return pstampJobRowAlloc(job_id, req_id, rownum, state, jobType, fault, uri, exp_id, outputBase, args);
    2737530378}
    2737630379psArray *pstampJobSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
Note: See TracChangeset for help on using the changeset viewer.