Changeset 15834
- Timestamp:
- Dec 14, 2007, 2:58:11 PM (18 years ago)
- Location:
- trunk/psModules/src/objects/models
- Files:
-
- 9 edited
-
pmModel_GAUSS.c (modified) (13 diffs)
-
pmModel_PGAUSS.c (modified) (14 diffs)
-
pmModel_QGAUSS.c (modified) (13 diffs)
-
pmModel_RGAUSS.c (modified) (14 diffs)
-
pmModel_SERSIC.c (modified) (15 diffs)
-
pmModel_SGAUSS.c (modified) (3 diffs)
-
pmModel_TGAUSS.c (modified) (2 diffs)
-
pmModel_WAUSS.c (modified) (2 diffs)
-
pmModel_ZGAUSS.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/models/pmModel_GAUSS.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 pure Gaussian: 10 10 exp(-z) 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_GAUSS22 # define PM_MODEL_FLUX pmModelFlux_GAUSS23 # define PM_MODEL_GUESS pmModelGuess_GAUSS24 # define PM_MODEL_LIMITS pmModelLimits_GAUSS25 # define PM_MODEL_RADIUS pmModelRadius_GAUSS26 # define PM_MODEL_FROM_PSF pmModelFromPSF_GAUSS21 # 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 27 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_GAUSS 28 28 # define PM_MODEL_FIT_STATUS pmModelFitStatus_GAUSS … … 76 76 f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 77 77 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 78 q1 = PS_MAX (0.0, q1); 79 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that80 // angle and let f2,f1 fight it out78 q1 = PS_MAX (0.0, q1); 79 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 80 // angle and let f2,f1 fight it out 81 81 q2 = 0.5*sqrt (q1); 82 82 } … … 111 111 if (fabs(beta[nParam]) > fabs(beta_lim)) { 112 112 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 113 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",114 nParam, beta[nParam], beta_lim);113 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 114 nParam, beta[nParam], beta_lim); 115 115 return false; 116 116 } … … 144 144 if (params[nParam] < params_min) { 145 145 params[nParam] = params_min; 146 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",147 nParam, params[nParam], params_min);146 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 147 nParam, params[nParam], params_min); 148 148 return false; 149 149 } … … 177 177 if (params[nParam] > params_max) { 178 178 params[nParam] = params_max; 179 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",180 nParam, params[nParam], params_max);179 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 180 nParam, params[nParam], params_max); 181 181 return false; 182 182 } … … 260 260 261 261 // construct the PSF model from the FLT model and the psf 262 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)262 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, const pmPSF *psf) 263 263 { 264 264 psF32 *out = modelPSF->params->data.F32; … … 286 286 // XXX user-defined value for limit? 287 287 if (!pmPSF_FitToModel (out, 0.1)) { 288 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)",289 in[PM_PAR_YPOS], in[PM_PAR_XPOS]);290 return false;288 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", 289 in[PM_PAR_YPOS], in[PM_PAR_XPOS]); 290 return false; 291 291 } 292 292 … … 298 298 continue; 299 299 300 bool status = true;300 bool status = true; 301 301 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, out, NULL); 302 302 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, out, NULL); 303 if (!status) {304 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)",305 in[PM_PAR_XPOS], in[PM_PAR_YPOS]);306 modelPSF->flags |= PM_MODEL_STATUS_LIMITS;307 }303 if (!status) { 304 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", 305 in[PM_PAR_XPOS], in[PM_PAR_YPOS]); 306 modelPSF->flags |= PM_MODEL_STATUS_LIMITS; 307 } 308 308 } 309 309 return(true); … … 312 312 // construct the PSF model from the FLT model and the psf 313 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)314 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, const pmPSF *psf, float Xo, float Yo, float Io) 315 315 { 316 316 psF32 *PAR = model->params->data.F32; … … 324 324 PAR[PM_PAR_XPOS] = Xo; 325 325 PAR[PM_PAR_YPOS] = Yo; 326 326 327 327 // supply the model-fitted parameters, or copy from the input 328 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 pmTrend2D *trend = psf->params->data[i];334 PAR[i] = pmTrend2DEval(trend, Xo, Yo);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 pmTrend2D *trend = psf->params->data[i]; 334 PAR[i] = pmTrend2DEval(trend, Xo, Yo); 335 335 } 336 336 … … 339 339 // XXX user-defined value for limit? 340 340 if (!pmPSF_FitToModel (PAR, 0.1)) { 341 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo);342 return false;341 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo); 342 return false; 343 343 } 344 344 … … 350 350 continue; 351 351 352 bool status = true;352 bool status = true; 353 353 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL); 354 354 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL); 355 if (!status) {356 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo);357 model->flags |= PM_MODEL_STATUS_LIMITS;358 }355 if (!status) { 356 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo); 357 model->flags |= PM_MODEL_STATUS_LIMITS; 358 } 359 359 } 360 360 return(true); -
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); -
trunk/psModules/src/objects/models/pmModel_QGAUSS.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 linear term 10 10 1 / (1 + kz + z^2.25) 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_QGAUSS23 # define PM_MODEL_FLUX pmModelFlux_QGAUSS24 # define PM_MODEL_GUESS pmModelGuess_QGAUSS25 # define PM_MODEL_LIMITS pmModelLimits_QGAUSS26 # define PM_MODEL_RADIUS pmModelRadius_QGAUSS27 # define PM_MODEL_FROM_PSF pmModelFromPSF_QGAUSS22 # define PM_MODEL_FUNC pmModelFunc_QGAUSS 23 # define PM_MODEL_FLUX pmModelFlux_QGAUSS 24 # define PM_MODEL_GUESS pmModelGuess_QGAUSS 25 # define PM_MODEL_LIMITS pmModelLimits_QGAUSS 26 # define PM_MODEL_RADIUS pmModelRadius_QGAUSS 27 # define PM_MODEL_FROM_PSF pmModelFromPSF_QGAUSS 28 28 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_QGAUSS 29 29 # define PM_MODEL_FIT_STATUS pmModelFitStatus_QGAUSS … … 89 89 f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 90 90 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 91 q1 = (q1 < 0.0) ? 0.0 : q1;92 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that93 // angle and let f2,f1 fight it out91 q1 = (q1 < 0.0) ? 0.0 : q1; 92 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 93 // angle and let f2,f1 fight it out 94 94 q2 = 0.5*sqrt (q1); 95 95 } … … 127 127 if (fabs(beta[nParam]) > fabs(beta_lim)) { 128 128 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 129 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",130 nParam, beta[nParam], beta_lim);129 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 130 nParam, beta[nParam], beta_lim); 131 131 return false; 132 132 } … … 163 163 if (params[nParam] < params_min) { 164 164 params[nParam] = params_min; 165 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",166 nParam, params[nParam], params_min);165 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 166 nParam, params[nParam], params_min); 167 167 return false; 168 168 } … … 199 199 if (params[nParam] > params_max) { 200 200 params[nParam] = params_max; 201 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",202 nParam, params[nParam], params_max);201 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 202 nParam, params[nParam], params_max); 203 203 return false; 204 204 } … … 344 344 } 345 345 346 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)346 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, const pmPSF *psf) 347 347 { 348 348 … … 366 366 // convert to shape terms (SXX,SYY,SXY) 367 367 if (!pmPSF_FitToModel (out, 0.1)) { 368 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)",369 in[PM_PAR_YPOS], in[PM_PAR_XPOS]);370 return false;368 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", 369 in[PM_PAR_YPOS], in[PM_PAR_XPOS]); 370 return false; 371 371 } 372 372 … … 378 378 continue; 379 379 380 bool status = true;380 bool status = true; 381 381 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MIN, i, out, NULL); 382 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MAX, i, out, NULL);383 if (!status) {384 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)",385 in[PM_PAR_XPOS], in[PM_PAR_YPOS]);386 modelPSF->flags |= PM_MODEL_STATUS_LIMITS;387 }382 status &= PM_MODEL_LIMITS(PS_MINIMIZE_PARAM_MAX, i, out, NULL); 383 if (!status) { 384 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", 385 in[PM_PAR_XPOS], in[PM_PAR_YPOS]); 386 modelPSF->flags |= PM_MODEL_STATUS_LIMITS; 387 } 388 388 } 389 389 … … 393 393 // construct the PSF model from the FLT model and the psf 394 394 // XXX is this sufficiently general do be a global function, not a pmModelClass function? 395 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, pmPSF *psf, float Xo, float Yo, float Io)395 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, const pmPSF *psf, float Xo, float Yo, float Io) 396 396 { 397 397 psF32 *PAR = model->params->data.F32; … … 405 405 PAR[PM_PAR_XPOS] = Xo; 406 406 PAR[PM_PAR_YPOS] = Yo; 407 407 408 408 // supply the model-fitted parameters, or copy from the input 409 409 for (int i = 0; i < psf->params->n; i++) { 410 if (i == PM_PAR_SKY) continue;411 if (i == PM_PAR_I0) continue;412 if (i == PM_PAR_XPOS) continue;413 if (i == PM_PAR_YPOS) continue;414 pmTrend2D *trend = psf->params->data[i];415 PAR[i] = pmTrend2DEval(trend, Xo, Yo);410 if (i == PM_PAR_SKY) continue; 411 if (i == PM_PAR_I0) continue; 412 if (i == PM_PAR_XPOS) continue; 413 if (i == PM_PAR_YPOS) continue; 414 pmTrend2D *trend = psf->params->data[i]; 415 PAR[i] = pmTrend2DEval(trend, Xo, Yo); 416 416 } 417 417 … … 420 420 // XXX user-defined value for limit? 421 421 if (!pmPSF_FitToModel (PAR, 0.1)) { 422 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo);423 return false;422 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo); 423 return false; 424 424 } 425 425 … … 431 431 continue; 432 432 433 bool status = true;433 bool status = true; 434 434 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL); 435 435 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL); 436 if (!status) {437 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo);438 model->flags |= PM_MODEL_STATUS_LIMITS;439 }436 if (!status) { 437 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo); 438 model->flags |= PM_MODEL_STATUS_LIMITS; 439 } 440 440 } 441 441 return(true); -
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); -
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); -
trunk/psModules/src/objects/models/pmModel_SGAUSS.c
r9775 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 and outer tidal radius 10 10 1 / (1 + z^N + kz^4) 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 … … 23 23 /*** 24 24 XXXX the model in this file needs to be tested more carefully. 25 the code for guessing the power-law slope based on the radial profile 25 the code for guessing the power-law slope based on the radial profile 26 26 is either too slow or does not work well. 27 27 fix up the code to follow conventions in the other model function files. … … 234 234 } 235 235 236 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)236 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, const pmPSF *psf) 237 237 { 238 238 -
trunk/psModules/src/objects/models/pmModel_TGAUSS.c
r9775 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 fixed slope and fitted amplitude 10 10 1 / (1 + z + kz^2.2) 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 … … 154 154 } 155 155 156 bool PS_MODEL_FROM_PSF (psModel *modelPSF, psModel *modelFLT, pmPSF *psf)156 bool PS_MODEL_FROM_PSF (psModel *modelPSF, psModel *modelFLT, const pmPSF *psf) 157 157 { 158 158 -
trunk/psModules/src/objects/models/pmModel_WAUSS.c
r9775 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 linear term 10 10 1 / (1 + Az + Bz^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 … … 150 150 } 151 151 152 bool PS_MODEL_FROM_PSF (psModel *modelPSF, psModel *modelFLT, pmPSF *psf)152 bool PS_MODEL_FROM_PSF (psModel *modelPSF, psModel *modelFLT, const pmPSF *psf) 153 153 { 154 154 -
trunk/psModules/src/objects/models/pmModel_ZGAUSS.c
r9775 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 and tidal cutoff 10 10 1 / (1 + z^N + (Az)^4) 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 … … 203 203 } 204 204 205 bool PS_MODEL_FROM_PSF (psModel *modelPSF, psModel *modelFLT, pmPSF *psf)205 bool PS_MODEL_FROM_PSF (psModel *modelPSF, psModel *modelFLT, const pmPSF *psf) 206 206 { 207 207
Note:
See TracChangeset
for help on using the changeset viewer.
