Changeset 40662
- Timestamp:
- Mar 31, 2019, 8:47:40 AM (7 years ago)
- Location:
- branches/eam_branches/ohana.20190329/src/opihi
- Files:
-
- 2 added
- 8 edited
-
cmd.data/Makefile (modified) (1 diff)
-
cmd.data/init.c (modified) (2 diffs)
-
cmd.data/medimage_commands.c (modified) (6 diffs)
-
cmd.data/spline.c (modified) (3 diffs)
-
cmd.data/spline_commands.c (modified) (1 diff)
-
cmd.data/virls.c (added)
-
cmd.data/vwtmean.c (added)
-
include/data.h (modified) (1 diff)
-
lib.data/MedImageOps.c (modified) (2 diffs)
-
mana/deimos_mkobj.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ohana.20190329/src/opihi/cmd.data/Makefile
r40637 r40662 182 182 $(SRC)/vsmooth.$(ARCH).o \ 183 183 $(SRC)/vstats.$(ARCH).o \ 184 $(SRC)/virls.$(ARCH).o \ 185 $(SRC)/vwtmean.$(ARCH).o \ 184 186 $(SRC)/xsection.$(ARCH).o \ 185 187 $(SRC)/vsh.$(ARCH).o \ -
branches/eam_branches/ohana.20190329/src/opihi/cmd.data/init.c
r40637 r40662 163 163 int vzload PROTO((int, char **)); 164 164 int vstats PROTO((int, char **)); 165 int vstats PROTO((int, char **)); 166 int virls PROTO((int, char **)); 167 int vwtmean PROTO((int, char **)); 165 168 int vroll PROTO((int, char **)); 166 169 int vshift PROTO((int, char **)); … … 360 363 {1, "vsmooth", vsmooth, "Gaussian smooth of a vector"}, 361 364 {1, "vstats", vstats, "statistics on a vector"}, 365 {1, "vwtmean", vwtmean, "weighted mean of a vector"}, 366 {1, "virls", virls, "IRLS mean of a vector"}, 362 367 {1, "vzload", vzload, "load vectors as overlay on image display (scaled points)"}, 363 368 {1, "vsh", vsh, "Vector Spherical Harmonics"}, -
branches/eam_branches/ohana.20190329/src/opihi/cmd.data/medimage_commands.c
r40661 r40662 1 1 # include "data.h" 2 3 float weight_cauchy_square_flt (float x2); 4 float irls_mean (float *val, float *wgt, int N); 5 6 # define IRLS_TOLERANCE 1e-4 2 7 3 8 int medimage_list (int argc, char **argv) { … … 15 20 int medimage_add (int argc, char **argv) { 16 21 22 int N; 17 23 Buffer *image; 18 19 Buffer *var = NULL; 20 if ((N = get_argument (argc, argv, "- var"))) {21 remove_argument (N, &argc, argv); 22 if (( var= SelectBuffer (argv[N], OLDBUFFER, TRUE)) == NULL) return (FALSE);24 Buffer *sig = NULL; 25 26 if ((N = get_argument (argc, argv, "-sigma"))) { 27 remove_argument (N, &argc, argv); 28 if ((sig = SelectBuffer (argv[N], OLDBUFFER, TRUE)) == NULL) return (FALSE); 23 29 remove_argument (N, &argc, argv); 24 30 } 25 31 26 32 if (argc != 3) { 27 gprint (GP_ERR, "USAGE: medimage add (name) (image) [- var var]\n");33 gprint (GP_ERR, "USAGE: medimage add (name) (image) [-sigma sigma]\n"); 28 34 gprint (GP_ERR, " add the given image to the set of images to be medianed\n"); 29 35 gprint (GP_ERR, " optionally supply variance image (for weighted calculations)\n"); … … 33 39 if ((image = SelectBuffer (argv[2], OLDBUFFER, TRUE)) == NULL) return (FALSE); 34 40 35 XXX: match dimensions wit var image 41 if (sig) { 42 if ((sig->matrix.Naxis[0] != image->matrix.Naxis[0]) || 43 (sig->matrix.Naxis[1] != image->matrix.Naxis[1])) { 44 gprint (GP_ERR, "sigma buffer does not match image buffer dimensions\n"); 45 return FALSE; 46 } 47 } 36 48 37 49 MedImageType *median = FindMedImage (argv[1]); … … 56 68 // new image should match existing medimage dimensions 57 69 70 // AddMedImage (median, image, sig); 58 71 int Ninput = median->Ninput; 59 72 median->Ninput ++; 73 REALLOCATE (median->flx, float *, median->Ninput); 60 74 REALLOCATE (median->sig, float *, median->Ninput); 61 REALLOCATE (median->var, float *, median->Ninput); 62 63 ALLOCATE (median->sig[Ninput], float,median->Nx*median->Ny);64 memcpy (median->sig[Ninput], image->matrix.buffer, sizeof(float)*median->Nx*median->Ny); 65 66 median->var[Ninput] = NULL;67 if (var) {68 ALLOCATE (median->var[Ninput], float,median->Nx*median->Ny);69 memcpy (median->var[Ninput], var->matrix.buffer, sizeof(float)*median->Nx*median->Ny);70 } 71 72 return TRUE; 73 } 74 75 76 ALLOCATE (median->flx[Ninput], float, median->Nx*median->Ny); 77 memcpy (median->flx[Ninput], image->matrix.buffer, sizeof(float)*median->Nx*median->Ny); 78 79 median->sig[Ninput] = NULL; 80 if (sig) { 81 ALLOCATE (median->sig[Ninput], float, median->Nx*median->Ny); 82 memcpy (median->sig[Ninput], sig->matrix.buffer, sizeof(float)*median->Nx*median->Ny); 83 } 84 85 return TRUE; 86 } 87 88 enum {CALC_MEDIAN, CALC_MEAN, CALC_IRLS, CALC_WTMEAN}; 75 89 int medimage_calc (int argc, char **argv) { 76 90 77 91 int ix, iy, n, N; 78 92 Buffer *output; 79 80 int CALC_MEAN = FALSE;93 94 int mode = CALC_MEDIAN; 81 95 if ((N = get_argument (argc, argv, "-mean"))) { 82 CALC_MEAN = TRUE; 96 mode = CALC_MEAN; 97 remove_argument (N, &argc, argv); 98 } 99 if ((N = get_argument (argc, argv, "-irls"))) { 100 if (mode != CALC_MEDIAN) { gprint (GP_ERR, "supply only one of -mean, -irls, -wtmean\n"); return FALSE; } 101 mode = CALC_IRLS; 102 remove_argument (N, &argc, argv); 103 } 104 if ((N = get_argument (argc, argv, "-wtmean"))) { 105 if (mode != CALC_MEDIAN) { gprint (GP_ERR, "supply only one of -mean, -irls, -wtmean\n"); return FALSE; } 106 mode = CALC_WTMEAN; 83 107 remove_argument (N, &argc, argv); 84 108 } 85 109 86 110 if (argc != 3) { 87 gprint (GP_ERR, "USAGE: medimage calc (name) (output) [-mean ]\n");111 gprint (GP_ERR, "USAGE: medimage calc (name) (output) [-mean,-irls,-wtmean]\n"); 88 112 gprint (GP_ERR, " calculate the median image for the median image set\n"); 89 113 return FALSE; … … 102 126 int Ny = median->Ny; 103 127 104 float *value = NULL;105 ALLOCATE (value, float, Ninput);128 ALLOCATE_PTR (val, float, Ninput); 129 ALLOCATE_PTR (wgt, float, Ninput); 106 130 107 131 gfits_free_matrix (&output->matrix); … … 117 141 int Npix = ix + Nx*iy; 118 142 for (n = 0; n < Ninput; n++) { 119 float v = median-> sig[n][Npix];143 float v = median->flx[n][Npix]; 120 144 if (!isfinite(v)) continue; 121 value[N] = v; 145 val[N] = v; 146 wgt[N] = 1.0; 147 if (median->sig[n]) { 148 float s = median->sig[n][Npix]; 149 if (!isfinite(s)) continue; 150 if (fabs(s) < 2*FLT_MIN) s = 2*FLT_MIN; 151 wgt[N] = 1.0 / SQ(s); 152 } 122 153 N++; 123 154 } 124 155 if (N == 0) continue; 125 156 126 XXXX: add in calc options: 127 weighted mean 128 irls 129 130 if (CALC_MEAN) { 131 float sum = 0.0; 132 for (n = 0; n < N; n++) { 133 sum += value[n]; 157 switch (mode) { 158 case CALC_MEDIAN: 159 fsort (val, N); 160 outvalue[Npix] = val[(int)(0.5*N)]; 161 break; 162 case CALC_MEAN: { 163 float sum = 0.0; 164 for (n = 0; n < N; n++) { 165 sum += val[n]; 166 } 167 outvalue[Npix] = sum / (float) N; 168 break; 134 169 } 135 outvalue[Npix] = sum / (float) N; 136 } else { 137 fsort (value, N); 138 outvalue[Npix] = value[(int)(0.5*N)]; 170 case CALC_WTMEAN: { 171 float S1 = 0.0, S2 = 0.0; 172 for (n = 0; n < N; n++) { 173 S1 += wgt[n] * val[n]; 174 S2 += wgt[n]; 175 } 176 outvalue[Npix] = S1 / S2; 177 break; 178 } 179 case CALC_IRLS: 180 outvalue[Npix] = irls_mean (val, wgt, N); 139 181 } 140 182 } 141 183 } 142 143 return TRUE; 144 } 184 return TRUE; 185 } 186 187 float irls_mean (float *val, float *wgt, int N) { 188 189 // calculate weighted mean 190 float S1 = 0.0, S2 = 0.0; 191 for (int n = 0; n < N; n++) { 192 S1 += wgt[n] * val[n]; 193 S2 += wgt[n]; 194 } 195 float Value = S1 / S2; 196 197 int converged = FALSE; 198 for (int i = 0; (i < 10) && !converged; i++) { 199 float ValueLast = Value; 200 201 float S1 = 0.0, S2 = 0.0; 202 203 // calculate weight modification based on distances (squared). 204 // use modifier to calculate new weighted mean 205 for (int n = 0; n < N; n++) { 206 float dV = (val[n] - Value); 207 float d2 = SQ(dV) * wgt[n]; 208 209 float Mod = weight_cauchy_square_flt (d2); 210 S1 += Mod * wgt[n] * val[n]; 211 S2 += Mod * wgt[n]; 212 } 213 Value = S1 / S2; 214 215 float delta = fabs(Value - ValueLast); 216 if (delta < Value * IRLS_TOLERANCE) converged = TRUE; 217 } 218 return Value; 219 } 220 221 // exp(-(x^2/s^2)/2) = (1/2) 222 // -(x^2/s^2)/2 = ln(1/2) 223 // (x^2/s^2)/2 = ln(2) 224 // (x^2/s^2) = 2ln(2) 225 // (x /s) = sqrt(2ln(2)) : half-width at half-max 226 // FWHM = 2sqrt(2ln(2)) 227 228 // R2 = (X / 2.385)^2 = (X^2 / 2.385^2) 229 230 # define CAUCY_FACTOR 1.0 231 232 float weight_cauchy_square_flt (float x2) { 233 float r2 = x2 / CAUCY_FACTOR; 234 return (1.0 / (1.0 + r2)); 235 } 236 145 237 146 238 /* 147 int medimage_save (int argc, char **argv) {148 149 int N;150 151 int APPEND = FALSE;152 if ((N = get_argument (argc, argv, "-append"))) {153 APPEND = TRUE;154 remove_argument (N, &argc, argv);155 }156 157 if (argc != 3) {158 gprint (GP_ERR, "USAGE: medimage save (name) (filename) [-append]\n");159 return FALSE;160 }161 162 if (!SaveMedImage(argv[2], argv[1], APPEND)) {163 gprint (GP_ERR, "failed to save medimage %s\n", argv[1]);164 return (FALSE);165 }166 return TRUE;167 }168 169 int medimage_load (int argc, char **argv) {170 171 if (argc != 3) {172 gprint (GP_ERR, "USAGE: medimage load (name) (filename)\n");173 return FALSE;174 }175 176 if (!LoadMedImage(argv[2], argv[1])) {177 gprint (GP_ERR, "failed to load medimage %s\n", argv[1]);178 return (FALSE);179 }180 return TRUE;181 }239 int medimage_save (int argc, char **argv) { 240 241 int N; 242 243 int APPEND = FALSE; 244 if ((N = get_argument (argc, argv, "-append"))) { 245 APPEND = TRUE; 246 remove_argument (N, &argc, argv); 247 } 248 249 if (argc != 3) { 250 gprint (GP_ERR, "USAGE: medimage save (name) (filename) [-append]\n"); 251 return FALSE; 252 } 253 254 if (!SaveMedImage(argv[2], argv[1], APPEND)) { 255 gprint (GP_ERR, "failed to save medimage %s\n", argv[1]); 256 return (FALSE); 257 } 258 return TRUE; 259 } 260 261 int medimage_load (int argc, char **argv) { 262 263 if (argc != 3) { 264 gprint (GP_ERR, "USAGE: medimage load (name) (filename)\n"); 265 return FALSE; 266 } 267 268 if (!LoadMedImage(argv[2], argv[1])) { 269 gprint (GP_ERR, "failed to load medimage %s\n", argv[1]); 270 return (FALSE); 271 } 272 return TRUE; 273 } 182 274 */ 183 275 -
branches/eam_branches/ohana.20190329/src/opihi/cmd.data/spline.c
r39457 r40662 7 7 int spline_load (int argc, char **argv); 8 8 int spline_save (int argc, char **argv); 9 int spline_print (int argc, char **argv); 9 10 int spline_delete (int argc, char **argv); 10 11 int spline_rename (int argc, char **argv); … … 18 19 {1, "load", spline_load, "write a spline to a FITS file"}, 19 20 {1, "save", spline_save, "read a spline from a FITS file"}, 21 {1, "print", spline_print, "print a spline to stdout"}, 20 22 {1, "delete", spline_delete, "delete a spline"}, 21 23 {1, "rename", spline_rename, "rename a spline"}, … … 35 37 gprint (GP_ERR, " spline load (spline) (filename) : load a spline from a FITS file\n"); 36 38 gprint (GP_ERR, " spline save (spline) (filename) [-append] : save a spline in FITS format\n"); 39 gprint (GP_ERR, " spline print (spline) : print a spline to stdout\n"); 37 40 38 41 return FALSE; -
branches/eam_branches/ohana.20190329/src/opihi/cmd.data/spline_commands.c
r39457 r40662 93 93 } 94 94 95 int spline_print (int argc, char **argv) { 96 97 int i; 98 99 if (argc != 2) { 100 gprint (GP_ERR, "USAGE: spline print (name)\n"); 101 return FALSE; 102 } 103 104 Spline *myspline = FindSpline (argv[1]); 105 if (!myspline) { 106 gprint (GP_ERR, "spline %s not found\n", argv[1]); 107 return (FALSE); 108 } 109 110 for (i = 0; i < myspline->Nknots; i++) { 111 gprint (GP_LOG, "%lf : %lf : %lf\n", myspline->xk[i], myspline->yk[i], myspline->y2[i]); 112 } 113 114 return TRUE; 115 } 116 95 117 int spline_load (int argc, char **argv) { 96 118 -
branches/eam_branches/ohana.20190329/src/opihi/include/data.h
r40661 r40662 48 48 int Nx; 49 49 int Ny; 50 float **flx; 50 51 float **sig; 51 float **var;52 52 } MedImageType; 53 53 -
branches/eam_branches/ohana.20190329/src/opihi/lib.data/MedImageOps.c
r40661 r40662 32 32 free (medimage[0].name); 33 33 for (i = 0; i < medimage[0].Ninput; i++) { 34 free (medimage[0].sig[i]); 34 free (medimage[0].flx[i]); 35 FREE (medimage[0].sig[i]); 35 36 } 37 free (medimage[0].flx); 36 38 free (medimage[0].sig); 37 39 free (medimage); … … 75 77 medimage->Nx = Nx; 76 78 medimage->Ny = Ny; 79 ALLOCATE (medimage->flx, float *, 1); 77 80 ALLOCATE (medimage->sig, float *, 1); 78 81 -
branches/eam_branches/ohana.20190329/src/opihi/mana/deimos_mkobj.c
r40661 r40662 190 190 if (psf) Npof -= Npsf; 191 191 192 // integral and fractional pixel offsets of PSF (none, by default) 193 int dxi = 0; 194 float dxf = 0.0, dxr = 1.0; 195 192 196 if (psf_trace) { 193 float dx = -spline_apply_dbl (psf_trace->xk, psf_trace->yk, psf_trace->y2, psf_trace->Nknots, iy); 194 Npof += dx; 195 } 197 float dx = spline_apply_dbl (psf_trace->xk, psf_trace->yk, psf_trace->y2, psf_trace->Nknots, iy); 198 dxi = floor(dx); 199 dxf = dx - dxi; // -1.7 -> +0.3, -0.5 -> +0.5, +0.5 ->+0.5, +1.7 -> +0.7 200 dxr = 1 - dxf; 201 Npof += dxi; 202 if (iy % 200 == 0) { fprintf (stderr, "%d : %f : %d : %f %f\n", iy, dx, dxi, dxf, dxr); } 203 } 204 205 // if fractional offset is small, do not interpolate 206 int doInterp = fabs(dxf) < 1e-5 ? FALSE : TRUE; 196 207 197 208 // flux = obj * PSF + sky … … 205 216 // only add in the flux if we are in range of the PSF 206 217 if ((n >= 0) && (n < NpsfFull)) { 207 value += objVy * psfV[n]; 218 if (doInterp) { 219 if ((n > 0) && (n < NpsfFull)) { 220 value += objVy*psfV[n]*dxr + objVy*psfV[n-1]*dxf; 221 } 222 if (n == 0) { 223 value += objVy*psfV[n]*dxr; 224 } 225 } else { 226 value += objVy*psfV[n]; 227 } 208 228 } 209 229 } else {
Note:
See TracChangeset
for help on using the changeset viewer.
