Changeset 14652 for trunk/psModules/src/objects/models/pmModel_GAUSS.c
- Timestamp:
- Aug 23, 2007, 2:11:02 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/models/pmModel_GAUSS.c
r14220 r14652 19 19 *****************************************************************************/ 20 20 21 # define PM_MODEL_FUNC pmModelFunc_GAUSS 22 # define PM_MODEL_FLUX pmModelFlux_GAUSS 23 # define PM_MODEL_GUESS pmModelGuess_GAUSS 24 # define PM_MODEL_LIMITS pmModelLimits_GAUSS 25 # define PM_MODEL_RADIUS pmModelRadius_GAUSS 26 # define PM_MODEL_FROM_PSF pmModelFromPSF_GAUSS 27 # define PM_MODEL_FIT_STATUS pmModelFitStatus_GAUSS 28 21 # define PM_MODEL_FUNC pmModelFunc_GAUSS 22 # define PM_MODEL_FLUX pmModelFlux_GAUSS 23 # define PM_MODEL_GUESS pmModelGuess_GAUSS 24 # define PM_MODEL_LIMITS pmModelLimits_GAUSS 25 # define PM_MODEL_RADIUS pmModelRadius_GAUSS 26 # define PM_MODEL_FROM_PSF pmModelFromPSF_GAUSS 27 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_GAUSS 28 # define PM_MODEL_FIT_STATUS pmModelFitStatus_GAUSS 29 30 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) 29 31 psF32 PM_MODEL_FUNC(psVector *deriv, 30 32 const psVector *params, … … 38 40 psF32 py = Y / PAR[PM_PAR_SYY]; 39 41 psF32 z = PS_SQR(px) + PS_SQR(py) + PAR[PM_PAR_SXY]*X*Y; 42 assert (z >= 0.0); 43 40 44 psF32 r = exp(-z); 41 45 psF32 q = PAR[PM_PAR_I0]*r; … … 61 65 # define AR_MAX 20.0 62 66 # define AR_RATIO 0.99 67 63 68 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 64 69 { … … 93 98 break; 94 99 case PM_PAR_SXX: 95 beta_lim = 0.5;100 beta_lim = 2.0; 96 101 break; 97 102 case PM_PAR_SYY: 98 beta_lim = 0.5;103 beta_lim = 2.0; 99 104 break; 100 105 case PM_PAR_SXY: … … 257 262 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf) 258 263 { 259 260 264 psF32 *out = modelPSF->params->data.F32; 261 265 psF32 *in = modelFLT->params->data.F32; 262 266 263 267 // we require these two parameters to exist 264 assert (psf->params _NEW->n > PM_PAR_YPOS);265 assert (psf->params _NEW->n > PM_PAR_XPOS);268 assert (psf->params->n > PM_PAR_YPOS); 269 assert (psf->params->n > PM_PAR_XPOS); 266 270 267 271 // supply the model-fitted parameters, or copy from the input 268 for (int i = 0; i < psf->params _NEW->n; i++) {269 if (psf->params _NEW->data[i] == NULL) {272 for (int i = 0; i < psf->params->n; i++) { 273 if (psf->params->data[i] == NULL) { 270 274 out[i] = in[i]; 271 275 } else { 272 psPolynomial2D *poly = psf->params _NEW->data[i];276 psPolynomial2D *poly = psf->params->data[i]; 273 277 out[i] = psPolynomial2DEval(poly, in[PM_PAR_XPOS], in[PM_PAR_YPOS]); 274 278 } … … 289 293 // apply the model limits here: this truncates excessive extrapolation 290 294 // XXX do we need to do this still? should we put in asserts to test? 291 for (int i = 0; i < psf->params _NEW->n; i++) {295 for (int i = 0; i < psf->params->n; i++) { 292 296 // apply the limits to all components or just the psf-model parameters? 293 if (psf->params _NEW->data[i] == NULL)297 if (psf->params->data[i] == NULL) 294 298 continue; 295 299 … … 306 310 } 307 311 312 // construct the PSF model from the FLT model and the psf 313 // XXX is this sufficiently general do be a global function, not a pmModelClass function? 314 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, pmPSF *psf, float Xo, float Yo, float Io) 315 { 316 psF32 *PAR = model->params->data.F32; 317 318 // we require these two parameters to exist 319 assert (psf->params->n > PM_PAR_YPOS); 320 assert (psf->params->n > PM_PAR_XPOS); 321 322 PAR[PM_PAR_SKY] = 0.0; 323 PAR[PM_PAR_I0] = Io; 324 PAR[PM_PAR_XPOS] = Xo; 325 PAR[PM_PAR_YPOS] = Yo; 326 327 // supply the model-fitted parameters, or copy from the input 328 for (int i = 0; i < psf->params->n; i++) { 329 if (i == PM_PAR_SKY) continue; 330 if (i == PM_PAR_I0) continue; 331 if (i == PM_PAR_XPOS) continue; 332 if (i == PM_PAR_YPOS) continue; 333 psPolynomial2D *poly = psf->params->data[i]; 334 assert (poly); 335 PAR[i] = psPolynomial2DEval(poly, Xo, Yo); 336 } 337 338 // the 2D PSF model fits polarization terms (E0,E1,E2) 339 // convert to shape terms (SXX,SYY,SXY) 340 // XXX user-defined value for limit? 341 if (!pmPSF_FitToModel (PAR, 0.1)) { 342 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo); 343 return false; 344 } 345 346 // apply the model limits here: this truncates excessive extrapolation 347 // XXX do we need to do this still? should we put in asserts to test? 348 for (int i = 0; i < psf->params->n; i++) { 349 // apply the limits to all components or just the psf-model parameters? 350 if (psf->params->data[i] == NULL) 351 continue; 352 353 bool status = true; 354 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL); 355 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL); 356 if (!status) { 357 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo); 358 model->flags |= PM_MODEL_STATUS_LIMITS; 359 } 360 } 361 return(true); 362 } 363 308 364 // check the status of the fitted model 309 365 // this test is invalid if the parameters are derived … … 311 367 bool PM_MODEL_FIT_STATUS (pmModel *model) 312 368 { 313 314 369 psF32 dP; 315 370 bool status; … … 339 394 # undef PM_MODEL_RADIUS 340 395 # undef PM_MODEL_FROM_PSF 396 # undef PM_MODEL_PARAMS_FROM_PSF 341 397 # undef PM_MODEL_FIT_STATUS
Note:
See TracChangeset
for help on using the changeset viewer.
