From 4f3ccc5f82cd04a6161d28dc3b82a84e603559c5 Mon Sep 17 00:00:00 2001 From: Matteo Concas Date: Mon, 11 Jul 2022 16:58:33 +0200 Subject: [PATCH 1/6] Remove stale files and memoryparameters struct --- Detectors/ITSMFT/ITS/tracking/CMakeLists.txt | 1 - .../GPU/ITStrackingGPU/TimeFrameGPU.h | 3 +- .../GPU/ITStrackingGPU/VertexerTraitsGPU.h | 2 +- .../ITS/tracking/GPU/cuda/TimeFrameGPU.cu | 3 +- .../tracking/GPU/cuda/VertexerTraitsGPU.cu | 4 +- .../include/ITStracking/Configuration.h | 8 - .../ITStracking/PrimaryVertexContext.h | 121 ------------- .../tracking/include/ITStracking/TimeFrame.h | 2 +- .../tracking/include/ITStracking/Tracker.h | 7 +- .../include/ITStracking/VertexerTraits.h | 6 +- Detectors/ITSMFT/ITS/tracking/src/IOUtils.cxx | 2 - .../ITS/tracking/src/PrimaryVertexContext.cxx | 165 ------------------ .../ITSMFT/ITS/tracking/src/TimeFrame.cxx | 2 +- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 4 +- .../ITSMFT/ITS/tracking/src/Vertexer.cxx | 11 +- .../ITSMFT/ITS/workflow/src/TrackerSpec.cxx | 7 +- 16 files changed, 15 insertions(+), 333 deletions(-) delete mode 100644 Detectors/ITSMFT/ITS/tracking/include/ITStracking/PrimaryVertexContext.h delete mode 100644 Detectors/ITSMFT/ITS/tracking/src/PrimaryVertexContext.cxx diff --git a/Detectors/ITSMFT/ITS/tracking/CMakeLists.txt b/Detectors/ITSMFT/ITS/tracking/CMakeLists.txt index c51dc7ec8d778..16a1595a2d6c5 100644 --- a/Detectors/ITSMFT/ITS/tracking/CMakeLists.txt +++ b/Detectors/ITSMFT/ITS/tracking/CMakeLists.txt @@ -17,7 +17,6 @@ o2_add_library(ITStracking src/TimeFrame.cxx src/IOUtils.cxx src/Label.cxx - src/PrimaryVertexContext.cxx src/Road.cxx src/Tracker.cxx src/TrackerTraits.cxx diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h b/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h index beba3ef3c5efa..f88211d3c33c7 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h +++ b/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h @@ -49,8 +49,7 @@ class TimeFrameGPU : public TimeFrame void checkBufferSizes(); void initialise(const int iteration, - const MemoryParameters& memParam, - const TrackingParameters& trkParam, + const TrackingParameters& trkParam, const int maxLayers); /// Getters float getDeviceMemory(); diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/VertexerTraitsGPU.h b/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/VertexerTraitsGPU.h index d44dffbe12ec0..a08a2bad61a41 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/VertexerTraitsGPU.h +++ b/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/VertexerTraitsGPU.h @@ -40,7 +40,7 @@ class VertexerTraitsGPU : public VertexerTraits public: VertexerTraitsGPU(); ~VertexerTraitsGPU() override; - void initialise(const MemoryParameters& memParams, const TrackingParameters& trackingParams) override; + void initialise(const TrackingParameters& trackingParams) override; void adoptTimeFrame(TimeFrame* tf) override; void computeTracklets() override; void computeTrackletMatching() override; diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TimeFrameGPU.cu b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TimeFrameGPU.cu index 0e9ea68fc0901..74668d006c4fe 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TimeFrameGPU.cu +++ b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TimeFrameGPU.cu @@ -144,11 +144,10 @@ void TimeFrameGPU::loadToDevice(const int maxLayers) template void TimeFrameGPU::initialise(const int iteration, - const MemoryParameters& memParam, const TrackingParameters& trkParam, const int maxLayers) { - o2::its::TimeFrame::initialise(iteration, memParam, trkParam, maxLayers); + o2::its::TimeFrame::initialise(iteration, trkParam, maxLayers); checkBufferSizes(); loadToDevice(maxLayers); } diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/VertexerTraitsGPU.cu b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/VertexerTraitsGPU.cu index fd2dab14f47af..68cac94936658 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/VertexerTraitsGPU.cu +++ b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/VertexerTraitsGPU.cu @@ -89,13 +89,13 @@ VertexerTraitsGPU::~VertexerTraitsGPU() gpu::utils::host::gpuFree(mDeviceIndexTableUtils); } -void VertexerTraitsGPU::initialise(const MemoryParameters& memParams, const TrackingParameters& trackingParams) +void VertexerTraitsGPU::initialise(const TrackingParameters& trackingParams) { if (!mIndexTableUtils.getNzBins()) { updateVertexingParameters(mVrtParams); } gpu::utils::host::gpuMemcpyHostToDevice(mDeviceIndexTableUtils, &mIndexTableUtils, sizeof(mIndexTableUtils)); - mTimeFrameGPU->initialise(0, memParams, trackingParams, 3); + mTimeFrameGPU->initialise(0, trackingParams, 3); setIsGPU(true); } diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h index c06dbefea5bba..96cdd862ec31f 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h @@ -85,14 +85,6 @@ struct TrackingParameters { bool FindShortTracks = false; }; -struct MemoryParameters { - /// Memory coefficients - MemoryParameters& operator=(const MemoryParameters& t) = default; - int MemoryOffset = 256; - std::vector CellsMemoryCoefficients = {2.3208e-08f, 2.104e-08f, 1.6432e-08f, 1.2412e-08f, 1.3543e-08f}; - std::vector TrackletsMemoryCoefficients = {0.0016353f, 0.0013627f, 0.000984f, 0.00078135f, 0.00057934f, 0.00052217f}; -}; - inline int TrackingParameters::CellMinimumLevel() { return MinTrackLength - constants::its::ClustersPerCell + 1; diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/PrimaryVertexContext.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/PrimaryVertexContext.h deleted file mode 100644 index 4338e08609cfa..0000000000000 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/PrimaryVertexContext.h +++ /dev/null @@ -1,121 +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. -/// -/// \file PrimaryVertexContext.h -/// \brief -/// - -#ifndef TRACKINGITSU_INCLUDE_PRIMARYVERTEXCONTEXT_H_ -#define TRACKINGITSU_INCLUDE_PRIMARYVERTEXCONTEXT_H_ - -#include -#include -#include -#include - -#include "ITStracking/Cell.h" -#include "ITStracking/Configuration.h" -#include "ITStracking/Constants.h" -#include "ITStracking/Definitions.h" -#include "ITStracking/IndexTableUtils.h" -#include "ITStracking/Road.h" -#include "ITStracking/Tracklet.h" - -namespace o2 -{ -namespace its -{ - -class PrimaryVertexContext -{ - public: - PrimaryVertexContext() = default; - - virtual ~PrimaryVertexContext() = default; - - PrimaryVertexContext(const PrimaryVertexContext&) = delete; - PrimaryVertexContext& operator=(const PrimaryVertexContext&) = delete; - - virtual void initialise(const MemoryParameters& memParam, const TrackingParameters& trkParam, - const std::vector>& cl, const std::array& pv, const int iteration); - const float3& getPrimaryVertex() const { return mPrimaryVertex; } - auto& getClusters() { return mClusters; } - auto& getCells() { return mCells; } - auto& getCellsLookupTable() { return mCellsLookupTable; } - auto& getCellsNeighbours() { return mCellsNeighbours; } - auto& getRoads() { return mRoads; } - - float getMinR(int layer) { return mMinR[layer]; } - float getMaxR(int layer) { return mMaxR[layer]; } - - bool isClusterUsed(int layer, int clusterId) const { return mUsedClusters[layer][clusterId]; } - void markUsedCluster(int layer, int clusterId); - - auto& getIndexTables() { return mIndexTables; } - auto& getTracklets() { return mTracklets; } - auto& getTrackletsLookupTable() { return mTrackletsLookupTable; } - - void initialiseRoadLabels(); - void setRoadLabel(int i, const unsigned long long& lab, bool fake); - const unsigned long long& getRoadLabel(int i) const; - bool isRoadFake(int i) const; - - IndexTableUtils mIndexTableUtils; - - protected: - float3 mPrimaryVertex; - std::vector mMinR; - std::vector mMaxR; - std::vector> mClusters; - std::vector> mUsedClusters; - std::vector> mCells; - std::vector> mCellsLookupTable; - std::vector>> mCellsNeighbours; - std::vector mRoads; - - // std::array, - // constants::its::TrackletsPerRoad> - std::vector> mIndexTables; - std::vector> mTracklets; - std::vector> mTrackletsLookupTable; - - std::vector> mRoadLabels; -}; - - -inline void PrimaryVertexContext::markUsedCluster(int layer, int clusterId) { mUsedClusters[layer][clusterId] = true; } - -inline void PrimaryVertexContext::initialiseRoadLabels() -{ - mRoadLabels.clear(); - mRoadLabels.resize(mRoads.size()); -} - -inline void PrimaryVertexContext::setRoadLabel(int i, const unsigned long long& lab, bool fake) -{ - mRoadLabels[i].first = lab; - mRoadLabels[i].second = fake; -} - -inline const unsigned long long& PrimaryVertexContext::getRoadLabel(int i) const -{ - return mRoadLabels[i].first; -} - -inline bool PrimaryVertexContext::isRoadFake(int i) const -{ - return mRoadLabels[i].second; -} - -} // namespace its -} // namespace o2 - -#endif /* TRACKINGITSU_INCLUDE_PRIMARYVERTEXCONTEXT_H_ */ diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TimeFrame.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TimeFrame.h index ba27b008d47c8..729af6d8b5924 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TimeFrame.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TimeFrame.h @@ -112,7 +112,7 @@ class TimeFrame std::vector& getCellsLabel(int layer) { return mCellLabels[layer]; } bool hasMCinformation() const; - void initialise(const int iteration, const MemoryParameters& memParam, const TrackingParameters& trkParam, const int maxLayers = 7); + void initialise(const int iteration, const TrackingParameters& trkParam, const int maxLayers = 7); bool isClusterUsed(int layer, int clusterId) const; void markUsedCluster(int layer, int clusterId); diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h index 0d7edf1cd6d39..a3921419f1e8c 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h @@ -73,7 +73,7 @@ class Tracker std::vector& getTracks(); void setCorrType(const o2::base::PropagatorImpl::MatCorrType& type) { mCorrType = type; } - void setParameters(const std::vector&, const std::vector&); + void setParameters(const std::vector&); void getGlobalConfiguration(); bool isMatLUT() const { return o2::base::Propagator::Instance()->getMatLUT() && (mCorrType == o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); } // GPU-specific interfaces @@ -106,11 +106,9 @@ class Tracker TrackerTraits* mTraits = nullptr; /// Observer pointer, not owned by this class TimeFrame* mTimeFrame = nullptr; /// Observer pointer, not owned by this class - std::vector mMemParams; std::vector mTrkParams; int mNThreads = 1; - bool mCUDA = false; bool mApplySmoothing = false; o2::base::PropagatorImpl::MatCorrType mCorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE; float mBz = 5.f; @@ -120,9 +118,8 @@ class Tracker unsigned int mNumberOfRuns{0}; }; -inline void Tracker::setParameters(const std::vector& memPars, const std::vector& trkPars) +inline void Tracker::setParameters(const std::vector& trkPars) { - mMemParams = memPars; mTrkParams = trkPars; } diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h index 8bbba3a2da837..56a56115e78be 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/VertexerTraits.h @@ -93,7 +93,7 @@ class VertexerTraits GPUhd() static const int2 getPhiBins(float phi, float deltaPhi, const IndexTableUtils&); // virtual vertexer interface - virtual void initialise(const MemoryParameters& memParams, const TrackingParameters& trackingParams); + virtual void initialise(const TrackingParameters& trackingParams); virtual void computeTracklets(); virtual void computeTrackletMatching(); // virtual void computeMCFiltering(); @@ -136,12 +136,12 @@ class VertexerTraits TimeFrame* mTimeFrame = nullptr; }; -inline void VertexerTraits::initialise(const MemoryParameters& memParams, const TrackingParameters& trackingParams) +inline void VertexerTraits::initialise(const TrackingParameters& trackingParams) { if (!mIndexTableUtils.getNzBins()) { updateVertexingParameters(mVrtParams); } - mTimeFrame->initialise(0, memParams, trackingParams, 3); + mTimeFrame->initialise(0, trackingParams, 3); setIsGPU(false); } diff --git a/Detectors/ITSMFT/ITS/tracking/src/IOUtils.cxx b/Detectors/ITSMFT/ITS/tracking/src/IOUtils.cxx index 390652695c511..df13fa89594f1 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/IOUtils.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/IOUtils.cxx @@ -44,8 +44,6 @@ namespace its void to_json(nlohmann::json& j, const TrackingParameters& par); void from_json(const nlohmann::json& j, TrackingParameters& par); -void to_json(nlohmann::json& j, const MemoryParameters& par); -void from_json(const nlohmann::json& j, MemoryParameters& par); /// convert compact clusters to 3D spacepoints void ioutils::convertCompactClusters(gsl::span clusters, diff --git a/Detectors/ITSMFT/ITS/tracking/src/PrimaryVertexContext.cxx b/Detectors/ITSMFT/ITS/tracking/src/PrimaryVertexContext.cxx deleted file mode 100644 index 22c259d7390fd..0000000000000 --- a/Detectors/ITSMFT/ITS/tracking/src/PrimaryVertexContext.cxx +++ /dev/null @@ -1,165 +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. -/// -/// \file PrimaryVertexContext.cxx -/// \brief -/// - -#include "ITStracking/PrimaryVertexContext.h" - -#include - -namespace o2 -{ -namespace its -{ - -void PrimaryVertexContext::initialise(const MemoryParameters& memParam, const TrackingParameters& trkParam, - const std::vector>& cl, const std::array& pVtx, const int iteration) -{ - - struct ClusterHelper { - float phi; - float r; - int bin; - int ind; - }; - - mPrimaryVertex = {pVtx[0], pVtx[1], pVtx[2]}; - - if (iteration == 0) { - - std::vector cHelper; - - mMinR.resize(trkParam.NLayers, 10000.); - mMaxR.resize(trkParam.NLayers, -1.); - mClusters.resize(trkParam.NLayers); - mUsedClusters.resize(trkParam.NLayers); - mCells.resize(trkParam.CellsPerRoad()); - mCellsLookupTable.resize(trkParam.CellsPerRoad() - 1); - mCellsNeighbours.resize(trkParam.CellsPerRoad() - 1); - mIndexTables.resize(trkParam.TrackletsPerRoad(), std::vector(trkParam.ZBins * trkParam.PhiBins + 1, 0)); - mTracklets.resize(trkParam.TrackletsPerRoad()); - mTrackletsLookupTable.resize(trkParam.CellsPerRoad()); - mIndexTableUtils.setTrackingParameters(trkParam); - - std::vector clsPerBin(trkParam.PhiBins * trkParam.ZBins, 0); - for (unsigned int iLayer{0}; iLayer < mClusters.size(); ++iLayer) { - - const auto& currentLayer{cl[iLayer]}; - const int clustersNum{static_cast(currentLayer.size())}; - - mClusters[iLayer].clear(); - mClusters[iLayer].resize(clustersNum); - mUsedClusters[iLayer].clear(); - mUsedClusters[iLayer].resize(clustersNum, false); - - std::fill(clsPerBin.begin(), clsPerBin.end(), 0); - - cHelper.clear(); - cHelper.resize(clustersNum); - - mMinR[iLayer] = 1000.f; - mMaxR[iLayer] = -1.f; - - for (int iCluster{0}; iCluster < clustersNum; ++iCluster) { - const Cluster& c = currentLayer[iCluster]; - ClusterHelper& h = cHelper[iCluster]; - float x = c.xCoordinate - mPrimaryVertex.x; - float y = c.yCoordinate - mPrimaryVertex.y; - float phi = math_utils::computePhi(x, y); - const int zBin{mIndexTableUtils.getZBinIndex(iLayer, c.zCoordinate)}; - int bin = mIndexTableUtils.getBinIndex(zBin, mIndexTableUtils.getPhiBinIndex(phi)); - CA_DEBUGGER(assert(zBin > 0)); - h.phi = phi; - h.r = std::hypot(x, y); - mMinR[iLayer] = o2::gpu::GPUCommonMath::Min(h.r, mMinR[iLayer]); - mMaxR[iLayer] = o2::gpu::GPUCommonMath::Max(h.r, mMaxR[iLayer]); - h.bin = bin; - h.ind = clsPerBin[bin]++; - } - - std::vector lutPerBin(clsPerBin.size()); - lutPerBin[0] = 0; - for (unsigned int iB{1}; iB < lutPerBin.size(); ++iB) { - lutPerBin[iB] = lutPerBin[iB - 1] + clsPerBin[iB - 1]; - } - - for (int iCluster{0}; iCluster < clustersNum; ++iCluster) { - ClusterHelper& h = cHelper[iCluster]; - Cluster& c = mClusters[iLayer][lutPerBin[h.bin] + h.ind]; - c = currentLayer[iCluster]; - c.phi = h.phi; - c.radius = h.r; - c.indexTableBinIndex = h.bin; - } - - if (iLayer > 0) { - for (unsigned int iB{0}; iB < clsPerBin.size(); ++iB) { - mIndexTables[iLayer - 1][iB] = lutPerBin[iB]; - } - for (auto iB{clsPerBin.size()}; iB < mIndexTables[iLayer - 1].size(); iB++) { - mIndexTables[iLayer - 1][iB] = clustersNum; - } - } - } - } - - mRoads.clear(); - - for (unsigned int iLayer{0}; iLayer < mClusters.size(); ++iLayer) { - if (iLayer < mCells.size()) { - mCells[iLayer].clear(); - float cellsMemorySize = - memParam.MemoryOffset + - std::ceil(((memParam.CellsMemoryCoefficients[iLayer] * cl[iLayer].size()) * - cl[iLayer + 1].size()) * - cl[iLayer + 2].size()); - - if (cellsMemorySize > mCells[iLayer].capacity()) { - mCells[iLayer].reserve(cellsMemorySize); - } - } - - if (iLayer < mCells.size() - 1) { - mCellsLookupTable[iLayer].clear(); - mCellsLookupTable[iLayer].resize(memParam.MemoryOffset + - std::max(cl[iLayer + 1].size(), cl[iLayer + 2].size()) + - std::ceil((memParam.TrackletsMemoryCoefficients[iLayer + 1] * - cl[iLayer + 1].size()) * - cl[iLayer + 2].size()), - constants::its::UnusedIndex); - mCellsNeighbours[iLayer].clear(); - } - } - - for (unsigned int iLayer{0}; iLayer < mClusters.size(); ++iLayer) { - if (iLayer < mTracklets.size()) { - mTracklets[iLayer].clear(); - float trackletsMemorySize = memParam.MemoryOffset + - std::max(cl[iLayer].size(), cl[iLayer + 1].size()) + - std::ceil((memParam.TrackletsMemoryCoefficients[iLayer] * cl[iLayer].size()) * - cl[iLayer + 1].size()); - - if (trackletsMemorySize > mTracklets[iLayer].capacity()) { - mTracklets[iLayer].reserve(trackletsMemorySize); - } - } - - if (iLayer < mCells.size()) { - mTrackletsLookupTable[iLayer].clear(); - mTrackletsLookupTable[iLayer].resize(cl[iLayer + 1].size(), constants::its::UnusedIndex); - } - } -} - -} // namespace its -} // namespace o2 diff --git a/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx b/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx index 28ae7d9ed194a..b61f73afa062a 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TimeFrame.cxx @@ -202,7 +202,7 @@ int TimeFrame::getTotalClusters() const return int(totalClusters); } -void TimeFrame::initialise(const int iteration, const MemoryParameters& memParam, const TrackingParameters& trkParam, const int maxLayers) +void TimeFrame::initialise(const int iteration, const TrackingParameters& trkParam, const int maxLayers) { if (iteration == 0) { mTracks.clear(); diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index 14a506e8f442f..efd96e5751d29 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -44,7 +44,6 @@ Tracker::Tracker(o2::its::TrackerTraits* traits) { /// Initialise standard configuration with 1 iteration mTrkParams.resize(1); - mMemParams.resize(1); mTraits = traits; } @@ -56,8 +55,7 @@ void Tracker::clustersToTracks(std::function logger, std::f for (int iteration = 0; iteration < (int)mTrkParams.size(); ++iteration) { mTraits->UpdateTrackingParameters(mTrkParams[iteration]); - total += evaluateTask(&Tracker::initialiseTimeFrame, "Timeframe initialisation", - logger, iteration, mMemParams[iteration], mTrkParams[iteration]); + total += evaluateTask(&Tracker::initialiseTimeFrame, "Timeframe initialisation", logger, iteration, mTrkParams[iteration]); total += evaluateTask(&Tracker::computeTracklets, "Tracklet finding", logger); logger(fmt::format("\t- Number of tracklets: {}", mTimeFrame->getNumberOfTracklets())); if (!mTimeFrame->checkMemory(mTrkParams[iteration].MaxMemory)) { diff --git a/Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx b/Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx index 0739ffe6997ca..c530f676a0dd8 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx @@ -40,12 +40,8 @@ float Vertexer::clustersToVertices(const bool useMc, std::functioncomputeVertices(); } -// void Vertexer::findHistVertices() -// { -// mTraits->computeHistVertices(); -// } - void Vertexer::getGlobalConfiguration() { auto& vc = o2::its::VertexerParamConfig::Instance(); diff --git a/Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx b/Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx index 5d5f1b005816a..7e7fb817142a2 100644 --- a/Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx +++ b/Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx @@ -66,7 +66,6 @@ void TrackerDPL::init(InitContext& ic) mRunVertexer = true; mCosmicsProcessing = false; std::vector trackParams; - std::vector memParams; if (mMode == "async") { @@ -76,7 +75,6 @@ void TrackerDPL::init(InitContext& ic) trackParams[2].TrackletMinPt = 0.1f; trackParams[2].CellDeltaTanLambdaSigma *= 4.; trackParams[2].MinTrackLength = 4; - memParams.resize(3); LOG(info) << "Initializing tracker in async. phase reconstruction with " << trackParams.size() << " passes"; } else if (mMode == "sync_misaligned") { @@ -98,18 +96,15 @@ void TrackerDPL::init(InitContext& ic) trackParams[2] = trackParams[0]; trackParams[1].MinTrackLength = 6; trackParams[2].MinTrackLength = 4; - memParams.resize(3); LOG(info) << "Initializing tracker in misaligned sync. phase reconstruction with " << trackParams.size() << " passes"; } else if (mMode == "sync") { - memParams.resize(1); trackParams.resize(1); LOG(info) << "Initializing tracker in sync. phase reconstruction with " << trackParams.size() << " passes"; } else if (mMode == "cosmics") { mCosmicsProcessing = true; mRunVertexer = false; trackParams.resize(1); - memParams.resize(1); trackParams[0].MinTrackLength = 4; trackParams[0].CellDeltaTanLambdaSigma *= 10; trackParams[0].PhiBins = 4; @@ -135,7 +130,7 @@ void TrackerDPL::init(InitContext& ic) for (auto& params : trackParams) { params.CorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT; } - mTracker->setParameters(memParams, trackParams); + mTracker->setParameters(trackParams); } void TrackerDPL::run(ProcessingContext& pc) From de9475ffb2c937f14ebba4b25bf54deaabd52ef7 Mon Sep 17 00:00:00 2001 From: Matteo Concas Date: Mon, 11 Jul 2022 19:05:32 +0200 Subject: [PATCH 2/6] Pass trackParams vector to traits rather than single instance --- .../GPU/ITStrackingGPU/TrackerTraitsGPU.h | 2 +- .../ITS/tracking/GPU/cuda/TrackerTraitsGPU.cu | 2 +- .../tracking/include/ITStracking/Tracker.h | 16 ++-- .../include/ITStracking/TrackerTraits.h | 23 +++-- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 57 +++--------- .../ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 89 +++++++++---------- 6 files changed, 76 insertions(+), 113 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TrackerTraitsGPU.h b/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TrackerTraitsGPU.h index 22366c5299a88..01c5675115621 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TrackerTraitsGPU.h +++ b/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TrackerTraitsGPU.h @@ -36,7 +36,7 @@ class TrackerTraitsGPU : public TrackerTraits ~TrackerTraitsGPU() override = default; // void computeLayerCells() final; - void computeLayerTracklets() final; + void computeLayerTracklets(const int iteration) final; // void refitTracks(const std::vector>& tf, std::vector& tracks) override; private: diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cu b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cu index b5133c790e771..a04e51dfcd69f 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cu +++ b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cu @@ -320,7 +320,7 @@ __constant__ StaticTrackingParameters<7> kTrkPar; // } template -void TrackerTraitsGPU::computeLayerTracklets() +void TrackerTraitsGPU::computeLayerTracklets(const int iteration) { // PrimaryVertexContextNV* primaryVertexContext = static_cast(nullptr); //TODO: FIX THIS with Time Frames diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h index a3921419f1e8c..bc6803382ee66 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h @@ -85,15 +85,14 @@ class Tracker private: track::TrackParCov buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, const Cluster& cluster3, const TrackingFrameInfo& tf3, float resolution); - template - void initialiseTimeFrame(T&&... args); - void computeTracklets(); - void computeCells(); + void initialiseTimeFrame(int& iteration); + void computeTracklets(int& iteration); + void computeCells(int& iteration); void findCellsNeighbours(int& iteration); void findRoads(int& iteration); void findTracks(); - void findShortPrimaries(); - void extendTracks(); + void findShortPrimaries(int& iteration); + void extendTracks(int& iteration); bool fitTrack(TrackITSExt& track, int start, int end, int step, const float chi2cut = o2::constants::math::VeryBig, const float maxQoverPt = o2::constants::math::VeryBig); void traverseCellsTree(const int, const int); void computeRoadsMClabels(); @@ -128,10 +127,9 @@ inline float Tracker::getBz() const return mBz; } -template -void Tracker::initialiseTimeFrame(T&&... args) +inline void Tracker::initialiseTimeFrame(int& iteration) { - mTimeFrame->initialise(std::forward(args)...); + mTimeFrame->initialise(iteration, mTrkParams[iteration]); } template diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h index 12c80f606ce35..d7c7f1f061ce2 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h @@ -62,30 +62,29 @@ class TrackerTraits mChain = chain; } - virtual void computeLayerTracklets(); - virtual void computeLayerCells(); - virtual void refitTracks(const std::vector>&, std::vector&); - virtual bool trackFollowing(TrackITSExt* track, int rof, bool outward); + virtual void computeLayerTracklets(const int iteration); + virtual void computeLayerCells(const int iteration); + virtual void refitTracks(const int iteration, const std::vector>&, std::vector&); + virtual bool trackFollowing(TrackITSExt* track, int rof, bool outward, const int iteration); - void UpdateTrackingParameters(const TrackingParameters& trkPar); + void UpdateTrackingParameters(const std::vector& trkPars); TimeFrame* getTimeFrame() { return mTimeFrame; } void adoptTimeFrame(TimeFrame* tf) { mTimeFrame = tf; } // GPU-specific interfaces - virtual TimeFrame* getTimeFrameGPU(); virtual void loadToDevice(){}; protected: TimeFrame* mTimeFrame; - TrackingParameters mTrkParams; + std::vector mTrkParams; o2::gpu::GPUChainITS* mChain = nullptr; FuncRunITSTrackFit_t mChainRunITSTrackFit; }; -inline void TrackerTraits::UpdateTrackingParameters(const TrackingParameters& trkPar) +inline void TrackerTraits::UpdateTrackingParameters(const std::vector& trkPars) { - mTrkParams = trkPar; + mTrkParams = trkPars; } inline const int4 TrackerTraits::getBinsRect(const int layerIndex, float phi, float maxdeltaphi, @@ -108,8 +107,8 @@ inline const int4 TrackerTraits::getBinsRect(const int layerIndex, float phi, fl const float zRangeMax = o2::gpu::GPUCommonMath::Max(z1, z2) + maxdeltaz; const float phiRangeMax = phi + maxdeltaphi; - if (zRangeMax < -mTrkParams.LayerZ[layerIndex + 1] || - zRangeMin > mTrkParams.LayerZ[layerIndex + 1] || zRangeMin > zRangeMax) { + if (zRangeMax < -mTrkParams[0].LayerZ[layerIndex + 1] || + zRangeMin > mTrkParams[0].LayerZ[layerIndex + 1] || zRangeMin > zRangeMax) { return getEmptyBinsRect(); } @@ -117,7 +116,7 @@ inline const int4 TrackerTraits::getBinsRect(const int layerIndex, float phi, fl const IndexTableUtils& utils{mTimeFrame->mIndexTableUtils}; return int4{o2::gpu::GPUCommonMath::Max(0, utils.getZBinIndex(layerIndex + 1, zRangeMin)), utils.getPhiBinIndex(math_utils::getNormalizedPhi(phiRangeMin)), - o2::gpu::GPUCommonMath::Min(mTrkParams.ZBins - 1, utils.getZBinIndex(layerIndex + 1, zRangeMax)), + o2::gpu::GPUCommonMath::Min(mTrkParams[0].ZBins - 1, utils.getZBinIndex(layerIndex + 1, zRangeMax)), // /!\ trkParams can potentially change across iterations utils.getPhiBinIndex(math_utils::getNormalizedPhi(phiRangeMax))}; } } // namespace its diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index efd96e5751d29..caace2862d780 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -52,11 +52,10 @@ Tracker::~Tracker() = default; void Tracker::clustersToTracks(std::function logger, std::function error) { double total{0}; + mTraits->UpdateTrackingParameters(mTrkParams); for (int iteration = 0; iteration < (int)mTrkParams.size(); ++iteration) { - mTraits->UpdateTrackingParameters(mTrkParams[iteration]); - - total += evaluateTask(&Tracker::initialiseTimeFrame, "Timeframe initialisation", logger, iteration, mTrkParams[iteration]); - total += evaluateTask(&Tracker::computeTracklets, "Tracklet finding", logger); + total += evaluateTask(&Tracker::initialiseTimeFrame, "Timeframe initialisation", logger, iteration); + total += evaluateTask(&Tracker::computeTracklets, "Tracklet finding", logger, iteration); logger(fmt::format("\t- Number of tracklets: {}", mTimeFrame->getNumberOfTracklets())); if (!mTimeFrame->checkMemory(mTrkParams[iteration].MaxMemory)) { error("Too much memory used during trackleting, check the detector status and/or the selections."); @@ -68,7 +67,7 @@ void Tracker::clustersToTracks(std::function logger, std::f break; } - total += evaluateTask(&Tracker::computeCells, "Cell finding", logger); + total += evaluateTask(&Tracker::computeCells, "Cell finding", logger, iteration); logger(fmt::format("\t- Number of Cells: {}", mTimeFrame->getNumberOfCells())); if (!mTimeFrame->checkMemory(mTrkParams[iteration].MaxMemory)) { error("Too much memory used during cell finding, check the detector status and/or the selections."); @@ -84,7 +83,7 @@ void Tracker::clustersToTracks(std::function logger, std::f total += evaluateTask(&Tracker::findRoads, "Road finding", logger, iteration); logger(fmt::format("\t- Number of Roads: {}", mTimeFrame->getRoads().size())); total += evaluateTask(&Tracker::findTracks, "Track finding", logger); - total += evaluateTask(&Tracker::extendTracks, "Extending tracks", logger); + total += evaluateTask(&Tracker::extendTracks, "Extending tracks", logger, iteration); } total += evaluateTask(&Tracker::findShortPrimaries, "Short primaries finding", logger); @@ -104,46 +103,14 @@ void Tracker::clustersToTracks(std::function logger, std::f mNumberOfRuns++; } -void Tracker::clustersToTracksGPU(std::function logger) -{ - double total{0}; - for (int iteration = 0; iteration < mTrkParams.size(); ++iteration) { - mTraits->UpdateTrackingParameters(mTrkParams[iteration]); - total += evaluateTask(&Tracker::loadToDevice, "Device loading", logger); - total += evaluateTask(&Tracker::computeTracklets, "Tracklet finding", logger); - // total += evaluateTask(&Tracker::computeCells, "Cell finding", logger); - // total += evaluateTask(&Tracker::findCellsNeighbours, "Neighbour finding", logger, iteration); - // total += evaluateTask(&Tracker::findRoads, "Road finding", logger, iteration); - // total += evaluateTask(&Tracker::findTracks, "Track finding", logger); - // total += evaluateTask(&Tracker::extendTracks, "Extending tracks", logger); - } - - std::stringstream sstream; - if (constants::DoTimeBenchmarks) { - sstream << std::setw(2) << " - " - << "Timeframe " << mTimeFrameCounter++ << " GPU processing completed in: " << total << "ms"; - } - logger(sstream.str()); - - // if (mTimeFrame->hasMCinformation()) { - // computeTracksMClabels(); - // } - // rectifyClusterIndices(); -} - -void Tracker::computeTracklets() -{ - mTraits->computeLayerTracklets(); -} - -void Tracker::computeCells() +void Tracker::computeTracklets(int& iteration) { - mTraits->computeLayerCells(); + mTraits->computeLayerTracklets(iteration); } -TimeFrame* Tracker::getTimeFrameGPU() +void Tracker::computeCells(int& iteration) { - return (TimeFrame*)mTraits->getTimeFrameGPU(); + mTraits->computeLayerCells(iteration); } void Tracker::loadToDevice() @@ -415,7 +382,7 @@ void Tracker::findTracks() } } -void Tracker::extendTracks() +void Tracker::extendTracks(int& iteration) { if (!mTrkParams.back().UseTrackFollower) { return; @@ -427,10 +394,10 @@ void Tracker::extendTracks() auto backup{track}; bool success{false}; if (track.getLastClusterLayer() != mTrkParams[0].NLayers - 1) { - success = success || mTraits->trackFollowing(&track, rof, true); + success = success || mTraits->trackFollowing(&track, rof, true, iteration); } if (track.getFirstClusterLayer() != 0) { - success = success || mTraits->trackFollowing(&track, rof, false); + success = success || mTraits->trackFollowing(&track, rof, false, iteration); } if (success) { /// We have to refit the track diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index f228f5f825198..427ce6d352ac9 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -46,27 +46,27 @@ namespace its constexpr int debugLevel{0}; -void TrackerTraits::computeLayerTracklets() +void TrackerTraits::computeLayerTracklets(const int iteration) { TimeFrame* tf = mTimeFrame; #ifdef OPTIMISATION_OUTPUT - static int iteration{0}; - std::ofstream off(fmt::format("tracklets{}.txt", iteration++)); + static int iter{0}; + std::ofstream off(fmt::format("tracklets{}.txt", iter++)); #endif - const Vertex diamondVert({mTrkParams.Diamond[0], mTrkParams.Diamond[1], mTrkParams.Diamond[2]}, {25.e-6f, 0.f, 0.f, 25.e-6f, 0.f, 36.f}, 1, 1.f); + const Vertex diamondVert({mTrkParams[iteration].Diamond[0], mTrkParams[iteration].Diamond[1], mTrkParams[iteration].Diamond[2]}, {25.e-6f, 0.f, 0.f, 25.e-6f, 0.f, 36.f}, 1, 1.f); gsl::span diamondSpan(&diamondVert, 1); for (int rof0{0}; rof0 < tf->getNrof(); ++rof0) { - gsl::span primaryVertices = mTrkParams.UseDiamond ? diamondSpan : tf->getPrimaryVertices(rof0); - int minRof = (rof0 >= mTrkParams.DeltaROF) ? rof0 - mTrkParams.DeltaROF : 0; - int maxRof = (rof0 == tf->getNrof() - mTrkParams.DeltaROF) ? rof0 : rof0 + mTrkParams.DeltaROF; - for (int iLayer{0}; iLayer < mTrkParams.TrackletsPerRoad(); ++iLayer) { + gsl::span primaryVertices = mTrkParams[iteration].UseDiamond ? diamondSpan : tf->getPrimaryVertices(rof0); + int minRof = (rof0 >= mTrkParams[iteration].DeltaROF) ? rof0 - mTrkParams[iteration].DeltaROF : 0; + int maxRof = (rof0 == tf->getNrof() - mTrkParams[iteration].DeltaROF) ? rof0 : rof0 + mTrkParams[iteration].DeltaROF; + for (int iLayer{0}; iLayer < mTrkParams[iteration].TrackletsPerRoad(); ++iLayer) { gsl::span layer0 = tf->getClustersOnLayer(rof0, iLayer); if (layer0.empty()) { continue; } - float meanDeltaR{mTrkParams.LayerRadii[iLayer + 1] - mTrkParams.LayerRadii[iLayer]}; + float meanDeltaR{mTrkParams[iteration].LayerRadii[iLayer + 1] - mTrkParams[iteration].LayerRadii[iLayer]}; const int currentLayerClustersNum{static_cast(layer0.size())}; for (int iCluster{0}; iCluster < currentLayerClustersNum; ++iCluster) { @@ -79,7 +79,7 @@ void TrackerTraits::computeLayerTracklets() const float inverseR0{1.f / currentCluster.radius}; for (auto& primaryVertex : primaryVertices) { - const float resolution = std::sqrt(Sq(mTrkParams.PVres) / primaryVertex.getNContributors() + Sq(tf->getPositionResolution(iLayer))); + const float resolution = std::sqrt(Sq(mTrkParams[iteration].PVres) / primaryVertex.getNContributors() + Sq(tf->getPositionResolution(iLayer))); const float tanLambda{(currentCluster.zCoordinate - primaryVertex.getZ()) * inverseR0}; @@ -90,7 +90,7 @@ void TrackerTraits::computeLayerTracklets() const float sigmaZ{std::sqrt(Sq(resolution) * Sq(tanLambda) * ((Sq(inverseR0) + sqInverseDeltaZ0) * Sq(meanDeltaR) + 1.f) + Sq(meanDeltaR * tf->getMSangle(iLayer)))}; const int4 selectedBinsRect{getBinsRect(currentCluster, iLayer, zAtRmin, zAtRmax, - sigmaZ * mTrkParams.NSigmaCut, tf->getPhiCut(iLayer))}; + sigmaZ * mTrkParams[iteration].NSigmaCut, tf->getPhiCut(iLayer))}; if (selectedBinsRect.x == 0 && selectedBinsRect.y == 0 && selectedBinsRect.z == 0 && selectedBinsRect.w == 0) { continue; @@ -99,7 +99,7 @@ void TrackerTraits::computeLayerTracklets() int phiBinsNum{selectedBinsRect.w - selectedBinsRect.y + 1}; if (phiBinsNum < 0) { - phiBinsNum += mTrkParams.PhiBins; + phiBinsNum += mTrkParams[iteration].PhiBins; } for (int rof1{minRof}; rof1 <= maxRof; ++rof1) { @@ -109,13 +109,13 @@ void TrackerTraits::computeLayerTracklets() } for (int iPhiCount{0}; iPhiCount < phiBinsNum; iPhiCount++) { - int iPhiBin = (selectedBinsRect.y + iPhiCount) % mTrkParams.PhiBins; + int iPhiBin = (selectedBinsRect.y + iPhiCount) % mTrkParams[iteration].PhiBins; const int firstBinIndex{tf->mIndexTableUtils.getBinIndex(selectedBinsRect.x, iPhiBin)}; const int maxBinIndex{firstBinIndex + selectedBinsRect.z - selectedBinsRect.x + 1}; if constexpr (debugLevel) { if (firstBinIndex < 0 || firstBinIndex > tf->getIndexTable(rof1, iLayer + 1).size() || maxBinIndex < 0 || maxBinIndex > tf->getIndexTable(rof1, iLayer + 1).size()) { - std::cout << iLayer << "\t" << iCluster << "\t" << zAtRmin << "\t" << zAtRmax << "\t" << sigmaZ * mTrkParams.NSigmaCut << "\t" << tf->getPhiCut(iLayer) << std::endl; + std::cout << iLayer << "\t" << iCluster << "\t" << zAtRmin << "\t" << zAtRmax << "\t" << sigmaZ * mTrkParams[iteration].NSigmaCut << "\t" << tf->getPhiCut(iLayer) << std::endl; std::cout << currentCluster.zCoordinate << "\t" << primaryVertex.getZ() << "\t" << currentCluster.radius << std::endl; std::cout << tf->getMinR(iLayer + 1) << "\t" << currentCluster.radius << "\t" << currentCluster.zCoordinate << std::endl; std::cout << "Illegal access to IndexTable " << firstBinIndex << "\t" << maxBinIndex << "\t" << selectedBinsRect.z << "\t" << selectedBinsRect.x << std::endl; @@ -157,7 +157,7 @@ void TrackerTraits::computeLayerTracklets() off << fmt::format("{}\t{:d}\t{}\t{}\t{}\t{}", iLayer, label.isValid(), (tanLambda * (nextCluster.radius - currentCluster.radius) + currentCluster.zCoordinate - nextCluster.zCoordinate) / sigmaZ, tanLambda, resolution, sigmaZ) << std::endl; #endif - if (deltaZ / sigmaZ < mTrkParams.NSigmaCut && + if (deltaZ / sigmaZ < mTrkParams[iteration].NSigmaCut && (deltaPhi < tf->getPhiCut(iLayer) || gpu::GPUCommonMath::Abs(deltaPhi - constants::math::TwoPi) < tf->getPhiCut(iLayer))) { if (iLayer > 0) { @@ -174,14 +174,14 @@ void TrackerTraits::computeLayerTracklets() } } } - if (!tf->checkMemory(mTrkParams.MaxMemory)) { + if (!tf->checkMemory(mTrkParams[iteration].MaxMemory)) { return; } } } /// Cold code, fixups - for (int iLayer{0}; iLayer < mTrkParams.CellsPerRoad(); ++iLayer) { + for (int iLayer{0}; iLayer < mTrkParams[iteration].CellsPerRoad(); ++iLayer) { /// Sort tracklets auto& trkl{tf->getTracklets()[iLayer + 1]}; std::sort(trkl.begin(), trkl.end(), [](const Tracklet& a, const Tracklet& b) { @@ -225,7 +225,7 @@ void TrackerTraits::computeLayerTracklets() /// Create tracklets labels if (tf->hasMCinformation()) { - for (int iLayer{0}; iLayer < mTrkParams.TrackletsPerRoad(); ++iLayer) { + for (int iLayer{0}; iLayer < mTrkParams[iteration].TrackletsPerRoad(); ++iLayer) { for (auto& trk : tf->getTracklets()[iLayer]) { MCCompLabel label; int currentId{tf->getClusters()[iLayer][trk.firstClusterIndex].clusterId}; @@ -247,23 +247,23 @@ void TrackerTraits::computeLayerTracklets() } } -void TrackerTraits::computeLayerCells() +void TrackerTraits::computeLayerCells(const int iteration) { #ifdef OPTIMISATION_OUTPUT - static int iteration{0}; - std::ofstream off(fmt::format("cells{}.txt", iteration++)); + static int iter{0}; + std::ofstream off(fmt::format("cells{}.txt", iter++)); #endif TimeFrame* tf = mTimeFrame; - for (int iLayer{0}; iLayer < mTrkParams.CellsPerRoad(); ++iLayer) { + for (int iLayer{0}; iLayer < mTrkParams[iteration].CellsPerRoad(); ++iLayer) { if (tf->getTracklets()[iLayer + 1].empty() || tf->getTracklets()[iLayer].empty()) { continue; } - float resolution{std::sqrt(Sq(mTrkParams.LayerMisalignment[iLayer]) + Sq(mTrkParams.LayerMisalignment[iLayer + 1]) + Sq(mTrkParams.LayerMisalignment[iLayer + 2])) / mTrkParams.LayerResolution[iLayer]}; + float resolution{std::sqrt(Sq(mTrkParams[iteration].LayerMisalignment[iLayer]) + Sq(mTrkParams[iteration].LayerMisalignment[iLayer + 1]) + Sq(mTrkParams[iteration].LayerMisalignment[iLayer + 2])) / mTrkParams[iteration].LayerResolution[iLayer]}; resolution = resolution > 1.e-12 ? resolution : 1.f; const int currentLayerTrackletsNum{static_cast(tf->getTracklets()[iLayer].size())}; @@ -292,10 +292,10 @@ void TrackerTraits::computeLayerCells() #ifdef OPTIMISATION_OUTPUT bool good{tf->getTrackletsLabel(iLayer)[iTracklet] == tf->getTrackletsLabel(iLayer + 1)[iNextTracklet]}; float signedDelta{currentTracklet.tanLambda - nextTracklet.tanLambda}; - off << fmt::format("{}\t{:d}\t{}\t{}\t{}\t{}", iLayer, good, signedDelta, signedDelta / (mTrkParams.CellDeltaTanLambdaSigma), tanLambda, resolution) << std::endl; + off << fmt::format("{}\t{:d}\t{}\t{}\t{}\t{}", iLayer, good, signedDelta, signedDelta / (mTrkParams[iteration].CellDeltaTanLambdaSigma), tanLambda, resolution) << std::endl; #endif - if (deltaTanLambda / mTrkParams.CellDeltaTanLambdaSigma < mTrkParams.NSigmaCut) { + if (deltaTanLambda / mTrkParams[iteration].CellDeltaTanLambdaSigma < mTrkParams[iteration].NSigmaCut) { if (iLayer > 0 && (int)tf->getCellsLookupTable()[iLayer - 1].size() <= iTracklet) { tf->getCellsLookupTable()[iLayer - 1].resize(iTracklet + 1, tf->getCells()[iLayer].size()); @@ -310,14 +310,14 @@ void TrackerTraits::computeLayerCells() if (iLayer > 0) { tf->getCellsLookupTable()[iLayer - 1].resize(currentLayerTrackletsNum + 1, tf->getCells()[iLayer].size()); } - if (!tf->checkMemory(mTrkParams.MaxMemory)) { + if (!tf->checkMemory(mTrkParams[iteration].MaxMemory)) { return; } } /// Create cells labels if (tf->hasMCinformation()) { - for (int iLayer{0}; iLayer < mTrkParams.CellsPerRoad(); ++iLayer) { + for (int iLayer{0}; iLayer < mTrkParams[iteration].CellsPerRoad(); ++iLayer) { for (auto& cell : tf->getCells()[iLayer]) { MCCompLabel currentLab{tf->getTrackletsLabel(iLayer)[cell.getFirstTrackletIndex()]}; MCCompLabel nextLab{tf->getTrackletsLabel(iLayer + 1)[cell.getSecondTrackletIndex()]}; @@ -327,36 +327,36 @@ void TrackerTraits::computeLayerCells() } if constexpr (debugLevel) { - for (int iLayer{0}; iLayer < mTrkParams.CellsPerRoad(); ++iLayer) { + for (int iLayer{0}; iLayer < mTrkParams[iteration].CellsPerRoad(); ++iLayer) { std::cout << "Cells on layer " << iLayer << " " << tf->getCells()[iLayer].size() << std::endl; } } } -void TrackerTraits::refitTracks(const std::vector>& tf, std::vector& tracks) +void TrackerTraits::refitTracks(const int iteration, const std::vector>& tf, std::vector& tracks) { std::vector cells; - for (int iLayer = 0; iLayer < mTrkParams.CellsPerRoad(); iLayer++) { + for (int iLayer = 0; iLayer < mTrkParams[iteration].CellsPerRoad(); iLayer++) { cells.push_back(mTimeFrame->getCells()[iLayer].data()); } std::vector clusters; - for (int iLayer = 0; iLayer < mTrkParams.NLayers; iLayer++) { + for (int iLayer = 0; iLayer < mTrkParams[iteration].NLayers; iLayer++) { clusters.push_back(mTimeFrame->getClusters()[iLayer].data()); } mChainRunITSTrackFit(*mChain, mTimeFrame->getRoads(), clusters, cells, tf, tracks); } -bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward) +bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward, const int iteration) { auto propInstance = o2::base::Propagator::Instance(); const int step = -1 + outward * 2; - const int end = outward ? mTrkParams.NLayers - 1 : 0; + const int end = outward ? mTrkParams[iteration].NLayers - 1 : 0; std::vector hypotheses(1, *track); for (auto& hypo : hypotheses) { int iLayer = outward ? track->getLastClusterLayer() : track->getFirstClusterLayer(); while (iLayer != end) { iLayer += step; - const float& r = mTrkParams.LayerRadii[iLayer]; + const float& r = mTrkParams[iteration].LayerRadii[iLayer]; float x; if (!hypo.getXatLabR(r, x, mTimeFrame->getBz(), o2::track::DirAuto)) { continue; @@ -364,14 +364,14 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward) bool success{false}; auto& hypoParam{outward ? hypo.getParamOut() : hypo.getParamIn()}; if (!propInstance->propagateToX(hypoParam, x, mTimeFrame->getBz(), PropagatorF::MAX_SIN_PHI, - PropagatorF::MAX_STEP, mTrkParams.CorrType)) { + PropagatorF::MAX_STEP, mTrkParams[iteration].CorrType)) { continue; } - if (mTrkParams.CorrType == PropagatorF::MatCorrType::USEMatCorrNONE) { + if (mTrkParams[iteration].CorrType == PropagatorF::MatCorrType::USEMatCorrNONE) { float radl = 9.36f; // Radiation length of Si [cm] float rho = 2.33f; // Density of Si [g/cm^3] - if (!hypoParam.correctForMaterial(mTrkParams.LayerxX0[iLayer], mTrkParams.LayerxX0[iLayer] * radl * rho, true)) { + if (!hypoParam.correctForMaterial(mTrkParams[iteration].LayerxX0[iLayer], mTrkParams[iteration].LayerxX0[iLayer] * radl * rho, true)) { continue; } } @@ -379,7 +379,7 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward) const float ePhi{std::sqrt(hypoParam.getSigmaSnp2() / hypoParam.getCsp2())}; const float z{hypoParam.getZ()}; const float eZ{std::sqrt(hypoParam.getSigmaZ2())}; - const int4 selectedBinsRect{getBinsRect(iLayer, phi, mTrkParams.NSigmaCut * ePhi, z, mTrkParams.NSigmaCut * eZ)}; + const int4 selectedBinsRect{getBinsRect(iLayer, phi, mTrkParams[iteration].NSigmaCut * ePhi, z, mTrkParams[iteration].NSigmaCut * eZ)}; if (selectedBinsRect.x == 0 && selectedBinsRect.y == 0 && selectedBinsRect.z == 0 && selectedBinsRect.w == 0) { continue; @@ -388,7 +388,7 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward) int phiBinsNum{selectedBinsRect.w - selectedBinsRect.y + 1}; if (phiBinsNum < 0) { - phiBinsNum += mTrkParams.PhiBins; + phiBinsNum += mTrkParams[iteration].PhiBins; } gsl::span layer1 = mTimeFrame->getClustersOnLayer(rof, iLayer); @@ -399,7 +399,7 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward) TrackITSExt currentHypo{hypo}, newHypo{hypo}; bool first{true}; for (int iPhiCount{0}; iPhiCount < phiBinsNum; iPhiCount++) { - int iPhiBin = (selectedBinsRect.y + iPhiCount) % mTrkParams.PhiBins; + int iPhiBin = (selectedBinsRect.y + iPhiCount) % mTrkParams[iteration].PhiBins; const int firstBinIndex{mTimeFrame->mIndexTableUtils.getBinIndex(selectedBinsRect.x, iPhiBin)}; const int maxBinIndex{firstBinIndex + selectedBinsRect.z - selectedBinsRect.x + 1}; const int firstRowClusterIndex = mTimeFrame->getIndexTable(rof, iLayer)[firstBinIndex]; @@ -429,10 +429,10 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward) } GPUArray cov{trackingHit.covarianceTrackingFrame}; - cov[0] = std::hypot(cov[0], mTrkParams.LayerMisalignment[iLayer]); - cov[2] = std::hypot(cov[2], mTrkParams.LayerMisalignment[iLayer]); + cov[0] = std::hypot(cov[0], mTrkParams[iteration].LayerMisalignment[iLayer]); + cov[2] = std::hypot(cov[2], mTrkParams[iteration].LayerMisalignment[iLayer]); auto predChi2{tbuParams.getPredictedChi2(trackingHit.positionTrackingFrame, cov)}; - if (predChi2 >= track->getChi2() * mTrkParams.NSigmaCut) { + if (predChi2 >= track->getChi2() * mTrkParams[iteration].NSigmaCut) { continue; } @@ -455,7 +455,7 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward) TrackITSExt* bestHypo{track}; bool swapped{false}; for (auto& hypo : hypotheses) { - if (hypo.isBetter(*bestHypo, track->getChi2() * mTrkParams.NSigmaCut)) { + if (hypo.isBetter(*bestHypo, track->getChi2() * mTrkParams[iteration].NSigmaCut)) { bestHypo = &hypo; swapped = true; } @@ -464,6 +464,5 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward) return swapped; } -TimeFrame* TrackerTraits::getTimeFrameGPU() { return nullptr; } } // namespace its } // namespace o2 From 50783d13c90e9073bd7d67fb2c24ef1f585bb9b7 Mon Sep 17 00:00:00 2001 From: Matteo Concas Date: Mon, 11 Jul 2022 22:10:27 +0200 Subject: [PATCH 3/6] Move core tracking functions to traits --- .../GPU/ITStrackingGPU/TimeFrameGPU.h | 2 +- .../tracking/include/ITStracking/Tracker.h | 34 +- .../include/ITStracking/TrackerTraits.h | 51 +- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 527 +----------------- .../ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 508 +++++++++++++++++ macro/run_trac_ca_its.C | 6 +- 6 files changed, 575 insertions(+), 553 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h b/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h index f88211d3c33c7..5abf07d4cbd9d 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h +++ b/Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TimeFrameGPU.h @@ -49,7 +49,7 @@ class TimeFrameGPU : public TimeFrame void checkBufferSizes(); void initialise(const int iteration, - const TrackingParameters& trkParam, + const TrackingParameters& trkParam, const int maxLayers); /// Getters float getDeviceMemory(); diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h index bc6803382ee66..d5cebd60c2487 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h @@ -27,12 +27,10 @@ #include #include "ITStracking/Configuration.h" -#include "DetectorsBase/MatLayerCylSet.h" #include "CommonConstants/MathConstants.h" #include "ITStracking/Definitions.h" #include "ITStracking/ROframe.h" #include "ITStracking/MathUtils.h" -#include "DetectorsBase/Propagator.h" #include "ITStracking/TimeFrame.h" #include "ITStracking/Road.h" @@ -61,40 +59,30 @@ class Tracker ~Tracker(); void adoptTimeFrame(TimeFrame& tf); - void setBz(float bz); - float getBz() const; void clustersToTracks( std::function = [](std::string s) { std::cout << s << std::endl; }, std::function = [](std::string s) { std::cerr << s << std::endl; }); - void clustersToTracksGPU(std::function = [](std::string s) { std::cout << s << std::endl; }); - void setSmoothing(bool v) { mApplySmoothing = v; } - bool getSmoothing() const { return mApplySmoothing; } - std::vector& getTracks(); - void setCorrType(const o2::base::PropagatorImpl::MatCorrType& type) { mCorrType = type; } void setParameters(const std::vector&); void getGlobalConfiguration(); - bool isMatLUT() const { return o2::base::Propagator::Instance()->getMatLUT() && (mCorrType == o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); } - // GPU-specific interfaces - TimeFrame* getTimeFrameGPU(); - void loadToDevice(); + void setBz(float); + void setCorrType(const o2::base::PropagatorImpl::MatCorrType& type); + bool isMatLUT() const; void setNThreads(int n); int getNThreads() const { return mNThreads; } private: - track::TrackParCov buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, const Cluster& cluster3, - const TrackingFrameInfo& tf3, float resolution); void initialiseTimeFrame(int& iteration); void computeTracklets(int& iteration); void computeCells(int& iteration); void findCellsNeighbours(int& iteration); void findRoads(int& iteration); - void findTracks(); void findShortPrimaries(int& iteration); + void findTracks(int& iteration); void extendTracks(int& iteration); - bool fitTrack(TrackITSExt& track, int start, int end, int step, const float chi2cut = o2::constants::math::VeryBig, const float maxQoverPt = o2::constants::math::VeryBig); - void traverseCellsTree(const int, const int); + + // MC interaction void computeRoadsMClabels(); void computeTracksMClabels(); void rectifyClusterIndices(); @@ -106,11 +94,6 @@ class Tracker TimeFrame* mTimeFrame = nullptr; /// Observer pointer, not owned by this class std::vector mTrkParams; - - int mNThreads = 1; - bool mApplySmoothing = false; - o2::base::PropagatorImpl::MatCorrType mCorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE; - float mBz = 5.f; std::uint32_t mTimeFrameCounter = 0; o2::gpu::GPUChainITS* mRecoChain = nullptr; @@ -122,11 +105,6 @@ inline void Tracker::setParameters(const std::vector& trkPar mTrkParams = trkPars; } -inline float Tracker::getBz() const -{ - return mBz; -} - inline void Tracker::initialiseTimeFrame(int& iteration) { mTimeFrame->initialise(iteration, mTrkParams[iteration]); diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h index d7c7f1f061ce2..16894de062425 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h @@ -26,6 +26,8 @@ #include #include +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/MatLayerCylSet.h" #include "ITStracking/Configuration.h" #include "ITStracking/Definitions.h" #include "ITStracking/MathUtils.h" @@ -50,29 +52,45 @@ class TrackerTraits { public: virtual ~TrackerTraits() = default; + virtual void computeLayerTracklets(const int iteration); + virtual void computeLayerCells(const int iteration); + virtual void findCellsNeighbours(const int iteration); + virtual void findRoads(const int iteration); + virtual void findTracks(const int iteration); + virtual void extendTracks(const int iteration); + virtual void findShortPrimaries(); + virtual void refitTracks(const int iteration, const std::vector>&, std::vector&); + virtual bool trackFollowing(TrackITSExt* track, int rof, bool outward, const int iteration); + void UpdateTrackingParameters(const std::vector& trkPars); + TimeFrame* getTimeFrame() { return mTimeFrame; } + void adoptTimeFrame(TimeFrame* tf) { mTimeFrame = tf; } + void setBz(float bz); + float getBz() const; + void setCorrType(const o2::base::PropagatorImpl::MatCorrType& type) { mCorrType = type; } + bool isMatLUT() const; + + // Others GPUhd() static constexpr int4 getEmptyBinsRect() { return int4{0, 0, 0, 0}; } const int4 getBinsRect(const Cluster&, int layer, float z1, float z2, float maxdeltaz, float maxdeltaphi); const int4 getBinsRect(int layer, float phi, float maxdeltaphi, float z, float maxdeltaz); const int4 getBinsRect(int layer, float phi, float maxdeltaphi, float z1, float z2, float maxdeltaz); - void SetRecoChain(o2::gpu::GPUChainITS* chain, FuncRunITSTrackFit_t&& funcRunITSTrackFit) { mChainRunITSTrackFit = funcRunITSTrackFit; mChain = chain; } + void setSmoothing(bool v) { mApplySmoothing = v; } + bool getSmoothing() const { return mApplySmoothing; } - virtual void computeLayerTracklets(const int iteration); - virtual void computeLayerCells(const int iteration); - virtual void refitTracks(const int iteration, const std::vector>&, std::vector&); - virtual bool trackFollowing(TrackITSExt* track, int rof, bool outward, const int iteration); - - void UpdateTrackingParameters(const std::vector& trkPars); - TimeFrame* getTimeFrame() { return mTimeFrame; } - void adoptTimeFrame(TimeFrame* tf) { mTimeFrame = tf; } + private: + void traverseCellsTree(const int, const int); + track::TrackParCov buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, const Cluster& cluster3, const TrackingFrameInfo& tf3, float resolution); + bool fitTrack(TrackITSExt& track, int start, int end, int step, const float chi2cut = o2::constants::math::VeryBig, const float maxQoverPt = o2::constants::math::VeryBig); - // GPU-specific interfaces - virtual void loadToDevice(){}; + bool mApplySmoothing = false; + o2::base::PropagatorImpl::MatCorrType mCorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE; + float mBz = 5.f; protected: TimeFrame* mTimeFrame; @@ -82,19 +100,22 @@ class TrackerTraits FuncRunITSTrackFit_t mChainRunITSTrackFit; }; +inline float TrackerTraits::getBz() const +{ + return mBz; +} + inline void TrackerTraits::UpdateTrackingParameters(const std::vector& trkPars) { mTrkParams = trkPars; } -inline const int4 TrackerTraits::getBinsRect(const int layerIndex, float phi, float maxdeltaphi, - float z, float maxdeltaz) +inline const int4 TrackerTraits::getBinsRect(const int layerIndex, float phi, float maxdeltaphi, float z, float maxdeltaz) { return getBinsRect(layerIndex, phi, maxdeltaphi, z, z, maxdeltaz); } -inline const int4 TrackerTraits::getBinsRect(const Cluster& currentCluster, int layerIndex, - float z1, float z2, float maxdeltaz, float maxdeltaphi) +inline const int4 TrackerTraits::getBinsRect(const Cluster& currentCluster, int layerIndex, float z1, float z2, float maxdeltaz, float maxdeltaphi) { return getBinsRect(layerIndex, currentCluster.phi, maxdeltaphi, z1, z2, maxdeltaz); } diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index caace2862d780..dd59594fedfce 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -82,12 +82,12 @@ void Tracker::clustersToTracks(std::function logger, std::f total += evaluateTask(&Tracker::findCellsNeighbours, "Neighbour finding", logger, iteration); total += evaluateTask(&Tracker::findRoads, "Road finding", logger, iteration); logger(fmt::format("\t- Number of Roads: {}", mTimeFrame->getRoads().size())); - total += evaluateTask(&Tracker::findTracks, "Track finding", logger); + total += evaluateTask(&Tracker::findTracks, "Track finding", logger, iteration); total += evaluateTask(&Tracker::extendTracks, "Extending tracks", logger, iteration); } total += evaluateTask(&Tracker::findShortPrimaries, "Short primaries finding", logger); - ///TODO: Add desperate tracking, aka the extension of short primaries to recover holes in layer 3 + /// TODO: Add desperate tracking, aka the extension of short primaries to recover holes in layer 3 std::stringstream sstream; if (constants::DoTimeBenchmarks) { @@ -113,481 +113,29 @@ void Tracker::computeCells(int& iteration) mTraits->computeLayerCells(iteration); } -void Tracker::loadToDevice() -{ - mTraits->loadToDevice(); -} - void Tracker::findCellsNeighbours(int& iteration) { -#ifdef OPTIMISATION_OUTPUT - std::ofstream off(fmt::format("cellneighs{}.txt", iteration)); -#endif - for (int iLayer{0}; iLayer < mTrkParams[iteration].CellsPerRoad() - 1; ++iLayer) { - - if (mTimeFrame->getCells()[iLayer + 1].empty() || - mTimeFrame->getCellsLookupTable()[iLayer].empty()) { - continue; - } - - int layerCellsNum{static_cast(mTimeFrame->getCells()[iLayer].size())}; - const int nextLayerCellsNum{static_cast(mTimeFrame->getCells()[iLayer + 1].size())}; - mTimeFrame->getCellsNeighbours()[iLayer].resize(nextLayerCellsNum); - - for (int iCell{0}; iCell < layerCellsNum; ++iCell) { - - const Cell& currentCell{mTimeFrame->getCells()[iLayer][iCell]}; - const int nextLayerTrackletIndex{currentCell.getSecondTrackletIndex()}; - const int nextLayerFirstCellIndex{mTimeFrame->getCellsLookupTable()[iLayer][nextLayerTrackletIndex]}; - const int nextLayerLastCellIndex{mTimeFrame->getCellsLookupTable()[iLayer][nextLayerTrackletIndex + 1]}; - for (int iNextCell{nextLayerFirstCellIndex}; iNextCell < nextLayerLastCellIndex; ++iNextCell) { - - Cell& nextCell{mTimeFrame->getCells()[iLayer + 1][iNextCell]}; - if (nextCell.getFirstTrackletIndex() != nextLayerTrackletIndex) { - break; - } - -#ifdef OPTIMISATION_OUTPUT - bool good{mTimeFrame->getCellsLabel(iLayer)[iCell] == mTimeFrame->getCellsLabel(iLayer + 1)[iNextCell]}; - float signedDelta{currentCell.getTanLambda() - nextCell.getTanLambda()}; - off << fmt::format("{}\t{:d}\t{}\t{}", iLayer, good, signedDelta, signedDelta / mTrkParams[iteration].CellDeltaTanLambdaSigma) << std::endl; -#endif - mTimeFrame->getCellsNeighbours()[iLayer][iNextCell].push_back(iCell); - - const int currentCellLevel{currentCell.getLevel()}; - - if (currentCellLevel >= nextCell.getLevel()) { - nextCell.setLevel(currentCellLevel + 1); - } - // } - } - } - } + mTraits->findCellsNeighbours(iteration); } void Tracker::findRoads(int& iteration) { - for (int iLevel{mTrkParams[iteration].CellsPerRoad()}; iLevel >= mTrkParams[iteration].CellMinimumLevel(); --iLevel) { - CA_DEBUGGER(int nRoads = -mTimeFrame->getRoads().size()); - const int minimumLevel{iLevel - 1}; - - for (int iLayer{mTrkParams[iteration].CellsPerRoad() - 1}; iLayer >= minimumLevel; --iLayer) { - - const int levelCellsNum{static_cast(mTimeFrame->getCells()[iLayer].size())}; - - for (int iCell{0}; iCell < levelCellsNum; ++iCell) { - - Cell& currentCell{mTimeFrame->getCells()[iLayer][iCell]}; - - if (currentCell.getLevel() != iLevel) { - continue; - } - - mTimeFrame->getRoads().emplace_back(iLayer, iCell); - - /// For 3 clusters roads (useful for cascades and hypertriton) we just store the single cell - /// and we do not do the candidate tree traversal - if (iLevel == 1) { - continue; - } - - const int cellNeighboursNum{static_cast( - mTimeFrame->getCellsNeighbours()[iLayer - 1][iCell].size())}; - bool isFirstValidNeighbour = true; - - for (int iNeighbourCell{0}; iNeighbourCell < cellNeighboursNum; ++iNeighbourCell) { - - const int neighbourCellId = mTimeFrame->getCellsNeighbours()[iLayer - 1][iCell][iNeighbourCell]; - const Cell& neighbourCell = mTimeFrame->getCells()[iLayer - 1][neighbourCellId]; - - if (iLevel - 1 != neighbourCell.getLevel()) { - continue; - } - - if (isFirstValidNeighbour) { - - isFirstValidNeighbour = false; - - } else { - - mTimeFrame->getRoads().emplace_back(iLayer, iCell); - } - - traverseCellsTree(neighbourCellId, iLayer - 1); - } - - // TODO: crosscheck for short track iterations - // currentCell.setLevel(0); - } - } -#ifdef CA_DEBUG - nRoads += mTimeFrame->getRoads().size(); - std::cout << "+++ Roads with " << iLevel + 2 << " clusters: " << nRoads << " / " << mTimeFrame->getRoads().size() << std::endl; -#endif - } + mTraits->findRoads(iteration); } -void Tracker::findTracks() +void Tracker::findTracks(int& iteration) { - std::vector> tracks(mNThreads); - for (auto& tracksV : tracks) { - tracksV.reserve(mTimeFrame->getRoads().size() / mNThreads); - } - -#pragma omp parallel for num_threads(mNThreads) - for (auto& road : mTimeFrame->getRoads()) { - std::vector clusters(mTrkParams[0].NLayers, constants::its::UnusedIndex); - int lastCellLevel = constants::its::UnusedIndex; - CA_DEBUGGER(int nClusters = 2); - int firstTracklet{constants::its::UnusedIndex}; - std::vector tracklets(mTrkParams[0].TrackletsPerRoad(), constants::its::UnusedIndex); - - for (int iCell{0}; iCell < mTrkParams[0].CellsPerRoad(); ++iCell) { - const int cellIndex = road[iCell]; - if (cellIndex == constants::its::UnusedIndex) { - continue; - } else { - if (firstTracklet == constants::its::UnusedIndex) { - firstTracklet = iCell; - } - tracklets[iCell] = mTimeFrame->getCells()[iCell][cellIndex].getFirstTrackletIndex(); - tracklets[iCell + 1] = mTimeFrame->getCells()[iCell][cellIndex].getSecondTrackletIndex(); - clusters[iCell] = mTimeFrame->getCells()[iCell][cellIndex].getFirstClusterIndex(); - clusters[iCell + 1] = mTimeFrame->getCells()[iCell][cellIndex].getSecondClusterIndex(); - clusters[iCell + 2] = mTimeFrame->getCells()[iCell][cellIndex].getThirdClusterIndex(); - assert(clusters[iCell] != constants::its::UnusedIndex && - clusters[iCell + 1] != constants::its::UnusedIndex && - clusters[iCell + 2] != constants::its::UnusedIndex); - lastCellLevel = iCell; - CA_DEBUGGER(nClusters++); - } - } - - CA_DEBUGGER(assert(nClusters >= mTrkParams[0].MinTrackLength)); - int count{1}; - unsigned short rof{mTimeFrame->getTracklets()[firstTracklet][tracklets[firstTracklet]].rof[0]}; - for (int iT = firstTracklet; iT < 6; ++iT) { - if (tracklets[iT] == constants::its::UnusedIndex) { - continue; - } - if (rof == mTimeFrame->getTracklets()[iT][tracklets[iT]].rof[1]) { - count++; - } else { - if (count == 1) { - rof = mTimeFrame->getTracklets()[iT][tracklets[iT]].rof[1]; - } else { - count--; - } - } - } - - CA_DEBUGGER(assert(nClusters >= mTrkParams[0].MinTrackLength)); - CA_DEBUGGER(roadCounters[nClusters - 4]++); - - if (lastCellLevel == constants::its::UnusedIndex) { - continue; - } - - /// From primary vertex context index to event index (== the one used as input of the tracking code) - for (size_t iC{0}; iC < clusters.size(); iC++) { - if (clusters[iC] != constants::its::UnusedIndex) { - clusters[iC] = mTimeFrame->getClusters()[iC][clusters[iC]].clusterId; - } - } - - /// Track seed preparation. Clusters are numbered progressively from the outermost to the innermost. - const auto& cluster1_glo = mTimeFrame->getUnsortedClusters()[lastCellLevel + 2].at(clusters[lastCellLevel + 2]); - const auto& cluster2_glo = mTimeFrame->getUnsortedClusters()[lastCellLevel + 1].at(clusters[lastCellLevel + 1]); - const auto& cluster3_glo = mTimeFrame->getUnsortedClusters()[lastCellLevel].at(clusters[lastCellLevel]); - - const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(lastCellLevel).at(clusters[lastCellLevel]); - - /// FIXME! - TrackITSExt temporaryTrack{buildTrackSeed(cluster1_glo, cluster2_glo, cluster3_glo, cluster3_tf, mTimeFrame->getPositionResolution(lastCellLevel))}; - for (size_t iC = 0; iC < clusters.size(); ++iC) { - temporaryTrack.setExternalClusterIndex(iC, clusters[iC], clusters[iC] != constants::its::UnusedIndex); - } - bool fitSuccess = fitTrack(temporaryTrack, mTrkParams[0].NLayers - 4, -1, -1); - if (!fitSuccess) { - continue; - } - CA_DEBUGGER(fitCounters[nClusters - 4]++); - temporaryTrack.resetCovariance(); - fitSuccess = fitTrack(temporaryTrack, 0, mTrkParams[0].NLayers, 1, mTrkParams[0].FitIterationMaxChi2[0]); - if (!fitSuccess) { - continue; - } - CA_DEBUGGER(backpropagatedCounters[nClusters - 4]++); - temporaryTrack.getParamOut() = temporaryTrack; - temporaryTrack.resetCovariance(); - fitSuccess = fitTrack(temporaryTrack, mTrkParams[0].NLayers - 1, -1, -1, mTrkParams[0].FitIterationMaxChi2[1], 50.); - if (!fitSuccess) { - continue; - } - // temporaryTrack.setROFrame(rof); -#ifdef WITH_OPENMP - int iThread = omp_get_thread_num(); -#else - int iThread = 0; -#endif - tracks[iThread].emplace_back(temporaryTrack); - } - - for (int iV{1}; iV < mNThreads; ++iV) { - tracks[0].insert(tracks[0].end(), tracks[iV].begin(), tracks[iV].end()); - } - - if (mApplySmoothing) { - // Smoothing tracks - } - std::sort(tracks[0].begin(), tracks[0].end(), - [](TrackITSExt& track1, TrackITSExt& track2) { return track1.isBetter(track2, 1.e6f); }); - - for (auto& track : tracks[0]) { - int nShared = 0; - for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { - if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { - continue; - } - nShared += int(mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer))); - } - - if (nShared > mTrkParams[0].ClusterSharing) { - continue; - } - - std::array rofs{INT_MAX, INT_MAX, INT_MAX}; - for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { - if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { - continue; - } - mTimeFrame->markUsedCluster(iLayer, track.getClusterIndex(iLayer)); - int currentROF = mTimeFrame->getClusterROF(iLayer, track.getClusterIndex(iLayer)); - for (int iR{0}; iR < 3; ++iR) { - if (rofs[iR] == INT_MAX) { - rofs[iR] = currentROF; - } - if (rofs[iR] == currentROF) { - break; - } - } - } - if (rofs[2] != INT_MAX) { - continue; - } - if (rofs[1] != INT_MAX) { - track.setNextROFbit(); - } - mTimeFrame->getTracks(std::min(rofs[0], rofs[1])).emplace_back(track); - } + mTraits->findTracks(iteration); } void Tracker::extendTracks(int& iteration) { - if (!mTrkParams.back().UseTrackFollower) { - return; - } - for (int rof{0}; rof < mTimeFrame->getNrof(); ++rof) { - for (auto& track : mTimeFrame->getTracks(rof)) { - /// TODO: track refitting is missing! - int ncl{track.getNClusters()}; - auto backup{track}; - bool success{false}; - if (track.getLastClusterLayer() != mTrkParams[0].NLayers - 1) { - success = success || mTraits->trackFollowing(&track, rof, true, iteration); - } - if (track.getFirstClusterLayer() != 0) { - success = success || mTraits->trackFollowing(&track, rof, false, iteration); - } - if (success) { - /// We have to refit the track - track.resetCovariance(); - bool fitSuccess = fitTrack(track, 0, mTrkParams[0].NLayers, 1, mTrkParams[0].FitIterationMaxChi2[0]); - if (!fitSuccess) { - track = backup; - continue; - } - track.getParamOut() = track; - track.resetCovariance(); - fitSuccess = fitTrack(track, mTrkParams[0].NLayers - 1, -1, -1, mTrkParams[0].FitIterationMaxChi2[1], 50.); - if (!fitSuccess) { - track = backup; - continue; - } - /// Make sure that the newly attached clusters get marked as used - for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { - if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { - continue; - } - mTimeFrame->markUsedCluster(iLayer, track.getClusterIndex(iLayer)); - } - } - } - } + mTraits->extendTracks(iteration); } void Tracker::findShortPrimaries() { - if (!mTrkParams[0].FindShortTracks) { - return; - } - auto propagator = o2::base::Propagator::Instance(); - mTimeFrame->fillPrimaryVerticesXandAlpha(); - - for (auto& cell : mTimeFrame->getCells()[0]) { - auto& cluster1_glo = mTimeFrame->getClusters()[2][cell.getThirdClusterIndex()]; - auto& cluster2_glo = mTimeFrame->getClusters()[1][cell.getSecondClusterIndex()]; - auto& cluster3_glo = mTimeFrame->getClusters()[0][cell.getFirstClusterIndex()]; - if (mTimeFrame->isClusterUsed(0, cluster1_glo.clusterId) || - mTimeFrame->isClusterUsed(1, cluster2_glo.clusterId) || - mTimeFrame->isClusterUsed(2, cluster3_glo.clusterId)) { - continue; - } - - std::array rofs{ - mTimeFrame->getClusterROF(0, cluster3_glo.clusterId), - mTimeFrame->getClusterROF(1, cluster2_glo.clusterId), - mTimeFrame->getClusterROF(2, cluster1_glo.clusterId)}; - if (rofs[0] != rofs[1] && rofs[1] != rofs[2] && rofs[0] != rofs[2]) { - continue; - } - - int rof{rofs[0]}; - if (rofs[1] == rofs[2]) { - rof = rofs[2]; - } - - auto pvs{mTimeFrame->getPrimaryVertices(rof)}; - auto pvsXAlpha{mTimeFrame->getPrimaryVerticesXAlpha(rof)}; - - const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(0).at(cluster3_glo.clusterId); - TrackITSExt temporaryTrack{buildTrackSeed(cluster1_glo, cluster2_glo, cluster3_glo, cluster3_tf, mTimeFrame->getPositionResolution(0))}; - temporaryTrack.setExternalClusterIndex(0, cluster3_glo.clusterId, true); - temporaryTrack.setExternalClusterIndex(1, cluster2_glo.clusterId, true); - temporaryTrack.setExternalClusterIndex(2, cluster1_glo.clusterId, true); - - /// add propagation to the primary vertices compatible with the ROF(s) of the cell - bool fitSuccess{false}; - - TrackITSExt bestTrack{temporaryTrack}, backup{temporaryTrack}; - float bestChi2{std::numeric_limits::max()}; - for (int iV{0}; iV < (int)pvs.size(); ++iV) { - temporaryTrack = backup; - if (!temporaryTrack.rotate(pvsXAlpha[iV][1])) { - continue; - } - if (!propagator->propagateTo(temporaryTrack, pvsXAlpha[iV][0], true)) { - continue; - } - - float pvRes{mTrkParams[0].PVres / std::sqrt(float(pvs[iV].getNContributors()))}; - const float posVtx[2]{0.f, pvs[iV].getZ()}; - const float covVtx[3]{pvRes, 0.f, pvRes}; - float chi2 = temporaryTrack.getPredictedChi2(posVtx, covVtx); - if (chi2 < bestChi2) { - if (!temporaryTrack.track::TrackParCov::update(posVtx, covVtx)) { - continue; - } - bestTrack = temporaryTrack; - bestChi2 = chi2; - } - } - - bestTrack.resetCovariance(); - fitSuccess = fitTrack(bestTrack, 0, mTrkParams[0].NLayers, 1, mTrkParams[0].FitIterationMaxChi2[0]); - if (!fitSuccess) { - continue; - } - bestTrack.getParamOut() = bestTrack; - bestTrack.resetCovariance(); - fitSuccess = fitTrack(bestTrack, mTrkParams[0].NLayers - 1, -1, -1, mTrkParams[0].FitIterationMaxChi2[1], 50.); - if (!fitSuccess) { - continue; - } - mTimeFrame->markUsedCluster(0, bestTrack.getClusterIndex(0)); - mTimeFrame->markUsedCluster(1, bestTrack.getClusterIndex(1)); - mTimeFrame->markUsedCluster(2, bestTrack.getClusterIndex(2)); - mTimeFrame->getTracks(rof).emplace_back(bestTrack); - } -} - -bool Tracker::fitTrack(TrackITSExt& track, int start, int end, int step, const float chi2cut, const float maxQoverPt) -{ - auto propInstance = o2::base::Propagator::Instance(); - track.setChi2(0); - int nCl{0}; - for (int iLayer{start}; iLayer != end; iLayer += step) { - if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { - continue; - } - const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer).at(track.getClusterIndex(iLayer)); - - if (!track.rotate(trackingHit.alphaTrackingFrame)) { - return false; - } - - if (!propInstance->propagateToX(track, trackingHit.xTrackingFrame, getBz(), o2::base::PropagatorImpl::MAX_SIN_PHI, o2::base::PropagatorImpl::MAX_STEP, mCorrType)) { - return false; - } - - if (mCorrType == o2::base::PropagatorF::MatCorrType::USEMatCorrNONE) { - float radl = 9.36f; // Radiation length of Si [cm] - float rho = 2.33f; // Density of Si [g/cm^3] - if (!track.correctForMaterial(mTrkParams[0].LayerxX0[iLayer], mTrkParams[0].LayerxX0[iLayer] * radl * rho, true)) { - continue; - } - } - - GPUArray cov{trackingHit.covarianceTrackingFrame}; - cov[0] = std::hypot(cov[0], mTrkParams[0].LayerMisalignment[iLayer]); - cov[2] = std::hypot(cov[2], mTrkParams[0].LayerMisalignment[iLayer]); - auto predChi2{track.getPredictedChi2(trackingHit.positionTrackingFrame, cov)}; - if (nCl >= 3 && predChi2 > chi2cut * (nCl * 2 - 5)) { - return false; - } - track.setChi2(track.getChi2() + predChi2); - if (!track.o2::track::TrackParCov::update(trackingHit.positionTrackingFrame, cov)) { - return false; - } - nCl++; - } - return std::abs(track.getQ2Pt()) < maxQoverPt; -} - -void Tracker::traverseCellsTree(const int currentCellId, const int currentLayerId) -{ - Cell& currentCell{mTimeFrame->getCells()[currentLayerId][currentCellId]}; - const int currentCellLevel = currentCell.getLevel(); - - mTimeFrame->getRoads().back().addCell(currentLayerId, currentCellId); - - if (currentLayerId > 0 && currentCellLevel > 1) { - const int cellNeighboursNum{static_cast( - mTimeFrame->getCellsNeighbours()[currentLayerId - 1][currentCellId].size())}; - bool isFirstValidNeighbour = true; - - for (int iNeighbourCell{0}; iNeighbourCell < cellNeighboursNum; ++iNeighbourCell) { - - const int neighbourCellId = - mTimeFrame->getCellsNeighbours()[currentLayerId - 1][currentCellId][iNeighbourCell]; - const Cell& neighbourCell = mTimeFrame->getCells()[currentLayerId - 1][neighbourCellId]; - - if (currentCellLevel - 1 != neighbourCell.getLevel()) { - continue; - } - - if (isFirstValidNeighbour) { - isFirstValidNeighbour = false; - } else { - mTimeFrame->getRoads().push_back(mTimeFrame->getRoads().back()); - } - - traverseCellsTree(neighbourCellId, currentLayerId - 1); - } - } - - // TODO: crosscheck for short track iterations - // currentCell.setLevel(0); + mTraits->findShortPrimaries(); } void Tracker::computeRoadsMClabels() @@ -696,7 +244,6 @@ void Tracker::computeRoadsMClabels() void Tracker::computeTracksMClabels() { - for (int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) { for (auto& track : mTimeFrame->getTracks(iROF)) { std::vector> occurrences; @@ -767,56 +314,19 @@ void Tracker::rectifyClusterIndices() } } -/// Clusters are given from outside inward (cluster1 is the outermost). The innermost cluster is given in the tracking -/// frame coordinates -/// whereas the others are referred to the global frame. This function is almost a clone of CookSeed, adapted to return -/// a TrackParCov -track::TrackParCov Tracker::buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, - const Cluster& cluster3, const TrackingFrameInfo& tf3, float resolution) -{ - const float ca = std::cos(tf3.alphaTrackingFrame), sa = std::sin(tf3.alphaTrackingFrame); - const float x1 = cluster1.xCoordinate * ca + cluster1.yCoordinate * sa; - const float y1 = -cluster1.xCoordinate * sa + cluster1.yCoordinate * ca; - const float z1 = cluster1.zCoordinate; - const float x2 = cluster2.xCoordinate * ca + cluster2.yCoordinate * sa; - const float y2 = -cluster2.xCoordinate * sa + cluster2.yCoordinate * ca; - const float z2 = cluster2.zCoordinate; - const float x3 = tf3.xTrackingFrame; - const float y3 = tf3.positionTrackingFrame[0]; - const float z3 = tf3.positionTrackingFrame[1]; - - const float crv = math_utils::computeCurvature(x1, y1, x2, y2, x3, y3); - const float x0 = math_utils::computeCurvatureCentreX(x1, y1, x2, y2, x3, y3); - 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 fy = 1. / (cluster2.radius - cluster3.radius); - const float& tz = fy; - float cy = 1.e15f; - if (std::abs(getBz()) > o2::constants::math::Almost0) { - cy = (math_utils::computeCurvature(x1, y1, x2, y2 + resolution, x3, y3) - crv) / - (resolution * getBz() * o2::constants::math::B2C) * - 20.f; // FIXME: MS contribution to the cov[14] (*20 added) - } - const float s2 = resolution; - - return track::TrackParCov(tf3.xTrackingFrame, tf3.alphaTrackingFrame, - {y3, z3, crv * (x3 - x0), 0.5f * (tgl12 + tgl23), - std::abs(getBz()) < o2::constants::math::Almost0 ? 1.f / o2::track::kMostProbablePt - : crv / (getBz() * o2::constants::math::B2C)}, - {s2, 0.f, s2, s2 * fy, 0.f, s2 * fy * fy, 0.f, s2 * tz, 0.f, s2 * tz * tz, s2 * cy, 0.f, - s2 * fy * cy, 0.f, s2 * cy * cy}); -} - void Tracker::getGlobalConfiguration() { auto& tc = o2::its::TrackerParamConfig::Instance(); if (tc.useMatCorrTGeo) { +<<<<<<< HEAD setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrTGeo); } else if (tc.useFastMaterial) { setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE); } else { setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); +======= + mTraits->setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrTGeo); +>>>>>>> Move core tracking functions to traits } setNThreads(tc.nThreads); for (auto& params : mTrkParams) { @@ -861,8 +371,17 @@ void Tracker::adoptTimeFrame(TimeFrame& tf) void Tracker::setBz(float bz) { - mBz = bz; - mTimeFrame->setBz(bz); + mTraits->setBz(bz); +} + +void Tracker::setCorrType(const o2::base::PropagatorImpl::MatCorrType& type) +{ + mTraits->setCorrType(type); +} + +bool Tracker::isMatLUT() const +{ + return mTraits->isMatLUT(); } void Tracker::setNThreads(int n) diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index 427ce6d352ac9..93862c4bc50b1 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -333,6 +333,430 @@ void TrackerTraits::computeLayerCells(const int iteration) } } +void TrackerTraits::findCellsNeighbours(const int iteration) +{ +#ifdef OPTIMISATION_OUTPUT + std::ofstream off(fmt::format("cellneighs{}.txt", iteration)); +#endif + for (int iLayer{0}; iLayer < mTrkParams[iteration].CellsPerRoad() - 1; ++iLayer) { + + if (mTimeFrame->getCells()[iLayer + 1].empty() || + mTimeFrame->getCellsLookupTable()[iLayer].empty()) { + continue; + } + + int layerCellsNum{static_cast(mTimeFrame->getCells()[iLayer].size())}; + const int nextLayerCellsNum{static_cast(mTimeFrame->getCells()[iLayer + 1].size())}; + mTimeFrame->getCellsNeighbours()[iLayer].resize(nextLayerCellsNum); + + for (int iCell{0}; iCell < layerCellsNum; ++iCell) { + + const Cell& currentCell{mTimeFrame->getCells()[iLayer][iCell]}; + const int nextLayerTrackletIndex{currentCell.getSecondTrackletIndex()}; + const int nextLayerFirstCellIndex{mTimeFrame->getCellsLookupTable()[iLayer][nextLayerTrackletIndex]}; + const int nextLayerLastCellIndex{mTimeFrame->getCellsLookupTable()[iLayer][nextLayerTrackletIndex + 1]}; + for (int iNextCell{nextLayerFirstCellIndex}; iNextCell < nextLayerLastCellIndex; ++iNextCell) { + + Cell& nextCell{mTimeFrame->getCells()[iLayer + 1][iNextCell]}; + if (nextCell.getFirstTrackletIndex() != nextLayerTrackletIndex) { + break; + } + +#ifdef OPTIMISATION_OUTPUT + bool good{mTimeFrame->getCellsLabel(iLayer)[iCell] == mTimeFrame->getCellsLabel(iLayer + 1)[iNextCell]}; + float signedDelta{currentCell.getTanLambda() - nextCell.getTanLambda()}; + off << fmt::format("{}\t{:d}\t{}\t{}", iLayer, good, signedDelta, signedDelta / mTrkParams[iteration].CellDeltaTanLambdaSigma) << std::endl; +#endif + mTimeFrame->getCellsNeighbours()[iLayer][iNextCell].push_back(iCell); + + const int currentCellLevel{currentCell.getLevel()}; + + if (currentCellLevel >= nextCell.getLevel()) { + nextCell.setLevel(currentCellLevel + 1); + } + // } + } + } + } +} + +void TrackerTraits::findRoads(const int iteration) +{ + for (int iLevel{mTrkParams[iteration].CellsPerRoad()}; iLevel >= mTrkParams[iteration].CellMinimumLevel(); --iLevel) { + CA_DEBUGGER(int nRoads = -mTimeFrame->getRoads().size()); + const int minimumLevel{iLevel - 1}; + + for (int iLayer{mTrkParams[iteration].CellsPerRoad() - 1}; iLayer >= minimumLevel; --iLayer) { + + const int levelCellsNum{static_cast(mTimeFrame->getCells()[iLayer].size())}; + + for (int iCell{0}; iCell < levelCellsNum; ++iCell) { + + Cell& currentCell{mTimeFrame->getCells()[iLayer][iCell]}; + + if (currentCell.getLevel() != iLevel) { + continue; + } + + mTimeFrame->getRoads().emplace_back(iLayer, iCell); + + /// For 3 clusters roads (useful for cascades and hypertriton) we just store the single cell + /// and we do not do the candidate tree traversal + if (iLevel == 1) { + continue; + } + + const int cellNeighboursNum{static_cast( + mTimeFrame->getCellsNeighbours()[iLayer - 1][iCell].size())}; + bool isFirstValidNeighbour = true; + + for (int iNeighbourCell{0}; iNeighbourCell < cellNeighboursNum; ++iNeighbourCell) { + + const int neighbourCellId = mTimeFrame->getCellsNeighbours()[iLayer - 1][iCell][iNeighbourCell]; + const Cell& neighbourCell = mTimeFrame->getCells()[iLayer - 1][neighbourCellId]; + + if (iLevel - 1 != neighbourCell.getLevel()) { + continue; + } + + if (isFirstValidNeighbour) { + + isFirstValidNeighbour = false; + + } else { + + mTimeFrame->getRoads().emplace_back(iLayer, iCell); + } + + traverseCellsTree(neighbourCellId, iLayer - 1); + } + + // TODO: crosscheck for short track iterations + // currentCell.setLevel(0); + } + } +#ifdef CA_DEBUG + nRoads += mTimeFrame->getRoads().size(); + std::cout << "+++ Roads with " << iLevel + 2 << " clusters: " << nRoads << " / " << mTimeFrame->getRoads().size() << std::endl; +#endif + } +} + +void TrackerTraits::findTracks(const int iteration) +{ + std::vector tracks; + tracks.reserve(mTimeFrame->getRoads().size()); + + for (auto& road : mTimeFrame->getRoads()) { + std::vector clusters(mTrkParams[0].NLayers, constants::its::UnusedIndex); + int lastCellLevel = constants::its::UnusedIndex; + CA_DEBUGGER(int nClusters = 2); + int firstTracklet{constants::its::UnusedIndex}; + std::vector tracklets(mTrkParams[0].TrackletsPerRoad(), constants::its::UnusedIndex); + + for (int iCell{0}; iCell < mTrkParams[0].CellsPerRoad(); ++iCell) { + const int cellIndex = road[iCell]; + if (cellIndex == constants::its::UnusedIndex) { + continue; + } else { + if (firstTracklet == constants::its::UnusedIndex) { + firstTracklet = iCell; + } + tracklets[iCell] = mTimeFrame->getCells()[iCell][cellIndex].getFirstTrackletIndex(); + tracklets[iCell + 1] = mTimeFrame->getCells()[iCell][cellIndex].getSecondTrackletIndex(); + clusters[iCell] = mTimeFrame->getCells()[iCell][cellIndex].getFirstClusterIndex(); + clusters[iCell + 1] = mTimeFrame->getCells()[iCell][cellIndex].getSecondClusterIndex(); + clusters[iCell + 2] = mTimeFrame->getCells()[iCell][cellIndex].getThirdClusterIndex(); + assert(clusters[iCell] != constants::its::UnusedIndex && + clusters[iCell + 1] != constants::its::UnusedIndex && + clusters[iCell + 2] != constants::its::UnusedIndex); + lastCellLevel = iCell; + CA_DEBUGGER(nClusters++); + } + } + + CA_DEBUGGER(assert(nClusters >= mTrkParams[0].MinTrackLength)); + int count{1}; + unsigned short rof{mTimeFrame->getTracklets()[firstTracklet][tracklets[firstTracklet]].rof[0]}; + for (int iT = firstTracklet; iT < 6; ++iT) { + if (tracklets[iT] == constants::its::UnusedIndex) { + continue; + } + if (rof == mTimeFrame->getTracklets()[iT][tracklets[iT]].rof[1]) { + count++; + } else { + if (count == 1) { + rof = mTimeFrame->getTracklets()[iT][tracklets[iT]].rof[1]; + } else { + count--; + } + } + } + + CA_DEBUGGER(assert(nClusters >= mTrkParams[0].MinTrackLength)); + CA_DEBUGGER(roadCounters[nClusters - 4]++); + + if (lastCellLevel == constants::its::UnusedIndex) { + continue; + } + + /// From primary vertex context index to event index (== the one used as input of the tracking code) + for (size_t iC{0}; iC < clusters.size(); iC++) { + if (clusters[iC] != constants::its::UnusedIndex) { + clusters[iC] = mTimeFrame->getClusters()[iC][clusters[iC]].clusterId; + } + } + + /// Track seed preparation. Clusters are numbered progressively from the outermost to the innermost. + const auto& cluster1_glo = mTimeFrame->getUnsortedClusters()[lastCellLevel + 2].at(clusters[lastCellLevel + 2]); + const auto& cluster2_glo = mTimeFrame->getUnsortedClusters()[lastCellLevel + 1].at(clusters[lastCellLevel + 1]); + const auto& cluster3_glo = mTimeFrame->getUnsortedClusters()[lastCellLevel].at(clusters[lastCellLevel]); + + const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(lastCellLevel).at(clusters[lastCellLevel]); + + /// FIXME! + TrackITSExt temporaryTrack{buildTrackSeed(cluster1_glo, cluster2_glo, cluster3_glo, cluster3_tf, mTimeFrame->getPositionResolution(lastCellLevel))}; + for (size_t iC = 0; iC < clusters.size(); ++iC) { + temporaryTrack.setExternalClusterIndex(iC, clusters[iC], clusters[iC] != constants::its::UnusedIndex); + } + bool fitSuccess = fitTrack(temporaryTrack, mTrkParams[0].NLayers - 4, -1, -1); + if (!fitSuccess) { + continue; + } + CA_DEBUGGER(fitCounters[nClusters - 4]++); + temporaryTrack.resetCovariance(); + fitSuccess = fitTrack(temporaryTrack, 0, mTrkParams[0].NLayers, 1, mTrkParams[0].FitIterationMaxChi2[0]); + if (!fitSuccess) { + continue; + } + CA_DEBUGGER(backpropagatedCounters[nClusters - 4]++); + temporaryTrack.getParamOut() = temporaryTrack; + temporaryTrack.resetCovariance(); + fitSuccess = fitTrack(temporaryTrack, mTrkParams[0].NLayers - 1, -1, -1, mTrkParams[0].FitIterationMaxChi2[1], 50.); + if (!fitSuccess) { + continue; + } + // temporaryTrack.setROFrame(rof); + tracks.emplace_back(temporaryTrack); + } + + if (mApplySmoothing) { + // Smoothing tracks + } + std::sort(tracks.begin(), tracks.end(), + [](TrackITSExt& track1, TrackITSExt& track2) { return track1.isBetter(track2, 1.e6f); }); + + for (auto& track : tracks) { + int nShared = 0; + for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { + if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { + continue; + } + nShared += int(mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer))); + } + + if (nShared > mTrkParams[0].ClusterSharing) { + continue; + } + + std::array rofs{INT_MAX, INT_MAX, INT_MAX}; + for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { + if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { + continue; + } + mTimeFrame->markUsedCluster(iLayer, track.getClusterIndex(iLayer)); + int currentROF = mTimeFrame->getClusterROF(iLayer, track.getClusterIndex(iLayer)); + for (int iR{0}; iR < 3; ++iR) { + if (rofs[iR] == INT_MAX) { + rofs[iR] = currentROF; + } + if (rofs[iR] == currentROF) { + break; + } + } + } + if (rofs[2] != INT_MAX) { + continue; + } + if (rofs[1] != INT_MAX) { + track.setNextROFbit(); + } + mTimeFrame->getTracks(std::min(rofs[0], rofs[1])).emplace_back(track); + } +} + +void TrackerTraits::extendTracks(const int iteration) +{ + if (!mTrkParams.back().UseTrackFollower) { + return; + } + for (int rof{0}; rof < mTimeFrame->getNrof(); ++rof) { + for (auto& track : mTimeFrame->getTracks(rof)) { + /// TODO: track refitting is missing! + int ncl{track.getNClusters()}; + auto backup{track}; + bool success{false}; + if (track.getLastClusterLayer() != mTrkParams[0].NLayers - 1) { + success = success || trackFollowing(&track, rof, true, iteration); + } + if (track.getFirstClusterLayer() != 0) { + success = success || trackFollowing(&track, rof, false, iteration); + } + if (success) { + /// We have to refit the track + track.resetCovariance(); + bool fitSuccess = fitTrack(track, 0, mTrkParams[0].NLayers, 1, mTrkParams[0].FitIterationMaxChi2[0]); + if (!fitSuccess) { + track = backup; + continue; + } + track.getParamOut() = track; + track.resetCovariance(); + fitSuccess = fitTrack(track, mTrkParams[0].NLayers - 1, -1, -1, mTrkParams[0].FitIterationMaxChi2[1], 50.); + if (!fitSuccess) { + track = backup; + continue; + } + /// Make sure that the newly attached clusters get marked as used + for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { + if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { + continue; + } + mTimeFrame->markUsedCluster(iLayer, track.getClusterIndex(iLayer)); + } + } + } + } +} + +void TrackerTraits::findShortPrimaries() +{ + if (!mTrkParams[0].FindShortTracks) { + return; + } + auto propagator = o2::base::Propagator::Instance(); + mTimeFrame->fillPrimaryVerticesXandAlpha(); + + for (auto& cell : mTimeFrame->getCells()[0]) { + auto& cluster1_glo = mTimeFrame->getClusters()[2][cell.getThirdClusterIndex()]; + auto& cluster2_glo = mTimeFrame->getClusters()[1][cell.getSecondClusterIndex()]; + auto& cluster3_glo = mTimeFrame->getClusters()[0][cell.getFirstClusterIndex()]; + if (mTimeFrame->isClusterUsed(0, cluster1_glo.clusterId) || + mTimeFrame->isClusterUsed(1, cluster2_glo.clusterId) || + mTimeFrame->isClusterUsed(2, cluster3_glo.clusterId)) { + continue; + } + + std::array rofs{ + mTimeFrame->getClusterROF(0, cluster3_glo.clusterId), + mTimeFrame->getClusterROF(1, cluster2_glo.clusterId), + mTimeFrame->getClusterROF(2, cluster1_glo.clusterId)}; + if (rofs[0] != rofs[1] && rofs[1] != rofs[2] && rofs[0] != rofs[2]) { + continue; + } + + int rof{rofs[0]}; + if (rofs[1] == rofs[2]) { + rof = rofs[2]; + } + + auto pvs{mTimeFrame->getPrimaryVertices(rof)}; + auto pvsXAlpha{mTimeFrame->getPrimaryVerticesXAlpha(rof)}; + + const auto& cluster3_tf = mTimeFrame->getTrackingFrameInfoOnLayer(0).at(cluster3_glo.clusterId); + TrackITSExt temporaryTrack{buildTrackSeed(cluster1_glo, cluster2_glo, cluster3_glo, cluster3_tf, mTimeFrame->getPositionResolution(0))}; + temporaryTrack.setExternalClusterIndex(0, cluster3_glo.clusterId, true); + temporaryTrack.setExternalClusterIndex(1, cluster2_glo.clusterId, true); + temporaryTrack.setExternalClusterIndex(2, cluster1_glo.clusterId, true); + + /// add propagation to the primary vertices compatible with the ROF(s) of the cell + bool fitSuccess{false}; + + TrackITSExt bestTrack{temporaryTrack}, backup{temporaryTrack}; + float bestChi2{std::numeric_limits::max()}; + for (int iV{0}; iV < (int)pvs.size(); ++iV) { + temporaryTrack = backup; + if (!temporaryTrack.rotate(pvsXAlpha[iV][1])) { + continue; + } + if (!propagator->propagateTo(temporaryTrack, pvsXAlpha[iV][0], true)) { + continue; + } + + float pvRes{mTrkParams[0].PVres / std::sqrt(float(pvs[iV].getNContributors()))}; + const float posVtx[2]{0.f, pvs[iV].getZ()}; + const float covVtx[3]{pvRes, 0.f, pvRes}; + float chi2 = temporaryTrack.getPredictedChi2(posVtx, covVtx); + if (chi2 < bestChi2) { + if (!temporaryTrack.track::TrackParCov::update(posVtx, covVtx)) { + continue; + } + bestTrack = temporaryTrack; + bestChi2 = chi2; + } + } + + bestTrack.resetCovariance(); + fitSuccess = fitTrack(bestTrack, 0, mTrkParams[0].NLayers, 1, mTrkParams[0].FitIterationMaxChi2[0]); + if (!fitSuccess) { + continue; + } + bestTrack.getParamOut() = bestTrack; + bestTrack.resetCovariance(); + fitSuccess = fitTrack(bestTrack, mTrkParams[0].NLayers - 1, -1, -1, mTrkParams[0].FitIterationMaxChi2[1], 50.); + if (!fitSuccess) { + continue; + } + mTimeFrame->markUsedCluster(0, bestTrack.getClusterIndex(0)); + mTimeFrame->markUsedCluster(1, bestTrack.getClusterIndex(1)); + mTimeFrame->markUsedCluster(2, bestTrack.getClusterIndex(2)); + mTimeFrame->getTracks(rof).emplace_back(bestTrack); + } +} + +bool TrackerTraits::fitTrack(TrackITSExt& track, int start, int end, int step, const float chi2cut, const float maxQoverPt) +{ + auto propInstance = o2::base::Propagator::Instance(); + track.setChi2(0); + int nCl{0}; + for (int iLayer{start}; iLayer != end; iLayer += step) { + if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { + continue; + } + const TrackingFrameInfo& trackingHit = mTimeFrame->getTrackingFrameInfoOnLayer(iLayer).at(track.getClusterIndex(iLayer)); + + if (!track.rotate(trackingHit.alphaTrackingFrame)) { + return false; + } + + if (!propInstance->propagateToX(track, trackingHit.xTrackingFrame, getBz(), o2::base::PropagatorImpl::MAX_SIN_PHI, o2::base::PropagatorImpl::MAX_STEP, mCorrType)) { + return false; + } + + if (mCorrType == o2::base::PropagatorF::MatCorrType::USEMatCorrNONE) { + float radl = 9.36f; // Radiation length of Si [cm] + float rho = 2.33f; // Density of Si [g/cm^3] + if (!track.correctForMaterial(mTrkParams[0].LayerxX0[iLayer], mTrkParams[0].LayerxX0[iLayer] * radl * rho, true)) { + continue; + } + } + + GPUArray cov{trackingHit.covarianceTrackingFrame}; + cov[0] = std::hypot(cov[0], mTrkParams[0].LayerMisalignment[iLayer]); + cov[2] = std::hypot(cov[2], mTrkParams[0].LayerMisalignment[iLayer]); + auto predChi2{track.getPredictedChi2(trackingHit.positionTrackingFrame, cov)}; + if (nCl >= 3 && predChi2 > chi2cut * (nCl * 2 - 5)) { + return false; + } + track.setChi2(track.getChi2() + predChi2); + if (!track.o2::track::TrackParCov::update(trackingHit.positionTrackingFrame, cov)) { + return false; + } + nCl++; + } + return std::abs(track.getQ2Pt()) < maxQoverPt; +} + void TrackerTraits::refitTracks(const int iteration, const std::vector>& tf, std::vector& tracks) { std::vector cells; @@ -464,5 +888,89 @@ bool TrackerTraits::trackFollowing(TrackITSExt* track, int rof, bool outward, co return swapped; } +/// Clusters are given from outside inward (cluster1 is the outermost). The innermost cluster is given in the tracking +/// frame coordinates +/// whereas the others are referred to the global frame. This function is almost a clone of CookSeed, adapted to return +/// a TrackParCov +track::TrackParCov TrackerTraits::buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, const Cluster& cluster3, const TrackingFrameInfo& tf3, float resolution) +{ + const float ca = std::cos(tf3.alphaTrackingFrame), sa = std::sin(tf3.alphaTrackingFrame); + const float x1 = cluster1.xCoordinate * ca + cluster1.yCoordinate * sa; + const float y1 = -cluster1.xCoordinate * sa + cluster1.yCoordinate * ca; + const float z1 = cluster1.zCoordinate; + const float x2 = cluster2.xCoordinate * ca + cluster2.yCoordinate * sa; + const float y2 = -cluster2.xCoordinate * sa + cluster2.yCoordinate * ca; + const float z2 = cluster2.zCoordinate; + const float x3 = tf3.xTrackingFrame; + const float y3 = tf3.positionTrackingFrame[0]; + const float z3 = tf3.positionTrackingFrame[1]; + + const float crv = math_utils::computeCurvature(x1, y1, x2, y2, x3, y3); + const float x0 = math_utils::computeCurvatureCentreX(x1, y1, x2, y2, x3, y3); + 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 fy = 1. / (cluster2.radius - cluster3.radius); + const float& tz = fy; + float cy = 1.e15f; + if (std::abs(getBz()) > o2::constants::math::Almost0) { + cy = (math_utils::computeCurvature(x1, y1, x2, y2 + resolution, x3, y3) - crv) / + (resolution * getBz() * o2::constants::math::B2C) * + 20.f; // FIXME: MS contribution to the cov[14] (*20 added) + } + const float s2 = resolution; + + return track::TrackParCov(tf3.xTrackingFrame, tf3.alphaTrackingFrame, + {y3, z3, crv * (x3 - x0), 0.5f * (tgl12 + tgl23), + std::abs(getBz()) < o2::constants::math::Almost0 ? 1.f / o2::track::kMostProbablePt + : crv / (getBz() * o2::constants::math::B2C)}, + {s2, 0.f, s2, s2 * fy, 0.f, s2 * fy * fy, 0.f, s2 * tz, 0.f, s2 * tz * tz, s2 * cy, 0.f, + s2 * fy * cy, 0.f, s2 * cy * cy}); +} + +void TrackerTraits::traverseCellsTree(const int currentCellId, const int currentLayerId) +{ + Cell& currentCell{mTimeFrame->getCells()[currentLayerId][currentCellId]}; + const int currentCellLevel = currentCell.getLevel(); + + mTimeFrame->getRoads().back().addCell(currentLayerId, currentCellId); + + if (currentLayerId > 0 && currentCellLevel > 1) { + const int cellNeighboursNum{static_cast( + mTimeFrame->getCellsNeighbours()[currentLayerId - 1][currentCellId].size())}; + bool isFirstValidNeighbour = true; + + for (int iNeighbourCell{0}; iNeighbourCell < cellNeighboursNum; ++iNeighbourCell) { + + const int neighbourCellId = + mTimeFrame->getCellsNeighbours()[currentLayerId - 1][currentCellId][iNeighbourCell]; + const Cell& neighbourCell = mTimeFrame->getCells()[currentLayerId - 1][neighbourCellId]; + + if (currentCellLevel - 1 != neighbourCell.getLevel()) { + continue; + } + + if (isFirstValidNeighbour) { + isFirstValidNeighbour = false; + } else { + mTimeFrame->getRoads().push_back(mTimeFrame->getRoads().back()); + } + + traverseCellsTree(neighbourCellId, currentLayerId - 1); + } + } + + // TODO: crosscheck for short track iterations + // currentCell.setLevel(0); +} + +void TrackerTraits::setBz(float bz) +{ + mBz = bz; + mTimeFrame->setBz(bz); +} + +bool TrackerTraits::isMatLUT() const { return o2::base::Propagator::Instance()->getMatLUT() && (mCorrType == o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); } + } // namespace its } // namespace o2 diff --git a/macro/run_trac_ca_its.C b/macro/run_trac_ca_its.C index dd362642b42aa..c135f81899732 100644 --- a/macro/run_trac_ca_its.C +++ b/macro/run_trac_ca_its.C @@ -53,7 +53,6 @@ #include "ITStracking/Configuration.h" using namespace o2::gpu; -using o2::its::MemoryParameters; using o2::its::TrackingParameters; using Vertex = o2::dataformats::Vertex>; @@ -180,7 +179,6 @@ void run_trac_ca_its(bool cosmics = false, std::vector time; std::vector trackParams(1); - std::vector memParams(1); if (cosmics) { trackParams[0].MinTrackLength = 4; trackParams[0].CellDeltaTanLambdaSigma *= 400; @@ -200,7 +198,6 @@ void run_trac_ca_its(bool cosmics = false, // trackParams[2].CopyCuts(trackParams[1], 2.); // trackParams[2].DeltaROF = 1; // trackParams[2].MinTrackLength = 4; - // memParams.resize(3); // --- // Uncomment for pp trackParams.resize(3); @@ -208,7 +205,6 @@ void run_trac_ca_its(bool cosmics = false, trackParams[2].TrackletMinPt = 0.1f; trackParams[2].DeltaROF = 1; trackParams[2].MinTrackLength = 4; - memParams.resize(3); // --- } @@ -248,7 +244,7 @@ void run_trac_ca_its(bool cosmics = false, } tracker.setBz(field->getBz(origD)); - tracker.setParameters(memParams, trackParams); + tracker.setParameters(trackParams); tracker.clustersToTracks(); //-------- init lookuptable --------// From 0196d01db377e9d5739c28a6e6982c1095a2e477 Mon Sep 17 00:00:00 2001 From: Matteo Concas Date: Fri, 22 Jul 2022 18:40:29 +0200 Subject: [PATCH 4/6] Fix signature for findShortPrimaries() --- Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h index d5cebd60c2487..98bc5845fbf57 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h @@ -78,7 +78,7 @@ class Tracker void computeCells(int& iteration); void findCellsNeighbours(int& iteration); void findRoads(int& iteration); - void findShortPrimaries(int& iteration); + void findShortPrimaries(); void findTracks(int& iteration); void extendTracks(int& iteration); From dc29ba7d7f67241cdf4e60859440847a14d16e13 Mon Sep 17 00:00:00 2001 From: Matteo Concas Date: Fri, 22 Jul 2022 18:51:23 +0200 Subject: [PATCH 5/6] Update setMaterialCorrection() --- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index dd59594fedfce..b4ac92a8f400f 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -318,15 +318,11 @@ void Tracker::getGlobalConfiguration() { auto& tc = o2::its::TrackerParamConfig::Instance(); if (tc.useMatCorrTGeo) { -<<<<<<< HEAD - setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrTGeo); + mTraits->setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrTGeo); } else if (tc.useFastMaterial) { - setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE); + mTraits->setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE); } else { - setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); -======= - mTraits->setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrTGeo); ->>>>>>> Move core tracking functions to traits + mTraits->setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); } setNThreads(tc.nThreads); for (auto& params : mTrkParams) { From 24544bf0c375bb69b7ab8aa78baab06dd6282d27 Mon Sep 17 00:00:00 2001 From: Matteo Concas Date: Fri, 22 Jul 2022 19:39:21 +0200 Subject: [PATCH 6/6] Add latest addition integration --- .../tracking/include/ITStracking/Tracker.h | 6 ++-- .../include/ITStracking/TrackerTraits.h | 7 ++-- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 24 ++++++------- .../ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 36 +++++++++++++++---- 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h index 98bc5845fbf57..067de88839170 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h @@ -67,10 +67,10 @@ class Tracker void setParameters(const std::vector&); void getGlobalConfiguration(); void setBz(float); - void setCorrType(const o2::base::PropagatorImpl::MatCorrType& type); + void setCorrType(const o2::base::PropagatorImpl::MatCorrType type); bool isMatLUT() const; void setNThreads(int n); - int getNThreads() const { return mNThreads; } + int getNThreads() const; private: void initialiseTimeFrame(int& iteration); @@ -79,7 +79,7 @@ class Tracker void findCellsNeighbours(int& iteration); void findRoads(int& iteration); void findShortPrimaries(); - void findTracks(int& iteration); + void findTracks(); void extendTracks(int& iteration); // MC interaction diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h index 16894de062425..9605a4d193de2 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h @@ -56,7 +56,7 @@ class TrackerTraits virtual void computeLayerCells(const int iteration); virtual void findCellsNeighbours(const int iteration); virtual void findRoads(const int iteration); - virtual void findTracks(const int iteration); + virtual void findTracks(); virtual void extendTracks(const int iteration); virtual void findShortPrimaries(); virtual void refitTracks(const int iteration, const std::vector>&, std::vector&); @@ -67,7 +67,7 @@ class TrackerTraits void adoptTimeFrame(TimeFrame* tf) { mTimeFrame = tf; } void setBz(float bz); float getBz() const; - void setCorrType(const o2::base::PropagatorImpl::MatCorrType& type) { mCorrType = type; } + void setCorrType(const o2::base::PropagatorImpl::MatCorrType type) { mCorrType = type; } bool isMatLUT() const; // Others @@ -82,12 +82,15 @@ class TrackerTraits } void setSmoothing(bool v) { mApplySmoothing = v; } bool getSmoothing() const { return mApplySmoothing; } + void setNThreads(int n); + int getNThreads() const { return mNThreads; } private: void traverseCellsTree(const int, const int); track::TrackParCov buildTrackSeed(const Cluster& cluster1, const Cluster& cluster2, const Cluster& cluster3, const TrackingFrameInfo& tf3, float resolution); bool fitTrack(TrackITSExt& track, int start, int end, int step, const float chi2cut = o2::constants::math::VeryBig, const float maxQoverPt = o2::constants::math::VeryBig); + int mNThreads = 1; bool mApplySmoothing = false; o2::base::PropagatorImpl::MatCorrType mCorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE; float mBz = 5.f; diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index b4ac92a8f400f..b603469d8cb2a 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -31,10 +31,6 @@ #include #include -#ifdef WITH_OPENMP -#include -#endif - namespace o2 { namespace its @@ -82,7 +78,7 @@ void Tracker::clustersToTracks(std::function logger, std::f total += evaluateTask(&Tracker::findCellsNeighbours, "Neighbour finding", logger, iteration); total += evaluateTask(&Tracker::findRoads, "Road finding", logger, iteration); logger(fmt::format("\t- Number of Roads: {}", mTimeFrame->getRoads().size())); - total += evaluateTask(&Tracker::findTracks, "Track finding", logger, iteration); + total += evaluateTask(&Tracker::findTracks, "Track finding", logger); total += evaluateTask(&Tracker::extendTracks, "Extending tracks", logger, iteration); } @@ -92,7 +88,7 @@ void Tracker::clustersToTracks(std::function logger, std::f std::stringstream sstream; if (constants::DoTimeBenchmarks) { sstream << std::setw(2) << " - " - << "Timeframe " << mTimeFrameCounter++ << " processing completed in: " << total << "ms using " << mNThreads << " threads."; + << "Timeframe " << mTimeFrameCounter++ << " processing completed in: " << total << "ms using " << mTraits->getNThreads() << " threads."; } logger(sstream.str()); @@ -123,9 +119,9 @@ void Tracker::findRoads(int& iteration) mTraits->findRoads(iteration); } -void Tracker::findTracks(int& iteration) +void Tracker::findTracks() { - mTraits->findTracks(iteration); + mTraits->findTracks(); } void Tracker::extendTracks(int& iteration) @@ -370,7 +366,7 @@ void Tracker::setBz(float bz) mTraits->setBz(bz); } -void Tracker::setCorrType(const o2::base::PropagatorImpl::MatCorrType& type) +void Tracker::setCorrType(const o2::base::PropagatorImpl::MatCorrType type) { mTraits->setCorrType(type); } @@ -382,12 +378,12 @@ bool Tracker::isMatLUT() const void Tracker::setNThreads(int n) { -#ifdef WITH_OPENMP - mNThreads = n > 0 ? n : 1; -#else - mNThreads = 1; -#endif + mTraits->setNThreads(n); } +int Tracker::getNThreads() const +{ + return mTraits->getNThreads(); +} } // namespace its } // namespace o2 diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index 93862c4bc50b1..8b89f37e28896 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -29,6 +29,10 @@ #include "ITStracking/Tracklet.h" #include "ReconstructionDataFormats/Track.h" +#ifdef WITH_OPENMP +#include +#endif + using o2::base::PropagatorF; namespace @@ -442,11 +446,14 @@ void TrackerTraits::findRoads(const int iteration) } } -void TrackerTraits::findTracks(const int iteration) +void TrackerTraits::findTracks() { - std::vector tracks; - tracks.reserve(mTimeFrame->getRoads().size()); + std::vector> tracks(mNThreads); + for (auto& tracksV : tracks) { + tracksV.reserve(mTimeFrame->getRoads().size() / mNThreads); + } +#pragma omp parallel for num_threads(mNThreads) for (auto& road : mTimeFrame->getRoads()) { std::vector clusters(mTrkParams[0].NLayers, constants::its::UnusedIndex); int lastCellLevel = constants::its::UnusedIndex; @@ -537,16 +544,25 @@ void TrackerTraits::findTracks(const int iteration) continue; } // temporaryTrack.setROFrame(rof); - tracks.emplace_back(temporaryTrack); +#ifdef WITH_OPENMP + int iThread = omp_get_thread_num(); +#else + int iThread = 0; +#endif + tracks[iThread].emplace_back(temporaryTrack); + } + + for (int iV{1}; iV < mNThreads; ++iV) { + tracks[0].insert(tracks[0].end(), tracks[iV].begin(), tracks[iV].end()); } if (mApplySmoothing) { // Smoothing tracks } - std::sort(tracks.begin(), tracks.end(), + std::sort(tracks[0].begin(), tracks[0].end(), [](TrackITSExt& track1, TrackITSExt& track2) { return track1.isBetter(track2, 1.e6f); }); - for (auto& track : tracks) { + for (auto& track : tracks[0]) { int nShared = 0; for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { @@ -972,5 +988,13 @@ void TrackerTraits::setBz(float bz) bool TrackerTraits::isMatLUT() const { return o2::base::Propagator::Instance()->getMatLUT() && (mCorrType == o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); } +void TrackerTraits::setNThreads(int n) +{ +#ifdef WITH_OPENMP + mNThreads = n > 0 ? n : 1; +#else + mNThreads = 1; +#endif +} } // namespace its } // namespace o2