IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 21303


Ignore:
Timestamp:
Feb 4, 2009, 5:30:57 PM (17 years ago)
Author:
Paul Price
Message:

Since calculation of covariance can take a while (getting 0.3 sec per
call, with optimised compile), only do it once!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/pap_branch_20090128/psModules/src/imcombine/pmSubtraction.c

    r21301 r21303  
    997997
    998998// XXX Put kernelImage, kernelVariance and polyValues on thread-dependent data
    999 static bool subtractionConvolvePatch(psKernel **covar1, psKernel **covar2, // Covariance matrices
    1000                                      int numCols, int numRows, // Size of image
     999static bool subtractionConvolvePatch(int numCols, int numRows, // Size of image
    10011000                                     int x0, int y0, // Offsets for image
    10021001                                     pmReadout *out1, pmReadout *out2, // Output readouts
     
    10311030                       ro1->image, ro1->variance, sys1, subMask, kernels, polyValues, background, *region,
    10321031                       maskBad, maskPoor, poorFrac, useFFT, false);
    1033         *covar1 = psImageCovarianceCalculate(kernelImage, ro1->covariance);
    10341032    }
    10351033    if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) {
     
    10371035                       ro2->image, ro2->variance, sys2, subMask, kernels, polyValues, background, *region,
    10381036                       maskBad, maskPoor, poorFrac, useFFT, kernels->mode == PM_SUBTRACTION_MODE_DUAL);
    1039         *covar2 = psImageCovarianceCalculate(kernelImage, ro2->covariance);
    10401037    }
    10411038
     
    10931090    bool useFFT = PS_SCALAR_VALUE(args->data[18], PS_TYPE_IMAGE_MASK_DATA); // Use FFT for convolution?
    10941091
    1095     psKernel *covar1 = NULL, *covar2 = NULL; // Covariance matrices to return
    1096 
    1097     if (!subtractionConvolvePatch(&covar1, &covar2, numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2,
    1098                                   sys1, sys2, subMask, maskBad, maskPoor, poorFrac, region, kernels, doBG,
    1099                                   useFFT)) {
    1100         return false;
    1101     }
    1102     job->results = psArrayAlloc(2);
    1103     job->results->data[0] = covar1;
    1104     job->results->data[1] = covar2;
    1105 
    1106     return true;
     1092    return subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, sys1, sys2,
     1093                                    subMask, maskBad, maskPoor, poorFrac, region, kernels, doBG, useFFT);
    11071094}
    11081095
     
    12641251        stride = 2 * size + 1;
    12651252    }
    1266 
    1267     psList *covariances1 = psListAlloc(NULL), *covariances2 = psListAlloc(NULL); // List of covariances
    12681253
    12691254    for (int j = yMin; j < yMax; j += stride) {
     
    13211306                psFree(job);
    13221307            } else {
    1323                 psKernel *covar1 = NULL, *covar2 = NULL; // Covariance matrices
    1324                 subtractionConvolvePatch(&covar1, &covar2, numCols, numRows, x0, y0, out1, out2, convMask,
    1325                                          ro1, ro2, sys1, sys2, subMask, maskBad, maskPoor, poorFrac,
    1326                                          subRegion, kernels, doBG, useFFT);
    1327                 if (covar1) {
    1328                     psListAdd(covariances1, PS_LIST_TAIL, covar1);
    1329                 }
    1330                 if (covar2) {
    1331                     psListAdd(covariances2, PS_LIST_TAIL, covar2);
    1332                 }
    1333                 psFree(covar1);
    1334                 psFree(covar2);
     1308                subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, sys1, sys2,
     1309                                         subMask, maskBad, maskPoor, poorFrac, subRegion, kernels, doBG,
     1310                                         useFFT);
    13351311            }
    13361312            psFree(subRegion);
     
    13521328            psAssert(strcmp(job->type, "PSMODULES_SUBTRACTION_CONVOLVE") == 0,
    13531329                     "Job has incorrect type: %s", job->type);
    1354             psAssert(job->results->n == 2, "Job has insufficient results: %ld", job->results->n);
    1355             if (job->results->data[0]) {
    1356                 psListAdd(covariances1, PS_LIST_TAIL, job->results->data[0]);
    1357             }
    1358             if (job->results->data[1]) {
    1359                 psListAdd(covariances2, PS_LIST_TAIL, job->results->data[1]);
    1360             }
    13611330            psFree(job);
    13621331        }
     
    13771346    psFree(sys2);
    13781347
    1379     if (psListLength(covariances1) > 0) {
    1380         psArray *covar = psListToArray(covariances1);
    1381         out1->covariance = psImageCovarianceAverage(covar);
    1382         psFree(covar);
    1383     }
    1384     if (psListLength(covariances2) > 0) {
    1385         psArray *covar = psListToArray(covariances2);
    1386         out2->covariance = psImageCovarianceAverage(covar);
    1387         psFree(covar);
    1388     }
    1389     psFree(covariances1);
    1390     psFree(covariances2);
     1348    // Calculate covariances
     1349    // This can take a while, so we only do it for a single instance
     1350    // XXX psImageCovarianceCalculate could be multithreaded
     1351    if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) {
     1352        psKernel *kernel = pmSubtractionKernel(kernels, 0.0, 0.0, false); // Convolution kernel
     1353        out1->covariance = psImageCovarianceCalculate(kernel, ro1->covariance);
     1354        psFree(kernel);
     1355    }
     1356    if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) {
     1357        psKernel *kernel = pmSubtractionKernel(kernels, 0.0, 0.0,
     1358                                               kernels->mode == PM_SUBTRACTION_MODE_DUAL); // Conv. kernel
     1359        out2->covariance = psImageCovarianceCalculate(kernel, ro2->covariance);
     1360        psFree(kernel);
     1361    }
    13911362
    13921363    // Copy anything that wasn't convolved
     
    13971368            out2->variance = psMemIncrRefCounter(ro2->variance);
    13981369            out2->mask = psMemIncrRefCounter(ro2->mask);
     1370            out2->covariance = psMemIncrRefCounter(ro2->covariance);
    13991371        }
    14001372        break;
     
    14041376            out1->variance = psMemIncrRefCounter(ro1->variance);
    14051377            out1->mask = psMemIncrRefCounter(ro1->mask);
     1378            out1->covariance = psMemIncrRefCounter(ro1->covariance);
    14061379        }
    14071380        break;
Note: See TracChangeset for help on using the changeset viewer.