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"
22 #include "ufo/filters/QCflags.h"
23 
24 namespace eckit {
25  class Configuration;
26 }
27 
28 namespace ioda {
29  template <typename DATATYPE> class ObsDataVector;
30  class ObsSpace;
31 }
32 
33 namespace util {
34  class DateTime;
35 }
36 
37 namespace ufo {
38 
39 class DistanceCalculator;
40 class EquispacedBinSelectorBase;
41 class GaussianThinningParameters;
42 class ObsAccessor;
43 class RecursiveSplitter;
44 class SpatialBinSelector;
45 
46 /// \brief Group observations into grid cells and preserve only one observation in each cell.
47 ///
48 /// Cell assignment can be based on an arbitrary combination of:
49 /// - horizontal position
50 /// - vertical position (in terms of height or pressure)
51 /// - time
52 /// - category (arbitrary integer associated with each observation).
53 ///
54 /// Selection of the observation to preserve in each cell is based on
55 /// - its position in the cell
56 /// - optionally, its priority.
57 ///
58 /// See GaussianThinningParameters for the documentation of the available options.
60  private util::ObjectCounter<Gaussian_Thinning> {
61  public:
62  /// The type of parameters accepted by the constructor of this filter.
63  /// This typedef is used by the FilterFactory.
65 
66  static const std::string classname() {return "ufo::Gaussian_Thinning";}
67 
68  Gaussian_Thinning(ioda::ObsSpace &obsdb, const GaussianThinningParameters &params,
69  std::shared_ptr<ioda::ObsDataVector<int> > flags,
70  std::shared_ptr<ioda::ObsDataVector<float> > obserr);
71 
72  private:
73  void print(std::ostream &) const override;
74  void applyFilter(const std::vector<bool> &, const Variables &,
75  std::vector<std::vector<bool>> &) const override;
76  int qcFlag() const override {return QCflags::thinned;}
77 
79 
80  void groupObservationsBySpatialLocation(const std::vector<size_t> &validObsIds,
81  const DistanceCalculator &distanceCalculator,
82  const ObsAccessor &obsAccessor,
83  RecursiveSplitter &splitter,
84  std::vector<float> &distancesToBinCenter) const;
85 
86  void groupObservationsByVerticalCoordinate(const std::vector<size_t> &validObsIds,
87  const DistanceCalculator &distanceCalculator,
88  const ObsAccessor &obsAccessor,
89  RecursiveSplitter &splitter,
90  std::vector<float> &distancesToBinCenter) const;
91 
92  void groupObservationsByTime(const std::vector<size_t> &validObsIds,
93  const DistanceCalculator &distanceCalculator,
94  const ObsAccessor &obsAccessor,
95  RecursiveSplitter &splitter,
96  std::vector<float> &distancesToBinCenter) const;
97 
98  std::vector<bool> identifyThinnedObservations(
99  const std::vector<size_t> &validObsIds,
100  const ObsAccessor &obsAccessor,
101  const RecursiveSplitter &splitter,
102  const std::vector<float> &distancesToBinCenter) const;
103 
104  std::function<bool(size_t, size_t)> makeObservationComparator(
105  const std::vector<size_t> &validObsIds,
106  const std::vector<float> &distancesToBinCenter,
107  const ObsAccessor &obsAccessor) const;
108 
109  static boost::optional<SpatialBinSelector> makeSpatialBinSelector(
110  const GaussianThinningParameters &options);
111 
112  static std::unique_ptr<EquispacedBinSelectorBase> makeVerticalBinSelector(
113  const GaussianThinningParameters &options);
114 
115  static std::unique_ptr<EquispacedBinSelectorBase> makeTimeBinSelector(
116  const GaussianThinningParameters &options,
117  const util::DateTime &windowStart,
118  const util::DateTime &windowEnd,
119  util::DateTime &timeOffset);
120 
121  static std::unique_ptr<DistanceCalculator> makeDistanceCalculator(
122  const GaussianThinningParameters &options);
123 
124  private:
126 };
127 
128 } // namespace ufo
129 
130 #endif // UFO_FILTERS_GAUSSIAN_THINNING_H_
Calculates distances between observations and centres of bins used during thinning.
Base class for UFO QC filters.
Definition: FilterBase.h:45
Group observations into grid cells and preserve only one observation in each cell.
void applyFilter(const std::vector< bool > &, const Variables &, std::vector< std::vector< bool >> &) const override
GaussianThinningParameters options_
static boost::optional< SpatialBinSelector > makeSpatialBinSelector(const GaussianThinningParameters &options)
void print(std::ostream &) const override
ObsAccessor createObsAccessor() const
void groupObservationsByTime(const std::vector< size_t > &validObsIds, const DistanceCalculator &distanceCalculator, const ObsAccessor &obsAccessor, RecursiveSplitter &splitter, std::vector< float > &distancesToBinCenter) const
void groupObservationsBySpatialLocation(const std::vector< size_t > &validObsIds, const DistanceCalculator &distanceCalculator, const ObsAccessor &obsAccessor, RecursiveSplitter &splitter, std::vector< float > &distancesToBinCenter) const
static const std::string classname()
std::vector< bool > identifyThinnedObservations(const std::vector< size_t > &validObsIds, const ObsAccessor &obsAccessor, const RecursiveSplitter &splitter, const std::vector< float > &distancesToBinCenter) const
Gaussian_Thinning(ioda::ObsSpace &obsdb, const GaussianThinningParameters &params, std::shared_ptr< ioda::ObsDataVector< int > > flags, std::shared_ptr< ioda::ObsDataVector< float > > obserr)
int qcFlag() const override
static std::unique_ptr< EquispacedBinSelectorBase > makeTimeBinSelector(const GaussianThinningParameters &options, const util::DateTime &windowStart, const util::DateTime &windowEnd, util::DateTime &timeOffset)
void groupObservationsByVerticalCoordinate(const std::vector< size_t > &validObsIds, const DistanceCalculator &distanceCalculator, const ObsAccessor &obsAccessor, RecursiveSplitter &splitter, std::vector< float > &distancesToBinCenter) const
std::function< bool(size_t, size_t)> makeObservationComparator(const std::vector< size_t > &validObsIds, const std::vector< float > &distancesToBinCenter, const ObsAccessor &obsAccessor) const
GaussianThinningParameters Parameters_
static std::unique_ptr< EquispacedBinSelectorBase > makeVerticalBinSelector(const GaussianThinningParameters &options)
static std::unique_ptr< DistanceCalculator > makeDistanceCalculator(const GaussianThinningParameters &options)
Options controlling the operation of the Gaussian_Thinning filter.
This class provides access to observations that may be held on multiple MPI ranks.
Definition: ObsAccessor.h:56
Partitions an array into groups of elements equivalent according to certain criteria.
Forward declarations.
Definition: ObsAodExt.h:21
Forward declarations.
Definition: ObsAodExt.h:25
constexpr int thinned
Definition: QCflags.h:26
Definition: RunCRTM.h:27