IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 17, 2009, 12:07:42 PM (17 years ago)
Author:
beaumont
Message:

merged with head

Location:
branches/cnb_branches/cnb_branch_20090301/psModules
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/cnb_branches/cnb_branch_20090301/psModules

  • branches/cnb_branches/cnb_branch_20090301/psModules/src/imcombine/pmSubtractionMatch.c

    r21422 r23351  
    9090}
    9191
     92// Check input arguments
     93static bool subtractionMatchCheck(pmReadout *conv1, pmReadout *conv2, // Convolved images
     94                                  const pmReadout *ro1, const pmReadout *ro2, // Input images
     95                                  int stride, // Size for convolution patches
     96                                  float sysError, // Relative systematic error
     97                                  psImageMaskType maskVal, // Value to mask for input
     98                                  psImageMaskType maskBad, // Mask for output bad pixels
     99                                  psImageMaskType maskPoor, // Mask for output poor pixels
     100                                  float poorFrac, // Fraction for "poor"
     101                                  float badFrac,   // Maximum fraction of bad input pixels to accept
     102                                  pmSubtractionMode subMode // Mode of subtraction
     103                                  )
     104{
     105    if (subMode != PM_SUBTRACTION_MODE_2) {
     106        PM_ASSERT_READOUT_NON_NULL(conv1, false);
     107        if (conv1->image) {
     108            psFree(conv1->image);
     109            conv1->image = NULL;
     110        }
     111        if (conv1->mask) {
     112            psFree(conv1->mask);
     113            conv1->mask = NULL;
     114        }
     115        if (conv1->variance) {
     116            psFree(conv1->variance);
     117            conv1->variance = NULL;
     118        }
     119    }
     120    if (subMode != PM_SUBTRACTION_MODE_1) {
     121        PM_ASSERT_READOUT_NON_NULL(conv2, false);
     122        if (conv2->image) {
     123            psFree(conv2->image);
     124            conv2->image = NULL;
     125        }
     126        if (conv2->mask) {
     127            psFree(conv2->mask);
     128            conv2->mask = NULL;
     129        }
     130        if (conv2->variance) {
     131            psFree(conv2->variance);
     132            conv2->variance = NULL;
     133        }
     134    }
     135
     136    PM_ASSERT_READOUT_NON_NULL(ro1, false);
     137    PM_ASSERT_READOUT_NON_NULL(ro2, false);
     138    PM_ASSERT_READOUT_IMAGE(ro1, false);
     139    PM_ASSERT_READOUT_IMAGE(ro2, false);
     140    PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false);
     141    PS_ASSERT_INT_NONNEGATIVE(stride, false);
     142    if (isfinite(sysError)) {
     143        PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, false);
     144        PS_ASSERT_FLOAT_LESS_THAN(sysError, 1.0, false);
     145    }
     146    // Don't care about maskVal
     147    // Don't care about maskBad
     148    // Don't care about maskPoor
     149    PS_ASSERT_FLOAT_LARGER_THAN(poorFrac, 0.0, false);
     150    PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, false);
     151    if (isfinite(badFrac)) {
     152        PS_ASSERT_FLOAT_LARGER_THAN(badFrac, 0.0, false);
     153        PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(badFrac, 1.0, false);
     154    }
     155
     156    return true;
     157}
     158
     159
     160
     161bool pmSubtractionMatchPrecalc(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2,
     162                               psMetadata *analysis, int stride, float sysError,
     163                               psImageMaskType maskVal, psImageMaskType maskBad, psImageMaskType maskPoor,
     164                               float poorFrac, float badFrac)
     165{
     166    PS_ASSERT_METADATA_NON_NULL(analysis, false);
     167
     168    // Extract the kernels
     169    pmSubtractionMode mode = PM_SUBTRACTION_MODE_UNSURE; // Subtraction mode: which image to convolve
     170    int size = 0;                       // Size of kernel
     171    psList *kernelList = psListAlloc(NULL); // List of kernels
     172    {
     173        psMetadataIterator *iter = psMetadataIteratorAlloc(analysis, PS_LIST_HEAD,
     174                                                           "^" PM_SUBTRACTION_ANALYSIS_KERNEL "$");
     175        psMetadataItem *item;               // Item from iteration
     176        while ((item = psMetadataGetAndIncrement(iter))) {
     177            if (item->type != PS_DATA_UNKNOWN) {
     178                psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unexpected type for kernel.");
     179                psFree(iter);
     180                psFree(kernelList);
     181                return false;
     182            }
     183            pmSubtractionKernels *kernel = item->data.V; // Kernel
     184            PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernel, false);
     185            size = PS_MAX(size, kernel->size);
     186            if (mode == PM_SUBTRACTION_MODE_UNSURE) {
     187                mode = kernel->mode;
     188            } else if (kernel->mode != mode) {
     189                // There's some confusion, so let's set the mode to dual convolution.
     190                // This is only used for the subtraction mask, so it's not a big deal.
     191                mode = PM_SUBTRACTION_MODE_DUAL;
     192            }
     193            psListAdd(kernelList, PS_LIST_TAIL, kernel);
     194        }
     195        psFree(iter);
     196    }
     197    if (psListLength(kernelList) == 0) {
     198        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Unable to find kernels");
     199        psFree(kernelList);
     200        return false;
     201    }
     202    psArray *kernels = psListToArray(kernelList); // Array of kernels
     203    psFree(kernelList);
     204
     205    // Extract the regions
     206    psArray *regions = psArrayAllocEmpty(kernels->n); // Array of regions
     207    {
     208        psMetadataIterator *iter = psMetadataIteratorAlloc(analysis, PS_LIST_HEAD,
     209                                                           "^" PM_SUBTRACTION_ANALYSIS_REGION "$");
     210        psMetadataItem *item;               // Item from iteration
     211        while ((item = psMetadataGetAndIncrement(iter))) {
     212            if (item->type != PS_DATA_REGION) {
     213                psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unexpected type for region.");
     214                psFree(iter);
     215                psFree(kernels);
     216                psFree(regions);
     217                return false;
     218            }
     219            psRegion *region = item->data.V; // Region
     220            psArrayAdd(regions, regions->n, region);
     221        }
     222        psFree(iter);
     223    }
     224    if (regions->n != kernels->n) {
     225        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Differing number of kernels (%ld) and regions (%ld)",
     226                kernels->n, regions->n);
     227        psFree(regions);
     228        psFree(kernels);
     229        return false;
     230    }
     231
     232    if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor,
     233                               poorFrac, badFrac, mode)) {
     234        psFree(kernels);
     235        psFree(regions);
     236        return false;
     237    }
     238
     239    psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, 0,
     240                                         badFrac, useFFT); // Subtraction mask
     241    if (!subMask) {
     242        psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask.");
     243        psFree(kernels);
     244        psFree(regions);
     245        return false;
     246    }
     247
     248    psMetadata *outAnalysis = psMetadataAlloc(); // Output analysis values
     249
     250    psTrace("psModules.imcombine", 2, "Convolving...\n");
     251    for (int i = 0; i < kernels->n; i++) {
     252        pmSubtractionKernels *kernel = kernels->data[i]; // Kernel of interest
     253        psRegion *region = regions->data[i]; // Region of interest
     254
     255        if (!pmSubtractionAnalysis(outAnalysis, kernel, region, ro1->image->numCols, ro1->image->numRows)) {
     256            psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data");
     257            psFree(outAnalysis);
     258            psFree(subMask);
     259            psFree(kernels);
     260            psFree(regions);
     261            return false;
     262        }
     263
     264        if (!pmSubtractionConvolve(conv1, conv2, ro1, ro2, subMask, stride, maskBad, maskPoor, poorFrac,
     265                                   sysError, region, kernel, true, useFFT)) {
     266            psError(PS_ERR_UNKNOWN, false, "Unable to convolve image.");
     267            psFree(outAnalysis);
     268            psFree(subMask);
     269            psFree(kernels);
     270            psFree(regions);
     271            return false;
     272        }
     273    }
     274
     275    psFree(subMask);
     276    psFree(kernels);
     277    psFree(regions);
     278
     279    if (conv1) {
     280        psMetadataCopy(conv1->analysis, outAnalysis);
     281    }
     282    if (conv2) {
     283        psMetadataCopy(conv2->analysis, outAnalysis);
     284    }
     285    psFree(outAnalysis);
     286
     287    return true;
     288}
     289
    92290
    93291bool pmSubtractionMatch(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2,
     
    101299                        psImageMaskType maskPoor, float poorFrac, float badFrac, pmSubtractionMode subMode)
    102300{
    103     if (subMode != PM_SUBTRACTION_MODE_2) {
    104         PM_ASSERT_READOUT_NON_NULL(conv1, false);
    105         if (conv1->image) {
    106             psFree(conv1->image);
    107             conv1->image = NULL;
    108         }
    109         if (conv1->mask) {
    110             psFree(conv1->mask);
    111             conv1->mask = NULL;
    112         }
    113         if (conv1->variance) {
    114             psFree(conv1->variance);
    115             conv1->variance = NULL;
    116         }
    117     }
    118     if (subMode != PM_SUBTRACTION_MODE_1) {
    119         PM_ASSERT_READOUT_NON_NULL(conv2, false);
    120         if (conv2->image) {
    121             psFree(conv2->image);
    122             conv2->image = NULL;
    123         }
    124         if (conv2->mask) {
    125             psFree(conv2->mask);
    126             conv2->mask = NULL;
    127         }
    128         if (conv2->variance) {
    129             psFree(conv2->variance);
    130             conv2->variance = NULL;
    131         }
    132     }
    133 
    134     PM_ASSERT_READOUT_NON_NULL(ro1, false);
    135     PM_ASSERT_READOUT_NON_NULL(ro2, false);
    136     PM_ASSERT_READOUT_IMAGE(ro1, false);
    137     PM_ASSERT_READOUT_IMAGE(ro2, false);
    138     PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false);
     301    if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor,
     302                               poorFrac, badFrac, subMode)) {
     303        return false;
     304    }
    139305
    140306    PS_ASSERT_INT_NONNEGATIVE(footprint, false);
    141     PS_ASSERT_INT_NONNEGATIVE(stride, false);
    142307    // regionSize can be just about anything (except maybe negative, but it can be NAN)
    143308    PS_ASSERT_FLOAT_LARGER_THAN(stampSpacing, 0.0, false);
     
    168333    PS_ASSERT_INT_POSITIVE(iter, false);
    169334    PS_ASSERT_FLOAT_LARGER_THAN(rej, 0.0, false);
    170     if (isfinite(sysError)) {
    171         PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, NULL);
    172         PS_ASSERT_FLOAT_LESS_THAN(sysError, 1.0, NULL);
    173     }
    174     // Don't care about maskVal
    175     // Don't care about maskBad
    176     // Don't care about maskPoor
    177     PS_ASSERT_FLOAT_LARGER_THAN(poorFrac, 0.0, NULL);
    178     PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, NULL);
    179     if (isfinite(badFrac)) {
    180         PS_ASSERT_FLOAT_LARGER_THAN(badFrac, 0.0, NULL);
    181         PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(badFrac, 1.0, NULL);
    182     }
    183335
    184336    // If the stamp footprint is smaller than the kernel size, then we won't get much signal in the outer
     
    214366    int numCols = ro1->image->numCols, numRows = ro1->image->numRows; // Image dimensions
    215367
    216     psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0); // Random number generator
     368    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
    217369
    218370    memCheck("start");
Note: See TracChangeset for help on using the changeset viewer.