59 const double msecHandler::Rfact = 0.001 *
C_MPS;
63 msecHandler::msecHandler()
67 obstypes.push_back(
string(
"L1"));
69 obstypes.push_back(
string(
"L2"));
71 obstypes.push_back(
string(
"C1"));
72 wavelengths.push_back(0.0);
73 obstypes.push_back(
string(
"C2"));
74 wavelengths.push_back(0.0);
75 obstypes.push_back(
string(
"P1"));
76 wavelengths.push_back(0.0);
77 obstypes.push_back(
string(
"P2"));
78 wavelengths.push_back(0.0);
84 void msecHandler::reset()
88 curr = vector<map<SatID, double>>(N);
89 past = vector<map<SatID, double>>(N);
90 ave = vector<double>(N, 0.0);
91 npt = vector<int>(N, 0);
94 findMsg = fixMsg = string();
108 void msecHandler::setObstypes(
const vector<string> &ots,
109 const vector<double> &waves)
111 if (ots.size() != waves.size())
141 if (ttag != currttag)
147 vector<string>::const_iterator it;
148 it = find(obstypes.begin(), obstypes.end(), obstype);
149 if (it == obstypes.end())
153 int i = (it - obstypes.begin());
158 if (past[i].find(sat) != past[i].end()
159 && curr[i][sat] != 0.0
160 && past[i][sat] != 0.0)
162 ave[i] += curr[i][sat] - past[i][sat];
170 int msecHandler::afterAddbeforeFix()
175 if (times.size() == 0)
177 fixMsg = string(
"No valid adjusts found - nothing to do");
180 if (times.size() == 1 && rmvClk)
184 string(
"Warning - cannot remove gross clock with only 1 ms adjust");
188 if (find(ots[0].begin(), ots[0].end(),
string(
"C1")) != ots[0].end() ||
189 find(ots[0].begin(), ots[0].end(),
string(
"C2")) != ots[0].end() ||
190 find(ots[0].begin(), ots[0].end(),
string(
"P1")) != ots[0].end() ||
191 find(ots[0].begin(), ots[0].end(),
string(
"P2")) != ots[0].end())
194 fixMsg += string(
"Adjusts applied to pseudorange, ") +
195 string(
"so apply fix to the timetags.");
199 fixMsg += string(
"Do not apply adjusts to timtags.");
221 slope = double(nms[1]) / (times[1] - times[0]);
222 intercept = double(nms[0]) - slope * (times[0] - ttag);
226 if (ims < times.size() && ::fabs(ttag - times[ims]) < 1.e-3)
229 fixMsg += string(
"\nFixed ") + adjMsgs[ims];
231 if (rmvClk && ims < times.size())
233 tref = times[ims - 1];
234 slope = double(nms[ims]) / (times[ims] - tref);
235 intercept = double(ntot);
245 double wl = wavelengths[index];
248 if (ims > 0 && ntot != 0)
253 ttag -= ntot * 0.001;
257 if (find(ots[ims - 1].begin(), ots[ims - 1].end(), obstype) !=
262 data -= ntot * (wl == 0.0 ? Rfact : Rfact / wl);
272 double dtot = (intercept + slope * (ttag - tref)) * Rfact;
273 ttag += dtot /
C_MPS;
287 string msecHandler::getFindMessage(
bool verbose)
292 findMsg += string(
"Searched for millisecond adjusts on obs types:");
293 for (i = 0; i < obstypes.size(); i++)
295 findMsg += string(
" ") + obstypes[i];
297 findMsg += string(
"\n");
299 findMsg += string(
"Millisecond adjusts: ") +
301 string(
" total adjusts found, ") +
304 for (map<string, int>::iterator tit = typesMap.begin();
305 tit != typesMap.end(); ++tit)
308 string(
" adjusts for ") + tit->first;
311 if (typesMap.size() > 1)
314 string(
"\n Warning - detected millisecond adjusts are not ") +
315 string(
"consistently applied to the observables.");
318 if (adjMsgs.size() > 0 && badMsgs.size() > adjMsgs.size() / 2)
321 string(
"\n Warning - millisecond adjust detection seems to be ") +
322 string(
"of poor quality - consider rerunning with option --noMS");
327 for (i = 0; i < adjMsgs.size(); i++)
329 findMsg += string(
"\n") + adjMsgs[i];
331 for (i = 0; i < badMsgs.size(); i++)
333 findMsg += string(
"\n") + badMsgs[i];
342 map<CommonTime, int> msecHandler::getAdjusts()
344 map<CommonTime, int> adjusts;
345 for (
unsigned int i = 0; i < times.size(); i++)
347 adjusts.insert(map<CommonTime, int>::value_type(times[i], nms[i]));
361 const static double mstol(0.2);
366 for (i = 0; i < N; i++)
368 if (wavelengths[i] != 0.0)
370 ave[i] *= wavelengths[i];
376 ave[i] *= 1000.0 / (npt[i] *
C_MPS);
385 double del = dt - (currttag - prevttag);
386 del = ::fmod(del, dt);
390 vector<int> iave(N + 1);
391 for (i = 0; i < N; i++)
393 iave[i] = int(ave[i] + (ave[i] >= 0.0 ? 0.5 : -0.5));
395 iave[N] = (del + (del > 0.0 ? 0.5 : -0.5));
398 bool adj(
false), consist(
true), adjPh(
false), adjPR(
false);
400 for (i = 0; i < N; i++)
405 if (wavelengths[i] != 0.0)
418 else if (nadj != iave[i])
431 bool foundPhase(
false);
432 for (i = 0; i < N; i++)
434 if (wavelengths[i] == 0.0)
440 vector<double> deltas;
441 map<SatID, double>::const_iterator it;
444 for (it = curr[i].begin(); it != curr[i].end(); ++it)
446 if (past[i].find(it->first) != past[i].end())
449 del = (curr[i][it->first] - past[i][it->first]) /
450 (Rfact / wavelengths[i]);
451 deltas.push_back(del);
456 med = median<double>(deltas);
459 for (j = 0; j < deltas.size(); j++)
461 deltas[j] = ::fabs(deltas[j] - med);
465 mad = median<double>(deltas);
472 iave[i] = int(ave[i] + (ave[i] >= 0.0 ? 0.5 : -0.5));
488 for (i = 0; i < N; i++)
497 else if (nadj != iave[i])
510 string conmsg(consist ?
"" :
" adjust sizes are inconsistent");
515 double frac(::fabs(ave[0] - iave[0]));
517 if (frac > mstol || npt[0] < 3)
519 conmsg = string(
" not well determined");
527 for (i = 0; i < N; i++)
529 if (wavelengths[i] == 0.0)
545 if (iave[i] != iave[in])
548 conmsg += string(
" " + obstypes[in] +
"!=" + obstypes[i]);
553 for (i = 0; i < N; i++)
555 if (wavelengths[i] != 0.0)
571 if (iave[i] != iave[in])
574 conmsg += string(
" " + obstypes[in] +
"!=" + obstypes[i]);
577 if (consist && onphase && !oncode)
579 conmsg += string(
" (Phase-only)");
581 if (consist && !onphase && oncode)
583 conmsg += string(
" (PR-only)");
587 conmsg += string(
" invalid");
593 vector<string> no, ot;
602 oss << (iave[N] == 0 ?
"!" :
"") <<
"TT";
603 for (i = 0; i < N; i++)
609 no.push_back(obstypes[i]);
613 ot.push_back(obstypes[i]);
615 oss <<
" " << (iave[i] == 0 ?
"!" :
"") << obstypes[i];
630 "%04Y/%02m/%02d %02H:%02M:%06.3f = %4F %14.7g")
631 <<
" dt=" << int(del + 0.5) <<
" " << nadj <<
" ms " << types;
638 times.push_back(currttag);
644 if (typesMap.find(types) == typesMap.end())
646 typesMap.insert(map<string, int>::value_type(types, 0));
650 adjMsgs.push_back(oss.str());
653 for (i = 0; i < N; i++)
661 if (obstypes[i].length() > 2)
663 oss << obstypes[i][0] <<
"," << obstypes[i].substr(1);
667 oss <<
"G" << obstypes[i];
670 oss <<
"," << fixed << setprecision(5)
671 << -double(nadj) * (wavelengths[i] == 0.0
673 : Rfact / wavelengths[i])
674 <<
" # edit cmd for " << nadj <<
" millisecond adjust";
676 editCmds.push_back(oss.str());
681 badMsgs.push_back(oss.str());
689 for (i = 0; i < N; i++)
695 ave = vector<double>(N, 0.0);
696 npt = vector<int>(N, 0);