15#include <catch_amalgamated.hpp>
16#include <arrow/util/config.h>
29static BindingNode signed1Pt{
"signed1Pt", 5, atype::FLOAT};
30static BindingNode testInt{
"testInt", 6, atype::INT32};
46 REQUIRE(specs[1].
left == (
DatumSpec{std::string{
"eta"}, 3, atype::FLOAT}));
54 REQUIRE(specs[3].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
58 REQUIRE(specs[4].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
72 REQUIRE(gspecs[2].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
80 REQUIRE(gspecs[4].
left == (
DatumSpec{std::string{
"eta"}, 3, atype::FLOAT}));
91 REQUIRE(hspecs[1].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
95 REQUIRE(hspecs[2].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
113 REQUIRE(uspecs[3].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
121 REQUIRE(uspecs[5].
left == (
DatumSpec{std::string{
"eta"}, 3, atype::FLOAT}));
126 Filter ptfilter = o2::aod::track::pt > pTCut;
127 REQUIRE(ptfilter.
node->self.index() == 2);
128 REQUIRE(ptfilter.
node->left->self.index() == 1);
129 REQUIRE(ptfilter.
node->right->self.index() == 3);
131 REQUIRE(ptfilterspecs[0].
left == (
DatumSpec{std::string{
"fPt"},
"o2::aod::track::pt"_h, atype::FLOAT}));
136 std::string prefix =
"prefix";
139 Filter ptfilter2 = o2::aod::track::pt >
group.pTCut;
140 group.pTCut.name.insert(0, 1,
'.');
142 REQUIRE(ptfilter2.
node->self.index() == 2);
143 REQUIRE(ptfilter2.
node->left->self.index() == 1);
144 REQUIRE(ptfilter2.
node->right->self.index() == 3);
145 REQUIRE(std::get<PlaceholderNode>(ptfilter2.
node->right->self).name ==
"prefix.pTCut");
147 REQUIRE(ptfilterspecs2[0].
left == (
DatumSpec{std::string{
"fPt"},
"o2::aod::track::pt"_h, atype::FLOAT}));
152 Filter testFilter = o2::aod::track::tpcNClsShared < as<uint8_t>(cvalue);
153 REQUIRE(testFilter.
node->self.index() == 2);
154 REQUIRE(testFilter.
node->left->self.index() == 1);
155 REQUIRE(testFilter.
node->right->self.index() == 3);
156 REQUIRE(std::get<PlaceholderNode>(testFilter.
node->right->self).name ==
"cvalue");
163 Projector pze = o2::aod::track::Pze::Projector();
165 REQUIRE(pzspecs[0].
left == (
DatumSpec{std::string{
"fTgl"},
"o2::aod::track::tgl"_h, atype::FLOAT}));
170 REQUIRE(pzspecs[1].
right == (
DatumSpec{std::string{
"fSigned1Pt"},
"o2::aod::track::signed1Pt"_h, atype::FLOAT}));
172 auto infield1 = o2::aod::track::Signed1Pt::asArrowField();
173 auto infield2 = o2::aod::track::Tgl::asArrowField();
174 auto resfield = o2::aod::track::Pze::asArrowField();
175 auto schema = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, resfield});
179 REQUIRE(std::string(gandiva_expression->ToString()) == std::string(
"float multiply((float) fTgl, float divide((const float) 1 raw(3f800000), (float) fSigned1Pt))"));
182 Projector pte = o2::aod::track::Pt::Projector();
185 auto infield3 = o2::aod::track::Signed1Pt::asArrowField();
186 auto resfield2 = o2::aod::track::Pt::asArrowField();
187 auto schema2 = std::make_shared<arrow::Schema>(std::vector{infield3, resfield2});
190 auto gandiva_expression2 =
makeExpression(gandiva_tree2, resfield2);
191 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)) }");
195 auto schema_p = std::make_shared<arrow::Schema>(fields);
204 REQUIRE(bwf[1].
left == (
DatumSpec{std::string{
"fFlags"},
"o2::aod::track::flags"_h, atype::UINT32}));
208 auto infield4 = o2::aod::track::Flags::asArrowField();
209 auto resfield3 = std::make_shared<arrow::Field>(
"out", arrow::boolean());
210 auto schema_b = std::make_shared<arrow::Schema>(std::vector{infield4, resfield3});
212 REQUIRE(gandiva_tree3->ToString() ==
"bool not_equal(uint32 bitwise_and((uint32) fFlags, (const uint32) 2), (const uint32) 0)");
214 std::shared_ptr<gandiva::Filter> flt;
215 auto s = gandiva::Filter::Make(schema_b, condition, &flt);
218 Filter rounding = nround(o2::aod::track::pt) > 0.1f;
224 REQUIRE(rf[1].
left == (
DatumSpec{std::string{
"fPt"},
"o2::aod::track::pt"_h, atype::FLOAT}));
228 auto infield5 = o2::aod::track::Pt::asArrowField();
229 auto resfield4 = std::make_shared<arrow::Field>(
"out", arrow::boolean());
230 auto schema_c = std::make_shared<arrow::Schema>(std::vector{infield5, resfield4});
232 REQUIRE(gandiva_tree4->ToString() ==
"bool greater_than(float round((float) fPt), (const float) 0.1 raw(3dcccccd))");
234 std::shared_ptr<gandiva::Filter> flt2;
235 auto s2 = gandiva::Filter::Make(schema_c, condition2, &flt2);
242 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.)));
250 REQUIRE(cfspecs[1].condition == (
DatumSpec{5u, atype::BOOL}));
253 REQUIRE(cfspecs[2].
left == (
DatumSpec{std::string{
"fPt"},
"o2::aod::track::pt"_h, atype::FLOAT}));
257 REQUIRE(cfspecs[3].
left == (
DatumSpec{std::string{
"fPhi"},
"o2::aod::track::phi"_h, atype::FLOAT}));
261 REQUIRE(cfspecs[4].
left == (
DatumSpec{std::string{
"fPhi"},
"o2::aod::track::phi"_h, atype::FLOAT}));
269 REQUIRE(cfspecs[6].
left == (
DatumSpec{std::string{
"fEta"},
"o2::aod::track::eta"_h, atype::FLOAT}));
273 auto infield1 = o2::aod::track::Pt::asArrowField();
274 auto infield2 = o2::aod::track::Eta::asArrowField();
275 auto infield3 = o2::aod::track::Phi::asArrowField();
276 auto schema = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, infield3});
279 auto gandiva_filter =
createFilter(schema, gandiva_condition);
281 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)) }");
284 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);
286 auto infield4 = o2::aod::track::Signed1Pt::asArrowField();
287 auto infield5 = o2::aod::track::X::asArrowField();
288 auto infield6 = o2::aod::track::Y::asArrowField();
289 auto schema2 = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, infield3, infield4, infield5, infield6});
292 auto gandiva_filter2 =
createFilter(schema2, gandiva_condition2);
293 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)) }");
298 auto schemaclp = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Pt::asArrowField()});
300 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 } }");
305 std::vector<float>
bins{0.5, 1.5, 2.5, 3.5, 4.5};
306 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};
309 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()});
311 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) } } } } }");
314 std::vector<float> parameters{1.0, 1.1, 1.2, 1.3,
320 (std::vector<float>)parameters,
321 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,
324 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()});
326 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) } } } } }");
332 while ((token = t.
nextToken()) && (token != Token::EoL)) {
335 std::cout << std::endl;
340 Filter f = (o2::aod::track::flags & 1u) != 0u && (o2::aod::track::pt <= 10.f);
341 std::string input =
"(o2::aod::track::flags & 1u) != 0u && (o2::aod::track::pt <= 10.f)";
347 auto schema = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Flags::asArrowField(), o2::aod::track::Pt::asArrowField()});
351 REQUIRE(tree1->ToString() == tree2->ToString());
354 input =
"-1.f * nlog(ntan(PIQuarter - 0.5f * natan(o2::aod::fwdtrack::tgl)))";
360 schema = std::make_shared<arrow::Schema>(std::vector{o2::aod::fwdtrack::Tgl::asArrowField()});
364 REQUIRE(treep1->ToString() == treep2->ToString());
366 Filter f2 = o2::aod::track::signed1Pt > 0.f &&
ifnode(nabs(o2::aod::track::eta) < 1.0f, nabs(o2::aod::track::x) > 2.0f, nabs(o2::aod::track::y) > 3.0f);
367 input =
"o2::aod::track::signed1Pt > 0.f && ifnode(nabs(o2::aod::track::eta) < 1.0f, nabs(o2::aod::track::x) > 2.0f, nabs(o2::aod::track::y) > 3.0f)";
373 schema = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Eta::asArrowField(), o2::aod::track::Signed1Pt::asArrowField(), o2::aod::track::X::asArrowField(), o2::aod::track::Y::asArrowField()});
377 REQUIRE(treef1->ToString() == treef2->ToString());
380 Filter pcfg1 = o2::aod::track::pt > pTCut;
385 REQUIRE(pcfg2.
node->right->self.index() == 3);
388 schema = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Pt::asArrowField()});
392 REQUIRE(tree1c->ToString() == tree2c->ToString());
#define DECLARE_SOA_EXPRESSION_COLUMN(_Name_, _Getter_, _Type_, _Expression_)
Class for time synchronization of RawReader instances.
GLenum const GLfloat * params
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
constexpr float PIQuarter
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 ¶meters, 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.
TEST_CASE("test_prepareArguments")
auto createFieldsFromColumns(framework::pack< C... >)
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
static Node parse(std::string const &input)
void printTokens(Tokenizer &t)
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))