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"
3841using namespace o2 ::framework;
3942using namespace o2 ::gpu;
4043
44+ using GTrackID = o2::dataformats::GlobalTrackID;
45+
4146namespace o2
4247{
4348namespace trd
4449{
4550
51+ o2::globaltracking::DataRequest dataRequestTRD;
52+
4653void 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+
86104void 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)},
0 commit comments