IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 3, 2010, 8:41:49 AM (16 years ago)
Author:
eugene
Message:

updates from trunk

Location:
branches/tap_branches
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/tap_branches

  • branches/tap_branches/ppStack/src

    • Property svn:ignore
      •  

        old new  
        1010stamp-h1
        1111ppStackVersionDefinitions.h
         12ppStackErrorCodes.c
         13ppStackErrorCodes.h
  • branches/tap_branches/ppStack/src/ppStackMatch.c

    r25467 r27838  
    1818#define COVAR_FRAC 0.01                 // Truncation fraction for covariance matrix
    1919
    20 //#define TESTING                         // Enable debugging output
     20// #define TESTING                         // Enable debugging output
    2121
    2222#ifdef TESTING
     
    3131    psFree(resolved);
    3232    if (!fits) {
    33         psError(PS_ERR_IO, false, "Unable to open previously produced image: %s", name);
     33        psError(PPSTACK_ERR_IO, false, "Unable to open previously produced image: %s", name);
    3434        return false;
    3535    }
    3636    psImage *image = psFitsReadImage(fits, psRegionSet(0,0,0,0), 0); // Image of interest
    3737    if (!image) {
    38         psError(PS_ERR_IO, false, "Unable to read previously produced image: %s", name);
     38        psError(PPSTACK_ERR_IO, false, "Unable to read previously produced image: %s", name);
    3939        psFitsClose(fits);
    4040        return false;
     
    115115    psFree(coords);
    116116    psFree(tree);
     117    psFree(x);
     118    psFree(y);
    117119
    118120    psLogMsg("ppStack", PS_LOG_INFO, "Filtered out %d of %d sources", numFiltered, numGood);
     
    144146    psMetadataAddU8(psphotRecipe, PS_LIST_TAIL, "MASK.PSPHOT", PS_META_REPLACE, "user-defined mask", maskBad);
    145147
    146     psImage *binned = psphotBackgroundModel(ro, config); // Binned background model
     148    psImage *binned = psphotModelBackgroundReadoutNoFile(ro, config); // Binned background model
    147149    psImageBinning *binning = psMetadataLookupPtr(NULL, ro->analysis,
    148150                                                  "PSPHOT.BACKGROUND.BINNING"); // Binning for model
     
    150152    psImage *unbinned = psImageAlloc(numCols, numRows, PS_TYPE_F32); // Unbinned background model
    151153    if (!psImageUnbin(unbinned, binned, binning)) {
    152         psError(PS_ERR_UNKNOWN, false, "Unable to unbin background model");
     154        psError(PPSTACK_ERR_DATA, false, "Unable to unbin background model");
     155        psFree(binned);
    153156        psFree(unbinned);
    154157        return NULL;
    155158    }
    156 
    157     // XXX should these really be here?? (probably not...)
    158     // pmFPAfileDropInternal(config->files, "PSPHOT.BACKMDL");
    159     // pmFPAfileDropInternal(config->files, "PSPHOT.BACKMDL.STDEV");
    160 
    161      return unbinned;
     159    psFree(binned);
     160
     161    return unbinned;
    162162}
    163163
     
    167167    )
    168168{
     169#if 1
    169170    bool mdok; // Status of metadata lookups
    170171
     
    176177    int num = psMetadataLookupS32(&mdok, recipe, "RENORM.NUM");
    177178    if (!mdok) {
    178         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "RENORM.NUM is not set in the recipe");
     179        psError(PPSTACK_ERR_CONFIG, true, "RENORM.NUM is not set in the recipe");
    179180        return false;
    180181    }
    181182    float minValid = psMetadataLookupF32(&mdok, recipe, "RENORM.MIN");
    182183    if (!mdok) {
    183         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "RENORM.MIN is not set in the recipe");
     184        psError(PPSTACK_ERR_CONFIG, true, "RENORM.MIN is not set in the recipe");
    184185        return false;
    185186    }
    186187    float maxValid = psMetadataLookupF32(&mdok, recipe, "RENORM.MAX");
    187188    if (!mdok) {
    188         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "RENORM.MAX is not set in the recipe");
     189        psError(PPSTACK_ERR_CONFIG, true, "RENORM.MAX is not set in the recipe");
    189190        return false;
    190191    }
     
    192193    psImageMaskType maskBad = pmConfigMaskGet("BLANK", config); // Bits to mask
    193194
     195    psImageCovarianceTransfer(readout->variance, readout->covariance);
    194196    return pmReadoutVarianceRenormalise(readout, maskBad, num, minValid, maxValid);
     197#else
     198    return true;
     199#endif
    195200}
    196201
     
    212217    int size = psMetadataLookupS32(NULL, ppsub, "KERNEL.SIZE"); // Kernel half-size
    213218
    214     psString maskValStr = psMetadataLookupStr(NULL, recipe, "MASK.VAL"); // Name of bits to mask going in
     219    psString maskValStr = psMetadataLookupStr(NULL, ppsub, "MASK.VAL"); // Name of bits to mask going in
    215220    psImageMaskType maskVal = pmConfigMaskGet(maskValStr, config); // Bits to mask going in to pmSubtractionMatch
    216221    psString maskPoorStr = psMetadataLookupStr(NULL, recipe, "MASK.POOR"); // Name of bits to mask for poor
     
    224229
    225230    if (!pmReadoutMaskNonfinite(readout, maskVal)) {
    226         psError(PS_ERR_UNKNOWN, false, "Unable to mask non-finite pixels in readout.");
     231        psError(psErrorCodeLast(), false, "Unable to mask non-finite pixels in readout.");
    227232        return false;
    228233    }
     
    251256            psFree(resolved);
    252257            if (!fits || !pmReadoutReadSubtractionKernels(conv, fits)) {
    253                 psError(PS_ERR_IO, false, "Unable to read previously produced kernel");
     258                psError(PPSTACK_ERR_IO, false, "Unable to read previously produced kernel");
    254259                psFitsClose(fits);
    255260                return false;
     
    257262            psFitsClose(fits);
    258263
    259             if (!readImage(&readout->image, options->imageNames->data[index], config) ||
    260                 !readImage(&readout->mask, options->maskNames->data[index], config) ||
    261                 !readImage(&readout->variance, options->varianceNames->data[index], config)) {
    262                 psError(PS_ERR_IO, false, "Unable to read previously produced image.");
     264            if (!readImage(&readout->image, options->convImages->data[index], config) ||
     265                !readImage(&readout->mask, options->convMasks->data[index], config) ||
     266                !readImage(&readout->variance, options->convVariances->data[index], config)) {
     267                psError(PPSTACK_ERR_IO, false, "Unable to read previously produced image.");
    263268                return false;
    264269            }
     
    269274                                                                PM_SUBTRACTION_ANALYSIS_KERNEL);
    270275
    271             pmSubtractionAnalysis(readout->analysis, NULL, kernels, region,
     276            pmSubtractionAnalysis(conv->analysis, NULL, kernels, region,
    272277                                  readout->image->numCols, readout->image->numRows);
    273278
    274279            psKernel *kernel = pmSubtractionKernel(kernels, 0.0, 0.0, false); // Convolution kernel
     280            bool oldThreads = psImageCovarianceSetThreads(true);              // Old thread setting
    275281            psKernel *covar = psImageCovarianceCalculate(kernel, readout->covariance); // Covariance matrix
     282            psImageCovarianceSetThreads(oldThreads);
    276283            psFree(readout->covariance);
    277284            readout->covariance = covar;
     
    292299            int iter = psMetadataLookupS32(NULL, ppsub, "ITER"); // Rejection iterations
    293300            float rej = psMetadataLookupF32(NULL, ppsub, "REJ"); // Rejection threshold
    294             float sysError = psMetadataLookupF32(NULL, ppsub, "SYS"); // Relative systematic error in kernel
     301            float kernelError = psMetadataLookupF32(NULL, ppsub, "KERNEL.ERR"); // Relative systematic error in kernel
     302            float normFrac = psMetadataLookupF32(NULL, ppsub, "NORM.FRAC"); // Fraction of window for normalisn windw
     303            float sysError = psMetadataLookupF32(NULL, ppsub, "SYS.ERR"); // Relative systematic error in images
     304            float skyErr = psMetadataLookupF32(NULL, ppsub, "SKY.ERR"); // Additional error in sky
     305            float covarFrac = psMetadataLookupF32(NULL, ppsub, "COVAR.FRAC"); // Fraction for covariance calculation
     306
    295307            const char *typeStr = psMetadataLookupStr(NULL, ppsub, "KERNEL.TYPE"); // Kernel type
    296308            pmSubtractionKernelsType type = pmSubtractionKernelsTypeFromString(typeStr); // Kernel type
     
    309321            float poorFrac = psMetadataLookupF32(&mdok, ppsub, "POOR.FRACTION"); // Fraction for "poor"
    310322
     323            bool scale = psMetadataLookupBool(NULL, ppsub, "SCALE");        // Scale kernel parameters?
     324            float scaleRef = psMetadataLookupF32(NULL, ppsub, "SCALE.REF"); // Reference for scaling
     325            float scaleMin = psMetadataLookupF32(NULL, ppsub, "SCALE.MIN"); // Minimum for scaling
     326            float scaleMax = psMetadataLookupF32(NULL, ppsub, "SCALE.MAX"); // Maximum for scaling
     327            if (!isfinite(scaleRef) || !isfinite(scaleMin) || !isfinite(scaleMax)) {
     328                psError(PPSTACK_ERR_CONFIG, false,
     329                        "Scale parameters (SCALE.REF=%f, SCALE.MIN=%f, SCALE.MAX=%f) not set in PPSUB recipe.",
     330                        scaleRef, scaleMin, scaleMax);
     331                return false;
     332            }
     333
     334
    311335            // These values are specified specifically for stacking
    312336            const char *stampsName = psMetadataLookupStr(NULL, config->arguments, "STAMPS");// Stamps filename
     
    322346            psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
    323347            if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskVal | maskBad, rng)) {
    324                 psError(PS_ERR_UNKNOWN, false, "Can't measure background for image.");
     348                psError(PPSTACK_ERR_DATA, false, "Can't measure background for image.");
    325349                psFree(fake);
    326350                psFree(optWidths);
     
    338362                                                       footprint); // Filtered list of sources
    339363
     364            bool oldThreads = pmReadoutFakeThreads(true); // Old threading state
    340365            if (!pmReadoutFakeFromSources(fake, readout->image->numCols, readout->image->numRows,
    341366                                          stampSources, SOURCE_MASK, NULL, NULL, options->psf,
    342367                                          minFlux, footprint + size, false, true)) {
    343                 psError(PS_ERR_UNKNOWN, false, "Unable to generate fake image with target PSF.");
     368                psError(PPSTACK_ERR_DATA, false, "Unable to generate fake image with target PSF.");
    344369                psFree(fake);
    345370                psFree(optWidths);
     
    347372                return false;
    348373            }
     374            pmReadoutFakeThreads(oldThreads);
    349375
    350376            fake->mask = psImageCopy(NULL, readout->mask, PS_TYPE_IMAGE_MASK);
    351377
     378#if 1
    352379            // Add the background into the target image
    353380            psImage *bgImage = stackBackgroundModel(readout, config); // Image of background
    354381            psBinaryOp(fake->image, fake->image, "+", bgImage);
    355382            psFree(bgImage);
     383#endif
    356384
    357385#ifdef TESTING
     
    379407
    380408            if (threads > 0) {
    381                 pmSubtractionThreadsInit(readout, fake);
     409                pmSubtractionThreadsInit();
    382410            }
    383411
     
    387415            if (kernel) {
    388416                if (!pmSubtractionMatchPrecalc(NULL, conv, fake, readout, readout->analysis,
    389                                                stride, sysError, maskVal, maskBad, maskPoor,
     417                                               stride, kernelError, covarFrac, maskVal, maskBad, maskPoor,
    390418                                               poorFrac, badFrac)) {
    391                     psError(PS_ERR_UNKNOWN, false, "Unable to convolve images.");
     419                    psError(psErrorCodeLast(), false, "Unable to convolve images.");
    392420                    psFree(fake);
    393421                    psFree(optWidths);
     
    395423                    psFree(conv);
    396424                    if (threads > 0) {
    397                         pmSubtractionThreadsFinalize(readout, fake);
     425                        pmSubtractionThreadsFinalize();
    398426                    }
    399427                    return false;
    400428                }
    401429            } else {
    402                 if (!pmSubtractionMatch(NULL, conv, fake, readout, footprint, stride, regionSize, spacing,
    403                                         threshold, stampSources, stampsName, type, size, order, widths,
    404                                         orders, inner, ringsOrder, binning, penalty,
    405                                         optimum, optWidths, optOrder, optThresh, iter, rej, sysError,
    406                                         maskVal, maskBad, maskPoor, poorFrac, badFrac,
    407                                         PM_SUBTRACTION_MODE_2)) {
    408                     psError(PS_ERR_UNKNOWN, false, "Unable to match images.");
     430                // Scale the input parameters
     431                psVector *widthsCopy = psVectorCopy(NULL, widths, PS_TYPE_F32); // Copy of kernel widths
     432                if (scale && !pmSubtractionParamsScale(&size, &footprint, widthsCopy,
     433                                                       options->inputSeeing->data.F32[index],
     434                                                       options->targetSeeing, scaleRef, scaleMin, scaleMax)) {
     435                    psError(psErrorCodeLast(), false, "Unable to scale kernel parameters");
    409436                    psFree(fake);
    410437                    psFree(optWidths);
    411438                    psFree(stampSources);
    412439                    psFree(conv);
     440                    psFree(widthsCopy);
    413441                    if (threads > 0) {
    414                         pmSubtractionThreadsFinalize(readout, fake);
     442                        pmSubtractionThreadsFinalize();
    415443                    }
    416444                    return false;
    417445                }
    418             }
     446
     447                if (!pmSubtractionMatch(NULL, conv, fake, readout, footprint, stride, regionSize, spacing,
     448                                        threshold, stampSources, stampsName, type, size, order, widthsCopy,
     449                                        orders, inner, ringsOrder, binning, penalty,
     450                                        optimum, optWidths, optOrder, optThresh, iter, rej, normFrac,
     451                                        sysError, skyErr, kernelError, covarFrac, maskVal, maskBad, maskPoor,
     452                                        poorFrac, badFrac, PM_SUBTRACTION_MODE_2)) {
     453                    psError(psErrorCodeLast(), false, "Unable to match images.");
     454                    psFree(fake);
     455                    psFree(optWidths);
     456                    psFree(stampSources);
     457                    psFree(conv);
     458                    psFree(widthsCopy);
     459                    if (threads > 0) {
     460                        pmSubtractionThreadsFinalize();
     461                    }
     462                    return false;
     463                }
     464                psFree(widthsCopy);
     465            }
     466
    419467
    420468#ifdef TESTING
     
    447495
    448496            if (threads > 0) {
    449                 pmSubtractionThreadsFinalize(readout, fake);
     497                pmSubtractionThreadsFinalize();
    450498            }
    451499
     
    487535            while ((item = psMetadataGetAndIncrement(iter))) {
    488536                assert(item->type == PS_DATA_UNKNOWN);
    489                 // Set the normalisation dimensions, since these will be otherwise unavailable when reading
    490                 // the images by scans.
    491537                pmSubtractionKernels *kernel = item->data.V; // Kernel used in subtraction
    492                 kernel->numCols = readout->image->numCols;
    493                 kernel->numRows = readout->image->numRows;
    494 
    495538                kernels = psArrayAdd(kernels, ARRAY_BUFFER, kernel);
    496539            }
     
    518561        }
    519562
     563        // Kernel normalisation
     564        {
     565            double sum = 0.0;           // Sum of chi^2
     566            int num = 0;                // Number of measurements of chi^2
     567            psString regex = NULL;      // Regular expression
     568            psStringAppend(&regex, "^%s$", PM_SUBTRACTION_ANALYSIS_NORM);
     569            psMetadataIterator *iter = psMetadataIteratorAlloc(conv->analysis, PS_LIST_HEAD, regex);
     570            psFree(regex);
     571            psMetadataItem *item = NULL;// Item from iteration
     572            while ((item = psMetadataGetAndIncrement(iter))) {
     573                assert(item->type == PS_TYPE_F32);
     574                float norm = item->data.F32; // Normalisation
     575                sum += norm;
     576                num++;
     577            }
     578            psFree(iter);
     579            float conv = sum/num;       // Mean normalisation from convolution
     580            float stars = powf(10.0, -0.4 * options->norm->data.F32[index]); // Normalisation from stars
     581            float renorm =  stars / conv; // Renormalisation to apply
     582            psLogMsg("ppStack", PS_LOG_INFO, "Renormalising image %d by %f (kernel: %f, stars: %f)\n",
     583                     index, renorm, conv, stars);
     584            psBinaryOp(readout->image, readout->image, "*", psScalarAlloc(renorm, PS_TYPE_F32));
     585            psBinaryOp(readout->variance, readout->variance, "*", psScalarAlloc(PS_SQR(renorm), PS_TYPE_F32));
     586        }
     587
    520588        // Reject image completely if the maximum deconvolution fraction exceeds the limit
    521589        float deconv = psMetadataLookupF32(NULL, conv->analysis,
    522590                                           PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Max deconvolution fraction
    523591        if (deconv > deconvLimit) {
    524             psWarning("Maximum deconvolution fraction (%f) exceeds limit (%f) --- rejecting\n",
    525                       deconv, deconvLimit);
     592            psWarning("Maximum deconvolution fraction (%f) exceeds limit (%f) --- rejecting image %d\n",
     593                      deconv, deconvLimit, index);
    526594            psFree(conv);
    527595            return NULL;
     
    542610    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
    543611    if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskVal | maskBad, rng)) {
    544       psWarning("Can't measure background for image.");
    545       psErrorClear();
     612        psWarning("Can't measure background for image.");
     613        psErrorClear();
    546614    } else {
    547       if (!psMetadataLookupBool(NULL, config->arguments, "PPSTACK.SKIP.BG.SUB")) {
    548         psLogMsg("ppStack", PS_LOG_INFO, "Correcting convolved image background by %lf (+/- %lf)",
    549                  psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN), psStatsGetValue(bg, PS_STAT_ROBUST_STDEV));
    550         (void)psBinaryOp(readout->image, readout->image, "-",
    551                          psScalarAlloc(psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN), PS_TYPE_F32));
    552       }
     615        if (!psMetadataLookupBool(NULL, config->arguments, "PPSTACK.SKIP.BG.SUB")) {
     616            psLogMsg("ppStack", PS_LOG_INFO, "Correcting convolved image background by %lf (+/- %lf)",
     617                     psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN), psStatsGetValue(bg, PS_STAT_ROBUST_STDEV));
     618            (void)psBinaryOp(readout->image, readout->image, "-",
     619                             psScalarAlloc(psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN), PS_TYPE_F32));
     620        }
    553621    }
    554622
     
    560628
    561629    // Measure the variance level for the weighting
    562     if (!psImageBackground(bg, NULL, readout->variance, readout->mask, maskVal | maskBad, rng)) {
    563         psError(PS_ERR_UNKNOWN, false, "Can't measure mean variance for image.");
    564         psFree(rng);
    565         psFree(bg);
    566         return false;
    567     }
    568     options->weightings->data.F32[index] = 1.0 / (psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN) *
    569                                                   psImageCovarianceFactor(readout->covariance));
    570     psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "PPSTACK.WEIGHTING", 0,
    571                      "Weighting by 1/noise^2 for stack", options->weightings->data.F32[index]);
     630    if (psMetadataLookupBool(NULL, recipe, "WEIGHTS")) {
     631        if (!psImageBackground(bg, NULL, readout->variance, readout->mask, maskVal | maskBad, rng)) {
     632            psError(PPSTACK_ERR_DATA, false, "Can't measure mean variance for image.");
     633            psFree(rng);
     634            psFree(bg);
     635            return false;
     636        }
     637        options->weightings->data.F32[index] = 1.0 / (psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN) *
     638                                                      psImageCovarianceFactor(readout->covariance));
     639    } else {
     640        options->weightings->data.F32[index] = 1.0;
     641    }
     642    psLogMsg("ppStack", PS_LOG_INFO, "Weighting for image %d is %f\n",
     643             index, options->weightings->data.F32[index]);
    572644
    573645    psFree(rng);
Note: See TracChangeset for help on using the changeset viewer.