49 timeFrame.setMemoryPool(mMemoryPool);
50 trackerTraits.setMemoryPool(mMemoryPool);
51 trackerTraits.setNThreads(mTaskArena->max_concurrency(), mTaskArena);
54 trackerTraits.updateTrackingParameters(mTrackingParams);
55 timeFrame.initTrackerTopologies(mTrackingParams, 11);
58 if (!mHitRecoConfig.empty()) {
59 TFile hitsFile(mHitRecoConfig[
"inputfiles"][
"hits"].
get<std::string>().c_str(),
"READ");
60 TFile mcHeaderFile(mHitRecoConfig[
"inputfiles"][
"mcHeader"].
get<std::string>().c_str(),
"READ");
61 TTree* hitsTree = hitsFile.Get<TTree>(
"o2sim");
62 std::vector<o2::trk::Hit>* trkHit =
nullptr;
63 hitsTree->SetBranchAddress(
"TRKHit", &trkHit);
65 TTree* mcHeaderTree = mcHeaderFile.Get<TTree>(
"o2sim");
67 mcHeaderTree->SetBranchAddress(
"MCEventHeader.", &mcheader);
72 const Long64_t
nEvents{hitsTree->GetEntries()};
73 LOGP(info,
"Starting {} reconstruction from hits for {} events", trackerTraits.getName(),
nEvents);
75 trackerTraits.setBz(mHitRecoConfig[
"geometry"][
"bz"].get<float>());
77 TGeoGlobalMagField::Instance()->SetField(field);
78 TGeoGlobalMagField::Instance()->Lock();
80 nRofs = timeFrame.loadROFsFromHitTree(hitsTree, gman, mHitRecoConfig);
81 const int inROFpileup{mHitRecoConfig.contains(
"inROFpileup") ? mHitRecoConfig[
"inROFpileup"].get<
int>() : 1};
82 timeFrame.getPrimaryVerticesFromMC(mcHeaderTree, nRofs,
nEvents, inROFpileup);
83 }
else if (!mClusterRecoConfig.empty()) {
84 LOGP(info,
"Starting {} reconstruction from clusters", trackerTraits.getName());
89 trackerTraits.setBz(mClusterRecoConfig[
"geometry"][
"bz"].get<float>());
91 TGeoGlobalMagField::Instance()->SetField(field);
92 TGeoGlobalMagField::Instance()->Lock();
94 constexpr int nLayers{11};
95 std::array<gsl::span<const o2::trk::Cluster>, nLayers> layerClusters;
96 std::array<gsl::span<const unsigned char>, nLayers> layerPatterns;
97 std::array<gsl::span<const o2::trk::ROFRecord>, nLayers> layerROFs;
98 std::array<const dataformats::MCTruthContainer<MCCompLabel>*, nLayers> layerLabels{};
100 size_t nInputRofs{0};
101 for (
int iLayer = 0; iLayer < nLayers; ++iLayer) {
102 layerClusters[iLayer] = pc.
inputs().
get<gsl::span<o2::trk::Cluster>>(std::format(
"compClusters_{}", iLayer));
103 layerPatterns[iLayer] = pc.
inputs().
get<gsl::span<unsigned char>>(std::format(
"patterns_{}", iLayer));
104 layerROFs[iLayer] = pc.
inputs().
get<gsl::span<o2::trk::ROFRecord>>(std::format(
"ROframes_{}", iLayer));
105 nInputRofs = std::max(nInputRofs, layerROFs[iLayer].
size());
111 timeFrame.deriveAndInitTiming(layerROFs);
113 const float yPlaneMLOT = 0.0010f;
114 nRofs = timeFrame.loadROFrameData(layerROFs, layerClusters, layerPatterns, mIsMC ? &layerLabels :
nullptr, yPlaneMLOT);
115 timeFrame.addTruthSeedingVertices();
118 const auto trackingLoopStart = std::chrono::steady_clock::now();
119 for (
size_t iter{0}; iter < mTrackingParams.size(); ++iter) {
120 LOGP(info,
"{}", mTrackingParams[iter].
asString());
121 trackerTraits.initialiseTimeFrame(iter);
122 trackerTraits.computeLayerTracklets(iter, -1);
123 LOGP(info,
"Number of tracklets in iteration {}: {}", iter, timeFrame.getNumberOfTracklets());
124 trackerTraits.computeLayerCells(iter);
125 LOGP(info,
"Number of cells in iteration {}: {}", iter, timeFrame.getNumberOfCells());
126 trackerTraits.findCellsNeighbours(iter);
127 LOGP(info,
"Number of cell neighbours in iteration {}: {}", iter, timeFrame.getNumberOfNeighbours());
128 trackerTraits.findRoads(iter);
129 LOGP(info,
"Number of roads in iteration {}: {}", iter, timeFrame.getNumberOfTracks());
131 const auto trackingLoopElapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - trackingLoopStart).count();
132 LOGP(info,
"Tracking iterations block took {} ms", trackingLoopElapsedMs);
138 const auto& tracks = timeFrame.getTracks();
139 const auto&
labels = timeFrame.getTracksLabel();
140 std::vector<o2::its::TrackITS> allTracks(tracks.begin(), tracks.end());
141 std::vector<o2::MCCompLabel> allLabels;
143 int totalTracks = allTracks.size();
149 for (
const auto&
label : allLabels) {
150 if (
label.isFake()) {
158 LOGP(info,
"=== Tracking Summary ===");
159 LOGP(info,
"Total tracks reconstructed: {}", totalTracks);
160 LOGP(info,
"Good tracks: {} ({:.1f}%)", goodTracks, totalTracks > 0 ? 100.0 * goodTracks / totalTracks : 0);
161 LOGP(info,
"Fake tracks: {} ({:.1f}%)", fakeTracks, totalTracks > 0 ? 100.0 * fakeTracks / totalTracks : 0);
163 const auto& rofView = timeFrame.getROFOverlapTableView();
164 const auto& clockLayer = rofView.getClockLayer();
165 const int clockLayerId = rofView.getClock();
166 const int64_t anchorBC = timeFrame.getTFAnchorIR().toLong();
168 int highestROF =
static_cast<int>(clockLayer.mNROFsTF);
169 for (
const auto& trc : allTracks) {
170 highestROF = std::max(highestROF,
static_cast<int>(clockLayer.getROF(trc.getTimeStamp())));
172 for (
const auto& vtx : timeFrame.getPrimaryVertices()) {
173 highestROF = std::max(highestROF,
static_cast<int>(clockLayer.getROF(vtx.getTimeStamp().lower())));
176 std::vector<o2::trk::ROFRecord> allTrackROFs(highestROF);
177 for (
size_t iROF = 0; iROF < allTrackROFs.size(); ++iROF) {
178 auto& rof = allTrackROFs[iROF];
180 ir.
setFromLong(anchorBC +
static_cast<int64_t
>(clockLayer.getROFStartInBC(iROF)));
182 rof.setROFrame(iROF);
183 rof.setFirstEntry(0);
187 std::vector<int> rofEntries(highestROF + 1, 0);
188 for (
const auto& trc : allTracks) {
189 const int rof =
static_cast<int>(clockLayer.getROF(trc.getTimeStamp()));
190 if (rof >= 0 && rof < highestROF) {
194 std::exclusive_scan(rofEntries.begin(), rofEntries.end(), rofEntries.begin(), 0);
196 std::vector<o2::dataformats::IRFrame> irFrames;
197 irFrames.reserve(allTrackROFs.size());
198 const auto& maskView = timeFrame.getROFMaskView();
199 const auto rofLenMinus1 = clockLayer.mROFLength > 0 ? clockLayer.mROFLength - 1 : 0;
200 for (
size_t iROF = 0; iROF < allTrackROFs.size(); ++iROF) {
201 allTrackROFs[iROF].setFirstEntry(rofEntries[iROF]);
202 allTrackROFs[iROF].setNEntries(rofEntries[iROF + 1] - rofEntries[iROF]);
203 if (maskView.isROFEnabled(clockLayerId,
static_cast<int>(iROF))) {
204 const auto& bcStart = allTrackROFs[iROF].getBCData();
205 auto& irFrame = irFrames.emplace_back(bcStart, bcStart + rofLenMinus1);
206 irFrame.info = allTrackROFs[iROF].getNEntries();
217 LOGP(info,
"TRK pushed {} tracks in {} ROFs and {} IR frames{}",
218 allTracks.size(), allTrackROFs.size(), irFrames.size(),
219 mIsMC ?
" (with MC labels)" :
"");