IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 27, 2009, 11:49:17 AM (17 years ago)
Author:
Paul Price
Message:

Allow convolution of images to be optional when stacking.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ppStack/src/ppStackConvolve.c

    r23341 r23573  
    3030    int num = options->num;             // Number of inputs
    3131    options->cells = psArrayAlloc(num); // Cells for convolved images --- a handle for reading again
    32     options->subKernels = psArrayAlloc(num); // Subtraction kernels --- required in the stacking
    33     options->subRegions = psArrayAlloc(num); // Subtraction regions --- required in the stacking
     32    options->kernels = psArrayAlloc(num); // PSF-matching kernels --- required in the stacking
     33    options->regions = psArrayAlloc(num); // PSF-matching regions --- required in the stacking
    3434    int numGood = 0;                    // Number of good frames
    3535    options->numCols = 0;
     
    3838    psVectorInit(options->matchChi2, NAN);
    3939    options->weightings = psVectorAlloc(num, PS_TYPE_F32); // Combination weightings for images (1/noise^2)
    40     psVectorInit(options->weightings, NAN);
     40    psVectorInit(options->weightings, 0.0);
    4141    options->covariances = psArrayAlloc(num); // Covariance matrices
    4242
     
    7878
    7979        // Background subtraction, scaling and normalisation is performed automatically by the image matching
    80         psArray *regions = NULL, *kernels = NULL; // Regions and kernels used in subtraction
    8180        psTimerStart("PPSTACK_MATCH");
    82 
    83         if (!ppStackMatch(readout, &regions, &kernels, &options->matchChi2->data.F32[i],
    84                           &options->weightings->data.F32[i], options->sourceLists->data[i],
    85                           options->psf, rng, config)) {
     81        if (!ppStackMatch(readout, options, i, config)) {
    8682            psErrorStackPrint(stderr, "Unable to match image %d --- ignoring.", i);
    87             options->inputMask->data.PS_TYPE_VECTOR_MASK_DATA[i] = PPSTACK_MASK_MATCH;
     83            options->inputMask->data.PS_TYPE_VECTOR_MASK_DATA[i] |= PPSTACK_MASK_MATCH;
    8884            psErrorClear();
    8985            continue;
     
    9288
    9389        if (options->stats) {
    94             pmSubtractionKernels *kernels = psMetadataLookupPtr(NULL, readout->analysis,
    95                                                                 PM_SUBTRACTION_ANALYSIS_KERNEL);// Conv kernel
    9690            psMetadataAddF32(options->stats, PS_LIST_TAIL, "TIME_MATCH", PS_META_DUPLICATE_OK,
    9791                             "Time to match PSF", psTimerMark("PPSTACK_MATCH"));
    98             psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.MEAN", PS_META_DUPLICATE_OK,
    99                              "Mean deviation for stamps", kernels->mean);
    100             psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.RMS", PS_META_DUPLICATE_OK,
    101                              "RMS deviation for stamps", kernels->rms);
    102             psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.NUM", PS_META_DUPLICATE_OK,
    103                              "Number of stamps", kernels->numStamps);
    104             float deconv = psMetadataLookupF32(NULL, readout->analysis,
    105                                                PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Deconvolution fraction
    106             psMetadataAddF32(options->stats, PS_LIST_TAIL, "KERNEL.DECONV", PS_META_DUPLICATE_OK,
    107                              "Deconvolution fraction for kernel", deconv);
    10892            psMetadataAddF32(options->stats, PS_LIST_TAIL, "PPSTACK.WEIGHTING", PS_META_DUPLICATE_OK,
    10993                             "Weighting for image", options->weightings->data.F32[i]);
     94
     95            if (options->convolve) {
     96                // Pull parameters out of convolution kernel
     97                pmSubtractionKernels *kernels = psMetadataLookupPtr(NULL, readout->analysis,
     98                                                                    PM_SUBTRACTION_ANALYSIS_KERNEL);
     99                psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.MEAN", PS_META_DUPLICATE_OK,
     100                                 "Mean deviation for stamps", kernels->mean);
     101                psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.RMS", PS_META_DUPLICATE_OK,
     102                                 "RMS deviation for stamps", kernels->rms);
     103                psMetadataAddF32(options->stats, PS_LIST_TAIL, "STAMP.NUM", PS_META_DUPLICATE_OK,
     104                                 "Number of stamps", kernels->numStamps);
     105                float deconv = psMetadataLookupF32(NULL, readout->analysis,
     106                                                   PM_SUBTRACTION_ANALYSIS_DECONV_MAX);
     107                psMetadataAddF32(options->stats, PS_LIST_TAIL, "KERNEL.DECONV", PS_META_DUPLICATE_OK,
     108                                 "Deconvolution fraction for kernel", deconv);
     109            }
    110110        }
    111111        psLogMsg("ppStack", PS_LOG_INFO, "Time to match image %d: %f sec", i, psTimerClear("PPSTACK_MATCH"));
    112112
    113         options->subRegions->data[i] = regions;
    114         options->subKernels->data[i] = kernels;
    115 
    116113        // Write the temporary convolved files
    117         pmHDU *hdu = readout->parent->parent->parent->hdu; // HDU for convolved image
    118         assert(hdu);
    119         ppStackWriteImage(options->imageNames->data[i], hdu->header, readout->image, config);
    120         psMetadata *maskHeader = psMetadataCopy(NULL, hdu->header); // Copy of header, for mask
    121         pmConfigMaskWriteHeader(config, maskHeader);
    122         ppStackWriteImage(options->maskNames->data[i], maskHeader, readout->mask, config);
    123         psFree(maskHeader);
    124         psImageCovarianceTransfer(readout->variance, readout->covariance);
    125         ppStackWriteImage(options->varianceNames->data[i], hdu->header, readout->variance, config);
     114        if (options->convolve) {
     115            pmHDU *hdu = readout->parent->parent->parent->hdu; // HDU for convolved image
     116            assert(hdu);
     117            ppStackWriteImage(options->imageNames->data[i], hdu->header, readout->image, config);
     118            psMetadata *maskHeader = psMetadataCopy(NULL, hdu->header); // Copy of header, for mask
     119            pmConfigMaskWriteHeader(config, maskHeader);
     120            ppStackWriteImage(options->maskNames->data[i], maskHeader, readout->mask, config);
     121            psFree(maskHeader);
     122            psImageCovarianceTransfer(readout->variance, readout->covariance);
     123            ppStackWriteImage(options->varianceNames->data[i], hdu->header, readout->variance, config);
    126124#ifdef TESTING
    127         {
    128             psString name = NULL;
    129             psStringAppend(&name, "covariance_%d.fits", i);
    130             ppStackWriteImage(name, hdu->header, readout->covariance->image, config);
    131             pmStackVisualPlotTestImage(readout->covariance->image, name);
    132             psFree(name);
    133         }
     125            {
     126                psString name = NULL;
     127                psStringAppend(&name, "covariance_%d.fits", i);
     128                ppStackWriteImage(name, hdu->header, readout->covariance->image, config);
     129                pmStackVisualPlotTestImage(readout->covariance->image, name);
     130                psFree(name);
     131            }
    134132#endif
     133        }
    135134
    136135        pmCell *inCell = readout->parent; // Input cell
     
    152151    psFree(rng);
    153152
     153    psFree(options->norm); options->norm = NULL;
    154154    psFree(options->sourceLists); options->sourceLists = NULL;
    155155    psFree(options->psf); options->psf = NULL;
Note: See TracChangeset for help on using the changeset viewer.