RinexMetHeader.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 
44 #include <algorithm> // for find
45 #include <set>
46 
47 #include "StringUtils.hpp"
48 #include "SystemTime.hpp"
49 #include "CivilTime.hpp"
50 #include "RinexMetHeader.hpp"
51 #include "RinexMetStream.hpp"
52 
53 using namespace gnsstk::StringUtils;
54 using namespace std;
55 
56 
57 namespace gnsstk
58 {
59  const int RinexMetHeader::maxObsPerLine = 9;
60 
61  const string RinexMetHeader::stringVersion = "RINEX VERSION / TYPE";
62  const string RinexMetHeader::stringRunBy = "PGM / RUN BY / DATE";
63  const string RinexMetHeader::stringComment = "COMMENT";
64  const string RinexMetHeader::stringMarkerName = "MARKER NAME";
65  const string RinexMetHeader::stringMarkerNumber = "MARKER NUMBER";
66  const string RinexMetHeader::stringObsType = "# / TYPES OF OBSERV";
67  const string RinexMetHeader::stringSensorType = "SENSOR MOD/TYPE/ACC";
68  const string RinexMetHeader::stringSensorPos = "SENSOR POS XYZ/H";
69  const string RinexMetHeader::stringEoH = "END OF HEADER";
70 
71  std::string RinexMetHeader::bitString(unsigned long vb, char quote,
72  std::string sep)
73  {
74  unsigned long b = 1;
75  std::string rv;
76  while (b)
77  {
78  if (vb & b)
79  {
80  if (rv.length())
81  rv += sep;
82  if (quote)
83  rv += quote + bitsAsString((validBits)b) + quote;
84  else
85  rv += bitsAsString((validBits)b);
86  }
87  b <<= 1;
88  }
89  return rv;
90  }
91 
93  {
94  RinexMetStream& strm = dynamic_cast<RinexMetStream&>(ffs);
95 
96  // Since they want to output this header, let's store it
97  // internally for use by the data.
98  strm.header = (*this);
99 
100  unsigned long allValid;
101  if (version == 2.0 ) allValid = allValid20;
102  else if (version == 2.1 ) allValid = allValid21;
103  else if (version == 2.11) allValid = allValid211;
104  else if (version >= 3.0 ) allValid = allValid211;
105  else
106  {
107  FFStreamError err("Unknown RINEX version: " + asString(version,2));
108  err.addText("Make sure to set the version correctly.");
109  GNSSTK_THROW(err);
110  }
111 
112  if ((valid & allValid) != allValid)
113  {
114  string errstr("Incomplete or invalid header: missing: ");
115  errstr += bitString(allValid & ~valid);
116  FFStreamError err(errstr);
117  err.addText("Make sure you set all header valid bits for all of the available data.");
118  GNSSTK_THROW(err);
119  }
120 
121  string line;
122 
123  if (valid & validVersion)
124  {
125  line = rightJustify(asString(version,2), 9);
126  line += string(11, ' ');
127  line += leftJustify(fileType, 40);
128  line += stringVersion;
129  strm << line << endl;
130  strm.lineNumber++;
131  }
132  if (valid & validRunBy)
133  {
134  line = leftJustify(fileProgram,20);
135  line += leftJustify(fileAgency,20);
136  SystemTime sysTime;
137  string curDate;
138  if(version < 3)
139  {
140  curDate = (static_cast<CivilTime>(sysTime)).printf("%02m/%02d/%04Y %02H:%02M:%02S");
141  }
142  else
143  {
144  curDate = (static_cast<CivilTime>(sysTime)).printf("%04Y%02m%02d %02H%02M%02S %P");
145  }
146  line += leftJustify(curDate, 20);
147  line += stringRunBy;
148  strm << line << endl;
149  strm.lineNumber++;
150  }
151  if (valid & validComment)
152  {
153  vector<string>::const_iterator itr = commentList.begin();
154  while (itr != commentList.end())
155  {
156  line = leftJustify((*itr), 60);
157  line += stringComment;
158  strm << line << endl;
159  strm.lineNumber++;
160  itr++;
161  }
162  }
163  if (valid & validMarkerName)
164  {
165  line = leftJustify(markerName, 60);
166  line += stringMarkerName;
167  strm << line << endl;
168  strm.lineNumber++;
169  }
170  if (valid & validMarkerNumber)
171  {
172  line = leftJustify(markerNumber, 60);
173  line += stringMarkerNumber;
174  strm << line << endl;
175  strm.lineNumber++;
176  }
177  if (valid & validObsType)
178  {
179  line = rightJustify(asString(obsTypeList.size()),6);
180  vector<RinexMetType>::const_iterator itr = obsTypeList.begin();
181  size_t numWritten = 0;
182  while (itr != obsTypeList.end())
183  {
184  numWritten++;
185  // continuation lines
186  if ((numWritten % (maxObsPerLine+1)) == 0)
187  {
188  line += stringObsType;
189  strm << line << endl;
190  strm.lineNumber++;
191  line = string(6,' ');
192  }
193  line += rightJustify(convertObsType(*itr), 6);
194  itr++;
195  }
196  // pad the line out to 60 chrs and add label
197  line += string(60 - line.size(), ' ');
198  line += stringObsType;
199  strm << line << endl;
200  strm.lineNumber++;
201  }
202  if (valid & validSensorType)
203  {
204  // Write out only the sensor types that are in the obsTypeList.
205  vector<sensorType>::const_iterator itr = sensorTypeList.begin();
206  while (itr != sensorTypeList.end())
207  {
208  if (std::find(obsTypeList.begin(), obsTypeList.end(),
209  (*itr).obsType) != obsTypeList.end())
210  {
211  line = leftJustify((*itr).model, 20);
212  line += leftJustify((*itr).type, 20);
213  line += string(6, ' ');
214  line += rightJustify(asString((*itr).accuracy,1),7);
215  line += string(4, ' ');
216  line += convertObsType((*itr).obsType);
217  line += string(1, ' ');
218  line += stringSensorType;
219  strm << line << endl;
220  strm.lineNumber++;
221  }
222  itr++;
223  }
224  }
225  if (valid & validSensorPos)
226  {
227  // Write out only the sensor positions that are in the obsTypeList.
228  vector<sensorPosType>::const_iterator itr = sensorPosList.begin();
229  while (itr != sensorPosList.end())
230  {
231  if (std::find(obsTypeList.begin(), obsTypeList.end(),
232  (*itr).obsType) != obsTypeList.end())
233  {
234  line = rightJustify(asString((*itr).position[0],4),14);
235  line += rightJustify(asString((*itr).position[1],4),14);
236  line += rightJustify(asString((*itr).position[2],4),14);
237  line += rightJustify(asString((*itr).height,4),14);
238  line += string(1, ' ');
239  line += convertObsType((*itr).obsType);
240  line += string(1, ' ');
241  line += stringSensorPos;
242  strm << line << endl;
243  strm.lineNumber++;
244  }
245  itr++;
246  }
247  }
248  if (valid & validEoH)
249  {
250  line = string(60, ' ');
251  line += stringEoH;
252  strm << line << endl;
253  strm.lineNumber++;
254  }
255  }
256 
258  {
259  RinexMetStream& strm = dynamic_cast<RinexMetStream&>(ffs);
260 
261  // if already read, just return
262  if (strm.headerRead == true)
263  return;
264 
265  valid = 0;
266 
267  // Clear out structures in case the last read was a partial header.
268  commentList.clear();
269  obsTypeList.clear();
270  sensorTypeList.clear();
271  sensorPosList.clear();
272 
273  int numObs = 0;
274 
275  while (!(valid & validEoH))
276  {
277  string line;
278  strm.formattedGetLine(line);
279 
280  if (line.length()<60 || line.length()>81)
281  {
282  FFStreamError e("Bad line length");
283  GNSSTK_THROW(e);
284  }
285 
286  string thisLabel = strip(line.substr(60,20));
287 
288  if (thisLabel == stringVersion)
289  {
290  std::string verstr(strip(line.substr(0,20)));
291  if ((verstr != "2.0") && (verstr != "2.1") && (verstr != "2.00") &&
292  (verstr != "2.10") && (verstr != "2.11") && (verstr != "3.0") &&
293  (verstr != "3.01") && (verstr!= "3.02"))
294  {
295  FFStreamError e("Unknown or unsupported RINEX version " +
296  asString(version));
297  GNSSTK_THROW(e);
298  }
299  version = asDouble(verstr);
300  fileType = strip(line.substr(20,20));
301  if ( (fileType[0] != 'M') && (fileType[0] != 'm'))
302  {
303  FFStreamError e("This isn't a Rinex Met file");
304  GNSSTK_THROW(e);
305  }
306  valid |= validVersion;
307  }
308  else if (thisLabel == stringRunBy)
309  {
310  fileProgram = strip(line.substr(0,20));
311  fileAgency = strip(line.substr(20,20));
312  date = strip(line.substr(40,20));
313  valid |= validRunBy;
314  }
315  else if (thisLabel == stringComment)
316  {
317  commentList.push_back(strip(line.substr(0,60)));
318  valid |= validComment;
319  }
320  else if (thisLabel == stringMarkerName)
321  {
322  markerName = strip(line.substr(0,60));
323  valid |= validMarkerName;
324  }
325  else if (thisLabel == stringMarkerNumber)
326  {
327  markerNumber = strip(line.substr(0,20));
328  valid |= validMarkerNumber;
329  }
330  else if (thisLabel == stringObsType)
331  {
332  // read the first line
333  if (!(valid & validObsType))
334  {
335  numObs = gnsstk::StringUtils::asInt(line.substr(0,6));
336  for (int i = 0; (i < numObs) && (i < maxObsPerLine); i++)
337  {
338  int currPos = i * 6 + 6;
339  if (line.substr(currPos, 4) != string(4, ' '))
340  {
341  FFStreamError e("Format error for line type " + stringObsType);
342  GNSSTK_THROW(e);
343  }
344  obsTypeList.push_back(convertObsType(line.substr(currPos + 4, 2)));
345  }
346  valid |= validObsType;
347  }
348  // read continuation lines
349  else
350  {
351  int currentObsTypes = obsTypeList.size();
352  for (int i = currentObsTypes;
353  (i < numObs) && (i < (maxObsPerLine + currentObsTypes));
354  i++)
355  {
356  int currPos = (i % maxObsPerLine) * 6 + 6;
357  if (line.substr(currPos, 4) != string(4,' '))
358  {
359  FFStreamError e("Format error for line type " + stringObsType);
360  GNSSTK_THROW(e);
361  }
362  obsTypeList.push_back(convertObsType(line.substr(currPos + 4, 2)));
363  }
364  }
365  }
366  else if (thisLabel == stringSensorType)
367  {
368  if (line.substr(40,6) != string(6, ' '))
369  {
370  FFStreamError e("Format error for line type " + stringSensorType);
371  GNSSTK_THROW(e);
372  }
373  sensorType st;
374  st.model = strip(line.substr(0,20));
375  st.type = strip(line.substr(20,20));
376  st.accuracy = asDouble(line.substr(46,9));
377  st.obsType = convertObsType(line.substr(57,2));
378 
379  sensorTypeList.push_back(st);
380 
381  // only set this valid if there are exactly
382  // the same number in both lists
383  if (sensorTypeList.size() == obsTypeList.size())
384  {
385  valid |= validSensorType;
386  }
387  else
388  {
389  valid &= ~(long)validSensorType;
390  }
391  }
392  else if (thisLabel == stringSensorPos)
393  {
394  // read XYZ and H and obs type
396  sp.position[0] = asDouble(line.substr(0,14));
397  sp.position[1] = asDouble(line.substr(14,14));
398  sp.position[2] = asDouble(line.substr(28,14));
399  sp.height = asDouble(line.substr(42,14));
400 
401  sp.obsType = convertObsType(line.substr(57,2));
402 
403  sensorPosList.push_back(sp);
404 
405  // Only barometer is required, so set it valid only if you see that record.
406  if (sp.obsType == PR)
407  {
408  valid |= validSensorPos;
409  }
410  }
411  else if (thisLabel == stringEoH)
412  {
413  valid |= validEoH;
414  }
415  else
416  {
417  FFStreamError e("Unknown header label " + thisLabel);
418  GNSSTK_THROW(e);
419  }
420  }
421 
422  unsigned long allValid;
423  if (version == 2.0 ) allValid = allValid20;
424  else if (version == 2.1 ) allValid = allValid21;
425  else if (version == 2.11) allValid = allValid21;
426  else if (version >= 3.0 ) allValid = allValid21;
427  else
428  {
429  FFStreamError e("Unknown or unsupported RINEX version " +
430  asString(version));
431  GNSSTK_THROW(e);
432  }
433 
434  if ( (allValid & valid) != allValid)
435  {
436  string errstr("Incomplete or invalid header: missing: ");
437  errstr += bitString(allValid & ~valid);
438  FFStreamError err(errstr);
439  GNSSTK_THROW(err);
440  }
441 
442  strm.header = *this;
443  strm.headerRead = true;
444  }
445 
446  void RinexMetHeader::dump(ostream& s) const
447  {
448  s << "Marker " << markerName << endl;
449 
450  if (!obsTypeList.empty())
451  {
452  s << "Obs types:" << endl;
453  vector<RinexMetType>::const_iterator itr = obsTypeList.begin();
454  while (itr != obsTypeList.end())
455  {
456  s << convertObsType(*itr) << " ";
457  itr++;
458  }
459  s << endl;
460  }
461  }
462 
464  RinexMetHeader::convertObsType(const std::string& oneObs)
465  {
466  if (oneObs == "PR") return PR;
467  else if (oneObs == "TD") return TD;
468  else if (oneObs == "HR") return HR;
469  else if (oneObs == "ZW") return ZW;
470  else if (oneObs == "ZD") return ZD;
471  else if (oneObs == "ZT") return ZT;
472  else if (oneObs == "WD") return WD;
473  else if (oneObs == "WS") return WS;
474  else if (oneObs == "RI") return RI;
475  else if (oneObs == "HI") return HI;
476  else
477  {
478  FFStreamError e("Bad obs type:" + oneObs);
479  GNSSTK_THROW(e);
480  }
481  }
482 
484  {
485  if (oneObs == PR) return "PR";
486  else if (oneObs == TD) return "TD";
487  else if (oneObs == HR) return "HR";
488  else if (oneObs == ZW) return "ZW";
489  else if (oneObs == ZD) return "ZD";
490  else if (oneObs == ZT) return "ZT";
491  else if (oneObs == WD) return "WD";
492  else if (oneObs == WS) return "WS";
493  else if (oneObs == RI) return "RI";
494  else if (oneObs == HI) return "HI";
495  else
496  {
497  FFStreamError e("Bad obs type:" + asString(oneObs));
498  GNSSTK_THROW(e);
499  }
500  }
501 
502 
504  std::vector<std::string>& diffs,
505  const std::vector<std::string>& inclExclList,
506  bool incl)
507  {
508  // map header token to comparison result
509  std::map<std::string,bool> lineMap;
510  std::map<std::string,bool>::const_iterator lmi;
511  // Put the comments in a sorted set, we don't really care
512  // about the ordering.
513  std::set<std::string>
514  lcomments(commentList.begin(), commentList.end()),
515  rcomments(right.commentList.begin(), right.commentList.end());
516  std::set<RinexMetType>
517  lobs(obsTypeList.begin(), obsTypeList.end()),
518  robs(right.obsTypeList.begin(), right.obsTypeList.end());
519  std::set<sensorType>
520  ltype(sensorTypeList.begin(), sensorTypeList.end()),
521  rtype(right.sensorTypeList.begin(), right.sensorTypeList.end());
522  std::set<sensorPosType>
523  lpos(sensorPosList.begin(), sensorPosList.end()),
524  rpos(right.sensorPosList.begin(), right.sensorPosList.end());
525  // Compare everything first...
526  // deliberately ignoring valid flags
527 
528  // only comparing first character of file type because that's
529  // all that matters according to RINEX
530  lineMap[stringVersion] =
531  ((version == right.version) &&
532  (fileType[0] == right.fileType[0]));
533  lineMap[stringRunBy] =
534  ((fileProgram == right.fileProgram) &&
535  (fileAgency == right.fileAgency) &&
536  (date == right.date));
537  lineMap[stringComment] = (lcomments == rcomments);
538  lineMap[stringMarkerName] = (markerName == right.markerName);
539  lineMap[stringMarkerNumber] = (markerNumber == right.markerNumber);
540  lineMap[stringObsType] = (lobs == robs);
541  lineMap[stringSensorType] = (ltype == rtype);
542  lineMap[stringSensorPos] = (lpos == rpos);
543  // ...then filter by inclExclList later
544  if (incl)
545  {
546  std::map<std::string,bool> oldLineMap(lineMap);
547  std::map<std::string,bool>::const_iterator olmi;
548  lineMap.clear();
549  for (unsigned i = 0; i < inclExclList.size(); i++)
550  {
551  if ((olmi = oldLineMap.find(inclExclList[i])) != oldLineMap.end())
552  {
553  lineMap[olmi->first] = olmi->second;
554  }
555  }
556  }
557  else
558  {
559  // exclude, remove items in inclExclList
560  for (unsigned i = 0; i < inclExclList.size(); i++)
561  {
562  lineMap.erase(inclExclList[i]);
563  }
564  }
565  // check the equality of the final remaining set of header lines
566  bool rv = true;
567  for (lmi = lineMap.begin(); lmi != lineMap.end(); lmi++)
568  {
569  if (!lmi->second)
570  {
571  diffs.push_back(lmi->first);
572  rv = false;
573  }
574  }
575  return rv;
576  } // bool RinexMetHeader::compare
577 
580  const
581  {
582  return ((obsType == r.obsType) &&
583  (model == r.model) &&
584  (type == r.type) &&
585  (fabs(accuracy - r.accuracy) < 0.001));
586  }
587 
590  const
591  {
592  if (obsType < r.obsType) return true;
593  if (obsType > r.obsType) return false;
594  if (model < r.model) return true;
595  if (model > r.model) return false;
596  if (type < r.type) return true;
597  if (type > r.type) return false;
598  if (accuracy < r.accuracy) return true;
599  return false;
600  }
601 
602 
605  const
606  {
607  return ((obsType == r.obsType) &&
608  (position == r.position) &&
609  (fabs(height - r.height) < 0.001));
610  }
611 
612  // pretty arbitrary sorting order, just need it to be consistent.
615  const
616  {
617  if (obsType < r.obsType) return true;
618  if (obsType > r.obsType) return false;
619  if (position[0] < r.position[0]) return true;
620  if (position[0] > r.position[0]) return false;
621  if (position[1] < r.position[1]) return true;
622  if (position[1] > r.position[1]) return false;
623  if (position[2] < r.position[2]) return true;
624  if (position[2] > r.position[2]) return false;
625  if (height < r.height) return true;
626  return false;
627  }
628 } // namespace
gnsstk::StringUtils::asInt
long asInt(const std::string &s)
Definition: StringUtils.hpp:713
gnsstk::RinexMetHeader::markerNumber
std::string markerNumber
The number of the location.
Definition: RinexMetHeader.hpp:205
gnsstk::RinexMetStream
Definition: RinexMetStream.hpp:70
gnsstk::RinexMetHeader::commentList
std::vector< std::string > commentList
A list of comments.
Definition: RinexMetHeader.hpp:203
gnsstk::RinexMetHeader::sensorType::operator<
bool operator<(const sensorType &r) const
Definition: RinexMetHeader.cpp:589
gnsstk::RinexMetHeader::stringComment
static const GNSSTK_EXPORT std::string stringComment
"COMMENT"
Definition: RinexMetHeader.hpp:225
gnsstk::RinexMetHeader::bitString
static std::string bitString(unsigned long vb, char quote='\"', std::string sep=", ")
Definition: RinexMetHeader.cpp:71
gnsstk::FFStream
Definition: FFStream.hpp:119
gnsstk::RinexMetHeader::maxObsPerLine
static const GNSSTK_EXPORT int maxObsPerLine
Holds the max records per line.
Definition: RinexMetHeader.hpp:218
StringUtils.hpp
gnsstk::RinexMetHeader::stringSensorPos
static const GNSSTK_EXPORT std::string stringSensorPos
"SENSOR POS XYZ/H"
Definition: RinexMetHeader.hpp:235
gnsstk::RinexMetHeader::sensorPosType::height
double height
Definition: RinexMetHeader.hpp:261
gnsstk::RinexMetHeader::sensorPosType::operator==
bool operator==(const sensorPosType &r) const
Definition: RinexMetHeader.cpp:604
gnsstk::FFTextStream::formattedGetLine
void formattedGetLine(std::string &line, const bool expectEOF=false)
Definition: FFTextStream.cpp:149
gnsstk::RinexMetHeader::reallyGetRecord
virtual void reallyGetRecord(FFStream &s)
Definition: RinexMetHeader.cpp:257
gnsstk::UnixTime::printf
virtual std::string printf(const std::string &fmt) const
Definition: UnixTime.cpp:105
gnsstk::RinexMetHeader::stringSensorType
static const GNSSTK_EXPORT std::string stringSensorType
"SENSOR MOD/TYPE/ACC"
Definition: RinexMetHeader.hpp:233
gnsstk::RinexMetHeader::sensorType
Struct for holding information about a sensor.
Definition: RinexMetHeader.hpp:241
gnsstk::FFTextStream::lineNumber
unsigned int lineNumber
Definition: FFTextStream.hpp:98
gnsstk::RinexMetStream::header
RinexMetHeader header
RINEX met header for this file.
Definition: RinexMetStream.hpp:89
gnsstk::StringUtils::asString
std::string asString(IonexStoreStrategy e)
Convert a IonexStoreStrategy to a whitespace-free string name.
Definition: IonexStoreStrategy.cpp:46
gnsstk::RinexMetHeader::stringObsType
static const GNSSTK_EXPORT std::string stringObsType
"# / TYPES OF OBSERV"
Definition: RinexMetHeader.hpp:231
example6.date
date
Definition: example6.py:18
gnsstk::RinexMetHeader::sensorType::obsType
RinexMetHeader::RinexMetType obsType
The obs type this sensor corresponds to.
Definition: RinexMetHeader.hpp:246
gnsstk::RinexMetHeader::RinexMetType
RinexMetType
Enum for the different types of data in this file.
Definition: RinexMetHeader.hpp:81
gnsstk::RinexMetHeader::reallyPutRecord
virtual void reallyPutRecord(FFStream &s) const
Definition: RinexMetHeader.cpp:92
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
gnsstk::RinexMetHeader::fileAgency
std::string fileAgency
The group who generated it.
Definition: RinexMetHeader.hpp:201
gnsstk::RinexMetHeader::validBits
validBits
These are validity bits used in checking the RINEX MET header.
Definition: RinexMetHeader.hpp:122
gnsstk::RinexMetHeader::dump
virtual void dump(std::ostream &s) const
A debug function that outputs the header to s.
Definition: RinexMetHeader.cpp:446
gnsstk::RinexMetHeader::stringEoH
static const GNSSTK_EXPORT std::string stringEoH
"END OF HEADER"
Definition: RinexMetHeader.hpp:237
example6.fileProgram
fileProgram
Definition: example6.py:17
gnsstk::RinexMetHeader::fileType
std::string fileType
The type of file it is.
Definition: RinexMetHeader.hpp:199
example6.markerName
markerName
Definition: example6.py:22
SystemTime.hpp
gnsstk::RinexMetHeader::convertObsType
static RinexMetType convertObsType(const std::string &oneObs)
Definition: RinexMetHeader.cpp:464
example4.err
err
Definition: example4.py:126
gnsstk::RinexMetStream::headerRead
bool headerRead
Flag showing whether or not the header has been read.
Definition: RinexMetStream.hpp:92
gnsstk::SystemTime
Definition: SystemTime.hpp:54
example6.validEoH
validEoH
Definition: example6.py:82
version
string version(string("2.4 9/23/15 rev"))
gnsstk::RinexMetHeader::sensorPosType::operator<
bool operator<(const sensorPosType &r) const
Definition: RinexMetHeader.cpp:614
example6.valid
valid
Definition: example6.py:20
CivilTime.hpp
gnsstk::StringUtils::asDouble
double asDouble(const std::string &s)
Definition: StringUtils.hpp:705
gnsstk::RinexMetHeader::sensorPosList
std::vector< sensorPosType > sensorPosList
A list of sensor positions used in the file.
Definition: RinexMetHeader.hpp:215
example6.fileType
fileType
Definition: example6.py:15
gnsstk::RinexMetHeader::sensorPosType::position
gnsstk::Triple position
Definition: RinexMetHeader.hpp:260
RinexMetHeader.hpp
gnsstk::RinexMetHeader::compare
bool compare(const RinexMetHeader &right, std::vector< std::string > &diffs, const std::vector< std::string > &inclExclList, bool incl=false)
Definition: RinexMetHeader.cpp:503
gnsstk::RinexMetHeader::sensorPosType::obsType
RinexMetHeader::RinexMetType obsType
The obs type of the sensor this position corresponds to.
Definition: RinexMetHeader.hpp:263
gnsstk::CivilTime
Definition: CivilTime.hpp:55
gnsstk::StringUtils
Definition: IonexStoreStrategy.cpp:44
gnsstk::StringUtils::rightJustify
std::string & rightJustify(std::string &s, const std::string::size_type length, const char pad=' ')
Definition: StringUtils.hpp:1557
RinexMetStream.hpp
std
Definition: Angle.hpp:142
gnsstk::RinexMetHeader::obsTypeList
std::vector< RinexMetType > obsTypeList
Definition: RinexMetHeader.hpp:213
example6.markerNumber
markerNumber
Definition: example6.py:72
example6.fileAgency
fileAgency
Definition: example6.py:19
gnsstk::StringUtils::strip
std::string & strip(std::string &s, const std::string &aString, std::string::size_type num=std::string::npos)
Definition: StringUtils.hpp:1482
gnsstk::RinexMetHeader::sensorPosType
Struct for holding info about a sensor position.
Definition: RinexMetHeader.hpp:255
gnsstk::StringUtils::leftJustify
std::string & leftJustify(std::string &s, const std::string::size_type length, const char pad=' ')
Definition: StringUtils.hpp:1582
GNSSTK_THROW
#define GNSSTK_THROW(exc)
Definition: Exception.hpp:366
gnsstk::RinexMetHeader::sensorType::accuracy
double accuracy
The accuracy of the sensor.
Definition: RinexMetHeader.hpp:245
gnsstk::RinexMetHeader::stringVersion
static const GNSSTK_EXPORT std::string stringVersion
"RINEX VERSION / TYPE"
Definition: RinexMetHeader.hpp:221
gnsstk::RinexMetHeader::sensorType::model
std::string model
The manufacturer of the sensor.
Definition: RinexMetHeader.hpp:243
gnsstk::RinexMetHeader::stringMarkerName
static const GNSSTK_EXPORT std::string stringMarkerName
"MARKER NAME"
Definition: RinexMetHeader.hpp:227
gnsstk::RinexMetHeader::version
double version
RINEX Version.
Definition: RinexMetHeader.hpp:197
gnsstk::RinexMetHeader::sensorType::type
std::string type
The specific type of sensor.
Definition: RinexMetHeader.hpp:244
gnsstk::RinexMetHeader::markerName
std::string markerName
The name of the location.
Definition: RinexMetHeader.hpp:204
gnsstk::ZW
@ ZW
Definition: NBTropModel.cpp:98
gnsstk::RinexMetHeader::date
std::string date
When the file was written.
Definition: RinexMetHeader.hpp:202
gnsstk::ZT
@ ZT
Definition: NBTropModel.cpp:98
gnsstk::RinexMetHeader::sensorTypeList
std::vector< sensorType > sensorTypeList
A list of sensors used in the file.
Definition: RinexMetHeader.hpp:214
gnsstk::RinexMetHeader::stringMarkerNumber
static const GNSSTK_EXPORT std::string stringMarkerNumber
"MARKER NUMBER"
Definition: RinexMetHeader.hpp:229
gnsstk::RinexMetHeader::stringRunBy
static const GNSSTK_EXPORT std::string stringRunBy
"PGM / RUN BY / DATE"
Definition: RinexMetHeader.hpp:223
gnsstk::RinexMetHeader::sensorType::operator==
bool operator==(const sensorType &r) const
Definition: RinexMetHeader.cpp:579
gnsstk::RinexMetHeader::fileProgram
std::string fileProgram
The program that generated it.
Definition: RinexMetHeader.hpp:200
sp
double sp
Definition: IERS1996NutationData.hpp:46
gnsstk::RinexMetHeader
Definition: RinexMetHeader.hpp:70


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