59 void dump(vector<SatPass>& SatPassList, ostream& os,
bool rev,
bool dbug)
65 map<unsigned int, unsigned int> indexMap;
66 map<unsigned int, unsigned int>::const_iterator kt;
67 vector<string> obstypes;
74 os <<
"SPL Dump SatPass list "
75 <<
printTime(ttag,
" from " + SatPass::longfmt);
77 os <<
printTime(ttag,
" to " + SatPass::longfmt) <<
" timeRevers is "
78 << (rev ?
"T" :
"F") <<
" and debug is " << (dbug ?
"T" :
"F")
83 while (SPit.
next(indexMap))
87 ttag = SatPassList[indexMap.begin()->first].time(
88 indexMap.begin()->second);
91 obstypes = SatPassList[indexMap.begin()->first].getObsTypes();
97 oss <<
"SPL " <<
printTime(ttag, SatPass::longfmt);
100 for (kt = indexMap.begin(); kt != indexMap.end(); kt++)
105 os << oss.str() <<
" " << SatPassList[ii].status() <<
" "
106 <<
RinexSatID(SatPassList[ii].getSat()) <<
" "
107 << SatPassList[ii].getFlag(jj);
108 os << fixed << setprecision(3);
110 for (
size_t i = 0; i < obstypes.size(); i++)
112 os <<
" " << obstypes[i] <<
" " << setw(13)
113 << SatPassList[ii].data(jj, obstypes[i]) <<
" "
114 << SatPassList[ii].LLI(jj, obstypes[i]) <<
" "
115 << SatPassList[ii].SSI(jj, obstypes[i]);
121 os <<
"SPL End Dump of SatPass list" << endl;
142 map<unsigned int, unsigned int> indexMap;
143 map<unsigned int, unsigned int>::iterator kt;
148 while (SPit.
next(indexMap))
151 kt = indexMap.begin();
152 ttag = SPList[kt->first].time(kt->second);
155 for (kt = indexMap.begin(); kt != indexMap.end(); ++kt)
159 SatID sat = SPList[ii].getSat();
160 vector<string> ots = SPList[ii].getObsTypes();
162 for (i = 0; i < ots.size(); i++)
164 if (SPList[ii].hasType(ots[i]))
166 data = SPList[ii].data(jj, ots[i]);
167 msh.
add(ttag, sat, ots[i],
data);
198 map<unsigned int, unsigned int> indexMap;
199 map<unsigned int, unsigned int>::iterator kt;
202 while (SPit.
next(indexMap))
205 kt = indexMap.begin();
206 ttag = SPList[kt->first].time(kt->second);
211 for (kt = indexMap.begin(); kt != indexMap.end(); ++kt)
215 SatID sat = SPList[ii].getSat();
216 vector<string> ots = SPList[ii].getObsTypes();
218 for (i = 0; i < ots.size(); i++)
220 if (SPList[ii].hasType(ots[i]))
222 data = SPList[ii].data(jj, ots[i]);
225 msh.
fix(ttagdum, sat, ots[i],
data);
226 SPList[ii].data(jj, ots[i]) =
data;
229 deltfix = (ttagdum - ttag);
234 if (n > 0 && deltfix != 0.0)
236 SPList[ii].timeoffset(jj) += deltfix;
252 vector<string>& obstypes,
double dtin,
253 vector<SatPass>& SPList, vector<RinexSatID> exSats,
258 if (filenames.size() == 0)
264 if (filenames.size() > 1)
269 int i, j, nfiles(0), nepochs(0);
272 vector<double>
data(obstypes.size(), 0.0);
273 vector<unsigned short>
ssi(obstypes.size(), 0);
274 vector<unsigned short>
lli(obstypes.size(), 0);
275 map<RinexSatID, int> indexForSat;
276 map<RinexSatID, int>::const_iterator satit;
280 string(
"%F %10.3g = %04Y/%02m/%02d %02H:%02M:%02S"));
283 const double dttol(0.01);
287 const double esttol(0.01);
288 int estn[estN] = {-1, -1, -1, -1, -1, -1, -1, -1, -1};
289 double dt, estdt[estN];
292 bool onOrder(
false), onShort(
false);
293 vector<int> nOrder, nShort;
294 vector<Epoch> timeOrder, timeShort;
297 std::sort(SPList.begin(), SPList.end());
301 for (i = 0; i < SPList.size(); i++)
302 indexForSat[SPList[i].getSat()] = i;
305 for (
int nfile = 0; nfile < filenames.size(); nfile++)
307 string filename = filenames[nfile];
311 if (filename.empty() || !RinFile)
317 RinFile.exceptions(fstream::failbit);
341 if (obstypes.size() == 0)
343 for (j = 0; j <
header.obsTypeList.size(); j++)
346 RinexObsHeader::convertObsType(
header.obsTypeList[j]));
348 data = vector<double>(obstypes.size(), 0.0);
349 ssi = vector<unsigned short>(obstypes.size(), 0);
350 lli = vector<unsigned short>(obstypes.size(), 0);
364 <<
"Reading RINEX obs threw exception " << e.
what();
368 if (RinFile.eof() || !RinFile.good())
373 RinexObsData::RinexSatMap::const_iterator it;
374 RinexObsData::RinexObsTypeMap::const_iterator jt;
377 if (obsdata.
time < beginTime)
381 if (obsdata.
time > endTime)
402 dt = obsdata.
time - prevtime;
406 if (::fabs(::fmod(dt, dtin)) > dttol)
414 timeShort.push_back(prevtime);
417 nShort[nShort.size() - 1]++;
423 string(
"Invalid time step: expected ") +
424 asString<double>(dtin) +
425 string(
" seconds but found ") +
426 asString<double>(dt) +
string(
" at time ") +
431 for (j = 0; j < estN; j++)
439 if (::fabs(dt - estdt[j]) < esttol)
446 int jj, kk(0), nleast(estn[0]);
447 for (jj = 1; jj < estN; jj++)
449 if (estn[jj] <= nleast)
467 timeOrder.push_back(prevtime);
470 nOrder[nOrder.size() - 1]++;
476 string(
"Invalid time step: expected ") +
477 asString<double>(dtin) +
478 string(
" seconds but found ") +
479 asString<double>(dt) +
string(
" at time ") +
484 onOrder = onShort =
false;
485 prevtime = obsdata.
time;
488 for (it = obsdata.
obs.begin(); it != obsdata.
obs.end(); ++it)
504 for (j = 0; j < obstypes.size(); j++)
506 if ((jt = it->second.find(RinexObsHeader::convertObsType(
507 obstypes[j]))) == it->second.end())
516 data[j] = jt->second.data;
517 lli[j] = jt->second.lli;
518 ssi[j] = jt->second.ssi;
529 satit = indexForSat.find(sat);
532 if (satit == indexForSat.end())
534 SatPass newSP(sat, dtin, obstypes);
535 SPList.push_back(newSP);
536 indexForSat[sat] = SPList.size() - 1;
537 satit = indexForSat.find(sat);
543 i = SPList[satit->second].addData(obsdata.
time, obstypes,
547 SatPass newSP(sat, dtin, obstypes);
548 SPList.push_back(newSP);
549 indexForSat[sat] = SPList.size() - 1;
550 satit = indexForSat.find(sat);
559 "Timetags out of order in RINEX file " + filename +
561 (lenient ?
" - Error, this should not happen!"
575 if (timeShort.size() > 50 && timeShort.size() > nepochs / 2)
577 for (i = 0; i < timeOrder.size(); i++)
578 LOG(
WARNING) <<
"Warning - " << setw(4) << nOrder[i]
579 <<
" data records following epoch "
581 <<
" are out of time order";
582 LOG(
ERROR) <<
"ERROR - too many 'short timestep' warnings - "
583 <<
"decimate the data file first.";
585 Exception(
"Too many short timesteps - decimate instead"));
595 for (j = 0, i = 1; i < estN; i++)
596 if (estn[i] > estn[j])
604 if (::fabs(dt - dtin) > esttol)
607 ") does not match computed (" +
611 string msg = oss.str();
618 if (timeShort.size() > 0)
620 for (i = 0; i < timeShort.size(); i++)
621 LOG(
WARNING) <<
"Warning - " << setw(4) << nShort[i]
622 <<
" data records following epoch "
624 <<
" have short (<" << dtin <<
"sec) timestep";
626 if (timeOrder.size() > 0)
628 for (i = 0; i < timeOrder.size(); i++)
629 LOG(
WARNING) <<
"Warning - " << setw(4) << nOrder[i]
630 <<
" data records following epoch "
632 <<
" are out of time order";
646 vector<SatPass>& SPList)
650 if (filename.empty())
655 int i, j, ii, jj, ngood;
657 vector<string> obstypes, ots;
658 map<unsigned int, unsigned int> indexMap;
659 map<unsigned int, unsigned int>::const_iterator kt;
670 rstrm.exceptions(fstream::failbit);
673 for (i = 0; i < SPList.size(); i++)
675 ots = SPList[i].getObsTypes();
676 for (j = 0; j < ots.size(); j++)
680 obstypes.push_back(ots[j]);
686 bool change(obstypes.size() !=
header.obsTypeList.size());
689 for (i = 0; i < obstypes.size(); i++)
692 RinexObsHeader::convertObsType(
header.obsTypeList[i]))
703 header.obsTypeList.clear();
704 for (i = 0; i < obstypes.size(); i++)
706 header.obsTypeList.push_back(
707 RinexObsHeader::convertObsType(obstypes[i]));
711 header.numObsForSat.clear();
712 header.valid ^= RinexObsHeader::prnObsValid;
722 header.valid |= RinexObsHeader::firstTimeValid;
723 header.valid |= RinexObsHeader::lastTimeValid;
724 header.valid |= RinexObsHeader::intervalValid;
728 while (spit.
next(indexMap))
734 kt = indexMap.begin();
735 robs.
time = SPList[kt->first].time(kt->second);
737 for (kt = indexMap.begin(); kt != indexMap.end(); ++kt)
741 if (SPList[ii].status() == -1)
745 SatID sat = SPList[ii].getSat();
747 for (ngood = 0, j = 0; j <
header.obsTypeList.size(); j++)
751 if (SPList[ii].getFlag(jj) != SatPass::BAD &&
752 SPList[ii].hasType(obstypes[j]))
754 rd.
data = SPList[ii].data(jj, obstypes[j]);
759 rotm.insert(map<RinexObsType, RinexDatum>::value_type(
760 header.obsTypeList[j], rd));
765 map<SatID, RinexObsData::RinexObsTypeMap>::value_type(
796 const map<
char, vector<string>>& sysobs,
797 vector<SatPass>& SPList)
801 if (filename.empty())
806 int i, j, ii, jj, ngood;
807 vector<string> obstypes;
808 map<unsigned int, unsigned int> indexMap;
809 map<unsigned int, unsigned int>::const_iterator kt;
814 if (!rstrm.is_open())
819 rstrm.exceptions(fstream::failbit);
829 for (i = 0; i < SPList.size(); i++)
831 vector<string> ots(SPList[i].getObsTypes());
832 for (j = 0; j < ots.size(); j++)
836 obstypes.push_back(ots[j]);
842 header.R2ObsTypes.clear();
845 for (i = 0; i < obstypes.size(); i++)
847 header.R2ObsTypes.push_back(obstypes[i]);
853 header.mapObsTypes.clear();
854 map<char, vector<string>>::const_iterator it;
855 for (it = sysobs.begin(); it != sysobs.end(); ++it)
857 vector<RinexObsID> v;
858 string sysstr(
string(1, it->first));
859 header.mapObsTypes[sysstr] = v;
860 for (j = 0; j < it->second.size(); j++)
863 header.mapObsTypes[sysstr].push_back(roid);
874 header.valid |= Rinex3ObsHeader::validFirstTime;
875 header.valid |= Rinex3ObsHeader::validLastTime;
876 header.valid |= Rinex3ObsHeader::validInterval;
880 while (spit.
next(indexMap))
887 kt = indexMap.begin();
888 robs.
time = SPList[kt->first].time(kt->second);
890 for (kt = indexMap.begin(); kt != indexMap.end(); ++kt)
894 if (SPList[ii].status() == -1)
904 obstypes = SPList[ii].getObstypes();
907 vector<RinexDatum> vRD;
908 for (ngood = 0, j = 0; j < obstypes.size(); j++)
912 if (SPList[ii].getFlag(jj) != SatPass::BAD &&
913 SPList[ii].hasType(obstypes[j]))
915 rd.
data = SPList[ii].data(jj, obstypes[j]);
928 map<
RinexSatID, vector<RinexDatum>>::value_type(sat, vRD));