Changeset 41916 for branches/eam_branches/ipp-20211108
- Timestamp:
- Nov 16, 2021, 8:28:36 AM (5 years ago)
- Location:
- branches/eam_branches/ipp-20211108/Ohana/src/opihi/cmd.astro
- Files:
-
- 1 added
- 4 edited
-
imfit-fgauss.c (modified) (1 diff)
-
imfit-qrgauss.c (modified) (1 diff)
-
imfit-trail.c (modified) (9 diffs)
-
imfit.c (modified) (9 diffs)
-
test/imfit.sh (added)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20211108/Ohana/src/opihi/cmd.astro/imfit-fgauss.c
r39457 r41916 1 1 # include "imfit.h" 2 3 /** fgauss : a real 2D Gaussian **/ 2 4 3 5 opihi_flt fgaussTD (opihi_flt, opihi_flt, opihi_flt *, int, opihi_flt *); -
branches/eam_branches/ipp-20211108/Ohana/src/opihi/cmd.astro/imfit-qrgauss.c
r39457 r41916 59 59 60 60 r = 1.0 / (1 + fpar[0]*z + pow(z,par[7])); 61 f = par[5]*r + par[6]; 61 f = par[5]*r + par[6]; // Io * f(r) + Sky 62 62 q = par[5]*SQ(r)*(fpar[0] + par[7]*pow(z,(par[7]-1))); 63 63 -
branches/eam_branches/ipp-20211108/Ohana/src/opihi/cmd.astro/imfit-trail.c
r41666 r41916 4 4 void trailCL (); 5 5 6 // fitted parameters: 6 7 # define PAR_X 0 7 8 # define PAR_Y 1 8 9 # define PAR_THETA 2 9 # define PAR_SIGMA 3 10 # define PAR_LENGTH 4 11 # define PAR_I0 5 12 # define PAR_SKY 6 10 # define PAR_LENGTH 3 11 # define PAR_I0 4 12 # define PAR_SKY 5 13 14 // fixed parameters: 15 # define PAR_SIGMA 0 13 16 14 17 void trail_setup (char *name) { … … 18 21 fitfunc = trailTD; 19 22 imfit_cleanup = trailCL; 20 Npar = 7;21 Nfpar = 0;23 Npar = 6; 24 Nfpar = 1; 22 25 23 26 /* allocate free and fixed parameters */ … … 30 33 par[PAR_Y ] = get_variable_default ("Yg", 0.0); 31 34 par[PAR_THETA ] = get_variable_default ("Tg", 0.0); 32 par[PAR_SIGMA ] = get_variable_default ("Wg", 2.0);33 35 par[PAR_LENGTH ] = get_variable_default ("Lg", 10.0); 34 36 par[PAR_I0 ] = get_variable_default ("Zpk", 10000.0); 35 37 par[PAR_SKY ] = get_variable_default ("Sg", 0.0); 36 38 sky = &par[PAR_SKY]; 39 40 fpar[PAR_SIGMA ] = get_variable_default ("Wg", 2.0); 37 41 } 38 42 … … 40 44 set_variable ("Xg", par[PAR_X ]); 41 45 set_variable ("Yg", par[PAR_Y ]); 42 set_variable ("Wg", par[PAR_SIGMA ]);43 46 set_variable ("Tg", par[PAR_THETA ]); 44 47 set_variable ("Lg", par[PAR_LENGTH]); 45 48 set_variable ("Zpk", par[PAR_I0 ]); 46 49 set_variable ("Sg", par[PAR_SKY ]); 50 51 set_variable ("Wg", fpar[PAR_SIGMA]); 47 52 } 48 53 … … 54 59 opihi_flt Y = y - par[PAR_Y]; 55 60 56 opihi_flt S2 = 2.0 * SQ( par[PAR_SIGMA]);61 opihi_flt S2 = 2.0 * SQ(fpar[PAR_SIGMA]); 57 62 58 63 opihi_flt ST = sin(RAD_DEG*par[PAR_THETA]); … … 78 83 79 84 // are these signs correct? I think so: (dR/dXo = -dR/dX); dRdX below is actually dR/dXo 85 // since X = X - par[PAR_X], dFoo/dXo = -dFoo/dX 80 86 float dRdX = +ST; 81 87 float dRdY = -CT; 82 float dRdT = -Y*ST - X*CT; 88 float dRdT = (-Y*ST - X*CT)*RAD_DEG; 89 // note PAR_THETA is in degrees 83 90 84 91 float dGdX = dGdR * dRdX; 85 92 float dGdY = dGdR * dRdY; 86 93 float dGdT = dGdR * dRdT; 94 // dGdL is 0.0 because dRdL is 0.0 (R is not a function of L) 87 95 88 96 // are these signs correct? I think so: (dR/dXo = -dR/dX); dRdX below is actually dR/dXo … … 96 104 float dZmdL = -0.5 / sqrt(S2); 97 105 98 float dZpdT = (-X*ST + Y*CT) / sqrt(S2); 106 // note PAR_THETA is in degrees 107 float dZpdT = (-X*ST + Y*CT) * RAD_DEG / sqrt(S2); 99 108 float dZmdT = dZpdT; // dZpdT = dZmdT 100 109 … … 119 128 // dGdL is 0.0 because dRdL is 0.0 120 129 float dPdL = Gxy * (dEpdL - dEmdL); 121 122 130 float dPdT = dGdT * (Ep - Em) + Gxy * (dEpdT - dEmdT); 123 131 … … 127 135 dpar[PAR_LENGTH] = par[PAR_I0] * dPdL; 128 136 dpar[PAR_THETA] = par[PAR_I0] * dPdT; 129 dpar[PAR_SIGMA] = 0; // we don't actually allow this to vary, so we do not need to calculate it130 137 } 131 138 -
branches/eam_branches/ipp-20211108/Ohana/src/opihi/cmd.astro/imfit.c
r41666 r41916 3 3 int imfit (int argc, char **argv) { 4 4 5 int i, j, N, Npts, Save, VERBOSE; 6 int sx, sy, nx, ny, Nx, Ny; 7 float chisq, ochisq, dchisq, Gain, RDnoise, SatThreshold; 8 opihi_flt *x, *y, *z, *dz; 9 float *V; 5 int N; 10 6 Buffer *buf; 11 7 12 Save = FALSE;8 char *Save = NULL; 13 9 if ((N = get_argument (argc, argv, "-save"))) { 14 10 remove_argument (N, &argc, argv); 15 Save = TRUE; 16 } 17 18 // int ShapeVariation = FALSE; 19 // if ((N = get_argument (argc, argv, "-shapes"))) { 20 // remove_argument (N, &argc, argv); 21 // ShapeVariation = TRUE; 22 // } 23 24 SatThreshold = 0xffff; 11 Save = strcreate (argv[N]); 12 remove_argument (N, &argc, argv); 13 } 14 15 int Insert = FALSE; 16 if ((N = get_argument (argc, argv, "-insert"))) { 17 remove_argument (N, &argc, argv); 18 Insert = TRUE; 19 if (Save) { gprint (GP_ERR, "-save and -insert are mutually exclusive\n"); free (Save); return (FALSE); } 20 } 21 22 int SatThreshold = 0xffff; 25 23 if ((N = get_argument (argc, argv, "-sat"))) { 26 24 remove_argument (N, &argc, argv); … … 30 28 31 29 /* Gain in e/DN */ 32 Gain = 1.0;30 float Gain = 1.0; 33 31 if ((N = get_argument (argc, argv, "-gain"))) { 34 32 remove_argument (N, &argc, argv); … … 38 36 39 37 /* RD noise in DN */ 40 RDnoise = 0.0;38 float RDnoise = 0.0; 41 39 if ((N = get_argument (argc, argv, "-rdnoise"))) { 42 40 remove_argument (N, &argc, argv); … … 45 43 } 46 44 47 VERBOSE = FALSE;45 int VERBOSE = FALSE; 48 46 if ((N = get_argument (argc, argv, "-v"))) { 49 47 remove_argument (N, &argc, argv); … … 51 49 } 52 50 53 /* set fitting function */51 /* set fitting function : defines par, Npar, fitfunc, etc globals (imfit.h) */ 54 52 fgauss_setup ("fgauss"); 55 53 if ((N = get_argument (argc, argv, "-func"))) { 56 54 fitfunc = NULL; 57 55 remove_argument (N, &argc, argv); 58 fgauss_setup (argv[N]); 59 pgauss_setup (argv[N]); 60 pgauss_psf_setup (argv[N]); 56 fgauss_setup (argv[N]); // OK 57 pgauss_setup (argv[N]); // OK 61 58 sgauss_setup (argv[N]); 62 sgauss_psf_setup (argv[N]); 63 qgauss_setup (argv[N]); 64 qgauss_psf_setup (argv[N]); 65 qfgauss_setup (argv[N]); 59 qgauss_setup (argv[N]); // OK 60 qfgauss_setup (argv[N]); // OK 66 61 qrgauss_setup (argv[N]); 67 62 trail_setup (argv[N]); 63 pgauss_psf_setup (argv[N]); 64 sgauss_psf_setup (argv[N]); 65 qgauss_psf_setup (argv[N]); 68 66 if (fitfunc == NULL) { 69 67 gprint (GP_ERR, "unknown function %s\n", argv[N]); 68 FREE (Save); 70 69 return (FALSE); 71 70 } … … 74 73 75 74 if (argc != 6) { 76 gprint (GP_ERR, "USAGE: imfit <buffer> sx sy nx ny\n"); 75 gprint (GP_ERR, "USAGE: imfit <buffer> Xo Yo dX dY\n"); 76 gprint (GP_ERR, "options: [-save buffer] [-insert] [-sat value] [-gain value] [-rdnoise value] [-v] [-func option]\n"); 77 gprint (GP_ERR, " (Xo,Yo) : center\n"); 78 gprint (GP_ERR, " (dX,dY) : window size\n"); 79 FREE (Save); 77 80 return (FALSE); 78 81 } 79 82 80 83 /* non-optional arguments */ 81 if ((buf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE); 82 sx = atof (argv[2]); 83 sy = atof (argv[3]); 84 nx = atof (argv[4]); 85 ny = atof (argv[5]); 86 Nx = buf[0].matrix.Naxis[0]; 87 Ny = buf[0].matrix.Naxis[1]; 88 89 /* check if region is valid */ 90 if (sx + 0.5*nx < 0) goto range; 91 if (sy + 0.5*ny < 0) goto range; 92 if (sx + 0.5*nx >= Nx) goto range; 93 if (sy + 0.5*ny >= Ny) goto range; 84 if ((buf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) { FREE (Save); return (FALSE); } 85 int Xo = atof (argv[2]); 86 int Yo = atof (argv[3]); 87 int dX = atof (argv[4]); 88 int dY = atof (argv[5]); 89 int Nx = buf[0].matrix.Naxis[0]; 90 int Ny = buf[0].matrix.Naxis[1]; 91 92 int sx = Xo - dX/2; 93 int sy = Yo - dY/2; 94 95 /* check if region is valid (center must be in range of image pixels) */ 96 if (Xo < 0) goto range; 97 if (Yo < 0) goto range; 98 if (Xo >= Nx) goto range; 99 if (Yo >= Ny) goto range; 100 101 // image value in DN 102 // rdnoise in DN 103 // sigma_DN^2 = sigma_e^2 / gain^2 104 // sigma_e^2 = Ne 105 // sigma_e^2 = DN * gain 106 // sigma_DN^2 = DN * gain / gain^2 = DN / gain 107 108 if (Insert) { 109 float *Vi = (float *)buf[0].matrix.buffer; 110 for (int j = 0; j < dY; j++) { 111 for (int i = 0; i < dX; i++) { 112 float vf = fitfunc ((float)(i+sx), (float)(j+sy), par, Npar, NULL); 113 Vi[(i+sx)+(j+sy)*Nx] += vf; 114 } 115 } 116 return TRUE; 117 } 94 118 95 119 /* convert array z[x,y] to x[i], y[i], z[i] */ 96 120 N = 0; 97 Npts = nx*ny;98 ALLOCATE (x, opihi_flt, 2*Npts);99 ALLOCATE (y, opihi_flt, 2*Npts);100 ALLOCATE (z, opihi_flt, 2*Npts);101 ALLOCATE (dz, opihi_flt, 2*Npts);102 for ( j = 0; j < ny; j++) {121 int Npts = dX*dY; 122 ALLOCATE_PTR (x, opihi_flt, 2*Npts); 123 ALLOCATE_PTR (y, opihi_flt, 2*Npts); 124 ALLOCATE_PTR (z, opihi_flt, 2*Npts); 125 ALLOCATE_PTR (dz, opihi_flt, 2*Npts); 126 for (int j = 0; j < dY; j++) { 103 127 if (j + sy < 0) continue; 104 128 if (j + sy >= Ny) continue; 105 V = (float *)(buf[0].matrix.buffer) + (j+sy)*buf[0].matrix.Naxis[0] + sx;106 for (i = 0; i < nx; i++) {129 float *V = (float *)(buf[0].matrix.buffer) + (j+sy)*buf[0].matrix.Naxis[0] + sx; 130 for (int i = 0; i < dX; i++) { 107 131 if (i + sx < 0) continue; 108 132 if (i + sx >= Nx) continue; 109 133 if (*V > SatThreshold) goto next; 110 dz[N] = (SQ(RDnoise) + *V/Gain);134 dz[N] = (SQ(RDnoise) + MAX(0.0, *V/Gain)); // treat negative pixels as pure read noise 111 135 if (dz[N] <= 0) goto next; 112 136 dz[N] = 1.0 / dz[N]; … … 122 146 123 147 /* run fit routine */ 124 ochisq = mrq2dinit (x, y, z, dz, Npts, par, Npar, fitfunc, VERBOSE); 125 dchisq = ochisq; 126 chisq = ochisq; 127 128 //for (i = 0; (i < 25) && ((dchisq <= 0.0) || (dchisq > 0.01*(Npts - Npar))); i++) { 129 130 for (i = 0; (i < 25); i++) { 148 float ochisq = mrq2dinit (x, y, z, dz, Npts, par, Npar, fitfunc, VERBOSE); 149 float dchisq = ochisq; 150 float chisq = ochisq; 151 152 int Niter = 0; 153 // for (int i = 0; (i < 25) && ((dchisq <= 0.0) || (dchisq > 0.01*(Npts - Npar))); i++) { 154 155 // keep iterating if chisq is increasing or 156 for (Niter = 0; (Niter < 25) && ((dchisq <= 0.0) || (dchisq > 0.1*(Npts - Npar))); Niter++) { 131 157 chisq = mrq2dmin (x, y, z, dz, Npts, par, Npar, fitfunc, VERBOSE); 132 158 dchisq = ochisq - chisq; 159 // fprintf (stderr, "%f -> %f : %f\n", ochisq, chisq, dchisq); 133 160 ochisq = chisq; 134 fprintf (stderr, "%f -> %f : %f\n", ochisq, chisq, dchisq);135 161 } 136 set_int_variable ("Niter", i);162 set_int_variable ("Niter", Niter); 137 163 138 164 /** create output image (keep in sky) **/ … … 141 167 float *Vi, *Vo, vr, vf; 142 168 143 if ((out = SelectBuffer ( "out", ANYBUFFER, TRUE)) == NULL) return (FALSE);169 if ((out = SelectBuffer (Save, ANYBUFFER, TRUE)) == NULL) { free (Save); return (FALSE); } 144 170 free (out[0].header.buffer); 145 171 free (out[0].matrix.buffer); 146 172 147 173 strcpy (out[0].file, "(empty)"); 148 if (!CreateBuffer (out, 2* nx, 2*ny, -32, 0.0, 1.0)) return FALSE;149 150 /* four panels: 1) raw image. 2) fit 3) raw - fit 4) ??*/174 if (!CreateBuffer (out, 2*dX, 2*dY, -32, 0.0, 1.0)) { free (Save); return FALSE; } 175 176 /* four panels: 1) raw image. 2) fit 3) raw - fit 4) absolute deviation */ 151 177 Vi = (float *)buf[0].matrix.buffer; 152 178 Vo = (float *)out[0].matrix.buffer; 153 for ( j = 0; j < ny; j++) {154 for (i = 0; i < nx; i++) {179 for (int j = 0; j < dY; j++) { 180 for (int i = 0; i < dX; i++) { 155 181 vf = fitfunc ((float)(i+sx), (float)(j+sy), par, Npar, NULL); 156 182 vr = Vi[(i+sx)+(j+sy)*Nx]; 157 Vo[(i )+(j )*2* nx] = vr;158 Vo[(i+ nx)+(j )*2*nx] = vf;159 Vo[(i )+(j+ ny)*2*nx] = vr - vf + *sky;160 Vo[(i+ nx)+(j+ny)*2*nx] = fabs(vr-vf) + *sky;183 Vo[(i )+(j )*2*dX] = vr; 184 Vo[(i+dX)+(j )*2*dX] = vf; 185 Vo[(i )+(j+dY)*2*dX] = vr - vf + *sky; 186 Vo[(i+dX)+(j+dY)*2*dX] = fabs(vr-vf) + *sky; 161 187 } 162 188 } 189 free (Save); 163 190 } 164 191 … … 169 196 170 197 if (VERBOSE) { 171 for (i = 0; i < Npar; i++) {198 for (int i = 0; i < Npar; i++) { 172 199 gprint (GP_ERR, "%g ", par[i]); 173 200 }
Note:
See TracChangeset
for help on using the changeset viewer.
