Changeset 42078 for trunk/Ohana/src/opihi/cmd.astro/imfit.c
- Timestamp:
- Feb 28, 2022, 12:10:28 PM (4 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/cmd.astro/imfit.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.astro/imfit.c
r41666 r42078 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 minIter = 5; 23 if ((N = get_argument (argc, argv, "-min-iter"))) { 24 remove_argument (N, &argc, argv); 25 minIter = atoi (argv[N]); 26 remove_argument (N, &argc, argv); 27 } 28 29 int SatThreshold = 0xffff; 25 30 if ((N = get_argument (argc, argv, "-sat"))) { 26 31 remove_argument (N, &argc, argv); … … 30 35 31 36 /* Gain in e/DN */ 32 Gain = 1.0;37 float Gain = 1.0; 33 38 if ((N = get_argument (argc, argv, "-gain"))) { 34 39 remove_argument (N, &argc, argv); … … 38 43 39 44 /* RD noise in DN */ 40 RDnoise = 0.0;45 float RDnoise = 0.0; 41 46 if ((N = get_argument (argc, argv, "-rdnoise"))) { 42 47 remove_argument (N, &argc, argv); … … 45 50 } 46 51 47 VERBOSE = FALSE;52 int VERBOSE = FALSE; 48 53 if ((N = get_argument (argc, argv, "-v"))) { 49 54 remove_argument (N, &argc, argv); … … 51 56 } 52 57 53 /* set fitting function */58 /* set fitting function : defines par, Npar, fitfunc, etc globals (imfit.h) */ 54 59 fgauss_setup ("fgauss"); 55 60 if ((N = get_argument (argc, argv, "-func"))) { 56 61 fitfunc = NULL; 57 62 remove_argument (N, &argc, argv); 58 fgauss_setup (argv[N]); 59 pgauss_setup (argv[N]); 60 pgauss_psf_setup (argv[N]); 63 fgauss_setup (argv[N]); // OK 64 pgauss_setup (argv[N]); // OK 61 65 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]); 66 qgauss_setup (argv[N]); // OK 67 rgauss_setup (argv[N]); 68 qfgauss_setup (argv[N]); // OK 66 69 qrgauss_setup (argv[N]); 67 70 trail_setup (argv[N]); 71 pgauss_psf_setup (argv[N]); 72 sgauss_psf_setup (argv[N]); 73 qgauss_psf_setup (argv[N]); 74 75 fgauss_pol_setup (argv[N]); 76 rgauss_pol_setup (argv[N]); 77 68 78 if (fitfunc == NULL) { 69 79 gprint (GP_ERR, "unknown function %s\n", argv[N]); 80 FREE (Save); 70 81 return (FALSE); 71 82 } … … 74 85 75 86 if (argc != 6) { 76 gprint (GP_ERR, "USAGE: imfit <buffer> sx sy nx ny\n"); 87 gprint (GP_ERR, "USAGE: imfit <buffer> Xo Yo dX dY\n"); 88 gprint (GP_ERR, "options: [-save buffer] [-insert] [-sat value] [-gain value] [-rdnoise value] [-v] [-func option]\n"); 89 gprint (GP_ERR, " (Xo,Yo) : center\n"); 90 gprint (GP_ERR, " (dX,dY) : window size\n"); 91 FREE (Save); 77 92 return (FALSE); 78 93 } 79 94 80 95 /* 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; 96 if ((buf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) { FREE (Save); return (FALSE); } 97 int Xo = atof (argv[2]); 98 int Yo = atof (argv[3]); 99 int dX = atof (argv[4]); 100 int dY = atof (argv[5]); 101 int Nx = buf[0].matrix.Naxis[0]; 102 int Ny = buf[0].matrix.Naxis[1]; 103 104 int sx = Xo - dX/2; 105 int sy = Yo - dY/2; 106 107 /* check if region is valid (center must be in range of image pixels) */ 108 if (Xo < 0) goto range; 109 if (Yo < 0) goto range; 110 if (Xo >= Nx) goto range; 111 if (Yo >= Ny) goto range; 112 113 // image value in DN 114 // rdnoise in DN 115 // sigma_DN^2 = sigma_e^2 / gain^2 116 // sigma_e^2 = Ne 117 // sigma_e^2 = DN * gain 118 // sigma_DN^2 = DN * gain / gain^2 = DN / gain 119 120 if (Insert) { 121 float *Vi = (float *)buf[0].matrix.buffer; 122 for (int j = 0; j < dY; j++) { 123 for (int i = 0; i < dX; i++) { 124 float vf = fitfunc ((float)(i+sx), (float)(j+sy), par, Npar, NULL); 125 Vi[(i+sx)+(j+sy)*Nx] += vf; 126 } 127 } 128 return TRUE; 129 } 94 130 95 131 /* convert array z[x,y] to x[i], y[i], z[i] */ 96 132 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++) {133 int Npts = dX*dY; 134 ALLOCATE_PTR (x, opihi_flt, 2*Npts); 135 ALLOCATE_PTR (y, opihi_flt, 2*Npts); 136 ALLOCATE_PTR (z, opihi_flt, 2*Npts); 137 ALLOCATE_PTR (dz, opihi_flt, 2*Npts); 138 for (int j = 0; j < dY; j++) { 103 139 if (j + sy < 0) continue; 104 140 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++) {141 float *V = (float *)(buf[0].matrix.buffer) + (j+sy)*buf[0].matrix.Naxis[0] + sx; 142 for (int i = 0; i < dX; i++) { 107 143 if (i + sx < 0) continue; 108 144 if (i + sx >= Nx) continue; 109 if (*V > SatThreshold) goto next; 110 dz[N] = (SQ(RDnoise) + *V/Gain); 145 if (*V > SatThreshold) goto next; // skip pixels above threshold 146 if (!isfinite(*V)) goto next; // skip nan pixels 147 dz[N] = (SQ(RDnoise) + MAX(0.0, *V/Gain)); // treat negative pixels as pure read noise 111 148 if (dz[N] <= 0) goto next; 112 149 dz[N] = 1.0 / dz[N]; … … 122 159 123 160 /* 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++) { 161 float ochisq = mrq2dinit (x, y, z, dz, Npts, par, Npar, fitfunc, VERBOSE); 162 float dchisq = ochisq; 163 float chisq = ochisq; 164 165 int Niter = 0; 166 // for (int i = 0; (i < 25) && ((dchisq <= 0.0) || (dchisq > 0.01*(Npts - Npar))); i++) { 167 168 // keep iterating if chisq is increasing or 169 for (Niter = 0; (Niter < 25) && ((Niter < minIter) || ((dchisq <= 0.0) || (dchisq > 0.1*(Npts - Npar)))); Niter++) { 131 170 chisq = mrq2dmin (x, y, z, dz, Npts, par, Npar, fitfunc, VERBOSE); 132 171 dchisq = ochisq - chisq; 172 // fprintf (stderr, "%f -> %f : %f\n", ochisq, chisq, dchisq); 133 173 ochisq = chisq; 134 fprintf (stderr, "%f -> %f : %f\n", ochisq, chisq, dchisq);135 174 } 136 set_int_variable ("Niter", i);175 set_int_variable ("Niter", Niter); 137 176 138 177 /** create output image (keep in sky) **/ … … 141 180 float *Vi, *Vo, vr, vf; 142 181 143 if ((out = SelectBuffer ( "out", ANYBUFFER, TRUE)) == NULL) return (FALSE);182 if ((out = SelectBuffer (Save, ANYBUFFER, TRUE)) == NULL) { free (Save); return (FALSE); } 144 183 free (out[0].header.buffer); 145 184 free (out[0].matrix.buffer); 146 185 147 186 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) ??*/187 if (!CreateBuffer (out, 2*dX, 2*dY, -32, 0.0, 1.0)) { free (Save); return FALSE; } 188 189 /* four panels: 1) raw image. 2) fit 3) raw - fit 4) absolute deviation */ 151 190 Vi = (float *)buf[0].matrix.buffer; 152 191 Vo = (float *)out[0].matrix.buffer; 153 for ( j = 0; j < ny; j++) {154 for (i = 0; i < nx; i++) {192 for (int j = 0; j < dY; j++) { 193 for (int i = 0; i < dX; i++) { 155 194 vf = fitfunc ((float)(i+sx), (float)(j+sy), par, Npar, NULL); 156 195 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;196 Vo[(i )+(j )*2*dX] = vr; 197 Vo[(i+dX)+(j )*2*dX] = vf; 198 Vo[(i )+(j+dY)*2*dX] = vr - vf + *sky; 199 Vo[(i+dX)+(j+dY)*2*dX] = fabs(vr-vf) + *sky; 161 200 } 162 201 } 202 free (Save); 163 203 } 164 204 … … 169 209 170 210 if (VERBOSE) { 171 for (i = 0; i < Npar; i++) {211 for (int i = 0; i < Npar; i++) { 172 212 gprint (GP_ERR, "%g ", par[i]); 173 213 }
Note:
See TracChangeset
for help on using the changeset viewer.
