IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 11, 2013, 4:50:12 PM (13 years ago)
Author:
watersc1
Message:

Changes that should not conflict with the trunk. This is the camera stage background continuity and the pattern.median example code.

Location:
branches/czw_branch/20130211/ippTools
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/czw_branch/20130211/ippTools

  • branches/czw_branch/20130211/ippTools/src

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/czw_branch/20130211/ippTools/src/difftool.c

    r34770 r35149  
    4141static bool revertdiffskyfileMode(pxConfig *config);
    4242static bool definepoprunMode(pxConfig *config);
    43 static bool definewarpstackMode(pxConfig *config);
     43//static bool definewarpstackMode(pxConfig *config);
     44static bool definewarpstackModeNew(pxConfig *config);
    4445static bool definewarpwarpMode(pxConfig *config);
    4546static bool definestackstackMode(pxConfig *config);
     
    9495        MODECASE(DIFFTOOL_MODE_REVERTDIFFSKYFILE,     revertdiffskyfileMode);
    9596        MODECASE(DIFFTOOL_MODE_DEFINEPOPRUN,          definepoprunMode);
    96         MODECASE(DIFFTOOL_MODE_DEFINEWARPSTACK,       definewarpstackMode);
     97        MODECASE(DIFFTOOL_MODE_DEFINEWARPSTACK,       definewarpstackModeNew);
    9798        MODECASE(DIFFTOOL_MODE_DEFINEWARPWARP,        definewarpwarpMode);
    9899        MODECASE(DIFFTOOL_MODE_DEFINESTACKSTACK,      definestackstackMode);
     
    12261227}
    12271228
    1228 
    1229 static bool definewarpstackMode(pxConfig *config)
     1229static bool definewarpstackModeNew(pxConfig *config)
    12301230{
    1231     PS_ASSERT_PTR_NON_NULL(config, false);
    1232 
     1231  PS_ASSERT_PTR_NON_NULL(config,false);
    12331232    psMetadata *expWhere = psMetadataAlloc();
    12341233    psMetadata *warp1Where = psMetadataAlloc(); // First set of restrictions on warp
    1235     psMetadata *warp2Where = psMetadataAlloc(); // Second set of restriction on warp
     1234    //    psMetadata *warp2Where = psMetadataAlloc(); // Second set of restriction on warp
    12361235    psMetadata *stackWhere = psMetadataAlloc();
    12371236
     
    12431242    PXOPT_COPY_STR(config->args, warp1Where, "-tess_id", "warpRun.tess_id", "==");
    12441243    PXOPT_COPY_STR(config->args, warp1Where, "-data_group", "warpRun.data_group", "==");
    1245     PXOPT_COPY_S64(config->args, warp2Where, "-warp_id", "warpRun.warp_id", "==");
    1246     PXOPT_COPY_STR(config->args, warp2Where, "-tess_id", "warpRun.tess_id", "==");
    1247     PXOPT_COPY_STR(config->args, warp2Where, "-data_group", "warpRun.data_group", "==");
    1248     PXOPT_COPY_STR(config->args, warp2Where, "-skycell_id", "warpSkyfile.skycell_id", "==");
    1249     PXOPT_COPY_STR(config->args, warp2Where, "-warp_label", "warpRun.label", "==");
    1250     PXOPT_COPY_F32(config->args, warp2Where,  "-good_frac", "warpSkyfile.good_frac", ">=");
     1244    //    PXOPT_COPY_S64(config->args, warp2Where, "-warp_id", "warpRun.warp_id", "==");
     1245    //    PXOPT_COPY_STR(config->args, warp2Where, "-tess_id", "warpRun.tess_id", "==");
     1246    //    PXOPT_COPY_STR(config->args, warp2Where, "-data_group", "warpRun.data_group", "==");
     1247    //    PXOPT_COPY_STR(config->args, warp2Where, "-skycell_id", "warpSkyfile.skycell_id", "==");
     1248    //    PXOPT_COPY_STR(config->args, warp2Where, "-warp_label", "warpRun.label", "==");
     1249    PXOPT_COPY_F32(config->args, warp1Where,  "-good_frac", "warpSkyfile.good_frac", ">=");
    12511250    PXOPT_COPY_STR(config->args, stackWhere, "-stack_label", "stackRun.label", "==");
    12521251    PXOPT_COPY_STR(config->args, stackWhere, "-stack_data_group", "stackRun.data_group", "==");
     
    12681267    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
    12691268
    1270     // find all things to queue
    1271     psString query = pxDataGet("difftool_definewarpstack_part1.sql");
    1272     if (!query) {
    1273         psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
    1274         return false;
    1275     }
    1276 
    1277     psString warp1Query = NULL;
    1278     psString warp2Query = NULL;
    1279     psString stackQuery = NULL;
    1280     psString expQuery = NULL;
    1281 
     1269    psString newQuery = NULL;
     1270    psStringAppend(&newQuery, "select exp_id,warp_id,rawExp.filter,warpRun.label,warpRun.data_group,warpRun.tess_id,warpRun.data_group,");
     1271    psStringAppend(&newQuery, "warpSkyfile.skycell_id,stack_id,stackRun.skycell_id,stackRun.tess_id,stackRun.label,stackRun.data_group,diff_id ");
     1272    psStringAppend(&newQuery, "from warpRun JOIN fakeRun USING(fake_id) JOIN camRun USING(cam_id) JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id) ");
     1273    psStringAppend(&newQuery, "JOIN warpSkyfile USING(warp_id) JOIN stackRun USING(skycell_id,filter) ");
     1274    psStringAppend(&newQuery, "LEFT JOIN diffInputSkyfile ON (warp_id = diffInputSkyfile.warp1 AND stack_id = diffInputSkyfile.stack2 AND diffInputSkyfile.skycell_id = stackRun.skycell_id) WHERE 1");
     1275   
    12821276    if (psListLength(expWhere->list)) {
    12831277        psString whereClause = psDBGenerateWhereConditionSQL(expWhere, NULL);
    1284         psStringAppend(&expQuery, "\n AND %s", whereClause);
     1278        psStringAppend(&newQuery, "\n AND %s", whereClause);
    12851279        psFree(whereClause);
    12861280    } else {
    1287         expQuery = psStringCopy("\n");
     1281      //        newQuery = psStringCopy("\n");
    12881282    }
    12891283    psFree(expWhere);
    12901284    if (psListLength(warp1Where->list)) {
    12911285        psString whereClause = psDBGenerateWhereConditionSQL(warp1Where, NULL);
    1292         psStringAppend(&warp1Query, "\n AND %s", whereClause);
     1286        psStringAppend(&newQuery, "\n AND %s", whereClause);
    12931287        psFree(whereClause);
    12941288    } else {
    1295         warp1Query = psStringCopy("\n");
     1289      //        waQuery = psStringCopy("\n");
    12961290    }
    12971291    psFree(warp1Where);
    1298     if (psListLength(warp2Where->list)) {
    1299         psString whereClause = psDBGenerateWhereConditionSQL(warp2Where, NULL);
    1300         psStringAppend(&warp2Query, "\n AND %s", whereClause);
     1292   
     1293    // don't queue for exposures that have already been diff'd unless requested
     1294    //    psString diffQuery = NULL;
     1295    if (! (reRun || newTemplates) ) {
     1296        psStringAppend(&newQuery, "\nAND diff_id IS NULL");
     1297    } else {
     1298      //        diffQuery = psStringCopy("\n");
     1299    }
     1300
     1301    if (psListLength(stackWhere->list)) {
     1302        psString whereClause = psDBGenerateWhereConditionSQL(stackWhere, NULL);
     1303        psStringAppend(&newQuery, "\nAND %s", whereClause);
    13011304        psFree(whereClause);
    13021305    } else {
    1303         warp2Query = psStringCopy("\n");
    1304     }
    1305     psFree(warp2Where);
    1306 
    1307     // don't queue for exposures that have already been diff'd unless requested
    1308     psString diffQuery = NULL;
    1309     if (! (reRun || newTemplates) ) {
    1310         psStringAppend(&diffQuery, "\nAND diff_id IS NULL");
    1311     } else {
    1312         diffQuery = psStringCopy("\n");
    1313     }
    1314 
    1315     if (psListLength(stackWhere->list)) {
    1316         psString whereClause = psDBGenerateWhereConditionSQL(stackWhere, NULL);
    1317         psStringAppend(&stackQuery, "\nAND %s", whereClause);
    1318         psFree(whereClause);
    1319     } else {
    1320         stackQuery = psStringCopy("");
     1306      //        stackQuery = psStringCopy("");
    13211307    }
    13221308    psFree(stackWhere);
    13231309
    1324     psTrace("difftool", 1, query, warp1Query, warp2Query, diffQuery, expQuery, stackQuery);
    1325 
     1310    //    psTrace("difftool", 1, query, warp1Query, warp2Query, diffQuery, expQuery, stackQuery);
     1311    fprintf(stderr,"%s",newQuery);
     1312    return(true);
     1313#if (0)   
    13261314    if (!psDBTransaction(config->dbh)) {
    13271315        psError(PS_ERR_UNKNOWN, false, "database error");
     
    13291317    }
    13301318
     1319   
    13311320    if (!p_psDBRunQueryF(config->dbh, query, warp1Query, warp2Query, expQuery, diffQuery)) {
    13321321        psError(PS_ERR_UNKNOWN, false, "database error");
     
    13671356        return true;
    13681357    }
    1369 
    1370     if (pretend) {
    1371         // negative simple so the default is true
    1372         if (!ippdbPrintMetadatas(stdout, output, "diffRun", !simple)) {
    1373             psError(PS_ERR_UNKNOWN, false, "failed to print array");
    1374             psFree(output);
    1375             return false;
    1376         }
    1377         psFree(output);
    1378         return true;
    1379     }
    1380 
    1381     // create temporary table
    1382     query = pxDataGet("difftool_definewarpstack_temp_create.sql");
    1383     if (!p_psDBRunQuery(config->dbh, query)) {
    1384         psError(PS_ERR_UNKNOWN, false, "database error");
    1385         psFree(query);
    1386         if (!psDBRollback(config->dbh)) {
    1387             psError(PS_ERR_UNKNOWN, false, "database error");
    1388         }
    1389         return false;
    1390     }
    1391     psFree(warp1Query);
    1392     psFree(query);
    1393     query = NULL;
    1394 
    1395     psString skycell_query = pxDataGet("difftool_definewarpstack_part2.sql");
    1396 
    13971358    psArray *list = psArrayAllocEmpty(16); // List of runs, to print
    13981359    long numGood = 0;                   // Number of good rows added
     
    14011362        psMetadata *row = output->data[i]; // Output row from query
    14021363        bool mdok;                      // Status of MD lookup
    1403 
    1404         // Take the first warp for each exposure.
    1405         // The list is sorted by exposure id and warp_id and the warps are in descending
    1406         // order.
    1407         psS64 exp_id = psMetadataLookupS64(&mdok, row, "exp_id");
    1408         if (!mdok) {
    1409             psError(PXTOOLS_ERR_PROG, false, "exp_id not found");
    1410             if (!psDBRollback(config->dbh)) {
    1411                 psError(PS_ERR_UNKNOWN, false, "database error");
    1412             }
    1413             return false;
    1414         }
    1415         if (exp_id == last_exp_id) {
    1416             continue;
    1417         }
    1418         last_exp_id = exp_id;
    1419 
    1420         // clear temporary table
    1421         if (!p_psDBRunQuery(config->dbh, "DELETE FROM skycellsToDiff")) {
    1422             psError(PS_ERR_UNKNOWN, false, "database error");
    1423             psFree(warp2Query);
    1424             psFree(stackQuery);
    1425             psFree(skycell_query);
    1426             if (!psDBRollback(config->dbh)) {
    1427                 psError(PS_ERR_UNKNOWN, false, "database error");
    1428             }
    1429             return false;
    1430         }
    1431         psS64 warp_id = psMetadataLookupS64(&mdok, row, "warp_id");
    1432         if (!mdok) {
    1433             psError(PXTOOLS_ERR_PROG, false, "warp_id not found --- ignoring row %ld", i);
    1434             psFree(warp2Query);
    1435             psFree(stackQuery);
    1436             psFree(skycell_query);
    1437             if (!psDBRollback(config->dbh)) {
    1438                 psError(PS_ERR_UNKNOWN, false, "database error");
    1439             }
    1440             return false;
    1441         }
    1442         psS64 skycell_count = psMetadataLookupS64(&mdok, row, "skycell_count");
    1443         if (!mdok) {
    1444             psError(PXTOOLS_ERR_PROG, false, "skycell_count not found");
    1445             psFree(warp2Query);
    1446             psFree(stackQuery);
    1447             psFree(skycell_query);
    1448             if (!psDBRollback(config->dbh)) {
    1449                 psError(PS_ERR_UNKNOWN, false, "database error");
    1450             }
    1451             return false;
    1452         }
    1453         psString tess_id = psMetadataLookupStr(&mdok, row, "tess_id");
    1454         if (!mdok) {
    1455             psError(PXTOOLS_ERR_PROG, false, "tess_id not found");
    1456             psFree(warp2Query);
    1457             psFree(stackQuery);
    1458             psFree(skycell_query);
    1459             if (!psDBRollback(config->dbh)) {
    1460                 psError(PS_ERR_UNKNOWN, false, "database error");
    1461             }
    1462             return false;
    1463         }
    1464 
    1465         psString filter = psMetadataLookupStr(&mdok, row, "filter");
    1466         if (!mdok) {
    1467             psError(PXTOOLS_ERR_PROG, false, "filter not found");
    1468             psFree(warp2Query);
    1469             psFree(stackQuery);
    1470             psFree(skycell_query);
    1471             if (!psDBRollback(config->dbh)) {
    1472                 psError(PS_ERR_UNKNOWN, false, "database error");
    1473             }
    1474             return false;
    1475         }
    1476 
    1477         psString warp_data_group = psMetadataLookupStr(&mdok, row, "data_group");
    1478         if (!mdok) {
    1479           psError(PXTOOLS_ERR_PROG, false, "warp data_group not found");
    1480           psFree(warp2Query);
    1481           psFree(stackQuery);
    1482           psFree(skycell_query);
    1483           if (!psDBRollback(config->dbh)) {
    1484             psError(PS_ERR_UNKNOWN, false, "database error");
    1485           }
    1486           return false;
    1487         }
    1488         if (!data_group && warp_data_group) {
    1489           data_group = warp_data_group;
    1490         }
    1491 
    1492         if (!p_psDBRunQueryF(config->dbh, skycell_query, stackQuery, warp_id, filter, warp2Query)) {
    1493             psError(PS_ERR_UNKNOWN, false, "database error");
    1494             psFree(warp2Query);
    1495             psFree(stackQuery);
    1496             psFree(skycell_query);
    1497             if (!psDBRollback(config->dbh)) {
    1498                 psError(PS_ERR_UNKNOWN, false, "database error");
    1499             }
    1500             return false;
    1501         }
    1502         psS64 num = psDBAffectedRows(config->dbh);
    1503 
    1504         if (num == 0) {
    1505             psTrace("difftool", PS_LOG_INFO, "no skycells with stack found for warp_id %" PRId64, warp_id);
    1506             continue;
    1507         }
    1508 
    1509         if (!available && (num != skycell_count)) {
    1510             psTrace("difftool", PS_LOG_INFO, "%" PRId64 " skyfiles with stack found for warp_id %" PRId64
    1511                     " but need %" PRId64, num, warp_id, skycell_count);
    1512             continue;
    1513         }
    1514 
    15151364        // ok we've got one create the diffRun
    15161365        diffRunRow *run = diffRunRowAlloc(
     
    15371386                note
    15381387        );
    1539 
    1540         if (!diffRunInsertObject(config->dbh, run)) {
    1541             psError(PS_ERR_UNKNOWN, false, "database error");
    1542             psFree(run);
    1543             if (!psDBRollback(config->dbh)) {
    1544                 psError(PS_ERR_UNKNOWN, false, "database error");
    1545             }
    1546             return false;
    1547         }
    1548         run->diff_id = psDBLastInsertID(config->dbh);
    1549 
    1550         psStringAppend(&query, "UPDATE skycellsToDiff SET diff_id = %" PRId64, run->diff_id);
    1551         if (!p_psDBRunQuery(config->dbh, query)) {
    1552             psError(PS_ERR_UNKNOWN, false, "database error");
    1553             psFree(warp2Query);
    1554             psFree(stackQuery);
    1555             psFree(skycell_query);
    1556             psFree(query);
    1557         if (!psDBRollback(config->dbh)) {
    1558             psError(PS_ERR_UNKNOWN, false, "database error");
    1559         }
    1560             return false;
    1561         }
    1562         psFree(query);
    1563         query = NULL;
    15641388        psStringAppend(&query,
    15651389                       "INSERT INTO diffInputSkyfile(diff_id, skycell_id, warp1, stack1, warp2, stack2, tess_id) SELECT diff_id, skycell_id, warp1, stack1, warp2, stack2, tess_id from skycellsToDiff");
     
    16131437
    16141438    return true;
     1439#endif
    16151440}
    1616 
     1441#if (0)   
     1442static bool definewarpstackMode(pxConfig *config)
     1443{
     1444    PS_ASSERT_PTR_NON_NULL(config, false);
     1445
     1446    psMetadata *expWhere = psMetadataAlloc();
     1447    psMetadata *warp1Where = psMetadataAlloc(); // First set of restrictions on warp
     1448    psMetadata *warp2Where = psMetadataAlloc(); // Second set of restriction on warp
     1449    psMetadata *stackWhere = psMetadataAlloc();
     1450
     1451    PXOPT_COPY_S64(config->args, expWhere, "-exp_id", "exp_id", "==");
     1452    PXOPT_COPY_STR(config->args, expWhere, "-filter", "filter", "==");
     1453    PXOPT_COPY_STR(config->args, expWhere, "-comment", "comment", "LIKE");
     1454    PXOPT_COPY_S64(config->args, warp1Where, "-warp_id", "warpRun.warp_id", "==");
     1455    PXOPT_COPY_STR(config->args, warp1Where, "-warp_label", "warpRun.label", "==");
     1456    PXOPT_COPY_STR(config->args, warp1Where, "-tess_id", "warpRun.tess_id", "==");
     1457    PXOPT_COPY_STR(config->args, warp1Where, "-data_group", "warpRun.data_group", "==");
     1458    PXOPT_COPY_S64(config->args, warp2Where, "-warp_id", "warpRun.warp_id", "==");
     1459    PXOPT_COPY_STR(config->args, warp2Where, "-tess_id", "warpRun.tess_id", "==");
     1460    PXOPT_COPY_STR(config->args, warp2Where, "-data_group", "warpRun.data_group", "==");
     1461    PXOPT_COPY_STR(config->args, warp2Where, "-skycell_id", "warpSkyfile.skycell_id", "==");
     1462    PXOPT_COPY_STR(config->args, warp2Where, "-warp_label", "warpRun.label", "==");
     1463    PXOPT_COPY_F32(config->args, warp2Where,  "-good_frac", "warpSkyfile.good_frac", ">=");
     1464    PXOPT_COPY_STR(config->args, stackWhere, "-stack_label", "stackRun.label", "==");
     1465    PXOPT_COPY_STR(config->args, stackWhere, "-stack_data_group", "stackRun.data_group", "==");
     1466
     1467    PXOPT_LOOKUP_BOOL(bothways, config->args, "-bothways", false);
     1468
     1469    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", true, false); // required option
     1470    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false); // option
     1471    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false); // option
     1472    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
     1473    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
     1474    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
     1475    PXOPT_LOOKUP_TIME(registered, config->args, "-set_registered", false, false);
     1476
     1477    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     1478    PXOPT_LOOKUP_BOOL(newTemplates, config->args, "-new-templates", false);
     1479    PXOPT_LOOKUP_BOOL(reRun, config->args, "-rerun", false);
     1480    PXOPT_LOOKUP_BOOL(available, config->args, "-available", false);
     1481    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
     1482
     1483    // find all things to queue
     1484    psString query = pxDataGet("difftool_definewarpstack_part1.sql");
     1485    if (!query) {
     1486        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     1487        return false;
     1488    }
     1489
     1490    psString warp1Query = NULL;
     1491    psString warp2Query = NULL;
     1492    psString stackQuery = NULL;
     1493    psString expQuery = NULL;
     1494
     1495    if (psListLength(expWhere->list)) {
     1496        psString whereClause = psDBGenerateWhereConditionSQL(expWhere, NULL);
     1497        psStringAppend(&expQuery, "\n AND %s", whereClause);
     1498        psFree(whereClause);
     1499    } else {
     1500        expQuery = psStringCopy("\n");
     1501    }
     1502    psFree(expWhere);
     1503    if (psListLength(warp1Where->list)) {
     1504        psString whereClause = psDBGenerateWhereConditionSQL(warp1Where, NULL);
     1505        psStringAppend(&warp1Query, "\n AND %s", whereClause);
     1506        psFree(whereClause);
     1507    } else {
     1508        warp1Query = psStringCopy("\n");
     1509    }
     1510    psFree(warp1Where);
     1511    if (psListLength(warp2Where->list)) {
     1512        psString whereClause = psDBGenerateWhereConditionSQL(warp2Where, NULL);
     1513        psStringAppend(&warp2Query, "\n AND %s", whereClause);
     1514        psFree(whereClause);
     1515    } else {
     1516        warp2Query = psStringCopy("\n");
     1517    }
     1518    psFree(warp2Where);
     1519
     1520    // don't queue for exposures that have already been diff'd unless requested
     1521    psString diffQuery = NULL;
     1522    if (! (reRun || newTemplates) ) {
     1523        psStringAppend(&diffQuery, "\nAND diff_id IS NULL");
     1524    } else {
     1525        diffQuery = psStringCopy("\n");
     1526    }
     1527
     1528    if (psListLength(stackWhere->list)) {
     1529        psString whereClause = psDBGenerateWhereConditionSQL(stackWhere, NULL);
     1530        psStringAppend(&stackQuery, "\nAND %s", whereClause);
     1531        psFree(whereClause);
     1532    } else {
     1533        stackQuery = psStringCopy("");
     1534    }
     1535    psFree(stackWhere);
     1536
     1537    psTrace("difftool", 1, query, warp1Query, warp2Query, diffQuery, expQuery, stackQuery);
     1538
     1539    if (!psDBTransaction(config->dbh)) {
     1540        psError(PS_ERR_UNKNOWN, false, "database error");
     1541        return false;
     1542    }
     1543
     1544    if (!p_psDBRunQueryF(config->dbh, query, warp1Query, warp2Query, expQuery, diffQuery)) {
     1545        psError(PS_ERR_UNKNOWN, false, "database error");
     1546        psFree(query);
     1547        if (!psDBRollback(config->dbh)) {
     1548            psError(PS_ERR_UNKNOWN, false, "database error");
     1549        }
     1550        return false;
     1551    }
     1552    psFree(query);
     1553
     1554    psArray *output = p_psDBFetchResult(config->dbh);
     1555    if (!output) {
     1556        psErrorCode err = psErrorCodeLast();
     1557        switch (err) {
     1558          case PS_ERR_DB_CLIENT:
     1559            psError(PXTOOLS_ERR_SYS, false, "database error");
     1560            break;
     1561          case PS_ERR_DB_SERVER:
     1562            psError(PXTOOLS_ERR_PROG, false, "database error");
     1563            break;
     1564          default:
     1565            psError(PXTOOLS_ERR_PROG, false, "unknown error");
     1566            break;
     1567        }
     1568        if (!psDBRollback(config->dbh)) {
     1569            psError(PS_ERR_UNKNOWN, false, "database error");
     1570        }
     1571        return false;
     1572    }
     1573    if (!psArrayLength(output)) {
     1574        psTrace("difftool", PS_LOG_INFO, "no rows found");
     1575        psFree(output);
     1576        if (!psDBCommit(config->dbh)) {
     1577            psError(PS_ERR_UNKNOWN, false, "database error");
     1578            return false;
     1579        }
     1580        return true;
     1581    }
     1582
     1583    if (pretend) {
     1584        // negative simple so the default is true
     1585        if (!ippdbPrintMetadatas(stdout, output, "diffRun", !simple)) {
     1586            psError(PS_ERR_UNKNOWN, false, "failed to print array");
     1587            psFree(output);
     1588            return false;
     1589        }
     1590        psFree(output);
     1591        return true;
     1592    }
     1593
     1594    // create temporary table
     1595    query = pxDataGet("difftool_definewarpstack_temp_create.sql");
     1596    if (!p_psDBRunQuery(config->dbh, query)) {
     1597        psError(PS_ERR_UNKNOWN, false, "database error");
     1598        psFree(query);
     1599        if (!psDBRollback(config->dbh)) {
     1600            psError(PS_ERR_UNKNOWN, false, "database error");
     1601        }
     1602        return false;
     1603    }
     1604    psFree(warp1Query);
     1605    psFree(query);
     1606    query = NULL;
     1607
     1608    psString skycell_query = pxDataGet("difftool_definewarpstack_part2.sql");
     1609
     1610    psArray *list = psArrayAllocEmpty(16); // List of runs, to print
     1611    long numGood = 0;                   // Number of good rows added
     1612    psS64 last_exp_id = 0;
     1613    for (long i = 0; i < output->n; i++) {
     1614        psMetadata *row = output->data[i]; // Output row from query
     1615        bool mdok;                      // Status of MD lookup
     1616
     1617        // Take the first warp for each exposure.
     1618        // The list is sorted by exposure id and warp_id and the warps are in descending
     1619        // order.
     1620        psS64 exp_id = psMetadataLookupS64(&mdok, row, "exp_id");
     1621        if (!mdok) {
     1622            psError(PXTOOLS_ERR_PROG, false, "exp_id not found");
     1623            if (!psDBRollback(config->dbh)) {
     1624                psError(PS_ERR_UNKNOWN, false, "database error");
     1625            }
     1626            return false;
     1627        }
     1628        if (exp_id == last_exp_id) {
     1629            continue;
     1630        }
     1631        last_exp_id = exp_id;
     1632
     1633        // clear temporary table
     1634        if (!p_psDBRunQuery(config->dbh, "DELETE FROM skycellsToDiff")) {
     1635            psError(PS_ERR_UNKNOWN, false, "database error");
     1636            psFree(warp2Query);
     1637            psFree(stackQuery);
     1638            psFree(skycell_query);
     1639            if (!psDBRollback(config->dbh)) {
     1640                psError(PS_ERR_UNKNOWN, false, "database error");
     1641            }
     1642            return false;
     1643        }
     1644        psS64 warp_id = psMetadataLookupS64(&mdok, row, "warp_id");
     1645        if (!mdok) {
     1646            psError(PXTOOLS_ERR_PROG, false, "warp_id not found --- ignoring row %ld", i);
     1647            psFree(warp2Query);
     1648            psFree(stackQuery);
     1649            psFree(skycell_query);
     1650            if (!psDBRollback(config->dbh)) {
     1651                psError(PS_ERR_UNKNOWN, false, "database error");
     1652            }
     1653            return false;
     1654        }
     1655        psS64 skycell_count = psMetadataLookupS64(&mdok, row, "skycell_count");
     1656        if (!mdok) {
     1657            psError(PXTOOLS_ERR_PROG, false, "skycell_count not found");
     1658            psFree(warp2Query);
     1659            psFree(stackQuery);
     1660            psFree(skycell_query);
     1661            if (!psDBRollback(config->dbh)) {
     1662                psError(PS_ERR_UNKNOWN, false, "database error");
     1663            }
     1664            return false;
     1665        }
     1666        psString tess_id = psMetadataLookupStr(&mdok, row, "tess_id");
     1667        if (!mdok) {
     1668            psError(PXTOOLS_ERR_PROG, false, "tess_id not found");
     1669            psFree(warp2Query);
     1670            psFree(stackQuery);
     1671            psFree(skycell_query);
     1672            if (!psDBRollback(config->dbh)) {
     1673                psError(PS_ERR_UNKNOWN, false, "database error");
     1674            }
     1675            return false;
     1676        }
     1677
     1678        psString filter = psMetadataLookupStr(&mdok, row, "filter");
     1679        if (!mdok) {
     1680            psError(PXTOOLS_ERR_PROG, false, "filter not found");
     1681            psFree(warp2Query);
     1682            psFree(stackQuery);
     1683            psFree(skycell_query);
     1684            if (!psDBRollback(config->dbh)) {
     1685                psError(PS_ERR_UNKNOWN, false, "database error");
     1686            }
     1687            return false;
     1688        }
     1689
     1690        psString warp_data_group = psMetadataLookupStr(&mdok, row, "data_group");
     1691        if (!mdok) {
     1692          psError(PXTOOLS_ERR_PROG, false, "warp data_group not found");
     1693          psFree(warp2Query);
     1694          psFree(stackQuery);
     1695          psFree(skycell_query);
     1696          if (!psDBRollback(config->dbh)) {
     1697            psError(PS_ERR_UNKNOWN, false, "database error");
     1698          }
     1699          return false;
     1700        }
     1701        if (!data_group && warp_data_group) {
     1702          data_group = warp_data_group;
     1703        }
     1704
     1705        if (!p_psDBRunQueryF(config->dbh, skycell_query, stackQuery, warp_id, filter, warp2Query)) {
     1706            psError(PS_ERR_UNKNOWN, false, "database error");
     1707            psFree(warp2Query);
     1708            psFree(stackQuery);
     1709            psFree(skycell_query);
     1710            if (!psDBRollback(config->dbh)) {
     1711                psError(PS_ERR_UNKNOWN, false, "database error");
     1712            }
     1713            return false;
     1714        }
     1715        psS64 num = psDBAffectedRows(config->dbh);
     1716
     1717        if (num == 0) {
     1718            psTrace("difftool", PS_LOG_INFO, "no skycells with stack found for warp_id %" PRId64, warp_id);
     1719            continue;
     1720        }
     1721
     1722        if (!available && (num != skycell_count)) {
     1723            psTrace("difftool", PS_LOG_INFO, "%" PRId64 " skyfiles with stack found for warp_id %" PRId64
     1724                    " but need %" PRId64, num, warp_id, skycell_count);
     1725            continue;
     1726        }
     1727
     1728        // ok we've got one create the diffRun
     1729        diffRunRow *run = diffRunRowAlloc(
     1730                0,            // ID
     1731                "reg",        // state
     1732                workdir,
     1733                label,
     1734                data_group ? data_group : label,
     1735                dist_group,
     1736                reduction,
     1737                NULL,         // dvodb
     1738                registered,
     1739                tess_id,
     1740                bothways,     // bothways (default is false)
     1741                true,         // exposure
     1742                0,            // magicked
     1743                NULL,         // software version
     1744                0,            // mask stat npix
     1745                NAN,          // static
     1746                NAN,          // dynamic
     1747                NAN,          // magic
     1748                NAN,          // advisory
     1749                IPP_DIFF_MODE_WARP_STACK,
     1750                note
     1751        );
     1752
     1753        if (!diffRunInsertObject(config->dbh, run)) {
     1754            psError(PS_ERR_UNKNOWN, false, "database error");
     1755            psFree(run);
     1756            if (!psDBRollback(config->dbh)) {
     1757                psError(PS_ERR_UNKNOWN, false, "database error");
     1758            }
     1759            return false;
     1760        }
     1761        run->diff_id = psDBLastInsertID(config->dbh);
     1762
     1763        psStringAppend(&query, "UPDATE skycellsToDiff SET diff_id = %" PRId64, run->diff_id);
     1764        if (!p_psDBRunQuery(config->dbh, query)) {
     1765            psError(PS_ERR_UNKNOWN, false, "database error");
     1766            psFree(warp2Query);
     1767            psFree(stackQuery);
     1768            psFree(skycell_query);
     1769            psFree(query);
     1770        if (!psDBRollback(config->dbh)) {
     1771            psError(PS_ERR_UNKNOWN, false, "database error");
     1772        }
     1773            return false;
     1774        }
     1775        psFree(query);
     1776        query = NULL;
     1777        psStringAppend(&query,
     1778                       "INSERT INTO diffInputSkyfile(diff_id, skycell_id, warp1, stack1, warp2, stack2, tess_id) SELECT diff_id, skycell_id, warp1, stack1, warp2, stack2, tess_id from skycellsToDiff");
     1779        if (!p_psDBRunQuery(config->dbh, query)) {
     1780            psError(PS_ERR_UNKNOWN, false, "database error");
     1781            psFree(warp2Query);
     1782            psFree(stackQuery);
     1783            psFree(skycell_query);
     1784            psFree(query);
     1785            if (!psDBRollback(config->dbh)) {
     1786                psError(PS_ERR_UNKNOWN, false, "database error");
     1787            }
     1788            return false;
     1789        }
     1790        psFree(query);
     1791        query = NULL;
     1792
     1793        if (!setdiffRunState(config, run->diff_id, "new", false)) {
     1794            psError(PS_ERR_UNKNOWN, false, "failed to change diffRun.state for diff_id: %" PRId64,
     1795                run->diff_id);
     1796            psFree(warp2Query);
     1797            psFree(stackQuery);
     1798            psFree(skycell_query);
     1799            psFree(query);
     1800            if (!psDBRollback(config->dbh)) {
     1801                psError(PS_ERR_UNKNOWN, false, "database error");
     1802            }
     1803            return false;
     1804        }
     1805
     1806        psArrayAdd(list, list->n, run);
     1807        numGood++;
     1808    }
     1809    psFree(output);
     1810    psFree(warp2Query);
     1811    psFree(stackQuery);
     1812    psFree(skycell_query);
     1813
     1814    if (!psDBCommit(config->dbh)) {
     1815        psError(PS_ERR_UNKNOWN, false, "database error");
     1816        psFree(list);
     1817        return false;
     1818    }
     1819
     1820    if (numGood && !diffRunPrintObjects(stdout, list, !simple)) {
     1821        psError(PS_ERR_UNKNOWN, false, "failed to print object");
     1822        psFree(list);
     1823        return false;
     1824    }
     1825    psFree(list);
     1826
     1827    return true;
     1828}
     1829#endif
    16171830static bool definewarpwarpMode(pxConfig *config)
    16181831{
Note: See TracChangeset for help on using the changeset viewer.