- Timestamp:
- Feb 11, 2013, 4:50:12 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/czw_branch/20130211/psModules/src/detrend/pmPattern.c
r35081 r35149 4 4 5 5 #include "pmFPA.h" 6 6 #include "pmStack.h" 7 7 #include "pmPattern.h" 8 8 … … 1085 1085 1086 1086 } 1087 psTrace("psModules.detrend.cont",5, " OTA: %d (%d %d) (%d %d) A: %f B: %f C: %f D: %f",1087 psTrace("psModules.detrend.cont",5, "Continuity OTA: %d (%d %d) (%d %d) A: %f B: %f C: %f D: %f", 1088 1088 i,x,y,xParity,yParity, 1089 1089 A->data.F64[y][x],B->data.F64[y][x],C->data.F64[y][x],D->data.F64[y][x]); … … 1302 1302 return true; 1303 1303 } 1304 1305 1306 bool pmPatternMedian(pmChip *chip, const psVector *tweak, psStatsOptions bgStat, psStatsOptions cellStat, 1307 psImageMaskType maskVal, psImageMaskType maskBad, bool doRows, bool doCols) 1308 { 1309 // fprintf(stderr,"Inside pmPatternMedian!\n"); 1310 PS_ASSERT_PTR_NON_NULL(chip, false); 1311 PS_ASSERT_VECTOR_NON_NULL(tweak, false); 1312 PS_ASSERT_VECTOR_SIZE(tweak, chip->cells->n, false); 1313 PS_ASSERT_VECTOR_TYPE(tweak, PS_TYPE_U8, false); 1314 1315 int numCells = tweak->n; // Number of cells 1316 numCells = chip->cells->n; 1317 psStats *bgStats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); // Statistics on background 1318 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator 1319 psVector *cellMedians = psVectorAlloc(numCells, PS_TYPE_F32); // Mask for means 1320 psVector *cellSigmas = psVectorAlloc(numCells, PS_TYPE_F32); 1321 psVector *meanMask = psVectorAlloc(numCells, PS_TYPE_VECTOR_MASK); 1322 // Mask bits 1323 enum { 1324 PM_PATTERN_IGNORE = 0x01, // Ignore this cell 1325 PM_PATTERN_TWEAK = 0x02, // Tweak this cell 1326 PM_PATTERN_ERROR = 0x04, // Error in calculating background 1327 PM_PATTERN_ALL = 0xFF, // All causes 1328 }; 1329 1330 // Count number of cells to tweak 1331 int numTweak = 0; // Number of cells to tweak 1332 int numIgnore = 0; // Number of cells to ignore 1333 psStatsInit(bgStats); 1334 1335 for (int i = 0; i < numCells; i++) { // Calculate cell level statistics, and set ignore mask 1336 pmCell *cell = chip->cells->data[i]; // Cell of interest 1337 1338 if (!cell || !cell->data_exists || !cell->process || 1339 cell->readouts->n == 0 || cell->readouts->n > 1 || !cell->readouts->data[0]) { 1340 numIgnore++; 1341 meanMask->data.PS_TYPE_VECTOR_MASK_DATA[i] = PM_PATTERN_IGNORE; 1342 cellMedians->data.F32[i] = NAN; 1343 cellSigmas->data.F32[i] = NAN; 1344 continue; 1345 } 1346 pmReadout *ro = cell->readouts->data[0]; 1347 if (tweak->data.U8[i]) { 1348 meanMask->data.PS_TYPE_VECTOR_MASK_DATA[i] = PM_PATTERN_TWEAK; 1349 numTweak++; 1350 } 1351 if (!psImageBackground(bgStats, NULL, ro->image, ro->mask, maskVal, rng)) { 1352 psWarning("Unable to measure background for cell %d\n", i); 1353 psErrorClear(); 1354 meanMask->data.PS_TYPE_VECTOR_MASK_DATA[i] |= PM_PATTERN_ERROR; 1355 continue; 1356 } 1357 cellMedians->data.F32[i] = bgStats->robustMedian; 1358 cellSigmas->data.F32[i] = bgStats->robustStdev; 1359 } 1360 if (numTweak == 0) { 1361 // fprintf(stderr,"Inside pmPatternMedian but I'm claiming nothing to do!\n"); 1362 // Nothing to do 1363 psFree(meanMask); 1364 return true; 1365 } 1366 1367 int num = 8; 1368 1369 psStats *stats = psStatsAlloc(PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_QUARTILE); 1370 // psArray *inputs = psArrayAlloc(num); 1371 psVector *inputs = psVectorAlloc(num,PS_TYPE_S32); 1372 psVector *pixelData = psVectorAlloc(inputs->n,PS_TYPE_F32); 1373 psVector *pixelMask = psVectorAlloc(inputs->n,PS_TYPE_VECTOR_MASK); 1374 1375 for (int mode = 0; mode <= 1; mode++) { 1376 if ((mode == 0)&&(!doRows)) { 1377 continue; 1378 } 1379 if ((mode == 1)&&(!doCols)) { 1380 continue; 1381 } 1382 for (int i = 0; i < num; i++) { // For each row of cells 1383 int k = 0; 1384 int numvalid = 0; 1385 for (int j = 0; j < numCells; j++) { // Scan the cell list for matches for this row. 1386 if (meanMask->data.PS_TYPE_VECTOR_MASK_DATA[j] & PM_PATTERN_IGNORE) { 1387 continue; 1388 } 1389 if (!(meanMask->data.PS_TYPE_VECTOR_MASK_DATA[j] & PM_PATTERN_TWEAK)) { 1390 continue; 1391 } 1392 1393 pmCell *cell = chip->cells->data[j]; 1394 const char *cellName = psMetadataLookupStr(NULL,cell->concepts, "CELL.NAME"); 1395 int x = cellName[2] - '0'; 1396 int y = cellName[3] - '0'; 1397 if (((mode == 0)&&(doRows)&&(y == i))|| 1398 ((mode == 1)&&(doCols)&&(x == i))) { 1399 inputs->data.S32[k] = j; // Add the index to the list of inputs. 1400 k++; 1401 numvalid++; 1402 } 1403 } 1404 // Allocate the median image and mask 1405 pmCell *exCell = chip->cells->data[inputs->data.S32[0]]; 1406 pmReadout *example = exCell->readouts->data[0]; 1407 pmReadout *median = pmReadoutAlloc(NULL); 1408 median->image = psImageAlloc(example->image->numCols, 1409 example->image->numRows, 1410 PS_TYPE_F32); 1411 median->mask = psImageAlloc(example->image->numCols, 1412 example->image->numRows, 1413 PS_TYPE_IMAGE_MASK); 1414 // Block to do median. 1415 { 1416 psImageMaskType badMask = 0x7F; // Configuable would be better. 1417 for (int y = 0 ; y < example->image->numRows; y++) { 1418 for (int x = 0; x < example->image->numCols; x++) { 1419 int badVal = 0; 1420 for (k = 0; k < numvalid; k++) { 1421 pmCell *cell = chip->cells->data[inputs->data.S32[k]]; 1422 pmReadout *ro = cell->readouts->data[0]; 1423 psImage *image = ro->image; 1424 psImage *mask = ro->mask; 1425 1426 pixelData->data.F32[k] = image->data.F32[y][x]; 1427 pixelMask->data.PS_TYPE_VECTOR_MASK_DATA[k] = 0; 1428 //#if (0) 1429 double cell_median = cellMedians->data.F32[inputs->data.S32[k]]; 1430 double cell_sigma = cellSigmas->data.F32[inputs->data.S32[k]]; 1431 if (fabs(pixelData->data.F32[k] - cell_median) > (3.0 * cell_sigma)) { 1432 pixelMask->data.PS_TYPE_VECTOR_MASK_DATA[k] = 1; 1433 badVal++; 1434 } 1435 //#endif 1436 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & badMask) { 1437 pixelMask->data.PS_TYPE_VECTOR_MASK_DATA[k] = 1; 1438 badVal++; 1439 } 1440 } 1441 for (k = numvalid; k < num; k++) { 1442 pixelMask->data.PS_TYPE_VECTOR_MASK_DATA[k] = 1; 1443 badVal++; 1444 } 1445 if (badVal >= num) { 1446 median->image->data.F32[y][x] = NAN; 1447 } 1448 else { 1449 if (!psVectorStats(stats,pixelData,NULL,pixelMask,1)) { 1450 // Die gracefully. 1451 return(false); 1452 } 1453 int worst_k = -1; 1454 double worst_v = 0; 1455 for (k = 0; k < num; k++) { 1456 if (pixelMask->data.PS_TYPE_VECTOR_MASK_DATA[k] == 0) { 1457 double v = fabs(stats->sampleMedian - pixelData->data.F32[k]); 1458 if (v > worst_v) { 1459 worst_v = v; 1460 worst_k = k; 1461 } 1462 } 1463 } 1464 if (worst_k != -1) { 1465 pixelMask->data.PS_TYPE_VECTOR_MASK_DATA[worst_k] = 1; 1466 if (!psVectorStats(stats,pixelData,NULL,pixelMask,1)) { 1467 // Die gracefully. 1468 return(false); 1469 } 1470 } 1471 median->image->data.F32[y][x] = stats->sampleMedian; 1472 } 1473 } 1474 } 1475 } // End median block 1476 1477 double correction_median = 0; 1478 if (!psImageBackground(bgStats, NULL, median->image, NULL, maskVal, rng)) { 1479 psWarning("Unable to measure background for cell section %d\n", i); 1480 psErrorClear(); 1481 } 1482 correction_median = bgStats->robustMedian; 1483 for (int v = 0; v < median->image->numRows; v++) { 1484 for (int u = 0; u < median->image->numCols; u++) { 1485 median->image->data.F32[v][u] -= correction_median; 1486 } 1487 } 1488 1489 // Block to subtract median 1490 for (int j = 0; j < numCells; j++) { 1491 if (meanMask->data.PS_TYPE_VECTOR_MASK_DATA[j] & PM_PATTERN_IGNORE) { 1492 continue; 1493 } 1494 if (!(meanMask->data.PS_TYPE_VECTOR_MASK_DATA[j] & PM_PATTERN_TWEAK)) { 1495 continue; 1496 } 1497 1498 pmCell *cell = chip->cells->data[j]; 1499 1500 const char *cellName = psMetadataLookupStr(NULL,cell->concepts, "CELL.NAME"); 1501 int x = cellName[2] - '0'; 1502 int y = cellName[3] - '0'; 1503 if (((mode == 0)&&(doRows)&&(y == i))|| 1504 ((mode == 1)&&(doCols)&&(x == i))) { 1505 psLogMsg("psModules.detrend",PS_LOG_DETAIL,"PATTERN.MEDIAN mode: %d Cell Statistics Pre: %d %d %d %s %g %g\n", 1506 mode, j,x,y,cellName,cellMedians->data.F32[j],cellSigmas->data.F32[j]); 1507 pmReadout *ro = cell->readouts->data[0]; 1508 psImage *im = ro->image; 1509 for (int v = 0; v < im->numRows; v++) { 1510 for (int u = 0; u < im->numCols; u++) { 1511 if (isfinite(median->image->data.F32[v][u])) { 1512 1513 im->data.F32[v][u] -= (median->image->data.F32[v][u]);// - correction_median); 1514 } 1515 } 1516 } 1517 if (!psImageBackground(bgStats, NULL, ro->image, ro->mask, maskVal, rng)) { 1518 psWarning("Unable to measure background for cell %d\n", j); 1519 psErrorClear(); 1520 meanMask->data.PS_TYPE_VECTOR_MASK_DATA[i] |= PM_PATTERN_ERROR; 1521 continue; 1522 } 1523 psLogMsg("psModules.detrend",PS_LOG_DETAIL,"PATTERN.MEDIAN mode: %d Cell Statistics Post: %d %d %d %s %g %g\n", 1524 mode, j,x,y,cellName,bgStats->robustMedian,bgStats->robustStdev); 1525 cellMedians->data.F32[j] = bgStats->robustMedian; 1526 cellSigmas->data.F32[j] = bgStats->robustStdev; 1527 } 1528 } // End subtraction block 1529 // Write out the median? 1530 #if (1) 1531 const char *expname = psMetadataLookupStr(NULL,chip->hdu->header,"FILENAME"); 1532 char filename[256]; 1533 pmCell *exCell2 = chip->cells->data[inputs->data.S32[0]]; 1534 snprintf(filename,sizeof(filename), 1535 "/home/panstarrs/watersc1/pattern_median.20130201/tests/%s.%d.%d.fits", 1536 expname,mode,i); 1537 psFits *fits = psFitsOpen(filename,"w"); 1538 if (!fits) { 1539 fprintf(stderr,"Couldn't write\n"); 1540 } 1541 if (!psFitsWriteImage(fits,exCell2->hdu->header,median->image,0,NULL)) { 1542 fprintf(stderr,"Couldn't write2\n"); 1543 } 1544 if (!psFitsClose(fits)) { 1545 fprintf(stderr,"Couldn't write3\n"); 1546 } 1547 #endif 1548 1549 psFree(median->image); 1550 psFree(median->mask); 1551 psFree(median); 1552 } 1553 } 1554 psFree(bgStats); 1555 psFree(rng); 1556 psFree(cellMedians); 1557 psFree(cellSigmas); 1558 psFree(meanMask); 1559 psFree(stats); 1560 psFree(inputs); 1561 psFree(pixelData); 1562 psFree(pixelMask); 1563 1564 1565 return true; 1566 }
Note:
See TracChangeset
for help on using the changeset viewer.
