Skip to content

Commit 3a7cb03

Browse files
martenoledavidrohr
authored andcommitted
TRD tracking based on TPC-only tracks implemented
- created track interface for TrackParCov - references to ITS and TPC track seeds are added as GlobalTrackID - TRD tracking can be configured via CLI to use ITS-TPC tracks, TPC-only tracks or both as input - ITS-TPC track time uncertainty accounted for by increasing sigZ2 - TRD matches are written into separate files to allow for running two separate workflows
1 parent 0e87d4d commit 3a7cb03

15 files changed

Lines changed: 369 additions & 130 deletions

Detectors/TRD/workflow/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ o2_add_library(TRDWorkflow
2626
src/TRDTrackingWorkflow.cxx
2727
src/EntropyDecoderSpec.cxx
2828
src/EntropyEncoderSpec.cxx
29-
PUBLIC_LINK_LIBRARIES O2::Framework O2::DPLUtils O2::Steer O2::Algorithm O2::DataFormatsTRD O2::TRDSimulation O2::TRDReconstruction O2::DetectorsBase O2::SimulationDataFormat O2::TRDBase O2::TRDCalibration O2::GPUTracking O2::GlobalTrackingWorkflowReaders)
29+
PUBLIC_LINK_LIBRARIES O2::Framework O2::DPLUtils O2::Steer O2::Algorithm O2::DataFormatsTRD O2::TRDSimulation O2::TRDReconstruction O2::DetectorsBase O2::SimulationDataFormat O2::TRDBase O2::TRDCalibration O2::GPUTracking O2::GlobalTrackingWorkflowReaders O2::ReconstructionDataFormats O2::TPCWorkflow)
3030

3131
#o2_target_root_dictionary(TRDWorkflow
3232
# HEADERS include/TRDWorkflow/TRDTrapSimulatorSpec.h)

Detectors/TRD/workflow/include/TRDWorkflow/TRDGlobalTrackingSpec.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class TRDGlobalTracking : public o2::framework::Task
3232
TRDGlobalTracking(bool useMC, bool useTrkltTransf) : mUseMC(useMC), mUseTrackletTransform(useTrkltTransf) {}
3333
~TRDGlobalTracking() override = default;
3434
void init(o2::framework::InitContext& ic) final;
35+
void updateTimeDependentParams();
3536
void run(o2::framework::ProcessingContext& pc) final;
3637
void endOfStream(o2::framework::EndOfStreamContext& ec) final;
3738

@@ -42,12 +43,14 @@ class TRDGlobalTracking : public o2::framework::Task
4243
std::unique_ptr<GeometryFlat> mFlatGeo{nullptr}; ///< flat TRD geometry
4344
bool mUseMC{false}; ///< MC flag
4445
bool mUseTrackletTransform{false}; ///< if true, output from TrackletTransformer is used instead of uncalibrated Tracklet64 directly
46+
float mTPCTBinMUS{.2f}; ///< width of a TPC time bin in us
47+
float mTPCVdrift{2.58f}; ///< TPC drift velocity (for shifting TPC tracks along Z)
4548
CalibVDrift mCalibVDrift{}; ///< steers the vDrift calibration
4649
TStopwatch mTimer;
4750
};
4851

4952
/// create a processor spec
50-
framework::DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, bool useTrkltTransf);
53+
framework::DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, bool useTrkltTransf, o2::dataformats::GlobalTrackID::mask_t src);
5154

5255
} // namespace trd
5356
} // namespace o2

Detectors/TRD/workflow/include/TRDWorkflow/TRDTrackWriterSpec.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ namespace o2
2020
namespace trd
2121
{
2222

23-
/// create a processor spec
24-
framework::DataProcessorSpec getTRDTrackWriterSpec(bool useMC);
23+
/// writer for matches to ITS-TPC tracks
24+
framework::DataProcessorSpec getTRDGlobalTrackWriterSpec(bool useMC);
25+
26+
/// writer for matches with TPC-only tracks
27+
framework::DataProcessorSpec getTRDTPCTrackWriterSpec(bool useMC);
2528

2629
} // namespace trd
2730
} // namespace o2

