IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 19165


Ignore:
Timestamp:
Aug 22, 2008, 12:46:26 PM (18 years ago)
Author:
Paul Price
Message:

Introducing bad/poor distinction to reduce explosion of bad pixels in output. Attempt to interpolate over bad pixels before subtracting.

Location:
trunk/ppSub/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/ppSub/src/ppSubArguments.c

    r19060 r19165  
    200200    psMetadataAddF32(arguments, PS_LIST_TAIL, "-rej", 0, "Rejection thresold (sigma)", NAN);
    201201    psMetadataAddU8(arguments,  PS_LIST_TAIL, "-mask-bad", 0, "Mask value for bad pixels", 0);
    202     psMetadataAddU8(arguments,  PS_LIST_TAIL, "-mask-blank", 0, "Mask value for blank region", 0);
     202    psMetadataAddU8(arguments,  PS_LIST_TAIL, "-mask-poor", 0, "Mask value for poor pixels", 0);
     203    psMetadataAddF32(arguments,  PS_LIST_TAIL, "-poor-frac", 0, "Fraction of weight for poor pixels", NAN);
    203204    psMetadataAddF32(arguments, PS_LIST_TAIL, "-badfrac", 0, "Maximum fraction of bad pixels to accept", 1.0);
    204205    psMetadataAddBool(arguments,  PS_LIST_TAIL, "-reverse", 0, "Reverse sense of subtraction?", false);
     
    286287    VALUE_ARG_RECIPE_FLOAT("-badfrac",    "BADFRAC",         F32);
    287288    VALUE_ARG_RECIPE_FLOAT("-penalty",    "PENALTY",         F32);
    288 
    289     valueArgRecipeStr(arguments, recipe, "-mask-bad",   "MASK.BAD",   recipe);
    290     valueArgRecipeStr(arguments, recipe, "-mask-blank", "MASK.BLANK", recipe);
     289    VALUE_ARG_RECIPE_FLOAT("-poor-frac",  "POOR.FRACTION",   F32);
     290
     291    valueArgRecipeStr(arguments, recipe, "-mask-in",   "MASK.IN",  recipe);
     292    valueArgRecipeStr(arguments, recipe, "-mask-bad",  "MASK.BAD",  recipe);
     293    valueArgRecipeStr(arguments, recipe, "-mask-poor", "MASK.POOR", recipe);
    291294
    292295    vectorArgRecipe(arguments, "-isis-widths", recipe, "ISIS.WIDTHS", recipe, PS_TYPE_F32);
  • trunk/ppSub/src/ppSubLoop.c

    r18920 r19165  
    142142                    return false;
    143143                }
    144                 ppStatsFPA(stats, output->fpa, view, pmConfigMaskGet("BLANK", config), config);
     144                ppStatsFPA(stats, output->fpa, view, pmConfigMaskGet("MASK.VALUE", config), config);
    145145            }
    146146
  • trunk/ppSub/src/ppSubReadout.c

    r19060 r19165  
    9898    int binning = psMetadataLookupS32(NULL, recipe, "SPAM.BINNING"); // Binning for SPAM kernel
    9999    float penalty = psMetadataLookupF32(NULL, recipe, "PENALTY"); // Penalty for wideness
    100     psMaskType maskIn = pmConfigMaskGet("MASK.VALUE", config); // Bits to mask going in to pmSubtractionMatch
    101     psMaskType maskOut = pmConfigMaskGet("BLANK", config); // Bits to mask after pmSubtractionMatch
     100    psString maskValStr = psMetadataLookupStr(NULL, recipe, "MASK.IN"); // Name of bits to mask going in
     101    psMaskType maskVal = pmConfigMaskGet(maskValStr, config); // Bits to mask going in to pmSubtractionMatch
     102    psString maskPoorStr = psMetadataLookupStr(NULL, recipe, "MASK.POOR"); // Name of bits to mask for poor
     103    psMaskType maskPoor = pmConfigMaskGet(maskPoorStr, config); // Bits to mask for poor pixels
     104    psString maskBadStr = psMetadataLookupStr(NULL, recipe, "MASK.BAD"); // Name of bits to mask for bad
     105    psMaskType maskBad = pmConfigMaskGet(maskBadStr, config); // Bits to mask for bad pixels
    102106    float badFrac = psMetadataLookupF32(NULL, recipe, "BADFRAC"); // Maximum bad fraction
    103107    const char *stampsName = psMetadataLookupStr(&mdok, config->arguments, "STAMPS"); // Filename for stamps
     
    113117    int renormWidth = psMetadataLookupS32(&mdok, recipe, "RENORM.WIDTH"); // Width for renormalise
    114118
    115     pmSubtractionMode mode = dual ? PM_SUBTRACTION_MODE_DUAL : PM_SUBTRACTION_MODE_UNSURE; // Subtraction mode
     119    psString interpModeStr = psMetadataLookupStr(&mdok, recipe, "INTERPOLATION"); // Interpolation mode
     120    psImageInterpolateMode interpMode = psImageInterpolateModeFromString(interpModeStr); // Interp
     121    if (interpMode == PS_INTERPOLATE_NONE) {
     122        psError(PS_ERR_BAD_PARAMETER_VALUE, false, "Unknown interpolation mode: %s", interpModeStr);
     123        return false;
     124    }
     125    float poorFrac = psMetadataLookupF32(&mdok, recipe, "POOR.FRACTION"); // Fraction for "poor"
     126
     127    pmSubtractionMode subMode = dual ? PM_SUBTRACTION_MODE_DUAL : PM_SUBTRACTION_MODE_UNSURE; // Subtracn mode
    116128
    117129    // Generate masks if they don't exist
     
    134146    }
    135147
    136     if (!pmReadoutMaskNonfinite(inRO, maskIn)) {
     148    if (!pmReadoutMaskNonfinite(inRO, pmConfigMaskGet("SAT", config))) {
    137149        psError(PS_ERR_UNKNOWN, false, "Unable to mask non-finite pixels in input.");
    138150        return false;
    139151    }
    140     if (!pmReadoutMaskNonfinite(refRO, maskIn)) {
     152    if (!pmReadoutMaskNonfinite(refRO, pmConfigMaskGet("SAT", config))) {
    141153        psError(PS_ERR_UNKNOWN, false, "Unable to mask non-finite pixels in reference.");
    142154        return false;
     
    153165    }
    154166
     167    // Interpolate over bad pixels, so the bad pixels don't explode
     168    if (!pmReadoutInterpolateBadPixels(inRO, maskVal, interpMode, poorFrac, maskPoor, maskBad)) {
     169        psError(PS_ERR_UNKNOWN, false, "Unable to interpolate bad pixels for input image.");
     170        return false;
     171    }
     172    if (!pmReadoutInterpolateBadPixels(refRO, maskVal, interpMode, poorFrac, maskPoor, maskBad)) {
     173        psError(PS_ERR_UNKNOWN, false, "Unable to interpolate bad pixels for reference image.");
     174        return false;
     175    }
     176    maskVal |= maskBad;
     177
     178    // Match the PSFs
    155179    if (!pmSubtractionMatch(inConv, refConv, inRO, refRO, footprint, regionSize, spacing, threshold, sources,
    156180                            stampsName, type, size, order, widths, orders, inner, ringsOrder, binning,
    157                             penalty, optimum, optWidths, optOrder, optThresh, iter, rej, maskIn,
    158                             maskOut, badFrac, mode)) {
     181                            penalty, optimum, optWidths, optOrder, optThresh, iter, rej, maskVal,
     182                            maskBad, maskPoor, poorFrac, badFrac, subMode)) {
    159183        psError(PS_ERR_UNKNOWN, false, "Unable to match images.");
    160184        psFree(inConv);
     
    221245#ifdef TESTING
    222246    {
    223         pmReadoutMaskApply(minuend, maskOut);
     247        pmReadoutMaskApply(minuend, maskVal);
    224248        psFits *fits = psFitsOpen("minuend.fits", "w");
    225249        psFitsWriteImage(fits, NULL, minuend->image, 0, NULL);
     
    227251    }
    228252    {
    229         pmReadoutMaskApply(subtrahend, maskOut);
     253        pmReadoutMaskApply(subtrahend, maskVal);
    230254        psFits *fits = psFitsOpen("subtrahend.fits", "w");
    231255        psFitsWriteImage(fits, NULL, subtrahend->image, 0, NULL);
     
    267291
    268292        // set maskValue and markValue in the psphot recipe
    269         psMaskType maskValue = pmConfigMaskGet("BLANK", config); // Bits to mask
     293        psMaskType maskValue = maskVal;
    270294        psMaskType markValue = pmConfigMaskGet("MARK.VALUE", config); // Bits to use for marking
    271295        psMetadataAddU8(recipe, PS_LIST_TAIL, "MASK.PSPHOT", PS_META_REPLACE, "Bits to mask", maskValue);
     
    306330    outRO->data_exists = outCell->data_exists = outCell->parent->data_exists = true;
    307331
    308     pmReadoutMaskApply(outRO, maskOut);
     332    pmReadoutMaskApply(outRO, maskBad);
    309333
    310334    psFree(inConv);
     
    314338    for (int y = 0; y < outRO->image->numRows; y++) {
    315339        for (int x = 0; x < outRO->image->numCols; x++) {
    316             if (isnan(outRO->image->data.F32[y][x]) && !(outRO->mask->data.U8[y][x] & maskOut)) {
     340            if (isnan(outRO->image->data.F32[y][x]) && !(outRO->mask->data.U8[y][x] & maskVal)) {
    317341                printf("Unmasked NAN at %d %d --> %d\n", x, y, outRO->mask->data.U8[y][x]);
    318342            }
     
    329353    if (renorm) {
    330354        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0); // Random number generator
    331         if (!pmReadoutWeightRenorm(outRO, maskOut, PS_STAT_ROBUST_MEDIAN, PS_STAT_ROBUST_STDEV,
     355        if (!pmReadoutWeightRenorm(outRO, maskBad, PS_STAT_ROBUST_MEDIAN, PS_STAT_ROBUST_STDEV,
    332356                                   renormWidth, rng)) {
    333357            psError(PS_ERR_UNKNOWN, false, "Unable to renormalise weights for photometry.");
Note: See TracChangeset for help on using the changeset viewer.