General Purpose Geodetic Library
SgWrmsable.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) 2010-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 #include <iostream>
24 #include <stdlib.h>
25 
26 #include <QtCore/QDataStream>
27 
28 
29 #include <SgWrmsable.h>
30 
31 #include <SgLogger.h>
32 #include <SgTaskConfig.h>
33 #include <SgVlbiObservable.h>
34 
35 
36 
37 /*=======================================================================================================
38 *
39 * METHODS:
40 *
41 *======================================================================================================*/
42 //
43 // static first:
44 const QString SgWrmsable::className()
45 {
46  return "SgWrmsable";
47 };
48 //
49 
50 
51 
52 //
53 void SgWrmsable::addWrms(const SgMJD& t, double o_c, double w, double auxSum)
54 {
55  sumW_ += w;
56  sumWrms1_ += w*o_c;
57  sumWrmsWrms_ += w*o_c*w*o_c;
58  sumWrms2_ += w*o_c*o_c;
59  sumAuxOne_+= w*auxSum;
60  sumAuxTwo_+= w*w*auxSum;
61  if (t < tFirst_)
62  tFirst_ = t;
63  if (tLast_ < t)
64  tLast_ = t;
65  numProcessed_++;
66 };
67 
68 
69 
70 //
72 {
73  if (wrms)
74  {
75  setNumTotal(wrms->getNumTotal());
76  setNumUsable(wrms->getNumUsable());
77  setNumProcessed(wrms->getNumProcessed());
78  sumW_ = wrms->sumW_;
79  sumWrms1_ = wrms->sumWrms1_;
80  sumWrmsWrms_ = wrms->sumWrmsWrms_;
81  sumWrms2_ = wrms->sumWrms2_;
82  sumAuxOne_ = wrms->sumAuxOne_;
83  sumAuxTwo_ = wrms->sumAuxTwo_;
84  normedResid_ = wrms->normedResid_;
85  sff_NrmRes_ = wrms->sff_NrmRes_;
86  sff_NrmRes_plus_15_ = wrms->sff_NrmRes_plus_15_;
87  tFirst_ = wrms->tFirst();
88  tLast_ = wrms->tLast();
89  };
90 };
91 
92 
93 
94 //
95 void SgWrmsable::recalcSigma2add(double minSigma)
96 {
97  if (numProcessed_ <= 1)
98  return; // no good observations
99  //
100  double q, newSigma;
101  double d=1.0; // Chi^2 == d
102  //
104  if (q < 0.0)
105  q = -sqrtl(-q);
106  else
107  q = sqrtl(q);
108  //
109  if (q > 0.0)
110  newSigma = sqrt(sigma2add_*sigma2add_ + q*q);
111  else if (sigma2add_*sigma2add_ <= q*q + minSigma*minSigma)
112  newSigma = minSigma;
113  //newSigma = 10.0e-12; // 10ps, a la SOLVE
114  else
115  newSigma = sqrt(sigma2add_*sigma2add_ - q*q);
116  //
117  sigma2add_ = newSigma;
118 
119 /*
120 if (dataType_ == DT_RATE)
121 {
122  std::cout << "recalcSigma2add: "
123  << " numTotal= " << numTotal_
124  << " numUsable= " << numUsable_
125  << " numProcessed= " << numProcessed_
126  << " sumWrms2_ = " << sumWrms2_
127  << " sumAuxOne_ = " << sumAuxOne_
128  << " sumW_ = " << sumW_
129  << " sumAuxTwo_ = " << sumAuxTwo_
130  << " sigma2add_= " << sigma2add_
131  << "\n";
132 
133 };
134 */
135 
136 };
137 
138 
139 
140 //
142  const SgTaskConfig* cfg)
143 {
144  bool isOpSolveCompatible=cfg->getOpIsSolveCompatible();
145  double disp=dispersion(isOpSolveCompatible), s;
146 
147  for (int i=0; i<observables.size(); i++)
148  {
149  SgVlbiObservable *o=observables.at(i);
151  //
152  if (m)
153  {
154  if (cfg->getOpHave2NormalizeResiduals())
155  {
156  s = m->sigma2Apply();
157  if (isOpSolveCompatible)
158 // old (pre 0.5.1):
159 //-> m->setResidualNorm(m->getResidual()/s/s/sumW_/disp);
160  m->setResidualNorm(m->getResidual()/s/disp);
161  else
163  }
164  else // scale by WRMS, so 3 == 3*sigma
165  {
166  s = std::max(wrms(), 1.0e-15); // 1 fs is min
167  m->setResidualNorm(m->getResidual()/s);
168  };
169  };
170  };
171 };
172 
173 
174 
175 //
177 {
182 
183  if (s.status() != QDataStream::Ok)
184  {
186  "::saveIntermediateResults(): error writting data");
187  return false;
188  };
189  return s.status() == QDataStream::Ok;
190 };
191 
192 
193 
194 //
196 {
197  int numTotal, numUsable, numProcessed;
198  double sumW, sumWrms1, sumWrmsWrms, sumWrms2, sumAuxOne, sumAuxTwo, sigma2add;
199  int tFirst_date, tLast_date;
200  double tFirst_time, tLast_time;
201  double normedResid, sff_NrmRes, sff_NrmRes_plus_15;
202 
203  s >> numTotal >> numUsable >> numProcessed >> sumW >> sumWrms1 >> sumWrmsWrms
204  >> sumWrms2 >> sumAuxOne >> sumAuxTwo >> sigma2add
205  >> tFirst_date >> tFirst_time >> tLast_date >> tLast_time
206  >> normedResid >> sff_NrmRes >> sff_NrmRes_plus_15;
207 
208  if (s.status() != QDataStream::Ok)
209  {
211  "::loadIntermediateResults(): error reading data: " +
212  (s.status()==QDataStream::ReadPastEnd?"read past end of the file":"read corrupt data"));
213  return false;
214  };
215  numTotal_ = numTotal;
216  numUsable_ = numUsable;
217  numProcessed_ = numProcessed;
218  sumW_ = sumW;
219  sumWrms1_ = sumWrms1;
220  sumWrmsWrms_ = sumWrmsWrms;
221  sumWrms2_ = sumWrms2;
222  sumAuxOne_ = sumAuxOne;
223  sumAuxTwo_ = sumAuxTwo;
224  sigma2add_ = sigma2add;
225  tFirst_ .setDate(tFirst_date);
226  tFirst_ .setTime(tFirst_time);
227  tLast_ .setDate(tLast_date);
228  tLast_ .setTime(tLast_time);
229  normedResid_ = normedResid;
230  sff_NrmRes_ = sff_NrmRes;
231  sff_NrmRes_plus_15_ = sff_NrmRes_plus_15;
232  //
233  return s.status()==QDataStream::Ok;
234 };
235 
236 /*=====================================================================================================*/
237 //
238 // FRIENDS:
239 //
240 /*=====================================================================================================*/
241 //
242 
243 /*=====================================================================================================*/
244 //
245 // aux functions:
246 //
247 
248 /*=====================================================================================================*/
249 //
250 // constants:
251 //
252 
253 
254 /*=====================================================================================================*/
SgLogger * logger
Definition: SgLogger.cpp:231
@ DT_DELAY
Definition: SgWrmsable.h:44
virtual void write(LogLevel, quint32, const QString &, bool=false)
Definition: SgLogger.cpp:88
@ IO_BIN
Definition: SgLogger.h:64
Definition: SgMJD.h:59
double getTime() const
Definition: SgMJD.h:457
void setTime(double dTime)
Definition: SgMJD.cpp:165
int getDate() const
Definition: SgMJD.h:449
void setDate(int nDays)
Definition: SgMJD.h:465
bool getOpIsSolveCompatible() const
bool getOpHave2NormalizeResiduals() const
double sigma2Apply() const
void setResidualNorm(double)
double getResidual() const
SgVlbiMeasurement & phDRate()
SgVlbiMeasurement * activeDelay()
SgMJD tLast_
Definition: SgWrmsable.h:254
double sumWrms2_
Definition: SgWrmsable.h:249
void addWrms(const SgMJD &t, double o_c, double w, double auxSum)
Definition: SgWrmsable.cpp:53
void calcNormalizedResiduals(const QList< SgVlbiObservable * > &observables, const SgTaskConfig *cfg)
Definition: SgWrmsable.cpp:141
double dispersion(bool isSolveCompatible) const
Definition: SgWrmsable.h:340
DataType dataType_
Definition: SgWrmsable.h:242
double normedResid_
Definition: SgWrmsable.h:257
double wrms() const
Definition: SgWrmsable.h:367
void setNumProcessed(int n)
Definition: SgWrmsable.h:145
double sff_NrmRes_
Definition: SgWrmsable.h:258
double sff_NrmRes_plus_15_
Definition: SgWrmsable.h:259
double sumAuxOne_
Definition: SgWrmsable.h:250
void setNumTotal(int n)
Definition: SgWrmsable.h:138
double sumWrmsWrms_
Definition: SgWrmsable.h:248
double sumWrms1_
Definition: SgWrmsable.h:247
void copyStatistics(SgWrmsable *wrms)
Definition: SgWrmsable.cpp:71
void recalcSigma2add(double minSigma)
Definition: SgWrmsable.cpp:95
double sumAuxTwo_
Definition: SgWrmsable.h:251
bool loadIntermediateResults(QDataStream &)
Definition: SgWrmsable.cpp:195
int numTotal_
Definition: SgWrmsable.h:243
int numUsable_
Definition: SgWrmsable.h:244
static const QString className()
Definition: SgWrmsable.cpp:44
bool saveIntermediateResults(QDataStream &) const
Definition: SgWrmsable.cpp:176
SgMJD tFirst_
Definition: SgWrmsable.h:253
int numProcessed_
Definition: SgWrmsable.h:245
double sumW_
Definition: SgWrmsable.h:246
void setNumUsable(int n)
Definition: SgWrmsable.h:140
double sigma2add_
Definition: SgWrmsable.h:252