Detectors/TRD/workflow/include/TRDWorkflow/TRDTrackingWorkflow.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@
1414
/// @file TRDTrackingWorkflow.h
1515

1616
#include "Framework/WorkflowSpec.h"
17+
#include "ReconstructionDataFormats/GlobalTrackID.h"
1718

1819
namespace o2
1920
{
2021
namespace trd
2122
{
2223

23-
framework::WorkflowSpec getTRDTrackingWorkflow(bool disableRootInp, bool disableRootOut, bool useTrackletTransformer);
24+
framework::WorkflowSpec getTRDTrackingWorkflow(bool disableRootInp, bool disableRootOut, bool useTrackletTransformer, o2::dataformats::GlobalTrackID::mask_t srcTRD);
2425

2526
} // namespace trd
2627
} // namespace o2

Detectors/TRD/workflow/src/TRDGlobalTrackingSpec.cxx

Lines changed: 90 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
#include "DataFormatsTRD/CalibratedTracklet.h"
2424
#include "DataFormatsTRD/TriggerRecord.h"
2525
#include "DataFormatsTRD/Constants.h"
26+
#include "TPCBase/ParameterElectronics.h"
27+
#include "TPCBase/ParameterGas.h"
28+
#include "DataFormatsGlobalTracking/RecoContainer.h"
2629

2730
// GPU header
2831
#include "GPUReconstruction.h"
@@ -38,11 +41,15 @@
3841
using namespace o2::framework;
3942
using namespace o2::gpu;
4043

