IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 25060


Ignore:
Timestamp:
Aug 12, 2009, 6:51:33 PM (17 years ago)
Author:
Paul Price
Message:

Put analysis metadata into header as well, useful for conveying quality information to clients.

Location:
trunk/psModules/src/imcombine
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/imcombine/pmSubtractionAnalysis.c

    r25044 r25060  
    1717
    1818
    19 bool pmSubtractionAnalysis(psMetadata *analysis, pmSubtractionKernels *kernels, psRegion *region,
     19bool pmSubtractionAnalysis(psMetadata *analysis, psMetadata *header,
     20                           pmSubtractionKernels *kernels, psRegion *region,
    2021                           int numCols, int numRows)
    2122{
    22     if (analysis) {
    23         PS_ASSERT_METADATA_NON_NULL(analysis, false);
    24     }
     23    PS_ASSERT_METADATA_NON_NULL(analysis, false);
     24    PS_ASSERT_METADATA_NON_NULL(header, false);
    2525    PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernels, false);
    2626    PM_ASSERT_SUBTRACTION_KERNELS_SOLUTION(kernels, false);
     
    3838                         PS_DATA_REGION | PS_META_DUPLICATE_OK,
    3939                         "Region over which subtraction was performed", subRegion);
     40
     41        psString string = psRegionToString(*subRegion);
    4042        psFree(subRegion);
     43
     44        psMetadataAddPtr(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION,
     45                         PS_DATA_REGION | PS_META_DUPLICATE_OK,
     46                         "Region over which subtraction was performed", string);
     47        psFree(string);
    4148    }
    4249
     
    4552                     PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);
    4653    psMetadataAddS32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,
    47                      PS_META_DUPLICATE_OK, "Subtraction kernels", kernels->mode);
     54                     PS_META_DUPLICATE_OK, "Subtraction mode", kernels->mode);
     55    psMetadataAddS32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,
     56                     PS_META_DUPLICATE_OK, "Subtraction mode", kernels->mode);
    4857
    4958    // Realisations of kernel
     
    163172        psFree(image);
    164173
    165         psMetadataItem *item = psMetadataLookup(analysis, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous
    166         if (item) {
    167             item->data.F32 = PS_MAX(item->data.F32, max);
    168         } else {
    169             psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0,
    170                              "Maximum deconvolution fraction", max);
     174        {
     175            psMetadataItem *item = psMetadataLookup(analysis, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous
     176            if (item) {
     177                max = item->data.F32 = PS_MAX(item->data.F32, max);
     178            } else {
     179                psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0,
     180                                 "Maximum deconvolution fraction", max);
     181            }
     182        }
     183
     184        {
     185            psMetadataItem *item = psMetadataLookup(header, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous
     186            if (item) {
     187                item->data.F32 = max;
     188            } else {
     189                psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0,
     190                                 "Maximum deconvolution fraction", max);
     191            }
    171192        }
    172193    }
     
    216237        psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MYY,
    217238                         PS_META_DUPLICATE_OK, "Moment in yy", m02);
     239
     240        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_NORM,
     241                         PS_META_DUPLICATE_OK, "Normalisation", m00);
     242        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MX,
     243                         PS_META_DUPLICATE_OK, "Moment in x", m10);
     244        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MY,
     245                         PS_META_DUPLICATE_OK, "Moment in y", m01);
     246        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MXX,
     247                         PS_META_DUPLICATE_OK, "Moment in xx", m20);
     248        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MXY,
     249                         PS_META_DUPLICATE_OK, "Moment in xy", m11);
     250        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MYY,
     251                         PS_META_DUPLICATE_OK, "Moment in yy", m02);
    218252    }
    219253
     
    225259
    226260        psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_BGDIFF,
     261                         PS_META_DUPLICATE_OK, "Background difference", bg);
     262        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_BGDIFF,
    227263                         PS_META_DUPLICATE_OK, "Background difference", bg);
    228264        psFree(polyValues);
     
    237273        psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_RMS, 0, "RMS stamp deviation",
    238274                         kernels->rms);
     275
     276        psMetadataAddS32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_STAMPS, 0, "Number of stamps",
     277                         kernels->numStamps);
     278        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_MEAN, 0, "Mean stamp deviation",
     279                         kernels->mean);
     280        psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_RMS, 0, "RMS stamp deviation",
     281                         kernels->rms);
    239282    }
    240283
  • trunk/psModules/src/imcombine/pmSubtractionAnalysis.h

    r21149 r25060  
    2727bool pmSubtractionAnalysis(
    2828    psMetadata *analysis,               ///< Metadata container for QA information
     29    psMetadata *header,                 ///< Metadata container for QA information to put in header
    2930    pmSubtractionKernels *kernels,      ///< Kernels
    3031    psRegion *region,                   ///< Region for subtraction
  • trunk/psModules/src/imcombine/pmSubtractionMatch.c

    r24292 r25060  
    1010#include "pmHDU.h"
    1111#include "pmFPA.h"
     12#include "pmHDUUtils.h"
    1213#include "pmSubtractionParams.h"
    1314#include "pmSubtractionKernels.h"
     
    5859
    5960
    60 static bool getStamps(pmSubtractionStampList **stamps, // Stamps to read
    61                       const pmReadout *ro1, // Readout 1
    62                       const pmReadout *ro2, // Readout 2
    63                       const psImage *subMask, // Mask for subtraction, or NULL
    64                       psImage *variance,  // Variance map
    65                       const psRegion *region, // Region of interest, or NULL
    66                       float thresh1,  // Threshold for stamp finding on readout 1
    67                       float thresh2,  // Threshold for stamp finding on readout 2
    68                       float stampSpacing, // Spacing between stamps
    69                       int size,         // Kernel half-size
    70                       int footprint,     // Convolution footprint for stamps
    71                       pmSubtractionMode mode // Mode for subtraction
     61static bool subtractionGetStamps(pmSubtractionStampList **stamps, // Stamps to read
     62                                 const pmReadout *ro1, // Readout 1
     63                                 const pmReadout *ro2, // Readout 2
     64                                 const psImage *subMask, // Mask for subtraction, or NULL
     65                                 psImage *variance,  // Variance map
     66                                 const psRegion *region, // Region of interest, or NULL
     67                                 float thresh1,  // Threshold for stamp finding on readout 1
     68                                 float thresh2,  // Threshold for stamp finding on readout 2
     69                                 float stampSpacing, // Spacing between stamps
     70                                 int size,         // Kernel half-size
     71                                 int footprint,     // Convolution footprint for stamps
     72                                 pmSubtractionMode mode // Mode for subtraction
    7273    )
    7374{
     
    163164}
    164165
     166static void subtractionAnalysisUpdate(pmReadout *conv1, pmReadout *conv2, // Convolved images
     167                                      const psMetadata *analysis, // Analysis metadata
     168                                      const psMetadata *header // Header metadata
     169    )
     170{
     171    if (conv1) {
     172        conv1->analysis = psMetadataCopy(conv1->analysis, analysis);
     173    }
     174    if (conv2) {
     175        conv2->analysis = psMetadataCopy(conv2->analysis, analysis);
     176    }
     177
     178    if (conv1 && conv1->parent) {
     179        pmHDU *hdu = pmHDUFromCell(conv1->parent);
     180        if (hdu) {
     181            hdu->header = psMetadataCopy(hdu->header, header);
     182        }
     183    }
     184    if (conv2 && conv2->parent) {
     185        pmHDU *hdu = pmHDUFromCell(conv2->parent);
     186        if (hdu) {
     187            hdu->header = psMetadataCopy(hdu->header, header);
     188        }
     189    }
     190
     191    return;
     192}
    165193
    166194
     
    253281
    254282    psMetadata *outAnalysis = psMetadataAlloc(); // Output analysis values
     283    psMetadata *outHeader = psMetadataAlloc(); // Output header values
    255284
    256285    psTrace("psModules.imcombine", 2, "Convolving...\n");
     
    259288        psRegion *region = regions->data[i]; // Region of interest
    260289
    261         if (!pmSubtractionAnalysis(outAnalysis, kernel, region, ro1->image->numCols, ro1->image->numRows)) {
     290        if (!pmSubtractionAnalysis(outAnalysis, outHeader, kernel, region,
     291                                   ro1->image->numCols, ro1->image->numRows)) {
    262292            psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data");
    263293            psFree(outAnalysis);
     294            psFree(outHeader);
    264295            psFree(subMask);
    265296            psFree(kernels);
     
    272303            psError(PS_ERR_UNKNOWN, false, "Unable to convolve image.");
    273304            psFree(outAnalysis);
     305            psFree(outHeader);
    274306            psFree(subMask);
    275307            psFree(kernels);
     
    283315    psFree(regions);
    284316
    285     if (conv1) {
    286         psMetadataCopy(conv1->analysis, outAnalysis);
    287     }
    288     if (conv2) {
    289         psMetadataCopy(conv2->analysis, outAnalysis);
    290     }
     317    subtractionAnalysisUpdate(conv1, conv2, outAnalysis, outHeader);
    291318    psFree(outAnalysis);
     319    psFree(outHeader);
    292320
    293321    return true;
     
    369397    pmSubtractionKernels *kernels = NULL; // Kernel basis functions
    370398    psMetadata *analysis = psMetadataAlloc(); // QA data
     399    psMetadata *header = psMetadataAlloc(); // QA data for header
    371400
    372401    int numCols = ro1->image->numCols, numRows = ro1->image->numRows; // Image dimensions
     
    442471            // We get the stamps here; we will also attempt to get stamps at the first iteration, but it
    443472            // doesn't matter.
    444             if (!getStamps(&stamps, ro1, ro2, subMask, variance, NULL, stampThresh1, stampThresh2,
     473            if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, NULL, stampThresh1, stampThresh2,
    445474                           stampSpacing, size, footprint, subMode)) {
    446475                goto MATCH_ERROR;
     
    504533                psLogMsg("psModules.imcombine", PS_LOG_INFO, "Iteration %d.", k);
    505534
    506                 if (!getStamps(&stamps, ro1, ro2, subMask, variance, region, stampThresh1, stampThresh2,
    507                                stampSpacing, size, footprint, subMode)) {
     535                if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, region,
     536                                          stampThresh1, stampThresh2, stampSpacing,
     537                                          size, footprint, subMode)) {
    508538                    goto MATCH_ERROR;
    509539                }
     
    565595            memCheck("solution");
    566596
    567             if (!pmSubtractionAnalysis(analysis, kernels, region, numCols, numRows)) {
     597            if (!pmSubtractionAnalysis(analysis, header, kernels, region, numCols, numRows)) {
    568598                psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data");
    569599                goto MATCH_ERROR;
     
    601631    memCheck("convolution");
    602632
    603     if (conv1) {
    604         psMetadataCopy(conv1->analysis, analysis);
    605     }
    606     if (conv2) {
    607         psMetadataCopy(conv2->analysis, analysis);
    608     }
     633    subtractionAnalysisUpdate(conv1, conv2, analysis, header);
    609634    psFree(analysis);
     635    psFree(header);
    610636
    611637#ifdef TESTING
     
    629655MATCH_ERROR:
    630656    psFree(analysis);
     657    psFree(header);
    631658    psFree(region);
    632659    psFree(regionString);
Note: See TracChangeset for help on using the changeset viewer.