Rinex3Obs_FromScratch_T.cpp
Go to the documentation of this file.
1 //==============================================================================
2 //
3 // This file is part of GNSSTk, the ARL:UT GNSS Toolkit.
4 //
5 // The GNSSTk is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation; either version 3.0 of the License, or
8 // any later version.
9 //
10 // The GNSSTk is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with GNSSTk; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 //
19 // This software was developed by Applied Research Laboratories at the
20 // University of Texas at Austin.
21 // Copyright 2004-2022, The Board of Regents of The University of Texas System
22 //
23 //==============================================================================
24 
25 //==============================================================================
26 //
27 // This software was developed by Applied Research Laboratories at the
28 // University of Texas at Austin, under contract to an agency or agencies
29 // within the U.S. Department of Defense. The U.S. Government retains all
30 // rights to use, duplicate, distribute, disclose, or release this software.
31 //
32 // Pursuant to DoD Directive 523024
33 //
34 // DISTRIBUTION STATEMENT A: This software has been approved for public
35 // release, distribution is unlimited.
36 //
37 //==============================================================================
38 
39 #include "Rinex3ObsStream.hpp"
40 #include "Rinex3ObsHeader.hpp"
41 #include "Rinex3ObsData.hpp"
42 #include "TestUtil.hpp"
43 #include <iostream>
44 #include <string>
45 #include "SystemTime.hpp"
46 
47 using namespace gnsstk;
48 using namespace std;
49 
50 string tempFilePath = gnsstk::getPathTestTemp();
51 string dataFilePath = gnsstk::getPathData();
52 string file_sep = getFileSep();
53 
55 
56 public:
57  /* Create two Rinex Obs files - versions 3.02, 2.11
58  * @param satString entered into header.mapObsTypes to test throw for bad satString
59  * @param testID a string to identify the relevant files
60  * @param includeConflict include two RinexObsIDs that convert to the same R2 Obs Type
61  * @param completeR include glonass freqNo and codPhsBias */
62  void Rinex3ObsFromScratch(string satString, string testID = "", bool completeR = false) {
63 
66 
67  header.fileProgram = "rinex3Test";
68  if(satString == "M")
69  header.fileSysSat.system = SatelliteSystem::Mixed;
70  else if(satString == "R")
71  header.fileSysSat.system = SatelliteSystem::Glonass;
72  else
73  header.fileSysSat.system = SatelliteSystem::GPS;
74  std::ostringstream ostr;
75  ostr << gnsstk::CivilTime(SystemTime());
76  header.date = ostr.str();
77  header.fileAgency = "From_Scratch_T_" + testID;
79  header.markerName = "NCCM1";
81  header.observer = "Monitor Station";
82  header.agency = "NGA";
84  header.recNo = "1";
85  header.recType = "ITT MSN SAASM";
86  header.recVers = "3.2.13";
88  header.antNo = "1";
89  header.antType = "Topcon CR-G5";
91  Triple ntPosition(-18000.27, -4991850.12, 3957008.50);
92  header.antennaPosition = ntPosition;
94  Triple ntDelta(0, 0, 0);
95  header.antennaDeltaHEN = ntDelta;
97  header.firstObs = CivilTime(2016, 10, 2, 11, 15, 30.0, TimeSystem::GPS);
99  header.markerNumber = "85401";
101  header.interval = 30;
103  header.validEoH = true;
104 
105 
107  if(completeR || satString == "M") {
108  header.glonassFreqNo = Rinex3ObsHeader::GLOFreqNumMap();
110  header.glonassCodPhsBias = Rinex3ObsHeader::GLOCodPhsBias();
112  }
113 
114  data = Rinex3ObsData();
115  data.epochFlag = 0;
116  data.numSVs = 2;
117  data.clockOffset = 0;
118  data.time = header.firstObs.convertToCommonTime();
119 
120  std::vector<RinexObsID> newObsIds = setupObsIDs();
121 
122 
123  RinexDatum datumL1_1;
124  datumL1_1.data = 1;
125  datumL1_1.lli = 0;
126  datumL1_1.ssi = 0;
127  RinexDatum datumL1_2;
128  datumL1_2.data = 2;
129  datumL1_2.lli = 0;
130  datumL1_2.ssi = 0;
131 
132 
133  RinexDatum datumP1_1;
134  datumP1_1.data = 3;
135  datumP1_1.lli = 0;
136  datumP1_1.ssi = 0;
137  RinexDatum datumP1_2;
138  datumP1_2.data = 4;
139  datumP1_2.lli = 0;
140  datumP1_2.ssi = 0;
141 
142 
143  RinexDatum datumC1_1;
144  datumC1_1.data = 5;
145  datumC1_1.lli = 0;
146  datumC1_1.ssi = 0;
147  RinexDatum datumC1_2;
148  datumC1_2.data = 6;
149  datumC1_2.lli = 0;
150  datumC1_2.ssi = 0;
151 
152 
153  RinexDatum datumL2_1;
154  datumL2_1.data = 7;
155  datumL2_1.lli = 0;
156  datumL2_1.ssi = 0;
157  RinexDatum datumL2_2;
158  datumL2_2.data = 8;
159  datumL2_2.lli = 0;
160  datumL2_2.ssi = 0;
161 
162  RinexDatum datumP2_1;
163  datumP2_1.data = 9;
164  datumP2_1.lli = 0;
165  datumP2_1.ssi = 0;
166  RinexDatum datumP2_2;
167  datumP2_2.data = 10;
168  datumP2_2.lli = 0;
169  datumP2_2.ssi = 0;
170 
171  if(satString == "M")
172  {
173  header.mapObsTypes.insert(std::pair<std::string, std::vector<RinexObsID> >("R", newObsIds));
174  header.mapObsTypes.insert(std::pair<std::string, std::vector<RinexObsID> >("G", newObsIds));
175  }
176  else
177  header.mapObsTypes.insert(std::pair<std::string, std::vector<RinexObsID> >(satString, newObsIds));
180 
181  std::vector<RinexDatum> datumVec1(5);
182  std::vector<RinexDatum> datumVec2(5);
183  datumVec1[0] = datumL1_1;
184  datumVec2[0] = datumL1_2;
185  datumVec1[1] = datumP1_1;
186  datumVec2[1] = datumP1_2;
187  datumVec1[2] = datumC1_1;
188  datumVec2[2] = datumC1_2;
189  datumVec1[3] = datumL2_1;
190  datumVec2[3] = datumL2_2;
191  datumVec1[4] = datumP2_1;
192  datumVec2[4] = datumP2_2;
193  RinexSatID S3 = (satString == "G") ? RinexSatID("03") : RinexSatID("R03");
194  RinexSatID S6 = (satString == "G" || satString == "M") ? RinexSatID("06") : RinexSatID("R06");
195  data.obs.insert(std::pair<RinexSatID, std::vector<RinexDatum> >(S3, datumVec1));
196  data.obs.insert(std::pair<RinexSatID, std::vector<RinexDatum> >(S6, datumVec2));
197 
198  header.version = 3.02;
200  Rinex3ObsStream strm(
201  tempFilePath + file_sep + "rinex3ObsTest_v302_" + testID + ".out",
202  std::ios::out | std::ios::trunc);
203 
204  strm.exceptions(ifstream::failbit);
205  strm << header;
206  strm << data;
207 
208  header.prepareVer2Write();
209  Rinex3ObsStream strm2(
210  tempFilePath + file_sep + "rinex3ObsTest_v211_" + testID + ".out",
211  std::ios::out | std::ios::trunc);
212  strm2.exceptions(ifstream::failbit);
213  strm2 << header;
214  strm2 << data;
215  }
216 
217  std::vector<RinexObsID> setupObsIDs(){
218  std::vector<RinexObsID> newObsIds;
219 
220  RinexObsID obsID1; //L1
221  obsID1.band = CarrierBand::L1;
222  obsID1.code = TrackingCode::P;
223  obsID1.type = ObservationType::Phase;
224  newObsIds.push_back(obsID1);
225 
226  RinexObsID obsID2; //P1
227  obsID2.band = CarrierBand::L1;
228  obsID2.code = TrackingCode::P;
229  obsID2.type = ObservationType::Range;
230  newObsIds.push_back(obsID2);
231 
232  RinexObsID obsID3; //C1
233  obsID3.band = CarrierBand::L1;
234  obsID3.code = TrackingCode::CA;
235  obsID3.type = ObservationType::Range;
236  newObsIds.push_back(obsID3);
237 
238  RinexObsID obsID4; //L2
239  obsID4.band = CarrierBand::L2;
240  obsID4.code = TrackingCode::P;
241  obsID4.type = ObservationType::Phase;
242  newObsIds.push_back(obsID4);
243 
244  RinexObsID obsID5;
245  obsID5.band = CarrierBand::L2;
246  obsID5.code = TrackingCode::P;
247  obsID5.type = ObservationType::Range;
248  newObsIds.push_back(obsID5);
249 
250  return newObsIds;
251  }
252 
253  bool compareOutExp(string testID)
254  {
255  TestUtil tester;
256  return
257  (
258  tester.fileEqualTest( dataFilePath + file_sep + "rinex3ObsTest_v302_" + testID + ".exp",
259  tempFilePath + file_sep + "rinex3ObsTest_v302_" + testID + ".out", 2)
260  &&
261  tester.fileEqualTest( dataFilePath + file_sep + "rinex3ObsTest_v211_" + testID + ".exp",
262  tempFilePath + file_sep + "rinex3ObsTest_v211_" + testID + ".out", 2)
263  );
264  }
265 
266  int runFromScratch(void){
267  TUDEF("Rinex3Obs", "Rinex3ObsFromScratch");
268  string testID;
269  //Try to create varios Rinex Obs (2.11 and 3.02) files
270  try
271  {
272  //create a valid Rinex Obs file
273  testID = "ValidTest";
274  Rinex3ObsFromScratch("G",testID);
275  TUASSERT( compareOutExp(testID) );
276  }
277  catch(...)
278  {
279  TUFAIL( "valid input threw exception");
280  }
281  try
282  {
283  cerr << "starting mixed test" << endl;
284  //create a valid Rinex Obs file
285  testID = "MixedTest";
286  Rinex3ObsFromScratch("M",testID);
287  TUASSERT( compareOutExp(testID) );
288  cerr << "mixed test complete" << endl;
289  }
290  catch(...)
291  {
292  TUFAIL( "valid input threw exception");
293  }
294  try
295  {
296  //create a glonass Rinex file
297  testID = "IncompleteR";
298  Rinex3ObsFromScratch("R", testID);
299  TUFAIL("Glonass file should need GlonassSlotFreqNo and GlonassCodPhsBias");
300  }
301  catch(...)
302  {
303  TUPASS( "Glonass file failed for lacking necessary fields");
304  }
305  try
306  {
307  //create a glonass Rinex file. Fill glonass-required fields
308  testID = "CompleteR";
309  Rinex3ObsFromScratch("R",testID, true);
310  TUASSERT( compareOutExp(testID) );
311  }
312  catch(...)
313  {
314  TUFAIL( "Glonass file failed despite having all necessary fields");
315  }
316  try
317  {
318  //create a Rinex file with the invalid satString "GPS"
319  testID = "BadSys";
320  Rinex3ObsFromScratch("GPS", testID);
321  TUFAIL( "no exception for invalid sys char string");
322  }
323  catch(...)
324  {
325  TUPASS("exception thrown for invalid input");
326  }
327  TURETURN();
328  }
329 };
330 
331 int main()
332 {
333  int errorTotal = 0;
334  Rinex3Obs_FromScratch_T testClass;
335 
336  errorTotal += testClass.runFromScratch();
337 
338  cout << "Total Failures for " << __FILE__ << ": " << errorTotal << endl;
339 
340  return( errorTotal );
341 }
Rinex3Obs_FromScratch_T::compareOutExp
bool compareOutExp(string testID)
Definition: Rinex3Obs_FromScratch_T.cpp:253
gnsstk::Rinex3ObsHeader::validSystemNumObs
@ validSystemNumObs
SYS / # / OBS TYPES.
Definition: Rinex3ObsHeader.hpp:268
gnsstk::Rinex3ObsHeader::validAntennaDeltaHEN
@ validAntennaDeltaHEN
ANTENNA: DELTA H/E/N.
Definition: Rinex3ObsHeader.hpp:260
example3.header
header
Definition: example3.py:22
gnsstk::RinexDatum
Storage for single RINEX OBS data measurements.
Definition: RinexDatum.hpp:55
gnsstk::Rinex3ObsHeader::validRunBy
@ validRunBy
PGM / RUN BY / DATE.
Definition: Rinex3ObsHeader.hpp:251
dataFilePath
string dataFilePath
Definition: Rinex3Obs_FromScratch_T.cpp:51
gnsstk::ObservationType::Phase
@ Phase
accumulated phase, in cycles
gnsstk::Rinex3ObsHeader
Definition: Rinex3ObsHeader.hpp:155
TUFAIL
#define TUFAIL(MSG)
Definition: TestUtil.hpp:228
gnsstk::Rinex3ObsHeader::validReceiver
@ validReceiver
REC # / TYPE / VERS.
Definition: Rinex3ObsHeader.hpp:257
gnsstk::Rinex3ObsHeader::validGlonassSlotFreqNo
@ validGlonassSlotFreqNo
GLONASS SLOT / FRQ #.
Definition: Rinex3ObsHeader.hpp:279
main
int main()
Definition: Rinex3Obs_FromScratch_T.cpp:331
gnsstk::ObsID::band
CarrierBand band
Definition: ObsID.hpp:200
gnsstk::Rinex3ObsHeader::validAntennaPosition
@ validAntennaPosition
APPROX POSITION XYZ.
Definition: Rinex3ObsHeader.hpp:259
gnsstk::Rinex3ObsHeader::validGlonassCodPhsBias
@ validGlonassCodPhsBias
GLONASS COD/PHS/BIS.
Definition: Rinex3ObsHeader.hpp:280
gnsstk::RinexDatum::data
double data
The actual data point.
Definition: RinexDatum.hpp:76
gnsstk::Rinex3ObsHeader::GLOFreqNumMap
std::map< RinexSatID, int > GLOFreqNumMap
Map GLONASS SV ID to frequency number.
Definition: Rinex3ObsHeader.hpp:354
Rinex3Obs_FromScratch_T::Rinex3ObsFromScratch
void Rinex3ObsFromScratch(string satString, string testID="", bool completeR=false)
Definition: Rinex3Obs_FromScratch_T.cpp:62
gnsstk::Rinex3ObsHeader::validAntennaType
@ validAntennaType
ANT # / TYPE.
Definition: Rinex3ObsHeader.hpp:258
gnsstk::Triple
Definition: Triple.hpp:68
gnsstk::ObservationType::Range
@ Range
pseudorange, in meters
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
gnsstk::Rinex3ObsHeader::validNumObs
@ validNumObs
Definition: Rinex3ObsHeader.hpp:267
gnsstk::CarrierBand::L2
@ L2
GPS L2, QZSS L2.
gnsstk::SatelliteSystem::GPS
@ GPS
gnsstk::TrackingCode::CA
@ CA
Legacy GPS civil code.
gnsstk::RinexDatum::lli
short lli
See the RINEX Spec. for an explanation.
Definition: RinexDatum.hpp:78
gnsstk::RinexDatum::ssi
short ssi
See the RINEX Spec. for an explanation.
Definition: RinexDatum.hpp:80
TUASSERT
#define TUASSERT(EXPR)
Definition: TestUtil.hpp:63
Rinex3Obs_FromScratch_T
Definition: Rinex3Obs_FromScratch_T.cpp:54
TestUtil.hpp
example6.newObsIds
list newObsIds
Definition: example6.py:48
TURETURN
#define TURETURN()
Definition: TestUtil.hpp:232
gnsstk::Rinex3ObsHeader::validFirstTime
@ validFirstTime
TIME OF FIRST OBS.
Definition: Rinex3ObsHeader.hpp:272
TUPASS
#define TUPASS(MSG)
Definition: TestUtil.hpp:230
SystemTime.hpp
gnsstk::Rinex3ObsHeader::validVersion
@ validVersion
RINEX VERSION / TYPE.
Definition: Rinex3ObsHeader.hpp:249
gnsstk::SystemTime
Definition: SystemTime.hpp:54
gnsstk::Rinex3ObsHeader::validInterval
@ validInterval
INTERVAL.
Definition: Rinex3ObsHeader.hpp:271
gnsstk::Rinex3ObsData
Definition: Rinex3ObsData.hpp:75
Rinex3ObsHeader.hpp
gnsstk::ObsID::code
TrackingCode code
Definition: ObsID.hpp:201
gnsstk::CarrierBand::L1
@ L1
GPS L1, Galileo E1, SBAS L1, QZSS L1, BeiDou L1.
Rinex3Obs_FromScratch_T::setupObsIDs
std::vector< RinexObsID > setupObsIDs()
Definition: Rinex3Obs_FromScratch_T.cpp:217
gnsstk::RinexObsID
Definition: RinexObsID.hpp:102
file_sep
string file_sep
Definition: Rinex3Obs_FromScratch_T.cpp:52
Rinex3ObsData.hpp
TUDEF
#define TUDEF(CLASS, METHOD)
Definition: TestUtil.hpp:56
gnsstk::TrackingCode::P
@ P
Legacy GPS precise code.
gnsstk::Rinex3ObsHeader::validObserver
@ validObserver
OBSERVER / AGENCY.
Definition: Rinex3ObsHeader.hpp:256
gnsstk::Rinex3ObsHeader::validSystemPhaseShift
@ validSystemPhaseShift
SYS / PHASE SHIFT.
Definition: Rinex3ObsHeader.hpp:278
gnsstk::Rinex3ObsStream
Definition: Rinex3ObsStream.hpp:65
example3.data
data
Definition: example3.py:22
gnsstk::CivilTime
Definition: CivilTime.hpp:55
Rinex3ObsStream.hpp
gnsstk::Rinex3ObsHeader::validMarkerNumber
@ validMarkerNumber
MARKER NUMBER.
Definition: Rinex3ObsHeader.hpp:254
gnsstk::Rinex3ObsHeader::GLOCodPhsBias
std::map< RinexObsID, double > GLOCodPhsBias
Map GLONASS SV observable to code phase bias.
Definition: Rinex3ObsHeader.hpp:356
gnsstk::ObsID::type
ObservationType type
Definition: ObsID.hpp:199
gnsstk::RinexSatID
Definition: RinexSatID.hpp:63
gnsstk::TimeSystem::GPS
@ GPS
GPS system time.
std
Definition: Angle.hpp:142
gnsstk::SatelliteSystem::Mixed
@ Mixed
Rinex3Obs_FromScratch_T::runFromScratch
int runFromScratch(void)
Definition: Rinex3Obs_FromScratch_T.cpp:266
gnsstk::TestUtil::fileEqualTest
bool fileEqualTest(const std::string &refFile, const std::string &checkFile, int numLinesSkip=0, bool ignoreLeadingSpaces=false, bool ignoreTrailingSpaces=false, std::vector< std::string > ignoreRegex=std::vector< std::string >(0))
Definition: TestUtil.hpp:815
gnsstk::SatelliteSystem::Glonass
@ Glonass
gnsstk::Rinex3ObsHeader::validMarkerName
@ validMarkerName
MARKER NAME.
Definition: Rinex3ObsHeader.hpp:253
gnsstk::TestUtil
Definition: TestUtil.hpp:265
tempFilePath
string tempFilePath
Definition: Rinex3Obs_FromScratch_T.cpp:50


gnsstk
Author(s):
autogenerated on Wed Oct 25 2023 02:40:41