68 const double Rinex3ObsFileLoader::dttol(0.001);
75 int Rinex3ObsFileLoader::loadFiles(
string& errmsg,
string& msg)
86 const double currVer(Rinex3ObsBase::currentVersion);
94 vector<string>::const_iterator vit;
95 map<RinexSatID, vector<int>>::iterator soit;
96 ostringstream oss, ossx;
100 prevtime.setTimeSystem(TimeSystem::Any);
106 for (
unsigned int nf = 0;
nf < filenames.size();
nf++)
109 string filename(filenames[
nf]);
115 if (filename.empty())
117 oss <<
"Error - file name " <<
nf + 1 <<
" is blank";
124 vector<CommonTime> timeOrder;
136 oss <<
"Error - could not open file " << filename << endl;
139 strm.exceptions(fstream::failbit);
154 map<string, vector<RinexObsID>>::const_iterator kt;
155 for (kt = roh.mapObsTypes.begin();
156 kt != roh.mapObsTypes.end(); kt++)
158 for (i = 0; i < kt->second.size(); i++)
161 string sys = kt->first;
164 string srot = sys + rot;
165 string code = rot.substr(2, 1);
172 for (j = 0; j < inputWantedObsTypes.size(); j++)
180 string wsrot(inputWantedObsTypes[j]);
182 string wsys(wsrot.substr(0, 1));
183 if (wsys !=
"*" && wsys != sys)
188 string wcode(wsrot.substr(3, 1));
189 if (wcode !=
"*" && wcode != code)
194 if (wsrot.substr(1, 2) !=
201 wantedObsTypes.push_back(srot);
203 countWantedObsTypes.push_back(0);
205 ossx <<
" Add obs type " << srot <<
" =~ "
206 << inputWantedObsTypes[j] <<
" from "
213 if (SatObsCountMap.size() > 0)
215 vector<int> v(SatObsCountMap.begin()->second);
216 j = wantedObsTypes.size();
219 soit = SatObsCountMap.begin();
220 for (; soit != SatObsCountMap.end(); ++soit)
221 soit->second.resize(j, 0);
225 headers.push_back(roh);
229 oss <<
"Error - failed to read header for file " << filename
230 <<
" with exception " << e.
getText(0) << endl;
247 oss <<
"Error - failed to read data in file " << filename
248 <<
" with exception " << e.
getText(0) << endl;
253 if (strm.eof() || !strm.good())
271 if (::fabs(sow - dtdec *
long(0.5 + sow / dtdec)) > 0.5)
281 dt = rod.
time - prevtime;
294 timeOrder.push_back(prevtime);
297 nOrder[nOrder.size() - 1]++;
312 if (rod.
time < startTime)
316 if (rod.
time > stopTime)
320 if (rod.
time < begDataTime)
322 begDataTime = rod.
time;
324 if (rod.
time > endDataTime)
326 endDataTime = rod.
time;
331 if (nepochsToRead > -1 && nepochs >= nepochsToRead)
345 Rinex3ObsData::DataMap::const_iterator it;
346 for (it = rod.
obs.begin(); it != rod.
obs.end(); ++it)
355 if (exSats.size() > 0 && find(exSats.begin(), exSats.end(),
356 sat) != exSats.end())
363 string sys(sat.
toString().substr(0, 1));
367 const vector<RinexObsID> types(roh.
mapObsTypes[sys]);
370 for (i = 0; i < it->second.size(); i++)
374 if (it->second[i].data == 0.0)
381 string srot = sys + types[i].asString(
397 soit = SatObsCountMap.find(sat);
398 if (soit == SatObsCountMap.end())
400 vector<int> v(wantedObsTypes.size(),
402 SatObsCountMap[sat] = v;
404 SatObsCountMap[sat][nint]++;
405 countWantedObsTypes[nint]++;
411 if (outrod.
obs.find(sat) == outrod.
obs.end())
413 vector<RinexDatum> v(wantedObsTypes.size());
417 outrod.
obs[sat][nint] = it->second[i];
423 if (saveData && outrod.
obs.size() > 0)
425 datastore.push_back(outrod);
431 rawdt = mcv.bestDT();
433 (dtdec > 0.0 ? (dtdec > rawdt ? dtdec : rawdt) : rawdt);
443 if (timeOrder.size() > 0)
445 for (i = 0; i < timeOrder.size(); i++)
446 oss <<
"Warning - in file " << filename <<
" " << nOrder[i]
447 <<
" data records following epoch "
449 <<
" are out of time order" << endl;
452 if (nepochsToRead > -1 && nepochs >= nepochsToRead)
461 errmsg += string(
"\n");
484 Exception E(
"std except: " +
string(e.what()));
498 static const string longfmt(
"%04Y/%02m/%02d %02H:%02M:%02S %4F %10.3g");
500 oss <<
"Summary of input RINEX obs data files (" << filenames.size()
502 for (i = 0; i < filenames.size(); i++)
503 oss << (i == 0 ?
" RINEX obs file: " :
" ")
504 << filenames[i] << endl;
505 oss <<
" Interval " << fixed << setprecision(2) << getDT()
507 for (i = 0; i < wantedObsTypes.size(); i++)
508 oss <<
" " << wantedObsTypes[i];
509 oss <<
", store size " << datastore.size();
511 oss <<
" Time limits: begin " <<
printTime(begDataTime, longfmt) <<
"\n"
512 <<
" end " <<
printTime(endDataTime, longfmt) <<
"\n";
514 dumpSatObsTable(oss);
516 oss <<
"End of summary";
535 int Rinex3ObsFileLoader::WriteSatPassList(
536 const map<
char, vector<string>>& sysSPOT,
537 const map<
char, vector<int>>& indexLoadOT, vector<SatPass>& SPList)
545 if (datastore.size() == 0)
555 map<GSatID, unsigned int> indexForSat;
557 map<GSatID, unsigned int>::const_iterator satit;
559 map<char, vector<string>>::const_iterator obsit;
562 if (SPList.size() > 0)
565 std::sort(SPList.begin(), SPList.end());
568 for (i = 0; i < SPList.size(); i++)
569 indexForSat[SPList[i].getSat()] = i;
574 obsit = sysSPOT.begin();
576 const int nobs(obsit->second.size());
577 vector<double>
data(nobs, 0.0);
578 vector<unsigned short>
ssi(nobs, 0),
lli(nobs, 0);
581 for (
unsigned int nds = 0; nds < datastore.size(); nds++)
590 Rinex3ObsData::DataMap::const_iterator it;
591 map<char, vector<int>>::const_iterator jt;
592 for (it = datastore[nds].obs.begin();
593 it != datastore[nds].obs.end(); ++it)
595 sys = it->first.systemChar();
596 jt = indexLoadOT.find(sys);
597 if (jt == indexLoadOT.end())
604 obsit = sysSPOT.find(sys);
605 if (obsit == sysSPOT.end())
612 for (i = 0; i < jt->second.size(); i++)
614 int ind = jt->second[i];
624 data[i] = it->second[ind].data;
625 ssi[i] = it->second[ind].ssi;
626 lli[i] = it->second[ind].lli;
629 if (::fabs(
data[i]) < 1.e-8)
644 satit = indexForSat.find(sat);
645 if (satit == indexForSat.end())
647 SatPass newSP(sat, nominalDT, obsit->second);
648 SPList.push_back(newSP);
650 indexForSat[sat] = SPList.size() - 1;
651 satit = indexForSat.find(sat);
657 i = SPList[satit->second].addData(
662 SatPass newSP(sat, nominalDT, obsit->second);
663 SPList.push_back(newSP);
665 indexForSat[sat] = SPList.size() - 1;
666 satit = indexForSat.find(sat);
687 void Rinex3ObsFileLoader::dumpSatObsTable(ostream& s)
const
692 s <<
"Table of Sat/Obs counts\n ";
693 for (i = 0; i < wantedObsTypes.size(); i++)
694 s <<
" " << setw(5) << wantedObsTypes[i];
698 map<RinexSatID, vector<int>>::const_iterator soit;
699 for (soit = SatObsCountMap.begin(); soit != SatObsCountMap.end(); ++soit)
701 s <<
" " << soit->first;
702 for (i = 0; i < soit->second.size(); i++)
703 s <<
" " << setw(5) << soit->second[i];
708 for (i = 0; i < countWantedObsTypes.size(); i++)
709 s <<
" " << setw(5) << countWantedObsTypes[i];
710 s <<
" total " << nepochs <<
" epochs" << endl;
716 void Rinex3ObsFileLoader::dumpStoreEpoch(ostream& s,
719 s <<
"Dump of Rinex3ObsData"
722 << fixed << setprecision(9) <<
" clk offset = " << rod.
clockOffset
727 Rinex3ObsData::DataMap::const_iterator jt;
728 for (jt = rod.
obs.begin(); jt != rod.
obs.end(); jt++)
730 s <<
" " << jt->first.toString() <<
":" << fixed << setprecision(3);
731 for (
unsigned int j = 0; j < jt->second.size(); j++)
733 s <<
" " << setw(13) << jt->second[j].data <<
"/"
734 << jt->second[j].lli <<
"/" << jt->second[j].ssi <<
"/"
735 << wantedObsTypes[j];
742 s <<
"aux. header info:" << endl;
750 void Rinex3ObsFileLoader::dumpStoreData(ostream& s)
const
752 s <<
"\nDump the ROFL data(" << datastore.size() <<
"):" << endl;
753 for (
unsigned int i = 0; i < datastore.size(); i++)
756 dumpStoreEpoch(s, rod);
769 typedef map<string, map<string, map<string, map<char, string>>>> tableMap;
770 typedef map<string, map<string, map<char, string>>> obsMap;
771 typedef map<string, map<char, string>> codeMap;
773 vector<string> goodtags;
774 string syss(RinexObsID::validRinexSystems);
778 for (
size_t s = 0; s < syss.size(); s++)
788 string tag(
string(1, syss[s]) +
789 string(1, RinexObsID::ot2char[i]) +
790 string(1, RinexObsID::cb2char[j]) +
791 string(1, RinexObsID::tc2char[k]));
792 RinexObsID obs(tag, Rinex3ObsBase::currentVersion);
794 if (name.find(
"Unknown") != string::npos ||
795 name.find(
"undefined") != string::npos ||
796 name.find(
"Any") != string::npos ||
802 if (find(goodtags.begin(), goodtags.end(), tag) ==
805 goodtags.push_back(tag);
807 RinexSatID(
string(1, tag[0])).systemString3());
808 char type(RinexObsID::ot2char[i]);
811 RinexObsID(tag, Rinex3ObsBase::currentVersion)));
812 vector<string> fld(
split(desc,
' '));
813 string codedesc(fld[1].substr(syss[s] ==
'S' ? 4 : 3));
815 table[sys][band][codedesc][type] = id;
818 catch (InvalidParameter& )
827 tableMap::iterator it;
829 codeMap::iterator kt;
831 size_t len2(4), len3(5), len4(6);
832 for (it = table.begin(); it != table.end(); ++it)
834 for (jt = it->second.begin(); jt != it->second.end(); ++jt)
836 for (kt = jt->second.begin(); kt != jt->second.end(); ++kt)
838 if (jt->first.length() > len2)
840 len2 = jt->first.length();
842 if (kt->first.length() > len3)
844 len3 = kt->first.length();
850 string fres(RinexObsID::validRinexFrequencies);
851 os <<
"\nAll valid RINEX3 systems : " << syss << endl;
852 os <<
"All valid RINEX3 frequencies : " << fres << endl;
853 os <<
"All valid RINEX observation codes:" << endl;
856 <<
"Pseudo- Carrier Dopp Signal" << endl;
858 <<
" range phase Strength" << endl;
862 for (
size_t i = 0; i < syss.size(); ++i)
866 it = table.find(
RinexSatID(
string(1, syss[i])).systemString3());
868 if (it == table.end())
877 for (jt = it->second.begin(); jt != it->second.end(); ++jt)
879 for (kt = jt->second.begin(); kt != jt->second.end(); ++kt)
881 os <<
" " << it->first
883 <<
" " <<
center(kt->first, len3)
885 <<
center((kt->second[
'C'] ==
"" ?
"----" : kt->second[
'C']),
888 <<
center((kt->second[
'L'] ==
"" ?
"----" : kt->second[
'L']),
891 <<
center((kt->second[
'D'] ==
"" ?
"----" : kt->second[
'D']),
894 <<
center((kt->second[
'S'] ==
"" ?
"----" : kt->second[
'S']),
897 if (fr != kt->second[
'L'][2])
899 fr = kt->second[
'L'][2];
900 string tc(RinexObsID::validRinexTrackingCodes[syss[i]][fr]);
903 os <<
" all codes for " << it->first <<
" " << jt->first
904 <<
" = '" << tc <<
"'";