Changeset 15834 for trunk/psModules/src/objects/models/pmModel_SERSIC.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_SERSIC.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 f = exp(-z^n) 10 10 11 11 * PM_PAR_SKY 0 - local sky : note that this is unused and may be dropped in the future 12 12 * PM_PAR_I0 1 - central intensity … … 23 23 *****************************************************************************/ 24 24 25 # define PM_MODEL_FUNC pmModelFunc_SERSIC26 # define PM_MODEL_FLUX pmModelFlux_SERSIC27 # define PM_MODEL_GUESS pmModelGuess_SERSIC28 # define PM_MODEL_LIMITS pmModelLimits_SERSIC29 # define PM_MODEL_RADIUS pmModelRadius_SERSIC30 # define PM_MODEL_FROM_PSF pmModelFromPSF_SERSIC25 # define PM_MODEL_FUNC pmModelFunc_SERSIC 26 # define PM_MODEL_FLUX pmModelFlux_SERSIC 27 # define PM_MODEL_GUESS pmModelGuess_SERSIC 28 # define PM_MODEL_LIMITS pmModelLimits_SERSIC 29 # define PM_MODEL_RADIUS pmModelRadius_SERSIC 30 # define PM_MODEL_FROM_PSF pmModelFromPSF_SERSIC 31 31 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_SERSIC 32 32 # define PM_MODEL_FIT_STATUS pmModelFitStatus_SERSIC … … 64 64 psF32 *dPAR = deriv->data.F32; 65 65 66 // gradient is infinite for z = 0; saturate at z = 0.0167 psF32 z1 = (z < 0.01) ? z0*PAR[PM_PAR_7]*pow(0.01,PAR[PM_PAR_7] - 1.0) : z0*PAR[PM_PAR_7]*pow(z,PAR[PM_PAR_7] - 1.0);66 // gradient is infinite for z = 0; saturate at z = 0.01 67 psF32 z1 = (z < 0.01) ? z0*PAR[PM_PAR_7]*pow(0.01,PAR[PM_PAR_7] - 1.0) : z0*PAR[PM_PAR_7]*pow(z,PAR[PM_PAR_7] - 1.0); 68 68 69 69 dPAR[PM_PAR_SKY] = +1.0; … … 71 71 dPAR[PM_PAR_7] = (z == 0.0) ? 0.0 : -z0*f2*log(z); 72 72 73 assert (isfinite(z1));74 assert (isfinite(dPAR[PM_PAR_7]));73 assert (isfinite(z1)); 74 assert (isfinite(dPAR[PM_PAR_7])); 75 75 76 76 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0*px/PAR[PM_PAR_SXX] + Y*PAR[PM_PAR_SXY]); … … 99 99 f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 100 100 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 101 q1 = (q1 < 0.0) ? 0.0 : q1;102 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that103 // angle and let f2,f1 fight it out101 q1 = (q1 < 0.0) ? 0.0 : q1; 102 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 103 // angle and let f2,f1 fight it out 104 104 q2 = 0.5*sqrt (q1); 105 105 } … … 137 137 if (fabs(beta[nParam]) > fabs(beta_lim)) { 138 138 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 139 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",140 nParam, beta[nParam], beta_lim);139 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 140 nParam, beta[nParam], beta_lim); 141 141 return false; 142 142 } … … 173 173 if (params[nParam] < params_min) { 174 174 params[nParam] = params_min; 175 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",176 nParam, params[nParam], params_min);175 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 176 nParam, params[nParam], params_min); 177 177 return false; 178 178 } … … 209 209 if (params[nParam] > params_max) { 210 210 params[nParam] = params_max; 211 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",212 nParam, params[nParam], params_max);211 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 212 nParam, params[nParam], params_max); 213 213 return false; 214 214 } … … 329 329 } 330 330 331 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)331 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, const pmPSF *psf) 332 332 { 333 333 … … 351 351 // convert to shape terms (SXX,SYY,SXY) 352 352 if (!pmPSF_FitToModel (out, 0.1)) { 353 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)",354 in[PM_PAR_YPOS], in[PM_PAR_XPOS]);355 return false;353 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", 354 in[PM_PAR_YPOS], in[PM_PAR_XPOS]); 355 return false; 356 356 } 357 357 … … 363 363 continue; 364 364 365 bool status = true;365 bool status = true; 366 366 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MIN, i, out, NULL); 367 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MAX, i, out, NULL);368 if (!status) {369 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)",370 in[PM_PAR_XPOS], in[PM_PAR_YPOS]);371 modelPSF->flags |= PM_MODEL_STATUS_LIMITS;372 }367 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MAX, i, out, NULL); 368 if (!status) { 369 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", 370 in[PM_PAR_XPOS], in[PM_PAR_YPOS]); 371 modelPSF->flags |= PM_MODEL_STATUS_LIMITS; 372 } 373 373 } 374 374 … … 378 378 // construct the PSF model from the FLT model and the psf 379 379 // XXX is this sufficiently general do be a global function, not a pmModelClass function? 380 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, pmPSF *psf, float Xo, float Yo, float Io)380 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, const pmPSF *psf, float Xo, float Yo, float Io) 381 381 { 382 382 psF32 *PAR = model->params->data.F32; … … 390 390 PAR[PM_PAR_XPOS] = Xo; 391 391 PAR[PM_PAR_YPOS] = Yo; 392 392 393 393 // supply the model-fitted parameters, or copy from the input 394 394 for (int i = 0; i < psf->params->n; i++) { 395 if (i == PM_PAR_SKY) continue;396 if (i == PM_PAR_I0) continue;397 if (i == PM_PAR_XPOS) continue;398 if (i == PM_PAR_YPOS) continue;399 pmTrend2D *trend = psf->params->data[i];400 PAR[i] = pmTrend2DEval(trend, Xo, Yo);395 if (i == PM_PAR_SKY) continue; 396 if (i == PM_PAR_I0) continue; 397 if (i == PM_PAR_XPOS) continue; 398 if (i == PM_PAR_YPOS) continue; 399 pmTrend2D *trend = psf->params->data[i]; 400 PAR[i] = pmTrend2DEval(trend, Xo, Yo); 401 401 } 402 402 … … 405 405 // XXX user-defined value for limit? 406 406 if (!pmPSF_FitToModel (PAR, 0.1)) { 407 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo);408 return false;407 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo); 408 return false; 409 409 } 410 410 … … 416 416 continue; 417 417 418 bool status = true;418 bool status = true; 419 419 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL); 420 420 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL); 421 if (!status) {422 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo);423 model->flags |= PM_MODEL_STATUS_LIMITS;424 }421 if (!status) { 422 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo); 423 model->flags |= PM_MODEL_STATUS_LIMITS; 424 } 425 425 } 426 426 return(true);
Note:
See TracChangeset
for help on using the changeset viewer.
