IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 2854


Ignore:
Timestamp:
Dec 29, 2004, 10:59:52 PM (22 years ago)
Author:
eugene
Message:

minor bug fixes

Location:
trunk/Ohana/src/opihi
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.astro/imfit.c

    r2843 r2854  
    22
    33float fgaussTD (float, float, float *, int, float *);
     4float pgaussTD (float, float, float *, int, float *);
     5float vgaussTD (float, float, float *, int, float *);
     6float qgaussTD (float, float, float *, int, float *);
    47
    58int imfit (int argc, char **argv) {
     
    1114  char line[64];
    1215  Buffer *buf;
     16  float (*fitfunc)(float, float, float *, int, float *);
    1317
    1418  Save = FALSE;
     
    2226    remove_argument (N, &argc, argv);
    2327    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;
    2444  }
    2545
     
    4262  if (sy + ny >= Ny) goto range;
    4363
    44   Npar = 7;
    4564  ALLOCATE (par, float, 2*Npar);
    4665  bzero (par, Npar*sizeof(float));
     
    7392  par[5] = atof (get_variable ("Zpk"));
    7493  par[6] = atof (get_variable ("Sg"));
     94  if (Npar == 9) {
     95    par[7] = par[8] = 1;
     96  }
    7597
    7698  /* run fit routine */
    77   ochisq = mrq2dinit (x, y, z, dz, Npts, par, Npar, fgaussTD, VERBOSE);
     99  ochisq = mrq2dinit (x, y, z, dz, Npts, par, Npar, fitfunc, VERBOSE);
    78100  dchisq = ochisq;
    79101
    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, fgaussTD, 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);
    82104    dchisq = ochisq - chisq;
    83105    ochisq = chisq;
     
    110132    for (j = 0; j < ny; j++) {
    111133      for (i = 0; i < nx; i++) {
    112         vf = fgaussTD ((float)(i+sx), (float)(j+sy), par, Npar, dpar);
     134        vf = fitfunc ((float)(i+sx), (float)(j+sy), par, Npar, dpar);
    113135        vr = Vi[(i+sx)+(j+sy)*Nx];
    114136        Vo[(i   )+(j   )*2*nx] = vr;
     
    172194  return (f);
    173195}
     196
     197/***** fix the derivatives.  q should not be in function */
     198/* pars: x, y, sx, sy, sxy, I, sky */
     199float 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 */
     229float 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 */
     260float 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
    174288/* alternate for exp(-z) */
    175289/* 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  
    1010  Vector *vx, *vy, *vz;
    1111
    12   if (argc != 11) {
     12  if (argc != 9) {
    1313    fprintf (stderr, "USAGE: ungridify buffer Xmin Xmax Ymin Ymax x y z\n");
    1414    return (FALSE);
    1515  }
    1616 
    17   if ((bf = SelectBuffer (argv[1], ANYBUFFER, TRUE)) == NULL) return (FALSE);
     17  if ((bf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE);
    1818  Xmin = atof (argv[2]);
    1919  Xmax = atof (argv[3]);
     
    2626  NY = bf[0].matrix.Naxis[1];
    2727
    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);
    3131  REALLOCATE (vx[0].elements, float, Nx*Ny);
    3232  REALLOCATE (vy[0].elements, float, Nx*Ny);
Note: See TracChangeset for help on using the changeset viewer.