64 mTimer[SWTot].Start(
false);
66 updateTimeDependentParams(pc);
67 gsl::span<const unsigned char> patterns = pc.
inputs().
get<gsl::span<unsigned char>>(
"patterns");
68 auto compClusters = pc.
inputs().
get<
const std::vector<o2::itsmft::CompClusterExt>>(
"compClusters");
75 auto rofsinput = pc.
inputs().
get<
const std::vector<o2::itsmft::ROFRecord>>(
"ROframes");
76 auto& rofs = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
Output{
"MFT",
"MFTTrackROF", 0}, rofsinput.begin(), rofsinput.end());
80 LOG(info) <<
"MFTTracker pulled " << compClusters.size() <<
" compressed clusters in " << rofsinput.size() <<
" RO frames";
83 if (trackingParam.irFramesOnly) {
85 LOG(info) <<
"MFTTracker IRFrame filter enabled: loading ITS IR Frames. ";
86 auto irFrames = pc.
inputs().
get<gsl::span<o2::dataformats::IRFrame>>(
"IRFramesITS");
87 filter = createIRFrameFilter(irFrames);
89 if (fair::Logger::Logging(fair::Severity::debug)) {
90 for (
const auto& irf : irFrames) {
91 LOG(
debug) <<
"IRFrame.info = " << irf.info <<
" ; min = " << irf.getMin().bc <<
" ; max = " << irf.getMax().bc;
96 if (trackingParam.isMultCutRequested()) {
97 LOG(info) <<
"MFTTracker multiplicity filter enabled. ROF selection: Min nClusters = " << trackingParam.cutMultClusLow <<
" ; Max nClusters = " << trackingParam.cutMultClusHigh;
101 gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
104 mc2rofs = pc.
inputs().
get<gsl::span<itsmft::MC2ROFRecord>>(
"MC2ROframes");
105 LOG(info) <<
labels->getIndexedSize() <<
" MC label objects , in " << mc2rofs.size() <<
" MC events";
108 auto& allClusIdx = pc.
outputs().
make<std::vector<int>>(
Output{
"MFT",
"TRACKCLSID", 0});
109 std::vector<o2::MCCompLabel> trackLabels;
110 std::vector<o2::MCCompLabel> allTrackLabels;
111 std::vector<o2::mft::TrackLTF> tracks;
112 std::vector<o2::mft::TrackLTFL> tracksL;
113 auto& allTracksMFT = pc.
outputs().
make<std::vector<o2::mft::TrackMFT>>(
Output{
"MFT",
"TRACKS", 0});
115 std::uint32_t roFrameId = 0;
116 int nROFs = rofs.size();
117 auto rofsPerWorker = std::max(1, nROFs / mNThreads);
118 LOG(
debug) <<
"nROFs = " << nROFs <<
" rofsPerWorker = " << rofsPerWorker;
120 auto loadData = [&,
this](
auto& trackerVec,
auto& roFrameDataVec) {
121 auto& tracker = trackerVec[0];
122 gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
126 for (
const auto& rof : rofs) {
127 int worker = std::min(
int(iROF / rofsPerWorker), mNThreads - 1);
128 auto& roFrameData = roFrameDataVec[worker].emplace_back();
130 LOG(
debug) <<
"ROframeId: " << iROF <<
", clusters loaded : " << nclUsed <<
" on worker " << worker;
135 auto launchTrackFinder = [](
auto* tracker,
auto* workerROFs) {
137 long tStart = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count(), tStartROF = tStart, tEnd = tStart;
140 for (
auto&
rofData : *workerROFs) {
143 long tEndROF = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
144 LOGP(info,
"launchTrackFinder| tracker:{} did {}-th ROF in {} mus: {} clusters -> {} tracks", tracker->getTrackerID(), ++rofCNT, tEndROF - tStartROF,
rofData.getTotalClusters(),
rofData.getTracks().size());
145 tStartROF = tEnd = tEndROF;
149 LOGP(info,
"launchTrackFinder| done: tracker:{} processed {} ROFS in {} mus", tracker->getTrackerID(), workerROFs->size(), tEnd - tStart);
153 auto launchFitter = [](
auto* tracker,
auto* workerROFs) {
155 long tStart = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
157 for (
auto&
rofData : *workerROFs) {
161 long tEnd = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
162 LOGP(info,
"launchTrackFitter| done: tracker:{} fitted {} ROFS in {} mus", tracker->getTrackerID(), workerROFs->size(), tEnd - tStart);
166 auto runMFTTrackFinder = [&,
this](
auto& trackerVec,
auto& roFrameDataVec) {
167 std::vector<std::future<void>> finder;
168 for (
int i = 0;
i < mNThreads;
i++) {
169 auto& tracker = trackerVec[
i];
170 auto& workerData = roFrameDataVec[
i];
171 auto f = std::async(std::launch::async, launchTrackFinder, tracker.get(), &workerData);
172 finder.push_back(std::move(
f));
175 for (
int i = 0;
i < mNThreads;
i++) {
180 auto runTrackFitter = [&,
this](
auto& trackerVec,
auto& roFrameDataVec) {
181 std::vector<std::future<void>> fitter;
182 for (
int i = 0;
i < mNThreads;
i++) {
183 auto& tracker = trackerVec[
i];
184 auto& workerData = roFrameDataVec[
i];
185 auto f = std::async(std::launch::async, launchFitter, tracker.get(), &workerData);
186 fitter.push_back(std::move(
f));
189 for (
int i = 0;
i < mNThreads;
i++) {
195 auto copyTracks = [](
auto& new_tracks,
auto& allTracks,
auto& allClusIdx) {
196 for (
auto& trc : new_tracks) {
197 trc.setExternalClusterIndexOffset(allClusIdx.size());
198 int ncl = trc.getNumberOfPoints();
199 for (
int ic = 0; ic < ncl; ic++) {
200 auto externalClusterID = trc.getExternalClusterIndex(ic);
202 auto clusterLayer = trc.getExternalClusterLayer(ic);
204 allClusIdx.push_back(externalClusterID);
206 allTracks.emplace_back(trc);
212 std::vector<std::vector<o2::mft::ROframe<TrackLTF>>> roFrameVec(mNThreads);
215 for (
auto& rof : roFrameVec) {
216 rof.reserve(rofsPerWorker);
218 LOG(
debug) <<
"Loading data into ROFs.";
220 mTimer[SWLoadData].Start(
false);
222 mTimer[SWLoadData].Stop();
224 LOG(
debug) <<
"Running MFT Track finder.";
226 mTimer[SWFindMFTTracks].Start(
false);
227 runMFTTrackFinder(mTrackerVec, roFrameVec);
228 mTimer[SWFindMFTTracks].Stop();
230 LOG(
debug) <<
"Runnig track fitter.";
232 mTimer[SWFitTracks].Start(
false);
233 runTrackFitter(mTrackerVec, roFrameVec);
234 mTimer[SWFitTracks].Stop();
237 LOG(
debug) <<
"Computing MC Labels.";
239 mTimer[SWComputeLabels].Start(
false);
240 auto& tracker = mTrackerVec[0];
242 for (
int i = 0;
i < mNThreads;
i++) {
243 for (
auto&
rofData : roFrameVec[
i]) {
244 tracker->computeTracksMClabels(
rofData.getTracks());
245 trackLabels.swap(tracker->getTrackLabels());
246 std::copy(trackLabels.begin(), trackLabels.end(), std::back_inserter(allTrackLabels));
250 mTimer[SWComputeLabels].Stop();
253 auto rof = rofs.begin();
255 for (
int i = 0;
i < mNThreads;
i++) {
256 for (
auto&
rofData : roFrameVec[
i]) {
257 int ntracksROF = 0, firstROFTrackEntry = allTracksMFT.size();
258 tracks.swap(
rofData.getTracks());
259 ntracksROF = tracks.size();
260 copyTracks(tracks, allTracksMFT, allClusIdx);
262 rof->setFirstEntry(firstROFTrackEntry);
263 rof->setNEntries(ntracksROF);
271 std::vector<std::vector<o2::mft::ROframe<TrackLTFL>>> roFrameVec(mNThreads);
274 for (
auto& rof : roFrameVec) {
275 rof.reserve(rofsPerWorker);
277 LOG(
debug) <<
"Loading data into ROFs.";
279 mTimer[SWLoadData].Start(
false);
281 mTimer[SWLoadData].Stop();
283 LOG(
debug) <<
"Running MFT Track finder.";
285 mTimer[SWFindMFTTracks].Start(
false);
286 runMFTTrackFinder(mTrackerLVec, roFrameVec);
287 mTimer[SWFindMFTTracks].Stop();
289 LOG(
debug) <<
"Runnig track fitter.";
291 mTimer[SWFitTracks].Start(
false);
292 runTrackFitter(mTrackerLVec, roFrameVec);
293 mTimer[SWFitTracks].Stop();
296 LOG(
debug) <<
"Computing MC Labels.";
298 mTimer[SWComputeLabels].Start(
false);
299 auto& tracker = mTrackerLVec[0];
301 for (
int i = 0;
i < mNThreads;
i++) {
302 for (
auto&
rofData : roFrameVec[
i]) {
303 tracker->computeTracksMClabels(
rofData.getTracks());
304 trackLabels.swap(tracker->getTrackLabels());
305 std::copy(trackLabels.begin(), trackLabels.end(), std::back_inserter(allTrackLabels));
309 mTimer[SWComputeLabels].Stop();
312 auto rof = rofs.begin();
314 for (
int i = 0;
i < mNThreads;
i++) {
315 for (
auto&
rofData : roFrameVec[
i]) {
316 int ntracksROF = 0, firstROFTrackEntry = allTracksMFT.size();
317 tracksL.swap(
rofData.getTracks());
318 ntracksROF = tracksL.size();
319 copyTracks(tracksL, allTracksMFT, allClusIdx);
320 rof->setFirstEntry(firstROFTrackEntry);
321 rof->setNEntries(ntracksROF);
328 LOG(info) <<
"MFTTracker pushed " << allTracksMFT.size() <<
" tracks";
335 static bool first =
true;
343 mTimer[SWTot].Stop();
440 std::vector<InputSpec> inputs;
441 inputs.emplace_back(
"compClusters",
"MFT",
"COMPCLUSTERS", 0, Lifetime::Timeframe);
442 inputs.emplace_back(
"patterns",
"MFT",
"PATTERNS", 0, Lifetime::Timeframe);
443 inputs.emplace_back(
"ROframes",
"MFT",
"CLUSTERSROF", 0, Lifetime::Timeframe);
444 inputs.emplace_back(
"cldict",
"MFT",
"CLUSDICT", 0, Lifetime::Condition,
ccdbParamSpec(
"MFT/Calib/ClusterDictionary"));
447 if (trackingParam.irFramesOnly) {
448 inputs.emplace_back(
"IRFramesITS",
"ITS",
"IRFRAMES", 0, Lifetime::Timeframe);
451 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
460 ggRequest->addInput({
"mftTGeo",
"MFT",
"GEOMTGEO", 0, Lifetime::Condition,
framework::ccdbParamSpec(
"MFT/Config/Geometry")}, inputs);
462 std::vector<OutputSpec> outputs;
463 outputs.emplace_back(
"MFT",
"TRACKS", 0, Lifetime::Timeframe);
464 outputs.emplace_back(
"MFT",
"MFTTrackROF", 0, Lifetime::Timeframe);
465 outputs.emplace_back(
"MFT",
"TRACKCLSID", 0, Lifetime::Timeframe);
468 inputs.emplace_back(
"labels",
"MFT",
"CLUSTERSMCTR", 0, Lifetime::Timeframe);
469 inputs.emplace_back(
"MC2ROframes",
"MFT",
"CLUSTERSMC2ROF", 0, Lifetime::Timeframe);
470 outputs.emplace_back(
"MFT",
"TRACKSMCTR", 0, Lifetime::Timeframe);
471 outputs.emplace_back(
"MFT",
"TRACKSMC2ROF", 0, Lifetime::Timeframe);
478 AlgorithmSpec{adaptFromTask<TrackerDPL>(ggRequest, useMC, nThreads)},