00001 #pragma ident "$Id: DataStructures.hpp 3319 2012-09-19 16:58:10Z prestonherrmann $"
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 "Rinex3ObsStream.hpp"
00045 #include "Rinex3ObsData.hpp"
00046 #include "StringUtils.hpp"
00047 #include "Vector.hpp"
00048 #include "Matrix.hpp"
00049 #include "CivilTime.hpp"
00050 #include "YDSTime.hpp"
00051 #include "GNSSconstants.hpp"
00052
00053
00054
00055 namespace gpstk
00056 {
00057
00117
00118
00119
00120
00121
00125 NEW_EXCEPTION_CLASS(TypeIDNotFound, gpstk::Exception);
00126
00127
00131 NEW_EXCEPTION_CLASS(SatIDNotFound, gpstk::Exception);
00132
00133
00137 NEW_EXCEPTION_CLASS(SourceIDNotFound, gpstk::Exception);
00138
00139
00143 NEW_EXCEPTION_CLASS(CommonTimeNotFound, gpstk::Exception);
00144
00145
00149 NEW_EXCEPTION_CLASS(ValueNotFound, gpstk::Exception);
00150
00151
00155 NEW_EXCEPTION_CLASS(NumberOfTypesMismatch, gpstk::Exception);
00156
00157
00161 NEW_EXCEPTION_CLASS(NumberOfSatsMismatch, gpstk::Exception);
00162
00163
00164
00165
00167 typedef std::set<TypeID> TypeIDSet;
00168
00170 typedef std::set<SatID> SatIDSet;
00171
00173 typedef std::set<SourceID> SourceIDSet;
00174
00175
00177 struct typeValueMap : std::map<TypeID, double>
00178 {
00179
00181 inline size_t numTypes() const
00182 { return (*this).size(); }
00183
00184
00187 TypeIDSet getTypeID() const;
00188
00189
00192 typeValueMap extractTypeID(const TypeID& type) const;
00193
00194
00198 typeValueMap extractTypeID(const TypeIDSet& typeSet) const;
00199
00200
00203 typeValueMap& keepOnlyTypeID(const TypeID& type);
00204
00205
00209 typeValueMap& keepOnlyTypeID(const TypeIDSet& typeSet);
00210
00211
00214 typeValueMap& removeTypeID(const TypeID& type)
00215 { (*this).erase(type); return (*this); }
00216
00217
00221 typeValueMap& removeTypeID(const TypeIDSet& typeSet);
00222
00223
00228 double getValue(const TypeID& type) const
00229 throw(TypeIDNotFound);
00230
00231
00235 double& operator()(const TypeID& type)
00236 throw(TypeIDNotFound);
00237
00238
00240 virtual ~typeValueMap() {};
00241
00242 };
00243
00244
00245
00247 struct satValueMap : std::map<SatID, double>
00248 {
00249
00251 size_t numSats() const
00252 { return (*this).size(); }
00253
00254
00256 SatIDSet getSatID() const;
00257
00258
00260 Vector<SatID> getVectorOfSatID() const;
00261
00262
00265 satValueMap extractSatID(const SatID& satellite) const;
00266
00267
00272 satValueMap extractSatID( const int& p,
00273 const SatID::SatelliteSystem& s ) const;
00274
00275
00279 satValueMap extractSatID(const SatIDSet& satSet) const;
00280
00281
00284 satValueMap& keepOnlySatID(const SatID& satellite);
00285
00286
00290 satValueMap& keepOnlySatID( const int& p,
00291 const SatID::SatelliteSystem& s );
00292
00293
00296 satValueMap& keepOnlySatID(const SatIDSet& satSet);
00297
00298
00301 satValueMap& removeSatID(const SatID& satellite)
00302 { (*this).erase(satellite); return (*this); }
00303
00304
00308 satValueMap& removeSatID(const SatIDSet& satSet);
00309
00310
00315 double getValue(const SatID& satellite) const
00316 throw(SatIDNotFound);
00317
00318
00322 double& operator()(const SatID& satellite)
00323 throw(SatIDNotFound);
00324
00325
00327 virtual ~satValueMap() {};
00328
00329 };
00330
00331
00332
00334 struct satTypeValueMap : std::map<SatID, typeValueMap>
00335 {
00336
00338 size_t numSats() const
00339 { return (*this).size(); }
00340
00341
00346 size_t numElements() const;
00347
00348
00350 SatIDSet getSatID() const;
00351
00352
00354 Vector<SatID> getVectorOfSatID() const;
00355
00356
00360 TypeIDSet getTypeID() const;
00361
00362
00365 satTypeValueMap extractSatID(const SatID& satellite) const;
00366
00367
00372 satTypeValueMap extractSatID( const int& p,
00373 const SatID::SatelliteSystem& s) const;
00374
00375
00379 satTypeValueMap extractSatID(const SatIDSet& satSet) const;
00380
00381
00384 satTypeValueMap& keepOnlySatID(const SatID& satellite);
00385
00386
00390 satTypeValueMap& keepOnlySatID( const int& p,
00391 const SatID::SatelliteSystem& s );
00392
00393
00396 satTypeValueMap& keepOnlySatID(const SatIDSet& satSet);
00397
00398
00401 satTypeValueMap extractTypeID(const TypeID& type) const;
00402
00403
00407 satTypeValueMap extractTypeID(const TypeIDSet& typeSet) const;
00408
00409
00412 satTypeValueMap& keepOnlyTypeID(const TypeID& type);
00413
00414
00418 satTypeValueMap& keepOnlyTypeID(const TypeIDSet& typeSet);
00419
00420
00423 satTypeValueMap& removeSatID(const SatID& satellite)
00424 { (*this).erase(satellite); return (*this); }
00425
00426
00430 satTypeValueMap& removeSatID(const SatIDSet& satSet);
00431
00432
00435 satTypeValueMap& removeTypeID(const TypeID& type);
00436
00437
00441 satTypeValueMap& removeTypeID(const TypeIDSet& typeSet);
00442
00443
00448 Vector<double> getVectorOfTypeID(const TypeID& type) const;
00449
00450
00453 Matrix<double> getMatrixOfTypes(const TypeIDSet& typeSet) const;
00454
00455
00471 satTypeValueMap& insertTypeIDVector( const TypeID& type,
00472 const Vector<double> dataVector )
00473 throw(NumberOfSatsMismatch);
00474
00475
00495 satTypeValueMap& insertMatrix( const TypeIDSet& typeSet,
00496 const Matrix<double> dataMatrix )
00497 throw(NumberOfSatsMismatch, NumberOfTypesMismatch);
00498
00499
00506 double getValue( const SatID& satellite,
00507 const TypeID& type ) const
00508 throw( SatIDNotFound, TypeIDNotFound );
00509
00510
00513 typeValueMap& operator()(const SatID& satellite)
00514 throw(SatIDNotFound);
00515
00516
00518 virtual std::ostream& dump( std::ostream& s,
00519 int mode = 0) const;
00520
00521
00523 virtual ~satTypeValueMap() {};
00524
00525 };
00526
00527
00528
00530 std::ostream& operator<<( std::ostream& s,
00531 const satTypeValueMap& stvMap);
00532
00533
00534
00536 typedef std::map<CommonTime, satTypeValueMap> epochSatTypeValueMap;
00537
00539 typedef std::map<CommonTime, satValueMap> epochSatValueMap;
00540
00542 typedef std::map<CommonTime, typeValueMap> epochTypeValueMap;
00543
00544
00545
00546
00548 template <class HEADER_CLASS, class BODY_CLASS>
00549 struct gnssData
00550 {
00551
00553 HEADER_CLASS header;
00554
00555
00557 BODY_CLASS body;
00558
00559
00560
00562 gnssData() {}
00563
00564
00566 gnssData( const HEADER_CLASS& h,
00567 const BODY_CLASS& b )
00568 {
00569 header = h;
00570 body = b;
00571 }
00572
00573
00575 template<class H, class B>
00576 gnssData(const gnssData<H,B>& g)
00577 {
00578 header = g.header;
00579 body = g.body;
00580 }
00581
00582
00584 virtual ~gnssData() {};
00585
00586 };
00587
00588
00589
00590
00591
00592
00595 struct gnssSatValue : gnssData<sourceEpochTypeHeader, satValueMap>
00596 {
00597
00598
00601 size_t numSats() const
00602 { return body.numSats(); };
00603
00604
00606 SatIDSet getSatID() const
00607 { return (*this).body.getSatID(); }
00608
00609
00611 Vector<SatID> getVectorOfSatID() const
00612 { return body.getVectorOfSatID(); }
00613
00614
00617 gnssSatValue extractSatID(const SatID& satellite) const;
00618
00619
00624 gnssSatValue extractSatID( const int& p,
00625 const SatID::SatelliteSystem& s ) const;
00626
00627
00631 gnssSatValue extractSatID(const SatIDSet& satSet) const;
00632
00633
00636 gnssSatValue& keepOnlySatID(const SatID& satellite);
00637
00638
00642 gnssSatValue& keepOnlySatID( const int& p,
00643 const SatID::SatelliteSystem& s );
00644
00645
00648 gnssSatValue& keepOnlySatID(const SatIDSet& satSet);
00649
00650
00653 gnssSatValue& removeSatID(const SatID& satellite)
00654 { (*this).body.erase(satellite); return (*this); }
00655
00656
00660 gnssSatValue& removeSatID(const SatIDSet& satSet);
00661
00662
00667 double getValue(const SatID& satellite) const
00668 throw(SatIDNotFound)
00669 { return (*this).body.getValue(satellite); }
00670
00671
00675 double& operator()(const SatID& satellite)
00676 throw(SatIDNotFound)
00677 { return (*this).body(satellite); }
00678
00679
00681 virtual ~gnssSatValue() {};
00682
00683
00684 };
00685
00686
00687
00688
00691 struct gnssTypeValue : gnssData<sourceEpochSatHeader, typeValueMap>
00692 {
00693
00696 size_t numTypes() const
00697 { return body.numTypes(); };
00698
00699
00702 TypeIDSet getTypeID() const
00703 { return (*this).body.getTypeID(); }
00704
00705
00708 gnssTypeValue extractTypeID(const TypeID& type) const;
00709
00710
00714 gnssTypeValue extractTypeID(const TypeIDSet& typeSet) const;
00715
00716
00719 gnssTypeValue& keepOnlyTypeID(const TypeID& type);
00720
00721
00725 gnssTypeValue& keepOnlyTypeID(const TypeIDSet& typeSet);
00726
00727
00730 gnssTypeValue& removeTypeID(const TypeID& type)
00731 { (*this).body.erase(type); return (*this); }
00732
00733
00737 gnssTypeValue& removeTypeID(const TypeIDSet& typeSet);
00738
00739
00744 double getValue(const TypeID& type) const
00745 throw(TypeIDNotFound)
00746 { return (*this).body.getValue(type); }
00747
00748
00751 double& operator()(const TypeID& type)
00752 throw(TypeIDNotFound)
00753 { return (*this).body(type); }
00754
00755
00757 virtual ~gnssTypeValue() {};
00758
00759
00760 };
00761
00762
00763
00766 struct gnssSatTypeValue : gnssData<sourceEpochHeader, satTypeValueMap>
00767 {
00768
00771 size_t numSats() const
00772 { return body.numSats(); };
00773
00774
00777 TypeIDSet getTypeID() const
00778 { return (*this).body.getTypeID(); }
00779
00780
00782 SatIDSet getSatID() const
00783 { return (*this).body.getSatID(); }
00784
00785
00787 Vector<SatID> getVectorOfSatID() const
00788 { return (*this).body.getVectorOfSatID(); }
00789
00790
00795 size_t numElements() const
00796 { return body.numElements(); };
00797
00798
00801 gnssSatTypeValue extractSatID(const SatID& satellite) const;
00802
00803
00808 gnssSatTypeValue extractSatID( const int& p,
00809 const SatID::SatelliteSystem& s ) const;
00810
00811
00815 gnssSatTypeValue extractSatID(const SatIDSet& satSet) const;
00816
00817
00820 gnssSatTypeValue& keepOnlySatID(const SatID& satellite);
00821
00822
00826 gnssSatTypeValue& keepOnlySatID( const int& p,
00827 const SatID::SatelliteSystem& s );
00828
00829
00832 gnssSatTypeValue& keepOnlySatID(const SatIDSet& satSet);
00833
00834
00837 gnssSatTypeValue extractTypeID(const TypeID& type) const;
00838
00839
00843 gnssSatTypeValue extractTypeID(const TypeIDSet& typeSet) const;
00844
00845
00848 gnssSatTypeValue& keepOnlyTypeID(const TypeID& type);
00849
00850
00854 gnssSatTypeValue& keepOnlyTypeID(const TypeIDSet& typeSet);
00855
00856
00859 gnssSatTypeValue& removeSatID(const SatID& satellite)
00860 { (*this).body.erase(satellite); return (*this); }
00861
00862
00866 gnssSatTypeValue& removeSatID(const SatIDSet& satSet);
00867
00868
00871 gnssSatTypeValue& removeTypeID(const TypeID& type)
00872 { (*this).body.removeTypeID(type); return (*this); }
00873
00874
00878 gnssSatTypeValue& removeTypeID(const TypeIDSet& typeSet);
00879
00880
00883 Vector<double> getVectorOfTypeID(const TypeID& type) const
00884 { return ( (*this).body.getVectorOfTypeID(type) ); }
00885
00886
00902 gnssSatTypeValue& insertTypeIDVector( const TypeID& type,
00903 const Vector<double> dataVector )
00904 throw(NumberOfSatsMismatch)
00905 { (*this).body.insertTypeIDVector(type, dataVector); return (*this); }
00906
00907
00927 gnssSatTypeValue& insertMatrix( const TypeIDSet& typeSet,
00928 const Matrix<double> dataMatrix )
00929 throw(NumberOfSatsMismatch, NumberOfTypesMismatch)
00930 { (*this).body.insertMatrix(typeSet, dataMatrix); return (*this); }
00931
00932
00939 double getValue( const SatID& satellite,
00940 const TypeID& type ) const
00941 throw( SatIDNotFound, TypeIDNotFound )
00942 { return (*this).body.getValue( satellite, type ); }
00943
00944
00992 typeValueMap& operator()(const SatID& satellite)
00993 throw(SatIDNotFound)
00994 { return (*this).body(satellite); }
00995
00996
00998 virtual ~gnssSatTypeValue() {};
00999
01000
01001 };
01002
01003
01004
01007 struct gnssRinex : gnssSatTypeValue
01008 {
01009
01010
01012 sourceEpochRinexHeader header;
01013
01014
01016 gnssRinex() {};
01017
01018
01023 gnssRinex(const gnssSatTypeValue& gds)
01024 { header = gds.header; body = gds.body; };
01025
01026
01029 gnssRinex extractSatID(const SatID& satellite) const;
01030
01031
01036 gnssRinex extractSatID( const int& p,
01037 const SatID::SatelliteSystem& s ) const;
01038
01039
01043 gnssRinex extractSatID(const SatIDSet& satSet) const;
01044
01045
01048 gnssRinex& keepOnlySatID(const SatID& satellite);
01049
01050
01054 gnssRinex& keepOnlySatID( const int& p,
01055 const SatID::SatelliteSystem& s );
01056
01057
01060 gnssRinex& keepOnlySatID(const SatIDSet& satSet);
01061
01062
01065 gnssRinex extractTypeID(const TypeID& type) const;
01066
01067
01071 gnssRinex extractTypeID(const TypeIDSet& typeSet) const;
01072
01073
01076 gnssRinex& keepOnlyTypeID(const TypeID& type);
01077
01078
01082 gnssRinex& keepOnlyTypeID(const TypeIDSet& typeSet);
01083
01084
01087 gnssRinex& keepOnlySatSystem(const SatID::SatelliteSystem satSys);
01088
01089
01090
01092 virtual ~gnssRinex() {};
01093
01094
01095 };
01096
01097
01098
01100
01101
01104 struct sourceDataMap : std::map<SourceID, satTypeValueMap>
01105 {
01106
01108 sourceDataMap() {};
01109
01110
01118 double getValue( const SourceID& source,
01119 const SatID& satellite,
01120 const TypeID& type ) const
01121 throw( SourceIDNotFound, SatIDNotFound, TypeIDNotFound );
01122
01123
01129 SourceIDSet getSourceIDSet( void ) const;
01130
01131
01137 SatIDSet getSatIDSet( void ) const;
01138
01139
01141 virtual ~sourceDataMap() {};
01142
01143
01144 };
01145
01146
01147
01150 struct gnssDataMap : std::multimap<CommonTime, sourceDataMap>
01151 {
01152
01154 gnssDataMap()
01155 : tolerance(0.1) {};
01156
01157
01162 gnssDataMap( double tol )
01163 : tolerance(tol) {};
01164
01165
01170 gnssDataMap& addGnssSatTypeValue( const gnssSatTypeValue& gds );
01171
01172
01177 gnssDataMap& addGnssRinex( const gnssRinex& gds );
01178
01179
01187 gnssRinex getGnssRinex( const SourceID& source ) const;
01188
01189
01194 gnssDataMap& addGnssDataMap( const gnssDataMap& gds );
01195
01196
01198 gnssDataMap front( void ) const;
01199
01200
01202 void pop_front( void );
01203
01204
01207 gnssDataMap frontEpoch( void ) const;
01208
01209
01213 void pop_front_epoch( void );
01214
01215
01217 gnssDataMap back( void ) const;
01218
01219
01221 void pop_back( void );
01222
01223
01226 gnssDataMap backEpoch( void ) const;
01227
01228
01232 void pop_back_epoch( void );
01233
01234
01240 gnssDataMap getDataFromEpoch( const CommonTime& epoch ) const
01241 throw( CommonTimeNotFound );
01242
01243
01255 double getValue( const CommonTime& epoch,
01256 const SourceID& source,
01257 const SatID& satellite,
01258 const TypeID& type ) const
01259 throw( CommonTimeNotFound, ValueNotFound );
01260
01261
01272 double getValue( const SourceID& source,
01273 const SatID& satellite,
01274 const TypeID& type ) const
01275 throw( ValueNotFound );
01276
01277
01287 gnssDataMap& insertValue( const CommonTime& epoch,
01288 const SourceID& source,
01289 const SatID& satellite,
01290 const TypeID& type,
01291 double value )
01292 throw( CommonTimeNotFound, ValueNotFound );
01293
01294
01303 gnssDataMap& insertValue( const SourceID& source,
01304 const SatID& satellite,
01305 const TypeID& type,
01306 double value )
01307 throw( ValueNotFound );
01308
01309
01315 SourceIDSet getSourceIDSet( void ) const;
01316
01317
01323 SatIDSet getSatIDSet( void ) const;
01324
01325
01327 double getTolerance( void ) const
01328 { return tolerance; };
01329
01330
01335 gnssDataMap& setTolerance( double tol )
01336 { tolerance = std::abs(tol); return (*this); };
01337
01338
01340 virtual std::ostream& dump( std::ostream& s,
01341 int mode = 0) const;
01342
01343
01346 gnssDataMap extractSourceID(const SourceID& source);
01347
01348
01352 gnssDataMap extractSourceID(const SourceIDSet& sourceSet);
01353
01354
01357 gnssDataMap& keepOnlySourceID(const SourceID& source);
01358
01359
01363 gnssDataMap& keepOnlySourceID(const SourceIDSet& sourceSet);
01364
01365
01368 gnssDataMap& removeSourceID(const SourceID& source);
01369
01370
01374 gnssDataMap& removeSourceID(const SourceIDSet& sourceSet);
01375
01376
01379 gnssDataMap extractSatID(const SatID& sat);
01380
01381
01385 gnssDataMap extractSatID(const SatIDSet& satSet);
01386
01387
01390 gnssDataMap& keepOnlySatID(const SatID& sat);
01391
01392
01396 gnssDataMap& keepOnlySatID(const SatIDSet& satSet);
01397
01398
01401 gnssDataMap& removeSatID(const SatID& sat);
01402
01403
01407 gnssDataMap& removeSatID(const SatIDSet& satSet);
01408
01409
01412 gnssDataMap extractTypeID(const TypeID& type);
01413
01414
01418 gnssDataMap extractTypeID(const TypeIDSet& typeSet);
01419
01420
01423 gnssDataMap& keepOnlyTypeID(const TypeID& type);
01424
01425
01429 gnssDataMap& keepOnlyTypeID(const TypeIDSet& typeSet);
01430
01431
01434 gnssDataMap& removeTypeID(const TypeID& type);
01435
01436
01440 gnssDataMap& removeTypeID(const TypeIDSet& typeSet);
01441
01442
01449 virtual gnssDataMap& edit(CommonTime tmin,
01450 CommonTime tmax = CommonTime::END_OF_TIME);
01451
01453 void loadObsFile(std::string obsFile);
01454
01455
01457 double tolerance;
01458
01459
01461 virtual ~gnssDataMap() {};
01462
01463
01464 };
01465
01466
01467
01469 std::ostream& operator<<( std::ostream& s,
01470 const gnssDataMap& gdsMap);
01471
01472
01473
01476 struct gnssEquationDefinition : gnssData<TypeID, TypeIDSet>
01477 {
01478
01480 gnssEquationDefinition() {};
01481
01482
01484 gnssEquationDefinition( const TypeID& h,
01485 const TypeIDSet& b )
01486 {
01487 header = h;
01488 body = b;
01489 }
01490
01491
01493 virtual ~gnssEquationDefinition() {};
01494
01495
01496 };
01497
01498
01499
01503 struct gnssLinearCombination : gnssData<TypeID, typeValueMap>
01504 {
01505
01507 gnssLinearCombination() {};
01508
01509
01511 gnssLinearCombination( const TypeID& h,
01512 const typeValueMap& b )
01513 {
01514 header = h;
01515 body = b;
01516 }
01517
01518
01520 virtual ~gnssLinearCombination() {};
01521
01522
01523 };
01524
01525
01527 typedef std::list<gnssLinearCombination> LinearCombList;
01528
01529
01532 SourceID::SourceType SatIDsystem2SourceIDtype(const SatID& sid);
01533
01534
01535
01540 satTypeValueMap satTypeValueMapFromRinexObsData(
01541 const RinexObsHeader& roh, const RinexObsData& rod );
01542
01543
01548 satTypeValueMap satTypeValueMapFromRinex3ObsData(
01549 const Rinex3ObsHeader& roh, const Rinex3ObsData& rod );
01550
01551
01573 std::istream& operator>>( std::istream& i, gnssRinex& f );
01574
01575
01607 std::ostream& operator<<( std::ostream& s,
01608 gnssRinex& f )
01609 throw(FFStreamError, gpstk::StringUtils::StringException);
01610
01611
01613
01614 }
01615
01616 #endif // GPSTK_DATASTRUCTURES_HPP