Changeset 6100 in ntrip
- Timestamp:
- Sep 8, 2014, 9:02:33 AM (10 years ago)
- Location:
- trunk/BNC/src/PPP_free
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/PPP_free/pppClient.cpp
r6099 r6100 44 44 45 45 #include "pppClient.h" 46 #include "pppFilter.h"47 46 #include "bncephuser.h" 48 47 #include "bncutils.h" … … 50 49 using namespace BNC_PPP; 51 50 using namespace std; 52 53 // Global variable holding thread-specific pointers54 //////////////////////////////////////////////////////////////////////////////55 QThreadStorage<t_pppClient*> CLIENTS;56 57 // Static function returning thread-specific pointer58 //////////////////////////////////////////////////////////////////////////////59 t_pppClient* t_pppClient::instance() {60 return CLIENTS.localData();61 }62 51 63 52 // Constructor … … 70 59 _log = new ostringstream(); 71 60 _ephUser = new bncEphUser(false); 72 _staID = QByteArray(_opt->_roverName.c_str());73 74 CLIENTS.setLocalData(this); // CLIENTS takes ownership over "this"75 61 } 76 62 -
trunk/BNC/src/PPP_free/pppClient.h
r6099 r6100 31 31 #include "pppInclude.h" 32 32 #include "pppOptions.h" 33 #include "pppFilter.h" 33 34 34 35 class bncEphUser; … … 37 38 namespace BNC_PPP { 38 39 39 class t_pppFilter;40 41 class t_satData {42 public:43 t_satData() {44 obsIndex = 0;45 P1 = 0.0;46 P2 = 0.0;47 P5 = 0.0;48 P3 = 0.0;49 L1 = 0.0;50 L2 = 0.0;51 L5 = 0.0;52 L3 = 0.0;53 }54 ~t_satData() {}55 bncTime tt;56 QString prn;57 double P1;58 double P2;59 double P5;60 double P3;61 double L1;62 double L2;63 double L5;64 double L3;65 ColumnVector xx;66 ColumnVector vv;67 double clk;68 double eleSat;69 double azSat;70 double rho;71 bool slipFlag;72 double lambda3;73 unsigned obsIndex;74 char system() const {return prn.toAscii()[0];}75 };76 77 class t_epoData {78 public:79 t_epoData() {}80 81 ~t_epoData() {82 clear();83 }84 85 void clear() {86 QMapIterator<QString, t_satData*> it(satData);87 while (it.hasNext()) {88 it.next();89 delete it.value();90 }91 satData.clear();92 tt.reset();93 }94 95 void deepCopy(const t_epoData* from) {96 clear();97 tt = from->tt;98 QMapIterator<QString, t_satData*> it(from->satData);99 while (it.hasNext()) {100 it.next();101 satData[it.key()] = new t_satData(*it.value());102 }103 }104 105 unsigned sizeSys(char system) const {106 unsigned ans = 0;107 QMapIterator<QString, t_satData*> it(satData);108 while (it.hasNext()) {109 it.next();110 if (it.value()->system() == system) {111 ++ans;112 }113 }114 return ans;115 }116 unsigned sizeAll() const {return satData.size();}117 118 bncTime tt;119 QMap<QString, t_satData*> satData;120 };121 122 40 class t_pppClient { 123 41 public: … … 129 47 void putClkCorrections(const std::vector<t_clkCorr*>& corr); 130 48 void putBiases(const std::vector<t_satBias*>& satBias); 131 QByteArray staID() const {return _staID;}49 std::ostringstream& log() {return *_log;} 132 50 const t_pppOptions* opt() const {return _opt;} 133 static t_pppClient* instance();134 std::ostringstream& log() {return *_log;}135 51 136 52 private: … … 141 57 bncEphUser* _ephUser; 142 58 t_pppOptions* _opt; 143 QByteArray _staID;144 59 t_epoData* _epoData; 145 60 t_pppFilter* _filter; … … 147 62 }; 148 63 149 } 150 151 #define LOG (BNC_PPP::t_pppClient::instance()->log()) 64 } // namespace 152 65 153 66 #endif -
trunk/BNC/src/PPP_free/pppFilter.cpp
r6094 r6100 62 62 const double GLONASS_WEIGHT_FACTOR = 5.0; 63 63 64 #define LOG (_pppClient->log()) 65 #define OPT (_pppClient->opt()) 66 64 67 // Constructor 65 68 //////////////////////////////////////////////////////////////////////////// … … 152 155 153 156 _pppClient = pppClient; 154 _staID = pppClient->staID();155 _opt = pppClient->opt();156 157 157 _tides = new t_tides(); 158 158 … … 160 160 // ------------------------ 161 161 _antex = 0; 162 if (! _opt->_antexFileName.empty()) {163 _antex = new bncAntex( _opt->_antexFileName.c_str());162 if (!OPT->_antexFileName.empty()) { 163 _antex = new bncAntex(OPT->_antexFileName.c_str()); 164 164 } 165 165 … … 178 178 t_pppFilter::~t_pppFilter() { 179 179 delete _tides; 180 for (int ii = 0; ii < _posAverage.size(); ++ii) {181 delete _posAverage[ii];182 }183 180 delete _antex; 184 181 for (int iPar = 1; iPar <= _params.size(); iPar++) { … … 212 209 _params.push_back(new t_pppParam(t_pppParam::CRD_Z, ++nextPar, "")); 213 210 _params.push_back(new t_pppParam(t_pppParam::RECCLK, ++nextPar, "")); 214 if ( _opt->estTrp()) {211 if (OPT->estTrp()) { 215 212 _params.push_back(new t_pppParam(t_pppParam::TROPO, ++nextPar, "")); 216 213 } 217 if ( _opt->useSystem('R')) {214 if (OPT->useSystem('R')) { 218 215 _params.push_back(new t_pppParam(t_pppParam::GLONASS_OFFSET, ++nextPar, "")); 219 216 } 220 if ( _opt->useSystem('E')) {217 if (OPT->useSystem('E')) { 221 218 _params.push_back(new t_pppParam(t_pppParam::GALILEO_OFFSET, ++nextPar, "")); 222 219 } … … 228 225 pp->xx = 0.0; 229 226 if (pp->isCrd()) { 230 _QQ(iPar,iPar) = _opt->_aprSigCrd(1) * _opt->_aprSigCrd(1);227 _QQ(iPar,iPar) = OPT->_aprSigCrd(1) * OPT->_aprSigCrd(1); 231 228 } 232 229 else if (pp->type == t_pppParam::RECCLK) { 233 _QQ(iPar,iPar) = _opt->_noiseClk * _opt->_noiseClk;230 _QQ(iPar,iPar) = OPT->_noiseClk * OPT->_noiseClk; 234 231 } 235 232 else if (pp->type == t_pppParam::TROPO) { 236 _QQ(iPar,iPar) = _opt->_aprSigTrp * _opt->_aprSigTrp;233 _QQ(iPar,iPar) = OPT->_aprSigTrp * OPT->_aprSigTrp; 237 234 pp->xx = lastTrp; 238 235 } … … 253 250 254 251 if (epoData->sizeSys('G') < MINOBS) { 255 _log +="t_pppFilter::cmpBancroft: not enough data\n";252 LOG << "t_pppFilter::cmpBancroft: not enough data\n"; 256 253 return failure; 257 254 } … … 337 334 if (_antex) { 338 335 bool found; 339 phaseCenter = _antex->pco(QString( _opt->_antNameRover.c_str()), satData->eleSat, found);336 phaseCenter = _antex->pco(QString(OPT->_antNameRover.c_str()), satData->eleSat, found); 340 337 if (!found) { 341 LOG << "ANTEX: antenna >" << _opt->_antNameRover << "< not found\n";338 LOG << "ANTEX: antenna >" << OPT->_antNameRover << "< not found\n"; 342 339 } 343 340 } … … 348 345 double cose = cos(satData->eleSat); 349 346 double sine = sin(satData->eleSat); 350 antennaOffset = - _opt->_neuEccRover(1) * cosa*cose351 - _opt->_neuEccRover(2) * sina*cose352 - _opt->_neuEccRover(3) * sine;347 antennaOffset = -OPT->_neuEccRover(1) * cosa*cose 348 -OPT->_neuEccRover(2) * sina*cose 349 -OPT->_neuEccRover(3) * sine; 353 350 354 351 return satData->rho + phaseCenter + antennaOffset + clk() … … 416 413 // Use different white noise for Quick-Start mode 417 414 // ---------------------------------------------- 418 double sigCrdP_used = _opt->_noiseCrd(1);419 if ( _opt->_seedingTime > 0.0 && _opt->_seedingTime > (epoData->tt - _startTime) ) {415 double sigCrdP_used = OPT->_noiseCrd(1); 416 if ( OPT->_seedingTime > 0.0 && OPT->_seedingTime > (epoData->tt - _startTime) ) { 420 417 sigCrdP_used = 0.0; 421 418 } … … 430 427 if (pp->type == t_pppParam::CRD_X) { 431 428 if (firstCrd) { 432 if ( _opt->xyzAprRoverSet()) {433 pp->xx = _opt->_xyzAprRover[0];429 if (OPT->xyzAprRoverSet()) { 430 pp->xx = OPT->_xyzAprRover[0]; 434 431 } 435 432 else { … … 441 438 else if (pp->type == t_pppParam::CRD_Y) { 442 439 if (firstCrd) { 443 if ( _opt->xyzAprRoverSet()) {444 pp->xx = _opt->_xyzAprRover[1];440 if (OPT->xyzAprRoverSet()) { 441 pp->xx = OPT->_xyzAprRover[1]; 445 442 } 446 443 else { … … 452 449 else if (pp->type == t_pppParam::CRD_Z) { 453 450 if (firstCrd) { 454 if ( _opt->xyzAprRoverSet()) {455 pp->xx = _opt->_xyzAprRover[2];451 if (OPT->xyzAprRoverSet()) { 452 pp->xx = OPT->_xyzAprRover[2]; 456 453 } 457 454 else { … … 469 466 _QQ(iPar, jj) = 0.0; 470 467 } 471 _QQ(iPar,iPar) = _opt->_noiseClk * _opt->_noiseClk;468 _QQ(iPar,iPar) = OPT->_noiseClk * OPT->_noiseClk; 472 469 } 473 470 … … 475 472 // ------------------ 476 473 else if (pp->type == t_pppParam::TROPO) { 477 _QQ(iPar,iPar) += _opt->_noiseTrp * _opt->_noiseTrp;474 _QQ(iPar,iPar) += OPT->_noiseTrp * OPT->_noiseTrp; 478 475 } 479 476 … … 498 495 // Add New Ambiguities if necessary 499 496 // -------------------------------- 500 if ( _opt->ambLCs('G').size() || _opt->ambLCs('R').size() || _opt->ambLCs('E').size()) {497 if (OPT->ambLCs('G').size() || OPT->ambLCs('R').size() || OPT->ambLCs('E').size()) { 501 498 502 499 // Make a copy of QQ and xx, set parameter indices … … 556 553 t_pppParam* par = _params[ii-1]; 557 554 if (par->index_old == 0) { 558 _QQ(par->index, par->index) = _opt->_aprSigAmb * _opt->_aprSigAmb;555 _QQ(par->index, par->index) = OPT->_aprSigAmb * OPT->_aprSigAmb; 559 556 } 560 557 par->index_old = par->index; … … 569 566 Tracer tracer("t_pppFilter::update"); 570 567 571 _log.clear();572 573 568 _time = epoData->tt; // current epoch time 574 569 575 if (_opt->useOrbClkCorr()) { 576 _log += "Precise Point Positioning of Epoch " 577 + QByteArray(_time.timestr(1).c_str()) + 578 "\n---------------------------------------------------------------\n"; 570 if (OPT->useOrbClkCorr()) { 571 LOG << "Precise Point Positioning of Epoch " << _time.timestr(1) 572 << "\n---------------------------------------------------------------\n"; 579 573 } 580 574 else { 581 _log += "Single Point Positioning of Epoch " 582 + QByteArray(_time.timestr(1).c_str()) + 583 "\n--------------------------------------------------------------\n"; 575 LOG << "Single Point Positioning of Epoch " << _time.timestr(1) 576 << "\n--------------------------------------------------------------\n"; 584 577 } 585 578 … … 587 580 // ---------------------- 588 581 if (update_p(epoData) != success) { 589 LOG << _log.data() << endl;590 582 return failure; 591 583 } 592 593 // Remember the Epoch-specific Results for the computation of means594 // ----------------------------------------------------------------595 pppPos* newPos = new pppPos;596 newPos->time = epoData->tt;597 584 598 585 // Set Solution Vector 599 586 // ------------------- 600 ostringstream strB; 601 strB.setf(ios::fixed); 587 LOG.setf(ios::fixed); 602 588 QVectorIterator<t_pppParam*> itPar(_params); 603 589 while (itPar.hasNext()) { 604 590 t_pppParam* par = itPar.next(); 605 606 591 if (par->type == t_pppParam::RECCLK) { 607 strB<< "\n clk = " << setw(10) << setprecision(3) << par->xx608 609 592 LOG << "\n clk = " << setw(10) << setprecision(3) << par->xx 593 << " +- " << setw(6) << setprecision(3) 594 << sqrt(_QQ(par->index,par->index)); 610 595 } 611 596 else if (par->type == t_pppParam::AMB_L3) { 612 597 ++par->numEpo; 613 strB<< "\n amb " << par->prn.toAscii().data() << " = "614 615 616 617 598 LOG << "\n amb " << par->prn.toAscii().data() << " = " 599 << setw(10) << setprecision(3) << par->xx 600 << " +- " << setw(6) << setprecision(3) 601 << sqrt(_QQ(par->index,par->index)) 602 << " nEpo = " << par->numEpo; 618 603 } 619 604 else if (par->type == t_pppParam::TROPO) { 620 605 double aprTrp = delay_saast(M_PI/2.0); 621 strB << "\n trp = " << par->prn.toAscii().data() 622 << setw(7) << setprecision(3) << aprTrp << " " 623 << setw(6) << setprecision(3) << showpos << par->xx << noshowpos 624 << " +- " << setw(6) << setprecision(3) 625 << sqrt(_QQ(par->index,par->index)); 626 newPos->xnt[6] = aprTrp + par->xx; 606 LOG << "\n trp = " << par->prn.toAscii().data() 607 << setw(7) << setprecision(3) << aprTrp << " " 608 << setw(6) << setprecision(3) << showpos << par->xx << noshowpos 609 << " +- " << setw(6) << setprecision(3) 610 << sqrt(_QQ(par->index,par->index)); 627 611 } 628 612 else if (par->type == t_pppParam::GLONASS_OFFSET) { 629 strB<< "\n offGlo = " << setw(10) << setprecision(3) << par->xx630 631 613 LOG << "\n offGlo = " << setw(10) << setprecision(3) << par->xx 614 << " +- " << setw(6) << setprecision(3) 615 << sqrt(_QQ(par->index,par->index)); 632 616 } 633 617 else if (par->type == t_pppParam::GALILEO_OFFSET) { 634 strB << "\n offGal = " << setw(10) << setprecision(3) << par->xx 635 << " +- " << setw(6) << setprecision(3) 636 << sqrt(_QQ(par->index,par->index)); 637 } 638 } 639 strB << '\n'; 640 _log += strB.str().c_str(); 641 LOG << _log.data() << endl; 618 LOG << "\n offGal = " << setw(10) << setprecision(3) << par->xx 619 << " +- " << setw(6) << setprecision(3) 620 << sqrt(_QQ(par->index,par->index)); 621 } 622 } 623 624 LOG << endl; 642 625 643 626 // Final Message (both log file and screen) 644 627 // ---------------------------------------- 645 ostringstream strC; 646 strC.setf(ios::fixed); 647 strC << _staID.data() << " PPP " 648 << epoData->tt.timestr(1) << " " << epoData->sizeAll() << " " 649 << setw(14) << setprecision(3) << x() << " +- " 650 << setw(6) << setprecision(3) << sqrt(_QQ(1,1)) << " " 651 << setw(14) << setprecision(3) << y() << " +- " 652 << setw(6) << setprecision(3) << sqrt(_QQ(2,2)) << " " 653 << setw(14) << setprecision(3) << z() << " +- " 654 << setw(6) << setprecision(3) << sqrt(_QQ(3,3)); 628 LOG << OPT->_roverName << " PPP " 629 << epoData->tt.timestr(1) << " " << epoData->sizeAll() << " " 630 << setw(14) << setprecision(3) << x() << " +- " 631 << setw(6) << setprecision(3) << sqrt(_QQ(1,1)) << " " 632 << setw(14) << setprecision(3) << y() << " +- " 633 << setw(6) << setprecision(3) << sqrt(_QQ(2,2)) << " " 634 << setw(14) << setprecision(3) << z() << " +- " 635 << setw(6) << setprecision(3) << sqrt(_QQ(3,3)); 655 636 656 637 // NEU Output 657 638 // ---------- 658 if (_opt->xyzAprRoverSet()) { 659 newPos->xnt[0] = x() - _opt->_xyzAprRover[0]; 660 newPos->xnt[1] = y() - _opt->_xyzAprRover[1]; 661 newPos->xnt[2] = z() - _opt->_xyzAprRover[2]; 639 if (OPT->xyzAprRoverSet()) { 640 double xyz[3]; 641 xyz[0] = x() - OPT->_xyzAprRover[0]; 642 xyz[1] = y() - OPT->_xyzAprRover[1]; 643 xyz[2] = z() - OPT->_xyzAprRover[2]; 662 644 663 645 double ellRef[3]; 664 xyz2ell(_opt->_xyzAprRover.data(), ellRef); 665 xyz2neu(ellRef, newPos->xnt, &newPos->xnt[3]); 666 667 strC << " NEU " 668 << setw(8) << setprecision(3) << newPos->xnt[3] << " " 669 << setw(8) << setprecision(3) << newPos->xnt[4] << " " 670 << setw(8) << setprecision(3) << newPos->xnt[5] << endl; 671 672 } 673 674 LOG << strC.str() << endl; 675 676 delete newPos; 646 xyz2ell(OPT->_xyzAprRover.data(), ellRef); 647 double neu[3]; 648 xyz2neu(ellRef, xyz, neu); 649 650 LOG << " NEU " 651 << setw(8) << setprecision(3) << neu[0] << " " 652 << setw(8) << setprecision(3) << neu[1] << " " 653 << setw(8) << setprecision(3) << neu[2] << endl; 654 } 655 else { 656 LOG << endl; 657 } 677 658 678 659 _lastTimeOK = _time; // remember time of last successful update … … 695 676 if (iPhase == 1) { 696 677 if (maxResGlo > MAXRES_PHASE_GLONASS) { 697 _log += "Outlier Phase " + prnGlo + " " 698 + QByteArray::number(maxResGlo, 'f', 3) + "\n"; 678 LOG << "Outlier Phase " << prnGlo.toAscii().data() << ' ' << maxResGlo << endl; 699 679 return prnGlo; 700 680 } 701 681 else if (maxResGPS > MAXRES_PHASE_GPS) { 702 _log += "Outlier Phase " + prnGPS + " " 703 + QByteArray::number(maxResGPS, 'f', 3) + "\n"; 682 LOG << "Outlier Phase " << prnGPS.toAscii().data() << ' ' << maxResGPS << endl; 704 683 return prnGPS; 705 684 } 706 685 } 707 686 else if (iPhase == 0 && maxResGPS > MAXRES_CODE) { 708 _log += "Outlier Code " + prnGPS + " " 709 + QByteArray::number(maxResGPS, 'f', 3) + "\n"; 687 LOG << "Outlier Code " << prnGPS.toAscii().data() << ' ' << maxResGPS << endl; 710 688 return prnGPS; 711 689 } … … 894 872 if (iPhase == 1) { 895 873 ll(iObs) = satData->L3 - cmpValue(satData, true); 896 double sigL3 = 2.98 * _opt->_sigmaL1;874 double sigL3 = 2.98 * OPT->_sigmaL1; 897 875 if (satData->system() == 'R') { 898 876 sigL3 *= GLONASS_WEIGHT_FACTOR; … … 911 889 // ----------------- 912 890 else { 913 double sigP3 = 2.98 * _opt->_sigmaC1;891 double sigP3 = 2.98 * OPT->_sigmaC1; 914 892 ll(iObs) = satData->P3 - cmpValue(satData, false); 915 893 PP(iObs,iObs) = 1.0 / (sigP3 * sigP3) / (ellWgtCoef * ellWgtCoef); … … 1006 984 // First update using code observations, then phase observations 1007 985 // ------------------------------------------------------------- 1008 bool usePhase = _opt->ambLCs('G').size() || _opt->ambLCs('R').size() ||1009 _opt->ambLCs('E').size();986 bool usePhase = OPT->ambLCs('G').size() || OPT->ambLCs('R').size() || 987 OPT->ambLCs('E').size(); 1010 988 1011 989 for (int iPhase = 0; iPhase <= (usePhase ? 1 : 0); iPhase++) { … … 1074 1052 if (!usePhase || iPhase == 1) { 1075 1053 if (_outlierGPS.size() > 0 || _outlierGlo.size() > 0) { 1076 _log +="Neglected PRNs: ";1054 LOG << "Neglected PRNs: "; 1077 1055 if (!_outlierGPS.isEmpty()) { 1078 _log += _outlierGPS.last() +' ';1056 LOG << _outlierGPS.last().toAscii().data() << ' '; 1079 1057 } 1080 1058 QStringListIterator itGlo(_outlierGlo); 1081 1059 while (itGlo.hasNext()) { 1082 1060 QString prn = itGlo.next(); 1083 _log += prn +' ';1061 LOG << prn.toAscii().data() << ' '; 1084 1062 } 1085 1063 } 1086 _log += '\n'; 1087 1088 _log += strResCode + strResPhase; 1064 LOG << endl << strResCode.data() << strResPhase.data(); 1089 1065 1090 1066 return success; -
trunk/BNC/src/PPP_free/pppFilter.h
r6093 r6100 42 42 class t_satData; 43 43 class t_tides; 44 45 class t_satData { 46 public: 47 t_satData() { 48 obsIndex = 0; 49 P1 = 0.0; 50 P2 = 0.0; 51 P5 = 0.0; 52 P3 = 0.0; 53 L1 = 0.0; 54 L2 = 0.0; 55 L5 = 0.0; 56 L3 = 0.0; 57 } 58 ~t_satData() {} 59 bncTime tt; 60 QString prn; 61 double P1; 62 double P2; 63 double P5; 64 double P3; 65 double L1; 66 double L2; 67 double L5; 68 double L3; 69 ColumnVector xx; 70 ColumnVector vv; 71 double clk; 72 double eleSat; 73 double azSat; 74 double rho; 75 bool slipFlag; 76 double lambda3; 77 unsigned obsIndex; 78 char system() const {return prn.toAscii()[0];} 79 }; 80 81 class t_epoData { 82 public: 83 t_epoData() {} 84 85 ~t_epoData() { 86 clear(); 87 } 88 89 void clear() { 90 QMapIterator<QString, t_satData*> it(satData); 91 while (it.hasNext()) { 92 it.next(); 93 delete it.value(); 94 } 95 satData.clear(); 96 tt.reset(); 97 } 98 99 void deepCopy(const t_epoData* from) { 100 clear(); 101 tt = from->tt; 102 QMapIterator<QString, t_satData*> it(from->satData); 103 while (it.hasNext()) { 104 it.next(); 105 satData[it.key()] = new t_satData(*it.value()); 106 } 107 } 108 109 unsigned sizeSys(char system) const { 110 unsigned ans = 0; 111 QMapIterator<QString, t_satData*> it(satData); 112 while (it.hasNext()) { 113 it.next(); 114 if (it.value()->system() == system) { 115 ++ans; 116 } 117 } 118 return ans; 119 } 120 unsigned sizeAll() const {return satData.size();} 121 122 bncTime tt; 123 QMap<QString, t_satData*> satData; 124 }; 44 125 45 126 class t_pppParam { … … 136 217 void bancroft(const Matrix& BBpass, ColumnVector& pos); 137 218 138 class pppPos {139 public:140 pppPos() {141 for (int ii = 0; ii < 7; ++ii) {142 xnt[ii] = 0.0;143 }144 }145 bncTime time;146 double xnt[7];147 };148 149 219 t_pppClient* _pppClient; 150 const t_pppOptions* _opt;151 220 bncTime _time; 152 221 bncTime _lastTimeOK; 153 QByteArray _staID;154 222 QVector<t_pppParam*> _params; 155 223 SymmetricMatrix _QQ; … … 159 227 ColumnVector _xcBanc; 160 228 ColumnVector _ellBanc; 161 QByteArray _log;162 229 QMap<QString, double> _windUpTime; 163 230 QMap<QString, double> _windUpSum; 164 QVector<pppPos*> _posAverage;165 231 QStringList _outlierGPS; 166 232 QStringList _outlierGlo;
Note:
See TracChangeset
for help on using the changeset viewer.