- 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_QGAUSS.c
r25754 r27838 39 39 # define PM_MODEL_SET_LIMITS pmModelSetLimits_QGAUSS 40 40 41 # define ALPHA 2.250 42 # define ALPHA_M 1.250 43 41 44 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) 42 45 // 0.5 PIX: the parameters are defined in terms of pixel coords, so the incoming pixcoords … … 44 47 45 48 // Lax parameter limits 46 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.1};49 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -1.0 }; 47 50 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 48 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 }; 56 49 57 // Strict parameter limits 50 static float *paramsMinStrict = paramsMinLax; 51 static float *paramsMaxStrict = paramsMaxLax; 58 // k = PAR_7 < 0 is very undesirable (big divot in the middle) 59 static float paramsMinStrict[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.0 }; 60 static float paramsMaxStrict[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 52 61 53 62 // Parameter limits to use 54 63 static float *paramsMinUse = paramsMinLax; 55 64 static float *paramsMaxUse = paramsMaxLax; 56 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5 };65 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5, 2.0 }; 57 66 58 67 static bool limitsApply = true; // Apply limits? … … 77 86 assert (z >= 0); 78 87 79 psF32 zp = pow(z, 1.25);88 psF32 zp = pow(z,ALPHA_M); 80 89 psF32 r = 1.0 / (1 + PAR[PM_PAR_7]*z + z*zp); 81 90 … … 88 97 // note difference from a pure gaussian: q = params->data.F32[PM_PAR_I0]*r 89 98 psF32 t = r1*r; 90 psF32 q = t*(PAR[PM_PAR_7] + 2.25*zp);99 psF32 q = t*(PAR[PM_PAR_7] + ALPHA*zp); 91 100 92 101 dPAR[PM_PAR_SKY] = +1.0; … … 242 251 float f1, f2; 243 252 for (z = DZ; z < 50; z += DZ) { 244 f1 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25));253 f1 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, ALPHA)); 245 254 z += DZ; 246 f2 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25));255 f2 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, ALPHA)); 247 256 norm += f0 + 4*f1 + f2; 248 257 f0 = f2; … … 259 268 psF64 PM_MODEL_RADIUS (const psVector *params, psF64 flux) 260 269 { 261 psF64 z , f;270 psF64 z; 262 271 int Nstep = 0; 263 272 psEllipseShape shape; … … 265 274 psF32 *PAR = params->data.F32; 266 275 267 if (flux <= 0) 268 return (1.0); 269 if (PAR[PM_PAR_I0] <= 0) 270 return (1.0); 271 if (flux >= PAR[PM_PAR_I0]) 272 return (1.0); 276 if (flux <= 0) return 1.0; 277 if (PAR[PM_PAR_I0] <= 0) return 1.0; 278 if (flux >= PAR[PM_PAR_I0]) return 1.0; 279 if (PAR[PM_PAR_7] == 0.0) return powf(PAR[PM_PAR_I0] / flux - 1.0, 1.0 / ALPHA); 273 280 274 281 shape.sx = PAR[PM_PAR_SXX] / M_SQRT2; … … 286 293 287 294 // choose a z value guaranteed to be beyond our limit 288 float z0 = pow((1.0 / limit), (1.0 / 2.25)); 289 psAssert (isfinite(z0), "fix this code: z0 should not be nan for %f", PAR[PM_PAR_7]); 290 float z1 = (1.0 / limit) / PAR[PM_PAR_7]; 295 float z0 = 0.0; 296 float z1 = pow((1.0 / limit), (1.0 / ALPHA)); 291 297 psAssert (isfinite(z1), "fix this code: z1 should not be nan for %f", PAR[PM_PAR_7]); 292 z1 = PS_MAX (z0, z1); 293 z0 = 0.0; 294 295 // perform a type of bisection to find the value 296 float f0 = 1.0 / (1 + PAR[PM_PAR_7]*z0 + pow(z0, 2.25)); 297 float f1 = 1.0 / (1 + PAR[PM_PAR_7]*z1 + pow(z1, 2.25)); 298 while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) { 299 z = 0.5*(z0 + z1); 300 f = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25)); 301 if (f > limit) { 302 z0 = z; 303 f0 = f; 304 } else { 305 z1 = z; 306 f1 = f; 307 } 308 Nstep ++; 298 if (PAR[PM_PAR_7] < 0.0) z1 *= 2.0; 299 300 // starting guess: 301 z = 0.5*(z0 + z1); 302 float dz = 1.0; 303 304 // use Newton-Raphson to minimize f(z) - limit = 0 305 for (int i = 0; (i < 10) && (fabs(dz) > 0.0001); i++) { 306 float q = (1.0 + PAR[PM_PAR_7]*z + pow(z, ALPHA)); 307 float dqdz = (PAR[PM_PAR_7] + ALPHA*pow(z, ALPHA - 1.0)); 308 309 float f = 1.0 / q; 310 float dfdz = -dqdz * f / q; 311 312 dz = (f - limit) / dfdz; 313 314 // fprintf (stderr, "%f %f %f : %f %f\n", f, z, dz, dfdz, q); 315 z -= dz; 316 z = PS_MAX(z, 0.0); 309 317 } 310 318 psF64 radius = sigma * sqrt (2.0 * z); … … 446 454 limitsApply = true; 447 455 break; 456 case PM_MODEL_LIMITS_MODERATE: 457 paramsMinUse = paramsMinModerate; 458 paramsMaxUse = paramsMaxModerate; 459 limitsApply = true; 460 break; 448 461 case PM_MODEL_LIMITS_STRICT: 449 462 paramsMinUse = paramsMinStrict; … … 466 479 # undef PM_MODEL_FIT_STATUS 467 480 # undef PM_MODEL_SET_LIMITS 481 # undef ALPHA 482 # undef ALPHA_M
Note:
See TracChangeset
for help on using the changeset viewer.
