General Purpose Geodetic Library
SgAPrioriData.cpp
Go to the documentation of this file.
1 /*
2  *
3  * This file is a part of Space Geodetic Library. The library is used by
4  * nuSolve, a part of CALC/SOLVE system, and designed to make analysis of
5  * geodetic VLBI observations.
6  * Copyright (C) 2012-2020 Sergei Bolotin.
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <http://www.gnu.org/licenses/>.
20  *
21  */
22 
23 
24 #include <math.h>
25 
26 
27 #include <QtCore/QFile>
28 #include <QtCore/QRegExp>
29 #include <QtCore/QStringList>
30 #include <QtCore/QTextStream>
31 
32 #include <SgAPrioriData.h>
33 #include <SgLogger.h>
34 
35 
36 /*=======================================================================================================
37 *
38 * SgAPrioriRec METHODS:
39 *
40 *======================================================================================================*/
41 //
42 // static first:
43 const QString SgAPrioriRec::className()
44 {
45  return "SgAPrioriRec";
46 };
47 /*=====================================================================================================*/
48 
49 
50 
51 
52 
53 /*=======================================================================================================
54 *
55 * SgAPriories METHODS:
56 *
57 *======================================================================================================*/
58 //
59 // static first:
60 const QString SgAPriories::className()
61 {
62  return "SgAPriories";
63 };
64 
65 
66 
67 //
69 {
70  QList<SgAPrioriRec*> recs=values();
71  for (int i=0; i<recs.size(); i++)
72  delete recs.at(i);
73  clear();
74  fileName_ = "";
75 };
76 
77 
78 
79 //
80 bool SgAPriories::parseString4StnPos(const QString& str, SgAPrioriRec& rec)
81 {
82  // station name:
83  int idx=0;
84  while (str.at(idx) == ' ')
85  idx++;
86  rec.setKey(str.mid(idx, 8));
87 
88  QStringList l = str.mid(idx+8).simplified().split(' ', QString::SkipEmptyParts);
89  if (l.size() < 6)
90  {
92  ": parseString4StnGrd(): cannot parse the string [" + str.mid(idx+8).simplified() +
93  "], not enough data: l=" + QString("").setNum(l.size()));
94  return false;
95  };
96 
97  int nYr, nMn, nDy;
98  SgVector r(3);
99  bool isOk;
100  // 1 2 3 4 5 6 7
101  //01234567890123456789012345678901234567890123456789012345678901234567890123456789
102  // AIRA -3530219.613 4118797.487 3344015.689 00 00 00
103  // AIRA -3530219.605 4118797.488 3344015.688 08 06 14
104  // KOKEE -5543837.656 -2054567.673 2387852.042 00 00 00
105 
106  // station positions:
107  r(0) = l.at(0).toDouble(&isOk);
108  if (!isOk)
109  return false;
110  r(1) = l.at(1).toDouble(&isOk);
111  if (!isOk)
112  return false;
113  r(2) = l.at(2).toDouble(&isOk);
114  if (!isOk)
115  return false;
116 
117  rec.append(SgAPrioriRecComponent());
118  rec[0].setDvalue("0", r(0));
119  rec[0].setDvalue("1", r(1));
120  rec[0].setDvalue("2", r(2));
121 
122  // valid epoch:
123  nYr = l.at(3).toInt(&isOk);
124  if (!isOk)
125  return false;
126  nMn = l.at(4).toInt(&isOk);
127  if (!isOk)
128  return false;
129  nDy = l.at(5).toInt(&isOk);
130  if (!isOk)
131  return false;
132  if (nYr==0 && nMn==0 && nDy==0)
133  rec.setTsince(tZero);
134  else
135  rec.setTsince(SgMJD(nYr, nMn, nDy));
136  //
137  //std::cout << "Got a priori coords for station " << qPrintable(rec.getKey()) << ": "
138  // << "X: " << rec.getVi(0) << " Y: " << rec.getVi(1) << " Z: " << rec.getVi(2)
139  // << " for the epoch " << qPrintable(rec.getTsince().toString())
140  // << "\n";
141  return true;
142 };
143 
144 
145 
146 //
147 bool SgAPriories::parseString4StnVel(const QString& str, SgAPrioriRec& rec)
148 {
149  // station name:
150  int idx=0;
151  while (str.at(idx) == ' ')
152  idx++;
153  rec.setKey(str.mid(idx, 8));
154 
155  QStringList l = str.mid(idx+8).simplified().split(' ', QString::SkipEmptyParts);
156  if (l.size() < 3)
157  {
159  ": parseString4StnGrd(): cannot parse the string [" + str.mid(idx+8).simplified() +
160  "], not enough data: l=" + QString("").setNum(l.size()));
161  return false;
162  };
163 
164  SgVector v(3);
165  bool isOk;
166  // 1 2 3 4 5 6
167  //012345678901234567890123456789012345678901234567890123456789012345
168  // AIRA -25.8 -7.7 -15.4
169  // ALGOPARK -16.2 -3.6 3.9
170  // WETTZELL -15.80 16.90 10.40
171 
172  // station velocities:
173  v(0) = l.at(0).toDouble(&isOk);
174  if (!isOk)
175  return false;
176  v(1) = l.at(1).toDouble(&isOk);
177  if (!isOk)
178  return false;
179  v(2) = l.at(2).toDouble(&isOk);
180  if (!isOk)
181  return false;
182  // rec.setV(v*1.0e-3/365.25); // mm/yr => m/d
183  // here we have tropical year (is it true?)
184  v *= 1.0e-3/365.242198781250; // mm/yr => m/d
185  rec.append(SgAPrioriRecComponent());
186  rec[0].setDvalue("0", v(0));
187  rec[0].setDvalue("1", v(1));
188  rec[0].setDvalue("2", v(2));
189  rec.setTsince(tZero);
190  //
191  // std::cout << "Got a priori vels for station " << qPrintable(rec.getKey()) << ": "
192  // << "X: " << rec.getVi(0) << " Y: " << rec.getVi(1) << " Z: " << rec.getVi(2)
193  // << " for the epoch " << qPrintable(rec.getTsince().toString())
194  // << "\n";
195  return true;
196 };
197 
198 
199 
200 //
201 bool SgAPriories::parseString4SrcPos(const QString& str, SgAPrioriRec& rec)
202 {
203  // source name:
204  int idx=0;
205  while (str.at(idx) == ' ')
206  idx++;
207  rec.setKey(str.mid(idx, 8));
208 
209  QStringList l=str.mid(idx+8).simplified().split(' ', QString::SkipEmptyParts);
210  if (l.size() < 6)
211  {
213  ": parseString4StnGrd(): cannot parse the string [" + str.mid(idx+8).simplified() +
214  "], not enough data: l=" + QString("").setNum(l.size()));
215  return false;
216  };
217 
218  double dg, hr, mn, sc;
219  SgVector k(2);
220  bool isOk;
221  // 1 2 3 4 5 6 7
222  //012345678901234567890123456789012345678901234567890123456789012345678901234567890
223  // 2358+189 00 01 08.621568 +19 14 33.80173 gsf2011b Globl
224  // 2359-221 00 02 11.981470 -21 53 09.86663 gsf2011b Globl
225  // IIIZW2 00 10 31.005902 +10 58 29.50438 ICRF2 Defining
226 
227  // source coordinates:
228  hr = l.at(0).toDouble(&isOk);
229  if (!isOk)
230  return false;
231  mn = l.at(1).toDouble(&isOk);
232  if (!isOk)
233  return false;
234  sc = l.at(2).toDouble(&isOk);
235  if (!isOk)
236  return false;
237  k(0) = (hr + (mn + sc/60.0)/60.0)/RAD2HR;
238 
239  dg = l.at(3).toDouble(&isOk);
240  if (!isOk)
241  return false;
242  mn = l.at(4).toDouble(&isOk);
243  if (!isOk)
244  return false;
245  sc = l.at(5).toDouble(&isOk);
246  if (!isOk)
247  return false;
248  if (l.at(3).at(0) != '-')
249  k(1) = (dg + (mn + sc/60.0)/60.0)/RAD2DEG;
250  else
251  k(1) = (dg - (mn + sc/60.0)/60.0)/RAD2DEG;
252 
253  rec.append(SgAPrioriRecComponent());
254  rec[0].setDvalue("0", k(0));
255  rec[0].setDvalue("1", k(1));
256  rec.setTsince(tZero);
257 
258  if (l.size() > 6)
259  {
260  QString str("");
261  for (int i=6; i<l.size(); i++)
262  str += l.at(i) + " ";
263  str.chop(1);
264  rec.setComments(str);
265  };
266  //
267  // std::cout << "Got a priori coords for source " << qPrintable(rec.getKey()) << ": "
268  // << "RA: " << rec.getVi(0)*RAD2HR << " DE: " << rec.getVi(1)*RAD2DEG
269  // << " for the epoch " << qPrintable(rec.getTsince().toString())
270  // << "\n";
271  return true;
272 };
273 
274 
275 
276 //
277 bool SgAPriories::parseString4AxsOfs(const QString& str, SgAPrioriRec& rec)
278 {
279  // station name:
280  int idx=0;
281  while (str.at(idx) == ' ')
282  idx++;
283  rec.setKey(str.mid(idx, 8));
284 
285  QStringList l=str.mid(idx+8).simplified().split(' ', QString::SkipEmptyParts);
286  if (l.size() < 2)
287  {
289  ": parseString4StnGrd(): cannot parse the string [" + str.mid(idx+8).simplified() +
290  "], not enough data: l=" + QString("").setNum(l.size()));
291  return false;
292  };
293 
294  SgVector o(2);
295  bool isOk;
296  // 1 2 3 4 5 6
297  //012345678901234567890123456789012345678901234567890123456789012345
298  //AIRA 0.0000 -0.0089 -+ 0.0014 adjustment
299  //ALASKANO 7.2852 7.2852 blokq.dat
300 
301  // station velocities:
302  o(0) = l.at(0).toDouble(&isOk);
303  if (!isOk)
304  return false;
305  o(1) = l.at(1).toDouble(&isOk);
306  if (!isOk)
307  return false;
308  rec.append(SgAPrioriRecComponent());
309  rec[0].setDvalue("0", o(0)); // a priori from antenna design
310  rec[0].setDvalue("1", o(1)); // estimated
311 
312  rec.setTsince(tZero);
313 // std::cout << "Got a priori axis offsets for station " << qPrintable(rec.getKey()) << ": "
314 // << "AxOf_0: " << rec[0].getDvalue("0") << " AxOf: " << rec[0].getDvalue("1")
315 // << " for the epoch " << qPrintable(rec.getTsince().toString())
316 // << "\n";
317  return true;
318 };
319 
320 
321 
322 //
323 bool SgAPriories::parseString4StnGrd(const QString& str, SgAPrioriRec& rec)
324 {
325  // station name:
326  int idx=0;
327  while (str.at(idx) == ' ')
328  idx++;
329  rec.setKey(str.mid(idx, 8));
330 
331  QStringList l=str.mid(idx+8).simplified().split(' ', QString::SkipEmptyParts);
332  if (l.size() < 4)
333  {
335  ": parseString4StnGrd(): cannot parse the string [" + str.mid(idx+8).simplified() +
336  "], not enough data: l=" + QString("").setNum(l.size()));
337  return false;
338  };
339 
340  SgVector o(2);
341  bool isOk;
342  // 1 2 3 4 5 6
343  //012345678901234567890123456789012345678901234567890123456789012345
344  //*Site North Gradient (mm) East Gradient (mm)
345  //*
346  //* mean rms mean rms
347  //*
348  //AIRA -.50E+00 .51E+00 .32E-01 .33E+00
349  //MCD 7850 -.24E+00 .27E+00 -.18E-01 .21E+00
350 
351  // station gradients:
352  o(0) = l.at(0).toDouble(&isOk)/1000.0; // mm => m
353  if (!isOk)
354  return false;
355  o(1) = l.at(2).toDouble(&isOk)/1000.0; // mm => m
356  if (!isOk)
357  return false;
358  rec.append(SgAPrioriRecComponent());
359  rec[0].setDvalue("0", o(0));
360  rec[0].setDvalue("1", o(1));
361  rec.setTsince(tZero);
362  // std::cout << "Got a priori axis offsets for station " << qPrintable(rec.getKey()) << ": "
363  // << "GrdN: " << rec.getVi(0) << ", GrdE: " << rec.getVi(1)
364  // << "\n";
365  return true;
366 };
367 
368 
369 
370 /*
371 bool SgAPriories::parseString4SrcSsm(const QString& str, QTextStream& s, SgAPrioriRec& rec)
372 {
373  bool isOk=false;
374  int idx=0, n;
375  QString ss("");
376  double d;
377  QRegExp reSrc("^Src:([\\.A-Z0-9+-]+{2,8})\\.*", Qt::CaseInsensitive);
378  QRegExp reMpx("\\.*M_PX:([\\.\\d+-]+)\\.*", Qt::CaseInsensitive);
379  QRegExp reMpy("\\.*M_PY:([\\.\\d+-]+)\\.*", Qt::CaseInsensitive);
380  rec.setKey("");
381 
382 
383  if (reSrc.indexIn(str) != -1)
384  {
385  ss = reSrc.cap(1);
386  std::cout << " -- Got source [" << qPrintable(ss) << "]\n";
387  rec.setKey(ss);
388  }
389  else
390  return isOk;
391 
392  double px, py, k, b;
393  px = py = k = b = 0.0;
394 
395  if (reMpx.indexIn(str) != -1)
396  {
397  px = reMpx.cap(1).toDouble(&isOk);
398  if (!isOk)
399  return isOk;
400  };
401  if (reMpy.indexIn(str) != -1)
402  {
403  py = reMpy.cap(1).toDouble(&isOk);
404  if (!isOk)
405  return isOk;
406  };
407  std::cout << " -- p_x= " << px << ", p_y= " << py << "\n";
408 
409 
410  //rec.append(SgAPrioriRecComponent());
411 
412  return true;
413 };
414 */
415 
416 
417 //
418 bool SgAPriories::readFile(const QString& fileName, SgAPriories::DataType dataType)
419 {
420  clearStorage();
421  SgAPrioriRec *apdRec;
422  QString str;
423  QFile f((fileName_=fileName));
424  bool isOk=false;
425  if (!f.exists())
426  {
428  ": the file [" + fileName + "] with a priori data does not exist");
429  return isOk;
430  };
431  //
432  // readFile's call can override the default:
433  if (dataType==DT_UNDEF)
434  dataType = dataType_;
435  if (dataType==DT_UNDEF)
436  {
438  ": the data type of the file [" + fileName + "] is not specified; skipping it");
439  return isOk;
440  };
441  //
442  //
443  if (f.open(QFile::ReadOnly))
444  {
445  QTextStream s(&f);
446  if (dataType == DT_SRC_SSM)
447  isOk = parseFileSrcSsm(s);
448  else
449  while (!s.atEnd())
450  {
451  str = s.readLine();
452  //000101
453  if (str.size()==6) // check for the "zero" epoch:
454  {
455  bool isOk;
456  int yr, mn, dy;
457  yr = str.mid( 0, 2).toInt(&isOk);
458  if (isOk)
459  {
460  mn = str.mid( 2, 2).toInt(&isOk);
461  if (isOk)
462  {
463  dy = str.mid( 4, 2).toInt(&isOk);
464  if (isOk)
465  {
466  if (0<mn && mn<13 && 0<dy && dy<32)
467  {
468  t0_.setUpEpoch(yr, mn, dy, 0, 0, 0.0);
470  "::readFile(): got an initial epoch: " + t0_.toString() + " for the a priori set");
471  }
472  else
474  "::readFile(): got a suspicious epoch: " + str + ", skipping");
475  };
476  };
477  };
478  }
479  else
480  if (str.size()>8 && str.at(0)!='$' && str.at(0)!='#' && str.at(0)!='*')
481  {
482  apdRec = new SgAPrioriRec;
483  isOk = false;
484  switch (dataType)
485  {
486  case DT_STN_POS:
487  isOk = parseString4StnPos(str, *apdRec);
488  break;
489  case DT_STN_VEL:
490  isOk = parseString4StnVel(str, *apdRec);
491  break;
492  case DT_SRC_POS:
493  isOk = parseString4SrcPos(str, *apdRec);
494  break;
495  case DT_AXS_OFS:
496  isOk = parseString4AxsOfs(str, *apdRec);
497  break;
498  case DT_STN_GRD:
499  isOk = parseString4StnGrd(str, *apdRec);
500  break;
501  case DT_SRC_SSM:
502  default:
503  break;
504  };
505  if (isOk)
506  insert(apdRec->getKey(), apdRec);
507  else
508  delete apdRec;
509  };
510  };
511  f.close();
512  s.setDevice(NULL);
513  };
514  return (0<size());
515 };
516 
517 
518 
519 //
520 bool SgAPriories::parseFileSrcSsm(QTextStream& s)
521 {
522  SgAPrioriRec *rec;
523  bool isOk=false;
524  bool estR, estK, estB;
525  int nY, nM, nD;
526  double px, py, k, b;
527  SgMJD tFrom;
528  QString str(""), ss(""), srcName(""), sModelType("");
529  QRegExp reSrc(".*Src:([\\.A-Z0-9+-]{2,8}).*", Qt::CaseInsensitive);
530  QRegExp reTsince(".*T:([\\d]{4})/([\\d]{2})/([\\d]{2}).*", Qt::CaseInsensitive);
531  QRegExp reModelType(".*SSM_T:([\\w]+)\\s+.*", Qt::CaseInsensitive);
532  QRegExp reMptX(".*X:([\\s\\.\\d+-]+).*", Qt::CaseInsensitive);
533  QRegExp reMptY(".*Y:([\\s\\.\\d+-]+).*", Qt::CaseInsensitive);
534  QRegExp reMptK(".*K:([\\s\\.\\d+-]+).*", Qt::CaseInsensitive);
535  QRegExp reMptB(".*B:([\\s\\.\\d+-]+).*", Qt::CaseInsensitive);
536  QRegExp reMptEr(".*ER:([\\w]+).*", Qt::CaseInsensitive);
537  QRegExp reMptEk(".*EK:([\\w]+).*", Qt::CaseInsensitive);
538  QRegExp reMptEb(".*EB:([\\w]+).*", Qt::CaseInsensitive);
539  enum modelType
540  {
541  MT_NONE = 0,
542  MT_MP = 1, // multi point
543  };
544  modelType mType;
545 
546 
547  rec = NULL;
548  mType = MT_NONE;
549  while (!s.atEnd())
550  {
551  //rec = NULL;
552  isOk = false;
553  estR = estK = estB = false;
554  px = py = k = b = 0.0;
555  nY = nM = nD = 0;
556  tFrom = tZero;
557 
558  str = s.readLine();
559  if (str.size()>8 && str.at(0)!='$' && str.at(0)!='#' && str.at(0)!='*' && str.at(0)!='/')
560  {
561  if (reSrc.indexIn(str) != -1)
562  {
563  rec = new SgAPrioriRec;
564  srcName = reSrc.cap(1);
565  rec->setKey(srcName.leftJustified(8, ' '));
566  rec->setTsince(tZero);
567  mType = MT_NONE;
568  sModelType = "";
569  insert(rec->getKey(), rec);
570  };
571  if (reModelType.indexIn(str) != -1)
572  {
573  sModelType = reModelType.cap(1);
574  if (sModelType.toUpper() == "MP")
575  mType = MT_MP;
576  else
578  "::parseFileSrcSsm(): MP: got an unknown type of model: \"" + sModelType + "\"");
579  };
580  // known models:
581  if (mType == MT_MP)
582  {
583  if (reMptX.indexIn(str) != -1)
584  {
585  px = (ss = reMptX.cap(1)).toDouble(&isOk);
586  if (!isOk)
588  "::parseFileSrcSsm(): MPT_X: cannot convert \"" + ss + "\" to double");
589  };
590  if (reMptY.indexIn(str) != -1)
591  {
592  py = (ss = reMptY.cap(1)).toDouble(&isOk);
593  if (!isOk)
595  "::parseFileSrcSsm(): MPT_Y: cannot convert \"" + ss + "\" to double");
596  };
597  if (reMptK.indexIn(str) != -1)
598  {
599  k = (ss = reMptK.cap(1)).toDouble(&isOk);
600  if (!isOk)
602  "::parseFileSrcSsm(): MPT_K: cannot convert \"" + ss + "\" to double");
603  };
604  if (reMptB.indexIn(str) != -1)
605  {
606  b = (ss = reMptB.cap(1)).toDouble(&isOk);
607  if (!isOk)
609  "::parseFileSrcSsm(): MPT_B: cannot convert \"" + ss + "\" to double");
610  };
611  if (reTsince.indexIn(str) != -1)
612  {
613  nY = (ss = reTsince.cap(1)).toDouble(&isOk);
614  if (isOk)
615  {
616  nM = (ss = reTsince.cap(2)).toDouble(&isOk);
617  if (isOk)
618  {
619  nD = (ss = reTsince.cap(3)).toDouble(&isOk);
620  if (isOk)
621  {
622  tFrom = SgMJD(nY, nM, nD);
623  if (rec)
624  rec->setTsince(tFrom);
625  }
626  else
628  "::parseFileSrcSsm(): MPT_T: cannot convert \"" + ss + "\" to days");
629  }
630  else
632  "::parseFileSrcSsm(): MPT_T: cannot convert \"" + ss + "\" to month");
633  }
634  else
636  "::parseFileSrcSsm(): MPT_T: cannot convert \"" + ss + "\" to years");
637  };
638  if (reMptEr.indexIn(str) != -1)
639  {
640  estR = (reMptEr.cap(1).toUpper().at(0) == 'Y');
641  };
642  if (reMptEk.indexIn(str) != -1)
643  {
644  estK = (reMptEk.cap(1).toUpper().at(0) == 'Y');
645  };
646  if (reMptEb.indexIn(str) != -1)
647  {
648  estB = (reMptEb.cap(1).toUpper().at(0) == 'Y');
649  };
650  if (rec )
651  {
652  SgAPrioriRecComponent point;
653  point.setDvalue("MP_X", px);
654  point.setDvalue("MP_Y", py);
655  point.setDvalue("MP_K", k);
656  point.setDvalue("MP_B", b);
657  point.setBvalue("MP_ER", estR);
658  point.setBvalue("MP_EK", estK);
659  point.setBvalue("MP_EB", estB);
660  rec->append(point);
661  };
662  }; // end of MT_MP model
663  };
664  };
665  isOk = true;
666  return isOk;
667 };
668 
669 
670 
671 //
672 SgAPrioriRec* SgAPriories::lookupApRecord(const QString& key, const SgMJD& t)
673 {
674  if (!contains(key))
675  return NULL;
676  // std::cout << qPrintable(key) << "\n";
677  QList<SgAPrioriRec*> recs=values(key);
678  if (recs.size()==1)
679  return recs.at(0);
680 
681  // more than one record:
682  QMap<double, SgAPrioriRec*> recByEpoch;
683  for (int i=0; i<recs.size(); i++)
684  recByEpoch.insert(recs.at(i)->getTsince().toDouble(), recs.at(i));
685  recs.clear();
686  recs = recByEpoch.values();
687  //
688  if (t==tZero)
689  return recs.at(0);
690  //
691  if (recs.last()->getTsince() <= t)
692  return recs.last();
693  //
694  int idx=recs.size() - 1;
695  while (0<idx && t<=recs.at(idx)->getTsince())
696  idx--;
697  return recs.at(idx);
698 };
699 /*=====================================================================================================*/
700 
701 
702 
703 
704 
705 /*=======================================================================================================
706 *
707 * FRIENDS:
708 *
709 *======================================================================================================*/
710 //
711 
712 
713 
714 /*=====================================================================================================*/
715 //
716 // aux functions:
717 //
718 
719 
720 // i/o:
721 
722 
723 /*===== ================================================================================================*/
724 //
725 // constants:
726 //
727 /*=====================================================================================================*/
728 
729 
730 
731 
732 
733 
734 
735 
736 /*=====================================================================================================*/
SgLogger * logger
Definition: SgLogger.cpp:231
const SgMJD tZero(1957, 10, 4)
#define RAD2HR
degrees to radians:
Definition: SgMathSupport.h:45
#define RAD2DEG
radians to degrees:
Definition: SgMathSupport.h:41
void setBvalue(const QString &idx, bool b)
Definition: SgAPrioriData.h:76
void setDvalue(const QString &idx, double v)
Definition: SgAPrioriData.h:75
const QString & getKey() const
static const QString className()
void setComments(const QString &str)
void setTsince(const SgMJD &)
void setKey(const QString &)
static const QString className()
void clearStorage()
DataType dataType_
bool parseString4StnPos(const QString &str, SgAPrioriRec &rec)
bool parseString4StnGrd(const QString &str, SgAPrioriRec &rec)
bool parseString4AxsOfs(const QString &str, SgAPrioriRec &rec)
SgAPrioriRec * lookupApRecord(const QString &, const SgMJD &=tZero)
bool parseString4SrcPos(const QString &str, SgAPrioriRec &rec)
bool parseString4StnVel(const QString &str, SgAPrioriRec &rec)
bool readFile(const QString &fileName, DataType=DT_UNDEF)
bool parseFileSrcSsm(QTextStream &s)
QString fileName_
virtual void write(LogLevel, quint32, const QString &, bool=false)
Definition: SgLogger.cpp:88
@ IO_TXT
Definition: SgLogger.h:65
Definition: SgMJD.h:59
QString toString(Format format=F_Verbose) const
Definition: SgMJD.cpp:1008
void setUpEpoch(int year, int month, int day, int hour, int min, double sec)
Definition: SgMJD.cpp:255