IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 1, 2012, 3:00:19 PM (14 years ago)
Author:
eugene
Message:

updates to relastro to support distributed dvo; some optmimization (eg, image matching to area); cleanup names of static helper arrays in ImageOps, MosaicOps; cleanup rules for -reset options (relastro does not reset photom bits); skip objects with NAN error bars (can be used to exclude some photcodes from astrometry); enum for mask bits in FitChip and related; choose max order using same rules as psastro; plug leaks; reduce verbosity; big re-org of main (for parallel code); only use accepted measurements for Tmin,Tmax,Trange,Tmean; require a min parallax factor to fit parallaxes; use MeasureTiny where possible; use new ParsePhotcodeList function; testparallax function; threaded version of UpdateChips; bcatalog limit density selecting objects by number of measurements; high-speed now copies support tables to output database; high-speed may write to a parallel database; test for unsorted database (& fail if true)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/relastro/src/UpdateObjects.c

    r32695 r33652  
    3838
    3939
     40// This function operates on both Measure and MeasureTiny.  In the big stages, this should
     41// be called with just MeasureTiny set and Measure == NULL
    4042int UpdateObjects (Catalog *catalog, int Ncatalog) {
    4143
     
    7274  T2000 = ohana_date_to_sec ("2000/01/01");
    7375  // XXX in the future, use catalog[0].Nsecfilt only?  allow catalogs to have variable Nsecfilt?
     76
    7477  Nsecfilt = GetPhotcodeNsecfilt ();
    75   assert (catalog[0].Nsecfilt == Nsecfilt);
     78  if (Ncatalog) {
     79    assert (catalog[0].Nsecfilt == Nsecfilt);
     80  }
    7681
    7782  NaveSum = NparSum = NpmSum = NskipSum = 0;
    7883  for (i = 0; i < Ncatalog; i++) {
    7984
    80     if (VERBOSE) fprintf (stderr, "astrometrize catalog %d : "OFF_T_FMT" ave, "OFF_T_FMT" meas\n", i,  catalog[i].Naverage,  catalog[i].Nmeasure);
     85    if (VERBOSE2) fprintf (stderr, "astrometrize catalog %d : "OFF_T_FMT" ave, "OFF_T_FMT" meas\n", i,  catalog[i].Naverage,  catalog[i].Nmeasure);
    8186
    8287    Nave = Npar = Npm = Nskip = 0;
     
    8691      XVERB = FALSE;
    8792
    88       // skip objects which are known to be problematic
    89       // XXX include this code or not?
    90 # if (0)
    91       if (catalog[i].average[j].code & STAR_BAD) {
    92         Nskip ++;
    93         continue; 
    94       }
    95 # endif
    96 
    9793      if (catalog[i].average[j].Nmeasure == 0) {
    9894          continue;
     
    10197      N = 0;
    10298      m = catalog[i].average[j].measureOffset;
    103       Tmin = Tmax = (catalog[i].measure[m].t - T2000) / (86400*365.25);
     99      MeasureTiny *measure = &catalog[i].measureT[m];
     100      Measure *measureBig = catalog[i].measure ? &catalog[i].measure[m] : NULL;
     101      // when we update the output measure values, we need to do it here
     102
    104103      mode = FIT_MODE;
    105104
    106105      // find the basic properties of the detections for this object (Tmin, Tmax, Tmean)
    107       Tmean = 0;
    108       for (k = 0; k < catalog[i].average[j].Nmeasure; k++, m++) {
    109 
    110         //does the measurement pass the supplied filtering constraints?
    111         if (!MeasFilterTest(&catalog[i].measure[m], FALSE)) {
    112           catalog[i].measure[m].dbFlags &= ~ID_MEAS_USED_OBJ;
     106      for (k = 0; k < catalog[i].average[j].Nmeasure; k++) {
     107
     108        // does the measurement pass the supplied filtering constraints?
     109        if (!MeasFilterTestTiny(&measure[k], FALSE)) {
     110          measure[k].dbFlags &= ~ID_MEAS_USED_OBJ;
     111          if (measureBig) { measureBig[k].dbFlags &= ~ID_MEAS_USED_OBJ; }
    113112          continue;
    114113        }
    115114
    116115        //outlier rejection
    117         if (FlagOutlier && (catalog[i].measure[m].dbFlags & ID_MEAS_POOR_ASTROM)) {
    118           catalog[i].measure[m].dbFlags &= ~ID_MEAS_USED_OBJ;
     116        if (FlagOutlier && (measure[k].dbFlags & ID_MEAS_POOR_ASTROM)) {
     117          measure[k].dbFlags &= ~ID_MEAS_USED_OBJ;
     118          if (measureBig) { measureBig[k].dbFlags &= ~ID_MEAS_USED_OBJ; }
    119119          continue;
    120120        }
    121121
    122         // exclude measurements by previous outlier detection
    123         // XXX include this code or not?
    124 # if (0)
    125         if (catalog[i].measure[m].dbFlags & MEAS_BAD) {
    126           catalog[i].measure[m].dbFlags |= ID_MEAS_SKIP_ASTROM;
     122        measure[k].dbFlags |= ID_MEAS_USED_OBJ;
     123        if (measureBig) { measureBig[k].dbFlags |= ID_MEAS_USED_OBJ; }
     124
     125        R[N] = getMeanR (&measure[k], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
     126        D[N] = getMeanD (&measure[k], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
     127
     128        // XXX I think this is a problem: T[] is time in years relative to J2000, but ParFactor expects
     129        // to get Time in years relative to UNIX Tzero (1970/01/01)
     130        T[N] = (measure[k].t - T2000) / (86400*365.25) ; // time relative to J2000 in years
     131
     132        // dX, dY : error in arcsec --
     133        dX[N] = GetAstromErrorTiny (&measure[k], ERROR_MODE_RA);
     134        dY[N] = GetAstromErrorTiny (&measure[k], ERROR_MODE_DEC);
     135
     136        // allow a given photcode or measurement to be
     137        // ignored if the error is NAN (for photcode, set astromErrSys to NaN)
     138        if (isnan(dX[N])) {
     139          measure[k].dbFlags &= ~ID_MEAS_USED_OBJ;
    127140          continue;
    128141        }
    129 # endif
    130 
    131         catalog[i].measure[m].dbFlags |= ID_MEAS_USED_OBJ;
    132 
    133         R[N] = getMeanR (&catalog[i].measure[m], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
    134         D[N] = getMeanD (&catalog[i].measure[m], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
    135         T[N] = (catalog[i].measure[m].t - T2000) / (86400*365.25) ; // time relative to J2000 in years
    136 
    137         Tmin = MIN(Tmin, T[N]);
    138         Tmax = MAX(Tmax, T[N]);
    139         Tmean += T[N];
    140 
    141         // dX, dY : error in arcsec --
    142         dX[N] = GetAstromError (&catalog[i].measure[m], ERROR_MODE_RA);
    143         dY[N] = GetAstromError (&catalog[i].measure[m], ERROR_MODE_DEC);
     142        if (isnan(dY[N])) {
     143          measure[k].dbFlags &= ~ID_MEAS_USED_OBJ;
     144          continue;
     145        }
    144146
    145147        // add systematic error in quadrature, if desired
    146148        // only do this after the fit has converged (or you will never improve the poor images)
    147149        // if (INCLUDE_SYS_ERR) {
    148         // float dRsys = FromShortPixels(catalog[i].measure[m].dRsys);
     150        // float dRsys = FromShortPixels(measure[k].dRsys);
    149151        // dX[N] = hypot(dX[N], dRsys);
    150152        // dY[N] = hypot(dY[N], dRsys);
     
    154156        // dY[N] = 0.1;
    155157
    156         dT[N] = catalog[i].measure[m].dt;
     158        dT[N] = measure[k].dt;
    157159
    158160        // XXX this is (slightly) inconsistent: dX,dY are the X and Y direction errors in
     
    172174      catalog[i].average[j].flags &= ~ID_STAR_FEW;
    173175
     176      // find Tmin & Tmax from the list of accepted measurements
     177      Tmean = 0;
     178      Tmin = Tmax = T[0];
     179      for (k = 0; k < N; k++) {
     180        Tmin = MIN(Tmin, T[k]);
     181        Tmax = MAX(Tmax, T[k]);
     182        Tmean += T[k];
     183      }
    174184      // XXX add the parallax factor range as a criterion as well
    175185      Trange = Tmax - Tmin;
    176186      if (Trange < PM_DT_MIN) mode = FIT_AVERAGE;
    177187      if ((mode == FIT_PM_ONLY) && (N < PM_TOOFEW)) mode = FIT_AVERAGE;
     188
     189      if (FIT_TARGET == TARGET_HIGH_SPEED) {
     190          Tmean = 0.5*(Tmax - Tmin);
     191      } else {
     192          Tmean /= (float) N;
     193      }
    178194
    179195      // too few measurements for average position (require 2 values)
     
    192208      coords.crval2 = D[0];
    193209
    194       if (FIT_TARGET == TARGET_HIGH_SPEED) {
    195           Tmean = 0.5*(Tmax - Tmin);
    196       } else {
    197           Tmean /= (float) N;
    198       }
    199      
    200210      // XVERB |= (catalog[i].averge[j].objID == 0xc90) && (catalog[i].average[j].catID == 0x2a1e);
    201211      XVERB |= (catalog[i].average[j].objID == OBJ_ID_SRC) && (catalog[i].average[j].catID == CAT_ID_SRC);
    202212      XVERB |= (catalog[i].average[j].objID == OBJ_ID_DST) && (catalog[i].average[j].catID == CAT_ID_DST);
    203       // XVERB = (catalog[i].measure[m].dM < 0.01) && (N == 6) && (mode == FIT_PM_ONLY);
    204213
    205214      // to judge the quality of the PM and PAR fits, we need to fit all three models and compare Chisq
     
    232241        // fprintf (stderr, "parallax fitting is still untested (%s, %d)\n", __FILE__, __LINE__);
    233242
     243        float pXmin = +2.0;
     244        float pXmax = -2.0;
     245        float pYmin = +2.0;
     246        float pYmax = -2.0;
    234247        for (k = 0; k < N; k++) {
    235248          ParFactor (&pX[k], &pY[k], R[k], D[k], T[k], Tmean);
    236         }
    237         FitPMandPar (&fitPAR, X, dX, Y, dY, T, pX, pY, N, XVERB);
    238         XY_to_RD (&fitPAR.Ro, &fitPAR.Do, fitPAR.Ro, fitPAR.Do, &coords);
    239         catalog[i].average[j].flags |= ID_STAR_FIT_PAR;
    240         Npar ++;
     249          pXmin = MIN (pXmin, pX[k]);
     250          pXmax = MAX (pXmax, pX[k]);
     251          pYmin = MIN (pYmin, pY[k]);
     252          pYmax = MAX (pYmax, pY[k]);
     253        }
     254        float dXRange = pXmax - pXmin;
     255        float dYRange = pYmax - pYmin;
     256        float parRange = hypot (dXRange, dYRange);
     257       
     258        if (parRange >= PAR_FACTOR_MIN) {
     259          FitPMandPar (&fitPAR, X, dX, Y, dY, T, pX, pY, N, XVERB);
     260          XY_to_RD (&fitPAR.Ro, &fitPAR.Do, fitPAR.Ro, fitPAR.Do, &coords);
     261          catalog[i].average[j].flags |= ID_STAR_FIT_PAR;
     262          Npar ++;
     263        }
    241264      }   
    242265
     
    307330
    308331      // the measure fields must be updated before the average fields
    309       m = catalog[i].average[j].measureOffset;
    310       for (k = 0; k < catalog[i].average[j].Nmeasure; k++, m++) {
    311         setMeanR (fit.Ro, &catalog[i].measure[m], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
    312         setMeanD (fit.Do, &catalog[i].measure[m], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
     332      for (k = 0; k < catalog[i].average[j].Nmeasure; k++) {
     333        setMeanR (fit.Ro, &measure[k], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
     334        setMeanD (fit.Do, &measure[k], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
     335        if (measureBig) {
     336          setMeanR_Big (fit.Ro, &measureBig[k], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
     337          setMeanD_Big (fit.Do, &measureBig[k], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
     338        }
    313339      }     
    314340
Note: See TracChangeset for help on using the changeset viewer.