IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 4, 2021, 6:02:11 PM (5 years ago)
Author:
eugene
Message:

merge changes from eam_branches/ipp-dev-20210817 (add chebyshev, add fit2d_full, add inner_fraction to medimage, change dvoImageOverlap test to CERSTD)

Location:
trunk/Ohana
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana

  • trunk/Ohana/src/opihi/cmd.data/medimage_calc.c

    r41341 r41891  
    1919static float *irls_testval = NULL;
    2020
    21 enum {CALC_MEDIAN, CALC_MEAN, CALC_IRLS, CALC_WTMEAN};
     21enum {CALC_MEDIAN, CALC_MEAN, CALC_IRLS, CALC_WTMEAN, CALC_INNER_FRACTION};
    2222
    2323int medimage_calc (int argc, char **argv) {
     
    3939  }
    4040
     41  float minRange = NAN;
     42  float maxRange = NAN;
     43
    4144  int mode = CALC_MEDIAN;
    4245  if ((N = get_argument (argc, argv, "-mean"))) {
     
    4548  }
    4649  if ((N = get_argument (argc, argv, "-irls"))) {
    47     if (mode != CALC_MEDIAN) { gprint (GP_ERR, "supply only one of -mean, -median, -irls, -wtmean\n"); return FALSE; }
     50    if (mode != CALC_MEDIAN) goto choose_one;
    4851    mode = CALC_IRLS;
    4952    remove_argument (N, &argc, argv);
    5053  }
    5154  if ((N = get_argument (argc, argv, "-wtmean"))) {
    52     if (mode != CALC_MEDIAN) { gprint (GP_ERR, "supply only one of -mean, -median, -irls, -wtmean\n"); return FALSE; }
     55    if (mode != CALC_MEDIAN) goto choose_one;
    5356    mode = CALC_WTMEAN;
    5457    remove_argument (N, &argc, argv);
    5558  }
     59  if ((N = get_argument (argc, argv, "-inner-fraction"))) {
     60    if (mode != CALC_MEDIAN) goto choose_one;
     61    if (argc < N + 3) goto fraction_options;
     62    mode = CALC_INNER_FRACTION;
     63    remove_argument (N, &argc, argv);
     64    minRange = atof(argv[N]);
     65    if ((minRange < 0.0) || (minRange > 1.0)) goto fraction_options;
     66    remove_argument (N, &argc, argv);
     67    maxRange = atof(argv[N]);
     68    if ((maxRange < 0.0) || (maxRange > 1.0)) goto fraction_options;
     69    if (maxRange <= minRange) goto fraction_options;
     70    remove_argument (N, &argc, argv);
     71  }
    5672  if ((N = get_argument (argc, argv, "-median"))) {
    57     if (mode != CALC_MEDIAN) { gprint (GP_ERR, "supply only one of -mean, -median, -irls, -wtmean\n"); return FALSE; }
     73    if (mode != CALC_MEDIAN) goto choose_one;
    5874    mode = CALC_MEDIAN;
    5975    remove_argument (N, &argc, argv);
     
    157173          }
    158174          break;
     175        case CALC_INNER_FRACTION:
     176          fsort (val, N);
     177          int Ns = MIN(MAX(0, minRange * N),N); // e.g., 0.1 * 50 = 5
     178          int Ne = MIN(MAX(0, maxRange * N),N); // e.g., 0.9 * 50 = 45
     179          int Npt = Ne - Ns;
     180
     181          float sum = 0.0;
     182          for (n = Ns; n < Ne; n++) {
     183            sum += val[n];
     184          }
     185          outvalue[Npix] = sum / (float) Npt;
     186
     187          if (varvalue) {
     188            float sum = 0.0;
     189            for (n = Ns; n < Ne; n++) {
     190              sum += SQ(val[n] - outvalue[Npix]);
     191            }
     192            // variance on the mean (stdev / sqrt(N))^2
     193            varvalue[Npix] = sum / (Npt - 1) / Npt;
     194          }
     195          break;
    159196        case CALC_MEAN: {
    160197          float sum = 0.0;
     
    195232  irls_free();
    196233  return TRUE;
     234
     235 choose_one:
     236  gprint (GP_ERR, "supply only one of -mean, -median, -irls, -wtmean, -inner-fraction\n");
     237  return FALSE;
     238
     239 fraction_options:
     240  gprint (GP_ERR, "USE: -inner-fraction (min) (max) : min & max in range 0.0 to 1.0\n");
     241  return FALSE;
    197242}
    198243
Note: See TracChangeset for help on using the changeset viewer.