IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 6, 2012, 6:32:19 PM (14 years ago)
Author:
watersc1
Message:

merge from trunk. Preliminary versions of stacktool/warptool updates and regenerate_background.pl script. The warp code is finished and tested, and I still need to get the stack version resolved.

Location:
branches/czw_branch/20120906/Ohana
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/czw_branch/20120906/Ohana

  • branches/czw_branch/20120906/Ohana/src/relphot/src/StarOps.c

    r34267 r34772  
    1111  int Nmos;
    1212  int Ngrid;
    13   double *list;
    14   double *dlist;
    15   double *wlist;
    16   double *aplist;
    17   double *kronlist;
    18   double *dkronlist;
     13
     14  // NOTE: the following arrays are (possibly) pre-allocated and carried down to each
     15  // thread.  The first 3 (list, dlist, wlist) are used in all relphot analyses; the
     16  // others are only used on the final output steps.
     17
     18  double *list;               // list of measure.mag values for a given star
     19  double *dlist;              // mag errors for a star
     20  double *wlist;              // weights to use for mean mags
     21  double *aplist;             // ap mags for a star
     22  double *kronlist;           // kron mags for a star
     23  double *dkronlist;          // kron mag errors
     24
     25  double *psfqf_list;         // psfqf for all filters
     26  double *psfqfperf_list;     // psfqfperf for all filters
     27  double *stargal_list;       // stargal for all filters
    1928} SetMrelInfo;
    2029
     
    168177  ALLOCATE (results.dkronlist, double, Nmax);
    169178
     179  ALLOCATE (results.psfqf_list, double, Nmax);
     180  ALLOCATE (results.psfqfperf_list, double, Nmax);
     181  ALLOCATE (results.stargal_list, double, Nmax);
     182
    170183  for (i = 0; i < Ncatalog; i++) {
    171184    setMrel_catalog  (catalog, i, pass, flatcorr, &results, Nsecfilt); // XXX add arguments as needed for options
     
    178191  free (results.kronlist);
    179192  free (results.dkronlist);
     193
     194  free (results.psfqf_list);
     195  free (results.psfqfperf_list);
     196  free (results.stargal_list);
    180197  return (TRUE);
    181198}
     
    315332  liststats_setmode (&kronstats, STATMODE);
    316333
     334  // StatType psfstats;
     335  // liststats_setmode (&psfstats, "MEAN");
     336
    317337  double *list      = results->list;
    318338  double *dlist     = results->dlist;
     
    322342  double *dkronlist = results->dkronlist;
    323343
     344  double *psfqf_list     = results->psfqf_list;
     345  double *psfqfperf_list = results->psfqfperf_list;
     346  double *stargal_list   = results->stargal_list;
     347
    324348  SetMrelInfoInit (results, FALSE); // do not allocate list,dlist,wlist arrays
    325349
     
    327351
    328352  char *primaryCell = NULL;
    329   ALLOCATE (primaryCell, char, DVO_MAX_PATH);
     353  if (isSetMrelFinal) {
     354    ALLOCATE (primaryCell, char, DVO_MAX_PATH);
     355  }
    330356
    331357  for (j = 0; j < catalog[Nc].Naverage; j++) {
    332     // XXX accumulate all secfilt values in a single pass?
    333 
    334358    // option for a test print
    335359    if (FALSE && (catalog[Nc].average[j].objID == 0x7146) && (catalog[Nc].average[j].catID == 0x49d8)) {
     
    338362    }
    339363
    340     BoundaryTreePrimaryCell(primaryCell, catalog[Nc].average[j].R, catalog[Nc].average[j].D);
     364    if (isSetMrelFinal) {
     365      BoundaryTreePrimaryCell(primaryCell, catalog[Nc].average[j].R, catalog[Nc].average[j].D);
     366    }
    341367
    342368    int GoodPS1 = FALSE;
     
    346372    int NextPS1 = 0;
    347373    int NpsfPS1 = 0;
     374
     375    int Nmeas = 0; // number of meas used for psfqf, psfqfperf, and stargal
     376
     377    int NstackGood = 0;
     378    int NstackSuspect = 0;
     379
     380    int haveStackObject = FALSE;
    348381
    349382    int Ns;
     
    365398      int haveSynth = FALSE;
    366399      int haveStack = FALSE;
     400      int havePS1   = FALSE;
    367401
    368402      // need to find the measurement closest to the center of its skycell, as well as the
     
    370404
    371405      float stackCenterOffsetMin = 1e9;
    372       int stackCenterIDmin = -1;
    373406      off_t stackCenterMeasureMin = -1;
    374407
    375408      float stackPrimaryOffsetMin = 1e9;
    376       int stackPrimaryIDmin = -1;
    377409      off_t stackPrimaryMeasureMin = -1;
    378410
     
    384416      int minUbercalDist = 1000;
    385417   
     418      int isBad = FALSE;
     419      int isSuspect = FALSE;
     420
    386421      N = 0;
    387422      m = catalog[Nc].averageT[j].measureOffset;
     
    393428        if (code->equiv != thisCode) { continue; }
    394429        Ncode ++;
     430
     431        catalog[Nc].measure[m].dbFlags &= ~ID_MEAS_STACK_PRIMARY;
    395432
    396433        if (catalog[Nc].measureT[m].dbFlags & MEAS_BAD) SKIP_THIS_MEAS(Nbad);
     
    414451        if (isnan(Msys)) SKIP_THIS_MEAS(Nsys);
    415452
    416         list[N] = Msys - Mcal - Mmos - Mgrid;
    417 
    418453        int myUbercalDist = getUbercalDist(m,Nc);
    419454        minUbercalDist = MIN(minUbercalDist, myUbercalDist);
    420455
    421456        if (isSetMrelFinal) {
    422           float Map = PhotAper (&catalog[Nc].measure[m]);
    423           aplist[N] = Map - Mcal - Mmos - Mgrid;
    424 
    425           float Mkron = PhotKron (&catalog[Nc].measure[m]);
    426           kronlist[N] = Mkron - Mcal - Mmos - Mgrid;
    427           dkronlist[N] = catalog[Nc].measure[m].dMkron;
    428 
    429457          // special options for PS1 data
    430458          if ((catalog[Nc].measure[m].photcode >= 10000) && (catalog[Nc].measure[m].photcode <= 10500)) {
    431459            // count the extended detections
    432460            if (!isnan(catalog[Nc].measure[m].Map)) {
    433               if (catalog[Nc].measure[m].M - catalog[Nc].measure[m].Map > 0.5) {
     461              float dMagAp = catalog[Nc].measure[m].M - catalog[Nc].measure[m].Map;
     462              float SigmaAp = hypot(0.1, 2.5*catalog[Nc].measure[m].dM);
     463              // XXX this is still quite ad hoc, but at least it:
     464              // (a) converges to 0.1 mag offset at the bright end
     465              // (b) converges to 0.5 mag offset at the faint end (dM = 0.2)
     466              if (dMagAp > SigmaAp) {
    434467                Next ++;
    435468                NextPS1 ++;
     
    438471              }
    439472            }
     473            havePS1 = TRUE;
    440474          }
     475
    441476          // gpc1 stack data
    442477          if ((catalog[Nc].measure[m].photcode >= 11000) && (catalog[Nc].measure[m].photcode <= 11400)) {
    443             // if (pass < 2) continue;
    444478            haveStack = TRUE;
     479            haveStackObject = TRUE;
    445480
    446481            unsigned int stackImageID;
     
    452487              if (stackPrimaryOffset < stackPrimaryOffsetMin) {
    453488                stackPrimaryOffsetMin = stackPrimaryOffset;
    454                 stackPrimaryIDmin = stackImageID;
     489                // stackPrimaryIDmin = stackImageID;
    455490                stackPrimaryMeasureMin = m;
    456491              }
     
    461496            if (stackCenterOffset < stackCenterOffsetMin) {
    462497              stackCenterOffsetMin = stackCenterOffset;
    463               stackCenterIDmin = stackImageID;
     498              // stackCenterIDmin = stackImageID;
    464499              stackCenterMeasureMin = m;
    465500            }
     501
     502            // data quality assessment
     503            isBad |= (catalog[Nc].measure[m].photFlags & code->photomBadMask);
     504            isBad |= (catalog[Nc].measure[m].psfQF < 0.85);
     505            isBad |= isnan(catalog[Nc].measure[m].psfQF);
     506            isBad |= catalog[Nc].measure[m].dM > 0.2; // S/N < 5.0
     507
     508            isSuspect |= (catalog[Nc].measure[m].photFlags & code->photomPoorMask);
     509            isSuspect |= (catalog[Nc].measure[m].psfQFperf < 0.85);
     510
     511            // mean psfQF, psfQFperf, and stargal values are calculated per object (all filters, stacks and exposures)
     512            psfqf_list[Nmeas]     = catalog[Nc].measure[m].psfQF;
     513            psfqfperf_list[Nmeas] = catalog[Nc].measure[m].psfQFperf;
     514            stargal_list[Nmeas]   = catalog[Nc].measure[m].extNsigma;
     515            Nmeas++;
     516
     517            continue; // do not include stack measurements in the per-exposure statistics
    466518          }
    467519
     
    478530                // detections without one of these bits should only be used in PASS_1
    479531                SKIP_THIS_MEAS(Nbad);
    480                 continue;
    481532              }
    482533            }
     
    512563              if (pass < 4) {
    513564                SKIP_THIS_MEAS(Nbad);
    514                 continue;
    515565              }
    516566              haveSynth = TRUE;
    517567            }
    518568          }
     569
     570          // Map (aplist) and Mkron (kronlist,dkronlist) are used to calculate mean mags per filter
     571          float Map = PhotAper (&catalog[Nc].measure[m]);
     572          aplist[N] = Map - Mcal - Mmos - Mgrid;
     573
     574          float Mkron = PhotKron (&catalog[Nc].measure[m]);
     575          kronlist[N] = Mkron - Mcal - Mmos - Mgrid;
     576          dkronlist[N] = catalog[Nc].measure[m].dMkron;
     577
     578          // mean psfQF, psfQFperf, and stargal values are calculated per object (all filters, stacks and exposures)
     579          psfqf_list[Nmeas]     = catalog[Nc].measure[m].psfQF;
     580          psfqfperf_list[Nmeas] = catalog[Nc].measure[m].psfQFperf;
     581          stargal_list[Nmeas]   = catalog[Nc].measure[m].extNsigma;
     582          Nmeas++;
    519583        }
    520584
     
    527591        dlist[N] = MAX (hypot(catalog[Nc].measureT[m].dM, code->photomErrSys), MIN_ERROR);
    528592        wlist[N] = 1.0;
     593        list[N]  = Msys - Mcal - Mmos - Mgrid;
    529594
    530595        // up-weight the ubercal values (or convergence can take a long time...)
     
    549614      if (haveStack && (N > 1)) {
    550615        // fprintf (stderr, "multiple stack values for %10.6f %10.6f\n", catalog[Nc].averageT[j].R, catalog[Nc].averageT[j].D);
     616      }
     617
     618      if (haveStack) {
     619        if (!isSuspect && !isBad) {
     620          NstackGood ++;
     621        }
     622        if (isSuspect && !isBad) {
     623          NstackSuspect ++;
     624        }
    551625      }
    552626
     
    604678        if (haveStack) {
    605679          m  = (stackPrimaryMeasureMin >= 0) ? stackPrimaryMeasureMin : stackCenterMeasureMin;
    606           ID = (stackPrimaryMeasureMin >= 0) ? stackPrimaryIDmin      : stackCenterIDmin;
     680
     681          // we are now populating stackDetectID not stack Image ID in secfilt
     682          // ID = (stackPrimaryMeasureMin >= 0) ? stackPrimaryIDmin      : stackCenterIDmin;
     683          ID = catalog[Nc].measure[m].extID; // for the stack, this is the stackDetectID
    607684
    608685          // get the zero point for the selected image
    609           float zp = Mcal + Mmos + Mgrid + PhotZeroPoint (&catalog[Nc].measure[m], &catalog[Nc].average[j], &catalog[Nc].secfilt[j*Nsecfilt]);
     686          float zp = PhotZeroPoint (&catalog[Nc].measure[m], &catalog[Nc].average[j], &catalog[Nc].secfilt[j*Nsecfilt]) - (Mcal + Mmos + Mgrid);
    610687
    611688          // flux_cgs : erg sec^1 cm^-2 Hz^-1
     
    647724          catalog[Nc].secfilt[Nsecfilt*j+Nsec].dFluxKron = zpFactor * catalog[Nc].measure[m].dFluxKron;
    648725
    649           catalog[Nc].secfilt[Nsecfilt*j+Nsec].stackID   = ID;
     726          catalog[Nc].secfilt[Nsecfilt*j+Nsec].stackDetectID = ID;
     727
     728          catalog[Nc].measure[m].dbFlags |= ID_MEAS_STACK_PHOT_SRC;
     729          if (stackPrimaryMeasureMin >= 0) {
     730            catalog[Nc].measure[m].dbFlags |= ID_MEAS_STACK_PRIMARY;
     731          }
    650732        }
    651733
     
    658740          case 0:
    659741            catalog[Nc].secfilt[Nsecfilt*j+Nsec].flags |= ID_PHOTOM_PASS_0;
    660             GoodPS1 = TRUE;
     742            if (havePS1) GoodPS1 = TRUE;
    661743            break;
    662744          case 1:
    663745            catalog[Nc].secfilt[Nsecfilt*j+Nsec].flags |= ID_PHOTOM_PASS_1;
    664             GoodPS1 = TRUE;
     746            if (havePS1) GoodPS1 = TRUE;
    665747            break;
    666748          case 2:
    667749            catalog[Nc].secfilt[Nsecfilt*j+Nsec].flags |= ID_PHOTOM_PASS_2;
    668             GoodPS1 = TRUE;
     750            if (havePS1) GoodPS1 = TRUE;
    669751            break;
    670752          case 3:
     
    678760          catalog[Nc].secfilt[Nsecfilt*j+Nsec].flags |= ID_SECF_USE_SYNTH;
    679761        }       
     762        if (haveStack) {
     763          catalog[Nc].secfilt[Nsecfilt*j+Nsec].flags |= ID_SECF_HAS_STACK;
     764        }       
     765        if (havePS1) {
     766          catalog[Nc].secfilt[Nsecfilt*j+Nsec].flags |= ID_SECF_HAS_PS1;
     767        }       
    680768        if (haveUbercal) {
    681769          catalog[Nc].secfilt[Nsecfilt*j+Nsec].flags |= ID_SECF_USE_UBERCAL;
     
    685773
    686774    if (isSetMrelFinal) {
    687       DVOAverageFlags flagBits = ID_OBJ_EXT | ID_OBJ_EXT_ALT | ID_OBJ_GOOD | ID_OBJ_GOOD_ALT;
    688 
    689       // we attempt to set a few flags here; reset those bits before trying:
    690       catalog[Nc].average[j].flags &= ~flagBits;
     775      if (pass == 0) {
     776        DVOAverageFlags flagBits = ID_OBJ_EXT | ID_OBJ_EXT_ALT | ID_OBJ_GOOD | ID_OBJ_GOOD_ALT;
     777        // we attempt to set a few flags here; reset those bits before trying:
     778        catalog[Nc].average[j].flags &= ~flagBits;
     779      }
    691780
    692781      if (NextPS1 && (NextPS1 > NpsfPS1)) {
     
    701790      if (Good2MASS) {
    702791        catalog[Nc].average[j].flags |= ID_OBJ_GOOD_ALT;
     792      }
     793
     794      if (NstackGood >= 2) {
     795        catalog[Nc].average[j].flags |= ID_OBJ_GOOD_STACK;
     796      } else if (NstackGood + NstackSuspect >= 2) {
     797        catalog[Nc].average[j].flags |= ID_OBJ_SUSPECT_STACK;
     798      } else if (haveStackObject) {
     799        catalog[Nc].average[j].flags |= ID_OBJ_BAD_STACK;
     800      }
     801
     802      // use NAN values for catalog[Nc].average[j].psfQF as signal
     803      if (!isfinite(catalog[Nc].average[j].psfQF)) {
     804        // do something here
     805        float psfQFmax     = 0.0;
     806        float psfQFperfmax = 0.0;
     807        float stargalmax   = 0.0;
     808        int seq;
     809        for (seq = 0; seq < Nmeas; seq++) {
     810          if (isfinite(psfqf_list[seq])) {
     811            psfQFmax     = MAX (psfqf_list[seq], psfQFmax);
     812          }
     813          if (isfinite(psfqfperf_list[seq])) {
     814            psfQFperfmax = MAX (psfqfperf_list[seq], psfQFperfmax);
     815          }
     816          if (isfinite(stargal_list[seq])) {
     817            stargalmax   = MAX (stargal_list[seq], stargalmax);
     818          }
     819        }
     820
     821        catalog[Nc].average[j].psfQF     = psfQFmax;
     822        catalog[Nc].average[j].psfQFperf = psfQFperfmax;
     823        catalog[Nc].average[j].stargal   = stargalmax;
    703824      }
    704825    }
Note: See TracChangeset for help on using the changeset viewer.