IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 25266


Ignore:
Timestamp:
Sep 3, 2009, 5:05:24 PM (17 years ago)
Author:
Paul Price
Message:

Ensure covariance gets into mosaicked output.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/pap/psModules/src/camera/pmFPAMosaic.c

    r21363 r25266  
    740740static bool chipMosaic(psImage **mosaicImage, // The mosaic image, to be returned
    741741                       psImage **mosaicMask, // The mosaic mask, to be returned
    742                        psImage **mosaicVariances, // The mosaic variances, to be returned
     742                       psImage **mosaicVariance, // The mosaic variance, to be returned
    743743                       int *xBinChip, int *yBinChip, // The binning in x and y, to be returned
    744744                       const pmChip *chip, // Chip to mosaic
     
    749749    assert(mosaicImage);
    750750    assert(mosaicMask);
    751     assert(mosaicVariances);
     751    assert(mosaicVariance);
    752752    assert(xBinChip);
    753753    assert(yBinChip);
     
    826826    if (allGood) {
    827827        *mosaicImage = imageMosaic(images, xFlip, yFlip, xBin, yBin, *xBinChip, *yBinChip, x0, y0, BLANK_VALUE);
    828         *mosaicVariances = imageMosaic(variances, xFlip, yFlip, xBin, yBin, *xBinChip, *yBinChip, x0, y0, BLANK_VALUE);
     828        *mosaicVariance = imageMosaic(variances, xFlip, yFlip, xBin, yBin, *xBinChip, *yBinChip, x0, y0, BLANK_VALUE);
    829829        *mosaicMask = imageMosaic(masks, xFlip, yFlip, xBin, yBin, *xBinChip, *yBinChip, x0, y0, blank);
    830830    }
     
    847847static bool fpaMosaic(psImage **mosaicImage, // The mosaic image, to be returned
    848848                      psImage **mosaicMask, // The mosaic mask, to be returned
    849                       psImage **mosaicVariances, // The mosaic variances, to be returned
     849                      psImage **mosaicVariance, // The mosaic variance, to be returned
    850850                      int *xBinFPA, int *yBinFPA, // The binning in x and y, to be returned
    851851                      const pmFPA *fpa,  // FPA to mosaic
     
    857857    assert(mosaicImage);
    858858    assert(mosaicMask);
    859     assert(mosaicVariances);
     859    assert(mosaicVariance);
    860860    assert(xBinFPA);
    861861    assert(yBinFPA);
     
    960960    if (allGood) {
    961961        *mosaicImage = imageMosaic(images, xFlip, yFlip, xBin, yBin, *xBinFPA, *yBinFPA, x0, y0, BLANK_VALUE);
    962         *mosaicVariances = imageMosaic(variances, xFlip, yFlip, xBin, yBin, *xBinFPA, *yBinFPA, x0, y0, BLANK_VALUE);
     962        *mosaicVariance = imageMosaic(variances, xFlip, yFlip, xBin, yBin, *xBinFPA, *yBinFPA, x0, y0, BLANK_VALUE);
    963963        *mosaicMask = imageMosaic(masks, xFlip, yFlip, xBin, yBin, *xBinFPA, *yBinFPA, x0, y0, blank);
    964964    }
     
    10251025    psImage *mosaicImage   = NULL;      // The mosaic image
    10261026    psImage *mosaicMask    = NULL;      // The mosaic mask
    1027     psImage *mosaicVariances = NULL;      // The mosaic variances
     1027    psImage *mosaicVariance = NULL;      // The mosaic variances
    10281028
    10291029    // Find the HDU
     
    10521052        }
    10531053        if (hdu->variances) {
    1054             mosaicVariances = psImageSubset(hdu->variances->data[0], bounds);
    1055             if (!mosaicVariances) {
     1054            mosaicVariance = psImageSubset(hdu->variances->data[0], bounds);
     1055            if (!mosaicVariance) {
    10561056                psError(PS_ERR_UNKNOWN, false, "Unable to select variance pixels.\n");
    10571057                return false;
     
    10611061        // Case 2 --- we need to mosaic by cut and paste
    10621062        psTrace("psModules.camera", 1, "Case 2 mosaicking: cut and paste.\n");
    1063         if (!chipMosaic(&mosaicImage, &mosaicMask, &mosaicVariances, &xBin, &yBin, source, targetCell, blank)) {
     1063        if (!chipMosaic(&mosaicImage, &mosaicMask, &mosaicVariance, &xBin, &yBin, source, targetCell, blank)) {
    10641064            psError(PS_ERR_UNKNOWN, false, "Unable to mosaic cells.\n");
    10651065            return false;
     
    10691069    }
    10701070    psTrace("psModules.camera", 1, "xBin,yBin: %d,%d\n", xBin, yBin);
     1071
    10711072
    10721073    // Set the concepts for the target cell
     
    10901091    target->parent->concepts = psMetadataCopy(target->parent->concepts, source->parent->concepts); // FPA lvl
    10911092
     1093    // Average the covariances
     1094    psList *covariances = psListAlloc(NULL); // Input covariance matrices
     1095    for (int i = 0; i < source->cells->n; i++) {
     1096        pmCell *cell = source->cells->data[i]; // Cell of interest
     1097        if (!cell || !cell->data_exists) {
     1098            continue;
     1099        }
     1100        pmReadout *ro = cell->readouts->data[0]; // Readout of interest
     1101        if (!ro || !ro->covariance) {
     1102            continue;
     1103        }
     1104        psListAdd(covariances, PS_LIST_TAIL, ro->covariance);
     1105    }
     1106    psKernel *mosaicCovariance = NULL;  // Covariance for mosaic
     1107    if (psListLength(covariances) > 0) {
     1108        psArray *covarArray = psListToArray(covariances); // Array with covariances
     1109        mosaicCovariance = psImageCovarianceAverage(covarArray);
     1110        psFree(covarArray);
     1111    }
     1112    psFree(covariances);
     1113
    10921114    // Now make a new readout to go in the target cell
    10931115    pmReadout *newReadout = pmReadoutAlloc(targetCell); // New readout
    10941116    newReadout->image  = mosaicImage;
    10951117    newReadout->mask   = mosaicMask;
    1096     newReadout->variance = mosaicVariances;
     1118    newReadout->variance = mosaicVariance;
     1119    newReadout->covariance = mosaicCovariance;
     1120    psFree(covariances);
    10971121    psFree(newReadout);                 // Drop reference
    10981122
     
    13341358    target->concepts = psMetadataCopy(target->concepts, source->concepts);
    13351359
     1360    // Average the covariances
     1361    psList *covariances = psListAlloc(NULL); // Input covariance matrices
     1362    for (int i = 0; i < covariances->n; i++) {
     1363        pmChip *chip = chips->data[i];  // Chip of interest
     1364        if (!chip || !chip->data_exists) {
     1365            continue;
     1366        }
     1367        psArray *cells = chip->cells;   // Cells in chip
     1368        for (long j = 0; j < cells->n; j++) {
     1369            pmCell *cell = cells->data[i]; // Cell of interest
     1370            if (!cell || !cell->data_exists) {
     1371                continue;
     1372            }
     1373            pmReadout *ro = cell->readouts->data[0]; // Readout of interest
     1374            if (!ro || !ro->covariance) {
     1375                continue;
     1376            }
     1377            psListAdd(covariances, PS_LIST_TAIL, ro->covariance);
     1378        }
     1379    }
     1380    psKernel *mosaicCovariances = NULL; // Covariance for mosaic
     1381    if (psListLength(covariances) > 0) {
     1382        psArray *covarArray = psListToArray(covariances); // Array with covariances
     1383        mosaicCovariances = psImageCovarianceAverage(covarArray);
     1384        psFree(covarArray);
     1385    }
     1386    psFree(covariances);
     1387
    13361388    // Now make a new readout to go in the new cell
    13371389    pmReadout *newReadout = pmReadoutAlloc(targetCell); // New readout
     
    13391391    newReadout->mask   = mosaicMask;
    13401392    newReadout->variance = mosaicVariances;
     1393    newReadout->covariance = mosaicCovariances;
    13411394    psFree(newReadout);                 // Drop reference
    13421395
Note: See TracChangeset for help on using the changeset viewer.