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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/czw_branch/20130211/psModules/src/detrend/pmPattern.c

    r35081 r35149  
    44
    55#include "pmFPA.h"
    6 
     6#include "pmStack.h"
    77#include "pmPattern.h"
    88
     
    10851085       
    10861086      }
    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",
    10881088              i,x,y,xParity,yParity,
    10891089              A->data.F64[y][x],B->data.F64[y][x],C->data.F64[y][x],D->data.F64[y][x]);         
     
    13021302    return true;
    13031303}
     1304
     1305
     1306bool 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.