diff --git a/CMakeLists.txt b/CMakeLists.txt index db9516005b5509776b09ccf178d2c9b2f8d78d72..3c6cd3802f06a76c8dc5f9aff1cea5d460897a66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,9 +39,37 @@ endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive") +# Testing IF(NOT BUILD_TESTS) OPTION(BUILD_TESTS "Build Unit tests" ON) ENDIF(NOT BUILD_TESTS) +if(BUILD_TESTS) + # Enables testing for this directory and below. + # Note that ctest expects to find a test file in the build directory root. + # Therefore, this command should be in the source directory root. + #include(CTest) # according to http://public.kitware.com/pipermail/cmake/2012-June/050853.html + MESSAGE("Building tests.") + enable_testing() + set(_GNSS_UTILS_ROOT_DIR ${CMAKE_SOURCE_DIR}) +endif() + +# Define the directory where will be the configured config.h +SET(GNSS_UTILS_CONFIG_DIR ${PROJECT_BINARY_DIR}/conf/gnss_utils/internal) + +# Create the specified output directory if it does not exist. +IF(NOT EXISTS "${GNSS_UTILS_CONFIG_DIR}") + message(STATUS "Creating config output directory: ${GNSS_UTILS_CONFIG_DIR}") + file(MAKE_DIRECTORY "${GNSS_UTILS_CONFIG_DIR}") +ENDIF() +IF(EXISTS "${GNSS_UTILS_CONFIG_DIR}" AND NOT IS_DIRECTORY "${GNSS_UTILS_CONFIG_DIR}") + message(FATAL_ERROR "Bug: Specified CONFIG_DIR: " + "${GNSS_UTILS_CONFIG_DIR} exists, but is not a directory.") +ENDIF() +# Configure config.h +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/internal/config.h.in "${GNSS_UTILS_CONFIG_DIR}/config.h") +message("GNSS_UTILS CONFIG ${GNSS_UTILS_CONFIG_DIR}/config.h") +message("CONFIG DIRECTORY ${PROJECT_BINARY_DIR}") +include_directories("${PROJECT_BINARY_DIR}/conf") # rtklib path SET(RTKLIB_DIR deps/RTKLIB) @@ -87,18 +115,8 @@ SET(RTKLIB_SRC ${RTKLIB_SRC_DIR}/rcv/tersus.c ${RTKLIB_SRC_DIR}/rcv/ublox.c) - # application header files -SET(HEADERS - include/gnss_utils/utils/utils.h - include/gnss_utils/utils/transformations.h - include/gnss_utils/utils/rcv_position.h - include/gnss_utils/utils/sat_position.h - include/gnss_utils/observations.h - include/gnss_utils/navigation.h - include/gnss_utils/tdcp.h - include/gnss_utils/ublox_raw.h - ${RTKLIB_SRC_DIR}/rtklib.h) +# NOT SET SINCE WE COPY THE WHOLE include FOLDER # Eigen ####### FIND_PACKAGE(Eigen3 REQUIRED) @@ -119,31 +137,24 @@ INCLUDE_DIRECTORIES(include/ ${EIGEN3_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${RTKLI ADD_LIBRARY(gnss_utils SHARED ${SOURCES} ${RTKLIB_SRC}) TARGET_LINK_LIBRARIES(gnss_utils ${Boost_LIBRARIES}) -# Installing -INSTALL(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib/iri-algorithms - ARCHIVE DESTINATION lib/iri-algorithms) -INSTALL(FILES ${HEADERS} DESTINATION include/iri-algorithms/gnss_utils) -INSTALL(FILES Findgnss_utils.cmake DESTINATION ${CMAKE_ROOT}/Modules/) - - # Examples ADD_SUBDIRECTORY(src/examples) -if(BUILD_TESTS) - # Enables testing for this directory and below. - # Note that ctest expects to find a test file in the build directory root. - # Therefore, this command should be in the source directory root. - #include(CTest) # according to http://public.kitware.com/pipermail/cmake/2012-June/050853.html - MESSAGE("Building tests.") - enable_testing() -endif() - # Testing if(BUILD_TESTS) add_subdirectory(test) endif() +# Installing +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib/iri-algorithms + ARCHIVE DESTINATION lib/iri-algorithms) +INSTALL(DIRECTORY include/gnss_utils DESTINATION include/iri-algorithms) +INSTALL(FILES ${RTKLIB_SRC_DIR}/rtklib.h DESTINATION include/iri-algorithms/gnss_utils) +INSTALL(FILES Findgnss_utils.cmake DESTINATION ${CMAKE_ROOT}/Modules/) +INSTALL(FILES "${GNSS_UTILS_CONFIG_DIR}/config.h" + DESTINATION include/iri-algorithms/gnss_utils/internal) + FIND_PACKAGE(Doxygen) FIND_PATH(IRI_DOC_DIR doxygen.conf ${CMAKE_SOURCE_DIR}/doc/iri_doc/) diff --git a/include/gnss_utils/gnss_utils.h b/include/gnss_utils/gnss_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..4d9f83f2bd6ab7a7a70fa1b63e8c3d577be4011b --- /dev/null +++ b/include/gnss_utils/gnss_utils.h @@ -0,0 +1,8 @@ +#ifndef INCLUDE_GNSS_UTILS_GNSS_UTILS_H_ +#define INCLUDE_GNSS_UTILS_GNSS_UTILS_H_ + +extern "C" { +#include "rtklib.h" +} + +#endif \ No newline at end of file diff --git a/include/gnss_utils/navigation.h b/include/gnss_utils/navigation.h index 866e830eb509bc27d69dfb4a95c785b04cd04595..ccd1ac812fcd829e5ffcca14021d0fc15c65e595 100644 --- a/include/gnss_utils/navigation.h +++ b/include/gnss_utils/navigation.h @@ -5,12 +5,9 @@ #include <iostream> #include <memory> +#include "gnss_utils/gnss_utils.h" #include "gnss_utils/utils/utils.h" -extern "C" { -#include "rtklib.h" -} - namespace GnssUtils { class Navigation; diff --git a/include/gnss_utils/observations.h b/include/gnss_utils/observations.h index 88bb8a49c47f47dd46ddfa87be63c5537202a045..766a72c1040ff7efcd52768fb874f0f9e5d3a840 100644 --- a/include/gnss_utils/observations.h +++ b/include/gnss_utils/observations.h @@ -7,12 +7,9 @@ #include <memory> #include <cassert> +#include "gnss_utils/gnss_utils.h" #include "gnss_utils/utils/utils.h" -extern "C" { -#include "rtklib.h" -} - namespace GnssUtils { class Observations; @@ -62,6 +59,9 @@ public: Observations& common_obs_1, Observations& common_obs_2); + bool operator==(const Observations& other_obs) const; + bool operator !=(const Observations &other_obs) const; + private: // Private objects std::map<unsigned char, int> sat_2_idx_; //< key: corresponding sat number, value: idx in obs_ vector @@ -125,5 +125,10 @@ inline bool Observations::hasSatellite(const unsigned char& i) const return sat_2_idx_.count(i) != 0; } +inline bool Observations::operator !=(const Observations &other_obs) const +{ + return !(*this == other_obs); +} + } // namespace GnssUtils #endif // INCLUDE_GNSS_UTILS_OBSERVATIONS_H_ diff --git a/include/gnss_utils/utils/rcv_position.h b/include/gnss_utils/utils/rcv_position.h index 77ec4e77ef3e8d3436601341b3e8868d6018433b..9755c14f8f453758df77e432ad30d40b740d9441 100644 --- a/include/gnss_utils/utils/rcv_position.h +++ b/include/gnss_utils/utils/rcv_position.h @@ -15,10 +15,7 @@ #include "gnss_utils/observations.h" #include "gnss_utils/navigation.h" #include "gnss_utils/utils/transformations.h" - -extern "C" { -#include "rtklib.h" -} +#include "gnss_utils/gnss_utils.h" namespace GnssUtils { diff --git a/include/gnss_utils/utils/sat_position.h b/include/gnss_utils/utils/sat_position.h index 376d406a2a1f13b32ce7122d293df408e98085d9..3e90436c2caea89e3e77fd57e99acbe8ce727813 100644 --- a/include/gnss_utils/utils/sat_position.h +++ b/include/gnss_utils/utils/sat_position.h @@ -15,10 +15,7 @@ #include "gnss_utils/observations.h" #include "gnss_utils/navigation.h" #include "gnss_utils/utils/transformations.h" - -extern "C" { -#include "rtklib.h" -} +#include "gnss_utils/gnss_utils.h" namespace GnssUtils { diff --git a/include/gnss_utils/utils/transformations.h b/include/gnss_utils/utils/transformations.h index ebed329289ac0d58e6555347a71634565dc108e9..caa22c473af8509cda43970bf7f98cdef05ed99f 100644 --- a/include/gnss_utils/utils/transformations.h +++ b/include/gnss_utils/utils/transformations.h @@ -11,10 +11,7 @@ #include <eigen3/Eigen/Dense> #include <eigen3/Eigen/Geometry> #include <eigen3/Eigen/Sparse> - -extern "C" { -#include "rtklib.h" -} +#include "gnss_utils/gnss_utils.h" namespace GnssUtils { diff --git a/include/gnss_utils/utils/utils.h b/include/gnss_utils/utils/utils.h index a8c378daa76454f5ef114e5aee8a5109b467bac5..a4c6598e02321ce478173da8176ef76b28a02e0a 100644 --- a/include/gnss_utils/utils/utils.h +++ b/include/gnss_utils/utils/utils.h @@ -6,15 +6,14 @@ #include <memory> #include <string> +#include "gnss_utils/internal/config.h" +#include "gnss_utils/gnss_utils.h" + #define ARRAY_SIZE(arr) sizeof(arr) / sizeof(arr[0]) #define ARRAY2D_NROWS(arr) sizeof(arr) / sizeof(arr[0]) #define ARRAY2D_NCOLS(arr) sizeof(arr[0]) / sizeof(arr[0][0]) #define GNSSUTILS_MSG "--GnssUtils--" -extern "C" { -#include "rtklib.h" -} - namespace GnssUtils { void print(std::string& _msg); @@ -174,4 +173,11 @@ bool equalNavigations(const nav_t& nav1, const nav_t& nav2); } // namespace GnssUtils -#endif // INCLUDE_GNSS_UTILS_UTILS_UTILS_H_ \ No newline at end of file +bool operator==(const gtime_t& time1, const gtime_t& time2); +bool operator!=(const gtime_t& time1, const gtime_t& time2); +bool operator==(const obsd_t& obs1, const obsd_t& obs2); +bool operator!=(const obsd_t& obs1, const obsd_t& obs2); +bool operator==(const obs_t& obs1, const obs_t& obs2); +bool operator!=(const obs_t& obs1, const obs_t& obs2); + +#endif // INCLUDE_GNSS_UTILS_UTILS_UTILS_H_ diff --git a/internal/config.h.in b/internal/config.h.in new file mode 100644 index 0000000000000000000000000000000000000000..90ad35cc6c35569f52a370d2c6624e0bed11c030 --- /dev/null +++ b/internal/config.h.in @@ -0,0 +1,10 @@ +#ifndef GNSS_UTILS_INTERNAL_CONFIG_H_ +#define GNSS_UTILS_INTERNAL_CONFIG_H_ + +#cmakedefine _GNSS_UTILS_DEBUG + +#cmakedefine _GNSS_UTILS_TRACE + +#define _GNSS_UTILS_ROOT_DIR "${_GNSS_UTILS_ROOT_DIR}" + +#endif /* GNSS_UTILS_INTERNAL_CONFIG_H_ */ diff --git a/src/observations.cpp b/src/observations.cpp index 64fa7508b2075720f81234e93b3e8b45d7e5496d..8f04ec1a62c866e58f074ef2468ade3a48ba5af7 100644 --- a/src/observations.cpp +++ b/src/observations.cpp @@ -218,3 +218,19 @@ void Observations::findCommonObservations(const Observations& obs_1, // std::cout << (int)obs_2_ref.sat << " "; // std::cout << std::endl; } + +bool Observations::operator ==(const Observations &other_obs) const +{ + + if (sat_2_idx_ != other_obs.sat_2_idx_) + return false; + + if (idx_2_sat_ != other_obs.idx_2_sat_) + return false; + + for (auto i = 0; i < obs_.size(); i++) + if (obs_.at(i) != other_obs.obs_.at(i)) + return false; + + return true; +} diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index 7103c29e59d3b8f47838bf7bc0a96cba60529339..d8167cc34a015bc32770c25d4a515a29bf1b11cb 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -61,63 +61,6 @@ void printArray(std::string _name, float* _array, int size) } } -bool equalTime(const gtime_t& time1, const gtime_t& time2) -{ - return (difftime(time1.time, time2.time) == 0.0 && time1.sec == time2.sec); -} - -bool equalObservations(const obsd_t& obs1, const obsd_t& obs2) -{ - if (!equalTime(obs1.time, obs2.time)) - return false; - if (!equalTime(obs1.eventime, obs2.eventime)) - return false; - if (obs1.timevalid != obs2.timevalid) - return false; - if (obs1.sat != obs2.sat) - return false; - if (obs1.rcv != obs2.rcv) - return false; - if (memcmp(obs1.SNR, obs2.SNR, sizeof(obs1.SNR)) != 0) - return false; - if (memcmp(obs1.LLI, obs2.LLI, sizeof(obs1.LLI)) != 0) - return false; - if (memcmp(obs1.code, obs2.code, sizeof(obs1.code)) != 0) - return false; - if (memcmp(obs1.qualL, obs2.qualL, sizeof(obs1.qualL)) != 0) - return false; - if (memcmp(obs1.qualP, obs2.qualP, sizeof(obs1.qualP)) != 0) - return false; - if (obs1.freq != obs2.freq) - return false; - if (!equalArray<double>(obs1.L, obs2.L, ARRAY_SIZE(obs1.L), ARRAY_SIZE(obs2.L))) - return false; - if (!equalArray<double>(obs1.P, obs2.P, ARRAY_SIZE(obs1.P), ARRAY_SIZE(obs2.P))) - return false; - if (!equalArray<float>(obs1.D, obs2.D, ARRAY_SIZE(obs1.D), ARRAY_SIZE(obs2.D))) - return false; - - return true; -} - -bool equalObservations(const obs_t& obs1, const obs_t& obs2) -{ - if (obs1.n != obs2.n) - return false; - if (obs1.nmax != obs2.nmax) - return false; - if (obs1.flag != obs2.flag) - return false; - if (obs1.rcvcount != obs2.rcvcount) - return false; - if (obs1.tmcount != obs2.tmcount) - return false; - if (!equalObservations(*(obs1.data), *(obs2.data))) - return false; - - return true; -} - bool equalEphemeris(const eph_t& eph1, const eph_t& eph2) { if (eph1.sat != eph2.sat) @@ -137,11 +80,11 @@ bool equalEphemeris(const eph_t& eph1, const eph_t& eph2) if (eph1.flag != eph2.flag) return false; - if (!equalTime(eph1.toe, eph2.toe)) + if (eph1.toe != eph2.toe) return false; - if (!equalTime(eph1.toc, eph2.toc)) + if (eph1.toc != eph2.toc) return false; - if (!equalTime(eph1.ttr, eph2.ttr)) + if (eph1.ttr != eph2.ttr) return false; if (eph1.A != eph2.A) @@ -185,7 +128,7 @@ bool equalEphemeris(const eph_t& eph1, const eph_t& eph2) if (eph1.f2 != eph2.f2) return false; - if (!equalArray(eph1.tgd, eph2.tgd, ARRAY_SIZE(eph1.tgd), ARRAY_SIZE(eph2.tgd))) + if (!equalArray<double>(eph1.tgd, eph2.tgd, ARRAY_SIZE(eph1.tgd), ARRAY_SIZE(eph2.tgd))) return false; if (eph1.Adot != eph2.Adot) @@ -211,9 +154,9 @@ bool equalGlonassEphemeris(const geph_t& geph1, const geph_t& geph2) if (geph1.age != geph2.age) return false; - if (!equalTime(geph1.toe, geph2.toe)) + if (geph1.toe != geph2.toe) return false; - if (!equalTime(geph1.tof, geph2.tof)) + if (geph1.tof != geph2.tof) return false; if (!equalArray<double>(geph1.pos, geph2.pos, ARRAY_SIZE(geph1.pos), ARRAY_SIZE(geph2.pos))) @@ -238,9 +181,9 @@ bool equalSbasEphemeris(const seph_t& seph1, const seph_t& seph2) if (seph1.sat != seph2.sat) return false; - if (!equalTime(seph1.t0, seph2.t0)) + if (seph1.t0 != seph2.t0) return false; - if (!equalTime(seph1.tof, seph2.tof)) + if (seph1.tof != seph2.tof) return false; if (seph1.sva != seph2.sva) @@ -265,7 +208,7 @@ bool equalSbasEphemeris(const seph_t& seph1, const seph_t& seph2) bool equalPreciseEphemeris(const peph_t& peph1, const peph_t& peph2) { - if (!equalTime(peph1.time, peph2.time)) + if (peph1.time != peph2.time) return false; if (peph1.index != peph2.index) @@ -319,7 +262,7 @@ bool equalPreciseEphemeris(const peph_t& peph1, const peph_t& peph2) bool equalPreciseClock(const pclk_t& pclk1, const pclk_t& pclk2) { - if (!equalTime(pclk1.time, pclk2.time)) + if (pclk1.time != pclk2.time) return false; if (pclk1.index != pclk2.index) @@ -353,7 +296,7 @@ bool equalAlmanac(const alm_t& alm1, const alm_t& alm2) if (alm1.week != alm2.week) return false; - if (!equalTime(alm1.toa, alm2.toa)) + if (alm1.toa != alm2.toa) return false; if (alm1.A != alm2.A) @@ -382,7 +325,7 @@ bool equalAlmanac(const alm_t& alm1, const alm_t& alm2) bool equalTecGrid(const tec_t& tec1, const tec_t& tec2) { - if (!equalTime(tec1.time, tec2.time)) + if (tec1.time != tec2.time) return false; if (!equalArray<int>(tec1.ndata, tec2.ndata, ARRAY_SIZE(tec1.ndata), ARRAY_SIZE(tec2.ndata))) @@ -405,9 +348,9 @@ bool equalTecGrid(const tec_t& tec1, const tec_t& tec2) bool equalFcb(const fcbd_t& fcbd1, const fcbd_t& fcbd2) { - if (!equalTime(fcbd1.ts, fcbd2.ts)) + if (fcbd1.ts != fcbd2.ts) return false; - if (!equalTime(fcbd1.te, fcbd2.te)) + if (fcbd1.te != fcbd2.te) return false; if (!equalArray2d<double>(&fcbd1.bias[0][0], @@ -430,7 +373,7 @@ bool equalFcb(const fcbd_t& fcbd1, const fcbd_t& fcbd2) bool equalEarthRotationParameters(const erp_t& erp1, const erp_t& erp2) { // TODO - + return true; } @@ -530,3 +473,44 @@ bool equalNavigation(const nav_t& nav1, const nav_t& nav2) return false; } } // namespace GnssUtils + +bool operator==(const gtime_t& time1, const gtime_t& time2) +{ + return (difftime(time1.time, time2.time) == 0.0 && time1.sec == time2.sec); +} + +bool operator!=(const gtime_t& time1, const gtime_t& time2) +{ + return not(time1 == time2); +} + +bool operator==(const obsd_t& obs1, const obsd_t& obs2) +{ + return obs1.time == obs2.time && obs1.eventime == obs2.eventime && obs1.timevalid == obs2.timevalid && + obs1.sat == obs2.sat && obs1.rcv == obs2.rcv && memcmp(obs1.SNR, obs2.SNR, sizeof(obs1.SNR)) == 0 && + memcmp(obs1.LLI, obs2.LLI, sizeof(obs1.LLI)) == 0 && memcmp(obs1.code, obs2.code, sizeof(obs1.code)) == 0 && + memcmp(obs1.qualL, obs2.qualL, sizeof(obs1.qualL)) == 0 && + memcmp(obs1.qualP, obs2.qualP, sizeof(obs1.qualP)) == 0 && obs1.freq == obs2.freq && + GnssUtils::equalArray<double>( + obs1.L, obs2.L, sizeof(obs1.L) / sizeof(obs1.L[0]), sizeof(obs2.L) / sizeof(obs2.L[0])) && + GnssUtils::equalArray<double>( + obs1.P, obs2.P, sizeof(obs1.P) / sizeof(obs1.P[0]), sizeof(obs2.P) / sizeof(obs2.P[0])) && + GnssUtils::equalArray<float>( + obs1.D, obs2.D, sizeof(obs1.D) / sizeof(obs1.D[0]), sizeof(obs2.D) / sizeof(obs2.D[0])); +} + +bool operator!=(const obsd_t& obs1, const obsd_t& obs2) +{ + return not(obs1 == obs2); +} + +bool operator==(const obs_t& obs1, const obs_t& obs2) +{ + return obs1.n == obs2.n && obs1.nmax == obs2.nmax && obs1.flag == obs2.flag && obs1.rcvcount == obs2.rcvcount && + obs1.tmcount == obs2.tmcount && *(obs1.data) == *(obs2.data); +} + +bool operator!=(const obs_t& obs1, const obs_t& obs2) +{ + return not(obs1 == obs2); +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 93365929c3f20d1f751e1e5d6ff5476adf3a5249..171992abf5ce4898215379e0e2aefe609dd3a7e7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -17,7 +17,5 @@ gnss_utils_add_gtest(gtest_transformations gtest_transformations.cpp) target_link_libraries(gtest_transformations ${PROJECT_NAME}) # Observations test -add_executable(gtest_observations gtest_observations.cpp) -add_dependencies(gtest_observations libgtest) -target_link_libraries(gtest_observations libgtest ${PROJECT_NAME}) -add_test(NAME gtest_observations COMMAND gtest_observations "${CMAKE_CURRENT_LIST_DIR}/../src/examples/sample_data.obs") +gnss_utils_add_gtest(gtest_observations gtest_observations.cpp) +target_link_libraries(gtest_observations libgtest ${PROJECT_NAME}) \ No newline at end of file diff --git a/test/data/sample_data.nav b/test/data/sample_data.nav new file mode 100644 index 0000000000000000000000000000000000000000..5c4c418dc876fd45e7fddca388b4cc98b0202441 --- /dev/null +++ b/test/data/sample_data.nav @@ -0,0 +1,406 @@ + 3.04 N: GNSS NAV DATA M: MIXED RINEX VERSION / TYPE +sbf2rin-13.4.3 20200205 113410 UTC PGM / RUN BY / DATE +GPSA 9.3132E-09 -1.4901E-08 -5.9605E-08 1.1921E-07 IONOSPHERIC CORR +GPSB 9.6256E+04 -1.4746E+05 -1.3107E+05 9.1750E+05 IONOSPHERIC CORR +GAL 2.9250E+01 3.8281E-01 3.2959E-03 0.0000E+00 IONOSPHERIC CORR +GPUT -9.3132257462E-10 8.881784197E-16 503808 2083 TIME SYSTEM CORR +GAUT 9.3132257462E-10 0.000000000E+00 345600 2083 TIME SYSTEM CORR +GAGP 1.2514647096E-09-5.329070518E-15 345600 2083 TIME SYSTEM CORR + 18 LEAP SECONDS + END OF HEADER +G02 2019 12 12 12 00 00-3.648423589766E-04-7.503331289627E-12 0.000000000000E+00 + 4.700000000000E+01-1.208437500000E+02 4.378039505776E-09-1.891689129337E+00 + -6.053596735001E-06 1.953727600630E-02 9.275972843170E-06 5.153594808578E+03 + 3.888000000000E+05 3.371387720108E-07-2.768163608668E-01 2.346932888031E-07 + 9.575379914494E-01 1.915312500000E+02-1.691294764827E+00-7.654961717025E-09 + 2.000083311498E-11 1.000000000000E+00 2.083000000000E+03 0.000000000000E+00 + 2.000000000000E+00 0.000000000000E+00-1.769512891769E-08 4.700000000000E+01 + 3.868920000000E+05 4.000000000000E+00 +G04 2019 12 12 12 00 00-1.993030309677E-05-5.002220859751E-12 0.000000000000E+00 + 1.570000000000E+02-1.387500000000E+01 4.959135139313E-09-2.339868507292E+00 + -8.419156074524E-07 1.249722088687E-03 5.329027771950E-06 5.150576126099E+03 + 3.888000000000E+05 5.587935447693E-09 1.915372002909E+00 1.303851604462E-08 + 9.594040575671E-01 2.769062500000E+02-1.281079249179E+00-8.132124449911E-09 + -3.685867816904E-10 1.000000000000E+00 2.083000000000E+03 0.000000000000E+00 + 4.096000000000E+03 6.300000000000E+01-4.190951585770E-09 6.690000000000E+02 + 3.873960000000E+05 4.000000000000E+00 +G06 2019 12 12 12 00 00-1.512947492301E-04-1.114131009672E-11 0.000000000000E+00 + 1.000000000000E+02-1.239062500000E+02 3.927663602954E-09-1.824134113525E+00 + -6.347894668579E-06 1.658447668888E-03 9.786337614059E-06 5.153719285965E+03 + 3.888000000000E+05-1.490116119385E-08-2.122724576342E-01 5.401670932770E-08 + 9.781077241470E-01 2.010000000000E+02-1.200768673201E+00-7.640318249923E-09 + 1.214336296267E-11 1.000000000000E+00 2.083000000000E+03 0.000000000000E+00 + 2.000000000000E+00 0.000000000000E+00 4.656612873077E-09 1.000000000000E+02 + 3.858180000000E+05 4.000000000000E+00 +G07 2019 12 12 12 00 00-1.683332957327E-04-8.185452315956E-12 0.000000000000E+00 + 5.700000000000E+01 3.909375000000E+01 4.250534194668E-09-2.882882750792E+00 + 1.888722181320E-06 1.320131728426E-02 1.172721385956E-05 5.153718780518E+03 + 3.888000000000E+05-7.450580596924E-09 2.943673467473E+00-1.341104507446E-07 + 9.545190186113E-01 1.482812500000E+02-2.422380694519E+00-7.540671242082E-09 + -4.639478967207E-10 1.000000000000E+00 2.083000000000E+03 0.000000000000E+00 + 2.000000000000E+00 0.000000000000E+00-1.117587089539E-08 5.700000000000E+01 + 3.858180000000E+05 4.000000000000E+00 +G09 2019 12 12 12 00 00-1.062308438122E-04-9.436007530894E-12 0.000000000000E+00 + 7.800000000000E+01-1.206250000000E+01 5.168786729286E-09 4.992301981873E-01 + -7.078051567078E-07 1.692383317277E-03 5.021691322327E-06 5.153534730911E+03 + 3.888000000000E+05-2.793967723846E-08 1.868752621939E+00 1.490116119385E-08 + 9.520568016730E-01 2.776875000000E+02 1.684705661839E+00-8.283559329210E-09 + -2.914407111040E-10 1.000000000000E+00 2.083000000000E+03 0.000000000000E+00 + 2.000000000000E+00 0.000000000000E+00 1.396983861923E-09 7.800000000000E+01 + 3.857520000000E+05 4.000000000000E+00 +G13 2019 12 12 12 00 00-2.714386209846E-05 2.387423592154E-12 0.000000000000E+00 + 8.700000000000E+01-1.987500000000E+01 4.779841956746E-09-8.793798521920E-01 + -1.072883605957E-06 4.130274290219E-03 5.709007382393E-06 5.153656044006E+03 + 3.888000000000E+05-6.332993507385E-08 2.009100851183E+00 9.313225746155E-08 + 9.674158381471E-01 2.706562500000E+02 1.183260297004E+00-8.083193840326E-09 + -5.078782980268E-10 1.000000000000E+00 2.083000000000E+03 0.000000000000E+00 + 2.000000000000E+00 0.000000000000E+00-1.117587089539E-08 8.700000000000E+01 + 3.870420000000E+05 4.000000000000E+00 +G23 2019 12 12 12 00 00-1.500290818512E-04 2.387423592154E-12 0.000000000000E+00 + 3.000000000000E+01-1.009375000000E+01 5.335222233421E-09-1.452196357053E+00 + -4.973262548447E-07 1.326873130165E-02 4.552304744720E-06 5.153694892883E+03 + 3.888000000000E+05 2.980232238770E-07 1.861752114203E+00 4.470348358154E-08 + 9.428683609718E-01 2.778750000000E+02-2.215284453592E+00-8.261415549690E-09 + -2.478674675321E-10 1.000000000000E+00 2.083000000000E+03 0.000000000000E+00 + 2.000000000000E+00 0.000000000000E+00-2.048909664154E-08 3.000000000000E+01 + 3.858420000000E+05 4.000000000000E+00 +G30 2019 12 12 12 00 00-1.042019575834E-04-8.640199666843E-12 0.000000000000E+00 + 2.500000000000E+01 4.368750000000E+01 4.663408535398E-09-2.906933186921E+00 + 2.210959792137E-06 4.164319136180E-03 1.142919063568E-05 5.153722436905E+03 + 3.888000000000E+05-2.793967723846E-08 2.968865819418E+00-3.725290298462E-09 + 9.399056183160E-01 1.480312500000E+02-2.921787544453E+00-7.888185717455E-09 + -4.778770483544E-10 1.000000000000E+00 2.083000000000E+03 0.000000000000E+00 + 2.000000000000E+00 0.000000000000E+00 3.725290298462E-09 2.500000000000E+01 + 3.858180000000E+05 4.000000000000E+00 +R03 2019 12 12 11 15 00 6.369315087795E-06 0.000000000000E+00 3.858000000000E+05 + 9.652274414063E+03 3.457994461060E-01 9.313225746155E-10 0.000000000000E+00 + 1.708528710938E+04 2.202743530273E+00-1.862645149231E-09 5.000000000000E+00 + 1.629986035156E+04-2.522974967957E+00-2.793967723846E-09 0.000000000000E+00 +R03 2019 12 12 11 45 00 6.371177732944E-06 0.000000000000E+00 3.870000000000E+05 + 1.043946044922E+04 4.914197921753E-01 9.313225746155E-10 0.000000000000E+00 + 2.039817236328E+04 1.453030586243E+00-1.862645149231E-09 5.000000000000E+00 + 1.118693066406E+04-3.121288299561E+00-1.862645149231E-09 0.000000000000E+00 +R05 2019 12 12 11 15 00 4.108343273401E-05 9.094947017729E-13 3.862800000000E+05 + 5.985222167969E+03 1.195173263550E-01-1.862645149231E-09 0.000000000000E+00 + -1.828012353516E+04 2.295486450195E+00 1.862645149231E-09 1.000000000000E+00 + 1.676849218750E+04 2.457766532898E+00-1.862645149231E-09 0.000000000000E+00 +R05 2019 12 12 11 45 00 4.108529537916E-05 9.094947017729E-13 3.871800000000E+05 + 6.598400390625E+03 5.781021118164E-01-9.313225746155E-10 0.000000000000E+00 + -1.370180371094E+04 2.745733261108E+00 9.313225746155E-10 1.000000000000E+00 + 2.048785058594E+04 1.648019790649E+00-1.862645149231E-09 0.000000000000E+00 +R14 2019 12 12 11 15 00 4.597380757332E-05 0.000000000000E+00 3.858000000000E+05 + 2.135816357422E+04-6.865911483765E-01 3.725290298462E-09 0.000000000000E+00 + 1.261080761719E+04-4.694700241089E-01-0.000000000000E+00-7.000000000000E+00 + 5.991423828125E+03 3.442845344543E+00-2.793967723846E-09 0.000000000000E+00 +R14 2019 12 12 11 45 00 4.597473889589E-05 0.000000000000E+00 3.870000000000E+05 + 1.936734765625E+04-1.519350051880E+00 1.862645149231E-09 0.000000000000E+00 + 1.162212011719E+04-5.869359970093E-01-9.313225746155E-10-7.000000000000E+00 + 1.187716162109E+04 3.054467201233E+00-2.793967723846E-09 0.000000000000E+00 +R15 2019 12 12 11 15 00 1.051910221577E-04 0.000000000000E+00 3.860100000000E+05 + 2.249286962891E+04 1.470921516418E+00 5.587935447693E-09 0.000000000000E+00 + 4.179755859375E+03 4.950771331787E-01 9.313225746155E-10 0.000000000000E+00 + -1.125261865234E+04 3.118181228638E+00-1.862645149231E-09 0.000000000000E+00 +R15 2019 12 12 11 45 00 1.051910221577E-04 0.000000000000E+00 3.870000000000E+05 + 2.451276953125E+04 7.425718307495E-01 4.656612873077E-09 0.000000000000E+00 + 4.643450683594E+03 4.951381683350E-02 0.000000000000E+00 0.000000000000E+00 + -5.276882812500E+03 3.478320121765E+00-2.793967723846E-09 0.000000000000E+00 +R19 2019 12 12 11 15 00-6.853323429823E-05-1.818989403546E-12 3.859500000000E+05 + 2.008951708984E+04 2.060537338257E-01 2.793967723846E-09 0.000000000000E+00 + -1.541425244141E+04-4.377956390381E-01 2.793967723846E-09 3.000000000000E+00 + 3.049126953125E+03-3.578741073608E+00-1.862645149231E-09 0.000000000000E+00 +R19 2019 12 12 11 45 00-6.853695958853E-05-1.818989403546E-12 3.870000000000E+05 + 1.978871044922E+04-5.135507583618E-01 3.725290298462E-09 0.000000000000E+00 + -1.571828076172E+04 1.333026885986E-01 1.862645149231E-09 3.000000000000E+00 + -3.427280273438E+03-3.570507049561E+00-1.862645149231E-09 0.000000000000E+00 +R13 2019 12 12 11 45 00-3.215298056602E-05-0.000000000000E+00 3.876000000000E+05 + 3.100402832031E+03-2.939124107361E+00-1.862645149231E-09 0.000000000000E+00 + 1.186301953125E+04-8.695030212402E-01-9.313225746155E-10-2.000000000000E+00 + 2.235348193359E+04 8.685455322266E-01-1.862645149231E-09 0.000000000000E+00 +R20 2019 12 12 11 45 00-3.986386582255E-04-0.000000000000E+00 3.877800000000E+05 + 9.837636718750E+03 1.428291320801E+00-0.000000000000E+00 0.000000000000E+00 + -1.795626220703E+04-1.534766197205E+00 1.862645149231E-09 2.000000000000E+00 + 1.525312060547E+04-2.726587295532E+00-1.862645149231E-09 0.000000000000E+00 +E01 2019 12 12 11 10 00-7.507699192502E-04-7.986500349944E-12 0.000000000000E+00 + 3.000000000000E+00 2.013125000000E+02 2.449744898851E-09 7.981291655576E-01 + 9.473413228989E-06 1.731918891892E-04 9.533017873764E-06 5.440622966766E+03 + 3.858000000000E+05 3.166496753693E-08-2.605880888987E+00-1.117587089539E-08 + 9.855193908613E-01 1.463750000000E+02-1.069210219000E+00-5.272719629937E-09 + 1.914365455291E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.629814505577E-09-1.862645149231E-09 + 3.864650000000E+05 +E01 2019 12 12 11 20 00-7.507746340707E-04-7.972289495228E-12 0.000000000000E+00 + 4.000000000000E+00 2.002500000000E+02 2.449744898851E-09 8.736282654153E-01 + 9.419396519661E-06 1.731686061248E-04 9.588897228241E-06 5.440622581482E+03 + 3.864000000000E+05 3.725290298462E-08-2.605884063520E+00-1.862645149231E-09 + 9.855195488564E-01 1.452500000000E+02-1.070324887968E+00-5.265933632987E-09 + 1.896507568581E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.629814505577E-09-1.862645149231E-09 + 3.870650000000E+05 +E09 2019 12 12 11 10 00 6.223833654076E-03-1.216449163621E-11 0.000000000000E+00 + 3.000000000000E+00 7.218750000000E+00 3.823373544569E-09-3.442271110123E-02 + 3.892928361893E-07 2.964780433103E-04 3.403052687645E-06 5.440603132248E+03 + 3.858000000000E+05-9.313225746155E-09 1.575307486314E+00-6.146728992462E-08 + 9.586413959478E-01 2.625000000000E+02 2.794206052069E-01-5.815242228181E-09 + 8.571785620706E-12 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-4.656612873077E-10-6.984919309616E-10 + 3.869030000000E+05 +E12 2019 12 12 10 40 00 6.055364210624E-03-1.870148480521E-11 0.000000000000E+00 + 0.000000000000E+00-2.075312500000E+02 2.603322724555E-09-2.414195903395E+00 + -9.659677743912E-06 2.996901748702E-04 6.495043635368E-06 5.440614477158E+03 + 3.840000000000E+05-2.421438694000E-08-5.219517721978E-01 5.774199962616E-08 + 9.864495053986E-01 2.151250000000E+02-9.348391204646E-01-5.376652530588E-09 + -2.257236880119E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.327134668827E-08-1.327134668827E-08 + 3.858050000000E+05 +E19 2019 12 12 11 00 00-2.469634637237E-06 2.273736754432E-13 0.000000000000E+00 + 2.000000000000E+00 1.103125000000E+01 3.765871149364E-09-1.685770007887E-01 + 4.824250936508E-07 1.212444622070E-04 3.688037395477E-06 5.440600940704E+03 + 3.852000000000E+05-5.401670932770E-08 1.580615112564E+00 5.215406417847E-08 + 9.583897608719E-01 2.595937500000E+02 1.996512379669E+00-5.770954669140E-09 + 1.160762636137E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-5.820766091347E-09-5.820766091347E-09 + 3.858660000000E+05 +E19 2019 12 12 11 10 00-2.469576429576E-06 2.273736754432E-13 0.000000000000E+00 + 3.000000000000E+00 1.168750000000E+01 3.765156833895E-09-9.388288915917E-02 + 5.066394805908E-07 1.211694907397E-04 3.693625330925E-06 5.440600774765E+03 + 3.858000000000E+05-5.960464477539E-08 1.580611582543E+00 4.097819328308E-08 + 9.583898398694E-01 2.594687500000E+02 1.996204499781E+00-5.764168672191E-09 + 1.207193141583E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-5.820766091347E-09-5.820766091347E-09 + 3.864650000000E+05 +E21 2019 12 12 11 10 00-5.709171527997E-04-2.131628207280E-12 0.000000000000E+00 + 3.000000000000E+00 2.180312500000E+02 2.333311477503E-09 1.537835498027E+00 + 1.022964715958E-05 9.841390419751E-05 9.685754776001E-06 5.440636165619E+03 + 3.858000000000E+05-2.980232238770E-08-2.608584029515E+00 4.842877388000E-08 + 9.850865499746E-01 1.424062500000E+02-1.025413854454E+00-5.217717338871E-09 + 1.871506527187E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00 4.656612873077E-10 2.328306436539E-10 + 3.867350000000E+05 +E21 2019 12 12 11 20 00-5.709183751605E-04-2.131628207280E-12 0.000000000000E+00 + 4.000000000000E+00 2.213125000000E+02 2.317953694933E-09 1.607657241034E+00 + 1.038052141666E-05 9.810912888497E-05 9.816139936447E-06 5.440637243271E+03 + 3.864000000000E+05-4.097819328308E-08-2.608587130902E+00 4.470348358154E-08 + 9.850867050439E-01 1.395312500000E+02-1.020851268976E+00-5.213788603794E-09 + 1.800074980348E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00 4.656612873077E-10 2.328306436539E-10 + 3.870650000000E+05 +E01 2019 12 12 11 10 00-7.507689879276E-04-7.986500349944E-12 0.000000000000E+00 + 3.000000000000E+00 2.013125000000E+02 2.449744898851E-09 7.981291655576E-01 + 9.473413228989E-06 1.731918891892E-04 9.533017873764E-06 5.440622966766E+03 + 3.858000000000E+05 3.166496753693E-08-2.605880888987E+00-1.117587089539E-08 + 9.855193908613E-01 1.463750000000E+02-1.069210219000E+00-5.272719629937E-09 + 1.914365455291E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.629814505577E-09 0.000000000000E+00 + 3.865400000000E+05 +E01 2019 12 12 11 20 00-7.507736445405E-04-7.972289495228E-12 0.000000000000E+00 + 4.000000000000E+00 2.002500000000E+02 2.449744898851E-09 8.736282654153E-01 + 9.419396519661E-06 1.731686061248E-04 9.588897228241E-06 5.440622581482E+03 + 3.864000000000E+05 3.725290298462E-08-2.605884063520E+00-1.862645149231E-09 + 9.855195488564E-01 1.452500000000E+02-1.070324887968E+00-5.265933632987E-09 + 1.896507568581E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.629814505577E-09 0.000000000000E+00 + 3.871400000000E+05 +E12 2019 12 12 10 40 00 6.055364909116E-03-1.871569565992E-11 0.000000000000E+00 + 0.000000000000E+00-2.075312500000E+02 2.603322724555E-09-2.414195903395E+00 + -9.659677743912E-06 2.996901748702E-04 6.495043635368E-06 5.440614477158E+03 + 3.840000000000E+05-2.421438694000E-08-5.219517721978E-01 5.774199962616E-08 + 9.864495053986E-01 2.151250000000E+02-9.348391204646E-01-5.376652530588E-09 + -2.257236880119E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.327134668827E-08 0.000000000000E+00 + 3.858400000000E+05 +E19 2019 12 12 11 00 00-2.468528691679E-06 2.273736754432E-13 0.000000000000E+00 + 2.000000000000E+00 1.103125000000E+01 3.765871149364E-09-1.685770007887E-01 + 4.824250936508E-07 1.212444622070E-04 3.688037395477E-06 5.440600940704E+03 + 3.852000000000E+05-5.401670932770E-08 1.580615112564E+00 5.215406417847E-08 + 9.583897608719E-01 2.595937500000E+02 1.996512379669E+00-5.770954669140E-09 + 1.160762636137E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-5.820766091347E-09 0.000000000000E+00 + 3.859400000000E+05 +E19 2019 12 12 11 10 00-2.468470484018E-06 2.273736754432E-13 0.000000000000E+00 + 3.000000000000E+00 1.168750000000E+01 3.765156833895E-09-9.388288915917E-02 + 5.066394805908E-07 1.211694907397E-04 3.693625330925E-06 5.440600774765E+03 + 3.858000000000E+05-5.960464477539E-08 1.580611582543E+00 4.097819328308E-08 + 9.583898398694E-01 2.594687500000E+02 1.996204499781E+00-5.764168672191E-09 + 1.207193141583E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-5.820766091347E-09 0.000000000000E+00 + 3.865400000000E+05 +E21 2019 12 12 11 10 00-5.709161632694E-04-2.117417352565E-12 0.000000000000E+00 + 3.000000000000E+00 2.180312500000E+02 2.333311477503E-09 1.537835498027E+00 + 1.022964715958E-05 9.841390419751E-05 9.685754776001E-06 5.440636165619E+03 + 3.858000000000E+05-2.980232238770E-08-2.608584029515E+00 4.842877388000E-08 + 9.850865499746E-01 1.424062500000E+02-1.025413854454E+00-5.217717338871E-09 + 1.871506527187E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00 4.656612873077E-10 0.000000000000E+00 + 3.867900000000E+05 +E21 2019 12 12 11 20 00-5.709173856303E-04-2.131628207280E-12 0.000000000000E+00 + 4.000000000000E+00 2.213125000000E+02 2.317953694933E-09 1.607657241034E+00 + 1.038052141666E-05 9.810912888497E-05 9.816139936447E-06 5.440637243271E+03 + 3.864000000000E+05-4.097819328308E-08-2.608587130902E+00 4.470348358154E-08 + 9.850867050439E-01 1.395312500000E+02-1.020851268976E+00-5.213788603794E-09 + 1.800074980348E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00 4.656612873077E-10 0.000000000000E+00 + 3.871400000000E+05 +E04 2019 12 12 11 10 00-4.236891982146E-04-7.531752999057E-12 0.000000000000E+00 + 3.000000000000E+00 9.781250000000E+00 3.935521073107E-09-4.009111796513E-01 + 5.532056093216E-07 8.811207953840E-05 3.596767783165E-06 5.440604427338E+03 + 3.858000000000E+05 9.499490261078E-08 1.582511472789E+00 3.166496753693E-08 + 9.526713574660E-01 2.577187500000E+02 1.440283619102E+00-5.908817554540E-09 + 7.071723137082E-11 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-5.355104804039E-09-5.820766091347E-09 + 3.875670000000E+05 +E04 2019 12 12 11 10 00-4.236878594384E-04-7.531752999057E-12 0.000000000000E+00 + 3.000000000000E+00 9.781250000000E+00 3.935521073107E-09-4.009111796513E-01 + 5.532056093216E-07 8.811207953840E-05 3.596767783165E-06 5.440604427338E+03 + 3.858000000000E+05 9.499490261078E-08 1.582511472789E+00 3.166496753693E-08 + 9.526713574660E-01 2.577187500000E+02 1.440283619102E+00-5.908817554540E-09 + 7.071723137082E-11 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-5.355104804039E-09 0.000000000000E+00 + 3.875900000000E+05 +E11 2019 12 12 11 00 00 3.295102505945E-04 1.526245796413E-10 5.204170427930E-18 + 2.000000000000E+00-2.123750000000E+02 2.665468170305E-09 2.480654590844E+00 + -9.858980774879E-06 1.651302445680E-04 7.150694727898E-06 5.440609029770E+03 + 3.852000000000E+05-3.352761268616E-08-5.219456059981E-01 2.048909664154E-08 + 9.864349859366E-01 1.975937500000E+02-2.012781103955E-01-5.400939256513E-09 + -2.103659054415E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.583248376846E-08-1.699663698673E-08 + 3.876330000000E+05 +E21 2019 12 12 11 30 00-5.709196557291E-04-2.131628207280E-12 0.000000000000E+00 + 5.000000000000E+00 2.240625000000E+02 2.303667385565E-09 1.677767938158E+00 + 1.050904393196E-05 9.777839295566E-05 9.970739483833E-06 5.440638303757E+03 + 3.870000000000E+05-5.401670932770E-08-2.608590226436E+00 3.725290298462E-08 + 9.850868571874E-01 1.362812500000E+02-1.016577701982E+00-5.210574184187E-09 + 1.721500278825E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00 4.656612873077E-10 2.328306436539E-10 + 3.876650000000E+05 +E11 2019 12 12 11 00 00 3.295124042779E-04 1.526387904960E-10 5.204170427930E-18 + 2.000000000000E+00-2.123750000000E+02 2.665468170305E-09 2.480654590844E+00 + -9.858980774879E-06 1.651302445680E-04 7.150694727898E-06 5.440609029770E+03 + 3.852000000000E+05-3.352761268616E-08-5.219456059981E-01 2.048909664154E-08 + 9.864349859366E-01 1.975937500000E+02-2.012781103955E-01-5.400939256513E-09 + -2.103659054415E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.583248376846E-08 0.000000000000E+00 + 3.876800000000E+05 +E01 2019 12 12 11 30 00-7.507792906836E-04-7.972289495228E-12 0.000000000000E+00 + 5.000000000000E+00 1.994687500000E+02 2.447601952446E-09 9.486982138657E-01 + 9.378418326378E-06 1.731649972498E-04 9.616836905479E-06 5.440622346878E+03 + 3.870000000000E+05 3.911554813385E-08-2.605887229274E+00 7.450580596924E-09 + 9.855197039257E-01 1.446875000000E+02-1.071010335308E+00-5.259504793772E-09 + 1.871506527187E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.629814505577E-09-1.862645149231E-09 + 3.877250000000E+05 +E21 2019 12 12 11 30 00-5.709186661988E-04-2.117417352565E-12 0.000000000000E+00 + 5.000000000000E+00 2.240625000000E+02 2.303667385565E-09 1.677767938158E+00 + 1.050904393196E-05 9.777839295566E-05 9.970739483833E-06 5.440638303757E+03 + 3.870000000000E+05-5.401670932770E-08-2.608590226436E+00 3.725290298462E-08 + 9.850868571874E-01 1.362812500000E+02-1.016577701982E+00-5.210574184187E-09 + 1.721500278825E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00 4.656612873077E-10 0.000000000000E+00 + 3.877400000000E+05 +E01 2019 12 12 11 30 00-7.507783011533E-04-7.972289495228E-12 0.000000000000E+00 + 5.000000000000E+00 1.994687500000E+02 2.447601952446E-09 9.486982138657E-01 + 9.378418326378E-06 1.731649972498E-04 9.616836905479E-06 5.440622346878E+03 + 3.870000000000E+05 3.911554813385E-08-2.605887229274E+00 7.450580596924E-09 + 9.855197039257E-01 1.446875000000E+02-1.071010335308E+00-5.259504793772E-09 + 1.871506527187E-10 2.580000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00-1.629814505577E-09 0.000000000000E+00 + 3.878200000000E+05 +E36 2019 12 12 10 30 00 6.253067986108E-04-4.803268893738E-12 0.000000000000E+00 + 1.270000000000E+02-2.396562500000E+02 2.521890761159E-09 3.060908164528E+00 + -1.121312379837E-05 3.076605498791E-04 7.288530468941E-06 5.440609262466E+03 + 3.834000000000E+05 2.980232238770E-08-5.264936383676E-01 5.587935447693E-08 + 9.896539850266E-01 1.944062500000E+02-1.782833699345E+00-5.428440402046E-09 + -2.457245211269E-10 5.170000000000E+02 2.083000000000E+03 + 3.120000000000E+00 0.000000000000E+00 3.725290298462E-09 4.423782229424E-09 + 3.878450000000E+05 +S36 2019 12 12 11 36 48 0.000000000000E+00 0.000000000000E+00 3.874820000000E+05 + 4.200368800000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + 3.674846960000E+03 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 2.530000000000E+02 +S25 2019 12 11 23 59 44 0.000000000000E+00 0.000000000000E+00 3.874840000000E+05 + 4.053076976000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + -1.162201120000E+04 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 +S23 2019 12 12 11 37 04 0.000000000000E+00 0.000000000000E+00 3.874940000000E+05 + 3.594460000000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + 2.204414000000E+04 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 1.460000000000E+02 +S36 2019 12 12 11 38 56 0.000000000000E+00 0.000000000000E+00 3.875460000000E+05 + 4.200368800000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + 3.674846960000E+03 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 2.540000000000E+02 +S23 2019 12 12 11 39 12 0.000000000000E+00 0.000000000000E+00 3.875580000000E+05 + 3.594460000000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + 2.204414000000E+04 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 1.470000000000E+02 +S23 2019 12 12 11 41 20 0.000000000000E+00 0.000000000000E+00 3.876860000000E+05 + 3.594460000000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + 2.204414000000E+04 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 1.480000000000E+02 +S36 2019 12 12 11 41 04 0.000000000000E+00 0.000000000000E+00 3.877380000000E+05 + 4.200368800000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + 3.674846960000E+03 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 2.550000000000E+02 +S36 2019 12 12 11 43 12 0.000000000000E+00 0.000000000000E+00 3.878020000000E+05 + 4.200368800000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + 3.674846960000E+03 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 +S23 2019 12 12 11 43 28 0.000000000000E+00 0.000000000000E+00 3.878780000000E+05 + 3.594460000000E+04 0.000000000000E+00 0.000000000000E+00 6.300000000000E+01 + 2.204414000000E+04 0.000000000000E+00 0.000000000000E+00 3.276700000000E+04 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 1.490000000000E+02 +C05 2019 12 12 11 00 00-2.244751667604E-04-5.808153957787E-11 0.000000000000E+00 + 1.000000000000E+00-4.986718750000E+02 1.785788670980E-12-5.169766818568E-01 + -1.630326732993E-05 6.773804780096E-04 2.061109989882E-05 6.493346771240E+03 + 3.852000000000E+05 1.271255314350E-07-1.766797704845E-01 3.259629011154E-09 + 1.180676987021E-01-6.241562500000E+02-1.608095995036E+00 1.192549674481E-09 + 7.575315542299E-10 0.000000000000E+00 7.270000000000E+02 + 2.000000000000E+00 0.000000000000E+00-8.000000000000E-10-9.200000000000E-09 + 3.858276000000E+05 0.000000000000E+00 +C10 2019 12 12 11 00 00-4.537283675745E-04-3.685762806072E-11 0.000000000000E+00 + 1.000000000000E+00 9.611718750000E+02 9.743262988869E-10-3.040647920928E+00 + 3.135204315186E-05 6.156359100714E-03 7.578637450933E-06 6.493785018921E+03 + 3.852000000000E+05-1.676380634308E-08-2.379959881122E+00-4.004687070847E-08 + 9.058375010021E-01-1.493750000000E+01-2.570309406835E+00-2.115088101909E-09 + 4.782342060886E-10 0.000000000000E+00 7.270000000000E+02 + 2.000000000000E+00 0.000000000000E+00 5.000000000000E-09 2.400000000000E-09 + 3.858180000000E+05 0.000000000000E+00 +C23 2019 12 12 11 00 00-8.696540025994E-04 2.136069099379E-12 0.000000000000E+00 + 1.000000000000E+00 1.034062500000E+02 3.498002848716E-09 1.631067082891E+00 + 5.179084837437E-06 2.014992060140E-04 1.188227906823E-05 5.282628129959E+03 + 3.852000000000E+05 3.725290298462E-08-3.016985033742E+00 6.565824151039E-08 + 9.546959600159E-01 1.175156250000E+02-1.126531243634E+00-6.488127399406E-09 + -1.864363372504E-10 0.000000000000E+00 7.270000000000E+02 + 2.000000000000E+00 0.000000000000E+00 2.430000000000E-08 2.430000000000E-08 + 3.858180000000E+05 1.000000000000E+00 +C30 2019 12 12 11 00 00 2.388220746070E-04 6.104450278599E-12 0.000000000000E+00 + 1.000000000000E+00-1.393437500000E+02 3.927663602954E-09-2.732742750025E+00 + -6.837770342827E-06 3.649030113593E-04 1.750886440277E-06 5.282614929199E+03 + 3.852000000000E+05-3.864988684654E-08-9.521190897989E-01-5.587935447693E-09 + 9.644793109832E-01 3.275781250000E+02-4.157902561103E-01-7.082080711374E-09 + -2.339383158984E-10 0.000000000000E+00 7.270000000000E+02 + 2.000000000000E+00 0.000000000000E+00-1.040000000000E-08-1.040000000000E-08 + 3.858180000000E+05 1.000000000000E+00 +C32 2019 12 12 11 00 00-8.566775359213E-04 2.992273095970E-12 0.000000000000E+00 + 1.000000000000E+00 2.875000000000E+01 4.228033257413E-09 2.867304095205E+00 + 1.456588506699E-06 1.842749770731E-04 6.427057087421E-06 5.282614164352E+03 + 3.852000000000E+05 1.862645149231E-09 1.148173467908E+00 6.705522537231E-08 + 9.608588315814E-01 2.297500000000E+02-1.050918258529E+00-6.857785654299E-09 + 5.228789228631E-10 0.000000000000E+00 7.270000000000E+02 + 2.000000000000E+00 0.000000000000E+00-9.900000000000E-09-9.900000000000E-09 + 3.857580000000E+05 1.000000000000E+00 +C37 2019 12 12 11 00 00-8.880557725206E-04-5.954881032721E-11 0.000000000000E+00 + 1.000000000000E+00 1.086562500000E+02 3.521932416908E-09 8.066563687499E-01 + 5.388632416725E-06 7.037379546091E-04 1.127412542701E-05 5.282630052567E+03 + 3.852000000000E+05-2.142041921616E-08-3.020306267399E+00 1.536682248116E-08 + 9.560827215058E-01 1.306718750000E+02-1.080448983277E+00-6.580988410297E-09 + -2.328668426958E-10 0.000000000000E+00 7.270000000000E+02 + 2.000000000000E+00 0.000000000000E+00-1.390000000000E-08-1.390000000000E-08 + 3.858180000000E+05 1.000000000000E+00 +C20 2019 12 12 11 00 00-4.067538538948E-04-5.008171655163E-11 0.000000000000E+00 + 1.000000000000E+00 2.850000000000E+01 4.229461888350E-09 1.463145840983E+00 + 1.523178070784E-06 5.460308166221E-04 6.177462637424E-06 5.282614208221E+03 + 3.852000000000E+05 3.445893526077E-08 1.153432718382E+00-1.210719347000E-08 + 9.622213291121E-01 2.341406250000E+02-4.480160490039E-01-6.852785446020E-09 + 4.753769442150E-10 0.000000000000E+00 7.270000000000E+02 + 2.000000000000E+00 0.000000000000E+00 2.090000000000E-08 2.090000000000E-08 + 3.875880000000E+05 1.000000000000E+00 diff --git a/test/data/sample_data.obs b/test/data/sample_data.obs new file mode 100644 index 0000000000000000000000000000000000000000..d773d3b4d57556afcd38b64ef4167981a00de992 --- /dev/null +++ b/test/data/sample_data.obs @@ -0,0 +1,58 @@ + 3.04 OBSERVATION DATA M RINEX VERSION / TYPE +sbf2rin-13.4.3 20200205 113408 UTC PGM / RUN BY / DATE +SEPT MARKER NAME +Unknown MARKER NUMBER +Unknown Unknown OBSERVER / AGENCY +3021420 SEPT ASTERX-M2 4.4.0 REC # / TYPE / VERS +Unknown Unknown ANT # / TYPE + 4789398.3686 176958.8129 4194502.0999 APPROX POSITION XYZ + 0.0000 0.0000 0.0000 ANTENNA: DELTA H/E/N +G 7 X1 C1C L1C C2W L2W C2L L2L SYS / # / OBS TYPES +E 7 X1 C1C L1C C5Q L5Q C7Q L7Q SYS / # / OBS TYPES +S 3 X1 C1C L1C SYS / # / OBS TYPES +R 5 X1 C1C L1C C2C L2C SYS / # / OBS TYPES +C 5 X1 C2I L2I C7I L7I SYS / # / OBS TYPES +SEPTENTRIO RECEIVERS OUTPUT ALIGNED CARRIER PHASES. COMMENT +NO FURTHER PHASE SHIFT APPLIED IN THE RINEX ENCODER. COMMENT +G L1C SYS / PHASE SHIFT +G L2W SYS / PHASE SHIFT +G L2L 0.00000 SYS / PHASE SHIFT +E L1C 0.00000 SYS / PHASE SHIFT +E L5Q 0.00000 SYS / PHASE SHIFT +E L7Q 0.00000 SYS / PHASE SHIFT +S L1C SYS / PHASE SHIFT +R L1C SYS / PHASE SHIFT +R L2C SYS / PHASE SHIFT +C L2I SYS / PHASE SHIFT +C L7I SYS / PHASE SHIFT + 0.050 INTERVAL + 2019 12 12 11 37 42.0000000 GPS TIME OF FIRST OBS + 2019 12 12 11 45 12.9000000 GPS TIME OF LAST OBS + 36 # OF SATELLITES + C1C 0.000 C2C 0.000 GLONASS COD/PHS/BIS + 8 R03 5 R05 1 R13 -2 R14 -7 R15 0 R19 3 R20 2 R21 4 GLONASS SLOT / FRQ # + END OF HEADER +> 2019 12 12 11 37 42.0000000 0 23 +C05 16.000 40138840.659 6 209013478.40606 40138832.256 6 161622441.87406 +C10 17.000 39633104.355 5 206379985.90205 39633100.852 6 159586077.69206 +C23 18.000 22865676.301 8 119067585.90908 +C32 19.000 22153454.599 8 115358921.19508 +C37 20.000 23690566.611 7 123363010.77907 +E01 11.000 26311074.676 7 138265636.53007 26311074.470 5 103250320.19005 26311070.977 7 105943790.57907 +E09 12.000 25723493.482 5 +E12 13.000 24803095.627 5 130341141.55605 24803092.768 4 97332661.71504 24803092.407 6 99871767.93506 +E19 14.000 24540665.652 6 128962068.93606 24540664.837 5 96302837.53105 24540661.694 6 98815075.63606 +E21 15.000 25609802.251 7 134580416.73507 25609802.381 7 100498367.38007 25609799.519 7 103120055.01507 +G02 1.000 22032430.127 5 +G06 2.000 22147435.410 6 116385570.45206 22147437.095 4 90690045.24704 22147437.422 7 90690046.16907 +G07 3.000 20902411.481 8 109842911.60108 20902406.002 6 85591857.15006 20902406.930 7 85591857.16507 +G09 4.000 21908403.525 6 115129430.37406 21908399.544 1 89711233.32401 21908399.320 5 +G23 5.000 24104714.314 6 126671129.49306 24104706.816 2 98704739.67602 +G30 6.000 21404145.095 8 112479542.93308 21404142.953 6 87646388.26706 21404143.916 7 87646383.27307 +R03 7.000 21945110.617 7 117474090.63807 21945109.720 6 91368580.68606 +R14 8.000 20214975.526 8 107757316.39008 20214976.579 7 83811176.41707 +R15 9.000 22699008.378 5 121296675.96005 22699009.712 5 94341922.34705 +R19 10.000 22853592.745 4 22853590.888 4 +S23 21.000 38309228.895 7 201316353.13407 +S25 22.000 37834172.957 6 198818604.39206 +S36 23.000 37630702.258 7 197750698.01307 diff --git a/test/gtest_navigation.cpp b/test/gtest_navigation.cpp index 18e8c638aa4ce62dcdfaa0a702f7be18652c5c9c..5170cf11310248899fd967b3b870f974a6368b2f 100644 --- a/test/gtest_navigation.cpp +++ b/test/gtest_navigation.cpp @@ -1,5 +1,5 @@ #include "gtest/utils_gtest.h" -#include "gnss_utils/utils/gnss_utils.h" +#include "gnss_utils/gnss_utils.h" TEST(NavigationTests, Whatever) { diff --git a/test/gtest_observations.cpp b/test/gtest_observations.cpp index 2726322b5c7bb4b63e7186a68ded8feb0f541922..5d2de7aab2437b85c303c968fd696844ccf058eb 100644 --- a/test/gtest_observations.cpp +++ b/test/gtest_observations.cpp @@ -2,8 +2,7 @@ #include "gnss_utils/observations.h" using namespace GnssUtils; - -std::string rnx_file; +std::string rnx_file = std::string(_GNSS_UTILS_ROOT_DIR) + "/test/data/sample_data.obs"; obs_t obs; const gtime_t t_start{ 0, 0 }; // no limit const gtime_t t_end{ 0, 0 }; // no limit @@ -33,7 +32,7 @@ TEST(ObservationsTest, AddClearObservation) for (int ii = 0; ii < obs.n; ++ii) { observations.addObservation(obs.data[ii]); - ASSERT_TRUE(equalObservations(obs.data[ii], observations.getObservations()[ii])); + ASSERT_TRUE(obs.data[ii] == observations.getObservations()[ii]); } ASSERT_TRUE(obs.n == observations.getObservations().size()); @@ -42,6 +41,10 @@ TEST(ObservationsTest, AddClearObservation) // Testing clear observations.clearObservations(); ASSERT_TRUE(0 == observations.getObservations().size()); + + // Add duplicated observation (has to crash) + observations.addObservation(obs.data[0]); + ASSERT_DEATH(observations.addObservation(obs.data[0]),""); } TEST(ObservationsTest, LoadFromRinex) @@ -57,10 +60,9 @@ TEST(ObservationsTest, LoadFromRinex) // Comparison ASSERT_TRUE(obs.n == observations.getObservations().size()); - for (int ii = 0; ii < obs.n; ++ii) { - ASSERT_TRUE(equalObservations(obs.data[ii], observations.getObservations()[ii])); + ASSERT_TRUE(obs.data[ii] == observations.getObservations()[ii]); } free(obs.data); @@ -75,7 +77,7 @@ TEST(ObservationsTest, GetObservationBySat) for (int ii = 0; ii < obs.n; ++ii) { - ASSERT_TRUE(equalObservations(obs.data[ii], observations.getObservationBySat(obs.data[ii].sat))); + ASSERT_TRUE(obs.data[ii] == observations.getObservationBySat(obs.data[ii].sat)); } } @@ -89,7 +91,7 @@ TEST(ObservationsTest, GetObservationByIdx) for (int ii = 0; ii < obs.n; ++ii) { // We do this check like this because both loading functions load the rinex file and then sort the observations - ASSERT_TRUE(equalObservations(obs.data[ii], observations.getObservationByIdx(ii))); + ASSERT_TRUE( obs.data[ii] == observations.getObservationByIdx(ii)); } } @@ -103,7 +105,7 @@ TEST(ObservationsTest, data) for (int ii = 0; ii < obs.n; ++ii) { // We do this check like this because both loading functions load the rinex file and then sort the observations - ASSERT_TRUE(equalObservations(obs.data[ii], observations.data()[ii])); + ASSERT_TRUE( obs.data[ii] == observations.data()[ii]); } } @@ -122,26 +124,89 @@ TEST(ObservationsTest, HasSatellite) TEST(ObservationsTest, FindCommonObservations) { - loadRinex(); + Observations observations1; + observations1.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt); + Observations observations2(observations1); + + ASSERT_TRUE(observations1 == observations2); + + Observations common1; + Observations common2; + + Observations::findCommonObservations(observations1, observations2, common1, common2); + + ASSERT_TRUE(common1 == common2); + ASSERT_TRUE(observations1 == common1); + ASSERT_TRUE(observations2 == common2); +} + + +TEST(ObservationsTest, FindCommonObservationsRemoved) +{ + Observations observations1; + observations1.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt); + Observations observations2(observations1); + + // Remove first observation of observations2 + observations2.removeObservationByIdx(0); + + Observations common1; + Observations common2; + + Observations::findCommonObservations(observations1, observations2, common1, common2); + ASSERT_TRUE(common1 == common2); + ASSERT_FALSE(observations1 == common1); + ASSERT_TRUE(observations2 == common2); + +} + +TEST(ObservationsTest, FindCommonObservationsChangeTime) +{ Observations observations1; observations1.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt); Observations observations2(observations1); + // Change time + for (auto&& obs : observations2.getObservations()) + { + obs.time.sec +=10; + } + Observations common1; Observations common2; Observations::findCommonObservations(observations1, observations2, common1, common2); + ASSERT_FALSE(common1 == common2); + ASSERT_TRUE(observations1 == common1); + ASSERT_TRUE(observations2 == common2); + for (auto obs = common1.getObservations().begin(); obs != common1.getObservations().end(); ++obs) { - ASSERT_TRUE(equalObservations(common1.getObservationBySat(obs->sat), common2.getObservationBySat(obs->sat))); + const obsd_t& obs1 = common1.getObservationBySat(obs->sat); + const obsd_t& obs2 = common2.getObservationBySat(obs->sat); + + ASSERT_FALSE(obs1.time == obs2.time); + ASSERT_TRUE(obs1.eventime == obs2.eventime); + ASSERT_TRUE(obs1.timevalid == obs2.timevalid); + ASSERT_TRUE(obs1.sat == obs2.sat); + ASSERT_TRUE(obs1.rcv == obs2.rcv); + ASSERT_TRUE(memcmp(obs1.SNR, obs2.SNR, sizeof(obs1.SNR)) == 0); + ASSERT_TRUE(memcmp(obs1.LLI, obs2.LLI, sizeof(obs1.LLI)) == 0); + ASSERT_TRUE(memcmp(obs1.code, obs2.code, sizeof(obs1.code)) == 0); + ASSERT_TRUE(memcmp(obs1.qualL, obs2.qualL, sizeof(obs1.qualL)) == 0); + ASSERT_TRUE(memcmp(obs1.qualP, obs2.qualP, sizeof(obs1.qualP)) == 0); + ASSERT_TRUE(obs1.freq == obs2.freq); + ASSERT_TRUE(equalArray<double>(obs1.L, obs2.L, sizeof(obs1.L) / sizeof(obs1.L[0]), sizeof(obs2.L) / sizeof(obs2.L[0]))); + ASSERT_TRUE(equalArray<double>(obs1.P, obs2.P, sizeof(obs1.P) / sizeof(obs1.P[0]), sizeof(obs2.P) / sizeof(obs2.P[0]))); + ASSERT_TRUE(equalArray<float>(obs1.D, obs2.D, sizeof(obs1.D) / sizeof(obs1.D[0]), sizeof(obs2.D) / sizeof(obs2.D[0]))); } } int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); - rnx_file = argv[1]; + //rnx_file = argv[1]; return RUN_ALL_TESTS(); -} \ No newline at end of file +}