Changeset 15834 for trunk/psModules/src/objects/models/pmModel_PGAUSS.c
- Timestamp:
- Dec 14, 2007, 2:58:11 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/models/pmModel_PGAUSS.c
r15056 r15834 6 6 * specifics of the model. All models which are used a PSF representations share a few 7 7 * parameters, for which # define names are listed in pmModel.h: 8 8 9 9 Gaussian taylor expansion 10 10 1 / (1 + z + z^2/2 + z^3/6) 11 11 12 12 * PM_PAR_SKY 0 - local sky : note that this is unused and may be dropped in the future 13 13 * PM_PAR_I0 1 - central intensity … … 19 19 *****************************************************************************/ 20 20 21 # define PM_MODEL_FUNC pmModelFunc_PGAUSS22 # define PM_MODEL_FLUX pmModelFlux_PGAUSS23 # define PM_MODEL_GUESS pmModelGuess_PGAUSS24 # define PM_MODEL_LIMITS pmModelLimits_PGAUSS25 # define PM_MODEL_RADIUS pmModelRadius_PGAUSS26 # define PM_MODEL_FROM_PSF pmModelFromPSF_PGAUSS21 # define PM_MODEL_FUNC pmModelFunc_PGAUSS 22 # define PM_MODEL_FLUX pmModelFlux_PGAUSS 23 # define PM_MODEL_GUESS pmModelGuess_PGAUSS 24 # define PM_MODEL_LIMITS pmModelLimits_PGAUSS 25 # define PM_MODEL_RADIUS pmModelRadius_PGAUSS 26 # define PM_MODEL_FROM_PSF pmModelFromPSF_PGAUSS 27 27 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_PGAUSS 28 28 # define PM_MODEL_FIT_STATUS pmModelFitStatus_PGAUSS … … 77 77 f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 78 78 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 79 q1 = PS_MAX (0.0, q1); 80 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that81 // angle and let f2,f1 fight it out79 q1 = PS_MAX (0.0, q1); 80 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 81 // angle and let f2,f1 fight it out 82 82 q2 = 0.5*sqrt (q1); 83 83 } … … 112 112 if (fabs(beta[nParam]) > fabs(beta_lim)) { 113 113 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 114 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",115 nParam, beta[nParam], beta_lim);114 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 115 nParam, beta[nParam], beta_lim); 116 116 return false; 117 117 } … … 143 143 psAbort("invalid parameter %d for param min test", nParam); 144 144 } 145 if (params[nParam] < params_min) {145 if (params[nParam] < params_min) { 146 146 params[nParam] = params_min; 147 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",148 nParam, params[nParam], params_min);147 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 148 nParam, params[nParam], params_min); 149 149 return false; 150 150 } … … 178 178 if (params[nParam] > params_max) { 179 179 params[nParam] = params_max; 180 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",181 nParam, params[nParam], params_max);180 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 181 nParam, params[nParam], params_max); 182 182 return false; 183 183 } … … 292 292 while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) { 293 293 z = 0.5*(z0 + z1); 294 f = 1.0 / (1 + z + z*z/2.0 + z*z*z/6.0);294 f = 1.0 / (1 + z + z*z/2.0 + z*z*z/6.0); 295 295 if (f > limit) { 296 296 z0 = z; … … 314 314 } 315 315 316 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)316 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, const pmPSF *psf) 317 317 { 318 318 … … 339 339 // convert to shape terms (SXX,SYY,SXY) 340 340 if (!pmPSF_FitToModel (out, 0.1)) { 341 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)",342 in[PM_PAR_YPOS], in[PM_PAR_XPOS]);343 return false;341 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", 342 in[PM_PAR_YPOS], in[PM_PAR_XPOS]); 343 return false; 344 344 } 345 345 … … 351 351 continue; 352 352 353 bool status = true;353 bool status = true; 354 354 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, out, NULL); 355 355 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, out, NULL); 356 if (!status) {357 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)",358 in[PM_PAR_XPOS], in[PM_PAR_YPOS]);359 modelPSF->flags |= PM_MODEL_STATUS_LIMITS;360 }356 if (!status) { 357 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", 358 in[PM_PAR_XPOS], in[PM_PAR_YPOS]); 359 modelPSF->flags |= PM_MODEL_STATUS_LIMITS; 360 } 361 361 } 362 362 return(true); … … 365 365 // construct the PSF model from the FLT model and the psf 366 366 // XXX is this sufficiently general do be a global function, not a pmModelClass function? 367 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, pmPSF *psf, float Xo, float Yo, float Io)367 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, const pmPSF *psf, float Xo, float Yo, float Io) 368 368 { 369 369 psF32 *PAR = model->params->data.F32; … … 377 377 PAR[PM_PAR_XPOS] = Xo; 378 378 PAR[PM_PAR_YPOS] = Yo; 379 379 380 380 // supply the model-fitted parameters, or copy from the input 381 381 for (int i = 0; i < psf->params->n; i++) { 382 if (i == PM_PAR_SKY) continue;383 if (i == PM_PAR_I0) continue;384 if (i == PM_PAR_XPOS) continue;385 if (i == PM_PAR_YPOS) continue;386 pmTrend2D *trend = psf->params->data[i];387 PAR[i] = pmTrend2DEval(trend, Xo, Yo);382 if (i == PM_PAR_SKY) continue; 383 if (i == PM_PAR_I0) continue; 384 if (i == PM_PAR_XPOS) continue; 385 if (i == PM_PAR_YPOS) continue; 386 pmTrend2D *trend = psf->params->data[i]; 387 PAR[i] = pmTrend2DEval(trend, Xo, Yo); 388 388 } 389 389 … … 392 392 // XXX user-defined value for limit? 393 393 if (!pmPSF_FitToModel (PAR, 0.1)) { 394 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo);395 return false;394 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo); 395 return false; 396 396 } 397 397 … … 403 403 continue; 404 404 405 bool status = true;405 bool status = true; 406 406 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL); 407 407 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL); 408 if (!status) {409 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo);410 model->flags |= PM_MODEL_STATUS_LIMITS;411 }408 if (!status) { 409 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo); 410 model->flags |= PM_MODEL_STATUS_LIMITS; 411 } 412 412 } 413 413 return(true);
Note:
See TracChangeset
for help on using the changeset viewer.
