Changeset 9733 for trunk/psphot/src/models/pmModel_SGAUSS.c
- Timestamp:
- Oct 24, 2006, 2:00:17 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/models/pmModel_SGAUSS.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/models/pmModel_SGAUSS.c
r9529 r9733 20 20 21 21 psF32 pmModelFunc_SGAUSS(psVector *deriv, 22 const psVector *params,23 const psVector *x)22 const psVector *params, 23 const psVector *x) 24 24 { 25 25 psF32 *PAR = params->data.F32; … … 31 31 psF32 z = PS_MAX((0.5*PS_SQR(px) + 0.5*PS_SQR(py) + PAR[PM_PAR_SXY]*X*Y), 1e-8); 32 32 // note that if z -> 0, dPAR[PM_PAR_7] -> -inf 33 // also z^(PAR[PM_PAR_7]-1) -> Inf 33 // also z^(PAR[PM_PAR_7]-1) -> Inf 34 34 35 35 psF32 pr = z*PAR[PM_PAR_8]; … … 42 42 // note difference from a pure gaussian: q = params->data.F32[1]*r 43 43 psF32 t = PAR[PM_PAR_I0]*r*r; 44 psF32 q = t*(PAR[PM_PAR_7]*p + 4*PAR[PM_PAR_8]*pr3);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; … … 111 111 xo = xc - image->col0; 112 112 yo = yc - image->row0; 113 114 psVector *contour = psVectorAlloc (Nt, PS_TYPE_F32);113 114 psVector *contour = psVectorAllocEmpty (Nt, PS_TYPE_F32); 115 115 for (t = 0, N = 0; (t < 2*M_PI) && (N < Nt); t += dt) { 116 x = ct*axes.major*cos(t) + st*axes.minor*sin(t) + xo;117 y = ct*axes.minor*sin(t) + st*axes.major*cos(t) + yo;118 value = p_psImageGetElementF64(image, x, y);119 if (isfinite(value)) {120 contour->data.F32[N] = value;121 N++;122 }116 x = ct*axes.major*cos(t) + st*axes.minor*sin(t) + xo; 117 y = ct*axes.minor*sin(t) + st*axes.major*cos(t) + yo; 118 value = p_psImageGetElementF64(image, x, y); 119 if (isfinite(value)) { 120 contour->data.F32[N] = value; 121 N++; 122 } 123 123 } 124 124 contour->n = N; … … 134 134 return (value); 135 135 } 136 136 137 137 bool pmModelGuess_SGAUSS (pmModel *model, pmSource *source) { 138 138 … … 144 144 EllipseShape shape; 145 145 EllipseMoments moments; 146 146 147 147 moments.x2 = PS_SQR(sMoments->Sx); 148 148 moments.y2 = PS_SQR(sMoments->Sy); … … 161 161 params[6] = shape.sxy; 162 162 163 # if (0) 163 # if (0) 164 164 f1 = psImageEllipseContour (axes, peak->x, peak->y, source->pixels); 165 165 axes.major *= 2.0; … … 168 168 169 169 if (f1 > f2) { 170 params[7] = PS_MIN (3.0, PS_MAX (0.5, log(2.0*(f1/f2) - 1.0) / log(2.0)));170 params[7] = PS_MIN (3.0, PS_MAX (0.5, log(2.0*(f1/f2) - 1.0) / log(2.0))); 171 171 } else { 172 params[7] = 0.5;172 params[7] = 0.5; 173 173 } 174 174 # endif … … 192 192 EllipseShape shape; 193 193 EllipseMoments moments; 194 194 195 195 moments.x2 = PS_SQR(sMoments->Sx); 196 196 moments.y2 = PS_SQR(sMoments->Sy); … … 215 215 216 216 if (f1 > f2) { 217 params[7] = PS_MIN (3.0, PS_MAX (0.5, log(2.0*(f1/f2) - 1.0) / log(2.0)));217 params[7] = PS_MIN (3.0, PS_MAX (0.5, log(2.0*(f1/f2) - 1.0) / log(2.0))); 218 218 } else { 219 params[7] = 0.5;219 params[7] = 0.5; 220 220 } 221 221 params[8] = 0.1; … … 240 240 for (z = 0.005; z < 50; z += 0.01) { 241 241 psF32 pr = PAR[PM_PAR_8]*z; 242 f = 1.0 / (1 + pow(z, PAR[PM_PAR_7]) + SQ(SQ(pr)));243 norm += f;242 f = 1.0 / (1 + pow(z, PAR[PM_PAR_7]) + SQ(SQ(pr))); 243 norm += f; 244 244 } 245 245 norm *= 0.01; 246 246 247 247 psF64 Flux = PAR[PM_PAR_I0] * Area * norm; 248 248 … … 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 z = SQ(r);279 pr = PAR[PM_PAR_8]*z;280 f = 1.0 / (1 + pow(z, PAR[PM_PAR_7]) + SQ(SQ(pr)));281 if (f < limit) break;278 z = SQ(r); 279 pr = PAR[PM_PAR_8]*z; 280 f = 1.0 / (1 + pow(z, PAR[PM_PAR_7]) + SQ(SQ(pr))); 281 if (f < limit) break; 282 282 } 283 283 psF64 radius = 2.0 * axes.major * sqrt (z); 284 284 if (isnan(radius)) { 285 fprintf (stderr, "error in code\n");285 fprintf (stderr, "error in code\n"); 286 286 } 287 287 return (radius); … … 292 292 psF32 *out = modelPSF->params->data.F32; 293 293 psF32 *in = modelFLT->params->data.F32; 294 294 295 295 out[0] = in[0]; 296 296 out[1] = in[1]; … … 299 299 300 300 for (int i = 4; i < 9; i++) { 301 psPolynomial2D *poly = psf->params->data[i-4];302 out[i] = psPolynomial2DEval (poly, out[2], out[3]);301 psPolynomial2D *poly = psf->params->data[i-4]; 302 out[i] = psPolynomial2DEval (poly, out[2], out[3]); 303 303 } 304 304 return(true); … … 311 311 EllipseAxes axes; 312 312 EllipseShape shape; 313 313 314 314 psF32 *PAR = model->params->data.F32; 315 315 psF32 *dPAR = model->dparams->data.F32;
Note:
See TracChangeset
for help on using the changeset viewer.
