IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 40643


Ignore:
Timestamp:
Mar 18, 2019, 5:15:30 PM (7 years ago)
Author:
eugene
Message:

cleanup opihi sort functions; add deimos fitobj function

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/mana/deimos_fitobj.c

    r40642 r40643  
    66int       *deimos_sort_result (DeimosResult *result, int Nresult);
    77int        deimos_get_random_sample (int Nresult);
    8 opihi_flt *deimos_make_test (opihi_flt *guess, float range, int row, int Nrow, int fullInput);
     8opihi_flt *deimos_make_test (opihi_flt *guess, float *sigma, int row, int Nrow, int fullInput);
    99
    1010int deimos_fitobj (int argc, char **argv) {
     
    3636
    3737  float stilt = 0.0; // angle of the slit
     38
     39  // a crude noise model valid for both the guess vectors and the
     40  // data buffer:
     41  float gain = 1.0;
     42  if ((N = get_argument (argc, argv, "-gain"))) {
     43    remove_argument (N, &argc, argv);
     44    gain = atof(argv[N]);
     45    remove_argument (N, &argc, argv);
     46  }
     47  float noise = 0.0;
     48  if ((N = get_argument (argc, argv, "-noise"))) {
     49    remove_argument (N, &argc, argv);
     50    noise = atof(argv[N]);
     51    remove_argument (N, &argc, argv);
     52  }
    3853
    3954  int Niter = 25;
     
    161176  ALLOCATE_PTR (result, DeimosResult, NRESULT);
    162177
     178  float noiseVar = SQ(noise);
     179  ALLOCATE_PTR (objNoise, float, Nrow);
     180  ALLOCATE_PTR (skyNoise, float, Nrow);
     181  ALLOCATE_PTR (bckNoise, float, Nrow);
     182
    163183  // work on segments of Nrow at a time
    164184  // XXX worry about last segment (< Nrow rows)
     
    174194    // likely have large errors in how the guess follows the truth.
    175195
     196    /** old concept:
    176197    float objRange = 0, skyRange = 0, bckRange = 0;
    177198    for (int iy = 0; iy < Nrow; iy++) {
     
    180201      bckRange = MAX(bckVal[iy + row], bckRange);
    181202    }
     203    **/
     204
     205    // new concept: start with 2-sigma range, then ramp down below
     206    for (int iy = 0; iy < Nrow; iy++) {
     207      objNoise[iy] = 2*hypot(sqrt(fabs(objVal[iy + row]) / gain), noiseVar);
     208      skyNoise[iy] = 2*hypot(sqrt(fabs(skyVal[iy + row]) / gain), noiseVar);
     209      bckNoise[iy] = 2*hypot(sqrt(fabs(bckVal[iy + row]) / gain), noiseVar);
     210    }
    182211
    183212    // first step, generate Niter samples (chisq + parameters)
     
    187216
    188217      // generate a set of test values for obj, sky, backgnd based on the current guess
    189       opihi_flt *objtest = deimos_make_test (objVal, objRange, row, Nrow, TRUE);
    190       opihi_flt *skytest = deimos_make_test (skyVal, skyRange, row, Nrow, TRUE);
    191       opihi_flt *bcktest = deimos_make_test (bckVal, bckRange, row, Nrow, TRUE);
     218      opihi_flt *objtest = deimos_make_test (objVal, objNoise, row, Nrow, TRUE);
     219      opihi_flt *skytest = deimos_make_test (skyVal, skyNoise, row, Nrow, TRUE);
     220      opihi_flt *bcktest = deimos_make_test (bckVal, bckNoise, row, Nrow, TRUE);
    192221     
    193222      for (int itmp = 0; FALSE && (itmp < Nrow); itmp++) {
     
    223252
    224253      // XXX not sure this scaling factor, or even concept is good
    225       objRange *= 0.75;
    226       skyRange *= 0.75;
    227       bckRange *= 0.75;
     254      // objRange *= 0.75;
     255      // skyRange *= 0.75;
     256      // bckRange *= 0.75;
     257      for (int iy = 0; iy < Nrow; iy++) {
     258        objNoise[iy] = 0.75*objNoise[iy];
     259        skyNoise[iy] = 0.75*skyNoise[iy];
     260        bckNoise[iy] = 0.75*bckNoise[iy];
     261      }
    228262
    229263      // run Niter iterations, selecting guess values from the result set
     
    234268
    235269        // generate a set of test values for obj, sky, backgnd based on the current guess
    236         opihi_flt *objtest = deimos_make_test (result[entry].obj, objRange, row, Nrow, FALSE);
    237         opihi_flt *skytest = deimos_make_test (result[entry].sky, skyRange, row, Nrow, FALSE);
    238         opihi_flt *bcktest = deimos_make_test (result[entry].bck, bckRange, row, Nrow, FALSE);
     270        opihi_flt *objtest = deimos_make_test (result[entry].obj, objNoise, row, Nrow, FALSE);
     271        opihi_flt *skytest = deimos_make_test (result[entry].sky, skyNoise, row, Nrow, FALSE);
     272        opihi_flt *bcktest = deimos_make_test (result[entry].bck, bckNoise, row, Nrow, FALSE);
    239273     
    240274        for (int itmp = 0; FALSE && (itmp < Nrow); itmp++) {
     
    285319/****************** fitobj Support Functions *******************/
    286320
    287 opihi_flt *deimos_make_test (opihi_flt *guess, float range, int row, int Nrow, int fullInput) {
     321opihi_flt *deimos_make_test (opihi_flt *guess, float *sigma, int row, int Nrow, int fullInput) {
    288322
    289323  // we have a vector, guess, with some length >= row + Nrow.
     
    293327  // if fullInput is TRUE,  the guess vector runs from 0 to Ny (full wavelength range)
    294328  // if fullInput is FALSE, the guess vector runs from row to row + Nrow (subset range)
     329  // sigma is always only Nrow long
    295330
    296331  ALLOCATE_PTR (value, opihi_flt, Nrow);
     
    301336  int iv = 0;
    302337  for (int i = start_pix; i < stop_pix; i++, iv++) {
    303     value[iv] = range*(drand48() - 0.5) + guess[i];
     338    value[iv] = sigma[iv]*(drand48() - 0.5) + guess[i];
    304339  }
    305340  return value;
Note: See TracChangeset for help on using the changeset viewer.