Project
Loading...
Searching...
No Matches
RecoContainer.h
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
16#ifndef ALICEO2_RECO_CONTAINER
17#define ALICEO2_RECO_CONTAINER
18
31#include <gsl/span>
32#include <memory>
33
34// We forward declare the internal structures, to reduce header dependencies.
35// Please include headers for TPC Hits or TRD tracklets directly (DataFormatsTPC/WorkflowHelper.h / DataFormatsTRD/RecoInputContainer.h)
36namespace o2::tpc
37{
38class TrackTPC;
39using TPCClRefElem = uint32_t;
41struct TriggerInfoDLBZS;
42namespace internal
43{
45} // namespace internal
46} // namespace o2::tpc
47
48namespace o2::trd
49{
50class Tracklet64;
51class CalibratedTracklet;
52class TriggerRecord;
53class TrackTriggerRecord;
54// class TrackTRD;
55struct RecoInputContainer;
56} // namespace o2::trd
57
58namespace o2::framework
59{
60class ProcessingContext;
61struct InputSpec;
62} // namespace o2::framework
63
64namespace o2::its
65{
66class TrackITS;
67}
68
69namespace o2::mft
70{
71class TrackMFT;
72}
73
74namespace o2::mch
75{
76class TrackMCH;
77class ROFRecord;
78class Cluster;
79} // namespace o2::mch
80
81namespace o2::mid
82{
83class Cluster;
84class ROFRecord;
85class Track;
86class MCClusterLabel;
87class MCLabel;
88} // namespace o2::mid
89
90namespace o2::itsmft
91{
92class ROFRecord;
93class CompClusterExt;
94class TrkClusRef;
95} // namespace o2::itsmft
96
97namespace o2::tof
98{
99class Cluster;
100}
101
102namespace o2::hmpid
103{
104class Cluster;
105class Trigger;
106} // namespace o2::hmpid
107
108namespace o2::ft0
109{
110class RecPoints;
111class ChannelDataFloat;
112} // namespace o2::ft0
113
114namespace o2::fv0
115{
116class RecPoints;
117class ChannelDataFloat;
118} // namespace o2::fv0
119
120namespace o2::zdc
121{
122class BCRecData;
123class ZDCEnergy;
124class ZDCTDCData;
125} // namespace o2::zdc
126
127namespace o2::fdd
128{
129class RecPoint;
130class ChannelDataFloat;
131} // namespace o2::fdd
132
133namespace o2::ctp
134{
135class CTPDigit;
136} // namespace o2::ctp
137
138namespace o2::phos
139{
140class Cell;
141class TriggerRecord;
142class MCLabel;
143} // namespace o2::phos
144
145namespace o2::cpv
146{
147class Cluster;
148class TriggerRecord;
149} // namespace o2::cpv
150
151namespace o2::emcal
152{
153class Cell;
154class TriggerRecord;
155class MCLabel;
156} // namespace o2::emcal
157
158namespace o2::dataformats
159{
160class TrackTPCITS;
161class TrackTPCTOF;
162class MatchInfoTOF;
163class MatchInfoHMP;
164class PrimaryVertex;
165class VtxTrackIndex;
166class VtxTrackRef;
167class V0;
168class V0Index;
169class Cascade;
170class CascadeIndex;
171class Decay3Body;
172class Decay3BodyIndex;
173class StrangeTrack;
174class TrackCosmics;
175class GlobalFwdTrack;
176class MatchInfoFwd;
177class TrackMCHMID;
178class IRFrame;
179} // namespace o2::dataformats
180
181namespace o2
182{
183class MCEventLabel;
184}
185
186namespace o2
187{
188namespace globaltracking
189{
190
191// max number of layers for which the ITS/MFT clusters, ROF records and patterns can be provided separately
194
195// helper class to request DPL input data from the processor specs definition
197 std::vector<o2::framework::InputSpec> inputs;
198 std::unordered_map<std::string, bool> requestMap;
200 bool ITSPerLayer = false; // ITS clusters, ROFs and patterns are provided per layer
201 bool MFTPerLayer = false; // MFT clusters, ROFs and patterns are provided per layer
202
203 auto getITSPerLayer() const { return ITSPerLayer; }
204 auto getMFTPerLayer() const { return MFTPerLayer; }
205 void setITSPerLayer(bool v = true);
206 void setMFTPerLayer(bool v = true);
207
212 uint32_t getMatchingInputSubSpec() const { return getSubSpec(matchingInputType); }
213
214 void addInput(const o2::framework::InputSpec&& isp);
215
216 bool isRequested(const std::string& t) const { return !t.empty() && requestMap.find(t) != requestMap.end(); }
219
220 void requestITSTracks(bool mc);
221 void requestMFTTracks(bool mc);
222 void requestMCHTracks(bool mc);
223 void requestMIDTracks(bool mc);
224 void requestTPCTracks(bool mc);
225 void requestITSTPCTracks(bool mc);
226 void requestGlobalFwdTracks(bool mc);
227 void requestMFTMCHMatches(bool mc);
228 void requestMCHMIDMatches(bool mc);
229 void requestTPCTOFTracks(bool mc);
230 void requestITSTPCTRDTracks(bool mc);
231 void requestTPCTRDTracks(bool mc);
233 void requestFT0RecPoints(bool mc);
234 void requestFV0RecPoints(bool mc);
235 void requestFDDRecPoints(bool mc);
236 void requestZDCRecEvents(bool mc);
237 void requestITSClusters(bool mc);
238 void requestMFTClusters(bool mc);
239 void requestTPCClusters(bool mc);
240 void requestTPCOccMap();
241 void requestTPCTriggers();
242 void requestTOFClusters(bool mc);
243 void requestTRDTracklets(bool mc);
244 void requestMCHClusters(bool mc);
245 void requestMIDClusters(bool mc);
246 void requestHMPClusters(bool mc);
247 void requestHMPMatches(bool mc); // no input available at the moment
248
249 void requestCTPDigits(bool mc);
250
251 void requestPHOSCells(bool mc);
252 void requestEMCALCells(bool mc);
253 void requestCPVClusters(bool mc);
254
255 void requestCoscmicTracks(bool mc);
256
257 void requestPrimaryVertices(bool mc);
258 void requestPrimaryVerticesTMP(bool mc);
259 void requestSecondaryVertices(bool mc);
260 void requestStrangeTracks(bool mc);
261
262 void requestIRFramesITS();
263
264#ifdef ENABLE_UPGRADES
265 void requestIT3Clusters(bool mc);
266#endif
267};
268
269// Helper class to requested data.
270// Most common data have dedicated getters, some need to be called with returned typa as a template.
271// In general on either gets a gsl::span<const Type> via getter like e.g. getITSTracks()
272// of a reference to particular track, i.e. getITSTrack(GlobalTrackID id).
273// Note that random access like getITSTracks()[i] has an overhead, since for every call a span is created.
274// Therefore, for the random access better to use direct getter, i.e. auto& tr = getITSTrack(gid)
275// while for looping over the whole span first create a span then iterate over it.
276
280
290 MCLABELS, // track labels
291 MCLABELSEXTRA, // additonal labels, like TOF clusters matching label (not sure TOF really needs it)
292 VARIA, // misc data, which does not fit to other categories
294 };
295
296 // slots to register primary vertex data
297 enum PVTXSlots { PVTX, // Primary vertices
298 PVTX_TRMTC, // matched track indices
299 PVTX_TRMTCREFS, // PV -> matched tracks referencing object
300 PVTX_CONTID, // contributors indices
301 PVTX_CONTIDREFS, // PV -> contributors indices
302 PVTX_MCTR, // PV MC label
304
305 // slots to register secondary vertex data
306 enum SVTXSlots { V0SIDX, // V0s indices
307 V0S, // V0 objects
308 PVTX_V0REFS, // PV -> V0 references
309 CASCSIDX, // Cascade indices
310 CASCS, // Cascade objects
311 PVTX_CASCREFS, // PV -> Cascade reference
312 DECAY3BODYIDX, // 3-body decay indices
313 DECAY3BODY, // 3-body decay objects
314 PVTX_3BODYREFS, // PV -> 3-body decay references
316
317 // slots to register strangeness tracking data
323
324 // slots for cosmics
328
329 // slots to register ITS/MFT clusters data (per layer, or all layers together in the slot 0)
330 enum ITSMFTClusSlots { ITSMFT_ROF, // ROF records
331 ITSMFT_CLS, // compact clusters
332 ITSMFT_PAT, // cluster patterns
334
335 using AccSlots = o2::dataformats::AbstractRefAccessor<int, NCOMMONSLOTS>; // int here is a dummy placeholder
343 using GlobalIDSet = std::array<GTrackID, GTrackID::NSources>;
344
345 static constexpr float PS2MUS = 1e-6;
346
348
349 std::array<AccSlots, GTrackID::NSources> commonPool;
350 PVertexAccessor pvtxPool; // containers for primary vertex related objects
351 SVertexAccessor svtxPool; // containers for secondary vertex related objects
352 STrackAccessor strkPool; // containers for strangeness tracking related objects
353 CosmicsAccessor cosmPool; // containers for cosmics track data
354
355 bool ITSPerLayer = false; // ITS clusters, ROFs and patterns are provided per layer
356 bool MFTPerLayer = false; // MFT clusters, ROFs and patterns are provided per layer
357
358 std::array<ITSClusAccessor, NITSMFTCLUSSLOTS> ITSClustersData; // [ROF/Clus/Patt][MaxITSLayers slots, non-staggered == 0]
359 std::array<MFTClusAccessor, NITSMFTCLUSSLOTS> MFTClustersData; // [ROF/Clus/Patt][MaxMFTLayers slots, non-staggered == 0]
360
361 std::array<std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>>, MaxITSLayers> mcITSClusters;
362 std::array<std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>>, MaxMFTLayers> mcMFTClusters;
363 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>> mcTOFClusters;
364 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>> mcHMPClusters;
365 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>> mcCPVClusters;
366 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::MCCompLabel>> mcMCHClusters;
367 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::phos::MCLabel>> mcPHSCells;
368 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::emcal::MCLabel>> mcEMCCells;
369 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::mid::MCClusterLabel>> mcMIDTrackClusters;
370 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::mid::MCClusterLabel>> mcMIDClusters;
371 std::unique_ptr<const std::vector<o2::MCCompLabel>> mcMIDTracks;
373
374 gsl::span<const unsigned char> clusterShMapTPC;
375 gsl::span<const unsigned int> occupancyMapTPC;
376
377 std::unique_ptr<o2::tpc::internal::getWorkflowTPCInput_ret> inputsTPCclusters; // special struct for TPC clusters access
378 std::unique_ptr<o2::trd::RecoInputContainer> inputsTRD; // special struct for TRD tracklets, trigger records
379
380 auto getITSPerLayer() const { return ITSPerLayer; }
381 auto getMFTPerLayer() const { return MFTPerLayer; }
382
384 void createTracks(std::function<bool(const o2::track::TrackParCov&, GTrackID)> const& creator) const;
385 template <class T>
386 void createTracksVariadic(T creator, GTrackID::mask_t srcSel = GTrackID::getSourcesMask("all")) const;
387 void fillTrackMCLabels(const gsl::span<GTrackID> gids, std::vector<o2::MCCompLabel>& mcinfo) const;
388
394
403
407
410 void addTPCClusters(o2::framework::ProcessingContext& pc, bool mc, bool shmap, bool occmap);
418
422
424
426
430
432
436
438
440
441#ifdef ENABLE_UPGRADES
442 void addIT3Clusters(o2::framework::ProcessingContext& pc, bool mc);
443#endif
444
445 // custom getters
446
447 // get contributors from single detectors: return array with sources set to all contributing GTrackIDs
449
450 // get contributing TPC GTrackID to the source. If source gidx is not contributed by TPC,
451 // returned GTrackID.isSourceSet()==false
453
454 // get contributing ITS GTrackID to the source. If source gidx is not contributed by ITS,
455 // returned GTrackID.isSourceSet()==false
457
458 // check if track source attached
459 bool isTrackSourceLoaded(int src) const;
460
461 // check if match source attached
462 bool isMatchSourceLoaded(int src) const { return commonPool[src].isLoaded(MATCHES); }
463
464 // -------------------------------
465 // generic getter for span
466 template <typename U>
467 gsl::span<const U> getSpan(int src, int slotID) const
468 {
469 return commonPool[src].getSpan<U>(slotID);
470 }
471
472 // generic getter for an object in the attaches span
473 template <typename U>
474 const U& getObject(int src, int index, int slotID) const
475 {
476 return commonPool[src].get_as<U>(slotID, index);
477 }
478 template <typename U>
479 const U& getObject(GTrackID gid, int slotID) const
480 {
481 return getObject<U>(gid.getSource(), gid.getIndex(), slotID);
482 }
483 // <<TODO Make this private
484
485 //-------------------------
486 // in general, U can be a TrackParCov or particular detector track, e.g. o2::its::TrackITS
487 template <typename U>
488 gsl::span<const U> getTracks(int src) const
489 {
490 return getSpan<U>(src, TRACKS);
491 }
492
493 template <typename U>
494 const U& getTrack(int src, int id) const
495 {
496 return getObject<U>(src, id, TRACKS);
497 }
498
499 template <typename U>
500 const U& getTrack(GTrackID gid) const
501 {
502 return getObject<U>(gid, TRACKS);
503 }
504
506 {
507 // RS FIXME: THIS IS TEMPORARY: some labels are still not implemented: in this case return dummy label
508 return commonPool[id.getSource()].getSize(MCLABELS) ? getObject<o2::MCCompLabel>(id, MCLABELS) : o2::MCCompLabel{};
509 // return getObject<o2::MCCompLabel>(id, MCLABELS);
510 }
511
512 //--------------------------------------------
513 // fetch track param
515 // fetch outer param (not all track types might have it)
517
518 //--------------------------------------------
519 // ITS
520 const o2::its::TrackITS& getITSTrack(GTrackID gid) const { return getTrack<o2::its::TrackITS>(gid); }
521 auto getITSTracks() const { return getTracks<o2::its::TrackITS>(GTrackID::ITS); }
522 auto getITSTracksROFRecords() const { return getSpan<o2::itsmft::ROFRecord>(GTrackID::ITS, TRACKREFS); }
523 auto getITSTracksClusterRefs() const { return getSpan<int>(GTrackID::ITS, INDICES); }
524 auto getITSTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::ITS, MCLABELS); }
525 auto getITSABRefs() const { return getSpan<o2::itsmft::TrkClusRef>(GTrackID::ITSAB, TRACKREFS); }
526 const o2::itsmft::TrkClusRef& getITSABRef(GTrackID gid) const { return getObject<o2::itsmft::TrkClusRef>(gid, TRACKREFS); }
527 auto getITSABClusterRefs() const { return getSpan<int>(GTrackID::ITSAB, INDICES); }
528 auto getITSABMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::ITSAB, MCLABELS); }
529
530 // ITS clusters (layer is ignored unless the data was provided per layer)
533 auto getITSClustersPatterns(int layer = 0) const { return ITSClustersData[ITSMFT_PAT].getSpan<unsigned char>(layer); }
534 auto getITSClustersMCLabels(int layer = 0) const { return mcITSClusters[layer].get(); }
535
536 // MFT
537 const o2::mft::TrackMFT& getMFTTrack(GTrackID gid) const { return getTrack<o2::mft::TrackMFT>(gid); }
538 auto getMFTTracks() const { return getTracks<o2::mft::TrackMFT>(GTrackID::MFT); }
539 auto getMFTTracksROFRecords() const { return getSpan<o2::itsmft::ROFRecord>(GTrackID::MFT, TRACKREFS); }
540 auto getMFTTracksClusterRefs() const { return getSpan<int>(GTrackID::MFT, INDICES); }
541 auto getMFTTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::MFT, MCLABELS); }
542
543 // MFT clusters (layer is ignored unless the data was provided per layer)
546 auto getMFTClustersPatterns(int layer = 0) const { return MFTClustersData[ITSMFT_PAT].getSpan<unsigned char>(layer); }
547 auto getMFTClustersMCLabels(int layer = 0) const { return mcMFTClusters[layer].get(); }
548
549 // MCH
550 const o2::mch::TrackMCH& getMCHTrack(GTrackID gid) const { return getTrack<o2::mch::TrackMCH>(gid); }
551 auto getMCHTracks() const { return getTracks<o2::mch::TrackMCH>(GTrackID::MCH); }
552 auto getMCHTracksROFRecords() const { return getSpan<o2::mch::ROFRecord>(GTrackID::MCH, TRACKREFS); }
553 auto getMCHTrackClusters() const { return getSpan<o2::mch::Cluster>(GTrackID::MCH, INDICES); }
554 auto getMCHTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::MCH, MCLABELS); }
555
556 // MCH clusters
557 auto getMCHClusterROFRecords() const { return getSpan<o2::mch::ROFRecord>(GTrackID::MCH, CLUSREFS); }
558 auto getMCHClusters() const { return getSpan<o2::mch::Cluster>(GTrackID::MCH, CLUSTERS); }
559 auto getMCHClustersMCLabels() const { return mcMCHClusters.get(); }
560
561 // MID
562 const o2::mid::Track& getMIDTrack(GTrackID gid) const { return getTrack<o2::mid::Track>(gid); }
563 auto getMIDTracks() const { return getTracks<o2::mid::Track>(GTrackID::MID); }
564 auto getMIDTracksROFRecords() const { return getSpan<o2::mid::ROFRecord>(GTrackID::MID, TRACKREFS); }
565 auto getMIDTrackClusters() const { return getSpan<o2::mid::Cluster>(GTrackID::MID, INDICES); }
566 auto getMIDTrackClustersROFRecords() const { return getSpan<o2::mid::ROFRecord>(GTrackID::MID, MATCHES); }
567 auto getMIDTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::MID, MCLABELS); }
569
570 // MID clusters
571 auto getMIDClusterROFRecords() const { return getSpan<o2::mid::ROFRecord>(GTrackID::MID, CLUSREFS); }
572 auto getMIDClusters() const { return getSpan<o2::mid::Cluster>(GTrackID::MID, CLUSTERS); }
574
575 // TPC
576 const o2::tpc::TrackTPC& getTPCTrack(GTrackID id) const { return getTrack<o2::tpc::TrackTPC>(id); }
577 auto getTPCTracks() const { return getTracks<o2::tpc::TrackTPC>(GTrackID::TPC); }
578 auto getTPCTracksClusterRefs() const { return getSpan<o2::tpc::TPCClRefElem>(GTrackID::TPC, INDICES); }
579 auto getTPCTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::TPC, MCLABELS); }
580 auto getTPCTrackMCLabel(GTrackID id) const { return getObject<o2::MCCompLabel>(id, MCLABELS); }
583 auto getTPCTriggers() const { return getSpan<o2::tpc::TriggerInfoDLBZS>(GTrackID::TPC, MATCHES); }
584
585 // ITS-TPC
586 const o2::dataformats::TrackTPCITS& getTPCITSTrack(GTrackID gid) const { return getTrack<o2::dataformats::TrackTPCITS>(gid); }
587 auto getTPCITSTracks() const { return getTracks<o2::dataformats::TrackTPCITS>(GTrackID::ITSTPC); }
588 auto getTPCITSTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::ITSTPC, MCLABELS); }
589 auto getTPCITSTrackMCLabel(GTrackID id) const { return getObject<o2::MCCompLabel>(id, MCLABELS); }
590
591 // MFT-MCH
592 const o2::dataformats::GlobalFwdTrack& getGlobalFwdTrack(GTrackID gid) const { return getTrack<o2::dataformats::GlobalFwdTrack>(gid); }
593 auto getGlobalFwdTracks() const { return getTracks<o2::dataformats::GlobalFwdTrack>(GTrackID::MFTMCH); }
594 auto getMFTMCHMatches() const { return getSpan<o2::dataformats::MatchInfoFwd>(GTrackID::MFTMCH, MATCHES); }
595 auto getGlobalFwdTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::MFTMCH, MCLABELS); }
596
597 // MCH-MID
598 const o2::dataformats::TrackMCHMID& getMCHMIDMatch(GTrackID gid) const { return getObject<o2::dataformats::TrackMCHMID>(gid, MATCHES); }
599 auto getMCHMIDMatches() const { return getSpan<o2::dataformats::TrackMCHMID>(GTrackID::MCHMID, MATCHES); }
600 auto getMCHMIDMatchesMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::MCHMID, MCLABELS); }
601
602 // ITS-TPC-TRD, since the TrackTRD track is just an alias, forward-declaring it does not work, need to keep template
603 template <class U>
605 {
606 return getTrack<U>(id);
607 }
608 template <class U>
610 {
611 return getTracks<U>(GTrackID::ITSTPCTRD);
612 }
614 {
615 return getSpan<o2::trd::TrackTriggerRecord>(GTrackID::ITSTPCTRD, TRACKREFS);
616 }
617 auto getITSTPCTRDTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::ITSTPCTRD, MCLABELS); }
618 auto getITSTPCTRDTrackMCLabel(GTrackID id) const { return getObject<o2::MCCompLabel>(id, MCLABELS); }
619 auto getITSTPCTRDSATracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::ITSTPCTRD, MCLABELSEXTRA); }
620 auto getITSTPCTRDSATrackMCLabel(GTrackID id) const { return getObject<o2::MCCompLabel>(id, MCLABELSEXTRA); }
621
622 // TPC-TRD
623 template <class U>
625 {
626 return getTrack<U>(id);
627 }
628 template <class U>
629 auto getTPCTRDTracks() const
630 {
631 return getTracks<U>(GTrackID::TPCTRD);
632 }
633 auto getTPCTRDTriggers() const
634 {
635 return getSpan<o2::trd::TrackTriggerRecord>(GTrackID::TPCTRD, TRACKREFS);
636 }
637 auto getTPCTRDTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::TPCTRD, MCLABELS); }
638 auto getTPCTRDTrackMCLabel(GTrackID id) const { return getObject<o2::MCCompLabel>(id, MCLABELS); }
639 auto getTPCTRDSATracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::TPCTRD, MCLABELSEXTRA); }
640 auto getTPCTRDSATrackMCLabel(GTrackID id) const { return getObject<o2::MCCompLabel>(id, MCLABELSEXTRA); }
641 // TRD tracklets
642 gsl::span<const o2::trd::Tracklet64> getTRDTracklets() const;
643 gsl::span<const o2::trd::CalibratedTracklet> getTRDCalibratedTracklets() const;
644 gsl::span<const o2::trd::TriggerRecord> getTRDTriggerRecords() const;
646
647 // TOF
648 const o2::dataformats::MatchInfoTOF& getTOFMatch(GTrackID id) const { return getObject<o2::dataformats::MatchInfoTOF>(id, MATCHES); } // generic match getter
649 // TPC-TOF, made of refitted TPC track and separate matchInfo
650 const o2::dataformats::TrackTPCTOF& getTPCTOFTrack(GTrackID gid) const { return getTrack<o2::dataformats::TrackTPCTOF>(gid); }
651 const o2::dataformats::MatchInfoTOF& getTPCTOFMatch(GTrackID id) const { return getObject<o2::dataformats::MatchInfoTOF>(id, MATCHES); }
652 auto getTPCTOFTrackMCLabel(GTrackID id) const { return getObject<o2::MCCompLabel>(id, MCLABELS); }
653 auto getTPCTOFTracks() const { return getTracks<o2::dataformats::TrackTPCTOF>(GTrackID::TPCTOF); }
654 // TPC-TOF matches
655 auto getTPCTOFMatches() const { return getSpan<o2::dataformats::MatchInfoTOF>(GTrackID::TPCTOF, MATCHES); }
656 auto getTPCTOFTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::TPCTOF, MCLABELS); }
657 // TPC-TRD-TOF matches
658 auto getTPCTRDTOFMatches() const { return getSpan<o2::dataformats::MatchInfoTOF>(GTrackID::TPCTRDTOF, MATCHES); }
659 auto getTPCTRDTOFTracksMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::TPCTRDTOF, MCLABELS); }
660 // global ITS-TPC-TOF matches
661 const o2::dataformats::TrackTPCITS& getITSTPCTOFTrack(GTrackID id) const; // this is special since global TOF track is just a reference on TPCITS
662 auto getITSTPCTOFMatches() const { return getSpan<o2::dataformats::MatchInfoTOF>(GTrackID::ITSTPCTOF, MATCHES); }
663 auto getITSTPCTOFMatchesMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::ITSTPCTOF, MCLABELS); }
664 // global ITS-TPC-TRD-TOF matches
665 // const o2::dataformats::TrackTPCITS& getITSTPCTRDTOFTrack(GTrackID id) const; // TODO this is special since global TOF track is just a reference on TPCITS
666 auto getITSTPCTRDTOFMatches() const { return getSpan<o2::dataformats::MatchInfoTOF>(GTrackID::ITSTPCTRDTOF, MATCHES); }
667 auto getITSTPCTRDTOFMatchesMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::ITSTPCTRDTOF, MCLABELS); }
668
669 // HMPID matches
670 auto getHMPMatches() const { return getSpan<o2::dataformats::MatchInfoHMP>(GTrackID::HMP, MATCHES); }
671 auto getHMPMatchesMCLabels() const { return getSpan<o2::MCCompLabel>(GTrackID::HMP, MCLABELS); }
672
673 // TOF clusters
674 auto getTOFClusters() const { return getSpan<o2::tof::Cluster>(GTrackID::TOF, CLUSTERS); }
675 auto getTOFClustersMCLabels() const { return mcTOFClusters.get(); }
676
677 // HMPID clusters
678 auto getHMPClusterTriggers() const { return getSpan<o2::hmpid::Trigger>(GTrackID::HMP, CLUSREFS); }
679 auto getHMPClusters() const { return getSpan<o2::hmpid::Cluster>(GTrackID::HMP, CLUSTERS); }
680 auto getHMPClustersMCLabels() const { return mcHMPClusters.get(); }
681
682 // FT0
683 auto getFT0RecPoints() const { return getSpan<o2::ft0::RecPoints>(GTrackID::FT0, TRACKS); }
684 auto getFT0ChannelsData() const { return getSpan<o2::ft0::ChannelDataFloat>(GTrackID::FT0, CLUSTERS); }
685
686 // FV0
687 auto getFV0RecPoints() const { return getSpan<o2::fv0::RecPoints>(GTrackID::FV0, TRACKS); }
688 auto getFV0ChannelsData() const { return getSpan<o2::fv0::ChannelDataFloat>(GTrackID::FV0, CLUSTERS); }
689
690 // FDD
691 auto getFDDRecPoints() const { return getSpan<o2::fdd::RecPoint>(GTrackID::FDD, TRACKS); }
692 auto getFDDChannelsData() const { return getSpan<o2::fdd::ChannelDataFloat>(GTrackID::FDD, CLUSTERS); }
693
694 // ZDC
695 auto getZDCBCRecData() const { return getSpan<o2::zdc::BCRecData>(GTrackID::ZDC, MATCHES); }
696 auto getZDCEnergy() const { return getSpan<o2::zdc::ZDCEnergy>(GTrackID::ZDC, TRACKS); }
697 auto getZDCTDCData() const { return getSpan<o2::zdc::ZDCTDCData>(GTrackID::ZDC, CLUSTERS); }
698 auto getZDCInfo() const { return getSpan<uint16_t>(GTrackID::ZDC, PATTERNS); }
699
700 // CTP
701 auto getCTPDigits() const { return getSpan<const o2::ctp::CTPDigit>(GTrackID::CTP, CLUSTERS); }
702 const o2::ctp::LumiInfo& getCTPLumi() const { return mCTPLumi; }
703
704 // CPV
705 auto getCPVClusters() const { return getSpan<const o2::cpv::Cluster>(GTrackID::CPV, CLUSTERS); }
706 auto getCPVTriggers() const { return getSpan<const o2::cpv::TriggerRecord>(GTrackID::CPV, CLUSREFS); }
707 auto getCPVClustersMCLabels() const { return mcCPVClusters.get(); }
708
709 // PHOS
710 auto getPHOSCells() const { return getSpan<const o2::phos::Cell>(GTrackID::PHS, CLUSTERS); }
711 auto getPHOSTriggers() const { return getSpan<const o2::phos::TriggerRecord>(GTrackID::PHS, CLUSREFS); }
713
714 // EMCAL
715 auto getEMCALCells() const { return getSpan<const o2::emcal::Cell>(GTrackID::EMC, CLUSTERS); }
716 auto getEMCALTriggers() const { return getSpan<const o2::emcal::TriggerRecord>(GTrackID::EMC, CLUSREFS); }
718
719 // Primary vertices
728
729 // Secondary vertices
734
736 auto getV0s() const { return svtxPool.getSpan<o2::dataformats::V0>(V0S); }
738
742
746
747 // Strangeness track
751
752 // Cosmic tracks
757
758 // IRFrames where ITS was reconstructed and tracks were seen (e.g. sync.w-flow mult. selection)
759 auto getIRFramesITS() const { return getSpan<o2::dataformats::IRFrame>(GTrackID::ITS, VARIA); }
760
761 void getTrackTimeITSTPCTRDTOF(GTrackID gid, float& t, float& tErr) const;
762 void getTrackTimeTPCTRDTOF(GTrackID gid, float& t, float& tErr) const;
763 void getTrackTimeITSTPCTOF(GTrackID gid, float& t, float& tErr) const;
764 void getTrackTimeITSTPCTRD(GTrackID gid, float& t, float& tErr) const;
765 void getTrackTimeTPCTRD(GTrackID gid, float& t, float& tErr) const;
766 void getTrackTimeITSTPC(GTrackID gid, float& t, float& tErr) const;
767 void getTrackTimeTPCTOF(GTrackID gid, float& t, float& tErr) const;
768 void getTrackTimeITS(GTrackID gid, float& t, float& tErr) const;
769 void getTrackTimeTPC(GTrackID gid, float& t, float& tErr) const;
770
771 void getTrackTime(GTrackID gid, float& t, float& tErr) const;
772};
773
774} // namespace globaltracking
775} // namespace o2
776
777#endif
Accessor for objects of the same base class located in different containers.
Composition/decomposition of the ITS/MFT cluster IDs referring to per-layer cluster arrays.
A const (ready only) version of MCTruthContainer.
int32_t i
Accessor for TrackParCov derived objects from multiple containers.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Definition of a container to keep Monte Carlo truth external to simulation objects.
Defintions for the inter-detector matching type.
Class to refer to the 1st entry and N elements of some group in the continuous container.
auto getSpan(int src) const
access particula source container as a span
const U & get_as(int src, int idx) const
get object as user provided type from explicitly provided source, index
TO BE DONE: extend to generic N body vertex.
Definition Decay3Body.h:26
static mask_t getSourcesMask(const std::string_view srcList)
A container to hold and manage MC truth information/labels.
MUON track external format.
Definition TrackMCHMID.h:33
HMPID cluster implementation.
Definition Cluster.h:27
HMPID Trigger declaration.
Definition Trigger.h:32
MCH track external format.
Definition TrackMCH.h:34
This class defines the MID track.
Definition Track.h:30
GLenum src
Definition glcorearb.h:1767
const GLdouble * v
Definition glcorearb.h:832
GLuint index
Definition glcorearb.h:781
GLsizei GLsizei GLchar * source
Definition glcorearb.h:798
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
Definition of a container to keep/associate and arbitrary number of labels associated to an index wit...
Defining ITS Vertex explicitly as messageable.
Definition Cartesian.h:288
constexpr int MaxMFTLayers
constexpr int MaxITSLayers
constexpr int MaxITSClusLayers
Definition ClusterID.h:23
constexpr int MaxMFTClusLayers
Definition ClusterID.h:24
o2::dataformats::StrangeTrack StrangeTrack
Global TPC definitions and constants.
Definition SimTraits.h:172
uint32_t TPCClRefElem
TrackParCovF TrackParCov
Definition Track.h:33
o2::MCCompLabel MCLabel
Definition Digitizer.h:45
o2::dataformats::Decay3BodyIndex Decay3BodyIndex
o2::dataformats::CascadeIndex CascadeIndex
o2::dataformats::V0Index V0Index
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
void addInput(const o2::framework::InputSpec &&isp)
void requestTOFMatches(o2::dataformats::GlobalTrackID::mask_t src, bool mc)
std::unordered_map< std::string, bool > requestMap
void requestTracks(o2::dataformats::GlobalTrackID::mask_t src, bool mc)
void requestClusters(o2::dataformats::GlobalTrackID::mask_t src, bool useMC, o2::detectors::DetID::mask_t skipDetClusters={})
std::vector< o2::framework::InputSpec > inputs
uint32_t getMatchingInputSubSpec() const
bool isRequested(const std::string &t) const
void addFDDRecPoints(o2::framework::ProcessingContext &pc, bool mc)
void addGlobalFwdTracks(o2::framework::ProcessingContext &pc, bool mc)
void addTOFMatchesITSTPCTRD(o2::framework::ProcessingContext &pc, bool mc)
GTrackID getITSContributorGID(GTrackID source) const
const o2::dataformats::MatchInfoTOF & getTPCTOFMatch(GTrackID id) const
void addITSTracks(o2::framework::ProcessingContext &pc, bool mc)
void addHMPMatches(o2::framework::ProcessingContext &pc, bool mc)
const U & getTrack(int src, int id) const
void addTPCTOFTracks(o2::framework::ProcessingContext &pc, bool mc)
GlobalIDSet getSingleDetectorRefs(GTrackID gidx) const
std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::MCCompLabel > > mcTOFClusters
const o2::dataformats::MCTruthContainer< o2::phos::MCLabel > * getPHOSCellsMCLabels() const
const o2::tpc::TrackTPC & getTPCTrack(GTrackID id) const
std::array< AccSlots, GTrackID::NSources > commonPool
void addFT0RecPoints(o2::framework::ProcessingContext &pc, bool mc)
gsl::span< const o2::trd::CalibratedTracklet > getTRDCalibratedTracklets() const
const o2::dataformats::TrackMCHMID & getMCHMIDMatch(GTrackID gid) const
const U & getObject(GTrackID gid, int slotID) const
void addTPCTriggers(o2::framework::ProcessingContext &pc)
const o2::mch::TrackMCH & getMCHTrack(GTrackID gid) const
void addCosmicTracks(o2::framework::ProcessingContext &pc, bool mc)
std::unique_ptr< const std::vector< o2::MCCompLabel > > mcMIDTracks
auto getMFTClustersPatterns(int layer=0) const
void addStrangeTracks(o2::framework::ProcessingContext &pc, bool mc)
std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::mid::MCClusterLabel > > mcMIDTrackClusters
bool isMatchSourceLoaded(int src) const
void addMCHClusters(o2::framework::ProcessingContext &pc, bool mc)
void addPVerticesTMP(o2::framework::ProcessingContext &pc, bool mc)
void addITSTPCTracks(o2::framework::ProcessingContext &pc, bool mc)
auto getTPCTRDTrack(GTrackID id) const
auto getTPCTRDTrackMCLabel(GTrackID id) const
auto getTPCITSTrackMCLabel(GTrackID id) const
const o2::tpc::ClusterNativeAccess & getTPCClusters() const
void addMCHTracks(o2::framework::ProcessingContext &pc, bool mc)
std::array< std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::MCCompLabel > >, MaxMFTLayers > mcMFTClusters
void getTrackTimeTPCTRD(GTrackID gid, float &t, float &tErr) const
auto getITSClustersROFRecords(int layer=0) const
void createTracksVariadic(T creator, GTrackID::mask_t srcSel=GTrackID::getSourcesMask("all")) const
void addTPCClusters(o2::framework::ProcessingContext &pc, bool mc, bool shmap, bool occmap)
void addEMCALCells(o2::framework::ProcessingContext &pc, bool mc)
void addMIDTracks(o2::framework::ProcessingContext &pc, bool mc)
void addMFTTracks(o2::framework::ProcessingContext &pc, bool mc)
void getTrackTimeITSTPCTRDTOF(GTrackID gid, float &t, float &tErr) const
void getTrackTimeITSTPCTOF(GTrackID gid, float &t, float &tErr) const
void getTrackTimeTPC(GTrackID gid, float &t, float &tErr) const
void addZDCRecEvents(o2::framework::ProcessingContext &pc, bool mc)
const o2::dataformats::V0Index & getV0Idx(int i) const
const o2::itsmft::TrkClusRef & getITSABRef(GTrackID gid) const
void addMCHMIDMatches(o2::framework::ProcessingContext &pc, bool mc)
auto getTPCTOFTrackMCLabel(GTrackID id) const
gsl::span< const o2::trd::TriggerRecord > getTRDTriggerRecords() const
auto getITSClustersPatterns(int layer=0) const
const o2::dataformats::MCTruthContainer< o2::MCCompLabel > * getTRDTrackletsMCLabels() const
void addPVertices(o2::framework::ProcessingContext &pc, bool mc)
void getTrackTimeTPCTRDTOF(GTrackID gid, float &t, float &tErr) const
void addTPCOccMap(o2::framework::ProcessingContext &pc)
void getTrackTimeITS(GTrackID gid, float &t, float &tErr) const
void addTOFMatchesITSTPC(o2::framework::ProcessingContext &pc, bool mc)
void addIRFramesITS(o2::framework::ProcessingContext &pc)
const o2::dataformats::TrackTPCITS & getITSTPCTOFTrack(GTrackID id) const
const o2::dataformats::TrackTPCTOF & getTPCTOFTrack(GTrackID gid) const
auto getTPCTrackMCLabel(GTrackID id) const
const o2::mid::Track & getMIDTrack(GTrackID gid) const
void addTOFClusters(o2::framework::ProcessingContext &pc, bool mc)
const o2::dataformats::CascadeIndex & getCascadeIdx(int i) const
o2::MCCompLabel getTrackMCLabel(GTrackID id) const
GTrackID getTPCContributorGID(GTrackID source) const
std::array< std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::MCCompLabel > >, MaxITSLayers > mcITSClusters
std::unique_ptr< o2::trd::RecoInputContainer > inputsTRD
const o2::dataformats::MCTruthContainer< o2::mid::MCClusterLabel > * getMIDClustersMCLabels() const
const o2::track::TrackParCov & getTrackParam(GTrackID gidx) const
void getTrackTimeITSTPCTRD(GTrackID gid, float &t, float &tErr) const
void addMFTClusters(o2::framework::ProcessingContext &pc, bool mc)
void addMIDClusters(o2::framework::ProcessingContext &pc, bool mc)
void addTPCTRDTracks(o2::framework::ProcessingContext &pc, bool mc)
const o2::dataformats::ConstMCTruthContainerView< o2::MCCompLabel > * getTPCClustersMCLabels() const
std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::MCCompLabel > > mcMCHClusters
gsl::span< const unsigned char > clusterShMapTPC
externally set TPC clusters sharing map
const o2::MCEventLabel & getPrimaryVertexMCLabel(int i) const
void addTRDTracklets(o2::framework::ProcessingContext &pc, bool mc)
void getTrackTimeITSTPC(GTrackID gid, float &t, float &tErr) const
const o2::dataformats::TrackTPCITS & getTPCITSTrack(GTrackID gid) const
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
void addPHOSCells(o2::framework::ProcessingContext &pc, bool mc)
std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::phos::MCLabel > > mcPHSCells
const o2::mft::TrackMFT & getMFTTrack(GTrackID gid) const
void addCPVClusters(o2::framework::ProcessingContext &pc, bool mc)
void addITSTPCTRDTracks(o2::framework::ProcessingContext &pc, bool mc)
const o2::track::TrackParCov & getTrackParamOut(GTrackID gidx) const
void fillTrackMCLabels(const gsl::span< GTrackID > gids, std::vector< o2::MCCompLabel > &mcinfo) const
const o2::dataformats::Cascade & getCascade(int i) const
void addMFTMCHMatches(o2::framework::ProcessingContext &pc, bool mc)
void getTrackTimeTPCTOF(GTrackID gid, float &t, float &tErr) const
const o2::dataformats::PrimaryVertex & getPrimaryVertex(int i) const
void addTOFMatchesTPCTRD(o2::framework::ProcessingContext &pc, bool mc)
const o2::its::TrackITS & getITSTrack(GTrackID gid) const
const U & getObject(int src, int index, int slotID) const
std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::mid::MCClusterLabel > > mcMIDClusters
std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::emcal::MCLabel > > mcEMCCells
std::unique_ptr< o2::tpc::internal::getWorkflowTPCInput_ret > inputsTPCclusters
void addCTPDigits(o2::framework::ProcessingContext &pc, bool mc)
void addTPCTracks(o2::framework::ProcessingContext &pc, bool mc)
const o2::dataformats::TrackCosmics & getCosmicTrack(int i) const
std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::MCCompLabel > > mcCPVClusters
void addFV0RecPoints(o2::framework::ProcessingContext &pc, bool mc)
auto getMFTClustersROFRecords(int layer=0) const
gsl::span< const U > getTracks(int src) const
void createTracks(std::function< bool(const o2::track::TrackParCov &, GTrackID)> const &creator) const
void getTrackTime(GTrackID gid, float &t, float &tErr) const
std::array< ITSClusAccessor, NITSMFTCLUSSLOTS > ITSClustersData
void addSVertices(o2::framework::ProcessingContext &pc, bool)
const U & getTrack(GTrackID gid) const
auto getITSTPCTRDTrack(GTrackID id) const
void addITSClusters(o2::framework::ProcessingContext &pc, bool mc)
auto getITSTPCTRDTrackMCLabel(GTrackID id) const
void addHMPClusters(o2::framework::ProcessingContext &pc, bool mc)
const o2::ctp::LumiInfo & getCTPLumi() const
gsl::span< const unsigned int > occupancyMapTPC
externally set TPC clusters occupancy map
auto getITSTPCTRDSATrackMCLabel(GTrackID id) const
std::array< MFTClusAccessor, NITSMFTCLUSSLOTS > MFTClustersData
auto getMFTClusters(int layer=0) const
auto getITSClusters(int layer=0) const
auto getMFTClustersMCLabels(int layer=0) const
std::unique_ptr< const o2::dataformats::MCTruthContainer< o2::MCCompLabel > > mcHMPClusters
const o2::dataformats::V0 & getV0(int i) const
std::array< GTrackID, GTrackID::NSources > GlobalIDSet
auto getTPCTRDSATrackMCLabel(GTrackID id) const
auto getCosmicTrackMCLabel(int i) const
static constexpr float PS2MUS
const o2::dataformats::StrangeTrack & getStrangeTrack(int i) const
gsl::span< const o2::trd::Tracklet64 > getTRDTracklets() const
const o2::dataformats::MCTruthContainer< o2::emcal::MCLabel > * getEMCALCellsMCLabels() const
const o2::dataformats::MatchInfoTOF & getTOFMatch(GTrackID id) const
gsl::span< const U > getSpan(int src, int slotID) const
const o2::dataformats::MCTruthContainer< o2::mid::MCClusterLabel > * getMIDTracksClusterMCLabels() const
auto getITSClustersMCLabels(int layer=0) const
const o2::dataformats::GlobalFwdTrack & getGlobalFwdTrack(GTrackID gid) const
Trigger info including the orbit.