IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 31, 2013, 5:55:16 AM (13 years ago)
Author:
eugene
Message:

merge changes from EAM branch (pmModel_CentralPixel functions for sersic-like model support; add interactive mode to PCM LMM fitting; harder PCM LMM damping (nu scaled by 3 not 2); add EXT_AND SKY and SHAPE fitting modes, include sky in INDEX-only fits; ifdefs for trace-only values; allow positions to go to 100,000; major re-work of central pixel & flux for sersic-like models; add pmPCMMakeModel function to generate the flux for an arbitrary model

Location:
trunk/psModules
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules

  • trunk/psModules/src/objects/pmPCMdata.c

    r35768 r36085  
    173173}
    174174
     175int pmPCMsetParams (psMinConstraint *constraint, pmSourceFitMode mode) {
     176
     177    // set parameter mask based on fitting mode
     178    int nParams = 0;
     179
     180    switch (mode) {
     181      case PM_SOURCE_FIT_NORM:
     182        // fits only source normalization (Io)
     183        nParams = 1;
     184        psVectorInit (constraint->paramMask, 1);
     185        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
     186        break;
     187
     188      case PM_SOURCE_FIT_PSF:
     189        // fits only x,y,Io
     190        nParams = 3;
     191        psVectorInit (constraint->paramMask, 1);
     192        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
     193        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_XPOS] = 0;
     194        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0;
     195        break;
     196
     197      case PM_SOURCE_FIT_EXT:
     198        // fits all params except sky
     199        nParams = params->n - 1;
     200        psVectorInit (constraint->paramMask, 0);
     201        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1;
     202        break;
     203
     204      case PM_SOURCE_FIT_EXT_AND_SKY:
     205        // fits all params including sky
     206        nParams = params->n;
     207        psVectorInit (constraint->paramMask, 0);
     208        break;
     209
     210      case PM_SOURCE_FIT_SHAPE:
     211        // fits shape (Sxx, Sxy, Syy) and Io
     212        nParams = 5;
     213        psVectorInit (constraint->paramMask, 1);
     214        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 0;
     215        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
     216        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SXX] = 0;
     217        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SXY] = 0;
     218        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SYY] = 0;
     219        break;
     220
     221      case PM_SOURCE_FIT_INDEX:
     222        // fits only Io, index (PAR7) -- only Io for models with < 8 params
     223        psVectorInit (constraint->paramMask, 1);
     224        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
     225        if (params->n == 7) {
     226            nParams = 1;
     227        } else {
     228            nParams = 2;
     229            constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 0;
     230        }
     231        break;
     232
     233      case PM_SOURCE_FIT_NO_INDEX:
     234        // fits all but index (PAR7) including sky
     235        psVectorInit (constraint->paramMask, 0);
     236        if (params->n == 7) {
     237            nParams = params->n;
     238        } else {
     239            nParams = params->n - 1;
     240            constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 1;
     241        }
     242        break;
     243      default:
     244        psAbort("invalid fitting mode");
     245    }
     246    return nParams;
     247}
     248
    175249pmPCMdata *pmPCMinit(pmSource *source, pmSourceFitOptions *fitOptions, pmModel *model, psImageMaskType maskVal, float psfSize) {
    176250
     
    219293    constraint->checkLimits = model->modelLimits;
    220294
    221     // set parameter mask based on fitting mode
    222     int nParams = 0;
    223     switch (fitOptions->mode) {
    224       case PM_SOURCE_FIT_NORM:
    225         // NORM-only model fits only source normalization (Io)
    226         nParams = 1;
    227         psVectorInit (constraint->paramMask, 1);
    228         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
    229         break;
    230       case PM_SOURCE_FIT_PSF:
    231         // PSF model only fits x,y,Io
    232         nParams = 3;
    233         psVectorInit (constraint->paramMask, 1);
    234         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
    235         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_XPOS] = 0;
    236         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0;
    237         break;
    238       case PM_SOURCE_FIT_EXT:
    239         // EXT model fits all params (except sky)
    240         nParams = params->n - 1;
    241         psVectorInit (constraint->paramMask, 0);
    242         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1;
    243         break;
    244       case PM_SOURCE_FIT_INDEX:
    245         // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params
    246         psVectorInit (constraint->paramMask, 1);
    247         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
    248         if (params->n == 7) {
    249             nParams = 1;
    250         } else {
    251             nParams = 2;
    252             constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 0;
    253         }
    254         break;
    255       case PM_SOURCE_FIT_NO_INDEX:
    256         // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params
    257         psVectorInit (constraint->paramMask, 0);
    258         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1;
    259         if (params->n == 7) {
    260             nParams = params->n - 1;
    261         } else {
    262             nParams = params->n - 2;
    263             constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 1;
    264         }
    265         break;
    266       default:
    267         psAbort("invalid fitting mode");
    268     }
     295    int nParams = pmPCMsetParams (constraint, fitOptions->mode);
    269296
    270297    if (nPix <  nParams + 1) {
     
    341368    }
    342369
    343     // if we changed the fit mode, we need to update nDOF
    344     int nParams = 0;
    345     // set parameter mask based on fitting mode
    346     switch (fitOptions->mode) {
    347       case PM_SOURCE_FIT_NORM:
    348         // NORM-only model fits only source normalization (Io)
    349         nParams = 1;
    350         psVectorInit (pcm->constraint->paramMask, 1);
    351         pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
    352         break;
    353       case PM_SOURCE_FIT_PSF:
    354         // PSF model only fits x,y,Io
    355         nParams = 3;
    356         psVectorInit (pcm->constraint->paramMask, 1);
    357         pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
    358         pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_XPOS] = 0;
    359         pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0;
    360         break;
    361       case PM_SOURCE_FIT_EXT:
    362         // EXT model fits all params (except sky)
    363         nParams = model->params->n - 1;
    364         psVectorInit (pcm->constraint->paramMask, 0);
    365         pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1;
    366         break;
    367       case PM_SOURCE_FIT_INDEX:
    368         // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params
    369         psVectorInit (pcm->constraint->paramMask, 1);
    370         pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
    371         if (model->params->n == 7) {
    372             nParams = 1;
    373         } else {
    374             nParams = 2;
    375             pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 0;
    376         }
    377         break;
    378       case PM_SOURCE_FIT_NO_INDEX:
    379         // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params
    380         psVectorInit (pcm->constraint->paramMask, 0);
    381         pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1;
    382         if (model->params->n == 7) {
    383             nParams = model->params->n - 1;
    384         } else {
    385             nParams = model->params->n - 2;
    386             pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 1;
    387         }
    388         break;
    389       default:
    390         psAbort("invalid fitting mode");
    391     }
     370    int nParams = pmPCMsetParams (pcm->constraint, fitOptions->mode);
    392371
    393372    if (pcm->nPix <  nParams + 1) {
     
    478457}
    479458
     459// construct a realization of the source model
     460bool pmPCMMakeModel (pmSource *source, pmModel *model, psImageMaskType maskVal, int psfSize) {
     461
     462    PS_ASSERT_PTR_NON_NULL(source, false);
     463
     464    // if we already have a cached image, re-use that memory
     465    source->modelFlux = psImageCopy (source->modelFlux, source->pixels, PS_TYPE_F32);
     466    psImageInit (source->modelFlux, 0.0);
     467
     468    // modelFlux always has unity normalization (I0 = 1.0)
     469    pmModelAdd (source->modelFlux, source->maskObj, model, PM_MODEL_OP_FULL | PM_MODEL_OP_NORM, maskVal);
     470
     471    // convolve the model image with the PSF
     472    if (USE_1D_GAUSS) {
     473        // do not use the threaded, mask-aware version of this code (psImageSmoothMaskPixelsThread):
     474        // * the model flux is not masked
     475        // * threading takes place above this level
     476       
     477        // define the Gauss parameters from the psf
     478        pmModel *modelPSF = source->modelPSF;
     479        psAssert (modelPSF, "psf model must be defined");
     480   
     481        psEllipseAxes axes;
     482        bool useReff = pmModelUseReff (modelPSF->type);
     483        psF32 *PAR = modelPSF->params->data.F32;
     484        pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], useReff);
     485   
     486        float FWHM_MAJOR = 2*modelPSF->modelRadius (modelPSF->params, 0.5*PAR[PM_PAR_I0]);
     487        float FWHM_MINOR = FWHM_MAJOR * (axes.minor / axes.major);
     488
     489        float sigma = 0.5 * (FWHM_MAJOR + FWHM_MINOR) / 2.35;
     490        float nsigma = 2.0;
     491
     492        psImageSmooth (source->modelFlux, sigma, nsigma);
     493    } else {
     494        // make sure we save a cached copy of the psf flux
     495        pmSourceCachePSF (source, maskVal);
     496
     497        // convert the cached cached psf model for this source to a psKernel
     498        psKernel *psf = pmPCMkernelFromPSF (source, psfSize);
     499        if (!psf) {
     500            // NOTE: this only happens if the source is too close to an edge
     501            model->flags |= PM_MODEL_STATUS_BADARGS;
     502            return NULL;
     503        }
     504
     505        // XXX not sure if I can place the output on top of the input
     506        psImageConvolveFFT (source->modelFlux, source->modelFlux, NULL, 0, psf);
     507    }
     508    return true;
     509}
     510
Note: See TracChangeset for help on using the changeset viewer.