44+
using GTrackID = o2::dataformats::GlobalTrackID;
45+
4146
namespace o2
4247
{
4348
namespace trd
4449
{
4550

51+
o2::globaltracking::DataRequest dataRequestTRD;
52+
4653
void TRDGlobalTracking::init(InitContext& ic)
4754
{
4855

@@ -83,17 +90,33 @@ void TRDGlobalTracking::init(InitContext& ic)
8390
mTimer.Reset();
8491
}
8592

93+
void TRDGlobalTracking::updateTimeDependentParams()
94+
{
95+
// strictly speaking, one should do this only in case of the CCDB objects update
96+
// TODO: add CCDB interface
97+
auto& elParam = o2::tpc::ParameterElectronics::Instance();
98+
auto& gasParam = o2::tpc::ParameterGas::Instance();
99+
mTPCTBinMUS = elParam.ZbinWidth;
100+
mTPCVdrift = gasParam.DriftV;
101+
mTracker->SetTPCVdrift(mTPCVdrift);
102+
}
103+
86104
void TRDGlobalTracking::run(ProcessingContext& pc)
87105
{
88106
mTimer.Start(false);
89-
const auto tracksITSTPC = pc.inputs().get<gsl::span<o2::dataformats::TrackTPCITS>>("tpcitstrack");
107+
o2::globaltracking::RecoContainer inputTracks;
108+
inputTracks.collectData(pc, dataRequestTRD);
109+
const auto tracksITSTPC = inputTracks.getTPCITSTracks<o2::dataformats::TrackTPCITS>();
110+
const auto tracksTPC = inputTracks.getTPCTracks<o2::tpc::TrackTPC>();
90111
const auto trackletsTRD = pc.inputs().get<gsl::span<o2::trd::Tracklet64>>("trdtracklets");
91112
const auto triggerRecords = pc.inputs().get<gsl::span<o2::trd::TriggerRecord>>("trdtriggerrec");
92113

93-
int nTracks = tracksITSTPC.size();
114+
int nTracksITSTPC = tracksITSTPC.size();
115+
int nTracksTPC = tracksTPC.size();
94116
int nCollisions = triggerRecords.size();
95117
int nTracklets = trackletsTRD.size();
96118
LOGF(INFO, "There are %i tracklets in total from %i trigger records", nTracklets, nCollisions);
119+
LOGF(INFO, "As input seeds are available: %i ITS-TPC matched tracks and %i TPC tracks", nTracksITSTPC, nTracksTPC);
97120

98121
const gsl::span<const CalibratedTracklet>* cTrkltsPtr = nullptr;
99122
using cTrkltType = std::decay_t<decltype(pc.inputs().get<gsl::span<CalibratedTracklet>>(""))>;
@@ -106,7 +129,7 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
106129
nTrackletsCal = cTrkltsPtr->size();
107130
LOGF(INFO, "Got %i calibrated tracklets as input", nTrackletsCal);
108131
if (nTracklets != nTrackletsCal) {
109-
LOGF(ERROR, "Number of calibrated tracklets (%i) differs from the number of uncalibrated tracklets (%i)", nTrackletsCal, nTracklets);
132+
LOGF(FATAL, "Number of calibrated tracklets (%i) differs from the number of uncalibrated tracklets (%i)", nTrackletsCal, nTracklets);
110133
}
111134
}
112135

@@ -128,36 +151,52 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
128151
}
129152

130153
mTracker->Reset();
154+
updateTimeDependentParams();
131155

132-
mChainTracking->mIOPtrs.nMergedTracks = nTracks;
156+
// the number of tracks loaded into the TRD tracker depends on the defined input sources
157+
// TPC-only tracks which are already matched to the ITS will not be loaded as seeds for the tracking
158+
// => the maximum number of seeds it the number of TPC-only tracks. If only ITS-TPC matches are considered than that
159+
// of course defines the number of input tracks
160+
mChainTracking->mIOPtrs.nMergedTracks = (nTracksTPC == 0) ? nTracksITSTPC : nTracksTPC;
133161
mChainTracking->mIOPtrs.nTRDTracklets = nTracklets;
134162
mChainTracking->AllocateIOMemory();
135163
mRec->PrepareEvent();
136164
mRec->SetupGPUProcessor(mTracker, true);
137165

138166
LOG(DEBUG) << "Start loading input into TRD tracker";
139-
// load everything into the tracker
140-
int nTracksLoaded = 0;
141-
for (int iTrk = 0; iTrk < nTracks; ++iTrk) {
142-
const auto& match = tracksITSTPC[iTrk];
143-
const auto& trk = match.getParamOut();
144-
GPUTRDTrack trkLoad;
145-
trkLoad.setX(trk.getX());
146-
trkLoad.setAlpha(trk.getAlpha());
147-
for (int i = 0; i < 5; ++i) {
148-
trkLoad.setParam(trk.getParam(i), i);
167+
168+
int nTracksLoadedITSTPC = 0;
169+
int nTracksLoadedTPC = 0;
170+
std::vector<int> loadedTPCtracks;
171+
172+
// load ITS-TPC matched tracks
173+
for (const auto& match : tracksITSTPC) {
174+
GPUTRDTrack trkLoad(match, mTPCVdrift);
175+
if (mTracker->LoadTrack(trkLoad)) {
176+
continue;
149177
}
150-
for (int i = 0; i < 15; ++i) {
151-
trkLoad.setCov(trk.getCov()[i], i);
178+
loadedTPCtracks.push_back(match.getRefTPC());
179+
++nTracksLoadedITSTPC;
180+
LOGF(DEBUG, "Loaded ITS-TPC track %i with time %f", nTracksLoadedITSTPC, trkLoad.getTime());
181+
}
182+
183+
// load TPC-only tracks
184+
for (int iTrk = 0; iTrk < tracksTPC.size(); ++iTrk) {
185+
if (std::find(loadedTPCtracks.begin(), loadedTPCtracks.end(), iTrk) != loadedTPCtracks.end()) {
186+
// this TPC tracks has already been matched to ITS and the ITS-TPC track has already been loaded in the tracker
187+
continue;
152188
}
153-
trkLoad.setTime(match.getTimeMUS().getTimeStamp());
189+
const auto& trkTpc = tracksTPC[iTrk];
190+
GPUTRDTrack trkLoad(trkTpc, mTPCTBinMUS, mTPCVdrift, iTrk);
154191
if (mTracker->LoadTrack(trkLoad)) {
155192
continue;
156193
}
157-
++nTracksLoaded;
158-
LOGF(DEBUG, "Loaded track %i with time %f", nTracksLoaded, trkLoad.getTime());
194+
++nTracksLoadedTPC;
195+
LOGF(DEBUG, "Loaded TPC track %i with time %f", nTracksLoadedTPC, trkLoad.getTime());
159196
}
197+
LOGF(INFO, "%i tracks are loaded into the TRD tracker. Out of those %i ITS-TPC tracks and %i TPC tracks", nTracksLoadedITSTPC + nTracksLoadedTPC, nTracksLoadedITSTPC, nTracksLoadedTPC);
160198

199+
// load the TRD tracklets
161200
for (int iTrklt = 0; iTrklt < nTracklets; ++iTrklt) {
162201
auto trklt = trackletsTRD[iTrklt];
163202
GPUTRDTrackletWord trkltLoad(trklt.getTrackletWord());
@@ -169,6 +208,7 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
169208
mTracker->SetInternalSpacePoint(iTrklt, cTrklt.getX(), cTrklt.getY(), cTrklt.getZ(), cTrklt.getDy());
170209
}
171210
}
211+
172212
mTracker->SetTriggerRecordTimes(&(trdTriggerTimes[0]));
173213
mTracker->SetTriggerRecordIndices(&(trdTriggerIndices[0]));
174214
mTracker->SetNCollisions(nCollisions);
@@ -177,15 +217,28 @@ void TRDGlobalTracking::run(ProcessingContext& pc)
177217
mTracker->DoTracking(mChainTracking);
178218
//mTracker->DumpTracks();
179219

180-
std::vector<GPUTRDTrack> tracksOut(mTracker->NTracks());
181-
std::copy(mTracker->Tracks(), mTracker->Tracks() + mTracker->NTracks(), tracksOut.begin());
220+
std::vector<GPUTRDTrack> tracksOutITSTPC(nTracksLoadedITSTPC);
221+
std::vector<GPUTRDTrack> tracksOutTPC(nTracksLoadedTPC);
222+
if (mTracker->NTracks() != nTracksLoadedITSTPC + nTracksLoadedTPC) {
223+
LOGF(FATAL, "Got %i matched tracks in total whereas %i ITS-TPC + %i TPC = %i tracks were loaded as input", mTracker->NTracks(), nTracksLoadedITSTPC, nTracksLoadedTPC, nTracksLoadedITSTPC + nTracksLoadedTPC);
224+
}
225+
226+
// copy ITS-TPC matched tracks first
227+
std::copy(mTracker->Tracks(), mTracker->Tracks() + nTracksLoadedITSTPC, tracksOutITSTPC.begin());
228+
// and now the remaining TPC-only matches
229+
std::copy(mTracker->Tracks() + nTracksLoadedITSTPC, mTracker->Tracks() + mTracker->NTracks(), tracksOutTPC.begin());
182230

183231
// Temporary until it is transferred to its own DPL device for calibrations
184232
mCalibVDrift.setAngleDiffSums(mTracker->AngleDiffSums());
185233
mCalibVDrift.setAngleDiffCounters(mTracker->AngleDiffCounters());
186234
mCalibVDrift.process();
187235

188-
pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MATCHTRD", 0, Lifetime::Timeframe}, tracksOut);
236+
if (inputTracks.isTrackSourceLoaded(GTrackID::Source::ITSTPC)) {
237+
pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MATCHTRD_GLO", 0, Lifetime::Timeframe}, tracksOutITSTPC);
238+
}
239+
if (inputTracks.isTrackSourceLoaded(GTrackID::Source::TPC)) {
240+
pc.outputs().snapshot(Output{o2::header::gDataOriginTRD, "MATCHTRD_TPC", 0, Lifetime::Timeframe}, tracksOutTPC);
241+
}
189242

190243
mTimer.Stop();
191244
}
@@ -196,11 +249,13 @@ void TRDGlobalTracking::endOfStream(EndOfStreamContext& ec)
196249
mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
197250
}
198251

199-
DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, bool useTrkltTransf)
252+
DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, bool useTrkltTransf, GTrackID::mask_t src)
200253
{
201-
std::vector<InputSpec> inputs;
202254
std::vector<OutputSpec> outputs;
203-
inputs.emplace_back("tpcitstrack", "GLO", "TPCITS", 0, Lifetime::Timeframe);
255+
256+
dataRequestTRD.requestTracks(src, false);
257+
auto& inputs = dataRequestTRD.inputs;
258+
204259
if (useTrkltTransf) {
205260
inputs.emplace_back("trdctracklets", o2::header::gDataOriginTRD, "CTRACKLETS", 0, Lifetime::Timeframe);
206261
}
@@ -211,10 +266,18 @@ DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, bool useTrkltTransf)
211266
LOG(FATAL) << "MC usage must be disabled for this workflow, since it is not yet implemented";
212267
}
213268

