1010
1111#include " Framework/TableTreeHelpers.h"
1212#include " Framework/AODReaderHelpers.h"
13- #include " Framework/AnalysisDataModel .h"
13+ #include " AnalysisDataModelHelpers .h"
1414#include " DataProcessingHelpers.h"
1515#include " ExpressionHelpers.h"
1616#include " Framework/RootTableBuilderHelpers.h"
4141
4242namespace o2 ::framework::readers
4343{
44- enum AODTypeMask : uint64_t {
45- None = 0 ,
46- Track = 1 << 0 ,
47- TrackCov = 1 << 1 ,
48- TrackExtra = 1 << 2 ,
49- Calo = 1 << 3 ,
50- CaloTrigger = 1 << 4 ,
51- Muon = 1 << 5 ,
52- MuonCluster = 1 << 6 ,
53- Zdc = 1 << 7 ,
54- BC = 1 << 8 ,
55- Collision = 1 << 9 ,
56- FT0 = 1 << 10 ,
57- FV0 = 1 << 11 ,
58- FDD = 1 << 12 ,
59- UnassignedTrack = 1 << 13 ,
60- Run2V0 = 1 << 14 ,
61- McCollision = 1 << 15 ,
62- McTrackLabel = 1 << 16 ,
63- McCaloLabel = 1 << 17 ,
64- McCollisionLabel = 1 << 18 ,
65- McParticle = 1 << 19 ,
66- Unknown = 1 << 20
67- };
68-
69- uint64_t getMask (header::DataDescription description)
70- {
71-
72- if (description == header::DataDescription{" TRACKPAR" }) {
73- return AODTypeMask::Track;
74- } else if (description == header::DataDescription{" TRACKPARCOV" }) {
75- return AODTypeMask::TrackCov;
76- } else if (description == header::DataDescription{" TRACKEXTRA" }) {
77- return AODTypeMask::TrackExtra;
78- } else if (description == header::DataDescription{" CALO" }) {
79- return AODTypeMask::Calo;
80- } else if (description == header::DataDescription{" CALOTRIGGER" }) {
81- return AODTypeMask::CaloTrigger;
82- } else if (description == header::DataDescription{" MUON" }) {
83- return AODTypeMask::Muon;
84- } else if (description == header::DataDescription{" MUONCLUSTER" }) {
85- return AODTypeMask::MuonCluster;
86- } else if (description == header::DataDescription{" ZDC" }) {
87- return AODTypeMask::Zdc;
88- } else if (description == header::DataDescription{" BC" }) {
89- return AODTypeMask::BC;
90- } else if (description == header::DataDescription{" COLLISION" }) {
91- return AODTypeMask::Collision;
92- } else if (description == header::DataDescription{" FT0" }) {
93- return AODTypeMask::FT0;
94- } else if (description == header::DataDescription{" FV0" }) {
95- return AODTypeMask::FV0;
96- } else if (description == header::DataDescription{" FDD" }) {
97- return AODTypeMask::FDD;
98- } else if (description == header::DataDescription{" UNASSIGNEDTRACK" }) {
99- return AODTypeMask::UnassignedTrack;
100- } else if (description == header::DataDescription{" RUN2V0" }) {
101- return AODTypeMask::Run2V0;
102- } else if (description == header::DataDescription{" MCCOLLISION" }) {
103- return AODTypeMask::McCollision;
104- } else if (description == header::DataDescription{" MCTRACKLABEL" }) {
105- return AODTypeMask::McTrackLabel;
106- } else if (description == header::DataDescription{" MCCALOLABEL" }) {
107- return AODTypeMask::McCaloLabel;
108- } else if (description == header::DataDescription{" MCCOLLISLABEL" }) {
109- return AODTypeMask::McCollisionLabel;
110- } else if (description == header::DataDescription{" MCPARTICLE" }) {
111- return AODTypeMask::McParticle;
112- } else {
113- LOG (DEBUG) << " This is a tree of unknown type! " << description.str ;
114- return AODTypeMask::Unknown;
115- }
116- }
117-
118- uint64_t calculateReadMask (std::vector<OutputRoute> const & routes, header::DataOrigin const &)
119- {
120- uint64_t readMask = None;
121- for (auto & route : routes) {
122- auto concrete = DataSpecUtils::asConcreteDataTypeMatcher (route.matcher );
123- auto description = concrete.description ;
124-
125- readMask |= getMask (description);
126- }
127- return readMask;
128- }
129-
130- std::vector<OutputRoute> getListOfUnknown (std::vector<OutputRoute> const & routes)
131- {
132-
133- std::vector<OutputRoute> unknows;
134- for (auto & route : routes) {
135- auto concrete = DataSpecUtils::asConcreteDataTypeMatcher (route.matcher );
136-
137- if (getMask (concrete.description ) == AODTypeMask::Unknown)
138- unknows.push_back (route);
139- }
140- return unknows;
141- }
142-
14344AlgorithmSpec AODReaderHelpers::aodSpawnerCallback (std::vector<InputSpec> requested)
14445{
14546 return AlgorithmSpec::InitCallback{[requested](InitContext& ic) {
@@ -174,9 +75,9 @@ AlgorithmSpec AODReaderHelpers::aodSpawnerCallback(std::vector<InputSpec> reques
17475 return o2::soa::spawner (expressions{}, original_table.get ());
17576 };
17677
177- if (description == header::DataDescription{" TRACKPAR " }) {
78+ if (description == header::DataDescription{" TRACK:PAR " }) {
17879 outputs.adopt (Output{origin, description}, maker (o2::aod::TracksExtensionMetadata{}));
179- } else if (description == header::DataDescription{" TRACKPARCOV " }) {
80+ } else if (description == header::DataDescription{" TRACK:PARCOV " }) {
18081 outputs.adopt (Output{origin, description}, maker (o2::aod::TracksCovExtensionMetadata{}));
18182 } else if (description == header::DataDescription{" MUON" }) {
18283 outputs.adopt (Output{origin, description}, maker (o2::aod::MuonsExtensionMetadata{}));
@@ -206,16 +107,11 @@ AlgorithmSpec AODReaderHelpers::rootFileReaderCallback()
206107 // get the run time watchdog
207108 auto * watchdog = new RuntimeWatchdog (options.get <int64_t >(" time-limit" ));
208109
209- // analyze type of requested tables
210- uint64_t readMask = calculateReadMask (spec.outputs , header::DataOrigin{" AOD" });
211- std::vector<OutputRoute> unknowns;
212- if (readMask & AODTypeMask::Unknown) {
213- unknowns = getListOfUnknown (spec.outputs );
214- }
110+ // create list of requested tables
111+ std::vector<OutputRoute> requestedTables (spec.outputs );
215112
216113 auto counter = std::make_shared<int >(0 );
217- return adaptStateless ([readMask,
218- unknowns,
114+ return adaptStateless ([requestedTables,
219115 watchdog,
220116 didir](DataAllocator& outputs, ControlService& control, DeviceSpec const & device) {
221117 // check if RuntimeLimit is reached
@@ -242,66 +138,36 @@ AlgorithmSpec AODReaderHelpers::rootFileReaderCallback()
242138 return ;
243139 }
244140
245- auto tableMaker = [&readMask, &outputs, fi, didir]( auto metadata, AODTypeMask mask, char const * treeName) {
246- if (readMask & mask ) {
141+ // loop over requested tables
142+ for ( auto route : requestedTables ) {
247143
248- auto dh = header::DataHeader (decltype (metadata)::description (), decltype (metadata)::origin (), 0 );
249- auto reader = didir->getTreeReader (dh, fi, treeName);
144+ // create a TreeToTable object
145+ auto concrete = DataSpecUtils::asConcreteDataMatcher (route.matcher );
146+ auto dh = header::DataHeader (concrete.description , concrete.origin , concrete.subSpec );
250147
251- using table_t = typename decltype (metadata)::table_t ;
252- if (!reader || (reader->IsInvalid ())) {
253- LOGP (ERROR, " Requested \" {}\" tree not found in input file \" {}\" " , treeName, didir->getInputFilename (dh, fi));
254- } else {
255- auto & builder = outputs.make <TableBuilder>(Output{decltype (metadata)::origin (), decltype (metadata)::description ()});
256- RootTableBuilderHelpers::convertASoA<table_t >(builder, *reader);
257- }
148+ auto tr = didir->getDataTree (dh, fi);
149+ if (!tr) {
150+ char * table;
151+ sprintf (table, " %s/%s/%" PRIu32, concrete.origin .str , concrete.description .str , concrete.subSpec );
152+ LOGP (ERROR, " Error while retrieving the tree for \" {}\" !" , table);
153+ return ;
258154 }
259- };
260- tableMaker (o2::aod::CollisionsMetadata{}, AODTypeMask::Collision, " O2collision" );
261- tableMaker (o2::aod::StoredTracksMetadata{}, AODTypeMask::Track, " O2track" );
262- tableMaker (o2::aod::StoredTracksCovMetadata{}, AODTypeMask::TrackCov, " O2track" );
263- tableMaker (o2::aod::TracksExtraMetadata{}, AODTypeMask::TrackExtra, " O2track" );
264- tableMaker (o2::aod::CalosMetadata{}, AODTypeMask::Calo, " O2calo" );
265- tableMaker (o2::aod::CaloTriggersMetadata{}, AODTypeMask::CaloTrigger, " O2calotrigger" );
266- tableMaker (o2::aod::StoredMuonsMetadata{}, AODTypeMask::Muon, " O2muon" );
267- tableMaker (o2::aod::MuonClustersMetadata{}, AODTypeMask::Muon, " O2muoncluster" );
268- tableMaker (o2::aod::ZdcsMetadata{}, AODTypeMask::Zdc, " O2zdc" );
269- tableMaker (o2::aod::BCsMetadata{}, AODTypeMask::BC, " O2bc" );
270- tableMaker (o2::aod::FT0sMetadata{}, AODTypeMask::FT0, " O2ft0" );
271- tableMaker (o2::aod::FV0sMetadata{}, AODTypeMask::FV0, " O2fv0" );
272- tableMaker (o2::aod::FDDsMetadata{}, AODTypeMask::FDD, " O2fdd" );
273- tableMaker (o2::aod::UnassignedTracksMetadata{}, AODTypeMask::UnassignedTrack, " O2unassignedtrack" );
274- tableMaker (o2::aod::Run2V0sMetadata{}, AODTypeMask::Run2V0, " Run2v0" );
275- tableMaker (o2::aod::McCollisionsMetadata{}, AODTypeMask::McCollision, " O2mccollision" );
276- tableMaker (o2::aod::McTrackLabelsMetadata{}, AODTypeMask::McTrackLabel, " O2mctracklabel" );
277- tableMaker (o2::aod::McCaloLabelsMetadata{}, AODTypeMask::McCaloLabel, " O2mccalolabel" );
278- tableMaker (o2::aod::McCollisionLabelsMetadata{}, AODTypeMask::McCollisionLabel, " O2mccollisionlabel" );
279- tableMaker (o2::aod::McParticlesMetadata{}, AODTypeMask::McParticle, " O2mcparticle" );
280-
281- // tables not included in the DataModel
282- if (readMask & AODTypeMask::Unknown) {
283155
284- // loop over unknowns
285- for ( auto route : unknowns) {
156+ auto o = Output (dh);
157+ auto & t2t = outputs. make <TreeToTable>(o, tr);
286158
287- // create a TreeToTable object
288- auto concrete = DataSpecUtils::asConcreteDataMatcher (route.matcher );
289- auto dh = header::DataHeader (concrete.description , concrete.origin , concrete.subSpec );
290-
291- auto tr = didir->getDataTree (dh, fi);
292- if (!tr) {
293- char * table;
294- sprintf (table, " %s/%s/%" PRIu32, concrete.origin .str , concrete.description .str , concrete.subSpec );
295- LOGP (ERROR, " Error while retrieving the tree for \" {}\" !" , table);
296- return ;
159+ // add branches to read
160+ auto colnames = aod::datamodel::getColumnNames (dh);
161+ if (colnames.size () == 0 ) {
162+ t2t.addAllColumns ();
163+ } else {
164+ for (auto colname : colnames) {
165+ t2t.addColumn (colname.c_str ());
297166 }
298-
299- auto o = Output (dh);
300- auto & t2t = outputs.make <TreeToTable>(o, tr);
301-
302- // fill the table
303- t2t.fill ();
304167 }
168+
169+ // fill the table
170+ t2t.fill ();
305171 }
306172 });
307173 })};
0 commit comments