Changeset 35768 for trunk/psModules/src/objects/pmPSF.c
- Timestamp:
- Jul 3, 2013, 2:37:22 PM (13 years ago)
- Location:
- trunk/psModules
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
src/objects/pmPSF.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules
- Property svn:mergeinfo changed
/branches/eam_branches/ipp-20130509/psModules (added) merged: 35594,35613,35628,35638-35639,35643-35648,35653,35657,35662,35750
- Property svn:mergeinfo changed
-
trunk/psModules/src/objects/pmPSF.c
r35560 r35768 249 249 // Mxy = SXY * (SXX^-4 + SYY^-4 - 2 SXY ^2) 250 250 251 // XXX deprecated 251 252 // input: model->param, output: psf->param[PM_PAR_SXY] 252 double pmPSF_SXYfromModel (psF32 *modelPar) 253 { 254 PS_ASSERT_PTR_NON_NULL(modelPar, NAN); 255 256 double SXX = modelPar[PM_PAR_SXX]; 257 double SYY = modelPar[PM_PAR_SYY]; 258 double SXY = modelPar[PM_PAR_SXY]; 259 260 double par = SXY / PS_SQR(1.0 / PS_SQR(SXX) + 1.0 / PS_SQR(SYY)); 261 return (par); 262 } 263 253 // XXX double pmPSF_SXYfromModel (psF32 *modelPar) 254 // XXX { 255 // XXX PS_ASSERT_PTR_NON_NULL(modelPar, NAN); 256 // XXX 257 // XXX double SXX = modelPar[PM_PAR_SXX]; 258 // XXX double SYY = modelPar[PM_PAR_SYY]; 259 // XXX double SXY = modelPar[PM_PAR_SXY]; 260 // XXX 261 // XXX double par = SXY / PS_SQR(1.0 / PS_SQR(SXX) + 1.0 / PS_SQR(SYY)); 262 // XXX return (par); 263 // XXX } 264 265 // XXX deprecated 264 266 // input: fitted psf->param, output: model->param[PM_PAR_SXY] 265 double pmPSF_SXYtoModel (psF32 *fittedPar) 266 { 267 PS_ASSERT_PTR_NON_NULL(fittedPar, NAN); 268 269 double SXX = fittedPar[PM_PAR_SXX]; 270 double SYY = fittedPar[PM_PAR_SYY]; 271 double fit = fittedPar[PM_PAR_SXY]; 272 273 double SXY = fit * PS_SQR(1.0 / PS_SQR(SXX) + 1.0 / PS_SQR(SYY)); 274 275 assert (!isnan(SXY)); 276 277 return SXY; 278 } 279 280 // New Concept: the PSF modelling function fits the polarization terms e0, e1, e2: 281 282 // convert the parameters used in the fitted source model 283 // to the parameters used in the 2D PSF model 284 // XXX this function may be invalid for SERSIC, DEV, EXP models (SQRT2 not used?) 285 bool pmPSF_FitToModel (psF32 *fittedPar, float minMinorAxis) 267 // XXX double pmPSF_SXYtoModel (psF32 *fittedPar) 268 // XXX { 269 // XXX PS_ASSERT_PTR_NON_NULL(fittedPar, NAN); 270 // XXX 271 // XXX double SXX = fittedPar[PM_PAR_SXX]; 272 // XXX double SYY = fittedPar[PM_PAR_SYY]; 273 // XXX double fit = fittedPar[PM_PAR_SXY]; 274 // XXX 275 // XXX double SXY = fit * PS_SQR(1.0 / PS_SQR(SXX) + 1.0 / PS_SQR(SYY)); 276 // XXX 277 // XXX assert (!isnan(SXY)); 278 // XXX 279 // XXX return SXY; 280 // XXX } 281 282 // The PSF modelling function fits the polarization terms e0, e1, e2: 283 284 // the FIT is the 2D representation of the shape using polarization parameters for the elliptical contour 285 // the MODEL is the realized psf model for a given location 286 287 // convert the parameters (in situ) used in the fitted source model to the parameters used in 288 // the 2D PSF model 289 bool pmPSF_FitToModel (psF32 *fittedPar, float minMinorAxis, bool useReff) 286 290 { 287 291 PS_ASSERT_PTR_NON_NULL(fittedPar, false); … … 298 302 return false; 299 303 } 300 psEllipseShape shape = psEllipseAxesToShape (axes); 301 302 fittedPar[PM_PAR_SXX] = shape.sx * M_SQRT2; 303 fittedPar[PM_PAR_SYY] = shape.sy * M_SQRT2; 304 fittedPar[PM_PAR_SXY] = shape.sxy; 305 304 305 pmModelAxesToParams (&fittedPar[PM_PAR_SXX], &fittedPar[PM_PAR_SXY], &fittedPar[PM_PAR_SYY], axes, useReff); 306 306 return true; 307 307 } 308 308 309 // convert the PSF parameters used in the 2D PSF model fit into the 310 // parameters used in the source model 311 // XXX this function may be invalid for SERSIC, DEV, EXP models (SQRT2 not used?) 312 psEllipsePol pmPSF_ModelToFit (psF32 *modelPar) 309 // convert the parameters (in situ) used in the 2D PSF model fit into the parameters used in 310 // the source model 311 psEllipsePol pmPSF_ModelToFit (psF32 *modelPar, bool useReff) 313 312 { 314 313 // must assert non-NULL input parameter … … 319 318 PS_ASSERT_PTR_NON_NULL(modelPar, pol); 320 319 321 psEllipseShape shape; 322 323 shape.sx = modelPar[PM_PAR_SXX] / M_SQRT2; 324 shape.sy = modelPar[PM_PAR_SYY] / M_SQRT2; 325 shape.sxy = modelPar[PM_PAR_SXY]; 326 327 pol = psEllipseShapeToPol (shape); 320 psEllipseAxes axes; 321 pmModelParamsToAxes (&axes, modelPar[PM_PAR_SXX], modelPar[PM_PAR_SXY], modelPar[PM_PAR_SYY], useReff); 322 323 pol = psEllipseAxesToPol (axes); 328 324 329 325 return pol; … … 332 328 // convert the parameters used in the fitted source model to the psEllipseAxes representation 333 329 // (major,minor,theta) 334 psEllipseAxes pmPSF_ModelToAxes (psF32 *modelPar, double maxAR, pmModelType type) 335 { 336 psEllipseShape shape; 330 psEllipseAxes pmPSF_ModelToAxes (psF32 *modelPar, pmModelType type) 331 { 337 332 psEllipseAxes axes; 338 333 axes.major = NAN; 339 334 axes.minor = NAN; 340 335 axes.theta = NAN; 341 // XXX: must assert non-NULL input parameter 336 342 337 PS_ASSERT_PTR_NON_NULL(modelPar, axes); 343 338 344 bool useReff = false; 345 useReff |= (type == pmModelClassGetType ("PS_MODEL_SERSIC")); 346 useReff |= (type == pmModelClassGetType ("PS_MODEL_DEV")); 347 useReff |= (type == pmModelClassGetType ("PS_MODEL_EXP")); 348 349 if (useReff) { 350 shape.sx = modelPar[PM_PAR_SXX]; 351 shape.sy = modelPar[PM_PAR_SYY]; 352 shape.sxy = modelPar[PM_PAR_SXY] / 2.0; 353 // XXX I *think* dividing by 2.0 is the right direction, but this 354 // needs to be checked with a real test 355 } else { 356 shape.sx = modelPar[PM_PAR_SXX] / M_SQRT2; 357 shape.sy = modelPar[PM_PAR_SYY] / M_SQRT2; 358 shape.sxy = modelPar[PM_PAR_SXY]; 359 } 360 361 if ((shape.sx == 0) || (shape.sy == 0)) { 362 axes.major = 0.0; 363 axes.minor = 0.0; 364 axes.theta = 0.0; 365 } else { 366 // XXX this is not really consistent with the model fit range above 367 axes = psEllipseShapeToAxes (shape, maxAR); 368 } 369 339 bool useReff = pmModelUseReff (type); 340 pmModelParamsToAxes (&axes, modelPar[PM_PAR_SXX], modelPar[PM_PAR_SXY], modelPar[PM_PAR_SYY], useReff); 370 341 return axes; 371 342 } … … 377 348 PS_ASSERT_PTR_NON_NULL(modelPar, false); 378 349 350 modelPar[PM_PAR_SXX] = 0.0; 351 modelPar[PM_PAR_SYY] = 0.0; 352 modelPar[PM_PAR_SXY] = 0.0; 353 379 354 if ((axes.major <= 0) || (axes.minor <= 0)) { 380 modelPar[PM_PAR_SXX] = 0.0;381 modelPar[PM_PAR_SYY] = 0.0;382 modelPar[PM_PAR_SXY] = 0.0;383 355 return true; 384 356 } 385 386 psEllipseShape shape = psEllipseAxesToShape (axes); 387 388 bool useReff = false; 389 useReff |= ( type == pmModelClassGetType ("PS_MODEL_SERSIC")); 390 useReff |= ( type == pmModelClassGetType ("PS_MODEL_DEV")); 391 useReff |= ( type == pmModelClassGetType ("PS_MODEL_EXP")); 392 393 if (useReff) { 394 modelPar[PM_PAR_SXX] = shape.sx; 395 modelPar[PM_PAR_SYY] = shape.sy; 396 modelPar[PM_PAR_SXY] = shape.sxy * 2.0; // XXX NEED factor of 2 here for correct angle conversion 397 } else { 398 modelPar[PM_PAR_SXX] = shape.sx * M_SQRT2; 399 modelPar[PM_PAR_SYY] = shape.sy * M_SQRT2; 400 modelPar[PM_PAR_SXY] = shape.sxy; 401 } 357 358 bool useReff = pmModelUseReff (type); 359 pmModelAxesToParams (&modelPar[PM_PAR_SXX], &modelPar[PM_PAR_SXY], &modelPar[PM_PAR_SYY], axes, useReff); 402 360 return true; 403 361 } … … 423 381 par->data.F32[PM_PAR_SXY] = sxy; 424 382 425 psEllipsePol pol = pmPSF_ModelToFit(par->data.F32); 383 bool useReff = pmModelUseReff (options->type); 384 psEllipsePol pol = pmPSF_ModelToFit(par->data.F32, useReff); 426 385 427 386 pmTrend2D *trend = NULL;
Note:
See TracChangeset
for help on using the changeset viewer.
