Changeset 36085 for trunk/psModules/src/objects/pmPCMdata.c
- Timestamp:
- Aug 31, 2013, 5:55:16 AM (13 years ago)
- Location:
- trunk/psModules
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
src/objects/pmPCMdata.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules
- Property svn:mergeinfo changed
/branches/eam_branches/ipp-20130711/psModules (added) merged: 35843,35876,35947-35948,35961-35963,35966-35967,36021,36024,36027,36066-36069,36075
- Property svn:mergeinfo changed
-
trunk/psModules/src/objects/pmPCMdata.c
r35768 r36085 173 173 } 174 174 175 int 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 175 249 pmPCMdata *pmPCMinit(pmSource *source, pmSourceFitOptions *fitOptions, pmModel *model, psImageMaskType maskVal, float psfSize) { 176 250 … … 219 293 constraint->checkLimits = model->modelLimits; 220 294 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); 269 296 270 297 if (nPix < nParams + 1) { … … 341 368 } 342 369 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); 392 371 393 372 if (pcm->nPix < nParams + 1) { … … 478 457 } 479 458 459 // construct a realization of the source model 460 bool 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.
