15#include "../src/ExpressionJSONHelpers.h"
16#include <catch_amalgamated.hpp>
17#include <arrow/util/config.h>
30static BindingNode signed1Pt{
"signed1Pt", 5, atype::FLOAT};
31static BindingNode testInt{
"testInt", 6, atype::INT32};
47 REQUIRE(specs[1].
left == (
DatumSpec{std::string{
"eta"}, 3, atype::FLOAT}));
55 REQUIRE(specs[3].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
59 REQUIRE(specs[4].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
73 REQUIRE(gspecs[2].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
81 REQUIRE(gspecs[4].
left == (
DatumSpec{std::string{
"eta"}, 3, atype::FLOAT}));
92 REQUIRE(hspecs[1].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
96 REQUIRE(hspecs[2].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
114 REQUIRE(uspecs[3].
left == (
DatumSpec{std::string{
"phi"}, 2, atype::FLOAT}));
122 REQUIRE(uspecs[5].
left == (
DatumSpec{std::string{
"eta"}, 3, atype::FLOAT}));
127 Filter ptfilter = o2::aod::track::pt > pTCut;
128 REQUIRE(ptfilter.
node->self.index() == 2);
129 REQUIRE(ptfilter.
node->left->self.index() == 1);
130 REQUIRE(ptfilter.
node->right->self.index() == 3);
132 REQUIRE(ptfilterspecs[0].
left == (
DatumSpec{std::string{
"fPt"},
"o2::aod::track::pt"_h, atype::FLOAT}));
137 std::string prefix =
"prefix";
140 Filter ptfilter2 = o2::aod::track::pt >
group.pTCut;
141 group.pTCut.name.insert(0, 1,
'.');
143 REQUIRE(ptfilter2.
node->self.index() == 2);
144 REQUIRE(ptfilter2.
node->left->self.index() == 1);
145 REQUIRE(ptfilter2.
node->right->self.index() == 3);
146 REQUIRE(std::get<PlaceholderNode>(ptfilter2.
node->right->self).name ==
"prefix.pTCut");
148 REQUIRE(ptfilterspecs2[0].
left == (
DatumSpec{std::string{
"fPt"},
"o2::aod::track::pt"_h, atype::FLOAT}));
153 Filter testFilter = o2::aod::track::tpcNClsShared < as<uint8_t>(cvalue);
154 REQUIRE(testFilter.
node->self.index() == 2);
155 REQUIRE(testFilter.
node->left->self.index() == 1);
156 REQUIRE(testFilter.
node->right->self.index() == 3);
157 REQUIRE(std::get<PlaceholderNode>(testFilter.
node->right->self).name ==
"cvalue");
164 Projector pze = o2::aod::track::Pze::Projector();
166 REQUIRE(pzspecs[0].
left == (
DatumSpec{std::string{
"fTgl"},
"o2::aod::track::tgl"_h, atype::FLOAT}));
171 REQUIRE(pzspecs[1].
right == (
DatumSpec{std::string{
"fSigned1Pt"},
"o2::aod::track::signed1Pt"_h, atype::FLOAT}));
173 auto infield1 = o2::aod::track::Signed1Pt::asArrowField();
174 auto infield2 = o2::aod::track::Tgl::asArrowField();
175 auto resfield = o2::aod::track::Pze::asArrowField();
176 auto schema = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, resfield});
180 REQUIRE(std::string(gandiva_expression->ToString()) == std::string(
"float multiply((float) fTgl, float divide((const float) 1 raw(3f800000), (float) fSigned1Pt))"));
183 Projector pte = o2::aod::track::Pt::Projector();
186 auto infield3 = o2::aod::track::Signed1Pt::asArrowField();
187 auto resfield2 = o2::aod::track::Pt::asArrowField();
188 auto schema2 = std::make_shared<arrow::Schema>(std::vector{infield3, resfield2});
191 auto gandiva_expression2 =
makeExpression(gandiva_tree2, resfield2);
192 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)) }");
196 auto schema_p = std::make_shared<arrow::Schema>(
fields);
205 REQUIRE(bwf[1].
left == (
DatumSpec{std::string{
"fFlags"},
"o2::aod::track::flags"_h, atype::UINT32}));
209 auto infield4 = o2::aod::track::Flags::asArrowField();
210 auto resfield3 = std::make_shared<arrow::Field>(
"out", arrow::boolean());
211 auto schema_b = std::make_shared<arrow::Schema>(std::vector{infield4, resfield3});
213 REQUIRE(gandiva_tree3->ToString() ==
"bool not_equal(uint32 bitwise_and((uint32) fFlags, (const uint32) 2), (const uint32) 0)");
214 auto condition = expressions::makeCondition(gandiva_tree3);
215 std::shared_ptr<gandiva::Filter> flt;
216 auto s = gandiva::Filter::Make(schema_b, condition, &flt);
219 Filter rounding = nround(o2::aod::track::pt) > 0.1f;
225 REQUIRE(rf[1].
left == (
DatumSpec{std::string{
"fPt"},
"o2::aod::track::pt"_h, atype::FLOAT}));
229 auto infield5 = o2::aod::track::Pt::asArrowField();
230 auto resfield4 = std::make_shared<arrow::Field>(
"out", arrow::boolean());
231 auto schema_c = std::make_shared<arrow::Schema>(std::vector{infield5, resfield4});
233 REQUIRE(gandiva_tree4->ToString() ==
"bool greater_than(float round((float) fPt), (const float) 0.1 raw(3dcccccd))");
234 auto condition2 = expressions::makeCondition(gandiva_tree4);
235 std::shared_ptr<gandiva::Filter> flt2;
236 auto s2 = gandiva::Filter::Make(schema_c, condition2, &flt2);
243 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.)));
251 REQUIRE(cfspecs[1].condition == (
DatumSpec{5u, atype::BOOL}));
254 REQUIRE(cfspecs[2].
left == (
DatumSpec{std::string{
"fPt"},
"o2::aod::track::pt"_h, atype::FLOAT}));
258 REQUIRE(cfspecs[3].
left == (
DatumSpec{std::string{
"fPhi"},
"o2::aod::track::phi"_h, atype::FLOAT}));
262 REQUIRE(cfspecs[4].
left == (
DatumSpec{std::string{
"fPhi"},
"o2::aod::track::phi"_h, atype::FLOAT}));
270 REQUIRE(cfspecs[6].
left == (
DatumSpec{std::string{
"fEta"},
"o2::aod::track::eta"_h, atype::FLOAT}));
274 auto infield1 = o2::aod::track::Pt::asArrowField();
275 auto infield2 = o2::aod::track::Eta::asArrowField();
276 auto infield3 = o2::aod::track::Phi::asArrowField();
277 auto schema = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, infield3});
282 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)) }");
285 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);
287 auto infield4 = o2::aod::track::Signed1Pt::asArrowField();
288 auto infield5 = o2::aod::track::X::asArrowField();
289 auto infield6 = o2::aod::track::Y::asArrowField();
290 auto schema2 = std::make_shared<arrow::Schema>(std::vector{infield1, infield2, infield3, infield4, infield5, infield6});
293 auto gandiva_filter2 =
createFilter(schema2, gandiva_condition2);
294 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)) }");
299 auto schemaclp = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Pt::asArrowField()});
301 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 } }");
306 std::vector<float>
bins{0.5, 1.5, 2.5, 3.5, 4.5};
307 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};
310 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()});
312 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) } } } } }");
315 std::vector<float> parameters{1.0, 1.1, 1.2, 1.3,
321 (std::vector<float>)parameters,
322 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,
325 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()});
327 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) } } } } }");
333 while ((token = t.
nextToken()) && (token != Token::EoL)) {
336 std::cout << std::endl;
341 Filter f = (o2::aod::track::flags & 1u) != 0u && (o2::aod::track::pt <= 10.f);
342 std::string input =
"(o2::aod::track::flags & 1u) != 0u && (o2::aod::track::pt <= 10.f)";
348 auto schema = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Flags::asArrowField(), o2::aod::track::Pt::asArrowField()});
352 REQUIRE(tree1->ToString() == tree2->ToString());
355 input =
"-1.f * nlog(ntan(PIQuarter - 0.5f * natan(o2::aod::fwdtrack::tgl)))";
361 schema = std::make_shared<arrow::Schema>(std::vector{o2::aod::fwdtrack::Tgl::asArrowField()});
365 REQUIRE(treep1->ToString() == treep2->ToString());
367 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);
368 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)";
374 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()});
378 REQUIRE(treef1->ToString() == treef2->ToString());
381 Filter pcfg1 = o2::aod::track::pt > pTCut;
386 REQUIRE(pcfg2.
node->right->self.index() == 3);
389 schema = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::Pt::asArrowField()});
393 REQUIRE(tree1c->ToString() == tree2c->ToString());
398 Filter f = 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);
403 ifnode((o2::aod::track::tofChi2 >= 0.f) && (o2::aod::track::tofExpMom > 0.f),
static_cast<uint8_t
>(
o2::aod::track::TOF), (uint8_t)0x0);
410 std::stringstream osm;
413 std::stringstream ism;
419 auto schemaf = 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()});
422 REQUIRE(
t1->ToString() == t2->ToString());
426 auto schemap = std::make_shared<arrow::Schema>(std::vector{o2::aod::fwdtrack::Tgl::asArrowField()});
429 REQUIRE(t12->ToString() == t22->ToString());
433 auto schemap1 = std::make_shared<arrow::Schema>(std::vector{o2::aod::track::ITSClusterSizes::asArrowField(), o2::aod::track::TPCNClsFindable::asArrowField(),
434 o2::aod::track::TRDPattern::asArrowField(), o2::aod::track::TOFChi2::asArrowField(),
435 o2::aod::track::TOFExpMom::asArrowField()});
438 REQUIRE(t13->ToString() == t23->ToString());
447 REQUIRE(schemaf->ToString() == newSchemaf->ToString());
456 REQUIRE(schemap->ToString() == newSchemap->ToString());
465 REQUIRE(schemap1->ToString() == newSchemap1->ToString());
475 REQUIRE(realisticSchema->ToString() == restoredSchema->ToString());
485 REQUIRE(realisticSchema1->ToString() == restoredSchema1->ToString());
std::vector< expressions::Projector > projectors
#define DECLARE_SOA_EXPRESSION_COLUMN(_Name_, _Getter_, _Type_, _Expression_)
std::shared_ptr< arrow::Schema > schema
std::vector< std::shared_ptr< arrow::Field > > fields
constexpr int p1()
constexpr to accelerate the coordinates changing
Class for time synchronization of RawReader instances.
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat s1
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... >)
static void write(std::ostream &o, std::shared_ptr< arrow::Schema > &schema)
static std::shared_ptr< arrow::Schema > read(std::istream &s)
static std::vector< expressions::Projector > read(std::istream &s)
static void write(std::ostream &o, std::vector< expressions::Projector > &projectors)
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()))