IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 10, 2008, 1:54:33 PM (18 years ago)
Author:
Paul Price
Message:

Adding new file with function to add stuff to a common 'analysis' metadata container which is applied to the convolved outputs when done.

File:
1 edited

Legend:

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

    r19532 r20049  
    1515#include "pmSubtractionEquation.h"
    1616#include "pmSubtraction.h"
     17#include "pmSubtractionAnalysis.h"
    1718#include "pmSubtractionMask.h"
    1819#include "pmSubtractionThreads.h"
     
    2021
    2122
    22 #define KERNEL_MOSAIC 2                 // Half-number of kernel instances in the mosaic image
    2323#define BG_STAT PS_STAT_ROBUST_MEDIAN   // Statistic to use for background
    2424
     
    9191
    9292
    93 // Record the variance factor in a readout
    94 static bool recordVarianceFactor(pmReadout *ro, // Readout of interest
    95                                  float varFactor, // Variance factor
    96                                  const psRegion *region // Region of interest
    97                                  )
    98 {
    99     if (region) {
    100         varFactor *= (region->x1 - region->x0 + 1) * (region->y1 - region->y0 + 1) /
    101             (ro->image->numCols * ro->image->numRows);
    102     }
    103 
    104     psMetadataItem *vfItem = psMetadataLookup(ro->analysis, PM_SUBTRACTION_ANALYSIS_VARFACTOR);
    105     if (vfItem) {
    106         psAssert(vfItem->type == PS_TYPE_F32, "Should be the type we said.");
    107         vfItem->data.F32 += varFactor;
    108     } else {
    109         psMetadataAddF32(ro->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_VARFACTOR, 0,
    110                          "Variance factor weighted by the area", varFactor);
    111     }
    112 
    113     return true;
    114 }
    115 
    11693bool pmSubtractionMatch(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2,
    11794                        int footprint, float regionSize, float stampSpacing, float threshold,
     
    254231    }
    255232
     233    psMetadata *analysis = psMetadataAlloc(); // QA data
     234
    256235    // Iterate over iso-kernel regions
    257236    for (int j = 0; j < yRegions; j++) {
     
    338317            }
    339318
    340             // Add analysis metadata
    341             {
    342                 psRegion *subRegion;    // Region over which subtraction was performed
    343                 if (region) {
    344                     subRegion = psMemIncrRefCounter(region);
    345                 } else {
    346                     subRegion = psRegionAlloc(0, numCols, 0, numRows);
    347                 }
    348 
    349                 if (subMode == PM_SUBTRACTION_MODE_1 || subMode == PM_SUBTRACTION_MODE_DUAL) {
    350                     psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL,
    351                                      PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);
    352                     psMetadataAddS32(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,
    353                                      PS_META_DUPLICATE_OK, "Subtraction kernels", subMode);
    354                     psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION,
    355                                      PS_DATA_REGION | PS_META_DUPLICATE_OK,
    356                                      "Region over which subtraction was performed", subRegion);
    357                 }
    358                 if (subMode == PM_SUBTRACTION_MODE_2 || subMode == PM_SUBTRACTION_MODE_DUAL) {
    359                     psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL,
    360                                      PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);
    361                     psMetadataAddS32(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,
    362                                      PS_META_DUPLICATE_OK, "Subtraction kernels", subMode);
    363                     psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION,
    364                                      PS_DATA_REGION | PS_META_DUPLICATE_OK,
    365                                      "Region over which subtraction was performed", subRegion);
    366                 }
    367                 psFree(subRegion);
    368             }
    369 
    370319            memCheck("kernels");
    371320
     
    435384            memCheck("solution");
    436385
    437             {
    438                 psTrace("psModules.imcombine", 2, "Generating diagnostics...\n");
    439                 // Generate image with convolution kernels
    440                 int fullSize = 2 * size + 1 + 1;    // Full size of kernel
    441                 int imageSize = (2 * KERNEL_MOSAIC + 1) * fullSize;
    442                 psImage *convKernels = psImageAlloc((subMode == PM_SUBTRACTION_MODE_DUAL ? 2 : 1) *
    443                                                     imageSize - 1 +
    444                                                     (subMode == PM_SUBTRACTION_MODE_DUAL ? 4 : 0),
    445                                                     imageSize - 1, PS_TYPE_F32);
    446                 psImageInit(convKernels, NAN);
    447                 for (int j = -KERNEL_MOSAIC; j <= KERNEL_MOSAIC; j++) {
    448                     for (int i = -KERNEL_MOSAIC; i <= KERNEL_MOSAIC; i++) {
    449                         psImage *kernel = pmSubtractionKernelImage(kernels, (float)i / (float)KERNEL_MOSAIC,
    450                                                                    (float)j / (float)KERNEL_MOSAIC,
    451                                                                    false); // Image of the kernel
    452                         if (!kernel) {
    453                             psError(PS_ERR_UNKNOWN, false, "Unable to generate kernel image.");
    454                             psFree(convKernels);
    455                             goto MATCH_ERROR;
    456                         }
    457 
    458                         if (psImageOverlaySection(convKernels, kernel, (i + KERNEL_MOSAIC) * fullSize,
    459                                                   (j + KERNEL_MOSAIC) * fullSize, "=") == 0) {
    460                             psError(PS_ERR_UNKNOWN, false, "Unable to overlay kernel image.");
    461                             psFree(kernel);
    462                             psFree(convKernels);
    463                             goto MATCH_ERROR;
    464                         }
    465                         psFree(kernel);
    466 
    467                         if (subMode == PM_SUBTRACTION_MODE_DUAL) {
    468                             kernel = pmSubtractionKernelImage(kernels, (float)i / (float)KERNEL_MOSAIC,
    469                                                               (float)j / (float)KERNEL_MOSAIC,
    470                                                               true); // Image of the kernel
    471                             if (!kernel) {
    472                                 psError(PS_ERR_UNKNOWN, false, "Unable to generate kernel image.");
    473                                 psFree(convKernels);
    474                                 goto MATCH_ERROR;
    475                             }
    476 
    477                             if (psImageOverlaySection(convKernels, kernel,
    478                                                       (2 * KERNEL_MOSAIC + 1 + i + KERNEL_MOSAIC) * fullSize +
    479                                                       4,
    480                                                       (j + KERNEL_MOSAIC) * fullSize, "=") == 0) {
    481                                 psError(PS_ERR_UNKNOWN, false, "Unable to overlay kernel image.");
    482                                 psFree(kernel);
    483                                 psFree(convKernels);
    484                                 goto MATCH_ERROR;
    485                             }
    486                             psFree(kernel);
    487                         }
    488 
    489                     }
    490                 }
    491 
    492                 psString comment = NULL; // Comment for metadata
    493                 psStringAppend(&comment, "Subtraction kernel for region %s", regionString);
    494                 psMetadataAddImage(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.KERNEL.IMAGE",
    495                                    PS_META_DUPLICATE_OK, comment, convKernels);
    496                 psFree(comment);
    497                 psFree(convKernels);
    498             }
    499 
    500 #if 0
    501             {
    502                 // Generate images of the kernel components
    503                 psMetadata *header = psMetadataAlloc(); // Header
    504                 for (int i = 0; i < solution->n; i++) {
    505                     psString name = NULL;       // Header keyword
    506                     psStringAppend(&name, "SOLN%04d", i);
    507                     psMetadataAddF64(header, PS_LIST_TAIL, name, 0, NULL, solution->data.F64[i]);
    508                     psFree(name);
    509                 }
    510                 psArray *kernelImages = pmSubtractionKernelSolutions(solution, kernels, 0.0, 0.0);
    511                 psFits *kernelFile = psFitsOpen("kernels.fits", "w");
    512                 (void)psFitsWriteImageCube(kernelFile, header, kernelImages, NULL);
    513                 psFitsClose(kernelFile);
    514                 psFree(kernelImages);
    515                 psFree(header);
    516             }
    517 #endif
     386            if (!pmSubtractionAnalysis(analysis, kernels, region, numCols, numRows)) {
     387                psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data");
     388                goto MATCH_ERROR;
     389            }
    518390
    519391            memCheck("diag outputs");
     
    524396                psError(PS_ERR_UNKNOWN, false, "Unable to convolve image.");
    525397                goto MATCH_ERROR;
    526             }
    527 
    528             // Set the variance factors
    529             switch (subMode) {
    530               case PM_SUBTRACTION_MODE_1: {
    531                   recordVarianceFactor(conv1, pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false),
    532                                        region);
    533                   break;
    534               }
    535               case PM_SUBTRACTION_MODE_2:
    536                 recordVarianceFactor(conv1, pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false),
    537                                      region);
    538                 break;
    539               case PM_SUBTRACTION_MODE_DUAL:
    540                 recordVarianceFactor(conv1, pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false),
    541                                      region);
    542                 recordVarianceFactor(conv2, pmSubtractionVarianceFactor(kernels, 0.5, 0.5, true),
    543                                      region);
    544                 break;
    545               default:
    546                 psAbort("Should never reach here.");
    547398            }
    548399
     
    583434    memCheck("convolution");
    584435
     436    if (conv1) {
     437        psMetadataCopy(conv1->analysis, analysis);
     438    }
     439    if (conv2) {
     440        psMetadataCopy(conv2->analysis, analysis);
     441    }
     442    psFree(analysis);
    585443
    586444#ifdef TESTING
     
    603461
    604462MATCH_ERROR:
     463    psFree(analysis);
    605464    psFree(region);
    606465    psFree(regionString);
Note: See TracChangeset for help on using the changeset viewer.