27 #include <QtCore/QDataStream>
47 return "SgVlbiBaselineInfo";
55 QString prefix =
"Bln: " +
getKey() +
": ";
128 strGrdAmbigsStat_ += QString(
"").sprintf(
"%.1f (%.1f%%), ", it.key()*1.0e9, it.value()*100.0/num);
129 if (count < it.value())
150 strPhdAmbigsStat_ += QString(
"").sprintf(
"%.3f (%.1f%%), ", it.key()*1.0e9, it.value()*100.0/num);
151 if (count < it.value())
167 if (count < it.value())
183 const double dS=0.2E-9;
197 if (obsList.size()<2*M0)
203 double A_l, B_l, C_l, P_l, Q_l, R_l;
204 double a_l, b_l, wrms_l;
205 double A_r, B_r, C_r, P_r, Q_r, R_r;
206 double a_r, b_r, wrms_r;
208 A_l = B_l = C_l = P_l = Q_l = R_l = 0.0;
209 a_l = b_l = wrms_l = 0.0;
210 A_r = B_r = C_r = P_r = Q_r = R_r = 0.0;
211 a_r = b_r = wrms_r = 0.0;
214 for (
int i=0; i<obsList.size(); i++)
228 b_l = (P_l*B_l - A_l*Q_l)/(B_l*B_l - A_l*C_l);
229 a_l = (Q_l - C_l*b_l)/B_l;
231 2.0*(a_l*b_l*B_l - a_l*P_l - b_l*Q_l))/A_l));
243 A_l = B_l = C_l = P_l = Q_l = R_l = 0.0;
246 for (
int i=0; i<M0; i++)
261 for (
int i=M0; i<obsList.size(); i++)
277 b_l = (P_l*B_l - A_l*Q_l)/(B_l*B_l - A_l*C_l);
278 a_l = (Q_l - C_l*b_l)/B_l;
279 wrms_l = (R_l + a_l*a_l*A_l + b_l*b_l*C_l + 2.0*(a_l*b_l*B_l - a_l*P_l - b_l*Q_l))/A_l;
280 b_r = (P_r*B_r - A_r*Q_r)/(B_r*B_r - A_r*C_r);
281 a_r = (Q_r - C_r*b_r)/B_r;
282 wrms_r = (R_r + a_r*a_r*A_r + b_r*b_r*C_r + 2.0*(a_r*b_r*B_r - a_r*P_r - b_r*Q_r))/A_r;
286 obsList.at(M0-1)->owner()->setBaselineClock_F1 (sqrt(fabs(wrms_l) + fabs(wrms_r)));
287 obsList.at(M0-1)->owner()->setBaselineClock_F1l(sqrt(fabs(wrms_l)));
288 obsList.at(M0-1)->owner()->setBaselineClock_F1r(sqrt(fabs(wrms_r)));
292 for (
int i=M0; i<obsList.size()-M0; i++)
314 b_l = (P_l*B_l - A_l*Q_l)/(B_l*B_l - A_l*C_l);
315 a_l = (Q_l - C_l*b_l)/B_l;
316 wrms_l = (R_l + a_l*a_l*A_l + b_l*b_l*C_l + 2.0*(a_l*b_l*B_l - a_l*P_l - b_l*Q_l))/A_l;
317 b_r = (P_r*B_r - A_r*Q_r)/(B_r*B_r - A_r*C_r);
318 a_r = (Q_r - C_r*b_r)/B_r;
319 wrms_r = (R_r + a_r*a_r*A_r + b_r*b_r*C_r + 2.0*(a_r*b_r*B_r - a_r*P_r - b_r*Q_r))/A_r;
353 if (obsList.size()<4)
360 double minWrms, maxWrms;
363 minWrms = maxWrms = obsList.at(iM0)->owner()->getBaselineClock_F1();
373 for (
int i=iM0; i<obsList.size()-iM0; i++)
391 if (maxWrms < obs->owner()->getBaselineClock_F1())
394 if (maxWrms == minWrms)
412 if (obsList.size()-iM0 < minIdx)
434 while (i<obsList.size()-iM0 &&
435 obsList.at(i-1)->owner()->getBaselineClock_F1() <= obsList.at(i)->owner()->getBaselineClock_F1())
446 obsList.at(i)->owner()->getBaselineClock_F1() <= obsList.at(i-1)->owner()->getBaselineClock_F1())
483 ": scan4Ambiguities(): the number of processed observations at the baseline [" +
484 getKey() +
"] is zero; skipping");
489 int num=oList.size(), numUp=0, numDn=0;
490 for (
int i=0; i<num; i++)
499 bool isUp=numUp>numDn;
500 int n=std::max(numUp, numDn);
504 ": scan4Ambiguities(): the number of observations in the good stratum at the baseline [" +
505 getKey() +
"] less than 4; applying simple correction");
506 for (
int i=0; i<oList.size()-1; i++)
508 double closestResidual=oList.at(i)->activeDelay()->getResidual();
516 SgMJD t0 = (*oList.at(oList.size()-1)->owner() - *oList.at(0)->owner())/2.0;
518 for (
int i=0; i<num; i++)
524 x(j) = *o->
owner() - t0;
531 double sA=0.0, sB=0.0, sC=0.0, closestResidual, d;
532 for (
int i=0; i<n; i++)
538 closestResidual = sB/sA;
568 ": scan4Ambiguities(): the number of processed observations at the baseline [" +
569 getKey() +
"] is zero; skipping");
575 double closestResidual;
576 if (obsList.size() <= nAvg)
578 obsList.at(0)->activeDelay()->adjustAmbiguity();
579 closestResidual = obsList.at(0)->activeDelay()->getResidual();
580 for (
int i=0; i<obsList.size()-1; i++)
582 obsList.at(i+1)->activeDelay()->adjustAmbiguity(closestResidual);
583 closestResidual = obsList.at(i+1)->activeDelay()->getResidual();
588 closestResidual = 0.0;
589 for (
int i=0; i<nAvg; i++)
590 closestResidual += obsList.at(i)->activeDelay()->getResidual();
591 closestResidual /= nAvg;
592 for (
int i=0; i<nAvg; i++)
593 obsList.at(i)->activeDelay()->adjustAmbiguity(closestResidual);
594 for (
int i=nAvg; i<obsList.size(); i++)
596 closestResidual = 0.0;
597 for (
int j=0; j<nAvg; j++)
598 closestResidual += obsList.at(i + j - nAvg)->activeDelay()->getResidual();
599 closestResidual /= nAvg;
601 obsList.at(i)->activeDelay()->adjustAmbiguity(closestResidual);
609 closestResidual = fabs(obsList.at(crIdx)->activeDelay()->getResidual());
610 for (
int i=0; i<obsList.size(); i++)
619 closestResidual = obsList.at(crIdx)->activeDelay()->getResidual();
621 obsList.at(crIdx)->activeDelay()->adjustAmbiguity(closestResidual);
622 closestResidual = obsList.at(crIdx)->activeDelay()->getResidual();
624 for (
int i=crIdx; i>0; i--)
626 closestResidual = obsList.at(i)->activeDelay()->getResidual();
627 obsList.at(i-1)->activeDelay()->adjustAmbiguity(closestResidual);
629 for (
int i=crIdx; i<obsList.size()-1; i++)
631 closestResidual = obsList.at(i)->activeDelay()->getResidual();
632 o = obsList.at(i + 1);
633 obsList.at(i+1)->activeDelay()->adjustAmbiguity(closestResidual);
653 if (oList.size() == 0)
656 ": evaluateMeanGrDelResiduals(): the number of processed observations at the baseline [" +
657 getKey() +
"] is zero; skipping");
662 double sA=0.0, sB=0.0, sC=0.0;
664 for (
int i=0; i<oList.size(); i++)
692 shift = deltaN*ambigSpacing;
710 QString name(
getKey().left(8));
711 if (stations.contains(name))
712 stn = stations.value(name);
722 QString name(
getKey().right(8));
723 if (stations.contains(name))
724 stn = stations.value(name);
746 ": setAmbiguities2min(): the number of processed observations at the baseline [" +
747 getKey() +
"] is zero; skipping");
752 int num=oList.size(), meanAmbig;
754 for (
int i=0; i<num; i++)
755 sum += oList.at(i)->activeDelay()->getNumOfAmbiguities();
756 meanAmbig = round(sum/num);
775 if (s.status() != QDataStream::Ok)
778 ": saveIntermediateResults(): error writting data");
781 return s.status() == QDataStream::Ok;
795 if (s.status() != QDataStream::Ok)
798 ": loadIntermediateResults(): error reading data: " +
799 (s.status()==QDataStream::ReadPastEnd?
"read past end of the file":
"read corrupt data"));
805 return s.status()==QDataStream::Ok;
bool isAttr(uint a) const
virtual void write(LogLevel, quint32, const QString &, bool=false)
bool loadIntermediateResults(QDataStream &)
const QString & getKey() const
bool saveIntermediateResults(QDataStream &) const
@ Attr_PROCESSED
the observation has been processed;
double getSolution() const
double getElement(unsigned int i) const
SgVlbiStationInfo * stn_2(QMap< QString, SgVlbiStationInfo * >) const
QList< SgVlbiObservable * > observables_
double meanGrDelResidualsSigma_
void evaluateCBIndicator()
double typicalGrdAmbigSpacing_
QMap< int, int > numOfChanByCount_
QMap< double, int > grdAmbigsBySpacing_
double typicalPhdAmbigSpacing_
SgVlbiStationInfo * stn_1(QMap< QString, SgVlbiStationInfo * >) const
SgClockBreakIndicator * cbIndicator_
double dClockSigma() const
void scan4Ambiguities_m1()
void evaluateMeanGrDelResiduals()
bool loadIntermediateResults(QDataStream &)
void calculateClockF1(SgTaskConfig *)
QString strPhdAmbigsStat_
static const QString className()
bool saveIntermediateResults(QDataStream &) const
double meanGrDelResiduals_
QString strGrdAmbigsStat_
void scan4Ambiguities_m2()
QMap< double, int > phdAmbigsBySpacing_
void shiftAmbiguities(int deltaN)
void setGrdAmbiguities2min()
double getAmbiguitySpacing() const
void adjustAmbiguity(double closestResidual=0.0)
void setNumOfAmbiguities(int)
int getNumOfAmbiguities() const
SgTaskConfig::VlbiDelayType getDelayType() const
double getResidual() const
const SgMJD & epoch() const
SgVlbiObservation * owner()
SgVlbiMeasurement * activeDelay()
@ Attr_PASSED_CL_FN1
the observation participated in the procedure "calc clc fn#1"
void setBaselineClock_F1l(double f)
double getBaselineClock_F1() const
void setBaselineClock_F1(double f)
void setBaselineClock_F1r(double f)