Changeset 8882 for trunk/psphot/src/models/pmModel_SGAUSS.c
- Timestamp:
- Sep 22, 2006, 2:29:31 AM (20 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/models/pmModel_SGAUSS.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/models/pmModel_SGAUSS.c
r5772 r8882 25 25 psF32 *PAR = params->data.F32; 26 26 27 psF32 X = x->data.F32[0] - PAR[ 2];28 psF32 Y = x->data.F32[1] - PAR[ 3];29 psF32 px = PAR[ 4]*X;30 psF32 py = PAR[ 5]*Y;31 psF32 z = PS_MAX((0.5*PS_SQR(px) + 0.5*PS_SQR(py) + PAR[ 6]*X*Y), 1e-8);32 // note that if z -> 0, dPAR[ 7] -> -inf33 // also z^(PAR[ 7]-1) -> Inf34 35 psF32 pr = z*PAR[ 8];27 psF32 X = x->data.F32[0] - PAR[PM_PAR_XPOS]; 28 psF32 Y = x->data.F32[1] - PAR[PM_PAR_YPOS]; 29 psF32 px = PAR[PM_PAR_SXX]*X; 30 psF32 py = PAR[PM_PAR_SYY]*Y; 31 psF32 z = PS_MAX((0.5*PS_SQR(px) + 0.5*PS_SQR(py) + PAR[PM_PAR_SXY]*X*Y), 1e-8); 32 // note that if z -> 0, dPAR[PM_PAR_7] -> -inf 33 // also z^(PAR[PM_PAR_7]-1) -> Inf 34 35 psF32 pr = z*PAR[PM_PAR_8]; 36 36 psF32 pr3 = pr*pr*pr; 37 psF32 p = pow(z, PAR[ 7] - 1.0);37 psF32 p = pow(z, PAR[PM_PAR_7] - 1.0); 38 38 psF32 r = 1.0 / (1 + z*p + pr*pr3); 39 psF32 f = PAR[ 1]*r + PAR[0];39 psF32 f = PAR[PM_PAR_FLUX]*r + PAR[PM_PAR_SKY]; 40 40 41 41 if (deriv != NULL) { 42 42 // note difference from a pure gaussian: q = params->data.F32[1]*r 43 psF32 t = PAR[ 1]*r*r;44 psF32 q = t*(PAR[ 7]*p + 4*PAR[8]*pr3);43 psF32 t = PAR[PM_PAR_FLUX]*r*r; 44 psF32 q = t*(PAR[PM_PAR_7]*p + 4*PAR[PM_PAR_8]*pr3); 45 45 46 46 deriv->data.F32[0] = +1.0; 47 47 deriv->data.F32[1] = +r; 48 deriv->data.F32[2] = q*(2.0*px*PAR[ 4] + PAR[6]*Y);49 deriv->data.F32[3] = q*(2.0*py*PAR[ 5] + PAR[6]*X);48 deriv->data.F32[2] = q*(2.0*px*PAR[PM_PAR_SXX] + PAR[PM_PAR_SXY]*Y); 49 deriv->data.F32[3] = q*(2.0*py*PAR[PM_PAR_SYY] + PAR[PM_PAR_SXY]*X); 50 50 deriv->data.F32[4] = -2.0*q*px*X; 51 51 deriv->data.F32[5] = -2.0*q*py*Y; … … 230 230 psF32 *PAR = params->data.F32; 231 231 232 psF64 A1 = PS_SQR(PAR[ 4]);233 psF64 A2 = PS_SQR(PAR[ 5]);234 psF64 A3 = PS_SQR(PAR[ 6]);232 psF64 A1 = PS_SQR(PAR[PM_PAR_SXX]); 233 psF64 A2 = PS_SQR(PAR[PM_PAR_SYY]); 234 psF64 A3 = PS_SQR(PAR[PM_PAR_SXY]); 235 235 psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - A3); 236 236 // Area is equivalent to 2 pi sigma^2 … … 239 239 norm = 0.0; 240 240 for (z = 0.005; z < 50; z += 0.01) { 241 psF32 pr = PAR[ 8]*z;242 f = 1.0 / (1 + pow(z, PAR[ 7]) + SQ(SQ(pr)));241 psF32 pr = PAR[PM_PAR_8]*z; 242 f = 1.0 / (1 + pow(z, PAR[PM_PAR_7]) + SQ(SQ(pr))); 243 243 norm += f; 244 244 } 245 245 norm *= 0.01; 246 246 247 psF64 Flux = PAR[ 1] * Area * norm;247 psF64 Flux = PAR[PM_PAR_FLUX] * Area * norm; 248 248 249 249 return(Flux); … … 262 262 263 263 if (flux <= 0) return (1.0); 264 if (PAR[ 1] <= 0) return (1.0);265 if (flux >= PAR[ 1]) return (1.0);264 if (PAR[PM_PAR_FLUX] <= 0) return (1.0); 265 if (flux >= PAR[PM_PAR_FLUX]) return (1.0); 266 266 267 267 // convert Sx,Sy,Sxy to major/minor axes 268 shape.sx = 1.0 / PAR[ 4];269 shape.sy = 1.0 / PAR[ 5];270 shape.sxy = PAR[ 6];268 shape.sx = 1.0 / PAR[PM_PAR_SXX]; 269 shape.sy = 1.0 / PAR[PM_PAR_SYY]; 270 shape.sxy = PAR[PM_PAR_SXY]; 271 271 272 272 axes = EllipseShapeToAxes (shape); 273 273 psF64 dr = 1.0 / axes.major; 274 psF64 limit = flux / PAR[ 1];274 psF64 limit = flux / PAR[PM_PAR_FLUX]; 275 275 276 276 // XXX : we can do this faster with an intelligent starting choice 277 277 for (r = 0.0; r < 20.0; r += dr) { 278 278 z = SQ(r); 279 pr = PAR[ 8]*z;280 f = 1.0 / (1 + pow(z, PAR[ 7]) + SQ(SQ(pr)));279 pr = PAR[PM_PAR_8]*z; 280 f = 1.0 / (1 + pow(z, PAR[PM_PAR_7]) + SQ(SQ(pr))); 281 281 if (f < limit) break; 282 282 } … … 315 315 psF32 *dPAR = model->dparams->data.F32; 316 316 317 shape.sx = 1.0 / PAR[ 4];318 shape.sy = 1.0 / PAR[ 5];319 shape.sxy = PAR[ 6];317 shape.sx = 1.0 / PAR[PM_PAR_SXX]; 318 shape.sy = 1.0 / PAR[PM_PAR_SYY]; 319 shape.sxy = PAR[PM_PAR_SXY]; 320 320 321 321 axes = EllipseShapeToAxes (shape); 322 322 323 323 dP = 0; 324 dP += PS_SQR(dPAR[ 4] / PAR[4]);325 dP += PS_SQR(dPAR[ 5] / PAR[5]);326 dP += PS_SQR(dPAR[ 7] / PAR[7]);324 dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]); 325 dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]); 326 dP += PS_SQR(dPAR[PM_PAR_7] / PAR[PM_PAR_7]); 327 327 dP = sqrt (dP); 328 328 329 329 status = true; 330 330 status &= (dP < 0.5); 331 status &= (PAR[ 1] > 0);332 status &= ((dPAR[ 1]/PAR[1]) < 0.5);333 status &= (fabs(PAR[ 8]) < 0.5);334 status &= (dPAR[ 8] < 0.1);331 status &= (PAR[PM_PAR_FLUX] > 0); 332 status &= ((dPAR[PM_PAR_FLUX]/PAR[PM_PAR_FLUX]) < 0.5); 333 status &= (fabs(PAR[PM_PAR_8]) < 0.5); 334 status &= (dPAR[PM_PAR_8] < 0.1); 335 335 status &= (axes.major > 1.41); 336 336 status &= (axes.minor > 1.41); 337 337 status &= ((axes.major / axes.minor) < 5.0); 338 status &= (PAR[ 7] > 0.5);338 status &= (PAR[PM_PAR_7] > 0.5); 339 339 340 340 if (status) return true;
Note:
See TracChangeset
for help on using the changeset viewer.
