Changeset 15834 for trunk/psModules/src/objects/models/pmModel_RGAUSS.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_RGAUSS.c
r15056 r15834 6 6 * may thus vary depending on the specifics of the model. All models which are used a PSF 7 7 * representations share a few parameters, for which # define names are listed in pmModel.h: 8 8 9 9 power-law with fitted slope 10 10 1 / (1 + z + z^alpha) 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 … … 20 20 *****************************************************************************/ 21 21 22 # define PM_MODEL_FUNC pmModelFunc_RGAUSS23 # define PM_MODEL_FLUX pmModelFlux_RGAUSS24 # define PM_MODEL_GUESS pmModelGuess_RGAUSS25 # define PM_MODEL_LIMITS pmModelLimits_RGAUSS26 # define PM_MODEL_RADIUS pmModelRadius_RGAUSS27 # define PM_MODEL_FROM_PSF pmModelFromPSF_RGAUSS22 # define PM_MODEL_FUNC pmModelFunc_RGAUSS 23 # define PM_MODEL_FLUX pmModelFlux_RGAUSS 24 # define PM_MODEL_GUESS pmModelGuess_RGAUSS 25 # define PM_MODEL_LIMITS pmModelLimits_RGAUSS 26 # define PM_MODEL_RADIUS pmModelRadius_RGAUSS 27 # define PM_MODEL_FROM_PSF pmModelFromPSF_RGAUSS 28 28 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_RGAUSS 29 29 # define PM_MODEL_FIT_STATUS pmModelFitStatus_RGAUSS … … 62 62 dPAR[PM_PAR_SXY] = -q*X*Y; 63 63 64 // this model derivative is undefined at z = 0.0, but is actually 0.064 // this model derivative is undefined at z = 0.0, but is actually 0.0 65 65 dPAR[PM_PAR_7] = (z == 0.0) ? 0.0 : -5.0*t*log(z)*p*z; 66 66 } … … 83 83 f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 84 84 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 85 q1 = (q1 < 0.0) ? 0.0 : q1;86 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that87 // angle and let f2,f1 fight it out85 q1 = (q1 < 0.0) ? 0.0 : q1; 86 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 87 // angle and let f2,f1 fight it out 88 88 q2 = 0.5*sqrt (q1); 89 89 } … … 121 121 if (fabs(beta[nParam]) > fabs(beta_lim)) { 122 122 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 123 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",124 nParam, beta[nParam], beta_lim);123 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 124 nParam, beta[nParam], beta_lim); 125 125 return false; 126 126 } … … 157 157 if (params[nParam] < params_min) { 158 158 params[nParam] = params_min; 159 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",160 nParam, params[nParam], params_min);159 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 160 nParam, params[nParam], params_min); 161 161 return false; 162 162 } … … 193 193 if (params[nParam] > params_max) { 194 194 params[nParam] = params_max; 195 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",196 nParam, params[nParam], params_max);195 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 196 nParam, params[nParam], params_max); 197 197 return false; 198 198 } … … 337 337 } 338 338 339 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)339 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, const pmPSF *psf) 340 340 { 341 341 … … 359 359 // convert to shape terms (SXX,SYY,SXY) 360 360 if (!pmPSF_FitToModel (out, 0.1)) { 361 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)",362 in[PM_PAR_YPOS], in[PM_PAR_XPOS]);363 return false;361 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", 362 in[PM_PAR_YPOS], in[PM_PAR_XPOS]); 363 return false; 364 364 } 365 365 … … 371 371 continue; 372 372 373 bool status = true;373 bool status = true; 374 374 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MIN, i, out, NULL); 375 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MAX, i, out, NULL);376 if (!status) {377 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)",378 in[PM_PAR_XPOS], in[PM_PAR_YPOS]);379 modelPSF->flags |= PM_MODEL_STATUS_LIMITS;380 }375 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MAX, i, out, NULL); 376 if (!status) { 377 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", 378 in[PM_PAR_XPOS], in[PM_PAR_YPOS]); 379 modelPSF->flags |= PM_MODEL_STATUS_LIMITS; 380 } 381 381 } 382 382 … … 386 386 // construct the PSF model from the FLT model and the psf 387 387 // XXX is this sufficiently general do be a global function, not a pmModelClass function? 388 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, pmPSF *psf, float Xo, float Yo, float Io)388 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, const pmPSF *psf, float Xo, float Yo, float Io) 389 389 { 390 390 psF32 *PAR = model->params->data.F32; … … 398 398 PAR[PM_PAR_XPOS] = Xo; 399 399 PAR[PM_PAR_YPOS] = Yo; 400 400 401 401 // supply the model-fitted parameters, or copy from the input 402 402 for (int i = 0; i < psf->params->n; i++) { 403 if (i == PM_PAR_SKY) continue;404 if (i == PM_PAR_I0) continue;405 if (i == PM_PAR_XPOS) continue;406 if (i == PM_PAR_YPOS) continue;407 pmTrend2D *trend = psf->params->data[i];408 PAR[i] = pmTrend2DEval(trend, Xo, Yo);403 if (i == PM_PAR_SKY) continue; 404 if (i == PM_PAR_I0) continue; 405 if (i == PM_PAR_XPOS) continue; 406 if (i == PM_PAR_YPOS) continue; 407 pmTrend2D *trend = psf->params->data[i]; 408 PAR[i] = pmTrend2DEval(trend, Xo, Yo); 409 409 } 410 410 … … 413 413 // XXX user-defined value for limit? 414 414 if (!pmPSF_FitToModel (PAR, 0.1)) { 415 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo);416 return false;415 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo); 416 return false; 417 417 } 418 418 … … 424 424 continue; 425 425 426 bool status = true;426 bool status = true; 427 427 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL); 428 428 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL); 429 if (!status) {430 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo);431 model->flags |= PM_MODEL_STATUS_LIMITS;432 }429 if (!status) { 430 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo); 431 model->flags |= PM_MODEL_STATUS_LIMITS; 432 } 433 433 } 434 434 return(true);
Note:
See TracChangeset
for help on using the changeset viewer.
