Changeset 9635 in ntrip


Ignore:
Timestamp:
Feb 24, 2022, 5:08:42 PM (3 years ago)
Author:
stuerze
Message:

consideration of incoming Code Biases during clock combination

Location:
trunk/BNC/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/bncwindow.cpp

    r9624 r9635  
    496496  _cmbMethodComboBox = new QComboBox();
    497497  _cmbMethodComboBox->setEditable(false);
    498   _cmbMethodComboBox->addItems(QString("Filter,Single-Epoch").split(","));
     498  _cmbMethodComboBox->addItems(QString("Kalman Filter,Single-Epoch").split(","));
    499499  int im = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
    500500  if (im != -1) {
     
    536536  connect(_cmbIrnssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
    537537
     538  _cmbBsxFile      = new qtFileChooser(0, qtFileChooser::File);
     539  _cmbBsxFile->setFileName(settings.value("cmbBsxFile").toString());
     540
    538541  // Upload Results
    539542  // -------------
    540   _uploadTable = new QTableWidget(0,15);
    541   _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Ntrip, User, Password, System, Format, CoM, SP3 File, RNX File, PID, SID, IOD, bytes").split(","));
     543  _uploadTable = new QTableWidget(0,16);
     544  _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Ntrip, User, Password, System, Format, CoM, SP3 File, RNX File, BSX File, PID, SID, IOD, bytes").split(","));
    542545  _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
    543546  _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
     
    553556  _uploadTable->horizontalHeader()->resizeSection( 9,15*ww);
    554557  _uploadTable->horizontalHeader()->resizeSection(10,15*ww);
    555   _uploadTable->horizontalHeader()->resizeSection(11, 4*ww);
     558  _uploadTable->horizontalHeader()->resizeSection(11,15*ww);
    556559  _uploadTable->horizontalHeader()->resizeSection(12, 4*ww);
    557560  _uploadTable->horizontalHeader()->resizeSection(13, 4*ww);
    558   _uploadTable->horizontalHeader()->resizeSection(14,12*ww);
     561  _uploadTable->horizontalHeader()->resizeSection(14, 4*ww);
     562  _uploadTable->horizontalHeader()->resizeSection(15,12*ww);
    559563#if QT_VERSION < 0x050000
    560564  _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
     
    606610  _uploadSamplClkRnxSpinBox->setSuffix(" sec");
    607611
     612  _uploadSamplBiaSnxSpinBox = new QSpinBox;
     613  _uploadSamplBiaSnxSpinBox->setMinimum(0);
     614  _uploadSamplBiaSnxSpinBox->setMaximum(60);
     615  _uploadSamplBiaSnxSpinBox->setSingleStep(5);
     616  _uploadSamplBiaSnxSpinBox->setMaximumWidth(9*ww);
     617  _uploadSamplBiaSnxSpinBox->setValue(settings.value("uploadSamplBiaSnx").toInt());
     618  _uploadSamplBiaSnxSpinBox->setSuffix(" sec");
     619
    608620  int iRowT = _uploadTable->rowCount();
    609621  if (iRowT > 0) {
     
    612624    enableWidget(true, _uploadSamplSp3SpinBox);
    613625    enableWidget(true, _uploadSamplClkRnxSpinBox);
     626    enableWidget(true, _uploadSamplBiaSnxSpinBox);
    614627    enableWidget(true, _uploadAntexFile);
    615628  }
     
    619632    enableWidget(false, _uploadSamplSp3SpinBox);
    620633    enableWidget(false, _uploadSamplClkRnxSpinBox);
     634    enableWidget(true, _uploadSamplBiaSnxSpinBox);
    621635    enableWidget(false, _uploadAntexFile);
    622636  }
     
    12401254
    12411255  populateCmbTable();
    1242   cmbLayout->addWidget(_cmbTable,                                            0, 0, 8, 3);
     1256  cmbLayout->addWidget(_cmbTable,                                                0, 0, 8, 6);
    12431257  cmbLayout->addWidget(new QLabel(" Combine Broadcast Correction streams.<br>"), 1, 6, 1, 10);
    1244   cmbLayout->addWidget(addCmbRowButton,                                      2,  6);
    1245   cmbLayout->addWidget(delCmbRowButton,                                      2,  7);
    1246   cmbLayout->addWidget(new QLabel("Method"),                                 3,  6, Qt::AlignRight);
    1247   cmbLayout->addWidget(_cmbMethodComboBox,                                   3,  7);
    1248   cmbLayout->addWidget(new QLabel(" Maximal residuum"),                      4,  6, Qt::AlignRight);
    1249   cmbLayout->addWidget(_cmbMaxresLineEdit,                                   4,  7, Qt::AlignRight);
    1250   cmbLayout->addWidget(new QLabel("Sampling"),                               5,  6, Qt::AlignRight);
    1251   cmbLayout->addWidget(_cmbSamplSpinBox,                                     5,  7);
    1252   cmbLayout->addWidget(new QLabel("GNSS"),                                   6,  6, Qt::AlignRight);
    1253   cmbLayout->addWidget(new QLabel("Systems"),                                6,  7, Qt::AlignLeft);
    1254   cmbLayout->addWidget(new QLabel("GPS (1W/2W)"),                            6,  8);
    1255   cmbLayout->addWidget(_cmbGpsCheckBox,                                      6,  9);
    1256   cmbLayout->addWidget(new QLabel("GLO (1P/2P)"),                            6, 10);
    1257   cmbLayout->addWidget(_cmbGloCheckBox,                                      6, 11);
    1258   cmbLayout->addWidget(new QLabel("Galileo (1C/5Q)"),                        6, 12);
    1259   cmbLayout->addWidget(_cmbGalCheckBox,                                      6, 13);
    1260   cmbLayout->addWidget(new QLabel("Beidou (2I/6I)"),                         6, 14);
    1261   cmbLayout->addWidget(_cmbBdsCheckBox,                                      6, 15);
    1262   cmbLayout->addWidget(new QLabel("QZSS (1C/2L)"),                           7,  8);
    1263   cmbLayout->addWidget(_cmbQzssCheckBox,                                     7,  9);
    1264   cmbLayout->addWidget(new QLabel("SBAS (1C/5Q)"),                           7, 10);
    1265   cmbLayout->addWidget(_cmbSbasCheckBox,                                     7, 11);
    1266   cmbLayout->addWidget(new QLabel("IRNSS"),                                  7, 12);
    1267   cmbLayout->addWidget(_cmbIrnssCheckBox,                                    7, 13);
    1268   cmbLayout->setRowStretch(6, 999);
     1258  cmbLayout->addWidget(addCmbRowButton,                                          2,  6);
     1259  cmbLayout->addWidget(delCmbRowButton,                                          2,  7);
     1260  cmbLayout->addWidget(new QLabel("Method"),                                     3,  6, Qt::AlignLeft);
     1261  cmbLayout->addWidget(_cmbMethodComboBox,                                       3,  7);
     1262  cmbLayout->addWidget(new QLabel("BSX File"),                                   4,  6, Qt::AlignLeft);
     1263  cmbLayout->addWidget(_cmbBsxFile,                                              4,  7, Qt::AlignRight);
     1264  cmbLayout->addWidget(new QLabel("Max Residual"),                               5,  6, Qt::AlignLeft);
     1265  cmbLayout->addWidget(_cmbMaxresLineEdit,                                       5,  7, Qt::AlignRight);
     1266  cmbLayout->addWidget(new QLabel("Sampling"),                                   6,  6, Qt::AlignLeft);
     1267  cmbLayout->addWidget(_cmbSamplSpinBox,                                         6,  7, Qt::AlignRight);
     1268  cmbLayout->addWidget(new QLabel("GNSS"),                                       7,  6, Qt::AlignLeft);
     1269  cmbLayout->addWidget(new QLabel("GPS (1W/2W)"),                                7,  7);
     1270  cmbLayout->addWidget(_cmbGpsCheckBox,                                          7,  8);
     1271  cmbLayout->addWidget(new QLabel("GLONASS (1P/2P)"),                            7,  9);
     1272  cmbLayout->addWidget(_cmbGloCheckBox,                                          7, 10);
     1273  cmbLayout->addWidget(new QLabel("Galileo (1C/5Q)"),                            7, 11);
     1274  cmbLayout->addWidget(_cmbGalCheckBox,                                          7, 12);
     1275  cmbLayout->addWidget(new QLabel("Beidou (2I/6I)"),                             7, 13);
     1276  cmbLayout->addWidget(_cmbBdsCheckBox,                                          7, 14);
     1277  cmbLayout->addWidget(new QLabel("QZSS (1C/2L)"),                               8,  7);
     1278  cmbLayout->addWidget(_cmbQzssCheckBox,                                         8,  8);
     1279  cmbLayout->addWidget(new QLabel("SBAS (1C/5Q)"),                               8,  9);
     1280  cmbLayout->addWidget(_cmbSbasCheckBox,                                         8, 10);
     1281  cmbLayout->addWidget(new QLabel("IRNSS"),                                      8, 11);
     1282  cmbLayout->addWidget(_cmbIrnssCheckBox,                                        8, 12);
     1283  cmbLayout->setRowStretch(8, 999);
    12691284
    12701285  connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
     
    12911306  uploadHlpLayout->addWidget(new QLabel("RNX"),                   0, 8, Qt::AlignRight);
    12921307  uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox,           0, 9);
    1293   uploadHlpLayout->addWidget(setUploadTrafoButton,                0,10);
     1308  uploadHlpLayout->addWidget(new QLabel("BSX"),                   0,10, Qt::AlignRight);
     1309  uploadHlpLayout->addWidget(_uploadSamplBiaSnxSpinBox,           0,11);
     1310  uploadHlpLayout->addWidget(setUploadTrafoButton,                0,12);
    12941311  uploadHlpLayout->addWidget(new QLabel("ANTEX file"),            1, 0, Qt::AlignLeft);
    12951312  uploadHlpLayout->addWidget(_uploadAntexFile,                    1, 1, 1, 4);
     
    14791496  _cmbMaxresLineEdit->setWhatsThis(tr("<p>BNC combines all incoming clocks according to specified weights. Individual clock estimates that differ by more than 'Maximal residuum' meters from the average of all clocks will be ignored.<p></p>It is suggested to specify a value of about 0.2 m for the Kalman filter combination approach and a value of about 3.0 meters for the Single-Epoch combination approach.</p><p>Default is a value of '999.0'. <i>[key: cmbMaxres]</i></p>"));
    14801497  _cmbSamplSpinBox->setWhatsThis(tr("<p>Select a combination Sampling interval for the clocks. Clock corrections will be produced following that interval.</p><p>A value of 10 sec may be an appropriate choice. <i>[key: cmbSampl]</i></p>"));
    1481   _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS corrections shall be combined. <i>[key: cmbGps]</i></p>"));
    1482   _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS corrections shall be combined; GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
    1483   _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
    1484   _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
    1485   _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
    1486   _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
    1487   _cmbIrnssCheckBox->setWhatsThis(tr("<p>IRNSS corrections shall be combined; IRNSS Broadcast ephemeris and corrections are required. <i>[key: cmbIrnss]</i></p>"));
     1498  _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS clock corrections shall be combined. <i>[key: cmbGps]</i></p>"));
     1499  _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS clock corrections shall be combined; GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
     1500  _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo clock corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
     1501  _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou clock corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
     1502  _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS clock corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
     1503  _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS clock corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
     1504  _cmbIrnssCheckBox->setWhatsThis(tr("<p>IRNSS clock corrections shall be combined; IRNSS Broadcast ephemeris and corrections are required. <i>[key: cmbIrnss]</i></p>"));
     1505  _cmbBsxFile->setWhatsThis(tr("<p> Specify a Bias SINEX File that will be used to add satellite code biases to the combined clocks. <i>[key: cmbBsxFile]</i></p>"));
    14881506
    14891507  // WhatsThis, Upload Corrections
     
    14961514  _uploadSamplSp3SpinBox->setWhatsThis(tr("<p>Select a SP3 orbit file sampling interval in minutes.</p><p>A value of zero '0' tells BNC to store all available samples into SP3 orbit files. <i>[key: uploadSamplSp3]</i></p>"));
    14971515  _uploadSamplClkRnxSpinBox->setWhatsThis(tr("<p>Select a Clock RINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Clock RINEX files. <i>[key: uploadSamplClkRnx]</i></p>"));
     1516  _uploadSamplBiaSnxSpinBox->setWhatsThis(tr("<p>Select a Bias SINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Bias SINEX files. <i>[key: uploadSamplBiaSnx]</i></p>"));
    14981517  setUploadTrafoButton->setWhatsThis(tr("<p>Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation via option 'System'.</p>"));
    14991518  _uploadAntexFile->setWhatsThis(tr("<p>When producing SP3 files or referring orbit and clock corrections to the satellite's Center of Mass (CoM) instead Antenna Phase Center (APC), an offset has to be applied which is available from the IGS 'ANTEX file'. You must therefore specify an 'ANTEX file' path if you want to save the stream content in SP3 format and/or refer correctors to CoM.</p><p>If you don't specify an 'ANTEX file' path, the SP3 file content as well as the orbit and clock correctors will be referred to satellite APCs. <i>[key: uploadAntexFile]</i></p>"));
     
    16221641  delete _cmbSbasCheckBox;
    16231642  delete _cmbIrnssCheckBox;
     1643  delete _cmbBsxFile;
    16241644  _uploadEphTable->deleteLater();
    16251645  delete _uploadSamplRtcmEphCorrSpinBox;
     
    16301650  delete _uploadSamplSp3SpinBox;
    16311651  delete _uploadSamplClkRnxSpinBox;
     1652  delete _uploadSamplBiaSnxSpinBox;
    16321653  delete _reqcActionComboBox;
    16331654  delete _reqcObsFileChooser;
     
    21062127  settings.setValue("cmbSbas",       _cmbSbasCheckBox->checkState());
    21072128  settings.setValue("cmbIrnss",      _cmbIrnssCheckBox->checkState());
     2129  settings.setValue("cmbBsxFile",    _cmbBsxFile->fileName());
    21082130
    21092131// Upload Corrections
     
    21182140  settings.setValue("uploadSamplSp3",         _uploadSamplSp3SpinBox->value());
    21192141  settings.setValue("uploadSamplClkRnx",      _uploadSamplClkRnxSpinBox->value());
     2142  settings.setValue("uploadSamplBiaSnx",      _uploadSamplBiaSnxSpinBox->value());
    21202143  settings.setValue("uploadAntexFile",        _uploadAntexFile->fileName());
    21212144// Upload Ephemeris
     
    26292652      enableWidget(true, _cmbSbasCheckBox);
    26302653      enableWidget(true, _cmbIrnssCheckBox);
     2654      enableWidget(true, _cmbBsxFile);
    26312655    }
    26322656    else {
     
    26412665      enableWidget(false, _cmbSbasCheckBox);
    26422666      enableWidget(false, _cmbIrnssCheckBox);
     2667      enableWidget(false, _cmbBsxFile);
    26432668    }
    26442669  }
     
    26512676    enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
    26522677    enableWidget(true, _uploadSamplClkRnxSpinBox);
     2678    enableWidget(true, _uploadSamplBiaSnxSpinBox);
    26532679    enableWidget(true, _uploadSamplSp3SpinBox);
    26542680    enableWidget(true, _uploadAntexFile);
     
    26582684    enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
    26592685    enableWidget(false, _uploadSamplClkRnxSpinBox);
     2686    enableWidget(false, _uploadSamplBiaSnxSpinBox);
    26602687    enableWidget(false, _uploadSamplSp3SpinBox);
    26612688    enableWidget(false, _uploadAntexFile);
     
    28082835      _uploadTable->setCellWidget(iRow, iCol, com);
    28092836    }
    2810     else if (iCol == 14) {
     2837    else if (iCol == 15) {
    28112838      bncTableItem* bncIt = new bncTableItem();
    28122839      bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
     
    29162943        _uploadTable->setCellWidget(iRow, iCol, com);
    29172944      }
    2918       else if (iCol == 14) {
     2945      else if (iCol == 15) {
    29192946        bncTableItem* bncIt = new bncTableItem();
    29202947        bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
  • trunk/BNC/src/bncwindow.h

    r9292 r9635  
    225225    QCheckBox*     _cmbSbasCheckBox;
    226226    QCheckBox*     _cmbIrnssCheckBox;
     227    qtFileChooser* _cmbBsxFile;
    227228
    228229    QTableWidget*  _uploadTable;
     
    231232    QSpinBox*      _uploadSamplSp3SpinBox;
    232233    QSpinBox*      _uploadSamplClkRnxSpinBox;
     234    QSpinBox*      _uploadSamplBiaSnxSpinBox;
    233235    qtFileChooser* _uploadAntexFile;
    234236
  • trunk/BNC/src/combination/bnccomb.cpp

    r9546 r9635  
    1818#include <iomanip>
    1919#include <sstream>
     20#include <map>
    2021
    2122#include "bnccomb.h"
     
    472473    }
    473474
    474     // Check satellite code biases
    475     // ----------------------------
    476     if (!_satCodeBiases.contains(acName)) {
    477       delete newCorr;
    478       continue;
    479     }
    480     else {
    481       QMap<t_prn, t_satCodeBias>& storage = _satCodeBiases[acName];
    482       if (!storage.contains(clkCorr._prn)) {
    483         delete newCorr;
    484         continue;
    485       }
    486       else {
    487         newCorr->_satCodeBias = storage[clkCorr._prn];
    488       }
    489     }
    490 
    491475    // Check the Ephemeris
    492476    //--------------------
     
    520504        continue;
    521505      }
     506    }
     507
     508    // Check satellite code biases
     509    // ----------------------------
     510    if (!_satCodeBiases.contains(acName)) {
     511      delete newCorr;
     512      continue;
     513    }
     514    else {
     515      QMap<t_prn, t_satCodeBias>& storage = _satCodeBiases[acName];
     516      if (!storage.contains(clkCorr._prn)) {
     517        delete newCorr;
     518        continue;
     519      }
     520      else {
     521        t_satCodeBias& satCodeBias = storage[clkCorr._prn];
     522        QMap<t_frequency::type, double> codeBias;
     523        for (unsigned ii = 1; ii < t_lcRefSig::cIF; ii++) {
     524          t_frequency::type frqType = t_lcRefSig::toFreq(sys,  static_cast<t_lcRefSig::type>(ii));
     525          char frqNum = t_frequency::toString(frqType)[1];
     526          char attrib = t_lcRefSig::toAttrib(sys,  static_cast<t_lcRefSig::type>(ii));
     527          QString obsType = QString("%1%2").arg(frqNum).arg(attrib);
     528          for (unsigned ii = 0; ii < satCodeBias._bias.size(); ii++) {
     529            const t_frqCodeBias& bias = satCodeBias._bias[ii];
     530            if (obsType.toStdString() == bias._rnxType2ch) {
     531              codeBias[frqType] = bias._value;
     532            }
     533          }
     534        }
     535        map<t_frequency::type, double> codeCoeff;
     536        double channel = double(newCorr->_eph->slotNum());
     537        t_lcRefSig::coeff(sys, t_lcRefSig::cIF, channel, codeCoeff);
     538        map<t_frequency::type, double>::const_iterator it;
     539        for (it = codeCoeff.begin(); it != codeCoeff.end(); it++) {
     540          t_frequency::type frqType = it->first;
     541          newCorr->_codeBiasIF += it->second * codeBias[frqType];
     542        }
     543      }
     544      cout <<  acName.toStdString() << " " << clkCorr._prn.toString().c_str() << " _codeBiasIF: " << newCorr->_codeBiasIF << endl;
    522545    }
    523546
     
    597620  QTextStream out(&_log, QIODevice::WriteOnly);
    598621
    599   out << endl <<           "Combination: " << sys << endl
    600       << "--------------------------------" << endl;
     622  out << "\n" <<           "Combination: " << sys << "\n"
     623      << "--------------------------------" << "\n";
    601624
    602625  // Observation Statistics
     
    617640      }
    618641    }
    619     out << AC->name.toLatin1().data() << ": " << AC->numObs[sys] << endl;
     642    out << AC->name.toLatin1().data() << ": " << AC->numObs[sys] << "\n";
    620643  }
    621644
     
    629652    ++_masterMissingEpochs[sys];
    630653    if (_masterMissingEpochs[sys] < switchMasterAfterGap) {
    631       out << "Missing Master, Epoch skipped" << endl;
     654      out << "Missing Master, Epoch skipped" << "\n";
    632655      _buffer[sys].remove(_resTime);
    633656      emit newMessage(_log, false);
     
    644667              << AC->name.toLatin1().data()   << " "
    645668              << _resTime.datestr().c_str()    << " "
    646               << _resTime.timestr().c_str()    << endl;
     669              << _resTime.timestr().c_str()    << "\n";
    647670          _masterOrbitAC[sys] = AC->name;
    648671          break;
     
    682705      out.setRealNumberPrecision(4);
    683706      out << pp->toString(sys) << " "
    684           << pp->xx << " +- " << sqrt(_QQ[sys](pp->index,pp->index)) << endl;
     707          << pp->xx << " +- " << sqrt(_QQ[sys](pp->index,pp->index)) << "\n";
    685708      out.setFieldWidth(0);
    686709    }
     
    762785      }
    763786
    764       out << "  Outlier" << endl;
     787      out << "  Outlier" << "\n";
    765788      _QQ[sys] = QQ_sav;
    766789      corrs(sys).remove(maxResIndex-1);
    767790    }
    768791    else {
    769       out << "  OK" << endl;
     792      out << "  OK" << "\n";
    770793      out.setRealNumberNotation(QTextStream::FixedNotation);
    771794      out.setRealNumberPrecision(4);
     
    776799            << corr->_acName << ' ' << corr->_prn.mid(0,3);
    777800        out.setFieldWidth(10);
    778         out <<  " res = " << vv[ii] << endl;
     801        out <<  " res = " << vv[ii] << "\n";
    779802        out.setFieldWidth(0);
    780803      }
     
    807830      out << "Full Clock " << corr->_prn.mid(0,3) << " " << corr->_iod << " ";
    808831      out.setFieldWidth(14);
    809       out << (xc(4) + corr->_dClkResult) * t_CST::c << endl;
     832      out << (xc(4) + corr->_dClkResult) * t_CST::c << "\n";
    810833      out.setFieldWidth(0);
    811834    }
    812835    else {
    813       out << "bncComb::printResuls bug" << endl;
     836      out << "bncComb::printResuls bug" << "\n";
    814837    }
    815838  }
     
    958981    }
    959982
    960     ll(iObs) = corr->_clkCorr._dClk * t_CST::c - DotProduct(AA.Row(iObs), x0);
     983    ll(iObs) = (corr->_clkCorr._dClk * t_CST::c - corr->_codeBiasIF) - DotProduct(AA.Row(iObs), x0);
    961984  }
    962985
     
    11171140    }
    11181141    catch (Exception& exc) {
    1119       out << exc.what() << endl;
     1142      out << exc.what() << "\n";
    11201143      return failure;
    11211144    }
     
    11301153
    11311154    if (maxRes > _MAXRES) {
    1132       out << "  Outlier" << endl;
     1155      out << "  Outlier" << "\n";
    11331156      delete corrs(sys)[maxResIndex-1];
    11341157      corrs(sys).remove(maxResIndex-1);
    11351158    }
    11361159    else {
    1137       out << "  OK" << endl;
     1160      out << "  OK" << "\n";
    11381161      out.setRealNumberNotation(QTextStream::FixedNotation);
    11391162      out.setRealNumberPrecision(3);
     
    11441167            << corr->_acName << ' ' << corr->_prn.mid(0,3);
    11451168        out.setFieldWidth(6);
    1146         out << " res = " << vv[ii] << endl;
     1169        out << " res = " << vv[ii] << "\n";
    11471170        out.setFieldWidth(0);
    11481171      }
     
    11721195
    11731196    if      (ephLast == 0) {
    1174       out << "checkOrbit: missing eph (not found) " << corr->_prn.mid(0,3) << endl;
     1197      out << "checkOrbit: missing eph (not found) " << corr->_prn.mid(0,3) << "\n";
    11751198      delete corr;
    11761199      im.remove();
    11771200    }
    11781201    else if (corr->_eph == 0) {
    1179       out << "checkOrbit: missing eph (zero) " << corr->_prn.mid(0,3) << endl;
     1202      out << "checkOrbit: missing eph (zero) " << corr->_prn.mid(0,3) << "\n";
    11801203      delete corr;
    11811204      im.remove();
     
    11861209      }
    11871210      else {
    1188         out << "checkOrbit: missing eph (deleted) " << corr->_prn.mid(0,3) << endl;
     1211        out << "checkOrbit: missing eph (deleted) " << corr->_prn.mid(0,3) << "\n";
    11891212        delete corr;
    11901213        im.remove();
     
    12681291              << prn.mid(0,3).toLatin1().data()           << " "
    12691292              << corr->_iod                     << " "
    1270               << norm                           << endl;
     1293              << norm                           << "\n";
    12711294          delete corr;
    12721295          im.remove();
     
    13011324      out << "Provider ID changed: AC " << AC->name.toLatin1().data()   << " "
    13021325          << _resTime.datestr().c_str()    << " "
    1303           << _resTime.timestr().c_str()    << endl;
     1326          << _resTime.timestr().c_str()    << "\n";
    13041327      break;
    13051328    }
  • trunk/BNC/src/combination/bnccomb.h

    r9530 r9635  
    44
    55#include <fstream>
     6#include <map>
    67#include <newmat.h>
    78#include "bncephuser.h"
    89#include "satObs.h"
     10#include "bncconst.h"
    911#include "../RTCM3/clock_and_orbit/clock_orbit_rtcm.h"
    1012#include "../RTCM3/clock_and_orbit/clock_orbit_igs.h"
     
    8082      _iod        = 0;
    8183      _dClkResult = 0.0;
     84      _codeBiasIF   = 0.0;
    8285    }
    8386    ~cmbCorr() {}
     
    9093    t_satCodeBias _satCodeBias;
    9194    QString       _acName;
     95    double        _codeBiasIF;
    9296    double        _dClkResult;
    9397    ColumnVector  _diffRao;
     
    106110    QVector<cmbCorr*> corrs;
    107111  };
     112
     113  class t_lcRefSig {
     114   public:
     115    enum type {dummy = 0, c1, c2, cIF};
     116
     117    static t_frequency::type toFreq(char sys, type tt) {
     118      switch (tt) {
     119      case c1:
     120        if      (sys == 'G') return t_frequency::G1;
     121        else if (sys == 'R') return t_frequency::R1;
     122        else if (sys == 'E') return t_frequency::E1;
     123        else if (sys == 'C') return t_frequency::C2;
     124        else if (sys == 'J') return t_frequency::J1;
     125        else if (sys == 'S') return t_frequency::S1;
     126        else                 return t_frequency::dummy;
     127      case c2:
     128        if      (sys == 'G') return t_frequency::G2;
     129        else if (sys == 'R') return t_frequency::R2;
     130        else if (sys == 'E') return t_frequency::E5;
     131        else if (sys == 'C') return t_frequency::C6;
     132        else if (sys == 'J') return t_frequency::J2;
     133        else if (sys == 'S') return t_frequency::S5;
     134        else                 return t_frequency::dummy;
     135      case dummy:
     136      case cIF:
     137        return t_frequency::dummy;
     138      }
     139      return t_frequency::dummy;
     140    }
     141
     142    static char toAttrib(char sys, type LC) {
     143      switch (LC) {
     144        case c1:
     145          if      (sys == 'G') return 'W';
     146          else if (sys == 'R') return 'P';
     147          else if (sys == 'E') return 'C';
     148          else if (sys == 'C') return 'I';
     149          else if (sys == 'J') return 'C';
     150          else if (sys == 'S') return 'C';
     151          break;
     152        case c2:
     153          if      (sys == 'G') return 'W';
     154          else if (sys == 'R') return 'P';
     155          else if (sys == 'E') return 'Q';
     156          else if (sys == 'C') return 'I';
     157          else if (sys == 'J') return 'L';
     158          else if (sys == 'S') return 'Q';
     159          break;
     160      case dummy:
     161      case cIF:
     162        return '_';
     163        break;
     164      }
     165      return '_';
     166    }
     167
     168      static void coeff(char sys, type tLC, double channel, std::map<t_frequency::type, double>& codeCoeff)  {
     169      codeCoeff.clear();
     170      t_frequency::type fType1 = toFreq(sys, c1);
     171      t_frequency::type fType2 = toFreq(sys, c2);
     172      double f1 = t_CST::freq(fType1, channel);
     173      double f2 = t_CST::freq(fType2, channel);
     174      switch (tLC) {
     175        case c1:
     176          codeCoeff[fType1] = 1.0;
     177          return;
     178        case c2:
     179          codeCoeff[fType2] = 1.0;
     180          return;
     181        case cIF:
     182          codeCoeff[fType1] =  f1 * f1 / (f1 * f1 - f2 * f2);
     183          codeCoeff[fType2] = -f2 * f2 / (f1 * f1 - f2 * f2);
     184          return;
     185        case t_lcRefSig::dummy:
     186          return;
     187      }
     188      return;
     189    }
     190  };
     191
    108192
    109193  void  processEpoch(char sys);
     
    134218  e_method                                   _method;
    135219  int                                        _cmbSampl;
     220  QString                                    _cmbRefAttributes;
    136221  QMap<QString, QMap<t_prn, t_orbCorr> >     _orbCorrections;
    137222  QMap<QString, QMap<t_prn, t_satCodeBias> > _satCodeBiases;
Note: See TracChangeset for help on using the changeset viewer.