IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 23502


Ignore:
Timestamp:
Mar 24, 2009, 3:47:54 PM (17 years ago)
Author:
Paul Price
Message:

Adding definewarpwarp mode for difftool. The template is taken to be the warp (not from the same exposure as the input) that is the closest in alignment (RA,Dec). Restrictions may also be placed on the time difference and position angle difference between the two. The query takes about 10 seconds without any constraints using the current database (1174 warps).

Location:
trunk/ippTools
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippTools/share/Makefile.am

    r23430 r23502  
    7676     difftool_definebyquery_part2.sql \
    7777     difftool_definebyquery_temp_create.sql \
     78     difftool_definewarpwarp_select.sql \
     79     difftool_definewarpwarp_insert.sql \
    7880     difftool_donecleanup.sql \
    7981     difftool_inputskyfile.sql \
  • trunk/ippTools/src/difftool.c

    r23438 r23502  
    4141static bool definepoprunMode(pxConfig *config);
    4242static bool definebyqueryMode(pxConfig *config);
     43static bool definewarpwarpMode(pxConfig *config);
    4344static bool pendingcleanuprunMode(pxConfig *config);
    4445static bool pendingcleanupskyfileMode(pxConfig *config);
     
    7980        MODECASE(DIFFTOOL_MODE_DEFINEPOPRUN,          definepoprunMode);
    8081        MODECASE(DIFFTOOL_MODE_DEFINEBYQUERY,         definebyqueryMode);
     82        MODECASE(DIFFTOOL_MODE_DEFINEWARPWARP,        definewarpwarpMode);
    8183        MODECASE(DIFFTOOL_MODE_PENDINGCLEANUPRUN,     pendingcleanuprunMode);
    8284        MODECASE(DIFFTOOL_MODE_PENDINGCLEANUPSKYFILE, pendingcleanupskyfileMode);
     
    10061008    psTrace("difftool", 1, query, warpQuery, diffQuery, expQuery, stackQuery);
    10071009
     1010    if (!psDBTransaction(config->dbh)) {
     1011        psError(PS_ERR_UNKNOWN, false, "database error");
     1012        return false;
     1013    }
    10081014
    10091015    if (!p_psDBRunQueryF(config->dbh, query, warpQuery, expQuery, diffQuery)) {
    10101016        psError(PS_ERR_UNKNOWN, false, "database error");
    10111017        psFree(query);
     1018        if (!psDBRollback(config->dbh)) {
     1019            psError(PS_ERR_UNKNOWN, false, "database error");
     1020        }
    10121021        return false;
    10131022    }
     
    10181027        psErrorCode err = psErrorCodeLast();
    10191028        switch (err) {
    1020             case PS_ERR_DB_CLIENT:
    1021                 psError(PXTOOLS_ERR_SYS, false, "database error");
    1022             case PS_ERR_DB_SERVER:
    1023                 psError(PXTOOLS_ERR_PROG, false, "database error");
    1024             default:
    1025                 psError(PXTOOLS_ERR_PROG, false, "unknown error");
    1026         }
    1027 
     1029          case PS_ERR_DB_CLIENT:
     1030            psError(PXTOOLS_ERR_SYS, false, "database error");
     1031            break;
     1032          case PS_ERR_DB_SERVER:
     1033            psError(PXTOOLS_ERR_PROG, false, "database error");
     1034            break;
     1035          default:
     1036            psError(PXTOOLS_ERR_PROG, false, "unknown error");
     1037            break;
     1038        }
     1039        if (!psDBRollback(config->dbh)) {
     1040            psError(PS_ERR_UNKNOWN, false, "database error");
     1041        }
    10281042        return false;
    10291043    }
     
    10311045        psTrace("difftool", PS_LOG_INFO, "no rows found");
    10321046        psFree(output);
     1047        if (!psDBCommit(config->dbh)) {
     1048            psError(PS_ERR_UNKNOWN, false, "database error");
     1049            return false;
     1050        }
    10331051        return true;
    10341052    }
     
    10391057        psError(PS_ERR_UNKNOWN, false, "database error");
    10401058        psFree(query);
     1059        if (!psDBRollback(config->dbh)) {
     1060            psError(PS_ERR_UNKNOWN, false, "database error");
     1061        }
    10411062        return false;
    10421063    }
     
    10591080        if (!mdok) {
    10601081            psError(PXTOOLS_ERR_PROG, false, "exp_id not found");
     1082            if (!psDBRollback(config->dbh)) {
     1083                psError(PS_ERR_UNKNOWN, false, "database error");
     1084            }
    10611085            return false;
    10621086        }
     
    10721096            psFree(stackQuery);
    10731097            psFree(skycell_query);
     1098            if (!psDBRollback(config->dbh)) {
     1099                psError(PS_ERR_UNKNOWN, false, "database error");
     1100            }
    10741101            return false;
    10751102        }
     
    10801107            psFree(stackQuery);
    10811108            psFree(skycell_query);
     1109            if (!psDBRollback(config->dbh)) {
     1110                psError(PS_ERR_UNKNOWN, false, "database error");
     1111            }
    10821112            return false;
    10831113        }
     
    10881118            psFree(stackQuery);
    10891119            psFree(skycell_query);
     1120            if (!psDBRollback(config->dbh)) {
     1121                psError(PS_ERR_UNKNOWN, false, "database error");
     1122            }
    10901123            return false;
    10911124        }
     
    10961129            psFree(stackQuery);
    10971130            psFree(skycell_query);
     1131            if (!psDBRollback(config->dbh)) {
     1132                psError(PS_ERR_UNKNOWN, false, "database error");
     1133            }
    10981134            return false;
    10991135        }
     
    11041140            psFree(stackQuery);
    11051141            psFree(skycell_query);
     1142            if (!psDBRollback(config->dbh)) {
     1143                psError(PS_ERR_UNKNOWN, false, "database error");
     1144            }
    11061145            return false;
    11071146        }
     
    11111150            psFree(stackQuery);
    11121151            psFree(skycell_query);
     1152            if (!psDBRollback(config->dbh)) {
     1153                psError(PS_ERR_UNKNOWN, false, "database error");
     1154            }
    11131155            return false;
    11141156        }
     
    11431185            psError(PS_ERR_UNKNOWN, false, "database error");
    11441186            psFree(run);
    1145             return true;
     1187            if (!psDBRollback(config->dbh)) {
     1188                psError(PS_ERR_UNKNOWN, false, "database error");
     1189            }
     1190            return false;
    11461191        }
    11471192        run->diff_id = psDBLastInsertID(config->dbh);
     
    11541199            psFree(skycell_query);
    11551200            psFree(query);
     1201        if (!psDBRollback(config->dbh)) {
     1202            psError(PS_ERR_UNKNOWN, false, "database error");
     1203        }
    11561204            return false;
    11571205        }
     
    11651213            psFree(skycell_query);
    11661214            psFree(query);
     1215            if (!psDBRollback(config->dbh)) {
     1216                psError(PS_ERR_UNKNOWN, false, "database error");
     1217            }
    11671218            return false;
    11681219        }
     
    11771228            psFree(skycell_query);
    11781229            psFree(query);
     1230            if (!psDBRollback(config->dbh)) {
     1231                psError(PS_ERR_UNKNOWN, false, "database error");
     1232            }
    11791233            return false;
    11801234        }
     
    11881242    psFree(skycell_query);
    11891243
     1244    if (!psDBCommit(config->dbh)) {
     1245        psError(PS_ERR_UNKNOWN, false, "database error");
     1246        psFree(list);
     1247        return false;
     1248    }
     1249
    11901250    if (!diffRunPrintObjects(stdout, list, !simple)) {
    11911251        psError(PS_ERR_UNKNOWN, false, "failed to print object");
     
    11971257    return true;
    11981258}
     1259
     1260static bool definewarpwarpMode(pxConfig *config)
     1261{
     1262    PS_ASSERT_PTR_NON_NULL(config, false);
     1263
     1264    psMetadata *where = psMetadataAlloc();
     1265
     1266    // Restrictions
     1267    PXOPT_COPY_S64(config->args, where, "-warp_id", "inputWarpRun.warp_id", "==");
     1268    PXOPT_COPY_S64(config->args, where, "-exp_id", "inputRawExp.exp_id", "==");
     1269    PXOPT_COPY_STR(config->args, where, "-filter", "inputRawExp.filter", "==");
     1270    PXOPT_COPY_STR(config->args, where, "-input_label", "inputWarpRun.label", "==");
     1271    PXOPT_COPY_STR(config->args, where, "-template_label", "templateWarpRun.label", "==");
     1272    PXOPT_COPY_F32(config->args, where, "-timediff",
     1273                   "ABS(TIME_TO_SEC(TIMEDIFF(inputRawExp.dateobs, templateRawExp.dateobs)))", "<=");
     1274    PXOPT_COPY_F32(config->args, where, "-rotdiff", "ABS(inputRawExp.posang - templateRawExp.posang)", "<=");
     1275
     1276    // Additional controls
     1277    PXOPT_LOOKUP_BOOL(rerun, config->args, "-rerun", false);
     1278    PXOPT_LOOKUP_BOOL(available, config->args, "-available", false);
     1279
     1280    // Settings to apply to defined run
     1281    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false); // required options
     1282    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false); // option
     1283    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false); // option
     1284    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
     1285    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     1286
     1287
     1288    psString select = pxDataGet("difftool_definewarpwarp_select.sql");
     1289    if (!select) {
     1290        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
     1291        return false;
     1292    }
     1293
     1294    psString whereClause = NULL; // The WHERE part of the query
     1295
     1296    if (psListLength(where->list)) {
     1297        psString new = psDBGenerateWhereConditionSQL(where, NULL);
     1298        psStringAppend(&whereClause, "\n%s %s", whereClause ? "AND" : "WHERE", new);
     1299        psFree(new);
     1300    }
     1301    psFree(where);
     1302
     1303    if (!rerun) {
     1304        psStringAppend(&whereClause, "\n%s diffRun.diff_id IS NULL", whereClause ? "AND" : "WHERE");
     1305    }
     1306
     1307    if (!available) {
     1308        psStringAppend(&whereClause, "\n%s inputWarpRun.state = 'full'", whereClause ? "AND" : "WHERE");
     1309    }
     1310
     1311    if (!psDBTransaction(config->dbh)) {
     1312        psError(PS_ERR_UNKNOWN, false, "database error");
     1313        psFree(select);
     1314        psFree(whereClause);
     1315        return false;
     1316    }
     1317
     1318    if (!p_psDBRunQueryF(config->dbh, select,
     1319                         !rerun ? "\n" : "", // Activate LEFT JOIN against diffRun?
     1320                         whereClause)) {
     1321        psError(PS_ERR_UNKNOWN, false, "Unable to run query: %s [WITH] %s", select, whereClause);
     1322        psFree(select);
     1323        psFree(whereClause);
     1324        if (!psDBRollback(config->dbh)) {
     1325            psError(PS_ERR_UNKNOWN, false, "database error");
     1326        }
     1327        return false;
     1328    }
     1329    psFree(select);
     1330    psFree(whereClause);
     1331
     1332    psArray *results = p_psDBFetchResult(config->dbh); // Results of query
     1333    if (!results) {
     1334        psErrorCode err = psErrorCodeLast(); // Code for error
     1335        switch (err) {
     1336          case PS_ERR_DB_CLIENT:
     1337            psError(PXTOOLS_ERR_SYS, false, "database error");
     1338            break;
     1339          case PS_ERR_DB_SERVER:
     1340            psError(PXTOOLS_ERR_PROG, false, "database error");
     1341            break;
     1342          default:
     1343            psError(PXTOOLS_ERR_PROG, false, "unknown error");
     1344            break;
     1345        }
     1346        if (!psDBRollback(config->dbh)) {
     1347            psError(PS_ERR_UNKNOWN, false, "database error");
     1348        }
     1349        return false;
     1350    }
     1351    if (!psArrayLength(results)) {
     1352        psTrace("difftool", 1, "no rows found");
     1353        psFree(results);
     1354        return true;
     1355    }
     1356
     1357    psString insert = pxDataGet("difftool_definewarpwarp_insert.sql"); // Insertion for each new run
     1358
     1359    psArray *list = psArrayAllocEmpty(16); // List of runs defined, to print
     1360    long numGood = 0;                   // Number of good rows added
     1361    for (long i = 0; i < results->n; i++) {
     1362        psMetadata *row = results->data[i]; // Result row from query
     1363
     1364        psS64 exp_id = psMetadataLookupS64(NULL, row, "input_exp_id");
     1365        psS64 input_id = psMetadataLookupS64(NULL, row, "input_warp_id");
     1366        psS64 template_id = psMetadataLookupS64(NULL, row, "template_warp_id");
     1367        const char *tess_id = psMetadataLookupStr(NULL, row, "tess_id");
     1368        if (!exp_id || !input_id || !template_id || !tess_id) {
     1369            psError(PXTOOLS_ERR_PROG, false, "Identifiers not found");
     1370            psFree(list);
     1371            psFree(insert);
     1372            psFree(results);
     1373            if (!psDBRollback(config->dbh)) {
     1374                psError(PS_ERR_UNKNOWN, false, "database error");
     1375            }
     1376            return false;
     1377        }
     1378
     1379        diffRunRow *run = diffRunRowAlloc(0, "reg", workdir, label, reduction, NULL, registered,
     1380                                          tess_id, exp_id, false); // Run to insert
     1381        if (!diffRunInsertObject(config->dbh, run)) {
     1382            psError(PS_ERR_UNKNOWN, false, "database error");
     1383            psFree(run);
     1384            psFree(list);
     1385            psFree(insert);
     1386            psFree(results);
     1387            if (!psDBRollback(config->dbh)) {
     1388                psError(PS_ERR_UNKNOWN, false, "database error");
     1389            }
     1390            return false;
     1391        }
     1392        run->diff_id = psDBLastInsertID(config->dbh); // Difference run identifier
     1393
     1394        // Convert identifiers to string, for insertion into query
     1395        psString diff = NULL, input = NULL, template = NULL; // String versions of identifiers
     1396        psStringAppend(&diff, "%" PRId64, run->diff_id);
     1397        psStringAppend(&input, "%" PRId64, input_id);
     1398        psStringAppend(&template, "%" PRId64, template_id);
     1399
     1400        if (!p_psDBRunQueryF(config->dbh, insert, diff, input, template, input, template)) {
     1401            psError(PS_ERR_UNKNOWN, false, "database error");
     1402            psFree(input);
     1403            psFree(template);
     1404            psFree(diff);
     1405            psFree(run);
     1406            psFree(list);
     1407            psFree(insert);
     1408            psFree(results);
     1409            if (!psDBRollback(config->dbh)) {
     1410                psError(PS_ERR_UNKNOWN, false, "database error");
     1411            }
     1412            return false;
     1413        }
     1414        psFree(input);
     1415        psFree(template);
     1416        psFree(diff);
     1417
     1418        if (!setdiffRunState(config, run->diff_id, "new", false)) {
     1419            psError(PS_ERR_UNKNOWN, false, "Failed to change diffRun.state for diff_id: %" PRId64,
     1420                    run->diff_id);
     1421            psFree(run);
     1422            psFree(list);
     1423            psFree(insert);
     1424            psFree(results);
     1425            if (!psDBRollback(config->dbh)) {
     1426                psError(PS_ERR_UNKNOWN, false, "database error");
     1427            }
     1428            return false;
     1429        }
     1430
     1431        psArrayAdd(list, list->n, run);
     1432        psFree(run);                    // Drop reference
     1433
     1434        numGood++;
     1435    }
     1436    psFree(insert);
     1437    psFree(results);
     1438
     1439    if (!psDBCommit(config->dbh)) {
     1440        psError(PS_ERR_UNKNOWN, false, "database error");
     1441        psFree(list);
     1442        return false;
     1443    }
     1444
     1445    if (!diffRunPrintObjects(stdout, list, !simple)) {
     1446        psError(PS_ERR_UNKNOWN, false, "failed to print object");
     1447        psFree(list);
     1448        return false;
     1449    }
     1450    psFree(list);
     1451
     1452    return true;
     1453}
     1454
    11991455
    12001456static bool pendingcleanuprunMode(pxConfig *config)
     
    14531709    char sqlFilename[80];
    14541710  } ExportTable;
    1455  
     1711
    14561712  int numExportFiles = 3;
    14571713
     
    15321788{
    15331789  unsigned int nFail;
    1534  
     1790
    15351791  int numImportTables = 2;
    1536  
     1792
    15371793  char tables[2] [80] = {"diffInputSkyfile", "diffSkyfile"};
    15381794
    15391795  PS_ASSERT_PTR_NON_NULL(config, NULL);
    1540  
     1796
    15411797  PXOPT_LOOKUP_STR(infile, config->args, "-infile", true,  false);
    15421798
     
    15631819    psAssert (item, "entry not in input?");
    15641820    psAssert (item->type == PS_DATA_METADATA_MULTI, "entry not multi?");
    1565  
     1821
    15661822    switch (i) {
    15671823      case 0:
     
    15771833        }
    15781834        break;
    1579        
     1835
    15801836      case 1:
    15811837        for (int i = 0; i < item->data.list->n; i++) {
  • trunk/ippTools/src/difftool.h

    r23310 r23502  
    3535    DIFFTOOL_MODE_DEFINEPOPRUN,
    3636    DIFFTOOL_MODE_DEFINEBYQUERY,
     37    DIFFTOOL_MODE_DEFINEWARPWARP,
    3738    DIFFTOOL_MODE_PENDINGCLEANUPRUN,
    3839    DIFFTOOL_MODE_PENDINGCLEANUPSKYFILE,
  • trunk/ippTools/src/difftoolConfig.c

    r23388 r23502  
    165165    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
    166166
     167    // -definewarpwarp
     168    psMetadata *definewarpwarpArgs = psMetadataAlloc();
     169    psMetadataAddS64(definewarpwarpArgs, PS_LIST_TAIL, "-warp_id", 0, "search by warp ID", 0);
     170    psMetadataAddS64(definewarpwarpArgs, PS_LIST_TAIL, "-exp_id", 0, "search by exposure ID", 0);
     171    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-filter", 0, "search by filter", NULL);
     172    psMetadataAddF32(definewarpwarpArgs, PS_LIST_TAIL, "-timediff", 0, "limit time difference between input and template", NAN);
     173    psMetadataAddF32(definewarpwarpArgs, PS_LIST_TAIL, "-rotdiff", 0, "limit rotator difference between input and template", NAN);
     174    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-input_label", 0, "search by warp label for input", NULL);
     175    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-template_label", 0, "search by warp label for template", NULL);
     176    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-workdir", 0, "define workdir (required)", NULL);
     177    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-label",  0, "define label", NULL);
     178    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-reduction",  0, "define reduction class", NULL);
     179    psMetadataAddTime(definewarpwarpArgs, PS_LIST_TAIL, "-registered", 0, "time detrend run was registered", now);
     180    psMetadataAddBool(definewarpwarpArgs, PS_LIST_TAIL, "-rerun", 0, "define new run even if one exists", false);
     181    psMetadataAddBool(definewarpwarpArgs, PS_LIST_TAIL, "-available", 0, "define new run even if warpRun has some faults", false);
     182    psMetadataAddBool(definewarpwarpArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
     183
    167184    // -pendingcleanuprun
    168185    psMetadata *pendingcleanuprunArgs = psMetadataAlloc();
     
    215232    PXOPT_ADD_MODE("-definepoprun",     "", DIFFTOOL_MODE_DEFINEPOPRUN,      definepoprunArgs);
    216233    PXOPT_ADD_MODE("-definebyquery",    "", DIFFTOOL_MODE_DEFINEBYQUERY,     definebyqueryArgs);
     234    PXOPT_ADD_MODE("-definewarpwarp",   "", DIFFTOOL_MODE_DEFINEWARPWARP,    definewarpwarpArgs);
    217235    PXOPT_ADD_MODE("-pendingcleanuprun",     "show runs that need to be cleaned up", DIFFTOOL_MODE_PENDINGCLEANUPRUN,    pendingcleanuprunArgs);
    218236    PXOPT_ADD_MODE("-pendingcleanupskyfile", "show runs that need to be cleaned up", DIFFTOOL_MODE_PENDINGCLEANUPSKYFILE, pendingcleanupskyfileArgs);
Note: See TracChangeset for help on using the changeset viewer.