Skip to content

Commit b1a6359

Browse files
authored
[O2-4486] DPL Analysis: fix for string labeled array + update tests (#12436)
1 parent 199951f commit b1a6359

File tree

7 files changed

+136
-185
lines changed

7 files changed

+136
-185
lines changed

Framework/Core/include/Framework/Variant.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ constexpr auto isArray2D()
7373
V == VariantType::Array2DDouble);
7474
}
7575

76+
template <VariantType V>
77+
constexpr auto isLabeledArrayString()
78+
{
79+
return V == VariantType::LabeledArrayString;
80+
}
81+
7682
template <VariantType V>
7783
constexpr auto isLabeledArray()
7884
{
@@ -290,9 +296,9 @@ class Variant
290296
using storage_t = std::aligned_union<8, int, int8_t, int16_t, int64_t,
291297
uint8_t, uint16_t, uint32_t, uint64_t,
292298
const char*, float, double, bool,
293-
int*, float*, double*, bool*,
294-
Array2D<int>, Array2D<float>, Array2D<double>,
295-
LabeledArray<int>, LabeledArray<float>, LabeledArray<double>>::type;
299+
int*, float*, double*, bool*, std::string*,
300+
Array2D<int>, Array2D<float>, Array2D<double>, Array2D<std::string>,
301+
LabeledArray<int>, LabeledArray<float>, LabeledArray<double>, LabeledArray<std::string>>::type;
296302

297303
public:
298304
Variant(VariantType type = VariantType::Unknown) : mType{type}, mSize{1} {}

Framework/Core/include/Framework/VariantJSONHelpers.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,21 +154,25 @@ struct VariantReader : public rapidjson::BaseReaderHandler<rapidjson::UTF8<>, Va
154154
states.push(State::IN_ERROR);
155155
return true;
156156
} else {
157-
if (states.top() == State::IN_ARRAY) {
157+
if (states.top() == State::IN_ARRAY || states.top() == State::IN_ROW) {
158158
debug << "added to array" << std::endl;
159159
if constexpr (isLabeledArray<V>()) {
160160
if (currentKey == labels_rows_str) {
161161
labels_rows.push_back(str);
162162
return true;
163-
} else if (currentKey == labels_cols_str) {
163+
}
164+
if (currentKey == labels_cols_str) {
164165
labels_cols.push_back(str);
165166
return true;
167+
}
168+
}
169+
if (currentKey == "values") {
170+
if constexpr (std::is_same_v<std::string, variant_array_element_type_t<V>>) {
171+
accumulatedData.push_back(str);
166172
} else {
167173
states.push(State::IN_ERROR);
168-
return true;
169174
}
170-
} else {
171-
accumulatedData.push_back(str);
175+
return true;
172176
}
173177
return true;
174178
}

Framework/Core/include/Framework/VariantStringHelpers.h

Lines changed: 0 additions & 100 deletions
This file was deleted.

Framework/Core/src/PropertyTreeHelpers.cxx

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212
#include "PropertyTreeHelpers.h"
1313
#include "Framework/ConfigParamSpec.h"
14-
#include "Framework/VariantStringHelpers.h"
1514
#include "Framework/VariantPropertyTreeHelpers.h"
1615
#include "Framework/RuntimeError.h"
16+
#include "Framework/VariantJSONHelpers.h"
1717

1818
#include <boost/program_options/variables_map.hpp>
1919

@@ -22,7 +22,17 @@
2222

2323
namespace o2::framework
2424
{
25-
25+
namespace
26+
{
27+
/// Helper to get a Variant from a @a str
28+
template <VariantType T>
29+
inline Variant fromString(std::string const& str)
30+
{
31+
std::stringstream ss;
32+
ss.str(str);
33+
return VariantJSONHelpers::read<T>(ss);
34+
}
35+
} // namespace
2636
void PropertyTreeHelpers::populateDefaults(std::vector<ConfigParamSpec> const& schema,
2737
boost::property_tree::ptree& pt,
2838
boost::property_tree::ptree& provenance)
@@ -176,30 +186,53 @@ void PropertyTreeHelpers::populate(std::vector<ConfigParamSpec> const& schema,
176186
case VariantType::Bool:
177187
pt.put(key, vmap[key].as<bool>());
178188
break;
179-
case VariantType::ArrayInt:
180-
pt.put_child(key, vectorToBranch<int>(stringToVector<int>(vmap[key].as<std::string>())));
181-
break;
182-
case VariantType::ArrayFloat:
183-
pt.put_child(key, vectorToBranch<float>(stringToVector<float>(vmap[key].as<std::string>())));
184-
break;
185-
case VariantType::ArrayDouble:
186-
pt.put_child(key, vectorToBranch<double>(stringToVector<double>(vmap[key].as<std::string>())));
187-
break;
189+
case VariantType::ArrayInt: {
190+
auto v = fromString<VariantType::ArrayInt>(vmap[key].as<std::string>());
191+
pt.put_child(key, vectorToBranch<int>(v.get<int*>(), v.size()));
192+
} break;
193+
case VariantType::ArrayFloat: {
194+
auto v = fromString<VariantType::ArrayFloat>(vmap[key].as<std::string>());
195+
pt.put_child(key, vectorToBranch<float>(v.get<float*>(), v.size()));
196+
} break;
197+
case VariantType::ArrayDouble: {
198+
auto v = fromString<VariantType::ArrayDouble>(vmap[key].as<std::string>());
199+
pt.put_child(key, vectorToBranch<double>(v.get<double*>(), v.size()));
200+
} break;
188201
case VariantType::ArrayBool:
189202
// pt.put_child(key, vectorToBranch<bool>(stringToVector<bool>(vmap[key].as<std::string>())));
190203
break;
191-
case VariantType::ArrayString:
192-
pt.put_child(key, vectorToBranch<std::string>(stringToVector<std::string>(vmap[key].as<std::string>())));
193-
break;
194-
case VariantType::Array2DInt:
195-
pt.put_child(key, array2DToBranch<int>(stringToArray2D<int>(vmap[key].as<std::string>())));
196-
break;
197-
case VariantType::Array2DFloat:
198-
pt.put_child(key, array2DToBranch<float>(stringToArray2D<float>(vmap[key].as<std::string>())));
199-
break;
200-
case VariantType::Array2DDouble:
201-
pt.put_child(key, array2DToBranch<double>(stringToArray2D<double>(vmap[key].as<std::string>())));
202-
break;
204+
case VariantType::ArrayString: {
205+
auto v = fromString<VariantType::ArrayString>(vmap[key].as<std::string>());
206+
pt.put_child(key, vectorToBranch<std::string>(v.get<std::string*>(), v.size()));
207+
} break;
208+
case VariantType::Array2DInt: {
209+
auto v = fromString<VariantType::Array2DInt>(vmap[key].as<std::string>());
210+
pt.put_child(key, array2DToBranch<int>(v.get<Array2D<int>>()));
211+
} break;
212+
case VariantType::Array2DFloat: {
213+
auto v = fromString<VariantType::Array2DFloat>(vmap[key].as<std::string>());
214+
pt.put_child(key, array2DToBranch<float>(v.get<Array2D<float>>()));
215+
} break;
216+
case VariantType::Array2DDouble: {
217+
auto v = fromString<VariantType::Array2DDouble>(vmap[key].as<std::string>());
218+
pt.put_child(key, array2DToBranch<double>(v.get<Array2D<double>>()));
219+
} break;
220+
case VariantType::LabeledArrayInt: {
221+
auto v = fromString<VariantType::LabeledArrayInt>(vmap[key].as<std::string>());
222+
pt.put_child(key, labeledArrayToBranch(v.get<LabeledArray<int>>()));
223+
} break;
224+
case VariantType::LabeledArrayFloat: {
225+
auto v = fromString<VariantType::LabeledArrayFloat>(vmap[key].as<std::string>());
226+
pt.put_child(key, labeledArrayToBranch(v.get<LabeledArray<float>>()));
227+
} break;
228+
case VariantType::LabeledArrayDouble: {
229+
auto v = fromString<VariantType::LabeledArrayDouble>(vmap[key].as<std::string>());
230+
pt.put_child(key, labeledArrayToBranch(v.get<LabeledArray<double>>()));
231+
} break;
232+
case VariantType::LabeledArrayString: {
233+
auto v = fromString<VariantType::LabeledArrayString>(vmap[key].as<std::string>());
234+
pt.put_child(key, labeledArrayToBranch(v.get<LabeledArray<std::string>>()));
235+
} break;
203236
case VariantType::Dict:
204237
pt.put_child(key, vmap[key].as<boost::property_tree::ptree>());
205238
break;

Framework/Core/src/PropertyTreeHelpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace o2::framework
2323

2424
/// Helpers to manipulate property_trees.
2525
struct PropertyTreeHelpers {
26-
/// For all the options specified in @a schama, this fills
26+
/// For all the options specified in @a schema, this fills
2727
/// @a tree with the contents of @a vmap, which is populated via boost
2828
/// program options. Any key in the @a schema will be marked as
2929
/// "default" in the provenance ptree.

Framework/Core/src/Variant.cxx

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,46 +10,12 @@
1010
// or submit itself to any jurisdiction.
1111
#include "Framework/Variant.h"
1212
#include "Framework/VariantPropertyTreeHelpers.h"
13+
#include "Framework/VariantJSONHelpers.h"
1314
#include <iostream>
1415
#include <sstream>
1516

1617
namespace o2::framework
1718
{
18-
19-
namespace
20-
{
21-
template <typename T>
22-
void printArray(std::ostream& oss, T* array, size_t size)
23-
{
24-
oss << variant_array_symbol<T>::symbol << "[";
25-
oss << array[0];
26-
for (auto i = 1U; i < size; ++i) {
27-
oss << ", " << array[i];
28-
}
29-
oss << "]";
30-
}
31-
32-
template <typename T>
33-
void printMatrix(std::ostream& oss, Array2D<T> const& m)
34-
{
35-
oss << variant_array_symbol<T>::symbol << "[[";
36-
oss << m(0, 0);
37-
for (auto j = 1U; j < m.cols; ++j) {
38-
oss << ", " << m(0, j);
39-
}
40-
oss << "]";
41-
for (auto i = 1U; i < m.rows; ++i) {
42-
oss << ", [";
43-
oss << m(i, 0);
44-
for (auto j = 1U; j < m.cols; ++j) {
45-
oss << ", " << m(i, j);
46-
}
47-
oss << "]";
48-
}
49-
oss << "]";
50-
}
51-
} // namespace
52-
5319
std::ostream& operator<<(std::ostream& oss, Variant const& val)
5420
{
5521
switch (val.type()) {
@@ -90,28 +56,14 @@ std::ostream& operator<<(std::ostream& oss, Variant const& val)
9056
oss << val.get<bool>();
9157
break;
9258
case VariantType::ArrayInt:
93-
printArray<int>(oss, val.get<int*>(), val.size());
94-
break;
9559
case VariantType::ArrayFloat:
96-
printArray<float>(oss, val.get<float*>(), val.size());
97-
break;
9860
case VariantType::ArrayDouble:
99-
printArray<double>(oss, val.get<double*>(), val.size());
100-
break;
10161
case VariantType::ArrayBool:
102-
printArray<bool>(oss, val.get<bool*>(), val.size());
103-
break;
10462
case VariantType::ArrayString:
105-
printArray<std::string>(oss, val.get<std::string*>(), val.size());
106-
break;
10763
case VariantType::Array2DInt:
108-
printMatrix<int>(oss, val.get<Array2D<int>>());
109-
break;
11064
case VariantType::Array2DFloat:
111-
printMatrix<float>(oss, val.get<Array2D<float>>());
112-
break;
11365
case VariantType::Array2DDouble:
114-
printMatrix<double>(oss, val.get<Array2D<double>>());
66+
VariantJSONHelpers::write(oss, val);
11567
break;
11668
case VariantType::Empty:
11769
break;

0 commit comments

Comments
 (0)