- Timestamp:
- Jun 22, 2019, 3:30:28 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ohana.20190329/src/opihi/cmd.data/cut.c
r40792 r40812 1 1 # include "data.h" 2 2 3 enum {SUM, MEAN, MEDIAN}; 3 enum {SUM, MEAN, MEDIAN, INNER}; 4 5 double cutstat (float *value, int Nvalue, int mode) { 6 7 double output = 0.0; 8 9 if (Nvalue == 0) return NAN; 10 11 if (mode == MEDIAN) { 12 fsort (value, Nvalue); 13 if (Nvalue % 2) { 14 int Ncenter = Nvalue / 2; 15 myAssert ((Ncenter >= 0) && (Ncenter < Nvalue), "cutstat"); 16 output = value[Ncenter]; 17 } else { 18 int Ncenter = Nvalue / 2 - 1; 19 myAssert ((Ncenter >= 0) && (Ncenter < Nvalue - 1), "cutstat"); 20 output = 0.5*(value[Ncenter] + value[Ncenter + 1]); 21 } 22 return output; 23 } 24 if (mode == INNER) { 25 fsort (value, Nvalue); 26 27 int Ns = 0, Ne = 0; 28 if (Nvalue % 2) { 29 // for an odd number of points take the same number below 30 // and above the center value 31 int Ncenter = Nvalue / 2; 32 int Nquarter = 0.25*Nvalue; 33 Ns = Ncenter - Nquarter; 34 Ne = Ncenter + Nquarter; 35 } else { 36 // for an even number, the middle lies between two points 37 // take the same number below as above 38 int Ncenter = (int)(Nvalue / 2) - 1; 39 int Nquarter = 0.25*Nvalue; 40 Ns = Ncenter - Nquarter; 41 Ne = Ncenter + 1 + Nquarter; 42 } 43 int Nv = 0; 44 for (int i = Ns; i <= Ne; i++) { 45 myAssert ((i >= 0) && (i < Nvalue), "cutstat"); 46 output += value[i]; 47 Nv ++; 48 } 49 output /= Nv; 50 return output; 51 } 52 if ((mode == MEAN) || (mode == SUM)) { 53 for (int i = 0; i < Nvalue; i++) { 54 myAssert ((i >= 0) && (i < Nvalue), "cutstat"); 55 output += value[i]; 56 } 57 if (mode == MEAN) { output /= Nvalue; } 58 return output; 59 } 60 return NAN; 61 } 4 62 5 63 int cut (int argc, char **argv) { 6 64 7 65 int i, j, N, Nx, Ny, Mode; 8 float *Vin, *Vbuf , value;66 float *Vin, *Vbuf; 9 67 int sx, sy, nx, ny; 10 68 Vector *xvec, *yvec; … … 19 77 remove_argument (N, &argc, argv); 20 78 Mode = MEAN; 79 } 80 if ((N = get_argument (argc, argv, "-inner"))) { 81 remove_argument (N, &argc, argv); 82 Mode = INNER; 21 83 } 22 84 … … 65 127 Npix ++; 66 128 } 67 if (Npix == 0) { 68 value = NAN; 69 goto set_yvalue; 70 } 71 /* apply stat of choice */ 72 if (Mode == MEDIAN) { 73 fsort (Vbuf, Npix); 74 value = Vbuf[(int)(0.5*Npix)]; 75 } else { 76 value = 0; 77 for (j = 0; j < Npix; j++) { 78 value += Vbuf[j]; 79 } 80 if (Mode == MEAN) { value /= Npix; } 81 } 82 set_yvalue: 83 yvec[0].elements.Flt[i] = value; 129 yvec[0].elements.Flt[i] = cutstat (Vbuf, Npix, Mode); 84 130 } 85 131 free (Vbuf); … … 105 151 Npix ++; 106 152 } 107 if (Npix == 0) { 108 value = NAN; 109 goto set_xvalue; 110 } 111 /* apply stat of choice */ 112 if (Mode == MEDIAN) { 113 fsort (Vbuf, Npix); 114 value = Vbuf[(int)(0.5*Npix)]; 115 } else { 116 value = 0; 117 for (j = 0; j < Npix; j++) { 118 value += Vbuf[j]; 119 } 120 if (Mode == MEAN) { value /= Npix; } 121 } 122 set_xvalue: 123 yvec[0].elements.Flt[i] = value; 153 yvec[0].elements.Flt[i] = cutstat (Vbuf, Npix, Mode); 124 154 } 125 155 free (Vbuf);
Note:
See TracChangeset
for help on using the changeset viewer.
