8 #ifndef UFO_FILTERS_GAUSSIAN_THINNING_H_
9 #define UFO_FILTERS_GAUSSIAN_THINNING_H_
16 #include <boost/optional.hpp>
18 #include "ioda/ObsDataVector.h"
19 #include "oops/util/ObjectCounter.h"
29 template <
typename DATATYPE>
class ObsDataVector;
39 class DistanceCalculator;
40 class EquispacedBinSelectorBase;
41 class GaussianThinningParameters;
43 class RecursiveSplitter;
44 class SpatialBinSelector;
60 private util::ObjectCounter<Gaussian_Thinning> {
66 static const std::string
classname() {
return "ufo::Gaussian_Thinning";}
73 void print(std::ostream &)
const override;
75 std::vector<std::vector<bool>> &)
const override;
84 std::vector<float> &distancesToBinCenter)
const;
90 std::vector<float> &distancesToBinCenter)
const;
96 std::vector<float> &distancesToBinCenter)
const;
99 const std::vector<size_t> &validObsIds,
102 const std::vector<float> &distancesToBinCenter)
const;
105 const std::vector<size_t> &validObsIds,
106 const std::vector<float> &distancesToBinCenter,
117 const util::DateTime &windowStart,
118 const util::DateTime &windowEnd,
119 util::DateTime &timeOffset);
Calculates distances between observations and centres of bins used during thinning.
Base class for UFO QC filters.
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 ¶ms, 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.
Partitions an array into groups of elements equivalent according to certain criteria.