- Timestamp:
- May 3, 2010, 8:41:49 AM (16 years ago)
- Location:
- branches/tap_branches
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/tap_branches
- Property svn:mergeinfo changed
-
branches/tap_branches/psModules
-
Property svn:mergeinfo
set to (toggle deleted branches)
/trunk/psModules merged eligible /branches/eam_branches/stackphot.20100406/psModules 27623-27653 /branches/pap_delete/psModules 27530-27595
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/tap_branches/psModules/src/objects/models/pmModel_PS1_V1.c
r25754 r27838 49 49 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -1.0 }; 50 50 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 51 52 // Moderate parameter limits 53 // Tolerate a small divot (k < 0) 54 static float paramsMinModerate[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -0.05 }; 55 static float paramsMaxModerate[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 51 56 52 57 // Strict parameter limits … … 262 267 psF64 PM_MODEL_RADIUS (const psVector *params, psF64 flux) 263 268 { 264 psF64 z , f;269 psF64 z; 265 270 int Nstep = 0; 266 271 psEllipseShape shape; … … 268 273 psF32 *PAR = params->data.F32; 269 274 270 if (flux <= 0) { 271 return 1.0; 272 } 273 if (PAR[PM_PAR_I0] <= 0) { 274 return 1.0; 275 } 276 if (flux >= PAR[PM_PAR_I0]) { 277 return 1.0; 278 } 279 if (PAR[PM_PAR_7] == 0.0) { 280 return powf(PAR[PM_PAR_I0] / flux - 1.0, 1.0 / ALPHA); 281 } 275 if (flux <= 0) return 1.0; 276 if (PAR[PM_PAR_I0] <= 0) return 1.0; 277 if (flux >= PAR[PM_PAR_I0]) return 1.0; 278 if (PAR[PM_PAR_7] == 0.0) return powf(PAR[PM_PAR_I0] / flux - 1.0, 1.0 / ALPHA); 282 279 283 280 shape.sx = PAR[PM_PAR_SXX] / M_SQRT2; … … 300 297 if (PAR[PM_PAR_7] < 0.0) z1 *= 2.0; 301 298 302 // perform a type of bisection to find the value 303 float f0 = 1.0 / (1 + PAR[PM_PAR_7]*z0 + pow(z0, ALPHA)); 304 float f1 = 1.0 / (1 + PAR[PM_PAR_7]*z1 + pow(z1, ALPHA)); 305 while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) { 306 z = 0.5*(z0 + z1); 307 f = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, ALPHA)); 308 if (f > limit) { 309 z0 = z; 310 f0 = f; 311 } else { 312 z1 = z; 313 f1 = f; 314 } 315 Nstep ++; 299 // starting guess: 300 z = 0.5*(z0 + z1); 301 float dz = 1.0; 302 303 // use Newton-Raphson to minimize f(z) - limit = 0 304 for (int i = 0; (i < 10) && (fabs(dz) > 0.0001); i++) { 305 float q = (1.0 + PAR[PM_PAR_7]*z + pow(z, ALPHA)); 306 float dqdz = (PAR[PM_PAR_7] + ALPHA*pow(z, ALPHA - 1.0)); 307 308 float f = 1.0 / q; 309 float dfdz = -dqdz * f / q; 310 311 dz = (f - limit) / dfdz; 312 313 // fprintf (stderr, "%f %f %f : %f %f\n", f, z, dz, dfdz, q); 314 z -= dz; 315 z = PS_MAX(z, 0.0); 316 316 } 317 317 psF64 radius = sigma * sqrt (2.0 * z); … … 345 345 // convert to shape terms (SXX,SYY,SXY) 346 346 if (!pmPSF_FitToModel (out, 0.1)) { 347 // psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", in[PM_PAR_YPOS], in[PM_PAR_XPOS]);348 347 psTrace("psModules.objects", 5, "Failed to fit object at (r,c) = (%.1f,%.1f)", in[PM_PAR_YPOS], in[PM_PAR_XPOS]); 349 348 return false; … … 454 453 limitsApply = true; 455 454 break; 455 case PM_MODEL_LIMITS_MODERATE: 456 paramsMinUse = paramsMinModerate; 457 paramsMaxUse = paramsMaxModerate; 458 limitsApply = true; 459 break; 456 460 case PM_MODEL_LIMITS_STRICT: 457 461 paramsMinUse = paramsMinStrict; … … 464 468 return; 465 469 } 466 467 470 468 471 # undef PM_MODEL_FUNC
Note:
See TracChangeset
for help on using the changeset viewer.
