Project
Loading...
Searching...
No Matches
TRDTrackReaderSpec.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
13
21
23
24namespace o2
25{
26namespace trd
27{
28
30{
31
32 mFileName = o2::utils::Str::concat_string(o2::utils::Str::rectifyDirectory(ic.options().get<std::string>("input-dir")),
33 ic.options().get<std::string>("track-infile"));
34
35 connectTree(mFileName);
36}
37
39{
40 auto ent = mTree->GetReadEntry() + 1;
41 // A timeframe holds no collision at all whenever the interaction rate is low enough, and
42 // the tree then has no entry to read. Publish empty containers instead of reading past the
43 // end and pushing branch addresses that GetEntry has not filled, so that the consumers
44 // downstream still see the timeframe. (This used to be an assert, which is compiled out of
45 // every production build since ENABLE_CASSERT defaults to OFF.)
46 const bool noEntry = ent >= mTree->GetEntries();
47 if (noEntry) {
48 LOG(info) << "no entry to read, publishing empty output";
49 } else {
50 mTree->GetEntry(ent);
51 }
52 LOG(info) << "Pushing " << mTracks.size() << " tracks and " << mTrigRec.size() << " trigger records at entry " << ent;
53 if (mUseMC) {
54 if (mLabelsTrd.size() != mLabelsMatch.size()) {
55 LOG(error) << "The number of labels for matches and for TRD tracks is different. " << mLabelsTrd.size() << " TRD labels vs. " << mLabelsMatch.size() << " match labels";
56 }
57 LOG(info) << "Pushing " << mLabelsTrd.size() << " MC labels at entry " << ent;
58 }
59
60 if (mMode == Mode::TPCTRD) {
61 uint32_t ss = o2::globaltracking::getSubSpec(mSubSpecStrict ? o2::globaltracking::MatchingType::Strict : o2::globaltracking::MatchingType::Standard);
62 pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MATCH_TPC", ss}, mTracks);
63 pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "TRGREC_TPC", ss}, mTrigRec);
64 if (mUseMC) {
65 pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MCLB_TPC", ss}, mLabelsMatch);
66 pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MCLB_TPC_TRD", ss}, mLabelsTrd);
67 }
68 } else if (mMode == Mode::ITSTPCTRD) {
69 pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MATCH_ITSTPC", 0}, mTracks);
70 pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "TRGREC_ITSTPC", 0}, mTrigRec);
71 if (mUseMC) {
72 pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MCLB_ITSTPC", 0}, mLabelsMatch);
73 pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MCLB_ITSTPC_TRD", 0}, mLabelsTrd);
74 }
75 }
76
77 if (noEntry || mTree->GetReadEntry() + 1 >= mTree->GetEntries()) {
79 pc.services().get<ControlService>().readyToQuit(QuitRequest::Me);
80 }
81}
82
83void TRDTrackReader::connectTree(const std::string& filename)
84{
85 mTree.reset(nullptr); // in case it was already loaded
86 mFile.reset(TFile::Open(filename.c_str()));
87 assert(mFile && !mFile->IsZombie());
88 mTree.reset((TTree*)mFile->Get("tracksTRD"));
89 assert(mTree);
90 mTree->SetBranchAddress("tracks", &mTracksPtr);
91 mTree->SetBranchAddress("trgrec", &mTrigRecPtr);
92 if (mUseMC) {
93 mTree->SetBranchAddress("labels", &mLabelsMatchPtr);
94 mTree->SetBranchAddress("labelsTRD", &mLabelsTrdPtr);
95 }
96 LOG(info) << "Loaded tree from " << filename << " with " << mTree->GetEntries() << " entries";
97}
98
99DataProcessorSpec getTRDTPCTrackReaderSpec(bool useMC, bool subSpecStrict)
100{
101 std::vector<OutputSpec> outputs;
102 uint32_t sspec = o2::globaltracking::getSubSpec(subSpecStrict ? o2::globaltracking::MatchingType::Strict : o2::globaltracking::MatchingType::Standard);
103 outputs.emplace_back(o2::header::gDataOriginTRD, "MATCH_TPC", sspec, Lifetime::Timeframe);
104 outputs.emplace_back(o2::header::gDataOriginTRD, "TRGREC_TPC", sspec, Lifetime::Timeframe);
105
106 if (useMC) {
107 outputs.emplace_back(o2::header::gDataOriginTRD, "MCLB_TPC", sspec, Lifetime::Timeframe);
108 outputs.emplace_back(o2::header::gDataOriginTRD, "MCLB_TPC_TRD", sspec, Lifetime::Timeframe);
109 }
110 return DataProcessorSpec{
111 "tpctrd-track-reader",
112 Inputs{},
113 outputs,
114 AlgorithmSpec{adaptFromTask<TRDTrackReader>(useMC, TRDTrackReader::Mode::TPCTRD, subSpecStrict)},
115 Options{
116 {"track-infile", VariantType::String, "trdmatches_tpc.root", {"Name of the input file for TPC-TRD matches"}},
117 {"input-dir", VariantType::String, "none", {"Input directory"}}}};
118}
119
121{
122 std::vector<OutputSpec> outputs;
123 outputs.emplace_back(o2::header::gDataOriginTRD, "MATCH_ITSTPC", 0, Lifetime::Timeframe);
124 outputs.emplace_back(o2::header::gDataOriginTRD, "TRGREC_ITSTPC", 0, Lifetime::Timeframe);
125 if (useMC) {
126 outputs.emplace_back(o2::header::gDataOriginTRD, "MCLB_ITSTPC", 0, Lifetime::Timeframe);
127 outputs.emplace_back(o2::header::gDataOriginTRD, "MCLB_ITSTPC_TRD", 0, Lifetime::Timeframe);
128 }
129
130 return DataProcessorSpec{
131 "itstpctrd-track-reader",
132 Inputs{},
133 outputs,
134 AlgorithmSpec{adaptFromTask<TRDTrackReader>(useMC, TRDTrackReader::Mode::ITSTPCTRD)},
135 Options{
136 {"track-infile", VariantType::String, "trdmatches_itstpc.root", {"Name of the input file for ITS-TPC-TRD matches"}},
137 {"input-dir", VariantType::String, "none", {"Input directory"}}}};
138}
139
140} // namespace trd
141} // namespace o2
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Defintions for the inter-detector matching type.
Type wrappers for enfording a specific serialization method.
void snapshot(const Output &spec, T const &object)
ConfigParamRegistry const & options()
Definition InitContext.h:33
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
ServiceRegistryRef services()
The services registry associated with this processing context.
virtual void endOfStream(EndOfStreamContext &context)
This is invoked whenever we have an EndOfStream event.
Definition Task.h:43
void run(ProcessingContext &pc) final
void init(InitContext &ic) final
constexpr o2::header::DataOrigin gDataOriginTRD
Definition DataHeader.h:577
std::vector< ConfigParamSpec > Options
std::vector< InputSpec > Inputs
framework::DataProcessorSpec getTRDTPCTrackReaderSpec(bool useMC, bool subSpecStrict=false)
read TPC-TRD matched tracks from a root file
framework::DataProcessorSpec getTRDGlobalTrackReaderSpec(bool useMC)
read ITS-TPC-TRD matched tracks from a root file
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string filename()
static std::string rectifyDirectory(const std::string_view p)
static std::string concat_string(Ts const &... ts)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"