From b76f2af64f8052c4cff272df46fd00066e4cd6a4 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Wed, 28 May 2025 17:35:19 +0200 Subject: [PATCH 1/5] ITS: include cleaning Signed-off-by: Felix Schlepper --- .../tracking/include/ITStracking/Cluster.h | 43 ++++++++----------- .../include/ITStracking/VertexerTraits.h | 1 + Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx | 23 ++++------ .../ITSMFT/ITS/tracking/src/TimeFrame.cxx | 1 + 4 files changed, 28 insertions(+), 40 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cluster.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cluster.h index 2bf1316470316..74e19c55022d9 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cluster.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cluster.h @@ -16,17 +16,12 @@ #ifndef TRACKINGITSU_INCLUDE_CACLUSTER_H_ #define TRACKINGITSU_INCLUDE_CACLUSTER_H_ -#include "GPUCommonRtypes.h" -#include "ITStracking/Definitions.h" -#include "ITStracking/MathUtils.h" - -#ifndef GPUCA_GPUCODE_DEVICE #include -#endif -namespace o2 -{ -namespace its +#include "GPUCommonRtypes.h" +#include "GPUCommonArray.h" + +namespace o2::its { class IndexTableUtils; @@ -40,13 +35,13 @@ struct Cluster final { bool operator==(const Cluster&) const; GPUhd() void print() const; - float xCoordinate; // = -999.f; - float yCoordinate; // = -999.f; - float zCoordinate; // = -999.f; - float phi; // = -999.f; - float radius; // = -999.f; - int clusterId; // = -1; - int indexTableBinIndex; // = -1; + float xCoordinate{-999.f}; + float yCoordinate{-999.f}; + float zCoordinate{-999.f}; + float phi{-999.f}; + float radius{-999.f}; + int clusterId{-1}; + int indexTableBinIndex{-1}; ClassDefNV(Cluster, 1); }; @@ -62,11 +57,11 @@ struct TrackingFrameInfo { TrackingFrameInfo() = default; TrackingFrameInfo(float x, float y, float z, float xTF, float alpha, std::array&& posTF, std::array&& covTF); - float xCoordinate; - float yCoordinate; - float zCoordinate; - float xTrackingFrame; - float alphaTrackingFrame; + float xCoordinate{-999.f}; + float yCoordinate{-999.f}; + float zCoordinate{-999.f}; + float xTrackingFrame{-999.f}; + float alphaTrackingFrame{-999.f}; std::array positionTrackingFrame = {-1., -1.}; std::array covarianceTrackingFrame = {999., 999., 999.}; GPUdi() void print() const @@ -78,10 +73,8 @@ struct TrackingFrameInfo { covarianceTrackingFrame[0], covarianceTrackingFrame[1], covarianceTrackingFrame[2]); #endif } - - ClassDefNV(TrackingFrameInfo, 1); }; -} // namespace its -} // namespace o2 + +} // namespace o2::its #endif /* TRACKINGITSU_INCLUDE_CACLUSTER_H_ */ diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h index ae92fda292df3..1ec6adc9efab4 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h @@ -28,6 +28,7 @@ #include "ITStracking/IndexTableUtils.h" #include "ITStracking/TimeFrame.h" #include "ITStracking/Tracklet.h" +#include "ITStracking/MathUtils.h" #include "GPUCommonDef.h" #include "GPUCommonMath.h" diff --git a/Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx b/Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx index 1557c636e2345..6f7ed52b0c29e 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx @@ -12,19 +12,15 @@ /// \file Cluster.cxx /// \brief /// +#include "GPUCommonMath.h" +#include "GPUCommonArray.h" #include "ITStracking/Cluster.h" +#include "ITStracking/Definitions.h" #include "ITStracking/MathUtils.h" #include "ITStracking/IndexTableUtils.h" -#ifndef GPUCA_GPUCODE_DEVICE -#include -#endif - -namespace o2 -{ -namespace its -{ +using namespace o2::its; using math_utils::computePhi; using math_utils::getNormalizedPhi; @@ -35,7 +31,7 @@ Cluster::Cluster(const float x, const float y, const float z, const int index) yCoordinate{y}, zCoordinate{z}, phi{getNormalizedPhi(computePhi(x, y))}, - radius{hypot(x, y)}, + radius{o2::gpu::GPUCommonMath::Hypot(x, y)}, clusterId{index}, indexTableBinIndex{0} { @@ -47,7 +43,7 @@ Cluster::Cluster(const int layerIndex, const IndexTableUtils& utils, const Clust yCoordinate{other.yCoordinate}, zCoordinate{other.zCoordinate}, phi{getNormalizedPhi(computePhi(other.xCoordinate, other.yCoordinate))}, - radius{hypot(other.xCoordinate, other.yCoordinate)}, + radius{o2::gpu::GPUCommonMath::Hypot(other.xCoordinate, other.yCoordinate)}, clusterId{other.clusterId}, indexTableBinIndex{utils.getBinIndex(utils.getZBinIndex(layerIndex, zCoordinate), utils.getPhiBinIndex(phi))} @@ -62,7 +58,7 @@ Cluster::Cluster(const int layerIndex, const float3& primaryVertex, const IndexT zCoordinate{other.zCoordinate}, phi{getNormalizedPhi( computePhi(xCoordinate - primaryVertex.x, yCoordinate - primaryVertex.y))}, - radius{hypot(xCoordinate - primaryVertex.x, yCoordinate - primaryVertex.y)}, + radius{o2::gpu::GPUCommonMath::Hypot(xCoordinate - primaryVertex.x, yCoordinate - primaryVertex.y)}, clusterId{other.clusterId}, indexTableBinIndex{utils.getBinIndex(utils.getZBinIndex(layerIndex, zCoordinate), utils.getPhiBinIndex(phi))} @@ -77,7 +73,7 @@ void Cluster::Init(const int layerIndex, const float3& primaryVertex, const Inde zCoordinate = other.zCoordinate; phi = getNormalizedPhi( computePhi(xCoordinate - primaryVertex.x, yCoordinate - primaryVertex.y)); - radius = hypot(xCoordinate - primaryVertex.x, yCoordinate - primaryVertex.y); + radius = o2::gpu::GPUCommonMath::Hypot(xCoordinate - primaryVertex.x, yCoordinate - primaryVertex.y); clusterId = other.clusterId; indexTableBinIndex = utils.getBinIndex(utils.getZBinIndex(layerIndex, zCoordinate), utils.getPhiBinIndex(phi)); @@ -100,6 +96,3 @@ TrackingFrameInfo::TrackingFrameInfo(float x, float y, float z, float xTF, float { // Nothing to do } - -} // namespace its -} // namespace o2 diff --git a/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx b/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx index eb7834da740d0..7443cea1c0c97 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx @@ -14,6 +14,7 @@ /// #include "ITStracking/TimeFrame.h" +#include "ITStracking/MathUtils.h" #include "DataFormatsITSMFT/Cluster.h" #include "DataFormatsITSMFT/CompCluster.h" #include "DataFormatsITSMFT/ROFRecord.h" From 85fcc3acface0b4b282d28ed64bc2437beb74041 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Wed, 28 May 2025 17:42:11 +0200 Subject: [PATCH 2/5] ITS: inline functions Signed-off-by: Felix Schlepper --- Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx b/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx index 7443cea1c0c97..6dd11b2b659c7 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx @@ -35,13 +35,13 @@ struct ClusterHelper { int ind; }; -float MSangle(float mass, float p, float xX0) +inline float MSangle(float mass, float p, float xX0) { float beta = p / o2::gpu::CAMath::Hypot(mass, p); return 0.0136f * o2::gpu::CAMath::Sqrt(xX0) * (1.f + 0.038f * o2::gpu::CAMath::Log(xX0)) / (beta * p); } -float Sq(float v) +inline float Sq(float v) { return v * v; } From 05014e985fccd81884476f95a9d85a83c9a95e04 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Wed, 28 May 2025 21:38:03 +0200 Subject: [PATCH 3/5] ITS: buildSeeds check only once of b=0 Signed-off-by: Felix Schlepper --- .../include/ITStracking/TrackerTraits.h | 5 +-- .../ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 35 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h index 22af80e544c86..5f4e40b92ba82 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h @@ -90,8 +90,6 @@ class TrackerTraits virtual int getTFNumberOfTracklets() const { return mTimeFrame->getNumberOfTracklets(); } virtual int getTFNumberOfCells() const { return mTimeFrame->getNumberOfCells(); } - float mBz = 5.f; - private: track::TrackParCov buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, const TrackingFrameInfo& tf3); bool fitTrack(TrackITSExt& track, int start, int end, int step, float chi2clcut = o2::constants::math::VeryBig, float chi2ndfcut = o2::constants::math::VeryBig, float maxQoverPt = o2::constants::math::VeryBig, int nCl = 0); @@ -106,6 +104,9 @@ class TrackerTraits o2::gpu::GPUChainITS* mChain = nullptr; TimeFrame* mTimeFrame; std::vector mTrkParams; + + float mBz{-999.f}; + bool mIsZeroField{false}; }; template diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index a66583f1b12f5..69e9df74e1153 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -1235,7 +1235,8 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool ou template track::TrackParCov TrackerTraits::buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, const TrackingFrameInfo& tf3) { - const float ca = o2::gpu::CAMath::Cos(tf3.alphaTrackingFrame), sa = o2::gpu::CAMath::Sin(tf3.alphaTrackingFrame); + float ca{-999.f}, sa{-999.f}; + o2::gpu::CAMath::SinCos(tf3.alphaTrackingFrame, sa, ca); const float x1 = cluster1.xCoordinate * ca + cluster1.yCoordinate * sa; const float y1 = -cluster1.xCoordinate * sa + cluster1.yCoordinate * ca; const float z1 = cluster1.zCoordinate; @@ -1245,29 +1246,27 @@ track::TrackParCov TrackerTraits::buildTrackSeed(const Cluster& cluster const float x3 = tf3.xTrackingFrame; const float y3 = tf3.positionTrackingFrame[0]; const float z3 = tf3.positionTrackingFrame[1]; - - const bool zeroField{std::abs(getBz()) < o2::constants::math::Almost0}; - const float tgp = zeroField ? o2::gpu::CAMath::ATan2(y3 - y1, x3 - x1) : 1.f; - const float crv = zeroField ? 1.f : math_utils::computeCurvature(x3, y3, x2, y2, x1, y1); - const float snp = zeroField ? tgp / o2::gpu::CAMath::Sqrt(1.f + tgp * tgp) : crv * (x3 - math_utils::computeCurvatureCentreX(x3, y3, x2, y2, x1, y1)); - const float tgl12 = math_utils::computeTanDipAngle(x1, y1, x2, y2, z1, z2); - const float tgl23 = math_utils::computeTanDipAngle(x2, y2, x3, y3, z2, z3); - const float q2pt = zeroField ? 1.f / o2::track::kMostProbablePt : crv / (getBz() * o2::constants::math::B2C); - const float q2pt2 = crv * crv; - const float sg2q2pt = track::kC1Pt2max * (q2pt2 > 0.0005 ? (q2pt2 < 1 ? q2pt2 : 1) : 0.0005); - return track::TrackParCov(tf3.xTrackingFrame, tf3.alphaTrackingFrame, - {y3, z3, snp, 0.5f * (tgl12 + tgl23), q2pt}, - {tf3.covarianceTrackingFrame[0], - tf3.covarianceTrackingFrame[1], tf3.covarianceTrackingFrame[2], - 0.f, 0.f, track::kCSnp2max, - 0.f, 0.f, 0.f, track::kCTgl2max, - 0.f, 0.f, 0.f, 0.f, sg2q2pt}); + float tgp{1.f}, crv{1.f}, snp{-999.f}, tgl12{-999.f}, tgl23{-999.f}, q2pt{1.f / track::kMostProbablePt}, q2pt2{1.f}, sg2q2pt{-999.f}; + if (mIsZeroField) { + tgp = o2::gpu::CAMath::ATan2(y3 - y1, x3 - x1); + snp = tgp / o2::gpu::CAMath::Sqrt(1.f + tgp * tgp); + } else { + crv = math_utils::computeCurvature(x3, y3, x2, y2, x1, y1); + snp = crv * (x3 - math_utils::computeCurvatureCentreX(x3, y3, x2, y2, x1, y1)); + q2pt = crv / (mBz * o2::constants::math::B2C); + q2pt2 = crv * crv; + } + tgl12 = math_utils::computeTanDipAngle(x1, y1, x2, y2, z1, z2); + tgl23 = math_utils::computeTanDipAngle(x2, y2, x3, y3, z2, z3); + sg2q2pt = track::kC1Pt2max * (q2pt2 > 0.0005f ? (q2pt2 < 1.f ? q2pt2 : 1.f) : 0.0005f); + return {tf3.xTrackingFrame, tf3.alphaTrackingFrame, {y3, z3, snp, 0.5f * (tgl12 + tgl23), q2pt}, {tf3.covarianceTrackingFrame[0], tf3.covarianceTrackingFrame[1], tf3.covarianceTrackingFrame[2], 0.f, 0.f, track::kCSnp2max, 0.f, 0.f, 0.f, track::kCTgl2max, 0.f, 0.f, 0.f, 0.f, sg2q2pt}}; } template void TrackerTraits::setBz(float bz) { mBz = bz; + mIsZeroField = std::abs(mBz) < 0.01; mTimeFrame->setBz(bz); } From 39cb9134ba09946650003132180534d95d67765c Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Wed, 28 May 2025 21:54:45 +0200 Subject: [PATCH 4/5] ITS: allow cluster classes to be trivially moveable Signed-off-by: Felix Schlepper --- Detectors/ITSMFT/ITS/tracking/CMakeLists.txt | 1 - .../ITS/tracking/include/ITStracking/Cell.h | 84 ++++++++----------- .../tracking/include/ITStracking/Cluster.h | 62 ++++++++------ .../ITS/tracking/include/ITStracking/Road.h | 69 +++++---------- .../tracking/include/ITStracking/Tracklet.h | 17 ++-- Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx | 35 ++++---- Detectors/ITSMFT/ITS/tracking/src/Road.cxx | 18 ---- .../ITSMFT/ITS/tracking/src/TrackingLinkDef.h | 12 ++- 8 files changed, 123 insertions(+), 175 deletions(-) delete mode 100644 Detectors/ITSMFT/ITS/tracking/src/Road.cxx diff --git a/Detectors/ITSMFT/ITS/tracking/CMakeLists.txt b/Detectors/ITSMFT/ITS/tracking/CMakeLists.txt index d6540cdeaf910..d3871b9e75d70 100644 --- a/Detectors/ITSMFT/ITS/tracking/CMakeLists.txt +++ b/Detectors/ITSMFT/ITS/tracking/CMakeLists.txt @@ -19,7 +19,6 @@ o2_add_library(ITStracking src/TimeFrame.cxx src/IOUtils.cxx src/Label.cxx - src/Road.cxx src/Tracker.cxx src/TrackerTraits.cxx src/TrackingConfigParam.cxx diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cell.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cell.h index 9ed5daed447df..097499c05bd3b 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cell.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cell.h @@ -23,16 +23,27 @@ #include "GPUCommonDef.h" -namespace o2 -{ -namespace its +namespace o2::its { class Cell final { public: - GPUhd() Cell(); - GPUd() Cell(const int, const int, const int, const int, const int); + GPUhdDefault() Cell() = default; + GPUhd() Cell(const int firstClusterIndex, const int secondClusterIndex, const int thirdClusterIndex, + const int firstTrackletIndex, const int secondTrackletIndex) + : mFirstClusterIndex(firstClusterIndex), + mSecondClusterIndex(secondClusterIndex), + mThirdClusterIndex(thirdClusterIndex), + mFirstTrackletIndex(firstTrackletIndex), + mSecondTrackletIndex(secondTrackletIndex), + mLevel(1) {} + GPUhdDefault() Cell(const Cell&) = default; + GPUhdDefault() Cell(Cell&&) = default; + GPUhdDefault() ~Cell() = default; + + GPUhdDefault() Cell& operator=(const Cell&) = default; + GPUhdDefault() Cell& operator=(Cell&&) noexcept = default; GPUhd() int getFirstClusterIndex() const { return mFirstClusterIndex; }; GPUhd() int getSecondClusterIndex() const { return mSecondClusterIndex; }; @@ -44,44 +55,19 @@ class Cell final GPUhd() int* getLevelPtr() { return &mLevel; } private: - const int mFirstClusterIndex; - const int mSecondClusterIndex; - const int mThirdClusterIndex; - const int mFirstTrackletIndex; - const int mSecondTrackletIndex; - int mLevel; + int mFirstClusterIndex{0}; + int mSecondClusterIndex{0}; + int mThirdClusterIndex{0}; + int mFirstTrackletIndex{0}; + int mSecondTrackletIndex{0}; + int mLevel{0}; }; -GPUhdi() Cell::Cell() - : mFirstClusterIndex{0}, - mSecondClusterIndex{0}, - mThirdClusterIndex{0}, - mFirstTrackletIndex{0}, - mSecondTrackletIndex{0}, - mLevel{0} -{ - // Nothing to do -} - -GPUdi() Cell::Cell(const int firstClusterIndex, const int secondClusterIndex, const int thirdClusterIndex, - const int firstTrackletIndex, const int secondTrackletIndex) - : mFirstClusterIndex{firstClusterIndex}, - mSecondClusterIndex{secondClusterIndex}, - mThirdClusterIndex{thirdClusterIndex}, - mFirstTrackletIndex{firstTrackletIndex}, - mSecondTrackletIndex{secondTrackletIndex}, - mLevel{1} -{ - // Nothing to do -} - class CellSeed final : public o2::track::TrackParCovF { public: GPUhdDefault() CellSeed() = default; - GPUhdDefault() CellSeed(const CellSeed&) = default; - GPUhdDefault() ~CellSeed() = default; - GPUd() CellSeed(int innerL, int cl0, int cl1, int cl2, int trkl0, int trkl1, o2::track::TrackParCovF& tpc, float chi2) : o2::track::TrackParCovF{tpc}, mLevel{1}, mChi2{chi2} + GPUhd() CellSeed(int innerL, int cl0, int cl1, int cl2, int trkl0, int trkl1, o2::track::TrackParCovF& tpc, float chi2) : o2::track::TrackParCovF{tpc}, mLevel{1}, mChi2{chi2} { setUserField(innerL); mClusters[innerL + 0] = cl0; @@ -90,6 +76,12 @@ class CellSeed final : public o2::track::TrackParCovF mTracklets[0] = trkl0; mTracklets[1] = trkl1; } + GPUhdDefault() CellSeed(const CellSeed&) = default; + GPUhdDefault() ~CellSeed() = default; + // GPUhdDefault() CellSeed(CellSeed&&) = default; TODO cannot use this yet since TrackPar only has device + GPUhdDefault() CellSeed& operator=(const CellSeed&) = default; + GPUhdDefault() CellSeed& operator=(CellSeed&&) = default; + GPUhd() int getFirstClusterIndex() const { return mClusters[getUserField()]; }; GPUhd() int getSecondClusterIndex() const { return mClusters[getUserField() + 1]; }; GPUhd() int getThirdClusterIndex() const { return mClusters[getUserField() + 2]; }; @@ -104,20 +96,18 @@ class CellSeed final : public o2::track::TrackParCovF GPUhd() int* getLevelPtr() { return &mLevel; } GPUhd() int* getClusters() { return mClusters; } GPUhd() int getCluster(int i) const { return mClusters[i]; } - GPUhdi() void printCell() const; + GPUhd() void printCell() const + { + printf("trkl: %d, %d\t lvl: %d\t chi2: %f\n", mTracklets[0], mTracklets[1], mLevel, mChi2); + } private: - int mClusters[7] = {-1, -1, -1, -1, -1, -1, -1}; - int mTracklets[2] = {-1, -1}; - int mLevel = 0; float mChi2 = 0.f; + int mLevel = 0; + int mTracklets[2] = {-1, -1}; + int mClusters[7] = {-1, -1, -1, -1, -1, -1, -1}; }; -GPUhdi() void CellSeed::printCell() const -{ - printf("trkl: %d, %d\t lvl: %d\t chi2: %f\n", mTracklets[0], mTracklets[1], mLevel, mChi2); -} +} // namespace o2::its -} // namespace its -} // namespace o2 #endif /* TRACKINGITSU_INCLUDE_CACELL_H_ */ diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cluster.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cluster.h index 74e19c55022d9..eaefbee5e2aaa 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cluster.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Cluster.h @@ -16,8 +16,6 @@ #ifndef TRACKINGITSU_INCLUDE_CACLUSTER_H_ #define TRACKINGITSU_INCLUDE_CACLUSTER_H_ -#include - #include "GPUCommonRtypes.h" #include "GPUCommonArray.h" @@ -27,12 +25,30 @@ namespace o2::its class IndexTableUtils; struct Cluster final { - Cluster() = default; - Cluster(const float x, const float y, const float z, const int idx); - Cluster(const int, const IndexTableUtils& utils, const Cluster&); - Cluster(const int, const float3&, const IndexTableUtils& utils, const Cluster&); - void Init(const int, const float3&, const IndexTableUtils& utils, const Cluster&); - bool operator==(const Cluster&) const; + GPUhdDefault() Cluster() = default; + GPUhd() Cluster(const float x, const float y, const float z, const int idx); + GPUhd() Cluster(const int, const IndexTableUtils& utils, const Cluster&); + GPUhd() Cluster(const int, const float3&, const IndexTableUtils& utils, const Cluster&); + GPUhdDefault() Cluster(const Cluster&) = default; + GPUhdDefault() Cluster(Cluster&&) noexcept = default; + GPUhdDefault() ~Cluster() = default; + + GPUhdDefault() Cluster& operator=(const Cluster&) = default; + GPUhdDefault() Cluster& operator=(Cluster&&) noexcept = default; + + // TODO + /*GPUhdDefault() bool operator==(const Cluster&) const = default;*/ + GPUhd() bool operator==(const Cluster& other) const + { + return xCoordinate == other.xCoordinate && + yCoordinate == other.yCoordinate && + zCoordinate == other.zCoordinate && + phi == other.phi && + radius == other.radius && + clusterId == other.clusterId && + indexTableBinIndex == other.indexTableBinIndex; + } + GPUhd() void print() const; float xCoordinate{-999.f}; @@ -46,16 +62,17 @@ struct Cluster final { ClassDefNV(Cluster, 1); }; -GPUhdi() void Cluster::print() const -{ -#if !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT)) - printf("Cluster: %f %f %f %f %f %d %d\n", xCoordinate, yCoordinate, zCoordinate, phi, radius, clusterId, indexTableBinIndex); -#endif -} +struct TrackingFrameInfo final { + GPUhdDefault() TrackingFrameInfo() = default; + GPUhd() TrackingFrameInfo(float x, float y, float z, float xTF, float alpha, std::array&& posTF, std::array&& covTF); + GPUhdDefault() TrackingFrameInfo(const TrackingFrameInfo&) = default; + GPUhdDefault() TrackingFrameInfo(TrackingFrameInfo&&) noexcept = default; + GPUhdDefault() ~TrackingFrameInfo() = default; + + GPUhdDefault() TrackingFrameInfo& operator=(const TrackingFrameInfo&) = default; + GPUhdDefault() TrackingFrameInfo& operator=(TrackingFrameInfo&&) = default; -struct TrackingFrameInfo { - TrackingFrameInfo() = default; - TrackingFrameInfo(float x, float y, float z, float xTF, float alpha, std::array&& posTF, std::array&& covTF); + GPUhd() void print() const; float xCoordinate{-999.f}; float yCoordinate{-999.f}; @@ -64,15 +81,8 @@ struct TrackingFrameInfo { float alphaTrackingFrame{-999.f}; std::array positionTrackingFrame = {-1., -1.}; std::array covarianceTrackingFrame = {999., 999., 999.}; - GPUdi() void print() const - { -#if !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT)) - printf("x: %f y: %f z: %f xTF: %f alphaTF: %f posTF: %f %f covTF: %f %f %f\n", - xCoordinate, yCoordinate, zCoordinate, xTrackingFrame, alphaTrackingFrame, - positionTrackingFrame[0], positionTrackingFrame[1], - covarianceTrackingFrame[0], covarianceTrackingFrame[1], covarianceTrackingFrame[2]); -#endif - } + + ClassDefNV(TrackingFrameInfo, 1); }; } // namespace o2::its diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Road.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Road.h index bc3786ba612b9..e9cd306e63bc5 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Road.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Road.h @@ -16,32 +16,31 @@ #ifndef TRACKINGCA_INCLUDE_ROAD_H #define TRACKINGCA_INCLUDE_ROAD_H -#ifndef GPUCA_GPUCODE_DEVICE -#include -#endif - #include "ITStracking/Constants.h" #include "GPUCommonDef.h" -namespace o2 -{ -namespace its +namespace o2::its { template class Road final { public: - GPUhd() Road() : mCellIds{}, mRoadSize{}, mIsFakeRoad{} { resetRoad(); } + GPUhdDefault() Road() = default; GPUhd() Road(int cellLayer, int cellId) : Road() { addCell(cellLayer, cellId); } - GPUhd() int getRoadSize() const; - int getLabel() const; - void setLabel(const int); - GPUhd() bool isFakeRoad() const; - void setFakeRoad(const bool); - GPUhd() int& operator[](const int&); - GPUhd() int operator[](const int&) const; + GPUhdDefault() Road(const Road&) = default; + GPUhdDefault() Road(Road&&) noexcept = default; + GPUhdDefault() ~Road() = default; + + GPUhdDefault() Road& operator=(const Road&) = default; + GPUhdDefault() Road& operator=(Road&&) noexcept = default; + + GPUhdi() uint8_t getRoadSize() const { return mRoadSize; } + GPUhdi() bool isFakeRoad() const { return mIsFakeRoad; } + GPUhdi() void setFakeRoad(const bool fake) { mIsFakeRoad = fake; } + GPUhdi() int& operator[](const int& i) { return mCellIds[i]; } + GPUhdi() int operator[](const int& i) const { return mCellIds[i]; } GPUhd() void resetRoad() { @@ -61,42 +60,12 @@ class Road final } private: - int mCellIds[maxRoadSize]; + int mCellIds[maxRoadSize]{constants::its::UnusedIndex}; // int mLabel; - unsigned char mRoadSize; - bool mIsFakeRoad; + unsigned char mRoadSize{0}; + bool mIsFakeRoad{false}; }; -template -GPUhdi() int Road::getRoadSize() const -{ - return mRoadSize; -} - -template -GPUhdi() int& Road::operator[](const int& i) -{ - return mCellIds[i]; -} +} // namespace o2::its -template -GPUhdi() int Road::operator[](const int& i) const -{ - return mCellIds[i]; -} - -template -GPUhdi() bool Road::isFakeRoad() const -{ - return mIsFakeRoad; -} - -template -inline void Road::setFakeRoad(const bool isFakeRoad) -{ - mIsFakeRoad = isFakeRoad; -} -} // namespace its -} // namespace o2 - -#endif \ No newline at end of file +#endif diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracklet.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracklet.h index 92984c9755ed4..e0ae23c8bedde 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracklet.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracklet.h @@ -13,11 +13,11 @@ /// \brief /// -#ifndef TRACKINGITSU_INCLUDE_TRACKLET_H_ -#define TRACKINGITSU_INCLUDE_TRACKLET_H_ +#ifndef TRACKINGITS_INCLUDE_TRACKLET_H_ +#define TRACKINGITS_INCLUDE_TRACKLET_H_ #include "ITStracking/Cluster.h" -#include +#include "GPUCommonRtypes.h" #include "GPUCommonMath.h" #include "GPUCommonDef.h" @@ -25,9 +25,7 @@ #include #endif -namespace o2 -{ -namespace its +namespace o2::its { struct Tracklet final { @@ -59,6 +57,8 @@ struct Tracklet final { float tanLambda; float phi; short rof[2]; + + ClassDefNV(Tracklet, 1); }; GPUhdi() Tracklet::Tracklet() : firstClusterIndex{-1}, secondClusterIndex{-1}, tanLambda{0.0f}, phi{0.0f} @@ -136,7 +136,6 @@ GPUhdi() void Tracklet::dump() const printf("fClIdx: %d sClIdx: %d rof1: %hu rof2: %hu\n", firstClusterIndex, secondClusterIndex, rof[0], rof[1]); } -} // namespace its -} // namespace o2 +} // namespace o2::its -#endif /* TRACKINGITSU_INCLUDE_TRACKLET_H_ */ +#endif /* TRACKINGITS_INCLUDE_TRACKLET_H_ */ diff --git a/Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx b/Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx index 6f7ed52b0c29e..beac55579656f 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Cluster.cxx @@ -66,28 +66,11 @@ Cluster::Cluster(const int layerIndex, const float3& primaryVertex, const IndexT // Nothing to do } -void Cluster::Init(const int layerIndex, const float3& primaryVertex, const IndexTableUtils& utils, const Cluster& other) +GPUhd() void Cluster::print() const { - xCoordinate = other.xCoordinate; - yCoordinate = other.yCoordinate; - zCoordinate = other.zCoordinate; - phi = getNormalizedPhi( - computePhi(xCoordinate - primaryVertex.x, yCoordinate - primaryVertex.y)); - radius = o2::gpu::GPUCommonMath::Hypot(xCoordinate - primaryVertex.x, yCoordinate - primaryVertex.y); - clusterId = other.clusterId; - indexTableBinIndex = utils.getBinIndex(utils.getZBinIndex(layerIndex, zCoordinate), - utils.getPhiBinIndex(phi)); -} - -bool Cluster::operator==(const Cluster& rhs) const -{ - return this->xCoordinate == rhs.xCoordinate && - this->yCoordinate == rhs.yCoordinate && - this->zCoordinate == rhs.zCoordinate && - this->phi == rhs.phi && - this->radius == rhs.radius && - this->clusterId == rhs.clusterId && - this->indexTableBinIndex == rhs.indexTableBinIndex; +#if !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT)) + printf("Cluster: %f %f %f %f %f %d %d\n", xCoordinate, yCoordinate, zCoordinate, phi, radius, clusterId, indexTableBinIndex); +#endif } TrackingFrameInfo::TrackingFrameInfo(float x, float y, float z, float xTF, float alpha, std::array&& posTF, @@ -96,3 +79,13 @@ TrackingFrameInfo::TrackingFrameInfo(float x, float y, float z, float xTF, float { // Nothing to do } + +GPUhd() void TrackingFrameInfo::print() const +{ +#if !defined(GPUCA_GPUCODE_DEVICE) || (!defined(__OPENCL__) && defined(GPUCA_GPU_DEBUG_PRINT)) + printf("x: %f y: %f z: %f xTF: %f alphaTF: %f posTF: %f %f covTF: %f %f %f\n", + xCoordinate, yCoordinate, zCoordinate, xTrackingFrame, alphaTrackingFrame, + positionTrackingFrame[0], positionTrackingFrame[1], + covarianceTrackingFrame[0], covarianceTrackingFrame[1], covarianceTrackingFrame[2]); +#endif +} diff --git a/Detectors/ITSMFT/ITS/tracking/src/Road.cxx b/Detectors/ITSMFT/ITS/tracking/src/Road.cxx deleted file mode 100644 index cb6cf47307398..0000000000000 --- a/Detectors/ITSMFT/ITS/tracking/src/Road.cxx +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -#include "ITStracking/Road.h" -namespace o2 -{ -namespace its -{ -} // namespace its -} // namespace o2 diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackingLinkDef.h b/Detectors/ITSMFT/ITS/tracking/src/TrackingLinkDef.h index b06a4fd7d7d62..2fe70e96248f9 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackingLinkDef.h +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackingLinkDef.h @@ -15,13 +15,19 @@ #pragma link off all classes; #pragma link off all functions; -#pragma link C++ class o2::its::ClusterLines + ; #pragma link C++ class o2::its::Tracklet + ; -#pragma link C++ class o2::its::Line + ; #pragma link C++ class std::vector < o2::its::Tracklet> + ; -#pragma link C++ class std::vector < o2::its::Line> + ; + #pragma link C++ class o2::its::Cluster + ; #pragma link C++ class std::vector < o2::its::Cluster> + ; + +#pragma link C++ class o2::its::TrackingFrameInfo + ; +#pragma link C++ class std::vector < o2::its::TrackingFrameInfo> + ; + +#pragma link C++ class o2::its::Line + ; +#pragma link C++ class std::vector < o2::its::Line> + ; + +#pragma link C++ class o2::its::ClusterLines + ; #pragma link C++ class std::vector < o2::its::ClusterLines> + ; #pragma link C++ class o2::its::VertexerParamConfig + ; From 2b04b46cc40d8420d20a2802f02ebcaa26596339 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Thu, 29 May 2025 13:41:02 +0200 Subject: [PATCH 5/5] ITS: avoid range checking Signed-off-by: Felix Schlepper --- .../ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index 69e9df74e1153..bdd8578e35d48 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -341,15 +341,15 @@ void TrackerTraits::computeLayerCells(const int iteration) mTimeFrame->getClusters()[iLayer][currentTracklet.firstClusterIndex].clusterId, mTimeFrame->getClusters()[iLayer + 1][nextTracklet.firstClusterIndex].clusterId, mTimeFrame->getClusters()[iLayer + 2][nextTracklet.secondClusterIndex].clusterId}; - const auto& cluster1_glo = mTimeFrame->getUnsortedClusters()[iLayer].at(clusId[0]); - const auto& cluster2_glo = mTimeFrame->getUnsortedClusters()[iLayer + 1].at(clusId[1]); - const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer + 2).at(clusId[2]); + const auto& cluster1_glo = mTimeFrame->getUnsortedClusters()[iLayer][clusId[0]]; + const auto& cluster2_glo = mTimeFrame->getUnsortedClusters()[iLayer + 1][clusId[1]]; + const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer + 2)[clusId[2]]; auto track{buildTrackSeed(cluster1_glo, cluster2_glo, cluster3_tf)}; float chi2{0.f}; bool good{false}; for (int iC{2}; iC--;) { - const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer + iC).at(clusId[iC]); + const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer + iC)[clusId[iC]]; if (!track.rotate(trackingHit.alphaTrackingFrame)) { break; @@ -423,15 +423,15 @@ void TrackerTraits::computeLayerCells(const int iteration) mTimeFrame->getClusters()[iLayer][currentTracklet.firstClusterIndex].clusterId, mTimeFrame->getClusters()[iLayer + 1][nextTracklet.firstClusterIndex].clusterId, mTimeFrame->getClusters()[iLayer + 2][nextTracklet.secondClusterIndex].clusterId}; - const auto& cluster1_glo = mTimeFrame->getUnsortedClusters()[iLayer].at(clusId[0]); - const auto& cluster2_glo = mTimeFrame->getUnsortedClusters()[iLayer + 1].at(clusId[1]); - const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer + 2).at(clusId[2]); + const auto& cluster1_glo = mTimeFrame->getUnsortedClusters()[iLayer][clusId[0]]; + const auto& cluster2_glo = mTimeFrame->getUnsortedClusters()[iLayer + 1][clusId[1]]; + const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer + 2)[clusId[2]]; auto track{buildTrackSeed(cluster1_glo, cluster2_glo, cluster3_tf)}; float chi2{0.f}; bool good{false}; for (int iC{2}; iC--;) { - const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer + iC).at(clusId[iC]); + const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer + iC)[clusId[iC]]; if (!track.rotate(trackingHit.alphaTrackingFrame)) { break; @@ -669,7 +669,7 @@ void TrackerTraits::processNeighbours(int iLayer, int iLevel, const bou } /// Let's start the fitting procedure CellSeed seed{currentCell}; - auto& trHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer - 1).at(neighbourCell.getFirstClusterIndex()); + auto& trHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer - 1)[neighbourCell.getFirstClusterIndex()]; if (!seed.rotate(trHit.alphaTrackingFrame)) { CA_DEBUGGER(failed[1]++); @@ -739,7 +739,7 @@ void TrackerTraits::processNeighbours(int iLayer, int iLevel, const bou auto seed = currentCell; - const auto& trHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer - 1).at(neighbourCell.getFirstClusterIndex()); + const auto& trHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer - 1)[neighbourCell.getFirstClusterIndex()]; if (!seed.rotate(trHit.alphaTrackingFrame) || !propagator->propagateToX(seed, trHit.xTrackingFrame, getBz(), o2::base::PropagatorImpl::MAX_SIN_PHI, o2::base::PropagatorImpl::MAX_STEP, mCorrType)) { continue; } @@ -1019,7 +1019,7 @@ void TrackerTraits::findShortPrimaries() auto pvs{mTimeFrame->getPrimaryVertices(rof)}; auto pvsXAlpha{mTimeFrame->getPrimaryVerticesXAlpha(rof)}; - const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(2).at(cluster3_glo.clusterId); + const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(2)[cluster3_glo.clusterId]; TrackITSExt temporaryTrack{buildTrackSeed(cluster1_glo, cluster2_glo, cluster3_tf)}; temporaryTrack.setExternalClusterIndex(0, cluster1_glo.clusterId, true); temporaryTrack.setExternalClusterIndex(1, cluster2_glo.clusterId, true); @@ -1085,7 +1085,7 @@ bool TrackerTraits::fitTrack(TrackITSExt& track, int start, int end, in if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { continue; } - const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer).at(track.getClusterIndex(iLayer)); + const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer)[track.getClusterIndex(iLayer)]; if (!track.rotate(trackingHit.alphaTrackingFrame)) { return false; @@ -1189,7 +1189,7 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool ou continue; } - const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer).at(nextCluster.clusterId); + const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer)[nextCluster.clusterId]; auto tbupdated{hypo}; auto& tbuParams = outward ? tbupdated.getParamOut() : tbupdated.getParamIn();