8 #ifndef TEST_UFO_TRACKCHECKSHIPMAINLOOP_H_
9 #define TEST_UFO_TRACKCHECKSHIPMAINLOOP_H_
16 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
18 #include "eckit/config/LocalConfiguration.h"
19 #include "eckit/testing/Test.h"
20 #include "ioda/ObsSpace.h"
21 #include "ioda/ObsVector.h"
22 #include "oops/mpi/mpi.h"
23 #include "oops/runs/Test.h"
24 #include "oops/util/Expect.h"
25 #include "test/TestEnvironment.h"
34 const eckit::LocalConfiguration filterConf(
conf,
"Ship Track Check");
36 util::DateTime bgn(
conf.getString(
"window begin"));
37 util::DateTime end(
conf.getString(
"window end"));
39 const eckit::LocalConfiguration obsSpaceConf(
conf,
"obs space");
40 ioda::ObsSpace obsspace(obsSpaceConf, oops::mpi::world(), bgn, end, oops::mpi::myself());
42 if (
conf.has(
"station_ids")) {
43 const std::vector<int> stationIds =
conf.getIntVector(
"station_ids");
44 obsspace.put_db(
"MetaData",
"station_id", stationIds);
48 obsspace, obsspace.obsvariables(),
"ObsError"));
50 obsspace, obsspace.obsvariables()));
56 const std::vector<size_t> expectedFirstRejectionIndices =
57 conf.getUnsignedVector(
"expected first rejection index");
58 const std::vector<int> expectedCategories =
conf.getIntVector(
"expected error category");
59 std::vector<size_t> testedFirstRejectionIndices;
60 std::vector<int> testedErrorCategories;
62 for (
auto const& indexRejected : trackFirstRemovalsInfo.first)
63 testedFirstRejectionIndices.push_back(indexRejected);
64 testedErrorCategories.push_back(trackFirstRemovalsInfo.second);
66 EXPECT_EQUAL(testedFirstRejectionIndices, expectedFirstRejectionIndices);
67 EXPECT_EQUAL(testedErrorCategories, expectedCategories);
68 auto const expectedDistanceSum =
conf.getDoubleVector(
"expected distance sum", {-1});
69 if (*expectedDistanceSum.begin() != -1) {
71 EXPECT(oops::are_all_close_relative(calculatedDistanceSum, expectedDistanceSum, .05));
73 auto const expectedDistancePreviousObservationOmitted =
74 conf.getDoubleVector(
"expected distance previous observation omitted", {-1});
75 if (*expectedDistancePreviousObservationOmitted.begin() != -1) {
77 EXPECT(oops::are_all_close_relative(calculatedDistancePreviousObservationOmitted,
78 expectedDistancePreviousObservationOmitted, .05));
80 auto const expectedDistanceCurrentObservationOmitted =
81 conf.getDoubleVector(
"expected distance current observation omitted", {-1});
82 if (*expectedDistanceCurrentObservationOmitted.begin() != -1) {
84 EXPECT(oops::are_all_close_relative(calculatedDistanceCurrentObservationOmitted,
85 expectedDistanceCurrentObservationOmitted, .05));
87 auto const expectedTimeSum =
conf.getDoubleVector(
"expected time sum", {-1});
88 if (*expectedTimeSum.begin() != -1) {
89 auto calculatedTimeSum = diagnostics.
getTimeSum();
90 EXPECT(oops::are_all_close_relative(calculatedTimeSum, expectedTimeSum, .05));
92 auto const expectedPreviousSegmentDistanceProportion =
conf.getDoubleVector(
93 "expected previous segment distance proportion", {-1});
94 if (*expectedPreviousSegmentDistanceProportion.begin() != -1) {
95 auto calculatedPreviousSegmentDistanceProportion =
97 EXPECT(oops::are_all_close_relative(calculatedPreviousSegmentDistanceProportion,
98 expectedPreviousSegmentDistanceProportion, .05));
100 auto const expectedPreviousObservationDistanceAveragedProportion =
conf.getDoubleVector(
101 "expected previous observation distance averaged proportion", {-1});
102 if (*expectedPreviousObservationDistanceAveragedProportion.begin() != -1) {
103 auto calculatedPreviousObservationDistanceAveragedProportion =
105 EXPECT(oops::are_all_close_relative(
106 calculatedPreviousObservationDistanceAveragedProportion,
107 expectedPreviousObservationDistanceAveragedProportion, .05));
109 auto const expectedPreviousSegmentTimeProportion =
conf.getDoubleVector(
110 "expected previous segment time proportion", {-1});
111 if (*expectedPreviousSegmentTimeProportion.begin() != -1) {
112 auto calculatedPreviousSegmentTimeProportion =
114 EXPECT(oops::are_all_close_relative(calculatedPreviousSegmentTimeProportion,
115 expectedPreviousSegmentTimeProportion, .05));
117 auto const expectedPreviousAndFastestSegmentTimeProportion =
conf.getDoubleVector(
118 "expected previous and fastest segment time proportion", {-1});
119 if (*expectedPreviousAndFastestSegmentTimeProportion.begin() != -1) {
120 auto calculatedPreviousAndFastestSegmentTimeProportion =
122 EXPECT(oops::are_all_close_relative(calculatedPreviousAndFastestSegmentTimeProportion,
123 expectedPreviousAndFastestSegmentTimeProportion, .05));
126 for (
auto const& i : expectedFirstRejectionIndices) {
135 std::string
testid()
const override {
return "ufo::test::TrackCheckShipMainLoop";}
138 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
140 const eckit::LocalConfiguration
conf(::test::TestEnvironment::config());
141 for (
const std::string & testCaseName :
conf.keys())
143 const eckit::LocalConfiguration testCaseConf(::test::TestEnvironment::config(), testCaseName);
144 ts.emplace_back(
CASE(
"ufo/TrackCheckShipMainLoop/" + testCaseName, testCaseConf)
157 #endif // TEST_UFO_TRACKCHECKSHIPMAINLOOP_H_