Skip to content

Commit 1ac59f6

Browse files
committed
MATK-161 consolidated param matching + tests in GRIBparamID mode
1 parent 618ac13 commit 1ac59f6

File tree

2 files changed

+186
-248
lines changed

2 files changed

+186
-248
lines changed

src/metkit/mars/ParamID.h

Lines changed: 66 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -69,150 +69,60 @@ inline long replaceTable(size_t table, long paramid) {
6969

7070
template <typename REQUEST_T, typename AXIS_T>
7171
void ParamID::normalise(const REQUEST_T& request, std::vector<Param>& req, const AXIS_T& axis, bool& windConversion,
72-
bool fullTableDropping, bool useParamId) {
72+
bool fullTableDropping, bool forceUseGRIBParamId) {
7373

7474
static const bool useGRIBParamID = eckit::Resource<bool>("useGRIBParamID", false);
7575

76-
const std::vector<WindFamily>& windFamilies(getWindFamilies());
77-
78-
79-
if (useGRIBParamID || useParamId) {
80-
81-
82-
std::set<Param> inAxis;
83-
for (typename AXIS_T::const_iterator j = axis.begin(); j != axis.end(); ++j) {
84-
inAxis.insert((*j));
85-
}
86-
87-
std::vector<Param> newreq;
88-
newreq.reserve(req.size());
89-
90-
for (std::vector<Param>::const_iterator k = req.begin(); k != req.end(); ++k) {
91-
const Param& p = (*k);
92-
93-
Param alt;
94-
95-
if (p.table()) {
96-
alt = Param(0, (p.table() == 128 ? 0 : p.table()) * 1000 + p.value()); // No '.' version
97-
}
98-
else {
99-
size_t t = p.value() / 1000;
100-
size_t v = p.value() % 1000;
101-
alt = Param(t == 0 ? 128 : t, v); // '.' version
102-
}
103-
104-
if (inAxis.find(p) != inAxis.end()) {
105-
newreq.push_back(p);
106-
}
107-
else if (inAxis.find(alt) != inAxis.end()) {
108-
newreq.push_back(alt);
109-
}
110-
else {
111-
newreq.push_back(p);
112-
}
113-
114-
LOG_DEBUG_LIB(LibMetkit) << "useGRIBParamID p=" << p << ", alt=" << alt << ", choice=" << newreq.back()
115-
<< std::endl;
116-
}
117-
118-
119-
req = newreq;
120-
121-
for (eckit::Ordinal w = 0; w < windFamilies.size(); w++) {
76+
bool useParamId = useGRIBParamID || forceUseGRIBParamId;
12277

123-
const Param windU(windFamilies[w].u_);
124-
const Param windV(windFamilies[w].v_);
125-
const Param windVO(windFamilies[w].vo_);
126-
const Param windD(windFamilies[w].d_);
127-
128-
bool wantU = false;
129-
bool wantV = false;
130-
bool wantVO = false;
131-
bool wantD = false;
132-
133-
// Check if wind is requested
134-
for (eckit::Ordinal i = 0; i < req.size(); i++) {
135-
if (req[i] == windU)
136-
wantU = true;
137-
if (req[i] == windV)
138-
wantV = true;
139-
if (req[i] == windVO)
140-
wantVO = true;
141-
if (req[i] == windD)
142-
wantD = true;
143-
}
144-
145-
// Check if we have got it, axis should be sorted
146-
bool gotU = false;
147-
bool gotV = false;
148-
149-
if (wantU)
150-
gotU = std::binary_search(axis.begin(), axis.end(), windU);
151-
152-
if (wantV)
153-
gotV = std::binary_search(axis.begin(), axis.end(), windV);
78+
const std::vector<WindFamily>& windFamilies(getWindFamilies());
15479

80+
std::vector<std::pair<Param, Param> > tableDropped;
15581

156-
if ((wantU && !gotU) || (wantV && !gotV)) {
157-
// Push VO and D if needed
158-
if (!wantVO)
159-
req.push_back(windVO);
160-
if (!wantD)
161-
req.push_back(windD);
82+
std::set<Param> inAxis;
83+
std::map<long, Param> inAxisParamID;
84+
std::set<Param> wind;
16285

163-
LOG_DEBUG_LIB(LibMetkit) << "U/V conversion requested U=" << windU << ", V=" << windV
164-
<< ", VO=" << windVO << ", D=" << windD << std::endl;
165-
windConversion = true;
166-
}
167-
}
86+
for (typename AXIS_T::const_iterator j = axis.begin(); j != axis.end(); ++j) {
87+
inAxis.emplace(*j);
88+
inAxisParamID[j->paramId()] = *j;
16889
}
169-
else {
17090

171-
std::vector<std::pair<Param, Param> > tableDropped;
91+
std::vector<Param> newreq;
92+
newreq.reserve(req.size());
17293

173-
std::set<Param> inAxis;
174-
std::map<long, Param> inAxisParamID;
175-
std::set<Param> wind;
176-
177-
for (typename AXIS_T::const_iterator j = axis.begin(); j != axis.end(); ++j) {
178-
inAxis.emplace(*j);
179-
inAxisParamID[j->paramId()] = *j;
94+
for (auto r : req) {
95+
if (inAxis.find(r) != inAxis.end()) { // Perfect match - look no further
96+
newreq.push_back(r);
18097
}
181-
182-
std::vector<Param> newreq;
183-
newreq.reserve(req.size());
184-
185-
for (auto r : req) {
186-
if (inAxis.find(r) != inAxis.end()) { // Perfect match - look no further
187-
newreq.push_back(r);
98+
else { // r is normalised to ParamID
99+
long paramid = r.paramId();
100+
auto ap = inAxisParamID.find(paramid);
101+
if (ap != inAxisParamID.end()) { // ParamID representation matching - look no further
102+
newreq.push_back(ap->second);
188103
}
189-
else { // r is normalised to ParamID
190-
long paramid = r.paramId();
191-
auto ap = inAxisParamID.find(paramid);
192-
if (ap != inAxisParamID.end()) { // ParamID representation matching - look no further
193-
newreq.push_back(ap->second);
194-
}
195-
else { // Special case for U/V - exact match
196-
bool ok = false;
197-
for (eckit::Ordinal w = 0; w < windFamilies.size(); w++) {
198-
if ((paramid == windFamilies[w].u_.paramId() || paramid == windFamilies[w].u_.grib1value() ||
199-
paramid == windFamilies[w].v_.paramId() || paramid == windFamilies[w].v_.grib1value()) &&
200-
inAxis.find(windFamilies[w].vo_) != inAxis.end() &&
201-
inAxis.find(windFamilies[w].d_) != inAxis.end()) {
202-
203-
if (paramid == windFamilies[w].u_.paramId() || paramid == windFamilies[w].u_.grib1value())
204-
newreq.push_back(windFamilies[w].u_);
205-
else
206-
newreq.push_back(windFamilies[w].v_);
207-
208-
wind.emplace(windFamilies[w].vo_);
209-
wind.emplace(windFamilies[w].d_);
210-
windConversion = true;
211-
212-
ok = true;
213-
break;
214-
}
104+
else { // Special case for U/V - exact match
105+
bool ok = false;
106+
for (eckit::Ordinal w = 0; w < windFamilies.size(); w++) {
107+
if ((paramid == windFamilies[w].u_.paramId() || (!useParamId && paramid == windFamilies[w].u_.grib1value()) ||
108+
paramid == windFamilies[w].v_.paramId() || (!useParamId && paramid == windFamilies[w].v_.grib1value())) &&
109+
inAxis.find(windFamilies[w].vo_) != inAxis.end() &&
110+
inAxis.find(windFamilies[w].d_) != inAxis.end()) {
111+
112+
if (paramid == windFamilies[w].u_.paramId() || paramid == windFamilies[w].u_.grib1value())
113+
newreq.push_back(windFamilies[w].u_);
114+
else
115+
newreq.push_back(windFamilies[w].v_);
116+
117+
wind.emplace(windFamilies[w].vo_);
118+
wind.emplace(windFamilies[w].d_);
119+
windConversion = true;
120+
121+
ok = true;
122+
break;
215123
}
124+
}
125+
if (!useParamId) {
216126
if (!ok && r.table() == 0 &&
217127
paramid < 1000) { // Partial match (only it table has not been specified by user)
218128
const std::vector<size_t>& dropTables = ParamID::getDropTables();
@@ -237,10 +147,10 @@ void ParamID::normalise(const REQUEST_T& request, std::vector<Param>& req, const
237147
bool grib1 = vo->second.table() > 0;
238148
if (paramid == windFamilies[w].u_.paramId())
239149
newreq.push_back(grib1 ? Param(t, paramid)
240-
: Param(0, replaceTable(t, paramid)));
150+
: Param(0, replaceTable(t, paramid)));
241151
else
242152
newreq.push_back(grib1 ? Param(t, paramid)
243-
: Param(0, replaceTable(t, paramid)));
153+
: Param(0, replaceTable(t, paramid)));
244154

245155
wind.emplace(vo->second);
246156
wind.emplace(d->second);
@@ -270,31 +180,31 @@ void ParamID::normalise(const REQUEST_T& request, std::vector<Param>& req, const
270180
}
271181
}
272182
}
273-
req = newreq;
274-
275-
for (auto w : wind) {
276-
bool exist = false;
277-
for (eckit::Ordinal i = 0; i < req.size(); i++)
278-
if (req[i] == w) {
279-
exist = true;
280-
break;
281-
}
282-
if (!exist) {
283-
req.push_back(w);
183+
}
184+
req = newreq;
185+
186+
for (auto w : wind) {
187+
bool exist = false;
188+
for (eckit::Ordinal i = 0; i < req.size(); i++)
189+
if (req[i] == w) {
190+
exist = true;
191+
break;
284192
}
193+
if (!exist) {
194+
req.push_back(w);
285195
}
286-
if (tableDropped.size() > 0) {
287-
eckit::MetricsPrefix prefix("paramid_normalisation");
288-
{
289-
std::ostringstream oss;
290-
oss << request;
291-
eckit::Metrics::set("user_request", oss.str());
292-
}
293-
{
294-
std::ostringstream oss;
295-
oss << tableDropped;
296-
eckit::Metrics::set("params", oss.str());
297-
}
196+
}
197+
if (tableDropped.size() > 0) {
198+
eckit::MetricsPrefix prefix("paramid_normalisation");
199+
{
200+
std::ostringstream oss;
201+
oss << request;
202+
eckit::Metrics::set("user_request", oss.str());
203+
}
204+
{
205+
std::ostringstream oss;
206+
oss << tableDropped;
207+
eckit::Metrics::set("params", oss.str());
298208
}
299209
}
300210
}

0 commit comments

Comments
 (0)