Changeset 35149 for branches/czw_branch/20130211/ippTools/src/difftool.c
- Timestamp:
- Feb 11, 2013, 4:50:12 PM (13 years ago)
- Location:
- branches/czw_branch/20130211/ippTools
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/czw_branch/20130211/ippTools
- Property svn:mergeinfo set to
-
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 41 41 static bool revertdiffskyfileMode(pxConfig *config); 42 42 static bool definepoprunMode(pxConfig *config); 43 static bool definewarpstackMode(pxConfig *config); 43 //static bool definewarpstackMode(pxConfig *config); 44 static bool definewarpstackModeNew(pxConfig *config); 44 45 static bool definewarpwarpMode(pxConfig *config); 45 46 static bool definestackstackMode(pxConfig *config); … … 94 95 MODECASE(DIFFTOOL_MODE_REVERTDIFFSKYFILE, revertdiffskyfileMode); 95 96 MODECASE(DIFFTOOL_MODE_DEFINEPOPRUN, definepoprunMode); 96 MODECASE(DIFFTOOL_MODE_DEFINEWARPSTACK, definewarpstackMode );97 MODECASE(DIFFTOOL_MODE_DEFINEWARPSTACK, definewarpstackModeNew); 97 98 MODECASE(DIFFTOOL_MODE_DEFINEWARPWARP, definewarpwarpMode); 98 99 MODECASE(DIFFTOOL_MODE_DEFINESTACKSTACK, definestackstackMode); … … 1226 1227 } 1227 1228 1228 1229 static bool definewarpstackMode(pxConfig *config) 1229 static bool definewarpstackModeNew(pxConfig *config) 1230 1230 { 1231 PS_ASSERT_PTR_NON_NULL(config, false); 1232 1231 PS_ASSERT_PTR_NON_NULL(config,false); 1233 1232 psMetadata *expWhere = psMetadataAlloc(); 1234 1233 psMetadata *warp1Where = psMetadataAlloc(); // First set of restrictions on warp 1235 psMetadata *warp2Where = psMetadataAlloc(); // Second set of restriction on warp1234 // psMetadata *warp2Where = psMetadataAlloc(); // Second set of restriction on warp 1236 1235 psMetadata *stackWhere = psMetadataAlloc(); 1237 1236 … … 1243 1242 PXOPT_COPY_STR(config->args, warp1Where, "-tess_id", "warpRun.tess_id", "=="); 1244 1243 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, warp 2Where, "-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", ">="); 1251 1250 PXOPT_COPY_STR(config->args, stackWhere, "-stack_label", "stackRun.label", "=="); 1252 1251 PXOPT_COPY_STR(config->args, stackWhere, "-stack_data_group", "stackRun.data_group", "=="); … … 1268 1267 PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false); 1269 1268 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 1282 1276 if (psListLength(expWhere->list)) { 1283 1277 psString whereClause = psDBGenerateWhereConditionSQL(expWhere, NULL); 1284 psStringAppend(& expQuery, "\n AND %s", whereClause);1278 psStringAppend(&newQuery, "\n AND %s", whereClause); 1285 1279 psFree(whereClause); 1286 1280 } else { 1287 expQuery = psStringCopy("\n");1281 // newQuery = psStringCopy("\n"); 1288 1282 } 1289 1283 psFree(expWhere); 1290 1284 if (psListLength(warp1Where->list)) { 1291 1285 psString whereClause = psDBGenerateWhereConditionSQL(warp1Where, NULL); 1292 psStringAppend(& warp1Query, "\n AND %s", whereClause);1286 psStringAppend(&newQuery, "\n AND %s", whereClause); 1293 1287 psFree(whereClause); 1294 1288 } else { 1295 warp1Query = psStringCopy("\n");1289 // waQuery = psStringCopy("\n"); 1296 1290 } 1297 1291 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); 1301 1304 psFree(whereClause); 1302 1305 } 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(""); 1321 1307 } 1322 1308 psFree(stackWhere); 1323 1309 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) 1326 1314 if (!psDBTransaction(config->dbh)) { 1327 1315 psError(PS_ERR_UNKNOWN, false, "database error"); … … 1329 1317 } 1330 1318 1319 1331 1320 if (!p_psDBRunQueryF(config->dbh, query, warp1Query, warp2Query, expQuery, diffQuery)) { 1332 1321 psError(PS_ERR_UNKNOWN, false, "database error"); … … 1367 1356 return true; 1368 1357 } 1369 1370 if (pretend) {1371 // negative simple so the default is true1372 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 table1382 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 1397 1358 psArray *list = psArrayAllocEmpty(16); // List of runs, to print 1398 1359 long numGood = 0; // Number of good rows added … … 1401 1362 psMetadata *row = output->data[i]; // Output row from query 1402 1363 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 descending1406 // 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 table1421 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 %" PRId641511 " but need %" PRId64, num, warp_id, skycell_count);1512 continue;1513 }1514 1515 1364 // ok we've got one create the diffRun 1516 1365 diffRunRow *run = diffRunRowAlloc( … … 1537 1386 note 1538 1387 ); 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;1564 1388 psStringAppend(&query, 1565 1389 "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"); … … 1613 1437 1614 1438 return true; 1439 #endif 1615 1440 } 1616 1441 #if (0) 1442 static 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 1617 1830 static bool definewarpwarpMode(pxConfig *config) 1618 1831 {
Note:
See TracChangeset
for help on using the changeset viewer.