214-
outputs.emplace_back(o2::header::gDataOriginTRD, "MATCHTRD", 0, Lifetime::Timeframe);
269+
if (GTrackID::includesSource(GTrackID::Source::ITSTPC, src)) {
270+
outputs.emplace_back(o2::header::gDataOriginTRD, "MATCHTRD_GLO", 0, Lifetime::Timeframe);
271+
}
272+
if (GTrackID::includesSource(GTrackID::Source::TPC, src)) {
273+
outputs.emplace_back(o2::header::gDataOriginTRD, "MATCHTRD_TPC", 0, Lifetime::Timeframe);
274+
}
275+
276+
std::string processorName = o2::utils::concat_string("trd-globaltracking", GTrackID::getSourcesNames(src));
277+
std::replace(processorName.begin(), processorName.end(), ',', '_');
215278

216279
return DataProcessorSpec{
217-
"trd-globaltracking",
280+
processorName,
218281
inputs,
219282
outputs,
220283
AlgorithmSpec{adaptFromTask<TRDGlobalTracking>(useMC, useTrkltTransf)},

Detectors/TRD/workflow/src/TRDTrackWriterSpec.cxx

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,52 @@
1616
#include "GPUTRDTrack.h"
1717

1818
#include "DPLUtils/MakeRootTreeWriterSpec.h"
19+
#include "TRDWorkflow/TRDTrackWriterSpec.h"
1920

2021
using namespace o2::framework;
2122
using namespace o2::gpu;
2223

24+
using GTrackID = o2::dataformats::GlobalTrackID;
25+
2326
namespace o2
2427
{
2528
namespace trd
2629
{
2730
template <typename T>
2831
using BranchDefinition = MakeRootTreeWriterSpec::BranchDefinition<T>;
2932

30-
DataProcessorSpec getTRDTrackWriterSpec(bool useMC)
33+
DataProcessorSpec getTRDGlobalTrackWriterSpec(bool useMC)
34+
{
35+
// TODO: not clear if the writer is supposed to write MC labels at some point
36+
// this is just a dummy definition for the template branch definition below
37+
// define the correct type and the input specs
38+
using LabelsType = std::vector<int>;
39+
// force, this will disable the branch for now, can be adjusted in the future
40+
useMC = false;
41+
42+
// A spectator to store the size of the data array for the logger below
43+
auto tracksSize = std::make_shared<int>();
44+
auto tracksLogger = [tracksSize](std::vector<GPUTRDTrack> const& tracks) {
45+
*tracksSize = tracks.size();
46+
};
47+
48+
return MakeRootTreeWriterSpec("trd-track-writer-tpcits",
49+
"trdmatches_itstpc.root",
50+
"tracksTRD",
51+
BranchDefinition<std::vector<GPUTRDTrack>>{InputSpec{"tracks", o2::header::gDataOriginTRD, "MATCHTRD_GLO", 0},
52+
"tracks",
53+
"tracks-branch-name",
54+
1,
55+
tracksLogger},
56+
// NOTE: this branch template is to show how the conditional MC labels can
57+
// be defined, the '0' disables the branch for the moment
58+
BranchDefinition<LabelsType>{InputSpec{"matchtpclabels", "GLO", "SOME_LABELS", 0},
59+
"labels",
60+
(useMC ? 1 : 0), // one branch if mc labels enabled
61+
"labels-branch-name"})();
62+
}
63+
64+
DataProcessorSpec getTRDTPCTrackWriterSpec(bool useMC)
3165
{
3266
// TODO: not clear if the writer is supposed to write MC labels at some point
3367
// this is just a dummy definition for the template branch definition below
@@ -42,10 +76,10 @@ DataProcessorSpec getTRDTrackWriterSpec(bool useMC)
4276
*tracksSize = tracks.size();
4377
};
4478

45-
return MakeRootTreeWriterSpec("trd-track-writer",
46-
"trdtracks.root",
79+
return MakeRootTreeWriterSpec("trd-track-writer-tpc",
80+
"trdmatches_tpc.root",
4781
"tracksTRD",
48-
BranchDefinition<std::vector<GPUTRDTrack>>{InputSpec{"tracks", o2::header::gDataOriginTRD, "MATCHTRD", 0},
82+
BranchDefinition<std::vector<GPUTRDTrack>>{InputSpec{"tracks", o2::header::gDataOriginTRD, "MATCHTRD_TPC", 0},
4983
"tracks",
5084
"tracks-branch-name",
5185
1,

Detectors/TRD/workflow/src/TRDTrackingWorkflow.cxx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,42 @@
1414

1515
#include "Framework/WorkflowSpec.h"
1616
#include "GlobalTrackingWorkflowReaders/TrackTPCITSReaderSpec.h"
17+
#include "TPCWorkflow/TrackReaderSpec.h"
1718
#include "TRDWorkflow/TRDTrackletReaderSpec.h"
1819
#include "TRDWorkflow/TRDGlobalTrackingSpec.h"
1920
#include "TRDWorkflow/TRDTrackWriterSpec.h"
21+
#include "TRDWorkflow/TRDTrackingWorkflow.h"
22+
23+
using GTrackID = o2::dataformats::GlobalTrackID;
2024

2125
namespace o2
2226
{
2327
namespace trd
2428
{
2529

26-
framework::WorkflowSpec getTRDTrackingWorkflow(bool disableRootInp, bool disableRootOut, bool useTrkltTransf)
30+
framework::WorkflowSpec getTRDTrackingWorkflow(bool disableRootInp, bool disableRootOut, bool useTrkltTransf, GTrackID::mask_t srcTRD)
2731
{
2832
framework::WorkflowSpec specs;
2933
bool useMC = false;
3034
if (!disableRootInp) {
31-
specs.emplace_back(o2::globaltracking::getTrackTPCITSReaderSpec(useMC));
35+
if (GTrackID::includesSource(GTrackID::Source::ITSTPC, srcTRD)) {
36+
specs.emplace_back(o2::globaltracking::getTrackTPCITSReaderSpec(useMC));
37+
}
38+
if (GTrackID::includesSource(GTrackID::Source::TPC, srcTRD)) {
39+
specs.emplace_back(o2::tpc::getTPCTrackReaderSpec(useMC));
40+
}
3241
specs.emplace_back(o2::trd::getTRDTrackletReaderSpec(useMC, useTrkltTransf));
3342
}
3443

35-
specs.emplace_back(o2::trd::getTRDGlobalTrackingSpec(useMC, useTrkltTransf));
44+
specs.emplace_back(o2::trd::getTRDGlobalTrackingSpec(useMC, useTrkltTransf, srcTRD));
3645

3746
if (!disableRootOut) {
38-
specs.emplace_back(o2::trd::getTRDTrackWriterSpec(useMC));
47+
if (GTrackID::includesSource(GTrackID::Source::ITSTPC, srcTRD)) {
48+
specs.emplace_back(o2::trd::getTRDGlobalTrackWriterSpec(useMC));
49+
}
50+
if (GTrackID::includesSource(GTrackID::Source::TPC, srcTRD)) {
51+
specs.emplace_back(o2::trd::getTRDTPCTrackWriterSpec(useMC));
52+
}
3953
}
4054
return specs;
4155
}

0 commit comments

Comments
 (0)