Changeset 33652 for trunk/Ohana/src/relastro/src/UpdateObjects.c
- Timestamp:
- Apr 1, 2012, 3:00:19 PM (14 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/relastro/src/UpdateObjects.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/relastro/src/UpdateObjects.c
r32695 r33652 38 38 } 39 39 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 40 42 int UpdateObjects (Catalog *catalog, int Ncatalog) { 41 43 … … 72 74 T2000 = ohana_date_to_sec ("2000/01/01"); 73 75 // XXX in the future, use catalog[0].Nsecfilt only? allow catalogs to have variable Nsecfilt? 76 74 77 Nsecfilt = GetPhotcodeNsecfilt (); 75 assert (catalog[0].Nsecfilt == Nsecfilt); 78 if (Ncatalog) { 79 assert (catalog[0].Nsecfilt == Nsecfilt); 80 } 76 81 77 82 NaveSum = NparSum = NpmSum = NskipSum = 0; 78 83 for (i = 0; i < Ncatalog; i++) { 79 84 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); 81 86 82 87 Nave = Npar = Npm = Nskip = 0; … … 86 91 XVERB = FALSE; 87 92 88 // skip objects which are known to be problematic89 // XXX include this code or not?90 # if (0)91 if (catalog[i].average[j].code & STAR_BAD) {92 Nskip ++;93 continue;94 }95 # endif96 97 93 if (catalog[i].average[j].Nmeasure == 0) { 98 94 continue; … … 101 97 N = 0; 102 98 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 104 103 mode = FIT_MODE; 105 104 106 105 // 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; } 113 112 continue; 114 113 } 115 114 116 115 //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; } 119 119 continue; 120 120 } 121 121 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; 127 140 continue; 128 141 } 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 } 144 146 145 147 // add systematic error in quadrature, if desired 146 148 // only do this after the fit has converged (or you will never improve the poor images) 147 149 // if (INCLUDE_SYS_ERR) { 148 // float dRsys = FromShortPixels( catalog[i].measure[m].dRsys);150 // float dRsys = FromShortPixels(measure[k].dRsys); 149 151 // dX[N] = hypot(dX[N], dRsys); 150 152 // dY[N] = hypot(dY[N], dRsys); … … 154 156 // dY[N] = 0.1; 155 157 156 dT[N] = catalog[i].measure[m].dt;158 dT[N] = measure[k].dt; 157 159 158 160 // XXX this is (slightly) inconsistent: dX,dY are the X and Y direction errors in … … 172 174 catalog[i].average[j].flags &= ~ID_STAR_FEW; 173 175 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 } 174 184 // XXX add the parallax factor range as a criterion as well 175 185 Trange = Tmax - Tmin; 176 186 if (Trange < PM_DT_MIN) mode = FIT_AVERAGE; 177 187 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 } 178 194 179 195 // too few measurements for average position (require 2 values) … … 192 208 coords.crval2 = D[0]; 193 209 194 if (FIT_TARGET == TARGET_HIGH_SPEED) {195 Tmean = 0.5*(Tmax - Tmin);196 } else {197 Tmean /= (float) N;198 }199 200 210 // XVERB |= (catalog[i].averge[j].objID == 0xc90) && (catalog[i].average[j].catID == 0x2a1e); 201 211 XVERB |= (catalog[i].average[j].objID == OBJ_ID_SRC) && (catalog[i].average[j].catID == CAT_ID_SRC); 202 212 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);204 213 205 214 // to judge the quality of the PM and PAR fits, we need to fit all three models and compare Chisq … … 232 241 // fprintf (stderr, "parallax fitting is still untested (%s, %d)\n", __FILE__, __LINE__); 233 242 243 float pXmin = +2.0; 244 float pXmax = -2.0; 245 float pYmin = +2.0; 246 float pYmax = -2.0; 234 247 for (k = 0; k < N; k++) { 235 248 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 } 241 264 } 242 265 … … 307 330 308 331 // 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 } 313 339 } 314 340
Note:
See TracChangeset
for help on using the changeset viewer.
