Project
Loading...
Searching...
No Matches
test_AnalysisTask.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
12#include "Mocking.h"
13#include "TestClasses.h"
16
17#include <catch_amalgamated.hpp>
18
19using namespace o2;
20using namespace o2::framework;
21
22namespace o2::aod
23{
24O2HASH("TestA/0");
25namespace test
26{
32DECLARE_SOA_COLUMN(EventProperty, eventProperty, float);
33DECLARE_SOA_DYNAMIC_COLUMN(Sum, sum, [](float x, float y) { return x + y; });
34DECLARE_SOA_EXPRESSION_COLUMN(Sqfoo, sqfoo, float, nsqrt(test::foo));
35} // namespace test
36
37DECLARE_SOA_TABLE(Foos, "AOD", "FOO",
38 test::Foo);
39DECLARE_SOA_EXTENDED_TABLE(Fooss, Foos, "FOOS", 0, test::Sqfoo);
40DECLARE_SOA_TABLE(Bars, "AOD", "BAR",
41 test::Bar);
42DECLARE_SOA_TABLE(FooBars, "AOD", "FOOBAR",
43 test::Foo, test::Bar,
44 test::Sum<test::Foo, test::Bar>);
45DECLARE_SOA_TABLE(XYZ, "AOD", "XYZ",
46 test::X, test::Y, test::Z);
47DECLARE_SOA_TABLE(Events, "AOD", "EVENTS",
48 test::EventProperty);
49
50DECLARE_SOA_TABLE(Roots, "AOD", "ROOTS", test::Foo);
51
52namespace idx
53{
55}
56
57DECLARE_SOA_TABLE(B1s, "AOD", "B1", idx::RootId, test::X);
58DECLARE_SOA_TABLE(B2s, "AOD", "B2", idx::RootId, test::Y);
59DECLARE_SOA_TABLE(B3s, "AOD", "B3", idx::RootId, test::Z);
60
61namespace idx
62{
66} // namespace idx
67
68DECLARE_SOA_INDEX_TABLE(Bs, Roots, "BS", idx::RootId, idx::B1Id, idx::B2Id, idx::B3Id);
69
70} // namespace o2::aod
71
72struct ATask {
74
76 {
77 }
78};
79
86
87struct BTask {
88 void process(o2::aod::Collision const&, o2::soa::Join<o2::aod::Tracks, o2::aod::TracksExtra, o2::aod::TracksCov> const&, o2::aod::AmbiguousTracks const&, o2::aod::Calos const&, o2::aod::CaloTriggers const&)
89 {
90 }
91};
92
93struct CTask {
94 void process(o2::aod::Collision const&, o2::aod::Tracks const&)
95 {
96 }
97};
98
99struct DTask {
100 void process(o2::aod::Tracks const&)
101 {
102 }
103};
104
105struct ETask {
106 void process(o2::aod::FooBars::iterator const& foobar)
107 {
108 foobar.sum();
109 }
110};
111
112struct FTask {
113 expressions::Filter fooFilter = aod::test::foo > 1.;
115 {
116 foobar.sum();
117 }
118};
119
120struct GTask {
122 {
123 for (auto foobar : foobars) {
124 foobar.x();
125 foobar.foo();
126 foobar.bar();
127 }
128 }
129};
130
131struct HTask {
133 {
134 foobar.x();
135 foobar.foo();
136 foobar.bar();
137 }
138};
139
140struct ITask {
141 expressions::Filter flt = aod::test::bar > 0.;
143 {
144 for (auto foobar : foobars) {
145 foobar.x();
146 foobar.foo();
147 foobar.bar();
148 }
149 }
150};
151
152struct JTask {
153 Configurable<o2::test::SimplePODClass> cfg{"someConfigurable", {}, "Some Configurable Object"};
155 {
156 REQUIRE(cfg->x == 1);
157 }
158};
159
162};
163
164struct KTask {
165 struct : public ConfigurableGroup {
166 std::string prefix = "foo";
167 Configurable<int> anInt{"someConfigurable", {}, "Some Configurable Object"};
168 Configurable<int> anotherInt{"someOtherConfigurable", {}, "Some Configurable Object"};
170
171 Configurable<int> anThirdInt{"someThirdConfigurable", {}, "Some Configurable Object"};
172 struct : public ConditionGroup {
175 std::unique_ptr<int> someInt;
176 std::shared_ptr<int> someSharedInt;
177};
178
187
188TEST_CASE("AdaptorCompilation")
189{
190 auto cfgc = makeEmptyConfigContext();
191
192 REQUIRE(brace_constructible_size<ATask>() == 1);
193 auto task1ng = adaptAnalysisTask<ATask>(*cfgc, TaskName{"test1"});
194 REQUIRE(task1ng.inputs.size() == 2);
195 REQUIRE(task1ng.outputs.size() == 1);
196 REQUIRE(task1ng.inputs[1].binding == std::string("TracksExtension"));
197 REQUIRE(task1ng.inputs[0].binding == std::string("Tracks"));
198 REQUIRE(task1ng.outputs[0].binding.value == std::string("FooBars"));
199
200 auto task1ngc = adaptAnalysisTask<ATaskconsumer>(*cfgc);
201 REQUIRE(task1ngc.inputs.size() == 5);
202 REQUIRE(task1ngc.inputs[0].binding == "Foos");
203 REQUIRE(task1ngc.inputs[1].binding == "Roots");
204 REQUIRE(task1ngc.inputs[2].binding == "B1s");
205 REQUIRE(task1ngc.inputs[3].binding == "B2s");
206 REQUIRE(task1ngc.inputs[4].binding == "B3s");
207
208 auto task2 = adaptAnalysisTask<BTask>(*cfgc, TaskName{"test2"});
209 REQUIRE(task2.inputs.size() == 10);
210 REQUIRE(task2.inputs[2].binding == "TracksExtension");
211 REQUIRE(task2.inputs[1].binding == "Tracks");
212 REQUIRE(task2.inputs[4].binding == "TracksExtra_002Extension");
213 REQUIRE(task2.inputs[3].binding == "TracksExtra");
214 REQUIRE(task2.inputs[6].binding == "TracksCovExtension");
215 REQUIRE(task2.inputs[5].binding == "TracksCov");
216 REQUIRE(task2.inputs[7].binding == "AmbiguousTracks");
217 REQUIRE(task2.inputs[8].binding == "Calos");
218 REQUIRE(task2.inputs[9].binding == "CaloTriggers");
219 REQUIRE(task2.inputs[0].binding == "Collisions_001");
220
221 auto task3 = adaptAnalysisTask<CTask>(*cfgc, TaskName{"test3"});
222 REQUIRE(task3.inputs.size() == 3);
223 REQUIRE(task3.inputs[0].binding == "Collisions_001");
224 REQUIRE(task3.inputs[1].binding == "Tracks");
225 REQUIRE(task3.inputs[2].binding == "TracksExtension");
226
227 auto task4 = adaptAnalysisTask<DTask>(*cfgc, TaskName{"test4"});
228 REQUIRE(task4.inputs.size() == 2);
229 REQUIRE(task4.inputs[0].binding == "Tracks");
230 REQUIRE(task4.inputs[1].binding == "TracksExtension");
231
232 auto task5 = adaptAnalysisTask<ETask>(*cfgc, TaskName{"test5"});
233 REQUIRE(task5.inputs.size() == 1);
234 REQUIRE(task5.inputs[0].binding == "FooBars");
235
236 auto task6ng = adaptAnalysisTask<FTask>(*cfgc, TaskName{"test6"});
237 REQUIRE(task6ng.inputs.size() == 1);
238 REQUIRE(task6ng.inputs[0].binding == "FooBars");
239
240 auto task7ng = adaptAnalysisTask<GTask>(*cfgc, TaskName{"test7"});
241 REQUIRE(task7ng.inputs.size() == 3);
242 REQUIRE(task7ng.inputs[0].binding == "Foos");
243 REQUIRE(task7ng.inputs[1].binding == "Bars");
244 REQUIRE(task7ng.inputs[2].binding == "XYZ");
245
246 auto task8ng = adaptAnalysisTask<HTask>(*cfgc, TaskName{"test8"});
247 REQUIRE(task8ng.inputs.size() == 3);
248
249 auto task9ng = adaptAnalysisTask<ITask>(*cfgc, TaskName{"test9"});
250 REQUIRE(task9ng.inputs.size() == 4);
251
252 auto task10 = adaptAnalysisTask<JTask>(*cfgc, TaskName{"test10"});
253 REQUIRE(task10.inputs.size() == 1);
254
255 auto task11 = adaptAnalysisTask<KTask>(*cfgc, TaskName{"test11"});
256 REQUIRE(task11.options.size() == 3);
257 REQUIRE(task11.inputs.size() == 1);
258
259 auto task12 = adaptAnalysisTask<LTask>(*cfgc, TaskName{"test12"});
260 REQUIRE(task12.inputs.size() == 3);
261}
262
263TEST_CASE("TestPartitionIteration")
264{
265 TableBuilder builderA;
266 auto rowWriterA = builderA.persist<float, float>({"fX", "fY"});
267 rowWriterA(0, 0.0f, 8.0f);
268 rowWriterA(0, 1.0f, 9.0f);
269 rowWriterA(0, 2.0f, 10.0f);
270 rowWriterA(0, 3.0f, 11.0f);
271 rowWriterA(0, 4.0f, 12.0f);
272 rowWriterA(0, 5.0f, 13.0f);
273 rowWriterA(0, 6.0f, 14.0f);
274 rowWriterA(0, 7.0f, 15.0f);
275 auto tableA = builderA.finalize();
276 REQUIRE(tableA->num_rows() == 8);
277
278 using TestA = soa::InPlaceTable<"TestA/0"_h, o2::soa::Index<>, aod::test::X, aod::test::Y>;
279 using FilteredTest = o2::soa::Filtered<TestA>;
280 using PartitionTest = Partition<TestA>;
281 using PartitionFilteredTest = Partition<o2::soa::Filtered<TestA>>;
282 using PartitionNestedFilteredTest = Partition<o2::soa::Filtered<o2::soa::Filtered<TestA>>>;
283 using namespace o2::framework;
284
285 TestA testA{tableA};
286
287 PartitionTest p1 = aod::test::x < 4.0f;
288 p1.bindTable(testA);
289 REQUIRE(4 == p1.size());
290 REQUIRE(p1.begin() != p1.end());
291 auto i = 0;
292 for (auto& p : p1) {
293 REQUIRE(i == p.x());
294 REQUIRE(i + 8 == p.y());
295 REQUIRE(i == p.index());
296 i++;
297 }
298 REQUIRE(i == 4);
299
300 expressions::Filter f1 = aod::test::x < 4.0f;
301 auto selection = expressions::createSelection(testA.asArrowTable(), f1);
302 FilteredTest filtered{{testA.asArrowTable()}, o2::soa::selectionToVector(selection)};
303 PartitionFilteredTest p2 = aod::test::y > 9.0f;
304 p2.bindTable(filtered);
305
306 REQUIRE(2 == p2.size());
307 i = 0;
308 for (auto& p : p2) {
309 REQUIRE(i + 2 == p.x());
310 REQUIRE(i + 10 == p.y());
311 REQUIRE(i + 2 == p.index());
312 i++;
313 }
314 REQUIRE(i == 2);
315
316 PartitionNestedFilteredTest p3 = aod::test::x < 3.0f;
317 p3.bindTable(*(p2.mFiltered));
318 REQUIRE(1 == p3.size());
319 i = 0;
320 for (auto& p : p3) {
321 REQUIRE(i + 2 == p.x());
322 REQUIRE(i + 10 == p.y());
323 REQUIRE(i + 2 == p.index());
324 i++;
325 }
326 REQUIRE(i == 1);
327}
#define O2HASH(_Str_)
Pre-declare Hash specialization for a generic string.
Definition ASoA.h:271
#define DECLARE_SOA_DYNAMIC_COLUMN(_Name_, _Getter_,...)
Definition ASoA.h:2967
#define DECLARE_SOA_TABLE(_Name_, _Origin_, _Desc_,...)
Definition ASoA.h:3052
#define DECLARE_SOA_EXPRESSION_COLUMN(_Name_, _Getter_, _Type_, _Expression_)
Definition ASoA.h:2388
#define DECLARE_SOA_COLUMN(_Name_, _Getter_, _Type_)
Definition ASoA.h:2314
#define DECLARE_SOA_INDEX_COLUMN(_Name_, _Getter_)
Definition ASoA.h:2737
#define DECLARE_SOA_EXTENDED_TABLE(_Name_, _Table_, _Description_, _Version_,...)
Definition ASoA.h:3094
#define DECLARE_SOA_INDEX_TABLE(_Name_, _Key_, _Description_,...)
Definition ASoA.h:3126
int32_t i
const GPUTPCGMMerger::trackCluster & b1
constexpr int p2()
constexpr int p1()
constexpr to accelerate the coordinates changing
std::unique_ptr< ConfigContext > makeEmptyConfigContext()
auto persist(std::array< char const *, sizeof...(ARGS)+1 > const &columnNames)
std::shared_ptr< arrow::Table > finalize()
T::template iterator_template_o< FilteredIndexPolicy, self_t > iterator
Definition ASoA.h:3554
float sum(float s, o2::dcs::DataPointValue v)
Definition dcs-ccdb.cxx:39
GLint GLenum GLint x
Definition glcorearb.h:403
GLint y
Definition glcorearb.h:270
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
McCollisions::iterator McCollision
Tracks::iterator Track
Collisions::iterator Collision
gandiva::Selection createSelection(std::shared_ptr< arrow::Table > const &table, Filter const &expression)
Function for creating gandiva selection from our internal filter tree.
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
SelectionVector selectionToVector(gandiva::Selection const &sel)
Definition ASoA.cxx:43
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
FIXME: do not use data model tables.
void process(o2::aod::Track const &)
Produces< aod::FooBars > foobars
void init(InitContext &)
Spawns< aod::Fooss > foos
Builds< aod::Bs > bs
void process(o2::aod::Collision const &, o2::soa::Join< o2::aod::Tracks, o2::aod::TracksExtra, o2::aod::TracksCov > const &, o2::aod::AmbiguousTracks const &, o2::aod::Calos const &, o2::aod::CaloTriggers const &)
void process(o2::aod::Collision const &, o2::aod::Tracks const &)
void process(o2::aod::Tracks const &)
void process(o2::aod::FooBars::iterator const &foobar)
void process(soa::Filtered< o2::aod::FooBars >::iterator const &foobar)
expressions::Filter fooFilter
void process(o2::soa::Join< o2::aod::Foos, o2::aod::Bars, o2::aod::XYZ > const &foobars)
void process(o2::soa::Join< o2::aod::Foos, o2::aod::Bars, o2::aod::XYZ >::iterator const &foobar)
expressions::Filter flt
void process(o2::aod::Collision const &, o2::soa::Filtered< o2::soa::Join< o2::aod::Foos, o2::aod::Bars, o2::aod::XYZ > > const &foobars)
Configurable< o2::test::SimplePODClass > cfg
void process(o2::aod::Collision const &)
Configurable< int > anInt
std::unique_ptr< int > someInt
Configurable< int > anThirdInt
std::shared_ptr< int > someSharedInt
Configurable< int > anotherInt
std::string prefix
SliceCache cache
void process(aod::McCollision const &, soa::SmallGroups< soa::Join< aod::Collisions, aod::McCollisionLabels > > const &)
PresliceUnsorted< aod::McCollisionLabels > perMcCol
Preslice< aod::Tracks > perCol
PresliceOptional< aod::Tracks > perPart
PresliceUnsortedOptional< aod::Collisions > perMcColopt
Struct to differentiate task names from possible task string arguments.
A struct, containing the root of the expression tree.
table_t::template iterator_template< DefaultIndexPolicy, self_t, Ts... > iterator
Definition ASoA.h:3162
TEST_CASE("AdaptorCompilation")
HistogramRegistry foo()