IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 27548


Ignore:
Timestamp:
Mar 31, 2010, 7:03:35 PM (16 years ago)
Author:
eugene
Message:

calculate all subsets of fits

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/relastro.20100326/src/UpdateObjects.c

    r27535 r27548  
    4444  StatType statsR, statsD;
    4545  Coords coords;
    46   PMFit fit;
     46  PMFit fitAve, fitPM, fitPar;
    4747  time_t To;
    4848  off_t Nave, Npm, Npar, Nskip;
     
    6464
    6565  // use J2000 as a reference time
    66   To = ohana_date_to_sec ("2000/01/01");
     66  T2000 = ohana_date_to_sec ("2000/01/01");
    6767
    6868  // XXX in the future, use catalog[0].Nsecfilt only?  allow catalogs to have variable Nsecfilt?
     
    9191      m = catalog[i].average[j].measureOffset;
    9292
    93       Tmin = Tmax = (catalog[i].measure[m].t - To) / (86400*365.25);
     93      Tmin = Tmax = (catalog[i].measure[m].t - T2000) / (86400*365.25);
    9494      mode = FIT_MODE;
    9595
     96      // find the basic properties of the detections for this object (Tmin, Tmax, Tmean)
     97      Tmean = 0;
    9698      for (k = 0; k < catalog[i].average[j].Nmeasure; k++, m++) {
    9799
     
    125127        Tmin = MIN(Tmin, T[N]);
    126128        Tmax = MAX(Tmax, T[N]);
     129        Tmean += T[N];
    127130
    128131        dR[N] = GetAstromError (&catalog[i].measure[m], ERROR_MODE_RA);
     
    153156      coords.crval1 = R[0];
    154157      coords.crval2 = D[0];
     158      Tmean /= (float) N;
    155159     
    156       /* project all of the R,D coordinates to a plane centered on this coordinate */
     160      /* project all of the R,D coordinates to a plane centered on this coordinate
     161         set the times to be relative to Tmean */
    157162      for (k = 0; k < N; k++) {
    158163        RD_to_XY (&X[k], &Y[k], R[k], D[k], &coords);
    159164        dX[k] =  dR[k];
    160165        dY[k] =  dD[k];
     166        T[k] -= Tmean;
    161167        // fprintf (stderr, "%d %f %f %f  %f %f\n", k, T[k], R[k], D[k], X[k], Y[k]);
    162168      }   
    163169
    164       /* fit the model components as needed */
    165       switch (mode) {
    166         case FIT_AVERAGE:
     170      // to judge the quality of the PM and PAR fits, we need to fit all three models and compare Chisq
     171
     172      // fit the average model
     173      if ((mode == FIT_AVERAGE) || (mode == FIT_PM_ONLY) || (mode == FIT_PM_AND_PAR)) {
    167174          liststats (R, dR, N, &statsR);
    168175          liststats (D, dD, N, &statsD);
    169176
    170           fit.Ro = statsR.mean;
    171           fit.dRo = 3600.0*statsR.sigma;
    172 
    173           fit.Do = statsD.mean;
    174           fit.dDo = 3600.0*statsD.sigma;
    175 
    176           fit.chisq = 0.5*(statsR.chisq + statsD.chisq);
    177           fit.Nfit = N;
    178 
    179           fit.uR = fit.duR = 0.0;
    180           fit.uD = fit.duD = 0.0;
    181           fit.p  = fit.dp  = 0.0;
    182 
     177          fitAve.Ro = statsR.mean;
     178          fitAve.dRo = 3600.0*statsR.sigma;
     179
     180          fitAve.Do = statsD.mean;
     181          fitAve.dDo = 3600.0*statsD.sigma;
     182
     183          fitAve.chisq = 0.5*(statsR.chisq + statsD.chisq);
     184          fitAve.Nfit = N;
     185
     186          fitAve.uR = fitAve.duR = 0.0;
     187          fitAve.uD = fitAve.duD = 0.0;
     188          fitAve.p  = fitAve.dp  = 0.0;
     189          catalog[i].average[j].flags |= ID_STAR_MEAS_AVE;
    183190          Nave ++;
    184           break;
    185 
    186         case FIT_PM_ONLY:
    187           FitPM (&fit, X, dX, Y, dY, T, N);
    188           // fprintf (stderr, "fitted:  %f - %f : %f %f : %f %f : %f\n", Tmin, Tmax, fit.Ro, fit.Do, fit.uR, fit.uD, fit.p);
     191      }
     192
     193      if ((mode == FIT_PM_ONLY) || (mode == FIT_PM_AND_PAR)) {
     194          FitPM (&fitPM, X, dX, Y, dY, T, N);
     195          // fprintf (stderr, "fitted:  %f - %f : %f %f : %f %f : %f\n", Tmin, Tmax, fitPM.Ro, fitPM.Do, fitPM.uR, fitPM.uD, fitPM.p);
    189196          // project Ro, Do back to RA,DEC
    190           XY_to_RD (&fit.Ro, &fit.Do, fit.Ro, fit.Do, &coords);
    191           // fprintf (stderr, "project: %f %f : %f %f : %f\n", fit.Ro, fit.Do, fit.uR, fit.uD, fit.p);
     197          XY_to_RD (&fitPM.Ro, &fitPM.Do, fitPM.Ro, fitPM.Do, &coords);
     198          // fprintf (stderr, "project: %f %f : %f %f : %f\n", fitPM.Ro, fitPM.Do, fitPM.uR, fitPM.uD, fitPM.p);
    192199          // continue;
    193200
    194           fit.p  = fit.dp  = 0.0;
    195 
     201          fitPM.p  = fitPM.dp  = 0.0;
     202          catalog[i].average[j].flags |= ID_STAR_MEAS_PAR;
    196203          Npm ++;
    197           break;
    198 
    199         case FIT_PAR_ONLY:
     204      }
     205
     206      if (mode == FIT_PAR_ONLY) {
     207          fprintf (stderr, "programming error at %s, %d", __FILE__, __LINE__);
     208          exit (2);
     209      }
     210
     211# if (0)
     212      if (mode == FIT_PM_AND_PAR) {
    200213          fprintf (stderr, "programming error at %s, %d", __FILE__, __LINE__);
    201214          exit (2);
     
    204217            ParFactor (&pX[k], &pY[k], R[k], D[k], T[k]);
    205218          }
    206           FitPar (&fit, X, dX, Y, dY, pX, pY, N);
    207 
    208           // project Ro, Do back to RA,DEC
    209           XY_to_RD (&fit.Ro, &fit.Do, fit.Ro, fit.Do, &coords);
    210 
    211           fit.uR = fit.duR = 0.0;
    212           fit.uD = fit.duD = 0.0;
    213 
     219          FitPMandPar (&fitPAR, X, dX, Y, dY, T, pX, pY, N);
     220          XY_to_RD (&fitPAR.Ro, &fitPAR.Do, fitPAR.Ro, fitPAR.Do, &coords);
     221          catalog[i].average[j].flags |= ID_STAR_MEAS_PAR;
    214222          Npar ++;
    215           break;
    216 
    217         case FIT_PM_AND_PAR:
    218           fprintf (stderr, "programming error at %s, %d", __FILE__, __LINE__);
    219           exit (2);
    220 
    221           for (k = 0; k < N; k++) {
    222             ParFactor (&pX[k], &pY[k], R[k], D[k], T[k]);
    223           }
    224           FitPMandPar (&fit, X, dX, Y, dY, T, pX, pY, N);
    225           XY_to_RD (&fit.Ro, &fit.Do, fit.Ro, fit.Do, &coords);
    226           Npar ++;
    227           break;
    228 
    229         default:
    230           fprintf (stderr, "programming error at %s, %d", __FILE__, __LINE__);
    231           exit (2);
    232223      }   
     224# endif
    233225
    234226      if (0 && (j < 100)) {
     
    257249      }
    258250
     251      /* choose the result based on the chisq values */
     252
     253      switch (result) {
     254        case FIT_AVERAGE:
     255          catalog[i].average[j].flags |= ID_STAR_USE_AVE;
     256          fit = fitAve;
     257          break;
     258        case FIT_PM_ONLY:
     259          catalog[i].average[j].flags |= ID_STAR_USE_PM;
     260          fit = fitPM;
     261          break;
     262        case FIT_PM_AND_PAR:
     263          catalog[i].average[j].flags |= ID_STAR_USE_PAR;
     264          fit = fitPAR;
     265          break;
     266      }
     267
    259268      // the measure fields must be updated before the average fields
    260269      m = catalog[i].average[j].measureOffset;
    261270      for (k = 0; k < catalog[i].average[j].Nmeasure; k++, m++) {
    262         // XXX why was this here?? if (catalog[i].measure[m].dbFlags & MEAS_BAD) continue;
    263271        setMeanR (fit.Ro, &catalog[i].measure[m], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
    264272        setMeanD (fit.Do, &catalog[i].measure[m], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);
     
    278286      catalog[i].average[j].dP  = fit.dp; // parallax error in arcsec
    279287
    280       catalog[i].average[j].Xp  = (fit.Nfit > 1) ? 100.0*log10(fit.chisq) : NAN_S_SHORT;
     288      // Xp is supposed to be the position scatter, not the chisq : fix this:
     289      // catalog[i].average[j].Xp  = (fit.Nfit > 1) ? 100.0*log10(fit.chisq) : NAN_S_SHORT;
     290      catalog[i].average[j].chiSqAve  = fitAve.ChiSq;
     291      catalog[i].average[j].chiSqPM  = fitPM.ChiSq;
     292      catalog[i].average[j].chiSqPar  = fitPar.ChiSq;
     293      catalog[i].average[j].Tmean = Tmean;
    281294    }
    282295
Note: See TracChangeset for help on using the changeset viewer.