IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 19, 2020, 2:53:41 PM (6 years ago)
Author:
eugene
Message:

better method to handle case where windowed second-momemts measurements yield no stars

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot/src/psphotSourceStats.c

    r40489 r41359  
    560560        }
    561561
    562 #if (0)
     562#if (1)
    563563        if (psTraceGetLevel("psphot.moments.save")) {
    564564          char name[64];
     
    604604#endif
    605605
    606         Sout[i] = sqrt(0.5*(psfClump.X + psfClump.Y)) / sigma[i];
     606        // a clump with no stars is not a valid clump
    607607        Nout[i] = psfClump.nStars;
     608        Sout[i] = (Nout[i] == 0) ? NAN : sqrt(0.5*(psfClump.X + psfClump.Y)) / sigma[i];
    608609    }
    609610
    610611    // we are looking for sigma for which Sout = 0.65 (or some other value)
     612    // EAM 2020.05.19 : this analysis fails if any of the measurements above have no valid stars
     613    // A result with Nout[] = 0 should be skipped in the analysis
     614   
    611615    int Nstars = 0;
    612616    float minKronRadius = NAN;
    613617    float Sigma = NAN;
    614     float minS = Sout[0];
    615     float maxS = Sout[0];
     618
     619    float minS = NAN;
     620    float maxS = NAN;
     621    int maxN = -1;
     622    int minN = -1;
    616623    for (int i = 0; i < nsigma; i++) {
    617         minS = PS_MIN(Sout[i], minS);
    618         maxS = PS_MAX(Sout[i], maxS);
    619     }
    620     if (minS > 0.65) Sigma = sigma[nsigma-1];
    621     if (maxS < 0.65) Sigma = sigma[0];
    622 
     624      if (!isfinite(Sout[i])) continue;
     625      if (!isfinite(minS)) {
     626        minS = Sout[i];
     627        maxS = Sout[i];
     628        minN = i;
     629        maxN = i;
     630      }
     631      if (Sout[i] < minS) {
     632          minS = Sout[i];
     633          minN = i;
     634      }
     635      if (Sout[i] > maxS) {
     636          maxS = Sout[i];
     637          maxN = i;
     638      }
     639    }
     640    if (!isfinite(minS)) {
     641      psLogMsg ("psphot", 3, "failed to find a valid window function\n");
     642      return false;
     643    }
     644
     645    // if all Sout values are above (or below) the threshold, saturate on the minimum (or maximum) valid sigma value
     646    if (minS > 0.65) { Sigma = sigma[minN]; Nstars = Nout[minN]; minKronRadius = Rmin[minN]; }
     647    if (maxS < 0.65) { Sigma = sigma[maxN]; Nstars = Nout[maxN]; minKronRadius = Rmin[maxN]; }
     648
     649    // this loop will be skipped if Sigma is set above
    623650    for (int i = 0; i < nsigma - 1 && isnan(Sigma); i++) {
    624651        if (!isfinite(Sout[i]) || !isfinite(Sout[i+1])) continue;
     
    629656        minKronRadius = Rmin[i] + (0.65 - Sout[i])*(Rmin[i+1] - Rmin[i])/(Sout[i+1] - Sout[i]);
    630657    }
    631     psAssert (isfinite(Sigma), "did we miss a case?");
     658    // EAM: this test will fail if only a single entry above is valid
     659    if (!isfinite(Sigma)) {
     660      psLogMsg ("psphot", 3, "failed to find a valid window function (case 2)\n");
     661      return false;
     662    }
    632663    if (!isfinite(minKronRadius)) {
    633664        minKronRadius = Sigma;
Note: See TracChangeset for help on using the changeset viewer.