Project
Loading...
Searching...
No Matches
test_Expressions.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15#include <catch_amalgamated.hpp>
16#include <arrow/util/config.h>
17
18using namespace o2::framework;
19using namespace o2::framework::expressions;
20
21namespace nodes
22{
23static BindingNode pt{"pt", 1, atype::FLOAT};
24static BindingNode phi{"phi", 2, atype::FLOAT};
25static BindingNode eta{"eta", 3, atype::FLOAT};
26
27static BindingNode tgl{"tgl", 4, atype::FLOAT};
28static BindingNode signed1Pt{"signed1Pt", 5, atype::FLOAT};
29static BindingNode testInt{"testInt", 6, atype::INT32};
30} // namespace nodes
31
32namespace o2::aod::track
33{
34DECLARE_SOA_EXPRESSION_COLUMN(Pze, pz, float, o2::aod::track::tgl * (1.f / o2::aod::track::signed1Pt));
35} // namespace o2::aod::track
36
37TEST_CASE("TestTreeParsing")
38{
39 expressions::Filter f = ((nodes::phi > 1) && (nodes::phi < 2)) && (nodes::eta < 1);
40 auto specs = createOperations(f);
41 REQUIRE(specs[0].left == (DatumSpec{1u, atype::BOOL}));
42 REQUIRE(specs[0].right == (DatumSpec{2u, atype::BOOL}));
43 REQUIRE(specs[0].result == (DatumSpec{0u, atype::BOOL}));
44
45 REQUIRE(specs[1].left == (DatumSpec{std::string{"eta"}, 3, atype::FLOAT}));
46 REQUIRE(specs[1].right == (DatumSpec{LiteralNode::var_t{1}, atype::INT32}));
47 REQUIRE(specs[1].result == (DatumSpec{2u, atype::BOOL}));
48
49 REQUIRE(specs[2].left == (DatumSpec{3u, atype::BOOL}));
50 REQUIRE(specs[2].right == (DatumSpec{4u, atype::BOOL}));
51 REQUIRE(specs[2].result == (DatumSpec{1u, atype::BOOL}));
52
53 REQUIRE(specs[3].left == (DatumSpec{std::string{"phi"}, 2, atype::FLOAT}));
54 REQUIRE(specs[3].right == (DatumSpec{LiteralNode::var_t{2}, atype::INT32}));
55 REQUIRE(specs[3].result == (DatumSpec{4u, atype::BOOL}));
56
57 REQUIRE(specs[4].left == (DatumSpec{std::string{"phi"}, 2, atype::FLOAT}));
58 REQUIRE(specs[4].right == (DatumSpec{LiteralNode::var_t{1}, atype::INT32}));
59 REQUIRE(specs[4].result == (DatumSpec{3u, atype::BOOL}));
60
61 expressions::Filter g = ((nodes::eta + 2.f) > 0.5) || ((nodes::phi - M_PI) < 3);
62 auto gspecs = createOperations(g);
63 REQUIRE(gspecs[0].left == (DatumSpec{1u, atype::BOOL}));
64 REQUIRE(gspecs[0].right == (DatumSpec{2u, atype::BOOL}));
65 REQUIRE(gspecs[0].result == (DatumSpec{0u, atype::BOOL}));
66
67 REQUIRE(gspecs[1].left == (DatumSpec{3u, atype::DOUBLE}));
68 REQUIRE(gspecs[1].right == (DatumSpec{LiteralNode::var_t{3}, atype::INT32}));
69 REQUIRE(gspecs[1].result == (DatumSpec{2u, atype::BOOL}));
70
71 REQUIRE(gspecs[2].left == (DatumSpec{std::string{"phi"}, 2, atype::FLOAT}));
72 REQUIRE(gspecs[2].right == (DatumSpec{LiteralNode::var_t{M_PI}, atype::DOUBLE}));
73 REQUIRE(gspecs[2].result == (DatumSpec{3u, atype::DOUBLE}));
74
75 REQUIRE(gspecs[3].left == (DatumSpec{4u, atype::FLOAT}));
76 REQUIRE(gspecs[3].right == (DatumSpec{LiteralNode::var_t{0.5}, atype::DOUBLE}));
77 REQUIRE(gspecs[3].result == (DatumSpec{1u, atype::BOOL}));
78
79 REQUIRE(gspecs[4].left == (DatumSpec{std::string{"eta"}, 3, atype::FLOAT}));
80 REQUIRE(gspecs[4].right == (DatumSpec{LiteralNode::var_t{2.f}, atype::FLOAT}));
81 REQUIRE(gspecs[4].result == (DatumSpec{4u, atype::FLOAT}));
82
83 expressions::Filter h = (nodes::phi == 0) || (nodes::phi == 3);
84 auto hspecs = createOperations(h);
85
86 REQUIRE(hspecs[0].left == (DatumSpec{1u, atype::BOOL}));
87 REQUIRE(hspecs[0].right == (DatumSpec{2u, atype::BOOL}));
88 REQUIRE(hspecs[0].result == (DatumSpec{0u, atype::BOOL}));
89
90 REQUIRE(hspecs[1].left == (DatumSpec{std::string{"phi"}, 2, atype::FLOAT}));
91 REQUIRE(hspecs[1].right == (DatumSpec{LiteralNode::var_t{3}, atype::INT32}));
92 REQUIRE(hspecs[1].result == (DatumSpec{2u, atype::BOOL}));
93
94 REQUIRE(hspecs[2].left == (DatumSpec{std::string{"phi"}, 2, atype::FLOAT}));
95 REQUIRE(hspecs[2].right == (DatumSpec{LiteralNode::var_t{0}, atype::INT32}));
96 REQUIRE(hspecs[2].result == (DatumSpec{1u, atype::BOOL}));
97
98 expressions::Filter u = nabs(nodes::eta) < 1.0 && nexp(nodes::phi + 2.0 * M_PI) > 3.0;
99 auto uspecs = createOperations(std::move(u));
100 REQUIRE(uspecs[0].left == (DatumSpec{1u, atype::BOOL}));
101 REQUIRE(uspecs[0].right == (DatumSpec{2u, atype::BOOL}));
102 REQUIRE(uspecs[0].result == (DatumSpec{0u, atype::BOOL}));
103
104 REQUIRE(uspecs[1].left == (DatumSpec{3u, atype::DOUBLE}));
105 REQUIRE(uspecs[1].right == (DatumSpec{LiteralNode::var_t{3.0}, atype::DOUBLE}));
106 REQUIRE(uspecs[1].result == (DatumSpec{2u, atype::BOOL}));
107
108 REQUIRE(uspecs[2].left == (DatumSpec{4u, atype::DOUBLE}));
109 REQUIRE(uspecs[2].right == (DatumSpec{}));
110 REQUIRE(uspecs[2].result == (DatumSpec{3u, atype::DOUBLE}));
111
112 REQUIRE(uspecs[3].left == (DatumSpec{std::string{"phi"}, 2, atype::FLOAT}));
113 REQUIRE(uspecs[3].right == (DatumSpec{LiteralNode::var_t{2.0 * M_PI}, atype::DOUBLE}));
114 REQUIRE(uspecs[3].result == (DatumSpec{4u, atype::DOUBLE}));
115
116 REQUIRE(uspecs[4].left == (DatumSpec{5u, atype::FLOAT}));
117 REQUIRE(uspecs[4].right == (DatumSpec{LiteralNode::var_t{1.0}, atype::DOUBLE}));
118 REQUIRE(uspecs[4].result == (DatumSpec{1u, atype::BOOL}));
119
120 REQUIRE(uspecs[5].left == (DatumSpec{std::string{"eta"}, 3, atype::FLOAT}));
121 REQUIRE(uspecs[5].right == (DatumSpec{}));
122 REQUIRE(uspecs[5].result == (DatumSpec{5u, atype::FLOAT}));
123
124 Configurable<float> pTCut{"pTCut", 0.5f, "Lower pT limit"};
125 Filter ptfilter = o2::aod::track::pt > pTCut;
126 REQUIRE(ptfilter.node->self.index() == 2);
127 REQUIRE(ptfilter.node->left->self.index() == 1);
128 REQUIRE(ptfilter.node->right->self.index() == 3);
129 auto ptfilterspecs = createOperations(ptfilter);
130 REQUIRE(ptfilterspecs[0].left == (DatumSpec{std::string{"fPt"}, typeid(o2::aod::track::Pt).hash_code(), atype::FLOAT}));
131 REQUIRE(ptfilterspecs[0].right == (DatumSpec{LiteralNode::var_t{0.5f}, atype::FLOAT}));
132 REQUIRE(ptfilterspecs[0].result == (DatumSpec{0u, atype::BOOL}));
133
134 struct : ConfigurableGroup {
135 std::string prefix = "prefix";
136 Configurable<float> pTCut{"pTCut", 1.0f, "Lower pT limit"};
137 } group;
138 Filter ptfilter2 = o2::aod::track::pt > group.pTCut;
139 group.pTCut.name.insert(0, 1, '.');
140 group.pTCut.name.insert(0, group.prefix);
141 REQUIRE(ptfilter2.node->self.index() == 2);
142 REQUIRE(ptfilter2.node->left->self.index() == 1);
143 REQUIRE(ptfilter2.node->right->self.index() == 3);
144 REQUIRE(std::get<PlaceholderNode>(ptfilter2.node->right->self).name == "prefix.pTCut");
145 auto ptfilterspecs2 = createOperations(ptfilter2);
146 REQUIRE(ptfilterspecs2[0].left == (DatumSpec{std::string{"fPt"}, typeid(o2::aod::track::Pt).hash_code(), atype::FLOAT}));
147 REQUIRE(ptfilterspecs2[0].right == (DatumSpec{LiteralNode::var_t{1.0f}, atype::FLOAT}));
148 REQUIRE(ptfilterspecs2[0].result == (DatumSpec{0u, atype::BOOL}));
149
150 Configurable<int> cvalue{"cvalue", 1, "test value"};
151 Filter testFilter = o2::aod::track::tpcNClsShared < as<uint8_t>(cvalue);
152 REQUIRE(testFilter.node->self.index() == 2);
153 REQUIRE(testFilter.node->left->self.index() == 1);
154 REQUIRE(testFilter.node->right->self.index() == 3);
155 REQUIRE(std::get<PlaceholderNode>(testFilter.node->right->self).name == "cvalue");
156 auto testSpecs = createOperations(testFilter);
157 REQUIRE(testSpecs[0].right == (DatumSpec{LiteralNode::var_t{(uint8_t)1}, atype::UINT8}));
158}
159
160TEST_CASE("TestGandivaTreeCreation")
161{
162 Projector pze = o2::aod::track::Pze::Projector();
163 auto pzspecs = createOperations(pze);
164 REQUIRE(pzspecs[0].left == (DatumSpec{std::string{"fTgl"}, typeid(o2::aod::track::Tgl).hash_code(), atype::FLOAT}));
165 REQUIRE(pzspecs[0].right == (DatumSpec{1u, atype::FLOAT}));
166 REQUIRE(pzspecs[0].result == (DatumSpec{0u, atype::FLOAT}));
167
168 REQUIRE(pzspecs[1].left == (DatumSpec{LiteralNode::var_t{1.f}, atype::FLOAT}));
169 REQUIRE(pzspecs[1].right == (DatumSpec{std::string{"fSigned1Pt"}, typeid(o2::aod::track::Signed1Pt).hash_code(), atype::FLOAT}));
170 REQUIRE(pzspecs[1].result == (DatumSpec{1u, atype::FLOAT}));
171 auto infield1 = o2::aod::track::Signed1Pt::asArrowField();
172 auto infield2 = o2::aod::track::Tgl::asArrowField();
173 auto resfield = o2::aod::track::Pze::asArrowField();
174 auto schema = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, resfield});
175 auto gandiva_tree = createExpressionTree(pzspecs, schema);
176
177 auto gandiva_expression = makeExpression(gandiva_tree, resfield);
178 REQUIRE(std::string(gandiva_expression->ToString()) == std::string("float multiply((float) fTgl, float divide((const float) 1 raw(3f800000), (float) fSigned1Pt))"));
179 auto projector = createProjector(schema, pzspecs, resfield);
180
181 Projector pte = o2::aod::track::Pt::Projector();
182 auto ptespecs = createOperations(pte);
183
184 auto infield3 = o2::aod::track::Signed1Pt::asArrowField();
185 auto resfield2 = o2::aod::track::Pt::asArrowField();
186 auto schema2 = std::make_shared<arrow::Schema>(std::vector{infield3, resfield2});
187 auto gandiva_tree2 = createExpressionTree(ptespecs, schema2);
188
189 auto gandiva_expression2 = makeExpression(gandiva_tree2, resfield2);
190 REQUIRE(gandiva_expression2->ToString() == "if (bool less_than_or_equal_to(float absf((float) fSigned1Pt), (const float) 1.17549e-38 raw(800000))) { (const float) 8.50706e+37 raw(7e800000) } else { float absf(float divide((const float) 1 raw(3f800000), (float) fSigned1Pt)) }");
191
192 auto projector_b = createProjector(schema2, ptespecs, resfield2);
193 auto fields = o2::soa::createFieldsFromColumns(o2::aod::Tracks::persistent_columns_t{});
194 auto schema_p = std::make_shared<arrow::Schema>(fields);
196
197 Filter bitwiseFilter = (o2::aod::track::flags & static_cast<uint32_t>(o2::aod::track::TPCrefit)) != 0u;
198 auto bwf = createOperations(bitwiseFilter);
199 REQUIRE(bwf[0].left == (DatumSpec{1u, atype::UINT32}));
200 REQUIRE(bwf[0].right == (DatumSpec{LiteralNode::var_t{0u}, atype::UINT32}));
201 REQUIRE(bwf[0].result == (DatumSpec{0u, atype::BOOL}));
202
203 REQUIRE(bwf[1].left == (DatumSpec{std::string{"fFlags"}, typeid(o2::aod::track::Flags).hash_code(), atype::UINT32}));
204 REQUIRE(bwf[1].right == (DatumSpec{LiteralNode::var_t{static_cast<uint32_t>(o2::aod::track::TPCrefit)}, atype::UINT32}));
205 REQUIRE(bwf[1].result == (DatumSpec{1u, atype::UINT32}));
206
207 auto infield4 = o2::aod::track::Flags::asArrowField();
208 auto resfield3 = std::make_shared<arrow::Field>("out", arrow::boolean());
209 auto schema_b = std::make_shared<arrow::Schema>(std::vector{infield4, resfield3});
210 auto gandiva_tree3 = createExpressionTree(bwf, schema_b);
211 REQUIRE(gandiva_tree3->ToString() == "bool not_equal(uint32 bitwise_and((uint32) fFlags, (const uint32) 2), (const uint32) 0)");
212 auto condition = expressions::makeCondition(gandiva_tree3);
213 std::shared_ptr<gandiva::Filter> flt;
214 auto s = gandiva::Filter::Make(schema_b, condition, &flt);
215 REQUIRE(s.ok());
216
217 Filter rounding = nround(o2::aod::track::pt) > 0.1f;
218 auto rf = createOperations(rounding);
219 REQUIRE(rf[0].left == (DatumSpec{1u, atype::FLOAT}));
220 REQUIRE(rf[0].right == (DatumSpec{LiteralNode::var_t{0.1f}, atype::FLOAT}));
221 REQUIRE(rf[0].result == (DatumSpec{0u, atype::BOOL}));
222
223 REQUIRE(rf[1].left == (DatumSpec{std::string{"fPt"}, typeid(o2::aod::track::Pt).hash_code(), atype::FLOAT}));
224 REQUIRE(rf[1].right == (DatumSpec{}));
225 REQUIRE(rf[1].result == (DatumSpec{1u, atype::FLOAT}));
226
227 auto infield5 = o2::aod::track::Pt::asArrowField();
228 auto resfield4 = std::make_shared<arrow::Field>("out", arrow::boolean());
229 auto schema_c = std::make_shared<arrow::Schema>(std::vector{infield5, resfield4});
230 auto gandiva_tree4 = createExpressionTree(rf, schema_c);
231 REQUIRE(gandiva_tree4->ToString() == "bool greater_than(float round((float) fPt), (const float) 0.1 raw(3dcccccd))");
232 auto condition2 = expressions::makeCondition(gandiva_tree4);
233 std::shared_ptr<gandiva::Filter> flt2;
234 auto s2 = gandiva::Filter::Make(schema_c, condition2, &flt2);
235 REQUIRE(s2.ok());
236}
237
238TEST_CASE("TestConditionalExpressions")
239{
240 // simple conditional
241 Filter cf = nabs(o2::aod::track::eta) < 1.0f && ifnode((o2::aod::track::pt < 1.0f), (o2::aod::track::phi > (float)(M_PI / 2.)), (o2::aod::track::phi < (float)(M_PI / 2.)));
242 auto cfspecs = createOperations(cf);
243 REQUIRE(cfspecs[0].left == (DatumSpec{1u, atype::BOOL}));
244 REQUIRE(cfspecs[0].right == (DatumSpec{2u, atype::BOOL}));
245 REQUIRE(cfspecs[0].result == (DatumSpec{0u, atype::BOOL}));
246
247 REQUIRE(cfspecs[1].left == (DatumSpec{3u, atype::BOOL}));
248 REQUIRE(cfspecs[1].right == (DatumSpec{4u, atype::BOOL}));
249 REQUIRE(cfspecs[1].condition == (DatumSpec{5u, atype::BOOL}));
250 REQUIRE(cfspecs[1].result == (DatumSpec{2u, atype::BOOL}));
251
252 REQUIRE(cfspecs[2].left == (DatumSpec{std::string{"fPt"}, typeid(o2::aod::track::Pt).hash_code(), atype::FLOAT}));
253 REQUIRE(cfspecs[2].right == (DatumSpec{LiteralNode::var_t{1.0f}, atype::FLOAT}));
254 REQUIRE(cfspecs[2].result == (DatumSpec{5u, atype::BOOL}));
255
256 REQUIRE(cfspecs[3].left == (DatumSpec{std::string{"fPhi"}, typeid(o2::aod::track::Phi).hash_code(), atype::FLOAT}));
257 REQUIRE(cfspecs[3].right == (DatumSpec{LiteralNode::var_t{(float)(M_PI / 2.)}, atype::FLOAT}));
258 REQUIRE(cfspecs[3].result == (DatumSpec{4u, atype::BOOL}));
259
260 REQUIRE(cfspecs[4].left == (DatumSpec{std::string{"fPhi"}, typeid(o2::aod::track::Phi).hash_code(), atype::FLOAT}));
261 REQUIRE(cfspecs[4].right == (DatumSpec{LiteralNode::var_t{(float)(M_PI / 2.)}, atype::FLOAT}));
262 REQUIRE(cfspecs[4].result == (DatumSpec{3u, atype::BOOL}));
263
264 REQUIRE(cfspecs[5].left == (DatumSpec{6u, atype::FLOAT}));
265 REQUIRE(cfspecs[5].right == (DatumSpec{LiteralNode::var_t{1.0f}, atype::FLOAT}));
266 REQUIRE(cfspecs[5].result == (DatumSpec{1u, atype::BOOL}));
267
268 REQUIRE(cfspecs[6].left == (DatumSpec{std::string{"fEta"}, typeid(o2::aod::track::Eta).hash_code(), atype::FLOAT}));
269 REQUIRE(cfspecs[6].right == (DatumSpec{}));
270 REQUIRE(cfspecs[6].result == (DatumSpec{6u, atype::FLOAT}));
271
272 auto infield1 = o2::aod::track::Pt::asArrowField();
273 auto infield2 = o2::aod::track::Eta::asArrowField();
274 auto infield3 = o2::aod::track::Phi::asArrowField();
275 auto schema = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, infield3});
276 auto gandiva_tree = createExpressionTree(cfspecs, schema);
277 auto gandiva_condition = makeCondition(gandiva_tree);
278 auto gandiva_filter = createFilter(schema, gandiva_condition);
279
280 REQUIRE(gandiva_tree->ToString() == "bool less_than(float absf((float) fEta), (const float) 1 raw(3f800000)) && if (bool less_than((float) fPt, (const float) 1 raw(3f800000))) { bool greater_than((float) fPhi, (const float) 1.5708 raw(3fc90fdb)) } else { bool less_than((float) fPhi, (const float) 1.5708 raw(3fc90fdb)) }");
281
282 // nested conditional
283 Filter cfn = o2::aod::track::signed1Pt > 0.f && ifnode(std::move(*cf.node), nabs(o2::aod::track::x) > 1.0f, nabs(o2::aod::track::y) > 1.0f);
284 auto cfnspecs = createOperations(cfn);
285 auto infield4 = o2::aod::track::Signed1Pt::asArrowField();
286 auto infield5 = o2::aod::track::X::asArrowField();
287 auto infield6 = o2::aod::track::Y::asArrowField();
288 auto schema2 = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, infield3, infield4, infield5, infield6});
289 auto gandiva_tree2 = createExpressionTree(cfnspecs, schema2);
290 auto gandiva_condition2 = makeCondition(gandiva_tree2);
291 auto gandiva_filter2 = createFilter(schema2, gandiva_condition2);
292 REQUIRE(gandiva_tree2->ToString() == "bool greater_than((float) fSigned1Pt, (const float) 0 raw(0)) && if (bool less_than(float absf((float) fEta), (const float) 1 raw(3f800000)) && if (bool less_than((float) fPt, (const float) 1 raw(3f800000))) { bool greater_than((float) fPhi, (const float) 1.5708 raw(3fc90fdb)) } else { bool less_than((float) fPhi, (const float) 1.5708 raw(3fc90fdb)) }) { bool greater_than(float absf((float) fX), (const float) 1 raw(3f800000)) } else { bool greater_than(float absf((float) fY), (const float) 1 raw(3f800000)) }");
293
294 // clamp
295 Projector clp = clamp(o2::aod::track::pt, 1.0f, 10.f);
296 auto clpspecs = createOperations(clp);
297 auto schemaclp = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Pt::asArrowField()});
298 auto gandiva_tree_clp = createExpressionTree(clpspecs, schemaclp);
299 REQUIRE(gandiva_tree_clp->ToString() == "if (bool less_than((float) fPt, (const float) 1 raw(3f800000))) { (const float) 1 raw(3f800000) } else { if (bool greater_than((float) fPt, (const float) 10 raw(41200000))) { (const float) 10 raw(41200000) } else { (float) fPt } }");
300}
301
302TEST_CASE("TestBinnedExpressions")
303{
304 std::vector<float> bins{0.5, 1.5, 2.5, 3.5, 4.5};
305 std::vector<float> params{1.0, 1.1, 1.2, 1.3, 2.0, 2.1, 2.2, 2.3, 3.0, 3.1, 3.2, 3.3, 4.0, 4.1, 4.2, 4.3};
306 Projector p = binned(bins, params, o2::aod::track::pt, par(0) * o2::aod::track::x + par(1) * o2::aod::track::y + par(2) * o2::aod::track::z + par(3) * o2::aod::track::phi, LiteralNode{0.f});
307 auto pspecs = createOperations(p);
308 auto schema = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Pt::asArrowField(), o2::aod::track::X::asArrowField(), o2::aod::track::Y::asArrowField(), o2::aod::track::Z::asArrowField(), o2::aod::track::Phi::asArrowField()});
309 auto tree = createExpressionTree(pspecs, schema);
310 REQUIRE(tree->ToString() == "if (bool less_than((float) fPt, (const float) 0.5 raw(3f000000))) { (const float) 0 raw(0) } else { if (bool less_than((float) fPt, (const float) 1.5 raw(3fc00000))) { float add(float add(float add(float multiply((const float) 1 raw(3f800000), (float) fX), float multiply((const float) 2 raw(40000000), (float) fY)), float multiply((const float) 3 raw(40400000), (float) fZ)), float multiply((const float) 4 raw(40800000), (float) fPhi)) } else { if (bool less_than((float) fPt, (const float) 2.5 raw(40200000))) { float add(float add(float add(float multiply((const float) 1.1 raw(3f8ccccd), (float) fX), float multiply((const float) 2.1 raw(40066666), (float) fY)), float multiply((const float) 3.1 raw(40466666), (float) fZ)), float multiply((const float) 4.1 raw(40833333), (float) fPhi)) } else { if (bool less_than((float) fPt, (const float) 3.5 raw(40600000))) { float add(float add(float add(float multiply((const float) 1.2 raw(3f99999a), (float) fX), float multiply((const float) 2.2 raw(400ccccd), (float) fY)), float multiply((const float) 3.2 raw(404ccccd), (float) fZ)), float multiply((const float) 4.2 raw(40866666), (float) fPhi)) } else { if (bool less_than((float) fPt, (const float) 4.5 raw(40900000))) { float add(float add(float add(float multiply((const float) 1.3 raw(3fa66666), (float) fX), float multiply((const float) 2.3 raw(40133333), (float) fY)), float multiply((const float) 3.3 raw(40533333), (float) fZ)), float multiply((const float) 4.3 raw(4089999a), (float) fPhi)) } else { (const float) 0 raw(0) } } } } }");
311
313 std::vector<float> parameters{1.0, 1.1, 1.2, 1.3, // par 0
314 2.0, 2.1, 2.2, 2.3, // par 1
315 3.0, 3.1, 3.2, 3.3, // par 2
316 4.0, 4.1, 4.2, 4.3}; // par 3
317
318 Projector p2 = binned((std::vector<float>)binning,
319 (std::vector<float>)parameters,
320 o2::aod::track::phi, par(0) * o2::aod::track::x * o2::aod::track::x + par(1) * o2::aod::track::y * o2::aod::track::y + par(2) * o2::aod::track::z * o2::aod::track::z,
321 LiteralNode{-1.f});
322 auto p2specs = createOperations(p2);
323 auto schema2 = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Phi::asArrowField(), o2::aod::track::X::asArrowField(), o2::aod::track::Y::asArrowField(), o2::aod::track::Z::asArrowField()});
324 auto tree2 = createExpressionTree(p2specs, schema2);
325 REQUIRE(tree2->ToString() == "if (bool less_than((float) fPhi, (const float) 0 raw(0))) { (const float) -1 raw(bf800000) } else { if (bool less_than((float) fPhi, (const float) 1.5708 raw(3fc90fdb))) { float add(float add(float multiply(float multiply((const float) 1 raw(3f800000), (float) fX), (float) fX), float multiply(float multiply((const float) 2 raw(40000000), (float) fY), (float) fY)), float multiply(float multiply((const float) 3 raw(40400000), (float) fZ), (float) fZ)) } else { if (bool less_than((float) fPhi, (const float) 3.14159 raw(40490fdb))) { float add(float add(float multiply(float multiply((const float) 1.1 raw(3f8ccccd), (float) fX), (float) fX), float multiply(float multiply((const float) 2.1 raw(40066666), (float) fY), (float) fY)), float multiply(float multiply((const float) 3.1 raw(40466666), (float) fZ), (float) fZ)) } else { if (bool less_than((float) fPhi, (const float) 4.71239 raw(4096cbe4))) { float add(float add(float multiply(float multiply((const float) 1.2 raw(3f99999a), (float) fX), (float) fX), float multiply(float multiply((const float) 2.2 raw(400ccccd), (float) fY), (float) fY)), float multiply(float multiply((const float) 3.2 raw(404ccccd), (float) fZ), (float) fZ)) } else { if (bool less_than((float) fPhi, (const float) 6.28319 raw(40c90fdb))) { float add(float add(float multiply(float multiply((const float) 1.3 raw(3fa66666), (float) fX), (float) fX), float multiply(float multiply((const float) 2.3 raw(40133333), (float) fY), (float) fY)), float multiply(float multiply((const float) 3.3 raw(40533333), (float) fZ), (float) fZ)) } else { (const float) -1 raw(bf800000) } } } } }");
326}
#define DECLARE_SOA_EXPRESSION_COLUMN(_Name_, _Getter_, _Type_, _Expression_)
Definition ASoA.h:2397
const auto bins
Definition PID.cxx:49
constexpr int p2()
Class for time synchronization of RawReader instances.
GLuint64EXT * result
Definition glcorearb.h:5662
GLdouble GLdouble right
Definition glcorearb.h:4077
GLdouble f
Definition glcorearb.h:310
GLenum const GLfloat * params
Definition glcorearb.h:272
GLboolean GLuint group
Definition glcorearb.h:3991
GLboolean GLboolean g
Definition glcorearb.h:1233
GLenum clamp
Definition glcorearb.h:1245
constexpr float TwoPI
constexpr float PI
constexpr float PIHalf
std::shared_ptr< gandiva::Filter > createFilter(gandiva::SchemaPtr const &Schema, gandiva::ConditionPtr condition)
Function to create gandiva filter from gandiva condition.
gandiva::ExpressionPtr makeExpression(gandiva::NodePtr node, gandiva::FieldPtr result)
Function to create gandiva projecting expression from generic gandiva expression tree.
Node par(int index)
Parameters.
Operations createOperations(Filter const &expression)
Function to create an internal operation sequence from a filter tree.
gandiva::ConditionPtr makeCondition(gandiva::NodePtr node)
Function to create gandiva condition expression from generic gandiva expression tree.
Node ifnode(Node &&condition_, Node &&then_, Node &&else_)
conditionals
gandiva::NodePtr createExpressionTree(Operations const &opSpecs, gandiva::SchemaPtr const &Schema)
Function to create gandiva expression tree from operation sequence.
Node binned(std::vector< T > const &binning, std::vector< T > const &parameters, Node &&binned, Node &&pexp, Node &&out)
binned functional
std::shared_ptr< gandiva::Projector > createProjector(gandiva::SchemaPtr const &Schema, Operations const &opSpecs, gandiva::FieldPtr result)
Function to create gandiva projector from operation sequence.
std::shared_ptr< gandiva::Projector > createProjectors(framework::pack< C... >, std::vector< std::shared_ptr< arrow::Field > > const &fields, gandiva::SchemaPtr schema)
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
TEST_CASE("test_prepareArguments")
auto createFieldsFromColumns(framework::pack< C... >)
Definition ASoA.h:406
An expression tree node corresponding to a column binding.
A struct, containing the root of the expression tree.
std::unique_ptr< Node > node
An expression tree node corresponding to a literal value.
LiteralValue::stored_type var_t
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))