00001 #pragma ident "$Id: DataStructures.hpp 2960 2011-11-02 05:01:16Z yanweignss $"
00002
00008 #ifndef GPSTK_DATASTRUCTURES_HPP
00009 #define GPSTK_DATASTRUCTURES_HPP
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <utility>
00035 #include <vector>
00036 #include <set>
00037 #include <map>
00038 #include <string>
00039
00040 #include "DataHeaders.hpp"
00041 #include "FFData.hpp"
00042 #include "RinexObsStream.hpp"
00043 #include "RinexObsData.hpp"
00044 #include "StringUtils.hpp"
00045 #include "Vector.hpp"
00046 #include "Matrix.hpp"
00047 #include "icd_200_constants.hpp"
00048
00049
00050
00051 namespace gpstk
00052 {
00053
00113
00114
00115
00116
00117
00121 NEW_EXCEPTION_CLASS(TypeIDNotFound, gpstk::Exception);
00122
00123
00127 NEW_EXCEPTION_CLASS(SatIDNotFound, gpstk::Exception);
00128
00129
00133 NEW_EXCEPTION_CLASS(SourceIDNotFound, gpstk::Exception);
00134
00135
00139 NEW_EXCEPTION_CLASS(DayTimeNotFound, gpstk::Exception);
00140
00141
00145 NEW_EXCEPTION_CLASS(ValueNotFound, gpstk::Exception);
00146
00147
00151 NEW_EXCEPTION_CLASS(NumberOfTypesMismatch, gpstk::Exception);
00152
00153
00157 NEW_EXCEPTION_CLASS(NumberOfSatsMismatch, gpstk::Exception);
00158
00159
00160
00161
00163 typedef std::set<TypeID> TypeIDSet;
00164
00166 typedef std::set<SatID> SatIDSet;
00167
00169 typedef std::set<SourceID> SourceIDSet;
00170
00171
00173 struct typeValueMap : std::map<TypeID, double>
00174 {
00175
00177 inline size_t numTypes() const
00178 { return (*this).size(); }
00179
00180
00183 TypeIDSet getTypeID() const;
00184
00185
00188 typeValueMap extractTypeID(const TypeID& type) const;
00189
00190
00194 typeValueMap extractTypeID(const TypeIDSet& typeSet) const;
00195
00196
00199 typeValueMap& keepOnlyTypeID(const TypeID& type);
00200
00201
00205 typeValueMap& keepOnlyTypeID(const TypeIDSet& typeSet);
00206
00207
00210 typeValueMap& removeTypeID(const TypeID& type)
00211 { (*this).erase(type); return (*this); }
00212
00213
00217 typeValueMap& removeTypeID(const TypeIDSet& typeSet);
00218
00219
00224 double getValue(const TypeID& type) const
00225 throw(TypeIDNotFound);
00226
00227
00231 double& operator()(const TypeID& type)
00232 throw(TypeIDNotFound);
00233
00234
00236 virtual ~typeValueMap() {};
00237
00238 };
00239
00240
00241
00243 struct satValueMap : std::map<SatID, double>
00244 {
00245
00247 size_t numSats() const
00248 { return (*this).size(); }
00249
00250
00252 SatIDSet getSatID() const;
00253
00254
00256 Vector<SatID> getVectorOfSatID() const;
00257
00258
00261 satValueMap extractSatID(const SatID& satellite) const;
00262
00263
00268 satValueMap extractSatID( const int& p,
00269 const SatID::SatelliteSystem& s ) const;
00270
00271
00275 satValueMap extractSatID(const SatIDSet& satSet) const;
00276
00277
00280 satValueMap& keepOnlySatID(const SatID& satellite);
00281
00282
00286 satValueMap& keepOnlySatID( const int& p,
00287 const SatID::SatelliteSystem& s );
00288
00289
00292 satValueMap& keepOnlySatID(const SatIDSet& satSet);
00293
00294
00297 satValueMap& removeSatID(const SatID& satellite)
00298 { (*this).erase(satellite); return (*this); }
00299
00300
00304 satValueMap& removeSatID(const SatIDSet& satSet);
00305
00306
00311 double getValue(const SatID& satellite) const
00312 throw(SatIDNotFound);
00313
00314
00318 double& operator()(const SatID& satellite)
00319 throw(SatIDNotFound);
00320
00321
00323 virtual ~satValueMap() {};
00324
00325 };
00326
00327
00328
00330 struct satTypeValueMap : std::map<SatID, typeValueMap>
00331 {
00332
00334 size_t numSats() const
00335 { return (*this).size(); }
00336
00337
00342 size_t numElements() const;
00343
00344
00346 SatIDSet getSatID() const;
00347
00348
00350 Vector<SatID> getVectorOfSatID() const;
00351
00352
00356 TypeIDSet getTypeID() const;
00357
00358
00361 satTypeValueMap extractSatID(const SatID& satellite) const;
00362
00363
00368 satTypeValueMap extractSatID( const int& p,
00369 const SatID::SatelliteSystem& s) const;
00370
00371
00375 satTypeValueMap extractSatID(const SatIDSet& satSet) const;
00376
00377
00380 satTypeValueMap& keepOnlySatID(const SatID& satellite);
00381
00382
00386 satTypeValueMap& keepOnlySatID( const int& p,
00387 const SatID::SatelliteSystem& s );
00388
00389
00392 satTypeValueMap& keepOnlySatID(const SatIDSet& satSet);
00393
00394
00397 satTypeValueMap extractTypeID(const TypeID& type) const;
00398
00399
00403 satTypeValueMap extractTypeID(const TypeIDSet& typeSet) const;
00404
00405
00408 satTypeValueMap& keepOnlyTypeID(const TypeID& type);
00409
00410
00414 satTypeValueMap& keepOnlyTypeID(const TypeIDSet& typeSet);
00415
00416
00419 satTypeValueMap& removeSatID(const SatID& satellite)
00420 { (*this).erase(satellite); return (*this); }
00421
00422
00426 satTypeValueMap& removeSatID(const SatIDSet& satSet);
00427
00428
00431 satTypeValueMap& removeTypeID(const TypeID& type);
00432
00433
00437 satTypeValueMap& removeTypeID(const TypeIDSet& typeSet);
00438
00439
00444 Vector<double> getVectorOfTypeID(const TypeID& type) const;
00445
00446
00449 Matrix<double> getMatrixOfTypes(const TypeIDSet& typeSet) const;
00450
00451
00467 satTypeValueMap& insertTypeIDVector( const TypeID& type,
00468 const Vector<double> dataVector )
00469 throw(NumberOfSatsMismatch);
00470
00471
00491 satTypeValueMap& insertMatrix( const TypeIDSet& typeSet,
00492 const Matrix<double> dataMatrix )
00493 throw(NumberOfSatsMismatch, NumberOfTypesMismatch);
00494
00495
00502 double getValue( const SatID& satellite,
00503 const TypeID& type ) const
00504 throw( SatIDNotFound, TypeIDNotFound );
00505
00506
00509 typeValueMap& operator()(const SatID& satellite)
00510 throw(SatIDNotFound);
00511
00512
00514 virtual std::ostream& dump( std::ostream& s,
00515 int mode = 0) const;
00516
00517
00519 virtual ~satTypeValueMap() {};
00520
00521 };
00522
00523
00524
00526 std::ostream& operator<<( std::ostream& s,
00527 const satTypeValueMap& stvMap);
00528
00529
00530
00532 typedef std::map<DayTime, satTypeValueMap> epochSatTypeValueMap;
00533
00535 typedef std::map<DayTime, satValueMap> epochSatValueMap;
00536
00538 typedef std::map<DayTime, typeValueMap> epochTypeValueMap;
00539
00540
00541
00542
00544 template <class HEADER_CLASS, class BODY_CLASS>
00545 struct gnssData
00546 {
00547
00549 HEADER_CLASS header;
00550
00551
00553 BODY_CLASS body;
00554
00555
00556
00558 gnssData() {}
00559
00560
00562 gnssData( const HEADER_CLASS& h,
00563 const BODY_CLASS& b )
00564 {
00565 header = h;
00566 body = b;
00567 }
00568
00569
00571 template<class H, class B>
00572 gnssData(const gnssData<H,B>& g)
00573 {
00574 header = g.header;
00575 body = g.body;
00576 }
00577
00578
00580 virtual ~gnssData() {};
00581
00582 };
00583
00584
00585
00586
00587
00588
00591 struct gnssSatValue : gnssData<sourceEpochTypeHeader, satValueMap>
00592 {
00593
00594
00597 size_t numSats() const
00598 { return body.numSats(); };
00599
00600
00602 SatIDSet getSatID() const
00603 { return (*this).body.getSatID(); }
00604
00605
00607 Vector<SatID> getVectorOfSatID() const
00608 { return body.getVectorOfSatID(); }
00609
00610
00613 gnssSatValue extractSatID(const SatID& satellite) const;
00614
00615
00620 gnssSatValue extractSatID( const int& p,
00621 const SatID::SatelliteSystem& s ) const;
00622
00623
00627 gnssSatValue extractSatID(const SatIDSet& satSet) const;
00628
00629
00632 gnssSatValue& keepOnlySatID(const SatID& satellite);
00633
00634
00638 gnssSatValue& keepOnlySatID( const int& p,
00639 const SatID::SatelliteSystem& s );
00640
00641
00644 gnssSatValue& keepOnlySatID(const SatIDSet& satSet);
00645
00646
00649 gnssSatValue& removeSatID(const SatID& satellite)
00650 { (*this).body.erase(satellite); return (*this); }
00651
00652
00656 gnssSatValue& removeSatID(const SatIDSet& satSet);
00657
00658
00663 double getValue(const SatID& satellite) const
00664 throw(SatIDNotFound)
00665 { return (*this).body.getValue(satellite); }
00666
00667
00671 double& operator()(const SatID& satellite)
00672 throw(SatIDNotFound)
00673 { return (*this).body(satellite); }
00674
00675
00677 virtual ~gnssSatValue() {};
00678
00679
00680 };
00681
00682
00683
00684
00687 struct gnssTypeValue : gnssData<sourceEpochSatHeader, typeValueMap>
00688 {
00689
00692 size_t numTypes() const
00693 { return body.numTypes(); };
00694
00695
00698 TypeIDSet getTypeID() const
00699 { return (*this).body.getTypeID(); }
00700
00701
00704 gnssTypeValue extractTypeID(const TypeID& type) const;
00705
00706
00710 gnssTypeValue extractTypeID(const TypeIDSet& typeSet) const;
00711
00712
00715 gnssTypeValue& keepOnlyTypeID(const TypeID& type);
00716
00717
00721 gnssTypeValue& keepOnlyTypeID(const TypeIDSet& typeSet);
00722
00723
00726 gnssTypeValue& removeTypeID(const TypeID& type)
00727 { (*this).body.erase(type); return (*this); }
00728
00729
00733 gnssTypeValue& removeTypeID(const TypeIDSet& typeSet);
00734
00735
00740 double getValue(const TypeID& type) const
00741 throw(TypeIDNotFound)
00742 { return (*this).body.getValue(type); }
00743
00744
00747 double& operator()(const TypeID& type)
00748 throw(TypeIDNotFound)
00749 { return (*this).body(type); }
00750
00751
00753 virtual ~gnssTypeValue() {};
00754
00755
00756 };
00757
00758
00759
00762 struct gnssSatTypeValue : gnssData<sourceEpochHeader, satTypeValueMap>
00763 {
00764
00767 size_t numSats() const
00768 { return body.numSats(); };
00769
00770
00773 TypeIDSet getTypeID() const
00774 { return (*this).body.getTypeID(); }
00775
00776
00778 SatIDSet getSatID() const
00779 { return (*this).body.getSatID(); }
00780
00781
00783 Vector<SatID> getVectorOfSatID() const
00784 { return (*this).body.getVectorOfSatID(); }
00785
00786
00791 size_t numElements() const
00792 { return body.numElements(); };
00793
00794
00797 gnssSatTypeValue extractSatID(const SatID& satellite) const;
00798
00799
00804 gnssSatTypeValue extractSatID( const int& p,
00805 const SatID::SatelliteSystem& s ) const;
00806
00807
00811 gnssSatTypeValue extractSatID(const SatIDSet& satSet) const;
00812
00813
00816 gnssSatTypeValue& keepOnlySatID(const SatID& satellite);
00817
00818
00822 gnssSatTypeValue& keepOnlySatID( const int& p,
00823 const SatID::SatelliteSystem& s );
00824
00825
00828 gnssSatTypeValue& keepOnlySatID(const SatIDSet& satSet);
00829
00830
00833 gnssSatTypeValue extractTypeID(const TypeID& type) const;
00834
00835
00839 gnssSatTypeValue extractTypeID(const TypeIDSet& typeSet) const;
00840
00841
00844 gnssSatTypeValue& keepOnlyTypeID(const TypeID& type);
00845
00846
00850 gnssSatTypeValue& keepOnlyTypeID(const TypeIDSet& typeSet);
00851
00852
00855 gnssSatTypeValue& removeSatID(const SatID& satellite)
00856 { (*this).body.erase(satellite); return (*this); }
00857
00858
00862 gnssSatTypeValue& removeSatID(const SatIDSet& satSet);
00863
00864
00867 gnssSatTypeValue& removeTypeID(const TypeID& type)
00868 { (*this).body.removeTypeID(type); return (*this); }
00869
00870
00874 gnssSatTypeValue& removeTypeID(const TypeIDSet& typeSet);
00875
00876
00879 Vector<double> getVectorOfTypeID(const TypeID& type) const
00880 { return ( (*this).body.getVectorOfTypeID(type) ); }
00881
00882
00898 gnssSatTypeValue& insertTypeIDVector( const TypeID& type,
00899 const Vector<double> dataVector )
00900 throw(NumberOfSatsMismatch)
00901 { (*this).body.insertTypeIDVector(type, dataVector); return (*this); }
00902
00903
00923 gnssSatTypeValue& insertMatrix( const TypeIDSet& typeSet,
00924 const Matrix<double> dataMatrix )
00925 throw(NumberOfSatsMismatch, NumberOfTypesMismatch)
00926 { (*this).body.insertMatrix(typeSet, dataMatrix); return (*this); }
00927
00928
00935 double getValue( const SatID& satellite,
00936 const TypeID& type ) const
00937 throw( SatIDNotFound, TypeIDNotFound )
00938 { return (*this).body.getValue( satellite, type ); }
00939
00940
00988 typeValueMap& operator()(const SatID& satellite)
00989 throw(SatIDNotFound)
00990 { return (*this).body(satellite); }
00991
00992
00994 virtual ~gnssSatTypeValue() {};
00995
00996
00997 };
00998
00999
01000
01003 struct gnssRinex : gnssSatTypeValue
01004 {
01005
01006
01008 sourceEpochRinexHeader header;
01009
01010
01012 gnssRinex() {};
01013
01014
01019 gnssRinex(const gnssSatTypeValue& gds)
01020 { header = gds.header; body = gds.body; };
01021
01022
01025 gnssRinex extractSatID(const SatID& satellite) const;
01026
01027
01032 gnssRinex extractSatID( const int& p,
01033 const SatID::SatelliteSystem& s ) const;
01034
01035
01039 gnssRinex extractSatID(const SatIDSet& satSet) const;
01040
01041
01044 gnssRinex& keepOnlySatID(const SatID& satellite);
01045
01046
01050 gnssRinex& keepOnlySatID( const int& p,
01051 const SatID::SatelliteSystem& s );
01052
01053
01056 gnssRinex& keepOnlySatID(const SatIDSet& satSet);
01057
01058
01061 gnssRinex extractTypeID(const TypeID& type) const;
01062
01063
01067 gnssRinex extractTypeID(const TypeIDSet& typeSet) const;
01068
01069
01072 gnssRinex& keepOnlyTypeID(const TypeID& type);
01073
01074
01078 gnssRinex& keepOnlyTypeID(const TypeIDSet& typeSet);
01079
01080
01083 gnssRinex& keepOnlySatSystem(const SatID::SatelliteSystem satSys);
01084
01085
01086
01088 virtual ~gnssRinex() {};
01089
01090
01091 };
01092
01093
01094
01096
01097
01100 struct sourceDataMap : std::map<SourceID, satTypeValueMap>
01101 {
01102
01104 sourceDataMap() {};
01105
01106
01114 double getValue( const SourceID& source,
01115 const SatID& satellite,
01116 const TypeID& type ) const
01117 throw( SourceIDNotFound, SatIDNotFound, TypeIDNotFound );
01118
01119
01125 SourceIDSet getSourceIDSet( void ) const;
01126
01127
01133 SatIDSet getSatIDSet( void ) const;
01134
01135
01137 virtual ~sourceDataMap() {};
01138
01139
01140 };
01141
01142
01143
01146 struct gnssDataMap : std::multimap<DayTime, sourceDataMap>
01147 {
01148
01150 gnssDataMap()
01151 : tolerance(0.1) {};
01152
01153
01158 gnssDataMap( double tol )
01159 : tolerance(tol) {};
01160
01161
01166 gnssDataMap& addGnssSatTypeValue( const gnssSatTypeValue& gds );
01167
01168
01173 gnssDataMap& addGnssRinex( const gnssRinex& gds );
01174
01175
01183 gnssRinex getGnssRinex( const SourceID& source ) const;
01184
01185
01190 gnssDataMap& addGnssDataMap( const gnssDataMap& gds );
01191
01192
01194 gnssDataMap front( void ) const;
01195
01196
01198 void pop_front( void );
01199
01200
01203 gnssDataMap frontEpoch( void ) const;
01204
01205
01209 void pop_front_epoch( void );
01210
01211
01213 gnssDataMap back( void ) const;
01214
01215
01217 void pop_back( void );
01218
01219
01222 gnssDataMap backEpoch( void ) const;
01223
01224
01228 void pop_back_epoch( void );
01229
01230
01236 gnssDataMap getDataFromEpoch( const DayTime& epoch ) const
01237 throw( DayTimeNotFound );
01238
01239
01251 double getValue( const DayTime& epoch,
01252 const SourceID& source,
01253 const SatID& satellite,
01254 const TypeID& type ) const
01255 throw( DayTimeNotFound, ValueNotFound );
01256
01257
01268 double getValue( const SourceID& source,
01269 const SatID& satellite,
01270 const TypeID& type ) const
01271 throw( ValueNotFound );
01272
01273
01283 gnssDataMap& insertValue( const DayTime& epoch,
01284 const SourceID& source,
01285 const SatID& satellite,
01286 const TypeID& type,
01287 double value )
01288 throw( DayTimeNotFound, ValueNotFound );
01289
01290
01299 gnssDataMap& insertValue( const SourceID& source,
01300 const SatID& satellite,
01301 const TypeID& type,
01302 double value )
01303 throw( ValueNotFound );
01304
01305
01311 SourceIDSet getSourceIDSet( void ) const;
01312
01313
01319 SatIDSet getSatIDSet( void ) const;
01320
01321
01323 double getTolerance( void ) const
01324 { return tolerance; };
01325
01326
01331 gnssDataMap& setTolerance( double tol )
01332 { tolerance = std::abs(tol); return (*this); };
01333
01334
01336 virtual std::ostream& dump( std::ostream& s,
01337 int mode = 0) const;
01338
01339
01342 gnssDataMap extractSourceID(const SourceID& source);
01343
01344
01348 gnssDataMap extractSourceID(const SourceIDSet& sourceSet);
01349
01350
01353 gnssDataMap& keepOnlySourceID(const SourceID& source);
01354
01355
01359 gnssDataMap& keepOnlySourceID(const SourceIDSet& sourceSet);
01360
01361
01364 gnssDataMap& removeSourceID(const SourceID& source);
01365
01366
01370 gnssDataMap& removeSourceID(const SourceIDSet& sourceSet);
01371
01372
01375 gnssDataMap extractSatID(const SatID& sat);
01376
01377
01381 gnssDataMap extractSatID(const SatIDSet& satSet);
01382
01383
01386 gnssDataMap& keepOnlySatID(const SatID& sat);
01387
01388
01392 gnssDataMap& keepOnlySatID(const SatIDSet& satSet);
01393
01394
01397 gnssDataMap& removeSatID(const SatID& sat);
01398
01399
01403 gnssDataMap& removeSatID(const SatIDSet& satSet);
01404
01405
01408 gnssDataMap extractTypeID(const TypeID& type);
01409
01410
01414 gnssDataMap extractTypeID(const TypeIDSet& typeSet);
01415
01416
01419 gnssDataMap& keepOnlyTypeID(const TypeID& type);
01420
01421
01425 gnssDataMap& keepOnlyTypeID(const TypeIDSet& typeSet);
01426
01427
01430 gnssDataMap& removeTypeID(const TypeID& type);
01431
01432
01436 gnssDataMap& removeTypeID(const TypeIDSet& typeSet);
01437
01438
01445 virtual gnssDataMap& edit(DayTime tmin,
01446 DayTime tmax = DayTime(DayTime::END_OF_TIME));
01447
01449 void loadObsFile(std::string obsFile);
01450
01451
01453 double tolerance;
01454
01455
01457 virtual ~gnssDataMap() {};
01458
01459
01460 };
01461
01462
01463
01465 std::ostream& operator<<( std::ostream& s,
01466 const gnssDataMap& gdsMap);
01467
01468
01469
01472 struct gnssEquationDefinition : gnssData<TypeID, TypeIDSet>
01473 {
01474
01476 gnssEquationDefinition() {};
01477
01478
01480 gnssEquationDefinition( const TypeID& h,
01481 const TypeIDSet& b )
01482 {
01483 header = h;
01484 body = b;
01485 }
01486
01487
01489 virtual ~gnssEquationDefinition() {};
01490
01491
01492 };
01493
01494
01495
01499 struct gnssLinearCombination : gnssData<TypeID, typeValueMap>
01500 {
01501
01503 gnssLinearCombination() {};
01504
01505
01507 gnssLinearCombination( const TypeID& h,
01508 const typeValueMap& b )
01509 {
01510 header = h;
01511 body = b;
01512 }
01513
01514
01516 virtual ~gnssLinearCombination() {};
01517
01518
01519 };
01520
01521
01523 typedef std::list<gnssLinearCombination> LinearCombList;
01524
01525
01526
01530 std::istream& operator>>( std::istream& i,
01531 gnssSatTypeValue& f )
01532 throw(FFStreamError, gpstk::StringUtils::StringException);
01533
01534
01538 gnssSatTypeValue& operator>>( const RinexObsHeader& roh,
01539 gnssSatTypeValue& f );
01540
01541
01545 gnssSatTypeValue& operator>>( const RinexObsData& rod,
01546 gnssSatTypeValue& f );
01547
01548
01552 gnssRinex& operator>>( const RinexObsHeader& roh,
01553 gnssRinex& f );
01554
01555
01559 gnssRinex& operator>>( const RinexObsData& rod,
01560 gnssRinex& f );
01561
01562
01565 SourceID::SourceType SatIDsystem2SourceIDtype(const SatID& sid);
01566
01567
01570 typeValueMap FilltypeValueMapwithRinexObsTypeMap(
01571 const RinexObsData::RinexObsTypeMap& otmap );
01572
01573
01577 satTypeValueMap FillsatTypeValueMapwithRinexObsData(
01578 const RinexObsData& rod );
01579
01580
01602 std::istream& operator>>( std::istream& i,
01603 gnssRinex& f )
01604 throw(FFStreamError, gpstk::StringUtils::StringException);
01605
01606
01638 std::ostream& operator<<( std::ostream& s,
01639 gnssRinex& f )
01640 throw(FFStreamError, gpstk::StringUtils::StringException);
01641
01642
01649 DayTime parseTime( const std::string& line,
01650 const RinexObsHeader& hdr )
01651 throw(FFStreamError);
01652
01653
01655
01656 }
01657
01658 #endif // GPSTK_DATASTRUCTURES_HPP