UFO
Gaussian_Thinning.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 UCAR
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 UFO_FILTERS_GAUSSIAN_THINNING_H_
9 #define UFO_FILTERS_GAUSSIAN_THINNING_H_
10 
11 #include <memory>
12 #include <ostream>
13 #include <string>
14 #include <vector>
15 
16 #include <boost/optional.hpp>
17 
18 #include "ioda/ObsDataVector.h"
19 #include "oops/util/ObjectCounter.h"
20 #include "ufo/filters/FilterBase.h"
21 #include "ufo/filters/QCflags.h"
22 
23 namespace eckit {
24  class Configuration;
25 }
26 
27 namespace ioda {
28  template <typename DATATYPE> class ObsDataVector;
29  class ObsSpace;
30 }
31 
32 namespace util {
33  class DateTime;
34 }
35 
36 namespace ufo {
37 
38 class DistanceCalculator;
39 class EquispacedBinSelector;
40 class GaussianThinningParameters;
41 class RecursiveSplitter;
42 class SpatialBinSelector;
43 class ParallelObsDistribution;
44 
45 /// \brief Group observations into grid cells and preserve only one observation in each cell.
46 ///
47 /// Cell assignment can be based on an arbitrary combination of:
48 /// - horizontal position
49 /// - vertical position (in terms of air pressure)
50 /// - time
51 /// - category (arbitrary integer associated with each observation).
52 ///
53 /// Selection of the observation to preserve in each cell is based on
54 /// - its position in the cell
55 /// - optionally, its priority.
56 ///
57 /// See GaussianThinningParameters for the documentation of the available options.
59  private util::ObjectCounter<Gaussian_Thinning> {
60  public:
61  static const std::string classname() {return "ufo::Gaussian_Thinning";}
62 
63  Gaussian_Thinning(ioda::ObsSpace &obsdb, const eckit::Configuration &config,
64  std::shared_ptr<ioda::ObsDataVector<int> > flags,
65  std::shared_ptr<ioda::ObsDataVector<float> > obserr);
66 
67  ~Gaussian_Thinning() override;
68 
69  private:
70  void print(std::ostream &) const override;
71  void applyFilter(const std::vector<bool> &, const Variables &,
72  std::vector<std::vector<bool>> &) const override;
73  int qcFlag() const override {return QCflags::thinned;}
74 
75  std::vector<size_t> getValidObservationIds(const std::vector<bool> &apply,
76  const ParallelObsDistribution &obsDistribution) const;
77 
78  void groupObservationsByCategory(const std::vector<size_t> &validObsIds,
79  const ParallelObsDistribution &obsDistribution,
80  RecursiveSplitter &splitter) const;
81 
82  void groupObservationsBySpatialLocation(const std::vector<size_t> &validObsIds,
83  const DistanceCalculator &distanceCalculator,
84  const ParallelObsDistribution &obsDistribution,
85  RecursiveSplitter &splitter,
86  std::vector<float> &distancesToBinCenter) const;
87 
88  void groupObservationsByPressure(const std::vector<size_t> &validObsIds,
89  const DistanceCalculator &distanceCalculator,
90  const ParallelObsDistribution &obsDistribution,
91  RecursiveSplitter &splitter,
92  std::vector<float> &distancesToBinCenter) const;
93 
94  void groupObservationsByTime(const std::vector<size_t> &validObsIds,
95  const DistanceCalculator &distanceCalculator,
96  const ParallelObsDistribution &obsDistribution,
97  RecursiveSplitter &splitter,
98  std::vector<float> &distancesToBinCenter) const;
99 
100  std::vector<bool> identifyThinnedObservations(
101  const std::vector<size_t> &validObsIds,
102  const ParallelObsDistribution &obsDistribution,
103  const RecursiveSplitter &splitter,
104  const std::vector<float> &distancesToBinCenter) const;
105 
106  std::function<bool(size_t, size_t)> makeObservationComparator(
107  const std::vector<size_t> &validObsIds,
108  const std::vector<float> &distancesToBinCenter,
109  const ParallelObsDistribution &obsDistribution) const;
110 
111  void flagThinnedObservations(const std::vector<bool> &isThinned,
112  const ParallelObsDistribution &obsDistribution,
113  std::vector<std::vector<bool> > &flagged) const;
114 
115  static boost::optional<SpatialBinSelector> makeSpatialBinSelector(
116  const GaussianThinningParameters &options);
117 
118  static boost::optional<EquispacedBinSelector> makePressureBinSelector(
119  const GaussianThinningParameters &options);
120 
121  static boost::optional<EquispacedBinSelector> makeTimeBinSelector(
122  const GaussianThinningParameters &options, util::DateTime &timeOffset);
123 
124  static std::unique_ptr<DistanceCalculator> makeDistanceCalculator(
125  const GaussianThinningParameters &options);
126 
127  private:
128  std::unique_ptr<GaussianThinningParameters> options_;
129 };
130 
131 } // namespace ufo
132 
133 #endif // UFO_FILTERS_GAUSSIAN_THINNING_H_
ufo::Gaussian_Thinning::flagThinnedObservations
void flagThinnedObservations(const std::vector< bool > &isThinned, const ParallelObsDistribution &obsDistribution, std::vector< std::vector< bool > > &flagged) const
Definition: Gaussian_Thinning.cc:424
FilterBase.h
ufo::Gaussian_Thinning::groupObservationsBySpatialLocation
void groupObservationsBySpatialLocation(const std::vector< size_t > &validObsIds, const DistanceCalculator &distanceCalculator, const ParallelObsDistribution &obsDistribution, RecursiveSplitter &splitter, std::vector< float > &distancesToBinCenter) const
Definition: Gaussian_Thinning.cc:130
ufo::ParallelObsDistribution
Describes how observations in an ObsSpace are distributed across MPI processes.
Definition: src/ufo/utils/ParallelObsDistribution.h:19
ufo::Variables
Definition: src/ufo/filters/Variables.h:24
ufo::Gaussian_Thinning::applyFilter
void applyFilter(const std::vector< bool > &, const Variables &, std::vector< std::vector< bool >> &) const override
Definition: Gaussian_Thinning.cc:73
ufo::Gaussian_Thinning::qcFlag
int qcFlag() const override
Definition: Gaussian_Thinning.h:73
ufo::Gaussian_Thinning
Group observations into grid cells and preserve only one observation in each cell.
Definition: Gaussian_Thinning.h:59
ufo::Gaussian_Thinning::identifyThinnedObservations
std::vector< bool > identifyThinnedObservations(const std::vector< size_t > &validObsIds, const ParallelObsDistribution &obsDistribution, const RecursiveSplitter &splitter, const std::vector< float > &distancesToBinCenter) const
Definition: Gaussian_Thinning.cc:369
ufo::FilterBase
FilterBase: Base class for UFO QC filters.
Definition: FilterBase.h:42
ufo::RecursiveSplitter
Partitions an array into groups of elements equivalent according to certain criteria.
Definition: src/ufo/utils/RecursiveSplitter.h:63
ioda
Definition: ObsAtmSfcInterp.h:24
ufo
Definition: RunCRTM.h:27
ufo::Gaussian_Thinning::~Gaussian_Thinning
~Gaussian_Thinning() override
Definition: Gaussian_Thinning.cc:68
eckit
Forward declarations.
Definition: ObsAtmSfcInterp.h:20
ufo::Gaussian_Thinning::makeDistanceCalculator
static std::unique_ptr< DistanceCalculator > makeDistanceCalculator(const GaussianThinningParameters &options)
Definition: Gaussian_Thinning.cc:117
ufo::GaussianThinningParameters
Options controlling the operation of the Gaussian_Thinning filter.
Definition: GaussianThinningParameters.h:54
ufo::Gaussian_Thinning::Gaussian_Thinning
Gaussian_Thinning(ioda::ObsSpace &obsdb, const eckit::Configuration &config, std::shared_ptr< ioda::ObsDataVector< int > > flags, std::shared_ptr< ioda::ObsDataVector< float > > obserr)
Definition: Gaussian_Thinning.cc:54
QCflags.h
ufo::QCflags::thinned
constexpr int thinned
Definition: QCflags.h:21
ufo::Gaussian_Thinning::options_
std::unique_ptr< GaussianThinningParameters > options_
Definition: Gaussian_Thinning.h:128
ioda::ObsDataVector< int >
ufo::Gaussian_Thinning::makePressureBinSelector
static boost::optional< EquispacedBinSelector > makePressureBinSelector(const GaussianThinningParameters &options)
Definition: Gaussian_Thinning.cc:274
ufo::Gaussian_Thinning::groupObservationsByPressure
void groupObservationsByPressure(const std::vector< size_t > &validObsIds, const DistanceCalculator &distanceCalculator, const ParallelObsDistribution &obsDistribution, RecursiveSplitter &splitter, std::vector< float > &distancesToBinCenter) const
Definition: Gaussian_Thinning.cc:235
ufo::Gaussian_Thinning::makeSpatialBinSelector
static boost::optional< SpatialBinSelector > makeSpatialBinSelector(const GaussianThinningParameters &options)
Definition: Gaussian_Thinning.cc:188
ufo::Gaussian_Thinning::makeTimeBinSelector
static boost::optional< EquispacedBinSelector > makeTimeBinSelector(const GaussianThinningParameters &options, util::DateTime &timeOffset)
Definition: Gaussian_Thinning.cc:337
ufo::Gaussian_Thinning::print
void print(std::ostream &) const override
Definition: Gaussian_Thinning.cc:442
ufo::Gaussian_Thinning::getValidObservationIds
std::vector< size_t > getValidObservationIds(const std::vector< bool > &apply, const ParallelObsDistribution &obsDistribution) const
Definition: Gaussian_Thinning.cc:103
ufo::Gaussian_Thinning::groupObservationsByCategory
void groupObservationsByCategory(const std::vector< size_t > &validObsIds, const ParallelObsDistribution &obsDistribution, RecursiveSplitter &splitter) const
Definition: Gaussian_Thinning.cc:216
util
Definition: Gaussian_Thinning.h:32
ufo::Gaussian_Thinning::groupObservationsByTime
void groupObservationsByTime(const std::vector< size_t > &validObsIds, const DistanceCalculator &distanceCalculator, const ParallelObsDistribution &obsDistribution, RecursiveSplitter &splitter, std::vector< float > &distancesToBinCenter) const
Definition: Gaussian_Thinning.cc:294
ufo::DistanceCalculator
Calculates distances between observations and centres of bins used during thinning.
Definition: DistanceCalculator.h:33
ufo::Gaussian_Thinning::makeObservationComparator
std::function< bool(size_t, size_t)> makeObservationComparator(const std::vector< size_t > &validObsIds, const std::vector< float > &distancesToBinCenter, const ParallelObsDistribution &obsDistribution) const
Definition: Gaussian_Thinning.cc:392
ufo::Gaussian_Thinning::classname
static const std::string classname()
Definition: Gaussian_Thinning.h:61