IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 31, 2010, 5:00:42 PM (16 years ago)
Author:
eugene
Message:

updates relative to 20091201, fixes for all psphot variants

Location:
branches/eam_branches/psModules.stack.20100120
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/psModules.stack.20100120

  • branches/eam_branches/psModules.stack.20100120/src/imcombine/pmSubtractionMatch.c

    r26667 r26747  
    3333# else
    3434# define SUBMODE PM_SUBTRACTION_EQUATION_ALL
    35 // # define SUBMODE PM_SUBTRACTION_EQUATION_KERNELS
    3635# endif
    3736
     
    7170                                 const psImage *subMask, // Mask for subtraction, or NULL
    7271                                 psImage *variance,  // Variance map
    73                                  const psRegion *region, // Region of interest, or NULL
     72                                 const psRegion *region, // Region of interest
    7473                                 float thresh1,  // Threshold for stamp finding on readout 1
    7574                                 float thresh2,  // Threshold for stamp finding on readout 2
    7675                                 float stampSpacing, // Spacing between stamps
     76                                 float normFrac,     // Fraction of flux in window for normalisation window
    7777                                 float sysError,     // Relative systematic error in images
    7878                                 float skyError,     // Relative systematic error in images
     
    8282    )
    8383{
     84    PS_ASSERT_PTR_NON_NULL(stamps, false);
     85    PM_ASSERT_READOUT_NON_NULL(ro1, false);
     86    PM_ASSERT_READOUT_NON_NULL(ro2, false);
     87    PS_ASSERT_IMAGE_NON_NULL(subMask, false);
     88    PS_ASSERT_IMAGE_NON_NULL(variance, false);
     89    PS_ASSERT_PTR_NON_NULL(region, false);
     90
    8491    psTrace("psModules.imcombine", 3, "Finding stamps...\n");
    8592
     
    8794
    8895    *stamps = pmSubtractionStampsFind(*stamps, image1, image2, subMask, region, thresh1, thresh2,
    89                                       size, footprint, stampSpacing, sysError, skyError, mode);
     96                                      size, footprint, stampSpacing, normFrac, sysError, skyError, mode);
    9097    if (!*stamps) {
    9198        psError(psErrorCodeLast(), false, "Unable to find stamps.");
     
    96103
    97104    psTrace("psModules.imcombine", 3, "Extracting stamps...\n");
    98     if (!pmSubtractionStampsExtract(*stamps, ro1->image, ro2 ? ro2->image : NULL, variance, size)) {
     105    if (!pmSubtractionStampsExtract(*stamps, ro1->image, ro2->image, variance, size, *region)) {
    99106        psError(PS_ERR_UNKNOWN, false, "Unable to extract stamps.");
    100107        return false;
     
    110117                                  const pmReadout *ro1, const pmReadout *ro2, // Input images
    111118                                  int stride, // Size for convolution patches
     119                                  float normFrac,           // Fraction of window for normalisation window
    112120                                  float sysError,           // Systematic error in images
    113121                                  float skyError,           // Systematic error in images
     
    158166    PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false);
    159167    PS_ASSERT_INT_NONNEGATIVE(stride, false);
     168    if (isfinite(normFrac)) {
     169        PS_ASSERT_FLOAT_LARGER_THAN(normFrac, 0.0, false);
     170        PS_ASSERT_FLOAT_LESS_THAN(normFrac, 1.0, false);
     171    }
    160172    if (isfinite(sysError)) {
    161173        PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, false);
     
    210222}
    211223
     224bool pmSubtractionMaskInvalid (const pmReadout *readout, psImageMaskType maskVal) {
     225
     226    if (!readout) return true;
     227
     228    psImage *image = readout->image;
     229    psImage *mask  = readout->mask;
     230    psImage *variance = readout->variance;
     231    for (int y = 0; y < image->numRows; y++) {
     232        for (int x = 0; x < image->numCols; x++) {
     233            if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & maskVal) continue;
     234            bool valid = false;
     235            valid = isfinite(image->data.F32[y][x]);
     236            if (variance) {
     237                valid &= isfinite(variance->data.F32[y][x]);
     238            }
     239            if (valid) continue;
     240            mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = maskVal;
     241        }
     242    }
     243
     244    return true;
     245}
    212246
    213247bool pmSubtractionMatchPrecalc(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2,
     
    282316    }
    283317
    284     if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, NAN, NAN, kernelError,
     318    if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, NAN, NAN, NAN, kernelError,
    285319                               maskVal, maskBad, maskPoor, poorFrac, badFrac, mode)) {
    286320        psFree(kernels);
     
    289323    }
    290324
    291     psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, 0,
     325    pmSubtractionMaskInvalid(ro1, maskVal);
     326    pmSubtractionMaskInvalid(ro2, maskVal);
     327
     328    psRegion bounds = psRegionSet(NAN, NAN, NAN, NAN); // Bounds of valid pixels
     329
     330    psImage *subMask = pmSubtractionMask(&bounds, ro1, ro2, maskVal, size, 0,
    292331                                         badFrac, mode); // Subtraction mask
    293332    if (!subMask) {
     
    348387                        int inner, int ringsOrder, int binning, float penalty,
    349388                        bool optimum, const psVector *optFWHMs, int optOrder, float optThreshold,
    350                         int iter, float rej, float sysError, float skyError, float kernelError, psImageMaskType maskVal,
    351                         psImageMaskType maskBad, psImageMaskType maskPoor, float poorFrac,
    352                         float badFrac, pmSubtractionMode subMode)
     389                        int iter, float rej, float normFrac, float sysError, float skyError,
     390                        float kernelError, psImageMaskType maskVal, psImageMaskType maskBad,
     391                        psImageMaskType maskPoor, float poorFrac, float badFrac, pmSubtractionMode subMode)
    353392{
    354     if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, skyError, kernelError,
     393    if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, normFrac, sysError, skyError, kernelError,
    355394                               maskVal, maskBad, maskPoor, poorFrac, badFrac, subMode)) {
    356395        return false;
     
    411450    // Putting important variable declarations here, since they are freed after a "goto" if there is an error.
    412451    psImage *subMask = NULL;            // Mask for subtraction
    413     psRegion *region = NULL;            // Iso-kernel region
     452    psRegion *region = psRegionAlloc(NAN, NAN, NAN, NAN); // Iso-kernel region
    414453    psString regionString = NULL;       // String for region
    415454    pmSubtractionStampList *stamps = NULL; // Stamps for matching PSF
     
    424463    memCheck("start");
    425464
    426     subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, footprint,
    427                                 badFrac, subMode);
     465    pmSubtractionMaskInvalid(ro1, maskVal);
     466    pmSubtractionMaskInvalid(ro2, maskVal);
     467
     468    psRegion bounds = psRegionSet(NAN, NAN, NAN, NAN); // Bounds of valid pixels
     469
     470    subMask = pmSubtractionMask(&bounds, ro1, ro2, maskVal, size, footprint, badFrac, subMode);
    428471    if (!subMask) {
    429472        psError(psErrorCodeLast(), false, "Unable to generate subtraction mask.");
     
    435478    // Get region of interest
    436479    int xRegions = 1, yRegions = 1;     // Number of iso-kernel regions
    437     float xRegionSize = 0, yRegionSize = 0; // Size of iso-kernel regions
     480    float xRegionSize = NAN, yRegionSize = NAN; // Size of iso-kernel regions
    438481    if (isfinite(regionSize) && regionSize != 0.0) {
    439         xRegions = numCols / regionSize + 1;
    440         yRegions = numRows / regionSize + 1;
    441         xRegionSize = (float)numCols / (float)xRegions;
    442         yRegionSize = (float)numRows / (float)yRegions;
    443         region = psRegionAlloc(NAN, NAN, NAN, NAN);
    444     }
    445 
     482        xRegions = (bounds.x1 - bounds.x0) / regionSize + 1;
     483        yRegions = (bounds.y1 - bounds.y0) / regionSize + 1;
     484        xRegionSize = (float)(bounds.x1 - bounds.x0) / (float)xRegions;
     485        yRegionSize = (float)(bounds.y1 - bounds.y0) / (float)yRegions;
     486    } else {
     487        xRegionSize = bounds.x1 - bounds.x0;
     488        yRegionSize = bounds.y1 - bounds.y0;
     489    }
     490
     491    // General background subtraction and measurement of stamp threshold
    446492    float stampThresh1 = NAN, stampThresh2 = NAN; // Stamp thresholds for images
    447493    {
    448         psStats *bg = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); // Statistics for backgroun
     494        psStats *bg = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); // Statistics for background
    449495        if (ro1) {
     496            psStatsInit(bg);
    450497            if (!psImageBackground(bg, NULL, ro1->image, ro1->mask, maskVal, rng)) {
    451498                psError(PS_ERR_UNKNOWN, false, "Unable to measure background statistics.");
     
    453500                goto MATCH_ERROR;
    454501            }
    455             stampThresh1 = bg->robustMedian + threshold * bg->robustStdev;
     502            stampThresh1 = threshold * bg->robustStdev;
     503            psBinaryOp(ro1->image, ro1->image, "-", psScalarAlloc((float)bg->robustMedian, PS_TYPE_F32));
    456504        }
    457505        if (ro2) {
     506            psStatsInit(bg);
    458507            if (!psImageBackground(bg, NULL, ro2->image, ro2->mask, maskVal, rng)) {
    459508                psError(PS_ERR_UNKNOWN, false, "Unable to measure background statistics.");
     
    461510                goto MATCH_ERROR;
    462511            }
    463             stampThresh2 = bg->robustMedian + threshold * bg->robustStdev;
    464         }
     512            stampThresh2 = threshold * bg->robustStdev;
     513            psBinaryOp(ro2->image, ro2->image, "-", psScalarAlloc((float)bg->robustMedian, PS_TYPE_F32));
     514       }
    465515        psFree(bg);
    466516    }
     517
     518    // Just in case the iso-kernel region doesn't cover the entire image...
     519    if (subMode == PM_SUBTRACTION_MODE_1 || subMode == PM_SUBTRACTION_MODE_UNSURE ||
     520        subMode == PM_SUBTRACTION_MODE_DUAL) {
     521        if (!conv1->image) {
     522            conv1->image = psImageAlloc(numCols, numRows, PS_TYPE_F32);
     523        }
     524        psImageInit(conv1->image, NAN);
     525        if (ro1->variance) {
     526            if (!conv1->variance) {
     527                conv1->variance = psImageAlloc(numCols, numRows, PS_TYPE_F32);
     528            }
     529            psImageInit(conv1->variance, NAN);
     530        }
     531        if (subMask) {
     532            if (!conv1->mask) {
     533                conv1->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK);
     534            }
     535            psImageInit(conv1->mask, maskBad);
     536        }
     537    }
     538    if (subMode == PM_SUBTRACTION_MODE_2 || subMode == PM_SUBTRACTION_MODE_UNSURE ||
     539        subMode == PM_SUBTRACTION_MODE_DUAL) {
     540        if (!conv2->image) {
     541            conv2->image = psImageAlloc(numCols, numRows, PS_TYPE_F32);
     542        }
     543        psImageInit(conv2->image, NAN);
     544        if (ro2->variance) {
     545            if (!conv2->variance) {
     546                conv2->variance = psImageAlloc(numCols, numRows, PS_TYPE_F32);
     547            }
     548            psImageInit(conv2->variance, NAN);
     549        }
     550        if (subMask) {
     551            if (!conv2->mask) {
     552                conv2->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK);
     553            }
     554            psImageInit(conv2->mask, maskBad);
     555        }
     556    }
     557
    467558
    468559    // Iterate over iso-kernel regions
     
    471562            psTrace("psModules.imcombine", 1, "Subtracting region %d of %d...\n",
    472563                    j * xRegions + i + 1, xRegions * yRegions);
    473             if (region) {
    474                 *region = psRegionSet((int)(i * xRegionSize), (int)((i + 1) * xRegionSize),
    475                                       (int)(j * yRegionSize), (int)((j + 1) * yRegionSize));
    476                 psFree(regionString);
    477                 regionString = psRegionToString(*region);
    478                 psTrace("psModules.imcombine", 3, "Iso-kernel region: %s out of %d,%d\n",
    479                         regionString, numCols, numRows);
    480             }
     564            *region = psRegionSet(bounds.x0 + (int)(i * xRegionSize),
     565                                  bounds.x0 + (int)((i + 1) * xRegionSize),
     566                                  bounds.y0 + (int)(j * yRegionSize),
     567                                  bounds.y0 + (int)((j + 1) * yRegionSize));
     568            psFree(regionString);
     569            regionString = psRegionToString(*region);
     570            psLogMsg("psModules.imcombine", PS_LOG_DETAIL, "Iso-kernel region: %s out of %d,%d\n",
     571                    regionString, numCols, numRows);
    481572
    482573            if (stampsName && strlen(stampsName) > 0) {
    483574                stamps = pmSubtractionStampsSetFromFile(stampsName, ro1->image, subMask, region, size,
    484                                                         footprint, stampSpacing, sysError, skyError, subMode);
     575                                                        footprint, stampSpacing, normFrac,
     576                                                        sysError, skyError, subMode);
    485577            } else if (sources) {
    486578                stamps = pmSubtractionStampsSetFromSources(sources, ro1->image, subMask, region, size,
    487                                                            footprint, stampSpacing, sysError, skyError, subMode);
     579                                                           footprint, stampSpacing, normFrac,
     580                                                           sysError, skyError, subMode);
    488581            }
    489582
    490583            // We get the stamps here; we will also attempt to get stamps at the first iteration, but it
    491584            // doesn't matter.
    492             if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, NULL, stampThresh1, stampThresh2,
    493                                       stampSpacing, sysError, skyError, size, footprint, subMode)) {
     585            if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, region, stampThresh1, stampThresh2,
     586                                      stampSpacing, normFrac, sysError, skyError, size, footprint, subMode)) {
    494587                goto MATCH_ERROR;
    495588            }
     
    498591            // generate the window function from the set of stamps
    499592            if (!pmSubtractionStampsGetWindow(stamps, size)) {
     593                psError(PS_ERR_UNKNOWN, false, "Unable to get stamp window.");
    500594                goto MATCH_ERROR;
    501595            }
     
    503597            // Define kernel basis functions
    504598            if (optimum && (type == PM_SUBTRACTION_KERNEL_ISIS || type == PM_SUBTRACTION_KERNEL_GUNK)) {
    505                 kernels = pmSubtractionKernelsOptimumISIS(type, size, inner, spatialOrder, optFWHMs, optOrder,
    506                                                           stamps, footprint, optThreshold, penalty, subMode);
     599                kernels = pmSubtractionKernelsOptimumISIS(type, size, inner, spatialOrder,
     600                                                          optFWHMs, optOrder, stamps, footprint,
     601                                                          optThreshold, penalty, bounds, subMode);
    507602                if (!kernels) {
    508603                    psErrorClear();
     
    513608                // Not an ISIS/GUNK kernel, or the optimum kernel search failed
    514609                kernels = pmSubtractionKernelsGenerate(type, size, spatialOrder, isisWidths, isisOrders,
    515                                                        inner, binning, ringsOrder, penalty, subMode);
     610                                                       inner, binning, ringsOrder, penalty, bounds, subMode);
    516611                // pmSubtractionVisualShowKernels(kernels);
    517612            }
     
    563658
    564659                if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, region,
    565                                           stampThresh1, stampThresh2, stampSpacing, sysError, skyError,
    566                                           size, footprint, subMode)) {
     660                                          stampThresh1, stampThresh2, stampSpacing, normFrac,
     661                                          sysError, skyError, size, footprint, subMode)) {
    567662                    goto MATCH_ERROR;
    568663                }
     
    570665                // generate the window function from the set of stamps
    571666                if (!pmSubtractionStampsGetWindow(stamps, size)) {
     667                    psError(PS_ERR_UNKNOWN, false, "Unable to get stamps window.");
    572668                    goto MATCH_ERROR;
    573669                }
Note: See TracChangeset for help on using the changeset viewer.