IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 22, 2019, 3:30:28 PM (7 years ago)
Author:
eugene
Message:

add inner mean statistic

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ohana.20190329/src/opihi/cmd.data/cut.c

    r40792 r40812  
    11# include "data.h"
    22
    3 enum {SUM, MEAN, MEDIAN};
     3enum {SUM, MEAN, MEDIAN, INNER};
     4
     5double 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}
    462
    563int cut (int argc, char **argv) {
    664 
    765  int i, j, N, Nx, Ny, Mode;
    8   float *Vin, *Vbuf, value;
     66  float *Vin, *Vbuf;
    967  int sx, sy, nx, ny;
    1068  Vector *xvec, *yvec;
     
    1977    remove_argument (N, &argc, argv);
    2078    Mode = MEAN;
     79  }
     80  if ((N = get_argument (argc, argv, "-inner"))) {
     81    remove_argument (N, &argc, argv);
     82    Mode = INNER;
    2183  }
    2284
     
    65127        Npix ++;
    66128      }
    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);
    84130    }
    85131    free (Vbuf);
     
    105151        Npix ++;
    106152      }
    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);
    124154    }
    125155    free (Vbuf);
Note: See TracChangeset for help on using the changeset viewer.