Changeset 2938
- Timestamp:
- Jan 8, 2005, 2:45:18 PM (22 years ago)
- Location:
- trunk/Ohana/src/opihi
- Files:
-
- 7 edited
-
cmd.astro/imfit.c (modified) (15 diffs)
-
cmd.data/gridify.c (modified) (4 diffs)
-
cmd.data/imsmooth.c (modified) (2 diffs)
-
lib.data/mrq2dmin.c (modified) (5 diffs)
-
mana/findpeaks.c (modified) (7 diffs)
-
mana/findrowpeaks.c (modified) (2 diffs)
-
mana/rawstars.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.astro/imfit.c
r2886 r2938 1 1 # include "astro.h" 2 # define FFACTOR 200 3 # define FSCALE 1.2 4 5 float mrq2dchi (float *x, float *t, float *y, float *dy, int Npts, 6 float *par, int Npar, 7 float (funcs)(float, float, float *, int, float *)); 2 8 3 9 float fgaussTD (float, float, float *, int, float *); 4 10 float pgaussTD (float, float, float *, int, float *); 11 float sgaussTD (float, float, float *, int, float *); 5 12 float vgaussTD (float, float, float *, int, float *); 6 float qgaussTD (float, float, float *, int, float *); 13 14 float PgaussTD (float, float, float *, int, float *); 15 float SgaussTD (float, float, float *, int, float *); 16 17 float tgaussTD (float, float, float *, int, float *); 7 18 float rgaussTD (float, float, float *, int, float *); 8 float sgaussTD (float, float, float *, int, float *);9 19 10 20 static float Npow; 21 static float Npin; 22 static int MissingVariable = FALSE; 23 static float *fpar; 24 static int Nfpar; 25 26 int mrq2dlimits (float *pmin, float *pmax, int Npar); 27 28 float get_variable_default (char *name, float dvalue) { 29 30 char *value; 31 float fvalue; 32 33 value = get_variable (name); 34 if (value == NULL) { 35 MissingVariable = TRUE; 36 return (dvalue); 37 } 38 fvalue = atof (value); 39 return (fvalue); 40 } 11 41 12 42 int imfit (int argc, char **argv) { 13 43 14 int i, j, N, Npts, Npar, Save, VERBOSE ;44 int i, j, N, Npts, Npar, Save, VERBOSE, ShapeVariation; 15 45 int sx, sy, nx, ny, Nx, Ny; 16 46 float chisq, ochisq, dchisq, Gain, RDnoise; 17 float *x, *y, *z, *dz, *par, *V ;47 float *x, *y, *z, *dz, *par, *V, *parmin, *parmax; 18 48 char line[64]; 19 49 Buffer *buf; … … 26 56 } 27 57 58 ShapeVariation = FALSE; 59 if ((N = get_argument (argc, argv, "-shapes"))) { 60 remove_argument (N, &argc, argv); 61 ShapeVariation = TRUE; 62 } 63 28 64 /* Gain in e/DN */ 29 65 Gain = 1.0; … … 49 85 50 86 /* set fitting function */ 87 Nfpar = 0; 51 88 Npar = 7; 52 89 fitfunc = fgaussTD; … … 60 97 fitfunc = pgaussTD; 61 98 } 62 if (!strcmp(argv[N], "qgauss")) {63 fitfunc = qgaussTD;64 Npar = 9;65 }66 99 if (!strcmp(argv[N], "vgauss")) { 67 100 fitfunc = vgaussTD; 68 101 Npar = 9; 69 102 } 70 if (!strcmp(argv[N], "rgauss")) {71 fitfunc = rgaussTD;72 Npar = 11;73 }74 103 if (!strcmp(argv[N], "sgauss")) { 75 104 fitfunc = sgaussTD; 76 105 Npar = 10; 106 } 107 if (!strcmp(argv[N], "rgauss")) { 108 fitfunc = rgaussTD; 109 Npar = 10; 110 } 111 if (!strcmp(argv[N], "tgauss")) { 112 fitfunc = tgaussTD; 113 Npar = 10; 114 } 115 if (!strcmp(argv[N], "Pgauss")) { 116 fitfunc = PgaussTD; 117 Npar = 4; 118 Nfpar = 3; 119 } 120 if (!strcmp(argv[N], "Sgauss")) { 121 fitfunc = SgaussTD; 122 Npar = 4; 123 Nfpar = 6; 77 124 } 78 125 if (fitfunc == NULL) { … … 102 149 if (sy + ny >= Ny) goto range; 103 150 104 ALLOCATE (par, float, 2*Npar);151 ALLOCATE (par, float, Npar); 105 152 bzero (par, Npar*sizeof(float)); 153 if (Nfpar > 0) { 154 ALLOCATE (fpar, float, Nfpar); 155 bzero (fpar, Nfpar*sizeof(float)); 156 } 106 157 107 158 /* convert array z[x,y] to x[i], y[i], z[i] */ … … 127 178 128 179 /* make initial guesses on parameters */ 129 par[0] = atof (get_variable ("Xg")); 130 par[1] = atof (get_variable ("Yg")); 131 par[2] = 2.35 * sqrt(2.0) / atof (get_variable ("SXg")); 132 par[3] = 2.35 * sqrt(2.0) / atof (get_variable ("SYg")); 133 par[4] = 0.0; 134 par[5] = atof (get_variable ("Zpk")); 135 par[6] = atof (get_variable ("Sg")); 136 if (Npar == 9) { 180 if (Npar >= 7) { 181 par[0] = get_variable_default ("Xg", 0); 182 par[1] = get_variable_default ("Yg", 0); 183 par[2] = 2.35 * sqrt(2.0) / get_variable_default ("SXg", 2.0); 184 par[3] = 2.35 * sqrt(2.0) / get_variable_default ("SYg", 2.0); 185 par[4] = 0.0; 186 par[5] = get_variable_default ("Zpk", 10000); 187 par[6] = get_variable_default ("Sg", 0.0); 188 } 189 if (Npar == 4) { 190 par[0] = get_variable_default ("Xg", 0); 191 par[1] = get_variable_default ("Yg", 0); 192 par[2] = get_variable_default ("Zpk", 10000); 193 par[3] = get_variable_default ("Sg", 0.0); 194 } 195 if (Npar == 9) { /** vgauss **/ 137 196 par[7] = par[8] = 1; 138 197 } 139 if (Npar == 11) { 140 par[7] = 0.2*par[5]; 141 par[8] = 0.25*par[2]; 142 par[9] = 0.25*par[3]; 143 par[10] = 0.0; 144 } 145 if (Npar == 10) { 146 Npow = atof (get_variable ("Npow")); 147 par[7] = 2.35 * sqrt(2.0) / atof (get_variable ("SXf")); 148 par[8] = 2.35 * sqrt(2.0) / atof (get_variable ("SYf")); 198 if (Npar == 10) { /** sgauss, tgauss, rgauss **/ 199 Npow = get_variable_default ("Npow", 2.25); 200 Npin = get_variable_default ("Npin", 1.00); 201 par[7] = 2.35 * sqrt(2.0) / get_variable_default ("SXf", 15.0); 202 par[8] = 2.35 * sqrt(2.0) / get_variable_default ("SYf", 15.0); 149 203 par[9] = 0.0; 150 204 } 151 205 if (fitfunc == PgaussTD) { 206 fpar[0] = 2.35 * sqrt(2.0) / get_variable_default ("SXg", 15.0); 207 fpar[1] = 2.35 * sqrt(2.0) / get_variable_default ("SYg", 15.0); 208 fpar[2] = get_variable_default ("SXYg", 15.0); 209 } 210 if (fitfunc == SgaussTD) { 211 fpar[0] = 2.35 * sqrt(2.0) / get_variable_default ("SXg", 15.0); 212 fpar[1] = 2.35 * sqrt(2.0) / get_variable_default ("SYg", 15.0); 213 fpar[2] = get_variable_default ("SXYg", 15.0); 214 fpar[3] = 2.35 * sqrt(2.0) / get_variable_default ("SXf", 15.0); 215 fpar[4] = 2.35 * sqrt(2.0) / get_variable_default ("SYf", 15.0); 216 fpar[5] = get_variable_default ("SXYf", 15.0); 217 } 152 218 153 219 /* run fit routine */ … … 159 225 dchisq = ochisq - chisq; 160 226 ochisq = chisq; 161 if (VERBOSE) fprintf (stderr, "dchisq: %f, Ndof: %d\n", dchisq, Npts - Npar);162 227 } 163 228 164 /** create output image (keep in sky : par[6]?) **/ 229 if (ShapeVariation) { 230 /* find dChi/dSx and dChi/dSy given by increasing shape terms by 5% */ 231 float tp1, tp2, chix, chiy; 232 chix = chiy = 0; 233 if (fitfunc == sgaussTD) { 234 tp1 = par[2]; 235 tp2 = par[7]; 236 par[2] = par[2]*1.05; 237 par[7] = par[7]*1.05; 238 chix = mrq2dchi (x, y, z, dz, Npts, par, Npar, fitfunc) - chisq; 239 par[2] = tp1; 240 par[7] = tp2; 241 242 tp1 = par[3]; 243 tp2 = par[8]; 244 par[3] = par[3]*1.05; 245 par[8] = par[8]*1.05; 246 chiy = mrq2dchi (x, y, z, dz, Npts, par, Npar, fitfunc) - chisq; 247 par[3] = tp1; 248 par[8] = tp2; 249 } 250 if (fitfunc == pgaussTD) { 251 tp1 = par[2]; 252 par[2] = par[2]*1.05; 253 chix = mrq2dchi (x, y, z, dz, Npts, par, Npar, fitfunc) - chisq; 254 par[2] = tp1; 255 256 tp1 = par[3]; 257 par[3] = par[3]*1.05; 258 chiy = mrq2dchi (x, y, z, dz, Npts, par, Npar, fitfunc) - chisq; 259 par[3] = tp1; 260 } 261 if (fitfunc == SgaussTD) { 262 tp1 = par[0]; 263 tp2 = par[3]; 264 par[0] = par[0]*1.05; 265 par[3] = par[3]*1.05; 266 chix = mrq2dchi (x, y, z, dz, Npts, par, Npar, fitfunc) - chisq; 267 par[0] = tp1; 268 par[3] = tp2; 269 270 tp1 = par[1]; 271 tp2 = par[4]; 272 par[1] = par[1]*1.05; 273 par[4] = par[4]*1.05; 274 chiy = mrq2dchi (x, y, z, dz, Npts, par, Npar, fitfunc) - chisq; 275 par[1] = tp1; 276 par[4] = tp2; 277 } 278 if (fitfunc == PgaussTD) { 279 tp1 = par[0]; 280 par[0] = par[0]*1.05; 281 chix = mrq2dchi (x, y, z, dz, Npts, par, Npar, fitfunc) - chisq; 282 par[0] = tp1; 283 284 tp1 = par[1]; 285 par[1] = par[1]*1.05; 286 chiy = mrq2dchi (x, y, z, dz, Npts, par, Npar, fitfunc) - chisq; 287 par[1] = tp1; 288 } 289 set_variable ("dChiX", chix/chisq); 290 set_variable ("dChiY", chiy/chisq); 291 } 292 293 /** create output image (keep in sky) **/ 165 294 if (Save) { 166 295 Buffer *out; 167 float *Vi, *Vo, vr, vf, *dpar;296 float *Vi, *Vo, vr, vf, sky; 168 297 169 298 if ((out = SelectBuffer ("out", ANYBUFFER, TRUE)) == NULL) return (FALSE); 170 ALLOCATE (dpar, float, 2*Npar);171 172 299 free (out[0].header.buffer); 173 300 free (out[0].matrix.buffer); … … 181 308 out[0].header.Naxis[1] = 2*ny; 182 309 CreateBuffer (out); 310 if (Npar == 4) { 311 sky = par[3]; 312 } else { 313 sky = par[6]; 314 } 183 315 184 316 /* four panels: 1) raw image. 2) fit 3) raw - fit 4) ?? */ … … 187 319 for (j = 0; j < ny; j++) { 188 320 for (i = 0; i < nx; i++) { 189 vf = fitfunc ((float)(i+sx), (float)(j+sy), par, Npar, dpar);321 vf = fitfunc ((float)(i+sx), (float)(j+sy), par, Npar, NULL); 190 322 vr = Vi[(i+sx)+(j+sy)*Nx]; 191 323 Vo[(i )+(j )*2*nx] = vr; 192 324 Vo[(i+nx)+(j )*2*nx] = vf; 193 Vo[(i )+(j+ny)*2*nx] = vr - vf + par[6];194 Vo[(i+nx)+(j+ny)*2*nx] = fabs(vr-vf) + par[6];325 Vo[(i )+(j+ny)*2*nx] = vr - vf + sky; 326 Vo[(i+nx)+(j+ny)*2*nx] = fabs(vr-vf) + sky; 195 327 } 196 328 } 197 free (dpar);198 329 } 199 330 200 331 /* parameter renormalize */ 201 par[2] = 2.35*sqrt(2.0) / par[2]; 202 par[3] = 2.35*sqrt(2.0) / par[3]; 203 if (Npar == 11) { 204 par[8] = 2.35*sqrt(2.0) / par[8]; 205 par[9] = 2.35*sqrt(2.0) / par[9]; 206 } 207 if (Npar == 10 208 ) { 209 par[7] = 2.35*sqrt(2.0) / par[7]; 210 par[8] = 2.35*sqrt(2.0) / par[8]; 211 } 212 for (i = 0; i < Npar; i++) { 213 sprintf (line, "PAR%d", i); 214 set_variable (line, (double) par[i]); 215 if (VERBOSE) fprintf (stderr, "%f ", par[i]); 216 } 217 if (VERBOSE) fprintf (stderr, " %f\n", chisq/Npts); 218 set_variable ("ChiSq", (double) (chisq/Npts)); 219 220 free (par); 332 if (Npar >= 7) { 333 set_variable ("Xg", par[0]); 334 set_variable ("Yg", par[1]); 335 set_variable ("SXg", 2.35 * sqrt(2.0) / par[2]); 336 set_variable ("SYg", 2.35 * sqrt(2.0) / par[3]); 337 set_variable ("SXYg", par[4]); 338 set_variable ("Zpk", par[5]); 339 set_variable ("Sg", par[6]); 340 } 341 if (Npar == 9) { 342 set_variable ("SXf", par[7]); 343 set_variable ("SYf", par[8]); 344 } 345 if (Npar == 10) { 346 set_variable ("SXf", 2.35 * sqrt(2.0) / par[7]); 347 set_variable ("SYf", 2.35 * sqrt(2.0) / par[8]); 348 set_variable ("SXYf", par[9]); 349 } 350 if (fitfunc == PgaussTD) { 351 set_variable ("Xg", par[0]); 352 set_variable ("Yg", par[1]); 353 set_variable ("Zpk", par[2]); 354 set_variable ("Sg", par[3]); 355 set_variable ("SXg", 2.35 * sqrt(2.0) / fpar[0]); 356 set_variable ("SYg", 2.35 * sqrt(2.0) / fpar[1]); 357 set_variable ("SXYg", fpar[2]); 358 } 359 if (fitfunc == SgaussTD) { 360 set_variable ("Xg", par[0]); 361 set_variable ("Yg", par[1]); 362 set_variable ("Zpk", par[2]); 363 set_variable ("Sg", par[3]); 364 set_variable ("SXg", 2.35 * sqrt(2.0) / fpar[0]); 365 set_variable ("SYg", 2.35 * sqrt(2.0) / fpar[1]); 366 set_variable ("SXYg", fpar[2]); 367 set_variable ("SXf", 2.35 * sqrt(2.0) / fpar[3]); 368 set_variable ("SYf", 2.35 * sqrt(2.0) / fpar[4]); 369 set_variable ("SXYf", fpar[5]); 370 } 371 set_variable ("ChiSq", chisq/(Npts - Npar)); 372 221 373 free (x); 222 374 free (y); 223 375 free (z); 224 376 free (dz); 377 free (par); 378 if (Nfpar > 0) free (fpar); 225 379 226 380 mrq2dfree (Npar); … … 232 386 } 233 387 234 /* pars:x, y, sx, sy, sxy, I, sky */388 /* real 2D gaussian -- x, y, sx, sy, sxy, I, sky */ 235 389 float fgaussTD (float x, float y, float *par, int Npar, float *dpar) { 236 390 … … 249 403 f = q + par[6]; 250 404 251 dpar[0] = q*(2*px*par[2] + par[4]*Y);252 dpar[1] = q*(2*py*par[3] + par[4]*X);253 dpar[2] = -2*q*px*X;254 dpar[3] = -2*q*py*Y;255 dpar[4] = -q*X*Y;256 dpar[5] = +r;257 dpar[6] = +1;258 259 return (f);260 } 261 262 /***** fix the derivatives. q should not be in function */ 263 /* p ars:x, y, sx, sy, sxy, I, sky */405 if (dpar != NULL) { 406 dpar[0] = q*(2*px*par[2] + par[4]*Y); 407 dpar[1] = q*(2*py*par[3] + par[4]*X); 408 dpar[2] = -2*q*px*X; 409 dpar[3] = -2*q*py*Y; 410 dpar[4] = -q*X*Y; 411 dpar[5] = +r; 412 dpar[6] = +1; 413 } 414 return (f); 415 } 416 417 /* pseudo 2D gaussian -- x, y, sx, sy, sxy, I, sky */ 264 418 float pgaussTD (float x, float y, float *par, int Npar, float *dpar) { 265 419 … … 279 433 /* note difference from gaussian: q = par[5]*r */ 280 434 281 dpar[0] = q*(2*px*par[2] + par[4]*Y); 282 dpar[1] = q*(2*py*par[3] + par[4]*X); 283 dpar[2] = -2*q*px*X; 284 dpar[3] = -2*q*py*Y; 285 dpar[4] = -q*X*Y; 286 dpar[5] = +r; 287 dpar[6] = +1; 288 289 return (f); 290 } 291 292 /* pars: x, y, sx, sy, sxy, I, sky, f1, f2 */ 435 if (dpar != NULL) { 436 dpar[0] = q*(2*px*par[2] + par[4]*Y); 437 dpar[1] = q*(2*py*par[3] + par[4]*X); 438 dpar[2] = -2*q*px*X; 439 dpar[3] = -2*q*py*Y; 440 dpar[4] = -q*X*Y; 441 dpar[5] = +r; 442 dpar[6] = +1; 443 } 444 return (f); 445 } 446 447 /* pseudo 2D gaussian -- x, y, (sx), (sy), (sxy), I, sky */ 448 float PgaussTD (float x, float y, float *par, int Npar, float *dpar) { 449 450 float X, Y, px, py; 451 float z, r, q, f; 452 453 /* par -> fpar: (2,0), (3,1), (4,2) */ 454 455 X = x - par[0]; 456 Y = y - par[1]; 457 458 px = fpar[0]*X; 459 py = fpar[1]*Y; 460 461 z = 0.5*SQ(px) + 0.5*SQ(py) + fpar[2]*X*Y; 462 r = 1.0 / (1 + z + 0.5*z*z*(1 + z/3)); /* ~ exp (-Z) */ 463 f = par[2]*r + par[3]; 464 q = par[2]*r*r*(1 + z + 0.5*z*z); 465 /* note difference from gaussian: q = par[5]*r */ 466 467 if (dpar != NULL) { 468 dpar[0] = q*(2*px*fpar[0] + fpar[2]*Y); 469 dpar[1] = q*(2*py*fpar[1] + fpar[2]*X); 470 dpar[2] = +r; 471 dpar[3] = +1; 472 } 473 return (f); 474 } 475 476 /* pseudo 2D gaussian with floating 2nd and 3rd order terms -- x, y, sx, sy, sxy, I, sky, f1, f2 */ 293 477 float vgaussTD (float x, float y, float *par, int Npar, float *dpar) { 294 478 … … 309 493 /* note difference from gaussian: q = par[5]*r */ 310 494 311 dpar[0] = q*(2*px*par[2] + par[4]*Y); 312 dpar[1] = q*(2*py*par[3] + par[4]*X); 313 dpar[2] = -2*q*px*X; 314 dpar[3] = -2*q*py*Y; 315 dpar[4] = -q*X*Y; 316 dpar[5] = +r; 317 dpar[6] = +1; 318 dpar[7] = -100*par[5]*r*r*k; 319 dpar[8] = -100*par[5]*r*r*par[7]*(z*z*z)/6; 320 321 return (f); 322 } 323 495 if (dpar != NULL) { 496 dpar[0] = q*(2*px*par[2] + par[4]*Y); 497 dpar[1] = q*(2*py*par[3] + par[4]*X); 498 dpar[2] = -2*q*px*X; 499 dpar[3] = -2*q*py*Y; 500 dpar[4] = -q*X*Y; 501 dpar[5] = +r; 502 dpar[6] = +1; 503 dpar[7] = -100*par[5]*r*r*k; 504 dpar[8] = -100*par[5]*r*r*par[7]*(z*z*z)/6; 505 } 506 return (f); 507 } 508 509 /* two components: (1 + z_1 + z_2^N)^(-1) -- x, y, sx1, sy1, sxy1, I, sky, sx2, sy2, sxy2 */ 510 float sgaussTD (float x, float y, float *par, int Npar, float *dpar) { 511 512 float X, Y, px1, py1, px2, py2; 513 float z1, z2, r, q1, q2, f, f1, f2; 514 515 X = x - par[0]; 516 Y = y - par[1]; 517 518 px1 = par[2]*X; 519 py1 = par[3]*Y; 520 px2 = par[7]*X; 521 py2 = par[8]*Y; 522 523 z1 = 0.5*SQ(px1) + 0.5*SQ(py1) + par[4]*X*Y; 524 z2 = 0.5*SQ(px2) + 0.5*SQ(py2) + par[9]*X*Y; 525 526 r = 1.0 / (1 + z1 + pow(z2,Npow)); 527 f = par[5]*r + par[6]; 528 529 q1 = par[5]*SQ(r); 530 q2 = par[5]*SQ(r)*Npow*pow(z2,(Npow-1)); 531 532 if (dpar != NULL) { 533 dpar[0] = q1*(2*px1*par[2] + par[4]*Y) + q2*(2*px2*par[7] + par[9]*Y); 534 dpar[1] = q1*(2*py1*par[3] + par[4]*X) + q2*(2*py2*par[8] + par[9]*X); 535 536 /* these fudge factors impede the growth of par[2] beyond par[7] */ 537 f1 = fabs(par[7]) / fabs(par[2]); 538 f2 = (f1 < FSCALE) ? 1 : FFACTOR*(f1 - FSCALE) + 1; 539 dpar[2] = -2*q1*px1*X*f2; 540 541 f1 = fabs(par[8]) / fabs(par[3]); 542 f2 = (f1 < FSCALE) ? 1 : FFACTOR*(f1 - FSCALE) + 1; 543 dpar[3] = -2*q1*py1*Y*f2; 544 545 dpar[4] = -q1*X*Y; 546 dpar[5] = +r; 547 dpar[6] = +1; 548 dpar[7] = -2*q2*px2*X; 549 dpar[8] = -2*q2*py2*Y; 550 dpar[9] = -q2*X*Y; 551 } 552 return (f); 553 } 554 555 /* two components: (1 + z_1 + z_2^N)^(-1) -- x, y, sx1, sy1, sxy1, I, sky, sx2, sy2, sxy2 */ 556 float SgaussTD (float x, float y, float *par, int Npar, float *dpar) { 557 558 float X, Y, px1, py1, px2, py2; 559 float z1, z2, r, q1, q2, f, f1, f2; 560 561 X = x - par[0]; 562 Y = y - par[1]; 563 564 px1 = fpar[0]*X; 565 py1 = fpar[1]*Y; 566 px2 = fpar[3]*X; 567 py2 = fpar[4]*Y; 568 569 z1 = 0.5*SQ(px1) + 0.5*SQ(py1) + fpar[2]*X*Y; 570 z2 = 0.5*SQ(px2) + 0.5*SQ(py2) + fpar[5]*X*Y; 571 572 r = 1.0 / (1 + z1 + pow(z2,Npow)); 573 f = par[2]*r + par[3]; 574 575 q1 = par[2]*SQ(r); 576 q2 = par[2]*SQ(r)*Npow*pow(z2,(Npow-1)); 577 578 if (dpar != NULL) { 579 dpar[0] = q1*(2*px1*fpar[0] + fpar[2]*Y) + q2*(2*px2*fpar[3] + fpar[5]*Y); 580 dpar[1] = q1*(2*py1*fpar[1] + fpar[2]*X) + q2*(2*py2*fpar[4] + fpar[5]*X); 581 dpar[2] = +r; 582 dpar[3] = +1; 583 } 584 return (f); 585 } 586 587 /* two components: (1 + z_1 + 0.5*z_1^2 + z_2^N)^(-1) -- x, y, sx1, sy1, sxy1, I, sky, sx2, sy2, sxy2 */ 588 float rgaussTD (float x, float y, float *par, int Npar, float *dpar) { 589 590 float X, Y, px1, py1, px2, py2; 591 float z1, z2, r, q1, q2, f; 592 593 X = x - par[0]; 594 Y = y - par[1]; 595 596 px1 = par[2]*X; 597 py1 = par[3]*Y; 598 px2 = par[7]*X; 599 py2 = par[8]*Y; 600 601 z1 = 0.5*SQ(px1) + 0.5*SQ(py1) + par[4]*X*Y; 602 z2 = 0.5*SQ(px2) + 0.5*SQ(py2) + par[9]*X*Y; 603 604 r = 1.0 / (1 + z1 + 0.5*SQ(z1)+ pow(z2,Npow)); 605 f = par[5]*r + par[6]; 606 607 q1 = par[5]*SQ(r)*(1 + z1); 608 q2 = par[5]*SQ(r)*Npow*pow(z2,(Npow-1)); 609 610 if (dpar != NULL) { 611 dpar[0] = q1*(2*px1*par[2] + par[4]*Y) + q2*(2*px2*par[7] + par[9]*Y); 612 dpar[1] = q1*(2*py1*par[3] + par[4]*X) + q2*(2*py2*par[8] + par[9]*X); 613 dpar[2] = -2*q1*px1*X; 614 dpar[3] = -2*q1*py1*Y; 615 dpar[4] = -q1*X*Y; 616 dpar[5] = +r; 617 dpar[6] = +1; 618 dpar[7] = -2*q2*px2*X; 619 dpar[8] = -2*q2*py2*Y; 620 dpar[9] = -q2*X*Y; 621 } 622 return (f); 623 } 624 625 /* two components: (1 + z_1^M + z_2^N)^(-1) -- x, y, sx1, sy1, sxy1, I, sky, sx2, sy2, sxy2 */ 626 float tgaussTD (float x, float y, float *par, int Npar, float *dpar) { 627 628 float X, Y, px1, py1, px2, py2; 629 float z1, z2, r, q1, q2, f; 630 631 X = x - par[0]; 632 Y = y - par[1]; 633 634 px1 = par[2]*X; 635 py1 = par[3]*Y; 636 px2 = par[7]*X; 637 py2 = par[8]*Y; 638 639 z1 = 0.5*SQ(px1) + 0.5*SQ(py1) + par[4]*X*Y; 640 z2 = 0.5*SQ(px2) + 0.5*SQ(py2) + par[9]*X*Y; 641 642 r = 1.0 / (1 + pow(z1,Npin) + pow(z2,Npow)); 643 f = par[5]*r + par[6]; 644 645 q1 = par[5]*SQ(r)*Npin*pow(z1,(Npin-1)); 646 q2 = par[5]*SQ(r)*Npow*pow(z2,(Npow-1)); 647 648 if (dpar != NULL) { 649 dpar[0] = q1*(2*px1*par[2] + par[4]*Y) + q2*(2*px2*par[7] + par[9]*Y); 650 dpar[1] = q1*(2*py1*par[3] + par[4]*X) + q2*(2*py2*par[8] + par[9]*X); 651 dpar[2] = -2*q1*px1*X*2; 652 dpar[3] = -2*q1*py1*Y*2; 653 dpar[4] = -q1*X*Y; 654 dpar[5] = +r; 655 dpar[6] = +1; 656 dpar[7] = -2*q2*px2*X; 657 dpar[8] = -2*q2*py2*Y; 658 dpar[9] = -q2*X*Y; 659 } 660 return (f); 661 } 662 663 /* alternate for exp(-z) */ 664 /* E = 1.0 / (1 + f1*Z + f2*(0.5*Z*Z + 0.1666666*Z*Z*Z)); */ /* ~ exp (-Z) */ 665 /* E = 1.0 / (1 + Z + (0.5*Z*Z + 0.1666666*Z*Z*Z)); */ /* ~ exp (-Z) */ 666 667 # if (0) 324 668 /* pars: x, y, sx, sy, sxy, I, sky */ 669 float fgalaxyTD (float x, float y, float *par, int Npar, float *dpar) { 670 671 float X, Y, Z, E, F, q, R, f, p2, p3; 672 673 X = x - par[0]; 674 Y = y - par[1]; 675 676 p2 = X / par[2]; 677 p3 = Y / par[3]; 678 679 Z = sqrt (0.5*p2*X + X*Y*par[4] + 0.5*p3*Y); /* R */ 680 E = 1.0 / (1 + Z); 681 682 q = par[5] * E; 683 R = q*E; 684 F = 0.5 / Z; 685 686 f = q + par[6]; 687 688 dpar[0] = F*R*(p2 + par[4]*Y); 689 dpar[1] = F*R*(p3 + par[4]*X); 690 dpar[2] = F*0.5*R*p2*p2; 691 dpar[3] = F*0.5*R*p3*p3; 692 dpar[4] = -R*X*Y*F; 693 694 dpar[5] = E; 695 dpar[6] = 1; 696 return (f); 697 } 698 699 /* pars: x, y, sx, sy, sxy, I, sky */ 700 float fbarTD (float x, float y, float *par, int Npar, float *dpar) { 701 702 float X, Y, Z, E, F, q, R, f, p2, p3; 703 704 X = x - par[0]; 705 Y = y - par[1]; 706 707 p2 = X / par[2]; 708 p3 = Y / par[3]; 709 710 Z = 0.5*p2*X + X*Y*par[4] + 0.5*p3*Y; /* R */ 711 E = 1.0 / (1 + Z*Z*Z); 712 713 q = par[5] * E; 714 F = 3*Z*Z; 715 R = q*E*F; 716 717 f = q + par[6]; 718 719 dpar[0] = R*(p2 + par[4]*Y); 720 dpar[1] = R*(p3 + par[4]*X); 721 dpar[2] = 0.5*R*p2*p2; 722 dpar[3] = 0.5*R*p3*p3; 723 dpar[4] = -R*X*Y; 724 725 dpar[5] = E; 726 dpar[6] = 1; 727 return (f); 728 } 729 730 /* convert from x,y to major,minor */ 731 void fix_ellipsegauss_pars (float *par, int Npar) { 732 733 float p2, p4, angle, t1, t2, tmp, area; 734 735 /* par[0], par[1] = Xo, Yo - stay the same */ 736 737 p2 = 1/par[2]; 738 p4 = 1/par[3]; 739 740 angle = 0.5 * atan2 (-2*par[4], p4 - p2); 741 742 tmp = sqrt (SQ(p2 - p4) + 4*SQ(par[4])); 743 t1 = (p2 + p4 + tmp) / 2; 744 t2 = t1 - tmp; 745 746 par[2] = 2.35482*sqrt(1/t2); 747 par[3] = 2.35482*sqrt(1/t1); 748 par[4] = DEG_RAD * angle; 749 750 area = 2*M_PI/sqrt(t1*t2); 751 752 par[5] *= area; 753 754 } 755 # endif 756 757 /*** options for later 758 759 Subtract = FALSE; 760 if ((N = get_argument (argc, argv, "-sub"))) { 761 remove_argument (N, &argc, argv); 762 Subtract = TRUE; 763 } 764 765 DFact = 1; 766 if ((N = get_argument (argc, argv, "-D"))) { 767 remove_argument (N, &argc, argv); 768 DFact = atof(argv[N]); 769 remove_argument (N, &argc, argv); 770 } 771 772 fitfunc = fgaussTD; 773 if ((N = get_argument (argc, argv, "-gal"))) { 774 remove_argument (N, &argc, argv); 775 fitfunc = fgalaxyTD; 776 } 777 if ((N = get_argument (argc, argv, "-bar"))) { 778 remove_argument (N, &argc, argv); 779 fitfunc = fbarTD; 780 } 781 782 783 f1 = 1; 784 if ((c = get_variable ("BETA1")) != (char *) NULL) f1 = atof (c); 785 786 f2 = 1; 787 if ((c = get_variable ("BETA2")) != (char *) NULL) f2 = atof (c); 788 789 if (Subtract) { 790 tmpsky = par[6]; 791 par[6] = 0; 792 for (N = j = 0; j < ny; j++) { 793 V = (float *)(buf[0].matrix.buffer) + (j+sy)*buf[0].matrix.Naxis[0] + sx; 794 for (i = 0; i < nx; i++, V++, N++) { 795 dx = i + sx; 796 dy = j + sy; 797 *V -= fitfunc (dx, dy, par, Npar, (float *) NULL); 798 } 799 } 800 par[6] = tmpsky; 801 } 802 803 ***/ 804 805 # if (0) 806 807 /* these two tests were not very succcessful. the first did not model the shape well because 808 it could not match the change in roundness with radius. the second did not work because the 809 parameters were degenerate (amplitude and slope of second component) */ 810 811 /* test: fixed, non-integer higher-order term -- x, y, sx, sy, sxy, I, sky, f1, f2 */ 325 812 float qgaussTD (float x, float y, float *par, int Npar, float *dpar) { 326 813 … … 354 841 } 355 842 356 /* pars:x, y, sx, sy, sxy, I, sky */843 /* test: two component model: inner pseudo gaussian with outer z^1.75 x, y, sx, sy, sxy, I, sky */ 357 844 float rgaussTD (float x, float y, float *par, int Npar, float *dpar) { 358 845 … … 394 881 } 395 882 396 /* pars: x, y, sx, sy, sxy, I, sky */397 float sgaussTD (float x, float y, float *par, int Npar, float *dpar) {398 399 float X, Y, px1, py1, px2, py2;400 float z1, z2, r, q1, q2, f;401 402 X = x - par[0];403 Y = y - par[1];404 405 px1 = par[2]*X;406 py1 = par[3]*Y;407 px2 = par[7]*X;408 py2 = par[8]*Y;409 410 z1 = 0.5*SQ(px1) + 0.5*SQ(py1) + par[4]*X*Y;411 z2 = 0.5*SQ(px2) + 0.5*SQ(py2) + par[9]*X*Y;412 413 r = 1.0 / (1 + z1 + pow(z2,Npow));414 f = par[5]*r + par[6];415 416 q1 = par[5]*SQ(r);417 q2 = par[5]*SQ(r)*Npow*pow(z2,(Npow-1));418 419 dpar[0] = q1*(2*px1*par[2] + par[4]*Y) + q2*(2*px2*par[7] + par[9]*Y);420 dpar[1] = q1*(2*py1*par[3] + par[4]*X) + q2*(2*py2*par[8] + par[9]*X);421 dpar[2] = -2*q1*px1*X;422 dpar[3] = -2*q1*py1*Y;423 dpar[4] = -q1*X*Y;424 dpar[5] = +r;425 dpar[6] = +1;426 dpar[7] = -2*q2*px2*X;427 dpar[8] = -2*q2*py2*Y;428 dpar[9] = -q2*X*Y;429 430 return (f);431 }432 433 /* alternate for exp(-z) */434 /* E = 1.0 / (1 + f1*Z + f2*(0.5*Z*Z + 0.1666666*Z*Z*Z)); */ /* ~ exp (-Z) */435 /* E = 1.0 / (1 + Z + (0.5*Z*Z + 0.1666666*Z*Z*Z)); */ /* ~ exp (-Z) */436 437 # if (0)438 /* pars: x, y, sx, sy, sxy, I, sky */439 float fgalaxyTD (float x, float y, float *par, int Npar, float *dpar) {440 441 float X, Y, Z, E, F, q, R, f, p2, p3;442 443 X = x - par[0];444 Y = y - par[1];445 446 p2 = X / par[2];447 p3 = Y / par[3];448 449 Z = sqrt (0.5*p2*X + X*Y*par[4] + 0.5*p3*Y); /* R */450 E = 1.0 / (1 + Z);451 452 q = par[5] * E;453 R = q*E;454 F = 0.5 / Z;455 456 f = q + par[6];457 458 dpar[0] = F*R*(p2 + par[4]*Y);459 dpar[1] = F*R*(p3 + par[4]*X);460 dpar[2] = F*0.5*R*p2*p2;461 dpar[3] = F*0.5*R*p3*p3;462 dpar[4] = -R*X*Y*F;463 464 dpar[5] = E;465 dpar[6] = 1;466 return (f);467 }468 469 /* pars: x, y, sx, sy, sxy, I, sky */470 float fbarTD (float x, float y, float *par, int Npar, float *dpar) {471 472 float X, Y, Z, E, F, q, R, f, p2, p3;473 474 X = x - par[0];475 Y = y - par[1];476 477 p2 = X / par[2];478 p3 = Y / par[3];479 480 Z = 0.5*p2*X + X*Y*par[4] + 0.5*p3*Y; /* R */481 E = 1.0 / (1 + Z*Z*Z);482 483 q = par[5] * E;484 F = 3*Z*Z;485 R = q*E*F;486 487 f = q + par[6];488 489 dpar[0] = R*(p2 + par[4]*Y);490 dpar[1] = R*(p3 + par[4]*X);491 dpar[2] = 0.5*R*p2*p2;492 dpar[3] = 0.5*R*p3*p3;493 dpar[4] = -R*X*Y;494 495 dpar[5] = E;496 dpar[6] = 1;497 return (f);498 }499 500 /* convert from x,y to major,minor */501 void fix_ellipsegauss_pars (float *par, int Npar) {502 503 float p2, p4, angle, t1, t2, tmp, area;504 505 /* par[0], par[1] = Xo, Yo - stay the same */506 507 p2 = 1/par[2];508 p4 = 1/par[3];509 510 angle = 0.5 * atan2 (-2*par[4], p4 - p2);511 512 tmp = sqrt (SQ(p2 - p4) + 4*SQ(par[4]));513 t1 = (p2 + p4 + tmp) / 2;514 t2 = t1 - tmp;515 516 par[2] = 2.35482*sqrt(1/t2);517 par[3] = 2.35482*sqrt(1/t1);518 par[4] = DEG_RAD * angle;519 520 area = 2*M_PI/sqrt(t1*t2);521 522 par[5] *= area;523 524 }525 883 # endif 526 884 527 /*** options for later 528 529 Subtract = FALSE; 530 if ((N = get_argument (argc, argv, "-sub"))) { 531 remove_argument (N, &argc, argv); 532 Subtract = TRUE; 533 } 534 535 DFact = 1; 536 if ((N = get_argument (argc, argv, "-D"))) { 537 remove_argument (N, &argc, argv); 538 DFact = atof(argv[N]); 539 remove_argument (N, &argc, argv); 540 } 541 542 fitfunc = fgaussTD; 543 if ((N = get_argument (argc, argv, "-gal"))) { 544 remove_argument (N, &argc, argv); 545 fitfunc = fgalaxyTD; 546 } 547 if ((N = get_argument (argc, argv, "-bar"))) { 548 remove_argument (N, &argc, argv); 549 fitfunc = fbarTD; 550 } 551 552 553 f1 = 1; 554 if ((c = get_variable ("BETA1")) != (char *) NULL) f1 = atof (c); 555 556 f2 = 1; 557 if ((c = get_variable ("BETA2")) != (char *) NULL) f2 = atof (c); 558 559 if (Subtract) { 560 tmpsky = par[6]; 561 par[6] = 0; 562 for (N = j = 0; j < ny; j++) { 563 V = (float *)(buf[0].matrix.buffer) + (j+sy)*buf[0].matrix.Naxis[0] + sx; 564 for (i = 0; i < nx; i++, V++, N++) { 565 dx = i + sx; 566 dy = j + sy; 567 *V -= fitfunc (dx, dy, par, Npar, (float *) NULL); 568 } 569 } 570 par[6] = tmpsky; 571 } 572 573 ***/ 885 /* forcing values to have a rational range 886 ALLOCATE (parmin, float, Npar); 887 ALLOCATE (parmax, float, Npar); 888 bzero (parmin, Npar*sizeof(float)); 889 bzero (parmax, Npar*sizeof(float)); 890 parmin[0] = parmin[1] = 0; 891 parmax[0] = buf[0].matrix.Naxis[0]; 892 parmax[1] = buf[0].matrix.Naxis[1]; 893 894 parmin[2] = parmin[3] = 0.01; 895 parmax[2] = parmax[3] = 100.0; 896 parmin[4] = -1000; 897 parmax[4] = -1000; 898 899 parmin[5] = 1; 900 parmax[5] = 1e5; 901 902 parmin[6] = 0.0; 903 parmax[6] = 1e5; 904 905 if (Npar == 9) { 906 parmin[7] = parmin[8] = 0.01; 907 parmax[7] = parmax[8] = 10.0; 908 } 909 if (Npar == 10) { 910 parmin[7] = parmin[8] = 0.01; 911 parmax[7] = parmax[8] = 10.0; 912 parmin[9] = -1000; 913 parmax[9] = -1000; 914 } 915 */ 916 -
trunk/Ohana/src/opihi/cmd.data/gridify.c
r2843 r2938 3 3 int gridify (int argc, char **argv) { 4 4 5 int i, Nx, Ny, Xb, Yb ;5 int i, Nx, Ny, Xb, Yb, Normalize, N; 6 6 float Xmin, Xmax, dX, Ymin, Ymax, dY; 7 7 float *buf, *val, *x, *y, *z; … … 9 9 Buffer *bf; 10 10 Vector *vx, *vy, *vz; 11 12 Normalize = TRUE; 13 if ((N = get_argument (argc, argv, "-raw"))) { 14 remove_argument (N, &argc, argv); 15 Normalize = FALSE; 16 } 11 17 12 18 if (argc != 11) { … … 66 72 if (Xb >= Nx) continue; 67 73 if (Yb >= Ny) continue; 68 val[Xb + Yb*Nx] = *z;74 val[Xb + Yb*Nx] += *z; 69 75 Nval[Xb + Yb*Nx]++; 70 76 } … … 72 78 buf = (float *) bf[0].matrix.buffer; 73 79 for (i = 0; i < Nx*Ny; i++) { 74 if (Nval[i] == 0) { 75 buf[i] = 0; 76 continue; 80 if (Normalize) { 81 if (Nval[i] == 0) { 82 buf[i] = 0; 83 continue; 84 } 85 buf[i] = val[i] / Nval[i]; 86 } else { 87 buf[i] = val[i]; 77 88 } 78 buf[i] = val[i] / Nval[i];79 89 } 80 90 -
trunk/Ohana/src/opihi/cmd.data/imsmooth.c
r2843 r2938 1 1 # include "data.h" 2 # define NSIGMA 33 2 4 3 int imsmooth (int argc, char **argv) { 5 4 6 int i, j, n, N x, Ny, Ns, Ngauss;5 int i, j, n, N, Nx, Ny, Ns, Ngauss; 7 6 float *vi, *vo, *gauss, *gaussnorm; 8 float g, s, sigma ;7 float g, s, sigma, Nsigma; 9 8 Buffer *in; 10 9 float *temp; 10 11 Nsigma = 3; 12 if ((N = get_argument (argc, argv, "-Nsigma"))) { 13 remove_argument (N, &argc, argv); 14 Nsigma = atof (argv[N]); 15 remove_argument (N, &argc, argv); 16 } 11 17 12 18 if (argc != 3) { … … 23 29 24 30 /* build a 1D gaussian */ 25 Ns = (int) (N SIGMA*sigma + 0.5);31 Ns = (int) (Nsigma*sigma + 0.5); 26 32 Ngauss = 2*Ns + 1; 27 33 ALLOCATE (gaussnorm, float, Ngauss); -
trunk/Ohana/src/opihi/lib.data/mrq2dmin.c
r2843 r2938 7 7 */ 8 8 9 # define VERY_VERBOSE 0 10 9 11 static float **alpha, **talpha; 10 12 static float **beta, **tbeta; 11 13 static float *partry, *dyda; 12 14 static float ochisq, lambda; 15 16 static float *parmin = NULL; 17 static float *parmax = NULL; 13 18 14 19 float mrq2dcof (float *x, float *t, float *y, float *dy, int Npts, … … 41 46 ta[k][j] = ta[j][k]; 42 47 48 # if (VERY_VERBOSE) 49 for (j = 0; j < Npar; j++) { 50 for (k = 0; k < Npar; k++) { 51 fprintf (stderr, "%9.3e ", ta[j][k]); 52 } 53 fprintf (stderr, " : %9.3e ", tb[j][0]); 54 fprintf (stderr, "\n"); 55 } 56 # endif 57 43 58 return (chisq); 44 59 60 } 61 62 float mrq2dchi (float *x, float *t, float *y, float *dy, int Npts, 63 float *par, int Npar, 64 float (funcs)(float, float, float *, int, float *)) { 65 66 int k, j, i; 67 float ydiff, wt, chisq; 68 69 chisq = 0.0; 70 for (i = 0; i < Npts; i++) { 71 ydiff = funcs (x[i], t[i], par, Npar, dyda) - y[i]; 72 chisq += SQ(ydiff) * dy[i]; 73 } 74 return (chisq); 45 75 } 46 76 … … 65 95 } 66 96 67 for (j = 0; j < Npar; j++) partry[j] = par[j] - tbeta[j][0]; 97 for (j = 0; j < Npar; j++) { 98 partry[j] = par[j] - tbeta[j][0]; 99 /* 100 if (parmin != NULL) partry[j] = MAX (parmin[j], partry[j]); 101 if (parmax != NULL) partry[j] = MIN (parmax[j], partry[j]); 102 */ 103 } 68 104 69 105 chisq = mrq2dcof (x, t, y, dy, Npts, partry, Npar, talpha, tbeta, funcs); … … 93 129 return (chisq); 94 130 131 } 132 133 int mrq2dlimits (float *pmin, float *pmax, int Npar) { 134 135 int i; 136 137 ALLOCATE (parmin, float, Npar); 138 ALLOCATE (parmax, float, Npar); 139 for (i = 0; i < Npar; i++) { 140 parmin[i] = pmin[i]; 141 parmax[i] = pmax[i]; 142 } 143 return (TRUE); 95 144 } 96 145 … … 156 205 free (dyda); 157 206 158 } 207 if (parmin != NULL) free (parmin); 208 if (parmax != NULL) free (parmax); 209 210 } -
trunk/Ohana/src/opihi/mana/findpeaks.c
r2826 r2938 7 7 int Npeak, NPEAK, Npeaks; 8 8 float *v; 9 int *peaks, *keep, *xp, *yp ;9 int *peaks, *keep, *xp, *yp, *zp; 10 10 float threshold, vt, vo; 11 Vector *vecx, *vecy ;11 Vector *vecx, *vecy, *vecz; 12 12 Buffer *buf; 13 13 … … 19 19 if ((vecx = SelectVector ("xp", ANYVECTOR, TRUE)) == NULL) return (FALSE); 20 20 if ((vecy = SelectVector ("yp", ANYVECTOR, TRUE)) == NULL) return (FALSE); 21 if ((vecz = SelectVector ("zp", ANYVECTOR, TRUE)) == NULL) return (FALSE); 21 22 22 23 Nx = buf[0].matrix.Naxis[0]; … … 27 28 ALLOCATE (xp, int, NPEAK); 28 29 ALLOCATE (yp, int, NPEAK); 30 ALLOCATE (zp, int, NPEAK); 29 31 30 32 /* find peaks for each row */ … … 37 39 REALLOCATE (xp, int, NPEAK); 38 40 REALLOCATE (yp, int, NPEAK); 41 REALLOCATE (zp, int, NPEAK); 39 42 } 40 43 for (i = 0; i < Npeaks; i++) { 41 44 xp[Npeak + i] = peaks[i]; 42 45 yp[Npeak + i] = j; 46 zp[Npeak + i] = v[peaks[i] + j*Nx]; 43 47 } 44 48 Npeak += Npeaks; … … 74 78 REALLOCATE (vecx[0].elements, float, MAX (Npeak, 1)); 75 79 REALLOCATE (vecy[0].elements, float, MAX (Npeak, 1)); 80 REALLOCATE (vecz[0].elements, float, MAX (Npeak, 1)); 76 81 /* eliminate non-local peaks */ 77 82 for (N = n = 0; n < Npeak; n++) { … … 79 84 vecx[0].elements[N] = xp[n]; 80 85 vecy[0].elements[N] = yp[n]; 86 vecz[0].elements[N] = zp[n]; 81 87 N ++; 82 88 } 89 free (xp); 90 free (yp); 91 free (zp); 92 free (keep); 83 93 84 94 REALLOCATE (vecx[0].elements, float, MAX (N, 1)); 85 95 REALLOCATE (vecy[0].elements, float, MAX (N, 1)); 86 vecx[0].Nelements = vecy[0].Nelements = N; 96 REALLOCATE (vecz[0].elements, float, MAX (N, 1)); 97 vecx[0].Nelements = vecy[0].Nelements = vecz[0].Nelements = N; 87 98 88 99 return (TRUE); … … 93 104 } 94 105 106 -
trunk/Ohana/src/opihi/mana/findrowpeaks.c
r2826 r2938 3 3 int *findrowpeaks (float *row, int Nrow, float threshold, int *npeaks) { 4 4 5 int i , rising;5 int i; 6 6 int Npeaks, NPEAKS; 7 7 int *peaks; 8 9 # if (0)10 ALLOCATE (peaks, int, 3);11 peaks[0] = 20;12 peaks[1] = 30;13 peaks[2] = 40;14 *npeaks = 3;15 return (peaks);16 # endif17 8 18 9 Npeaks = 0; … … 25 16 } 26 17 27 rising = (row[1] > row[0]); 18 /* special case for first pixel in row */ 19 if ((row[0] > row[1]) && (row[0] > threshold)) { 20 peaks[Npeaks] = 0; 21 Npeaks ++; 22 } 28 23 29 for (i = 2; i < Nrow; i++) { 30 if (row[i] < threshold) { 31 rising = TRUE; 32 continue; 33 } 34 if (rising) { 35 if (row[i] < row[i-1]) { 36 rising = FALSE; 37 peaks[Npeaks] = i-1; 38 Npeaks ++; 39 if (Npeaks >= NPEAKS) { 40 NPEAKS += 100; 41 REALLOCATE (peaks, int, NPEAKS); 42 fprintf (stderr, "#"); 43 } 44 } 45 continue; 46 } 47 if (!rising) { 48 if (row[i] > row[i-1]) { 49 rising = TRUE; 50 } 51 continue; 24 for (i = 1; i < Nrow - 1; i++) { 25 if (row[i] < threshold) continue; 26 if (row[i] < row[i-1]) continue; 27 if (row[i] <= row[i+1]) continue; 28 29 peaks[Npeaks] = i; 30 Npeaks ++; 31 if (Npeaks >= NPEAKS) { 32 NPEAKS += 100; 33 REALLOCATE (peaks, int, NPEAKS); 52 34 } 53 35 } 36 37 /* special case for last pixel in row */ 38 if ((row[Nrow-1] >= row[Nrow-2]) && (row[Nrow-1] > threshold)) { 39 peaks[Npeaks] = Nrow-1; 40 Npeaks ++; 41 } 42 54 43 *npeaks = Npeaks; 55 44 return (peaks); -
trunk/Ohana/src/opihi/mana/rawstars.c
r2843 r2938 7 7 double Raper, Rinner, Router; 8 8 Vector *xp, *yp; 9 Vector *xc, *yc, *sx, *sy, *sxy, *zs, *z p, *sk;9 Vector *xc, *yc, *sx, *sy, *sxy, *zs, *zc, *sk; 10 10 Buffer *buff; 11 11 … … 44 44 if ((xc = SelectVector ("xc", ANYVECTOR, TRUE)) == NULL) return (FALSE); 45 45 if ((yc = SelectVector ("yc", ANYVECTOR, TRUE)) == NULL) return (FALSE); 46 if ((zc = SelectVector ("zc", ANYVECTOR, TRUE)) == NULL) return (FALSE); 47 if ((zs = SelectVector ("zs", ANYVECTOR, TRUE)) == NULL) return (FALSE); 48 if ((sk = SelectVector ("sk", ANYVECTOR, TRUE)) == NULL) return (FALSE); 46 49 if ((sx = SelectVector ("sx", ANYVECTOR, TRUE)) == NULL) return (FALSE); 47 50 if ((sy = SelectVector ("sy", ANYVECTOR, TRUE)) == NULL) return (FALSE); 48 51 if ((sxy = SelectVector ("sxy", ANYVECTOR, TRUE)) == NULL) return (FALSE); 49 if ((zs = SelectVector ("zs", ANYVECTOR, TRUE)) == NULL) return (FALSE);50 if ((zp = SelectVector ("zp", ANYVECTOR, TRUE)) == NULL) return (FALSE);51 if ((sk = SelectVector ("sk", ANYVECTOR, TRUE)) == NULL) return (FALSE);52 52 53 53 Nx = buff[0].matrix.Naxis[0]; … … 61 61 REALLOCATE (sxy[0].elements, float, Np); 62 62 REALLOCATE (zs[0].elements, float, Np); 63 REALLOCATE (z p[0].elements, float, Np);63 REALLOCATE (zc[0].elements, float, Np); 64 64 REALLOCATE (sk[0].elements, float, Np); 65 65 xc[0].Nelements = yc[0].Nelements = sx[0].Nelements = Np; 66 sy[0].Nelements = zs[0].Nelements = z p[0].Nelements = Np;66 sy[0].Nelements = zs[0].Nelements = zc[0].Nelements = Np; 67 67 sxy[0].Nelements = sk[0].Nelements = Np; 68 68 … … 83 83 &sxy[0].elements[i], 84 84 &zs[0].elements[i], 85 &z p[0].elements[i],85 &zc[0].elements[i], 86 86 &sk[0].elements[i]); 87 87 }
Note:
See TracChangeset
for help on using the changeset viewer.
