IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 9, 2009, 2:53:12 PM (17 years ago)
Author:
Paul Price
Message:

Merging branches/pap (unconvolved stacks, reworked combinePixels function into clearer roles, only throw out most variant pixel on each iteration, throw suspect pixels out as first rejection step) stack development. I think I've got everything, but not entirely sure, since I've already merged this branch once before (for dual convolution).

Location:
trunk/ppStack
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ppStack

  • trunk/ppStack/src/ppStackCombineFinal.c

    r25096 r26076  
    1010#include "ppStackLoop.h"
    1111
    12 bool ppStackCombineFinal(ppStackThreadData *stack, ppStackOptions *options, pmConfig *config)
     12//#define TESTING                         // Enable test output
     13
     14bool ppStackCombineFinal(pmReadout *target, ppStackThreadData *stack, psArray *covariances,
     15                         ppStackOptions *options, pmConfig *config, bool safe, bool normalise)
    1316{
    1417    psAssert(stack, "Require stack");
    1518    psAssert(options, "Require options");
    1619    psAssert(config, "Require configuration");
     20
     21    if (!target->mask) {
     22        target->mask = psImageAlloc(target->image->numCols, target->image->numRows, PS_TYPE_IMAGE_MASK);
     23    }
    1724
    1825    stack->lastScan = 0;            // Reset read
     
    3037        }
    3138
    32         // call: ppStackReadoutFinal(config, outRO, readouts, rejected)
     39        // call: ppStackReadoutFinal(config, target, readouts, rejected)
    3340        psThreadJob *job = psThreadJobAlloc("PPSTACK_FINAL_COMBINE"); // Job to start
     41        psArrayAdd(job->args, 1, target);
    3442        psArrayAdd(job->args, 1, thread);
    3543        psArrayAdd(job->args, 1, options);
    3644        psArrayAdd(job->args, 1, config);
     45        PS_ARRAY_ADD_SCALAR(job->args, safe, PS_TYPE_U8);
     46        PS_ARRAY_ADD_SCALAR(job->args, normalise, PS_TYPE_U8);
    3747        if (!psThreadJobAddPending(job)) {
    3848            psFree(job);
     
    4858
    4959    // Sum covariance matrices
    50     double sumWeights = 0.0;            // Sum of weights
    51     for (int i = 0; i < options->num; i++) {
    52         if (options->inputMask->data.U8[i]) {
    53             psFree(options->covariances->data[i]);
    54             options->covariances->data[i] = NULL;
    55             continue;
     60    if (covariances) {
     61        double sumWeights = 0.0;            // Sum of weights
     62        for (int i = 0; i < options->num; i++) {
     63            if (options->inputMask->data.U8[i]) {
     64                psFree(covariances->data[i]);
     65                covariances->data[i] = NULL;
     66                continue;
     67            }
     68            psKernel *covar = covariances->data[i]; // Covariance matrix
     69            if (!covar) {
     70                continue;
     71            }
     72            float weight = options->weightings->data.F32[i]; // Weight to apply
     73            psBinaryOp(covar->image, covar->image, "*", psScalarAlloc(weight, PS_TYPE_F32));
     74            sumWeights += weight;
    5675        }
    57         psKernel *covar = options->covariances->data[i]; // Covariance matrix
    58         if (!covar) {
    59             continue;
     76        if (sumWeights > 0.0) {
     77            target->covariance = psImageCovarianceSum(covariances);
     78            psBinaryOp(target->covariance->image, target->covariance->image, "/",
     79                       psScalarAlloc(sumWeights, PS_TYPE_F32));
     80            psImageCovarianceTransfer(target->variance, target->covariance);
    6081        }
    61         float weight = options->weightings->data.F32[i]; // Weight to apply
    62         psBinaryOp(covar->image, covar->image, "*", psScalarAlloc(weight, PS_TYPE_F32));
    63         sumWeights += weight;
    64     }
    65     if (sumWeights > 0.0) {
    66         pmReadout *outRO = options->outRO;  // Output readout
    67         outRO->covariance = psImageCovarianceSum(options->covariances);
    68         psBinaryOp(outRO->covariance->image, outRO->covariance->image, "/",
    69                    psScalarAlloc(sumWeights, PS_TYPE_F32));
    70         psFree(options->covariances); options->covariances = NULL;
    71         psImageCovarianceTransfer(outRO->variance, outRO->covariance);
     82    } else {
     83        target->covariance = psImageCovarianceNone();
    7284    }
    7385
    7486#ifdef TESTING
    75     pmStackVisualPlotTestImage(outRO->image, "combined_initial.fits");
    76     ppStackWriteImage("combined_final.fits", NULL, outRO->image, config);
     87    static int pass = 0;                // Pass through
     88    psString name = NULL;               // Name of file
     89    psStringAppend(&name, "combined_image_final_%d.fits", pass);
     90    pass++;
     91    ppStackWriteImage(name, NULL, target->image, config);
     92    psStringSubstitute(&name, "mask", "image");
     93    ppStackWriteImage(name, NULL, target->mask, config);
     94    psStringSubstitute(&name, "variance", "mask");
     95    ppStackWriteImage(name, NULL, target->variance, config);
     96    psFree(name);
     97
     98    pmStackVisualPlotTestImage(target->image, "combined_image_final.fits");
    7799#endif
    78100
Note: See TracChangeset for help on using the changeset viewer.