Changeset 2854
- Timestamp:
- Dec 29, 2004, 10:59:52 PM (22 years ago)
- Location:
- trunk/Ohana/src/opihi
- Files:
-
- 2 edited
-
cmd.astro/imfit.c (modified) (7 diffs)
-
cmd.data/ungridify.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.astro/imfit.c
r2843 r2854 2 2 3 3 float fgaussTD (float, float, float *, int, float *); 4 float pgaussTD (float, float, float *, int, float *); 5 float vgaussTD (float, float, float *, int, float *); 6 float qgaussTD (float, float, float *, int, float *); 4 7 5 8 int imfit (int argc, char **argv) { … … 11 14 char line[64]; 12 15 Buffer *buf; 16 float (*fitfunc)(float, float, float *, int, float *); 13 17 14 18 Save = FALSE; … … 22 26 remove_argument (N, &argc, argv); 23 27 VERBOSE = TRUE; 28 } 29 30 Npar = 7; 31 fitfunc = fgaussTD; 32 if ((N = get_argument (argc, argv, "-pgauss"))) { 33 remove_argument (N, &argc, argv); 34 fitfunc = pgaussTD; 35 } 36 if ((N = get_argument (argc, argv, "-qgauss"))) { 37 remove_argument (N, &argc, argv); 38 fitfunc = qgaussTD; 39 } 40 if ((N = get_argument (argc, argv, "-vgauss"))) { 41 remove_argument (N, &argc, argv); 42 fitfunc = vgaussTD; 43 Npar = 9; 24 44 } 25 45 … … 42 62 if (sy + ny >= Ny) goto range; 43 63 44 Npar = 7;45 64 ALLOCATE (par, float, 2*Npar); 46 65 bzero (par, Npar*sizeof(float)); … … 73 92 par[5] = atof (get_variable ("Zpk")); 74 93 par[6] = atof (get_variable ("Sg")); 94 if (Npar == 9) { 95 par[7] = par[8] = 1; 96 } 75 97 76 98 /* run fit routine */ 77 ochisq = mrq2dinit (x, y, z, dz, Npts, par, Npar, f gaussTD, VERBOSE);99 ochisq = mrq2dinit (x, y, z, dz, Npts, par, Npar, fitfunc, VERBOSE); 78 100 dchisq = ochisq; 79 101 80 for (i = 0; (i < 20) && ((dchisq <= 0.0) || (dchisq > 0. 1*(Npts - Npar))); i++) {81 chisq = mrq2dmin (x, y, z, dz, Npts, par, Npar, f gaussTD, VERBOSE);102 for (i = 0; (i < 20) && ((dchisq <= 0.0) || (dchisq > 0.001*(Npts - Npar))); i++) { 103 chisq = mrq2dmin (x, y, z, dz, Npts, par, Npar, fitfunc, VERBOSE); 82 104 dchisq = ochisq - chisq; 83 105 ochisq = chisq; … … 110 132 for (j = 0; j < ny; j++) { 111 133 for (i = 0; i < nx; i++) { 112 vf = f gaussTD((float)(i+sx), (float)(j+sy), par, Npar, dpar);134 vf = fitfunc ((float)(i+sx), (float)(j+sy), par, Npar, dpar); 113 135 vr = Vi[(i+sx)+(j+sy)*Nx]; 114 136 Vo[(i )+(j )*2*nx] = vr; … … 172 194 return (f); 173 195 } 196 197 /***** fix the derivatives. q should not be in function */ 198 /* pars: x, y, sx, sy, sxy, I, sky */ 199 float pgaussTD (float x, float y, float *par, int Npar, float *dpar) { 200 201 float X, Y, px, py; 202 float z, r, q, f; 203 204 X = x - par[0]; 205 Y = y - par[1]; 206 207 px = par[2]*X; 208 py = par[3]*Y; 209 210 z = 0.5*SQ(px) + 0.5*SQ(py) + par[4]*X*Y; 211 r = 1.0 / (1 + z + 0.5*z*z*(1 + z/3)); /* ~ exp (-Z) */ 212 q = par[5]*r; 213 k = q*r*(1 + z + 0.5*z*z); 214 /* note difference from gaussian: q = par[5]*r */ 215 f = q + par[6]; 216 217 dpar[0] = q*(2*px*par[2] + par[4]*Y); 218 dpar[1] = q*(2*py*par[3] + par[4]*X); 219 dpar[2] = -2*q*px*X; 220 dpar[3] = -2*q*py*Y; 221 dpar[4] = -q*X*Y; 222 dpar[5] = +r; 223 dpar[6] = +1; 224 225 return (f); 226 } 227 228 /* pars: x, y, sx, sy, sxy, I, sky, f1, f2 */ 229 float vgaussTD (float x, float y, float *par, int Npar, float *dpar) { 230 231 float X, Y, px, py; 232 float z, r, q, f; 233 234 X = x - par[0]; 235 Y = y - par[1]; 236 237 px = par[2]*X; 238 py = par[3]*Y; 239 240 z = 0.5*SQ(px) + 0.5*SQ(py) + par[4]*X*Y; 241 r = 1.0 / (1 + z + par[7]*0.5*z*z*(1 + par[8]*z/3)); /* ~ exp (-Z) */ 242 q = par[5]*r*r*(1 + z + 0.5*z*z); 243 /* note difference from gaussian: q = par[5]*r */ 244 f = q + par[6]; 245 246 dpar[0] = q*(2*px*par[2] + par[4]*Y); 247 dpar[1] = q*(2*py*par[3] + par[4]*X); 248 dpar[2] = -2*q*px*X; 249 dpar[3] = -2*q*py*Y; 250 dpar[4] = -q*X*Y; 251 dpar[5] = +r; 252 dpar[6] = +1; 253 dpar[7] = +par[5]*r*z*z/2; 254 dpar[8] = +dpar[7]*z/3; 255 256 return (f); 257 } 258 259 /* pars: x, y, sx, sy, sxy, I, sky */ 260 float qgaussTD (float x, float y, float *par, int Npar, float *dpar) { 261 262 float X, Y, px, py; 263 float z, r, q, f; 264 265 X = x - par[0]; 266 Y = y - par[1]; 267 268 px = par[2]*X; 269 py = par[3]*Y; 270 271 z = 0.5*SQ(px) + 0.5*SQ(py) + par[4]*X*Y; 272 r = 1.0 / (1 + z + par[7]*pow(z,par[8])); /* ~ exp (-Z) */ 273 q = par[5]*r*r*par[7]*par[8]*pow(z,par[8]-1.0); 274 /* note difference from gaussian: q = par[5]*r */ 275 f = q + par[6]; 276 277 dpar[0] = q*(2*px*par[2] + par[4]*Y); 278 dpar[1] = q*(2*py*par[3] + par[4]*X); 279 dpar[2] = -2*q*px*X; 280 dpar[3] = -2*q*py*Y; 281 dpar[4] = -q*X*Y; 282 dpar[5] = +r; 283 dpar[6] = +1; 284 285 return (f); 286 } 287 174 288 /* alternate for exp(-z) */ 175 289 /* E = 1.0 / (1 + f1*Z + f2*(0.5*Z*Z + 0.1666666*Z*Z*Z)); */ /* ~ exp (-Z) */ -
trunk/Ohana/src/opihi/cmd.data/ungridify.c
r2844 r2854 10 10 Vector *vx, *vy, *vz; 11 11 12 if (argc != 11) {12 if (argc != 9) { 13 13 fprintf (stderr, "USAGE: ungridify buffer Xmin Xmax Ymin Ymax x y z\n"); 14 14 return (FALSE); 15 15 } 16 16 17 if ((bf = SelectBuffer (argv[1], ANYBUFFER, TRUE)) == NULL) return (FALSE);17 if ((bf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE); 18 18 Xmin = atof (argv[2]); 19 19 Xmax = atof (argv[3]); … … 26 26 NY = bf[0].matrix.Naxis[1]; 27 27 28 if ((vx = SelectVector (argv[6], OLDVECTOR, TRUE)) == NULL) return (FALSE);29 if ((vy = SelectVector (argv[7], OLDVECTOR, TRUE)) == NULL) return (FALSE);30 if ((vz = SelectVector (argv[8], OLDVECTOR, TRUE)) == NULL) return (FALSE);28 if ((vx = SelectVector (argv[6], ANYVECTOR, TRUE)) == NULL) return (FALSE); 29 if ((vy = SelectVector (argv[7], ANYVECTOR, TRUE)) == NULL) return (FALSE); 30 if ((vz = SelectVector (argv[8], ANYVECTOR, TRUE)) == NULL) return (FALSE); 31 31 REALLOCATE (vx[0].elements, float, Nx*Ny); 32 32 REALLOCATE (vy[0].elements, float, Nx*Ny);
Note:
See TracChangeset
for help on using the changeset viewer.
