63 mTimer[SWTot].Start(
false);
65 updateTimeDependentParams(pc);
66 gsl::span<const unsigned char> patterns = pc.
inputs().
get<gsl::span<unsigned char>>(
"patterns");
67 auto compClusters = pc.
inputs().
get<
const std::vector<o2::itsmft::CompClusterExt>>(
"compClusters");
74 auto rofsinput = pc.
inputs().
get<
const std::vector<o2::itsmft::ROFRecord>>(
"ROframes");
75 auto& rofs = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
Output{
"MFT",
"MFTTrackROF", 0}, rofsinput.begin(), rofsinput.end());
79 LOG(info) <<
"MFTTracker pulled " << compClusters.size() <<
" compressed clusters in " << rofsinput.size() <<
" RO frames";
82 if (trackingParam.irFramesOnly) {
84 LOG(info) <<
"MFTTracker IRFrame filter enabled: loading ITS IR Frames. ";
85 auto irFrames = pc.
inputs().
get<gsl::span<o2::dataformats::IRFrame>>(
"IRFramesITS");
86 filter = createIRFrameFilter(irFrames);
88 if (fair::Logger::Logging(fair::Severity::debug)) {
89 for (
const auto& irf : irFrames) {
90 LOG(
debug) <<
"IRFrame.info = " << irf.info <<
" ; min = " << irf.getMin().bc <<
" ; max = " << irf.getMax().bc;
95 if (trackingParam.isMultCutRequested()) {
96 LOG(info) <<
"MFTTracker multiplicity filter enabled. ROF selection: Min nClusters = " << trackingParam.cutMultClusLow <<
" ; Max nClusters = " << trackingParam.cutMultClusHigh;
100 gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
103 mc2rofs = pc.
inputs().
get<gsl::span<itsmft::MC2ROFRecord>>(
"MC2ROframes");
104 LOG(info) << labels->
getIndexedSize() <<
" MC label objects , in " << mc2rofs.size() <<
" MC events";
107 auto& allClusIdx = pc.
outputs().
make<std::vector<int>>(
Output{
"MFT",
"TRACKCLSID", 0});
108 std::vector<o2::MCCompLabel> trackLabels;
109 std::vector<o2::MCCompLabel> allTrackLabels;
110 std::vector<o2::mft::TrackLTF> tracks;
111 std::vector<o2::mft::TrackLTFL> tracksL;
112 auto& allTracksMFT = pc.
outputs().
make<std::vector<o2::mft::TrackMFT>>(
Output{
"MFT",
"TRACKS", 0});
114 std::uint32_t roFrameId = 0;
115 int nROFs = rofs.size();
116 auto rofsPerWorker = std::max(1, nROFs / mNThreads);
117 LOG(
debug) <<
"nROFs = " << nROFs <<
" rofsPerWorker = " << rofsPerWorker;
119 auto loadData = [&,
this](
auto& trackerVec,
auto& roFrameDataVec) {
120 auto& tracker = trackerVec[0];
121 gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
125 for (
const auto& rof : rofs) {
126 int worker = std::min(
int(iROF / rofsPerWorker), mNThreads - 1);
127 auto& roFrameData = roFrameDataVec[worker].emplace_back();
129 LOG(
debug) <<
"ROframeId: " << iROF <<
", clusters loaded : " << nclUsed <<
" on worker " << worker;
134 auto launchTrackFinder = [](
auto* tracker,
auto* workerROFs) {
136 long tStart = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count(), tStartROF = tStart, tEnd = tStart;
139 for (
auto&
rofData : *workerROFs) {
142 long tEndROF = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
143 LOGP(info,
"launchTrackFinder| tracker:{} did {}-th ROF in {} mus: {} clusters -> {} tracks", tracker->getTrackerID(), ++rofCNT, tEndROF - tStartROF,
rofData.getTotalClusters(),
rofData.getTracks().size());
144 tStartROF = tEnd = tEndROF;
148 LOGP(info,
"launchTrackFinder| done: tracker:{} processed {} ROFS in {} mus", tracker->getTrackerID(), workerROFs->size(), tEnd - tStart);
152 auto launchFitter = [](
auto* tracker,
auto* workerROFs) {
154 long tStart = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
156 for (
auto&
rofData : *workerROFs) {
160 long tEnd = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
161 LOGP(info,
"launchTrackFitter| done: tracker:{} fitted {} ROFS in {} mus", tracker->getTrackerID(), workerROFs->size(), tEnd - tStart);
165 auto runMFTTrackFinder = [&,
this](
auto& trackerVec,
auto& roFrameDataVec) {
166 std::vector<std::future<void>> finder;
167 for (
int i = 0;
i < mNThreads;
i++) {
168 auto& tracker = trackerVec[
i];
169 auto& workerData = roFrameDataVec[
i];
170 auto f = std::async(std::launch::async, launchTrackFinder, tracker.get(), &workerData);
171 finder.push_back(std::move(
f));
174 for (
int i = 0;
i < mNThreads;
i++) {
179 auto runTrackFitter = [&,
this](
auto& trackerVec,
auto& roFrameDataVec) {
180 std::vector<std::future<void>> fitter;
181 for (
int i = 0;
i < mNThreads;
i++) {
182 auto& tracker = trackerVec[
i];
183 auto& workerData = roFrameDataVec[
i];
184 auto f = std::async(std::launch::async, launchFitter, tracker.get(), &workerData);
185 fitter.push_back(std::move(
f));
188 for (
int i = 0;
i < mNThreads;
i++) {
194 auto copyTracks = [](
auto& new_tracks,
auto& allTracks,
auto& allClusIdx) {
195 for (
auto& trc : new_tracks) {
196 trc.setExternalClusterIndexOffset(allClusIdx.size());
197 int ncl = trc.getNumberOfPoints();
198 for (
int ic = 0; ic < ncl; ic++) {
199 auto externalClusterID = trc.getExternalClusterIndex(ic);
201 auto clusterLayer = trc.getExternalClusterLayer(ic);
203 allClusIdx.push_back(externalClusterID);
205 allTracks.emplace_back(trc);
211 std::vector<std::vector<o2::mft::ROframe<TrackLTF>>> roFrameVec(mNThreads);
214 for (
auto& rof : roFrameVec) {
215 rof.reserve(rofsPerWorker);
217 LOG(
debug) <<
"Loading data into ROFs.";
219 mTimer[SWLoadData].Start(
false);
221 mTimer[SWLoadData].Stop();
223 LOG(
debug) <<
"Running MFT Track finder.";
225 mTimer[SWFindMFTTracks].Start(
false);
226 runMFTTrackFinder(mTrackerVec, roFrameVec);
227 mTimer[SWFindMFTTracks].Stop();
229 LOG(
debug) <<
"Runnig track fitter.";
231 mTimer[SWFitTracks].Start(
false);
232 runTrackFitter(mTrackerVec, roFrameVec);
233 mTimer[SWFitTracks].Stop();
236 LOG(
debug) <<
"Computing MC Labels.";
238 mTimer[SWComputeLabels].Start(
false);
239 auto& tracker = mTrackerVec[0];
241 for (
int i = 0;
i < mNThreads;
i++) {
242 for (
auto&
rofData : roFrameVec[
i]) {
243 tracker->computeTracksMClabels(
rofData.getTracks());
244 trackLabels.swap(tracker->getTrackLabels());
245 std::copy(trackLabels.begin(), trackLabels.end(), std::back_inserter(allTrackLabels));
249 mTimer[SWComputeLabels].Stop();
252 auto rof = rofs.begin();
254 for (
int i = 0;
i < mNThreads;
i++) {
255 for (
auto&
rofData : roFrameVec[
i]) {
256 int ntracksROF = 0, firstROFTrackEntry = allTracksMFT.size();
257 tracks.swap(
rofData.getTracks());
258 ntracksROF = tracks.size();
259 copyTracks(tracks, allTracksMFT, allClusIdx);
261 rof->setFirstEntry(firstROFTrackEntry);
262 rof->setNEntries(ntracksROF);
270 std::vector<std::vector<o2::mft::ROframe<TrackLTFL>>> roFrameVec(mNThreads);
273 for (
auto& rof : roFrameVec) {
274 rof.reserve(rofsPerWorker);
276 LOG(
debug) <<
"Loading data into ROFs.";
278 mTimer[SWLoadData].Start(
false);
280 mTimer[SWLoadData].Stop();
282 LOG(
debug) <<
"Running MFT Track finder.";
284 mTimer[SWFindMFTTracks].Start(
false);
285 runMFTTrackFinder(mTrackerLVec, roFrameVec);
286 mTimer[SWFindMFTTracks].Stop();
288 LOG(
debug) <<
"Runnig track fitter.";
290 mTimer[SWFitTracks].Start(
false);
291 runTrackFitter(mTrackerLVec, roFrameVec);
292 mTimer[SWFitTracks].Stop();
295 LOG(
debug) <<
"Computing MC Labels.";
297 mTimer[SWComputeLabels].Start(
false);
298 auto& tracker = mTrackerLVec[0];
300 for (
int i = 0;
i < mNThreads;
i++) {
301 for (
auto&
rofData : roFrameVec[
i]) {
302 tracker->computeTracksMClabels(
rofData.getTracks());
303 trackLabels.swap(tracker->getTrackLabels());
304 std::copy(trackLabels.begin(), trackLabels.end(), std::back_inserter(allTrackLabels));
308 mTimer[SWComputeLabels].Stop();
311 auto rof = rofs.begin();
313 for (
int i = 0;
i < mNThreads;
i++) {
314 for (
auto&
rofData : roFrameVec[
i]) {
315 int ntracksROF = 0, firstROFTrackEntry = allTracksMFT.size();
316 tracksL.swap(
rofData.getTracks());
317 ntracksROF = tracksL.size();
318 copyTracks(tracksL, allTracksMFT, allClusIdx);
319 rof->setFirstEntry(firstROFTrackEntry);
320 rof->setNEntries(ntracksROF);
327 LOG(info) <<
"MFTTracker pushed " << allTracksMFT.size() <<
" tracks";
334 mTimer[SWTot].Stop();
431 std::vector<InputSpec> inputs;
432 inputs.emplace_back(
"compClusters",
"MFT",
"COMPCLUSTERS", 0, Lifetime::Timeframe);
433 inputs.emplace_back(
"patterns",
"MFT",
"PATTERNS", 0, Lifetime::Timeframe);
434 inputs.emplace_back(
"ROframes",
"MFT",
"CLUSTERSROF", 0, Lifetime::Timeframe);
435 inputs.emplace_back(
"cldict",
"MFT",
"CLUSDICT", 0, Lifetime::Condition,
ccdbParamSpec(
"MFT/Calib/ClusterDictionary"));
438 if (trackingParam.irFramesOnly) {
439 inputs.emplace_back(
"IRFramesITS",
"ITS",
"IRFRAMES", 0, Lifetime::Timeframe);
442 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
451 ggRequest->addInput({
"mftTGeo",
"MFT",
"GEOMTGEO", 0, Lifetime::Condition,
framework::ccdbParamSpec(
"MFT/Config/Geometry")}, inputs);
453 std::vector<OutputSpec> outputs;
454 outputs.emplace_back(
"MFT",
"TRACKS", 0, Lifetime::Timeframe);
455 outputs.emplace_back(
"MFT",
"MFTTrackROF", 0, Lifetime::Timeframe);
456 outputs.emplace_back(
"MFT",
"TRACKCLSID", 0, Lifetime::Timeframe);
459 inputs.emplace_back(
"labels",
"MFT",
"CLUSTERSMCTR", 0, Lifetime::Timeframe);
460 inputs.emplace_back(
"MC2ROframes",
"MFT",
"CLUSTERSMC2ROF", 0, Lifetime::Timeframe);
461 outputs.emplace_back(
"MFT",
"TRACKSMCTR", 0, Lifetime::Timeframe);
462 outputs.emplace_back(
"MFT",
"TRACKSMC2ROF", 0, Lifetime::Timeframe);
469 AlgorithmSpec{adaptFromTask<TrackerDPL>(ggRequest, useMC, nThreads)},