12 #include "eckit/exception/Exceptions.h"
14 #include "../RowSlice.h"
19 std::shared_ptr<float> lowerBound,
20 std::shared_ptr<float> upperBound) :
22 lowerBound_(lowerBound),
23 upperBound_(upperBound)
25 if (!upperBound && !lowerBound)
27 std::stringstream errStr;
28 errStr <<
"BoundingFilter must contain either upperBound, lowerBound or both.";
29 throw eckit::BadParameter(errStr.str());
32 if (upperBound && lowerBound && (*upperBound < *lowerBound))
34 std::stringstream errStr;
35 errStr <<
"BoundingFilter upperBound must be greater or equal to lowerBound";
36 throw eckit::BadParameter(errStr.str());
42 std::vector<size_t> validRows;
43 if (dataMap.find(
mnemonic_) == dataMap.end())
45 std::ostringstream errStr;
46 errStr <<
"Unknown mnemonic " <<
mnemonic_ <<
" found in bounding filter.";
47 throw eckit::BadParameter(errStr.str());
50 const auto& array = dataMap.at(
mnemonic_);
51 for (
size_t rowIdx = 0; rowIdx < static_cast<size_t>(array.rows()); rowIdx++)
58 validRows.push_back(rowIdx);
66 validRows.push_back(rowIdx);
71 if (validRows.size() !=
static_cast<size_t>(array.rows()))
73 for (
const auto& dataPair : dataMap)
75 dataMap[dataPair.first] =
rowSlice(dataPair.second, validRows);
EigenType rowSlice(const EigenType &arr, const EigenIdxType &idxVec)
Collection of template methods that are used to slice array and vector data.
const std::shared_ptr< float > lowerBound_
BoundingFilter(const std::string &mnemonic, std::shared_ptr< float > lowerBound, std::shared_ptr< float > upperBound)
Constructor.
const std::shared_ptr< float > upperBound_
const std::string mnemonic_
void apply(BufrDataMap &dataMap) final
Apply the filter to the data.
IngesterArrayMap BufrDataMap