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
151TEST_CASE("TestGandivaTreeCreation")
152{
153 Projector pze = o2::aod::track::Pze::Projector();
154 auto pzspecs = createOperations(pze);
155 REQUIRE(pzspecs[0].left == (DatumSpec{std::string{"fTgl"}, typeid(o2::aod::track::Tgl).hash_code(), atype::FLOAT}));
156 REQUIRE(pzspecs[0].right == (DatumSpec{1u, atype::FLOAT}));
157 REQUIRE(pzspecs[0].result == (DatumSpec{0u, atype::FLOAT}));
158
159 REQUIRE(pzspecs[1].left == (DatumSpec{LiteralNode::var_t{1.f}, atype::FLOAT}));
160 REQUIRE(pzspecs[1].right == (DatumSpec{std::string{"fSigned1Pt"}, typeid(o2::aod::track::Signed1Pt).hash_code(), atype::FLOAT}));
161 REQUIRE(pzspecs[1].result == (DatumSpec{1u, atype::FLOAT}));
162 auto infield1 = o2::aod::track::Signed1Pt::asArrowField();
163 auto infield2 = o2::aod::track::Tgl::asArrowField();
164 auto resfield = o2::aod::track::Pze::asArrowField();
165 auto schema = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, resfield});
166 auto gandiva_tree = createExpressionTree(pzspecs, schema);
167
168 auto gandiva_expression = makeExpression(gandiva_tree, resfield);
169 REQUIRE(std::string(gandiva_expression->ToString()) == std::string("float multiply((float) fTgl, float divide((const float) 1 raw(3f800000), (float) fSigned1Pt))"));
170 auto projector = createProjector(schema, pzspecs, resfield);
171
172 Projector pte = o2::aod::track::Pt::Projector();
173 auto ptespecs = createOperations(pte);
174
175 auto infield3 = o2::aod::track::Signed1Pt::asArrowField();
176 auto resfield2 = o2::aod::track::Pt::asArrowField();
177 auto schema2 = std::make_shared<arrow::Schema>(std::vector{infield3, resfield2});
178 auto gandiva_tree2 = createExpressionTree(ptespecs, schema2);
179
180 auto gandiva_expression2 = makeExpression(gandiva_tree2, resfield2);
181 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)) }");
182
183 auto projector_b = createProjector(schema2, ptespecs, resfield2);
184 auto fields = o2::soa::createFieldsFromColumns(o2::aod::Tracks::persistent_columns_t{});
185 auto schema_p = std::make_shared<arrow::Schema>(fields);
187
188 Filter bitwiseFilter = (o2::aod::track::flags & static_cast<uint32_t>(o2::aod::track::TPCrefit)) != 0u;
189 auto bwf = createOperations(bitwiseFilter);
190 REQUIRE(bwf[0].left == (DatumSpec{1u, atype::UINT32}));
191 REQUIRE(bwf[0].right == (DatumSpec{LiteralNode::var_t{0u}, atype::UINT32}));
192 REQUIRE(bwf[0].result == (DatumSpec{0u, atype::BOOL}));
193
194 REQUIRE(bwf[1].left == (DatumSpec{std::string{"fFlags"}, typeid(o2::aod::track::Flags).hash_code(), atype::UINT32}));
195 REQUIRE(bwf[1].right == (DatumSpec{LiteralNode::var_t{static_cast<uint32_t>(o2::aod::track::TPCrefit)}, atype::UINT32}));
196 REQUIRE(bwf[1].result == (DatumSpec{1u, atype::UINT32}));
197
198 auto infield4 = o2::aod::track::Flags::asArrowField();
199 auto resfield3 = std::make_shared<arrow::Field>("out", arrow::boolean());
200 auto schema_b = std::make_shared<arrow::Schema>(std::vector{infield4, resfield3});
201 auto gandiva_tree3 = createExpressionTree(bwf, schema_b);
202 REQUIRE(gandiva_tree3->ToString() == "bool not_equal(uint32 bitwise_and((uint32) fFlags, (const uint32) 2), (const uint32) 0)");
203 auto condition = expressions::makeCondition(gandiva_tree3);
204 std::shared_ptr<gandiva::Filter> flt;
205 auto s = gandiva::Filter::Make(schema_b, condition, &flt);
206 REQUIRE(s.ok());
207
208 Filter rounding = nround(o2::aod::track::pt) > 0.1f;
209 auto rf = createOperations(rounding);
210 REQUIRE(rf[0].left == (DatumSpec{1u, atype::FLOAT}));
211 REQUIRE(rf[0].right == (DatumSpec{LiteralNode::var_t{0.1f}, atype::FLOAT}));
212 REQUIRE(rf[0].result == (DatumSpec{0u, atype::BOOL}));
213
214 REQUIRE(rf[1].left == (DatumSpec{std::string{"fPt"}, typeid(o2::aod::track::Pt).hash_code(), atype::FLOAT}));
215 REQUIRE(rf[1].right == (DatumSpec{}));
216 REQUIRE(rf[1].result == (DatumSpec{1u, atype::FLOAT}));
217
218 auto infield5 = o2::aod::track::Pt::asArrowField();
219 auto resfield4 = std::make_shared<arrow::Field>("out", arrow::boolean());
220 auto schema_c = std::make_shared<arrow::Schema>(std::vector{infield5, resfield4});
221 auto gandiva_tree4 = createExpressionTree(rf, schema_c);
222 REQUIRE(gandiva_tree4->ToString() == "bool greater_than(float round((float) fPt), (const float) 0.1 raw(3dcccccd))");
223 auto condition2 = expressions::makeCondition(gandiva_tree4);
224 std::shared_ptr<gandiva::Filter> flt2;
225 auto s2 = gandiva::Filter::Make(schema_c, condition2, &flt2);
226 REQUIRE(s2.ok());
227}
228
229TEST_CASE("TestConditionalExpressions")
230{
231 // simple conditional
232 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.)));
233 auto cfspecs = createOperations(cf);
234 REQUIRE(cfspecs[0].left == (DatumSpec{1u, atype::BOOL}));
235 REQUIRE(cfspecs[0].right == (DatumSpec{2u, atype::BOOL}));
236 REQUIRE(cfspecs[0].result == (DatumSpec{0u, atype::BOOL}));
237
238 REQUIRE(cfspecs[1].left == (DatumSpec{3u, atype::BOOL}));
239 REQUIRE(cfspecs[1].right == (DatumSpec{4u, atype::BOOL}));
240 REQUIRE(cfspecs[1].condition == (DatumSpec{5u, atype::BOOL}));
241 REQUIRE(cfspecs[1].result == (DatumSpec{2u, atype::BOOL}));
242
243 REQUIRE(cfspecs[2].left == (DatumSpec{std::string{"fPt"}, typeid(o2::aod::track::Pt).hash_code(), atype::FLOAT}));
244 REQUIRE(cfspecs[2].right == (DatumSpec{LiteralNode::var_t{1.0f}, atype::FLOAT}));
245 REQUIRE(cfspecs[2].result == (DatumSpec{5u, atype::BOOL}));
246
247 REQUIRE(cfspecs[3].left == (DatumSpec{std::string{"fPhi"}, typeid(o2::aod::track::Phi).hash_code(), atype::FLOAT}));
248 REQUIRE(cfspecs[3].right == (DatumSpec{LiteralNode::var_t{(float)(M_PI / 2.)}, atype::FLOAT}));
249 REQUIRE(cfspecs[3].result == (DatumSpec{4u, atype::BOOL}));
250
251 REQUIRE(cfspecs[4].left == (DatumSpec{std::string{"fPhi"}, typeid(o2::aod::track::Phi).hash_code(), atype::FLOAT}));
252 REQUIRE(cfspecs[4].right == (DatumSpec{LiteralNode::var_t{(float)(M_PI / 2.)}, atype::FLOAT}));
253 REQUIRE(cfspecs[4].result == (DatumSpec{3u, atype::BOOL}));
254
255 REQUIRE(cfspecs[5].left == (DatumSpec{6u, atype::FLOAT}));
256 REQUIRE(cfspecs[5].right == (DatumSpec{LiteralNode::var_t{1.0f}, atype::FLOAT}));
257 REQUIRE(cfspecs[5].result == (DatumSpec{1u, atype::BOOL}));
258
259 REQUIRE(cfspecs[6].left == (DatumSpec{std::string{"fEta"}, typeid(o2::aod::track::Eta).hash_code(), atype::FLOAT}));
260 REQUIRE(cfspecs[6].right == (DatumSpec{}));
261 REQUIRE(cfspecs[6].result == (DatumSpec{6u, atype::FLOAT}));
262
263 auto infield1 = o2::aod::track::Pt::asArrowField();
264 auto infield2 = o2::aod::track::Eta::asArrowField();
265 auto infield3 = o2::aod::track::Phi::asArrowField();
266 auto schema = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, infield3});
267 auto gandiva_tree = createExpressionTree(cfspecs, schema);
268 auto gandiva_condition = makeCondition(gandiva_tree);
269 auto gandiva_filter = createFilter(schema, gandiva_condition);
270
271 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)) }");
272
273 // nested conditional
274 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);
275 auto cfnspecs = createOperations(cfn);
276 auto infield4 = o2::aod::track::Signed1Pt::asArrowField();
277 auto infield5 = o2::aod::track::X::asArrowField();
278 auto infield6 = o2::aod::track::Y::asArrowField();
279 auto schema2 = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, infield3, infield4, infield5, infield6});
280 auto gandiva_tree2 = createExpressionTree(cfnspecs, schema2);
281 auto gandiva_condition2 = makeCondition(gandiva_tree2);
282 auto gandiva_filter2 = createFilter(schema2, gandiva_condition2);
283 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)) }");
284}
285
286TEST_CASE("TestBinnedExpressions")
287{
288 std::vector<float> bins{0.5, 1.5, 2.5, 3.5, 4.5};
289 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};
290 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});
291 auto pspecs = createOperations(p);
292 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()});
293 auto tree = createExpressionTree(pspecs, schema);
294 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) } } } } }");
295
297 std::vector<float> parameters{1.0, 1.1, 1.2, 1.3, // par 0
298 2.0, 2.1, 2.2, 2.3, // par 1
299 3.0, 3.1, 3.2, 3.3, // par 2
300 4.0, 4.1, 4.2, 4.3}; // par 3
301
302 Projector p2 = binned((std::vector<float>)binning,
303 (std::vector<float>)parameters,
304 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,
305 LiteralNode{-1.f});
306 auto p2specs = createOperations(p2);
307 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()});
308 auto tree2 = createExpressionTree(p2specs, schema2);
309 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) } } } } }");
310}
#define DECLARE_SOA_EXPRESSION_COLUMN(_Name_, _Getter_, _Type_, _Expression_)
Definition ASoA.h:2396
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
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()))