IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 4, 2021, 10:46:36 AM (5 years ago)
Author:
eugene
Message:

add user-control over night, mosaic, image chisq & scatter cuts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/relphot.20210521/src/StarOps.c

    r41625 r41637  
    576576}
    577577
     578static float MinChiSqLim = NAN;
     579static float MaxChiSqLim = NAN;
     580static float MinScatterLim = NAN;
     581static float MaxScatterLim = NAN;
     582
    578583void clean_stars (Catalog *catalog, int Ncatalog) {
    579584
    580   int i, j, Ndel, Nave, Ntot, mark, Ns, Nscat, Nchi, Nnan;
    581   float dM;
    582   double MaxScatter, MaxChisq;
    583   double *xlist, *slist, *dlist;
     585  int Ndel, Nave, Ntot, Nscat, Nchi, Nnan;
     586  double *xlist, *slist;
     587
     588  if (isnan (MaxChiSqLim))   MaxChiSqLim   = STAR_CHISQ;
     589  if (isnan (MaxScatterLim)) MaxScatterLim = STAR_SCATTER;
    584590
    585591  StatType stats;
     
    589595
    590596  /* find Mchisq median -> ChiSq lim must be > median */
    591   for (i = Ntot = 0; i < Ncatalog; i++) {
     597  for (int i = Ntot = 0; i < Ncatalog; i++) {
    592598    Ntot += catalog[i].Naverage;
    593599  }
    594600  ALLOCATE (xlist, double, Ntot);
    595601  ALLOCATE (slist, double, Ntot);
    596   ALLOCATE (dlist, double, Ntot);
    597602
    598603  int Nsecfilt = GetPhotcodeNsecfilt ();
    599604
    600605  // eliminate bad stars using the stats for a single secfilt at a time
    601   for (Ns = 0; Ns < Nphotcodes; Ns ++) {
     606  for (int Ns = 0; Ns < Nphotcodes; Ns ++) {
    602607   
    603608    int thisCode = photcodes[Ns][0].code;
    604609    int Nsec = GetPhotcodeNsec(thisCode);
    605610
    606     for (i = Ntot = 0; i < Ncatalog; i++) {
    607       for (j = 0; j < catalog[i].Naverage; j++) {
     611    for (int i = Ntot = 0; i < Ncatalog; i++) {
     612      for (int j = 0; j < catalog[i].Naverage; j++) {
    608613        if (catalog[i].secfilt[Nsecfilt*j+Nsec].flags & STAR_BAD) continue;
    609614        float Mchisq = catalog[i].secfilt[Nsecfilt*j+Nsec].Mchisq;
     
    611616        xlist[Ntot] = Mchisq;
    612617        slist[Ntot] = catalog[i].secfilt[Nsecfilt*j+Nsec].dMpsfChp;
    613         dlist[Ntot] = 1;
    614618        Ntot ++;
    615619      }
    616620    }
    617621
    618     // XXX the limits for MaxChisq and MaxScatter should be
    619     // user-defined.  This uses
    620     liststats (xlist, dlist, NULL, Ntot, &stats);
    621     float ChiSqUpper90 = stats.Upper90;
    622     MaxChisq = MAX (STAR_CHISQ, ChiSqUpper90);
    623 
    624     liststats (slist, dlist, NULL, Ntot, &stats);
     622    liststats (xlist, NULL, NULL, Ntot, &stats);
     623    float ChiSqUpper90 = stats.Upper90;
     624    if (isnan (MinChiSqLim)) MinChiSqLim = 2.0*stats.median;             // chi-square cut cannot fall below this value (even if this is > MaxChiSqLim)
     625    float ChiSqLimit = MAX(MinChiSqLim, MIN(MaxChiSqLim, ChiSqUpper90)); // chi-square cut should be between MinChiSqLim and MaxChiSqLim
     626
     627    liststats (slist, NULL, NULL, Ntot, &stats);
    625628    float ScatterUpper90 = stats.Upper90;
    626     MaxScatter = MAX (STAR_SCATTER, ScatterUpper90);
    627     fprintf (stderr, "Max Scatter: %f, Max Chisq: %f\n", MaxScatter, MaxChisq);
     629    if (isnan (MinScatterLim)) MinScatterLim = 2.0*stats.median;         // scatter cut cannto fall below this value (even if this is > MaxScatterLim)
     630    float ScatterLimit = MAX(MinScatterLim, MIN(MaxScatterLim, ScatterUpper90));
     631
     632    fprintf (stderr, "STARS: ChiSqLimit: %f, ScatterLimit: %f | ChiSquare Upper 90: %f, Scatter Upper 90: %f\n", ChiSqLimit, ScatterLimit, ChiSqUpper90, ScatterUpper90);
    628633
    629634    Ndel = Nave = Nscat = Nnan = Nchi = 0;
    630     for (i = 0; i < Ncatalog; i++) {
    631       for (j = 0; j < catalog[i].Naverage; j++) {
    632         dM = catalog[i].secfilt[Nsecfilt*j+Nsec].dMpsfChp;
     635    for (int i = 0; i < Ncatalog; i++) {
     636      for (int j = 0; j < catalog[i].Naverage; j++) {
     637        float dM = catalog[i].secfilt[Nsecfilt*j+Nsec].dMpsfChp;
    633638        float Mchisq = catalog[i].secfilt[Nsecfilt*j+Nsec].Mchisq;
    634         mark = (dM > MaxScatter) || (isnan(Mchisq)) || (Mchisq > MaxChisq);
     639        int mark = (dM > ScatterLimit) || (isnan(Mchisq)) || (Mchisq > ChiSqLimit);
    635640        if (mark) {
    636641          catalog[i].secfilt[Nsecfilt*j+Nsec].flags |= ID_SECF_STAR_POOR;
    637642          Ndel ++;
    638           if (dM > MaxScatter)   { Nscat ++; }
    639           if (isnan(Mchisq))     { Nnan ++; }
    640           if (Mchisq > MaxChisq) { Nchi ++; }
     643          if (dM > ScatterLimit)   { Nscat ++; }
     644          if (isnan(Mchisq))       { Nnan ++; }
     645          if (Mchisq > ChiSqLimit) { Nchi ++; }
    641646        } else {
    642647          catalog[i].secfilt[Nsecfilt*j+Nsec].flags &= ~ID_SECF_STAR_POOR;
     
    645650      }
    646651    }
    647     fprintf (stderr, "%d stars marked variable (%d scat, %d nan, %d chi), %d total\n", Ndel, Nscat, Nnan, Nchi, Nave);
     652    fprintf (stderr, "%d of %d stars marked variable (%d scat, %d nan, %d chi)\n", Ndel, Nave, Nscat, Nnan, Nchi);
    648653  }
    649654  free (xlist);
    650655  free (slist);
    651   free (dlist);
    652656}
    653657
Note: See TracChangeset for help on using the changeset viewer.