UFO
TrackCheckShipMainLoop.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2020 Met Office UK
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
8 #ifndef TEST_UFO_TRACKCHECKSHIPMAINLOOP_H_
9 #define TEST_UFO_TRACKCHECKSHIPMAINLOOP_H_
10 
11 #include <iomanip>
12 #include <memory>
13 #include <string>
14 #include <vector>
15 
16 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
17 
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"
28 #include "ufo/filters/Variables.h"
29 
30 namespace ufo {
31 namespace test {
32 
33 void testFirstRejectionSimultaneousIncluded(const eckit::LocalConfiguration &conf) {
34  const eckit::LocalConfiguration filterConf(conf, "Ship Track Check");
35 
36  util::DateTime bgn(conf.getString("window begin"));
37  util::DateTime end(conf.getString("window end"));
38 
39  const eckit::LocalConfiguration obsSpaceConf(conf, "obs space");
40  ioda::ObsSpace obsspace(obsSpaceConf, oops::mpi::world(), bgn, end, oops::mpi::myself());
41 
42  if (conf.has("station_ids")) {
43  const std::vector<int> stationIds = conf.getIntVector("station_ids");
44  obsspace.put_db("MetaData", "station_id", stationIds);
45  }
46 
47  std::shared_ptr<ioda::ObsDataVector<float>> obserr(new ioda::ObsDataVector<float>(
48  obsspace, obsspace.obsvariables(), "ObsError"));
49  std::shared_ptr<ioda::ObsDataVector<int>> qcflags(new ioda::ObsDataVector<int>(
50  obsspace, obsspace.obsvariables()));
51 
52  ufo::TrackCheckShip filter(obsspace, filterConf, qcflags, obserr);
53  filter.preProcess();
54  const ufo::TrackCheckShipDiagnostics diagnostics = *filter.diagnostics();
55 
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;
61  for (auto const& trackFirstRemovalsInfo : diagnostics.getFirstIterativeRemovalInfo()) {
62  for (auto const& indexRejected : trackFirstRemovalsInfo.first)
63  testedFirstRejectionIndices.push_back(indexRejected);
64  testedErrorCategories.push_back(trackFirstRemovalsInfo.second);
65  }
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) {
70  auto calculatedDistanceSum = diagnostics.getDistanceSum();
71  EXPECT(oops::are_all_close_relative(calculatedDistanceSum, expectedDistanceSum, .05));
72  }
73  auto const expectedDistancePreviousObservationOmitted =
74  conf.getDoubleVector("expected distance previous observation omitted", {-1});
75  if (*expectedDistancePreviousObservationOmitted.begin() != -1) {
76  auto calculatedDistancePreviousObservationOmitted = diagnostics.getDistancePrevObsOmitted();
77  EXPECT(oops::are_all_close_relative(calculatedDistancePreviousObservationOmitted,
78  expectedDistancePreviousObservationOmitted, .05));
79  }
80  auto const expectedDistanceCurrentObservationOmitted =
81  conf.getDoubleVector("expected distance current observation omitted", {-1});
82  if (*expectedDistanceCurrentObservationOmitted.begin() != -1) {
83  auto calculatedDistanceCurrentObservationOmitted = diagnostics.getDistanceCurrentObsOmitted();
84  EXPECT(oops::are_all_close_relative(calculatedDistanceCurrentObservationOmitted,
85  expectedDistanceCurrentObservationOmitted, .05));
86  }
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));
91  }
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));
99  }
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));
108  }
109  auto const expectedPreviousSegmentTimeProportion = conf.getDoubleVector(
110  "expected previous segment time proportion", {-1});
111  if (*expectedPreviousSegmentTimeProportion.begin() != -1) {
112  auto calculatedPreviousSegmentTimeProportion =
113  diagnostics.getPreviousSegmentTimeProportion();
114  EXPECT(oops::are_all_close_relative(calculatedPreviousSegmentTimeProportion,
115  expectedPreviousSegmentTimeProportion, .05));
116  }
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));
124  }
125 
126  for (auto const& i : expectedFirstRejectionIndices) {
127  EXPECT_EQUAL((*qcflags)[0][i], ufo::QCflags::track);
128  // tests that the rejected observations are changing the qc flags correctly
129  }
130 }
131 
132 
133 class TrackCheckShipMainLoop : public oops::Test {
134  private:
135  std::string testid() const override {return "ufo::test::TrackCheckShipMainLoop";}
136 
137  void register_tests() const override {
138  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
139 
140  const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
141  for (const std::string & testCaseName : conf.keys())
142  {
143  const eckit::LocalConfiguration testCaseConf(::test::TestEnvironment::config(), testCaseName);
144  ts.emplace_back(CASE("ufo/TrackCheckShipMainLoop/" + testCaseName, testCaseConf)
145  {
147  });
148  }
149  }
150 
151  void clear() const override {}
152 };
153 
154 } // namespace test
155 } // namespace ufo
156 
157 #endif // TEST_UFO_TRACKCHECKSHIPMAINLOOP_H_
ufo::TrackCheckShipDiagnostics
Definition: TrackCheckShipDiagnostics.h:17
ufo::TrackCheckShipDiagnostics::getPreviousAndFastestSegmentTimeProportion
std::vector< double > getPreviousAndFastestSegmentTimeProportion() const
Definition: TrackCheckShipDiagnostics.h:128
ufo::test::TrackCheckShipMainLoop::testid
std::string testid() const override
Definition: TrackCheckShipMainLoop.h:135
ufo::test::TrackCheckShipMainLoop::clear
void clear() const override
Definition: TrackCheckShipMainLoop.h:151
ufo::test::CASE
CASE("ufo/MetOfficeBuddyPairFinder/" "Duplicates, constraints on buddy counts, legacy pair collector")
Definition: test/ufo/MetOfficeBuddyPairFinder.h:171
ufo::TrackCheckShipDiagnostics::getDistancePrevObsOmitted
std::vector< double > getDistancePrevObsOmitted() const
Definition: TrackCheckShipDiagnostics.h:88
ufo::FilterBase::preProcess
void preProcess()
Definition: FilterBase.cc:66
ufo::TrackCheckShip::diagnostics
const TrackCheckShipDiagnostics * diagnostics() const
Definition: TrackCheckShip.cc:86
TrackCheckShip.h
ufo::TrackCheckShipDiagnostics::getFirstIterativeRemovalInfo
const std::vector< FirstIterativeRemovalInfo > & getFirstIterativeRemovalInfo() const
Definition: TrackCheckShipDiagnostics.h:75
ufo
Definition: RunCRTM.h:27
Variables.h
ufo::test::TrackCheckShipMainLoop
Definition: TrackCheckShipMainLoop.h:133
ufo::QCflags::track
constexpr int track
Definition: QCflags.h:26
ufo::test::TrackCheckShipMainLoop::register_tests
void register_tests() const override
Definition: TrackCheckShipMainLoop.h:137
ufo::TrackCheckShipDiagnostics::getPreviousSegmentTimeProportion
std::vector< double > getPreviousSegmentTimeProportion() const
Definition: TrackCheckShipDiagnostics.h:122
TrackCheckShipDiagnostics.h
ioda::ObsDataVector
Definition: BackgroundCheck.h:26
ufo::TrackCheckShip
Checks tracks of ships and buoys, rejecting observations whose locations and timestamps make them inc...
Definition: src/ufo/filters/TrackCheckShip.h:59
ufo::TrackCheckShipDiagnostics::getPreviousSegmentDistanceProportion
std::vector< double > getPreviousSegmentDistanceProportion() const
Definition: TrackCheckShipDiagnostics.h:108
ufo::TrackCheckShipDiagnostics::getDistanceCurrentObsOmitted
std::vector< double > getDistanceCurrentObsOmitted() const
Definition: TrackCheckShipDiagnostics.h:96
ufo::TrackCheckShipDiagnostics::getTimeSum
std::vector< double > getTimeSum() const
Definition: TrackCheckShipDiagnostics.h:102
ufo::TrackCheckShipDiagnostics::getDistanceSum
std::vector< double > getDistanceSum() const
Definition: TrackCheckShipDiagnostics.h:80
ufo::TrackCheckShipDiagnostics::getPreviousObservationDistanceAveragedProportion
std::vector< double > getPreviousObservationDistanceAveragedProportion() const
Definition: TrackCheckShipDiagnostics.h:114
conf
Definition: conf.py:1
ufo::test::testFirstRejectionSimultaneousIncluded
void testFirstRejectionSimultaneousIncluded(const eckit::LocalConfiguration &conf)
Definition: TrackCheckShipMainLoop.h:33