Changeset 40291 for trunk/Ohana/src/opihi/lib.data/starfuncs.c
- Timestamp:
- Dec 13, 2017, 10:53:48 AM (9 years ago)
- Location:
- trunk/Ohana
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
src/opihi/lib.data/starfuncs.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana
-
trunk/Ohana/src/opihi/lib.data/starfuncs.c
r36679 r40291 101 101 } 102 102 103 double get_box_stats (Matrix *matrix, int X, int Y, int dX, int dY, int Nborder, double max, int VERBOSE) { 104 105 double *ring; 106 double x, y, x2, y2, xy, I, sky, FWHMx, FWHMy, value, mag, Sxy; 107 int i, j, n, Nring, Nmax; 108 double Npts, gain, dsky2, dmag, peak, offset; 109 char *string; 110 111 string = get_variable ("GAIN"); 112 if (string == (char *) NULL) { 113 gprint (GP_ERR, "assuming a value of 1.0\n"); 114 gain = 1.0; 115 } else { 116 gain = atof (string); 117 } 118 Nborder = MAX (1, Nborder); 119 Nborder = MIN (1000, Nborder); 120 121 int dX2 = (int)(0.5*dX); 122 int dY2 = (int)(0.5*dY); 123 dX = 2 * dX2 + 1; 124 dY = 2 * dY2 + 1; 125 126 Nring = 2*Nborder*(dX + 2*Nborder) + 2*Nborder*(dY + 2*Nborder); 127 ALLOCATE (ring, double, Nring); 128 bzero (ring, sizeof(double)*Nring); 129 130 // get the pixels in the border regions: 131 // XXX gfits_get_matrix_value returns 0 for out-of-bounds pixels, but should return NAN 132 // and they should be skipped 133 n = 0; 134 for (j = 0; j < Nborder; j++) { 135 for (i = X - dX2 - Nborder; i < X + dX2 + Nborder + 1; i++) { 136 value = gfits_get_matrix_value (matrix, i, (int)(Y - dY2 - j)); 137 if (isfinite(value)) { ring[n] = value; n++; } 138 value = gfits_get_matrix_value (matrix, i, (int)(Y + dY2 + j)); 139 if (isfinite(value)) { ring[n] = value; n++; } 140 } 141 for (i = Y - dY2; i < Y + dY2 + 1; i++) { 142 value = gfits_get_matrix_value (matrix, (int)(X - dX2 - j), i); 143 if (isfinite(value)) { ring[n] = value; n++; } 144 value = gfits_get_matrix_value (matrix, (int)(X + dX2 + j), i); 145 if (isfinite(value)) { ring[n] = value; n++; } 146 } 147 } 148 Nring = n; 149 dsort (ring, Nring); 150 for (Npts = sky = dsky2 = 0, i = 0.25*Nring; i < 0.75*Nring; i++, Npts += 1.0) { 151 sky += ring[i]; 152 dsky2 += ring[i]*ring[i]; 153 } 154 sky = sky / Npts; 155 dsky2 = dsky2 / Npts - sky*sky; 156 free (ring); 157 158 float dx, dy; 159 160 peak = 0; 161 Npts = Nmax = 0; 162 x = y = x2 = y2 = xy = I = 0; 163 for (i = X - dX2; i < X + dX2 + 1; i++) { 164 for (j = Y - dY2; j < Y + dY2 + 1; j++) { 165 value = gfits_get_matrix_value (matrix, i, j); 166 if (!isfinite(value)) continue; 167 offset = value - sky; 168 dx = i - X; 169 dy = j - Y; 170 x += dx*offset; 171 y += dy*offset; 172 x2 += dx*dx*offset; 173 y2 += dy*dy*offset; 174 xy += dx*dy*offset; 175 I += offset; 176 Npts ++; 177 if (value > max) { 178 Nmax ++; 179 } 180 if (value > peak) peak = value; 181 } 182 } 183 184 x = x / I; 185 y = y / I; 186 FWHMx = 2.355*sqrt (fabs(x2 / I - x*x)); 187 FWHMy = 2.355*sqrt (fabs(y2 / I - y*y)); 188 Sxy = xy / I - x*y; 189 mag = -2.5*log10(I); 190 191 // flux_error = sqrt( I + Npts*dsky2 ) 192 // dmag = 1.086 * flux_error / flux 193 dmag = 1.086 * sqrt (fabs(I + Npts*dsky2)) / (gain * I); 194 x = x + X; 195 y = y + Y; 196 197 set_variable ("Xg", x); 198 set_variable ("Yg", y); 199 set_variable ("SXg", FWHMx); 200 set_variable ("SYg", FWHMy); 201 set_variable ("SXYg", Sxy); 202 set_variable ("Sg", sky); 203 set_variable ("dSg", sqrt (fabs (dsky2))); 204 set_variable ("Zg", mag); 205 set_variable ("dZg", dmag); 206 set_variable ("Zcg", I); 207 set_variable ("Zpk", peak); 208 set_int_variable ("Nsat", Nmax); 209 set_int_variable ("Npts", Npts); 210 211 if (VERBOSE) gprint (GP_LOG, "%f %f %f %f %f %f %f %f\n", x, y, FWHMx, FWHMy, sky, I, mag, dmag); 212 213 return (mag); 214 215 } 216 103 217 static double Raper = 5; 104 218 static double Rinner = 10;
Note:
See TracChangeset
for help on using the changeset viewer.
