21#include <Acts/EventData/Seed.hpp>
22#include <Acts/EventData/SpacePointContainer.hpp>
23#include <Acts/Seeding/BinnedGroup.hpp>
24#include <Acts/Seeding/SeedFilter.hpp>
25#include <Acts/Seeding/SeedFilterConfig.hpp>
26#include <Acts/Seeding/SeedFinder.hpp>
27#include <Acts/Seeding/SeedFinderConfig.hpp>
28#include <Acts/Seeding/detail/CylindricalSpacePointGrid.hpp>
29#include <Acts/Utilities/GridBinFinder.hpp>
30#include <Acts/Utilities/RangeXD.hpp>
39 mSpacePointsPerLayer.resize(nLayers);
40 mHistSpacePoints =
new TH2F(
"hSpacePoints",
"Space points; x (cm); y (cm)", 200, -100, 100, 200, -100, 100);
53 for (
auto& layerSPs : mSpacePointsPerLayer) {
65 for (
size_t iCluster = 0; iCluster <
clusters.size(); ++iCluster) {
66 const auto& cluster =
clusters[iCluster];
70 sp.x = cluster.xCoordinate * Acts::UnitConstants::cm;
71 sp.y = cluster.yCoordinate * Acts::UnitConstants::cm;
72 sp.z = cluster.zCoordinate * Acts::UnitConstants::cm;
74 if (mHistSpacePoints) {
75 mHistSpacePoints->Fill(sp.x / Acts::UnitConstants::cm, sp.y / Acts::UnitConstants::cm);
78 sp.clusterId =
static_cast<int>(iCluster);
85 mSpacePoints.push_back(sp);
90 for (
auto& sp : mSpacePoints) {
91 if (sp.layer >= 0 && sp.layer < nLayers) {
92 mSpacePointsPerLayer[sp.layer].push_back(&sp);
98void TrackerACTS<nLayers>::createSeeds()
100 if (mSpacePoints.empty()) {
101 LOGF(info,
"No space points available for seeding");
107 struct SpacePointBackend {
108 using ValueType = SpacePoint;
109 explicit SpacePointBackend(
const std::vector<SpacePoint>& sps) : m_sps{&sps} {}
110 std::size_t size_impl()
const {
return m_sps->size(); }
111 float x_impl(std::size_t
i)
const {
return (*m_sps)[
i].x; }
112 float y_impl(std::size_t
i)
const {
return (*m_sps)[
i].y; }
113 float z_impl(std::size_t
i)
const {
return (*m_sps)[
i].z; }
114 float varianceR_impl(std::size_t
i)
const {
return (*m_sps)[
i].varianceR; }
115 float varianceZ_impl(std::size_t
i)
const {
return (*m_sps)[
i].varianceZ; }
116 const SpacePoint& get_impl(std::size_t
i)
const {
return (*m_sps)[
i]; }
117 std::any component_impl(Acts::HashedString , std::size_t )
const
119 LOG(fatal) <<
"No additional components available for space points";
120 throw std::runtime_error(
"SpacePointBackend: no strip component available");
122 const std::vector<SpacePoint>* m_sps;
126 SpacePointBackend backend{mSpacePoints};
129 Acts::SpacePointContainerConfig spContainerConfig;
130 Acts::SpacePointContainerOptions spContainerOpts;
131 spContainerOpts.beamPos = {0.f, 0.f};
132 Acts::SpacePointContainer<SpacePointBackend, Acts::detail::RefHolder> spContainer{spContainerConfig, spContainerOpts, backend};
135 const unsigned int maxSeeds =
static_cast<unsigned int>(mConfig.maxSeedsPerMiddleSP);
136 Acts::SeedFilterConfig filterConfig;
137 filterConfig.maxSeedsPerSpM = maxSeeds;
141 const float bFieldInZ = mBz * Acts::UnitConstants::T;
142 const float safeRMax = 1.8f * mConfig.minPt / bFieldInZ;
144 using SPProxy =
typename Acts::SpacePointContainer<SpacePointBackend, Acts::detail::RefHolder>::SpacePointProxyType;
145 Acts::SeedFinderConfig<SPProxy> finderConfig;
146 finderConfig.rMin = 0.f;
147 finderConfig.rMax = 100.f * Acts::UnitConstants::cm;
148 finderConfig.zMin = mConfig.zMin;
149 finderConfig.zMax = mConfig.zMax;
150 finderConfig.deltaRMin = std::min(mConfig.deltaRMinBottom, mConfig.deltaRMinTop);
151 finderConfig.deltaRMax = std::max(mConfig.deltaRMaxBottom, mConfig.deltaRMaxTop);
152 finderConfig.deltaRMinBottomSP = mConfig.deltaRMinBottom;
153 finderConfig.deltaRMaxBottomSP = mConfig.deltaRMaxBottom;
154 finderConfig.deltaRMinTopSP = mConfig.deltaRMinTop;
155 finderConfig.deltaRMaxTopSP = mConfig.deltaRMaxTop;
156 finderConfig.collisionRegionMin = mConfig.collisionRegionMin;
157 finderConfig.collisionRegionMax = mConfig.collisionRegionMax;
158 finderConfig.cotThetaMax = mConfig.cotThetaMax;
159 finderConfig.minPt = mConfig.minPt;
160 finderConfig.impactMax = mConfig.maxImpactParameter;
161 finderConfig.maxSeedsPerSpM = maxSeeds;
162 finderConfig.sigmaScattering = 5.f;
163 finderConfig.radLengthPerSeed = 0.05f;
164 finderConfig.seedFilter = std::make_shared<Acts::SeedFilter<SPProxy>>(filterConfig);
165 finderConfig = finderConfig.calculateDerivedQuantities();
166 Acts::SeedFinder<SPProxy, Acts::CylindricalSpacePointGrid<SPProxy>> seedFinder{finderConfig,
167 Acts::getDefaultLogger(
"Finder", Acts::Logging::Level::VERBOSE)};
170 Acts::CylindricalSpacePointGridConfig gridConfig;
171 gridConfig.minPt = finderConfig.minPt;
172 gridConfig.rMin = finderConfig.rMin;
173 gridConfig.rMax = finderConfig.rMax;
174 gridConfig.zMin = finderConfig.zMin;
175 gridConfig.zMax = finderConfig.zMax;
176 gridConfig.deltaRMax = finderConfig.deltaRMax;
177 gridConfig.cotThetaMax = finderConfig.cotThetaMax;
178 gridConfig.impactMax = finderConfig.impactMax;
180 Acts::CylindricalSpacePointGridOptions gridOpts;
181 gridOpts.bFieldInZ = bFieldInZ;
183 Acts::SeedFinderOptions finderOpts;
184 finderOpts.beamPos = spContainerOpts.beamPos;
185 finderOpts.bFieldInZ = gridOpts.bFieldInZ;
187 finderOpts = finderOpts.calculateDerivedQuantities(finderConfig);
188 }
catch (
const std::exception& e) {
189 LOG(fatal) <<
"Error in seed finder configuration: " << e.what();
193 Acts::CylindricalSpacePointGrid<SPProxy> grid = Acts::CylindricalSpacePointGridCreator::createGrid<SPProxy>(gridConfig, gridOpts);
195 Acts::CylindricalSpacePointGridCreator::fillGrid(finderConfig, finderOpts, grid,
196 spContainer.begin(), spContainer.end());
197 }
catch (
const std::exception& e) {
198 LOG(fatal) <<
"Error during grid creation/filling: " << e.what();
201 LOG(
debug) <<
"Grid created with " << grid.dimensions();
204 Acts::GridBinFinder<3ul> bottomBinFinder{1, std::vector<std::pair<int, int>>{}, 0};
205 Acts::GridBinFinder<3ul> topBinFinder{1, std::vector<std::pair<int, int>>{}, 0};
206 Acts::CylindricalBinnedGroup<SPProxy> spGroup{std::move(grid), bottomBinFinder, topBinFinder};
208 std::vector<std::vector<Acts::Seed<SPProxy>>> seedsPerGroup;
209 typename Acts::SeedFinder<SPProxy, Acts::CylindricalSpacePointGrid<SPProxy>>::SeedingState seedingState;
210 seedingState.spacePointMutableData.resize(spContainer.size());
211 const Acts::Range1D<float> rMiddleSPRange;
212 for (
auto [
bottom, middle,
top] : spGroup) {
213 auto&
v = seedsPerGroup.emplace_back();
215 seedFinder.createSeedsForGroup(finderOpts, seedingState, spGroup.grid(),
v,
bottom, middle,
top, rMiddleSPRange);
216 }
catch (
const std::exception& e) {
217 LOG(fatal) <<
"Error during seed finding for a group: " << e.what();
221 LOG(
debug) <<
"Seed finding completed, found " << seedsPerGroup.size() <<
" groups with seeds";
224 for (
const auto& groupSeeds : seedsPerGroup) {
225 for (
const auto& actsSeed : groupSeeds) {
227 seed.bottom = &actsSeed.sp()[0]->externalSpacePoint();
228 seed.middle = &actsSeed.sp()[1]->externalSpacePoint();
229 seed.top = &actsSeed.sp()[2]->externalSpacePoint();
230 seed.quality = actsSeed.seedQuality();
231 mSeeds.push_back(seed);
235 LOGF(info,
"Created %zu seeds from %zu space points", mSeeds.size(), mSpacePoints.size());
238template <
int nLayers>
239bool TrackerACTS<nLayers>::estimateTrackParams(
const SeedACTS& seed,
o2::its::TrackITSExt& track)
const
244template <
int nLayers>
245void TrackerACTS<nLayers>::findTracks()
249template <
int nLayers>
250void TrackerACTS<nLayers>::computeTracksMClabels()
254template <
int nLayers>
258 LOG(error) <<
"Cannot run TrackerACTS: No TimeFrame adopted";
262 double totalTime = 0.;
263 LOG(info) <<
"==== TRK ACTS Tracking ====";
264 LOG(info) <<
"Processing " << mTimeFrame->getNrof() <<
" ROFs with B = " << mBz <<
" T";
267 for (
int iROF = 0; iROF < mTimeFrame->getNrof(); ++iROF) {
268 LOG(info) <<
"Processing ROF " << iROF;
270 mCurState = SpacePointBuilding;
271 totalTime += evaluateTask([
this, iROF]() { buildSpacePoints(iROF); },
272 StateNames[mCurState]);
276 totalTime += evaluateTask([
this]() { createSeeds(); },
277 StateNames[mCurState]);
280 mCurState = TrackFinding;
281 totalTime += evaluateTask([
this]() { findTracks(); },
282 StateNames[mCurState]);
286 if (mTimeFrame->hasMCinformation()) {
287 computeTracksMClabels();
290 LOG(info) <<
"=== TimeFrame " << mTimeFrameCounter <<
" completed in: " << totalTime <<
" ms ===";
293 mTotalTime += totalTime;
296template <
int nLayers>
299 float avgTF = mTimeFrameCounter > 0 ?
static_cast<float>(mTotalTime) / mTimeFrameCounter : 0.f;
300 LOGP(info,
"TrackerACTS summary: Processed {} TFs in TOT={:.2f} ms, AVG/TF={:.2f} ms",
301 mTimeFrameCounter, mTotalTime, avgTF);
TRK tracker using ACTS seeding algorithm.
TRK Tracker using ACTS algorithms for seeding and track finding.
void clustersToTracks()
Main tracking entry point: convert clusters to tracks.
void adoptTimeFrame(o2::its::TimeFrame< nLayers > &tf)
Adopt a TimeFrame for processing.
void printSummary() const
Print tracking summary.
GLdouble GLdouble GLdouble GLdouble top
GLenum GLuint GLint GLint layer
std::unique_ptr< GPUReconstructionTimeframe > tf
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Cluster > clusters