IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 22, 2015, 3:23:53 PM (11 years ago)
Author:
bills
Message:

Handle pcm extended source models correctly in psphotSourceChildrenByReadout and psphotResetModels.
Avoid extra model convolutions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot/src/psphotMergeSources.c

    r38389 r38515  
    853853// array containing the child sources.  XXX currently, this is only used by psphotStackReadout
    854854// (sources go on allSources so that psphotChoosePSF can be called repeatedly)
    855 psArray *psphotSourceChildrenByObject (pmConfig *config, const pmFPAview *view, const char *filerule, psArray *objectsSrc, bool sourcesSubtracted) {
     855psArray *psphotSourceChildrenByObject (pmConfig *config, const pmFPAview *view, const char *fileruleOut, const char *fileruleSrc, psArray *objectsSrc, bool sourcesSubtracted) {
    856856
    857857    bool status;
    858858
    859     int nImages = psphotFileruleCount(config, filerule);
     859    int nImages = psphotFileruleCount(config, fileruleOut);
    860860
    861861    // generate look-up arrays for detections and readouts
    862862    psArray *detArrays = psArrayAlloc(nImages);
    863863    psArray *readouts = psArrayAlloc(nImages);
     864    psArray *fitOptionsArray = psArrayAlloc(nImages);
     865
     866    psMetadata *recipe  = psMetadataLookupPtr (&status, config->recipes, PSPHOT_RECIPE);
     867    assert (recipe);
     868    psImageMaskType maskVal = psMetadataLookupImageMask(&status, recipe, "MASK.PSPHOT");
     869    assert (maskVal);
     870    int psfSize  = psMetadataLookupS32 (&status, recipe, "PCM_BOX_SIZE");
     871    assert (status);
    864872
    865873    for (int i = 0; i < nImages; i++) {
    866874
    867875        // find the currently selected readout
    868         pmFPAfile *file = pmFPAfileSelectSingle(config->files, filerule, i); // File of interest
     876        pmFPAfile *file = pmFPAfileSelectSingle(config->files, fileruleOut, i); // File of interest
    869877        psAssert (file, "missing file?");
    870878
    871879        pmReadout *readout = pmFPAviewThisReadout(view, file->fpa);
    872880        psAssert (readout, "missing readout?");
     881
     882        pmFPAfile *fileSrc = pmFPAfileSelectSingle(config->files, fileruleSrc, i); // File of interest
     883        psAssert (file, "missing file?");
     884
     885        pmReadout *readoutSrc = pmFPAviewThisReadout(view, fileSrc->fpa);
     886        psAssert (readoutSrc, "missing readout?");
     887
    873888
    874889        // create DETECTIONS containers for each image, in case one lacks it
     
    886901            psAssert (detections, "missing detections?");
    887902        }
     903        pmSourceFitOptions *fitOptions = psMetadataLookupPtr (&status, readoutSrc->analysis, "PCM_FIT_OPTIONS");
     904        psAssert (fitOptions, "missing pcm fit options");
     905        psMetadataAddPtr (readout->analysis, PS_LIST_TAIL, "PCM_FIT_OPTIONS", PS_DATA_UNKNOWN | PS_META_REPLACE, "pcm fit options", fitOptions);
    888906
    889907        // we need to save the new sources on the detection arrays of the appropriate image
    890908        detArrays->data[i] = psMemIncrRefCounter(detections);
    891909        readouts->data[i] = psMemIncrRefCounter(readout);
     910        fitOptionsArray->data[i] = psMemIncrRefCounter(fitOptions);
    892911    }
    893912
     
    932951            // does this copy all model data? (NO)
    933952            sourceOut->modelPSF = pmModelCopy(sourceSrc->modelPSF);
    934             sourceOut->modelEXT = pmModelCopy(sourceSrc->modelEXT);
    935 
     953
     954            bool foundModelEXT = false;
    936955            if (sourceSrc->modelFits) {
    937956                sourceOut->modelFits = psArrayAlloc(sourceSrc->modelFits->n);
    938957                for (int j = 0; j < sourceSrc->modelFits->n; j++) {
    939                     sourceOut->modelFits->data[j] = pmModelCopy(sourceSrc->modelFits->data[j]);
    940                 }
     958                    pmModel *modelSrc = sourceSrc->modelFits->data[j];
     959                    pmModel *modelOut = sourceOut->modelFits->data[j] = pmModelCopy(modelSrc);
     960                    if (modelSrc == sourceSrc->modelEXT) {
     961                        foundModelEXT = true;
     962                        sourceOut->modelEXT = psMemIncrRefCounter (modelOut);
     963                    }
     964                    modelOut->isPCM = modelSrc->isPCM;
     965                }
    941966            }
     967            if (!foundModelEXT && sourceSrc->modelEXT) {
     968                // Will this ever happen?
     969                sourceOut->modelEXT = pmModelCopy(sourceSrc->modelEXT);
     970            }
    942971
    943972            // drop the references to the original image pixels:
     
    949978            pmReadout *readout = readouts->data[index];
    950979
     980            pmSourceFitOptions *fitOptions = fitOptionsArray->data[index];
     981
    951982            // allocate image, weight, mask for the new image for each peak
    952983            if (sourceOut->modelPSF) {
    953984                pmSourceRedefinePixels (sourceOut, readout, sourceOut->peak->x, sourceOut->peak->y,
    954                                                                         sourceOut->modelPSF->fitRadius);
     985                                                                        sourceSrc->windowRadius);
    955986            } else {
    956987                // if we have no pixels we can't use it to determine the psf so make sure this bit is off
     
    965996            if (!sourcesSubtracted) {
    966997                sourceOut->tmpFlags &= ~PM_SOURCE_TMPF_SUBTRACTED;
    967             }
     998            } else {
     999                if (sourceSrc->modelFlux) {
     1000                    bool isPSF = false;
     1001                    pmModel *model = pmSourceGetModel (&isPSF, sourceOut);
     1002                    if (model->isPCM) {
     1003                        pmPCMdata *pcm = pmPCMinit (sourceOut, fitOptions, model, maskVal, psfSize);
     1004                        if (pcm) {
     1005                            // pmPCMMakeModel (sourceOut, model, pcm->nsigma, maskVal, psfSize);
     1006                            pmPCMCacheModel (sourceOut, maskVal, psfSize, pcm->nsigma);
     1007                            psFree(pcm);
     1008                        } else {
     1009                            // What to do here?
     1010                            psAssert (pcm, "pmPCMinit failed!");
     1011                        }
     1012                    } else {
     1013                        pmSourceCacheModel (sourceOut, maskVal);
     1014                    }
     1015                }
     1016            }
    9681017
    9691018            // set the output detections:
     
    9811030    psFree (detArrays);
    9821031    psFree (readouts);
     1032    psFree (fitOptionsArray);
    9831033
    9841034    return objectsOut;
Note: See TracChangeset for help on using the changeset viewer.