From e6b2f8ef784f997a7665a29ba3e9685af9cb9fc4 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Sun, 8 Jun 2025 13:38:08 +0200 Subject: [PATCH 1/3] ITS: unify configuration of algorithms Signed-off-by: Felix Schlepper --- .../tracking/GPU/cuda/TrackerTraitsGPU.cxx | 4 +- .../include/ITStracking/Configuration.h | 71 +++-- .../tracking/include/ITStracking/Tracker.h | 2 - .../include/ITStracking/TrackerTraits.h | 2 - .../include/ITStracking/TrackingInterface.h | 11 +- .../tracking/include/ITStracking/Vertexer.h | 1 - .../ITSMFT/ITS/tracking/src/Configuration.cxx | 265 ++++++++++++++++-- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 66 ----- .../ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 10 +- .../ITS/tracking/src/TrackingInterface.cxx | 127 +-------- .../ITSMFT/ITS/tracking/src/Vertexer.cxx | 30 -- .../include/ITSWorkflow/CookedTrackerSpec.h | 6 +- .../include/ITSWorkflow/RecoWorkflow.h | 8 +- .../include/ITSWorkflow/TrackerSpec.h | 4 +- .../ITS/workflow/src/CookedTrackerSpec.cxx | 11 +- .../ITSMFT/ITS/workflow/src/RecoWorkflow.cxx | 4 +- .../ITSMFT/ITS/workflow/src/TrackerSpec.cxx | 7 +- .../ITS/workflow/src/its-reco-workflow.cxx | 8 +- .../reconstruction/src/TrackingInterface.cxx | 1 - .../include/ITS3Workflow/RecoWorkflow.h | 20 +- .../include/ITS3Workflow/TrackerSpec.h | 4 +- .../ITS3/workflow/src/RecoWorkflow.cxx | 4 +- .../ITS3/workflow/src/TrackerSpec.cxx | 9 +- .../ITS3/workflow/src/its3-reco-workflow.cxx | 3 +- 24 files changed, 338 insertions(+), 340 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx index 89d2b5aeffe63..67b9973d19afd 100644 --- a/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx +++ b/Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx @@ -243,7 +243,7 @@ void TrackerTraitsGPU::findRoads(const int iteration) this->mTrkParams[0].MaxChi2ClusterAttachment, this->mTrkParams[0].MaxChi2NDF, mTimeFrameGPU->getDevicePropagator(), - this->mCorrType, + this->mTrkParams[0].CorrType, conf.nBlocks, conf.nThreads); } @@ -265,7 +265,7 @@ void TrackerTraitsGPU::findRoads(const int iteration) this->mTrkParams[0].MaxChi2ClusterAttachment, // float maxChi2ClusterAttachment this->mTrkParams[0].MaxChi2NDF, // float maxChi2NDF mTimeFrameGPU->getDevicePropagator(), // const o2::base::Propagator* propagator - this->mCorrType, // o2::base::PropagatorImpl::MatCorrType + this->mTrkParams[0].CorrType, // o2::base::PropagatorImpl::MatCorrType conf.nBlocks, conf.nThreads); diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h index 2a40b817a7005..64bca085e2842 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h @@ -26,36 +26,8 @@ #include "DetectorsBase/Propagator.h" #include "ITStracking/Constants.h" -namespace o2 +namespace o2::its { -namespace its -{ - -enum class TrackingMode { - Sync, - Async, - Cosmics, - Unset, // Special value to leave a default in case we want to override via Configurable Params -}; - -std::string asString(TrackingMode mode); -std::ostream& operator<<(std::ostream& os, TrackingMode v); - -template -class Configuration : public Param -{ - public: - static Configuration& getInstance() - { - static Configuration instance; - return instance; - } - Configuration(const Configuration&) = delete; - const Configuration& operator=(const Configuration&) = delete; - - private: - Configuration() = default; -}; struct TrackingParameters { int CellMinimumLevel() const noexcept { return MinTrackLength - constants::ClustersPerCell + 1; } @@ -166,7 +138,44 @@ struct TimeFrameGPUParameters { int maxGPUMemoryGB = -1; }; -} // namespace its -} // namespace o2 +class TrackingMode +{ + public: + enum Type { + Unset = -1, // Special value to leave a default in case we want to override via Configurable Params + Sync = 0, + Async = 1, + Cosmics = 2, + Off = 3, + // + NFirst = Unset, + NLast = Off, + NModes = NLast - NFirst, + }; + + static Type fromString(std::string_view str); + static std::string toString(Type mode); + + static std::vector getTrackingParameters(Type mode); + static std::vector getVertexingParameters(Type mode); + + private: + static constexpr bool iequals(std::string_view a, std::string_view b) + { + return std::equal(a.begin(), a.end(), b.begin(), b.end(), + [](char x, char y) { return std::tolower(x) == std::tolower(y); }); + } + + public: + // pure static class + TrackingMode() = delete; + TrackingMode(const TrackingMode&) = delete; + TrackingMode(TrackingMode&&) = delete; + TrackingMode& operator=(const TrackingMode&) = delete; + TrackingMode& operator=(TrackingMode&&) = delete; + ~TrackingMode() = delete; +}; + +} // namespace o2::its #endif /* TRACKINGITSU_INCLUDE_CONFIGURATION_H_ */ diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h index 5ba9b5039f808..78c290374a67d 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h @@ -71,9 +71,7 @@ class Tracker void setParameters(const std::vector& p) { mTrkParams = p; } void setMemoryPool(std::shared_ptr& pool) { mMemoryPool = pool; } std::vector& getParameters() { return mTrkParams; } - void getGlobalConfiguration(); void setBz(float bz) { mTraits->setBz(bz); } - void setCorrType(const o2::base::PropagatorImpl::MatCorrType type) { mTraits->setCorrType(type); } bool isMatLUT() const { return mTraits->isMatLUT(); } void setNThreads(int n, std::shared_ptr& arena) { mTraits->setNThreads(n, arena); } void printSummary() const; diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h index 7ba67a01fce13..cba536324edeb 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h @@ -65,7 +65,6 @@ class TrackerTraits virtual void setBz(float bz); float getBz() const { return mBz; } - void setCorrType(const o2::base::PropagatorImpl::MatCorrType type) { mCorrType = type; } bool isMatLUT() const; virtual const char* getName() const noexcept { return "CPU"; } virtual bool isGPU() const noexcept { return false; } @@ -99,7 +98,6 @@ class TrackerTraits std::shared_ptr mTaskArena; protected: - o2::base::PropagatorImpl::MatCorrType mCorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE; o2::gpu::GPUChainITS* mChain = nullptr; TimeFrame* mTimeFrame; std::vector mTrkParams; diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingInterface.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingInterface.h index 64fd4f8156cca..bf9cb79169566 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingInterface.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingInterface.h @@ -68,13 +68,7 @@ class ITSTrackingInterface // Custom void setTraitsFromProvider(VertexerTraits*, TrackerTraits7*, TimeFrame7*); - void setTrackingMode(TrackingMode mode = TrackingMode::Unset) - { - if (mode == TrackingMode::Unset) { - LOGP(fatal, "ITS Tracking mode Unset is meant to be a default. Specify the mode"); - } - mMode = mode; - } + void setTrackingMode(TrackingMode::Type mode = TrackingMode::Unset) { mMode = mode; } auto getTracker() const { return mTracker.get(); } auto getVertexer() const { return mVertexer.get(); } @@ -86,14 +80,13 @@ class ITSTrackingInterface gsl::span clusters, gsl::span::iterator& pattIt, const dataformats::MCTruthContainer* mcLabels); - void getConfiguration(framework::ProcessingContext& pc); private: bool mIsMC = false; bool mRunVertexer = true; bool mCosmicsProcessing = false; int mUseTriggers = 0; - TrackingMode mMode = TrackingMode::Unset; + TrackingMode::Type mMode = TrackingMode::Unset; bool mOverrideBeamEstimation = false; const o2::itsmft::TopologyDictionary* mDict = nullptr; std::unique_ptr mTracker = nullptr; diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Vertexer.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Vertexer.h index 98bcb95ef65df..285e4d7e9547d 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Vertexer.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Vertexer.h @@ -60,7 +60,6 @@ class Vertexer auto& getVertParameters() const { return mTraits->getVertexingParameters(); } void setParameters(const std::vector& vertParams) { mVertParams = vertParams; } const auto& getParameters() const noexcept { return mVertParams; } - void getGlobalConfiguration(); void setMemoryPool(std::shared_ptr& pool) { mMemoryPool = pool; } std::vector exportVertices(); diff --git a/Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx b/Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx index 9e631ad6afb7f..388bfc2267251 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx @@ -9,34 +9,18 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +#include #include -#include "ITStracking/Constants.h" +#include +#include +#include +#include "Framework/Logger.h" +#include "ITStracking/Constants.h" #include "ITStracking/Configuration.h" +#include "ITStracking/TrackingConfigParam.h" -namespace o2::its -{ - -std::string asString(TrackingMode mode) -{ - switch (mode) { - case TrackingMode::Sync: - return "sync"; - case TrackingMode::Async: - return "async"; - case TrackingMode::Cosmics: - return "cosmics"; - case TrackingMode::Unset: - return "unset"; - } - return "unknown"; -} - -std::ostream& operator<<(std::ostream& os, TrackingMode v) -{ - os << asString(v); - return os; -} +using namespace o2::its; std::string TrackingParameters::asString() const { @@ -72,4 +56,235 @@ std::string VertexingParameters::asString() const return str; } -} // namespace o2::its +TrackingMode::Type TrackingMode::fromString(std::string_view str) +{ + constexpr std::array smodes = { + std::pair{"sync", Sync}, + std::pair{"async", Async}, + std::pair{"cosmics", Cosmics}, + std::pair{"unset", Unset}, + std::pair{"off", Off}}; + + auto it = std::find_if(smodes.begin(), smodes.end(), [&str](const auto& pair) { + return iequals(str, pair.first); + }); + if (it == smodes.end()) { + LOGP(fatal, "Unrecognized tracking mode '{}'", str); + } + return it->second; +} + +std::string TrackingMode::toString(TrackingMode::Type mode) +{ + if (mode == TrackingMode::Sync) { + return "sync"; + } else if (mode == TrackingMode::Async) { + return "async"; + } else if (mode == TrackingMode::Cosmics) { + return "cosmics"; + } else if (mode == TrackingMode::Unset) { + return "unset"; + } else if (mode == TrackingMode::Off) { + return "off"; + } + LOGP(fatal, "Unrecognized tracking mode '{}'", (int)mode); + return ""; // not reachable +} + +std::vector TrackingMode::getTrackingParameters(TrackingMode::Type mode) +{ + const auto& tc = o2::its::TrackerParamConfig::Instance(); + std::vector trackParams; + + if (mode == TrackingMode::Async) { + trackParams.resize(tc.doUPCIteration ? 4 : 3); + trackParams[1].TrackletMinPt = 0.2f; + trackParams[1].CellDeltaTanLambdaSigma *= 2.; + trackParams[2].TrackletMinPt = 0.1f; + trackParams[2].CellDeltaTanLambdaSigma *= 4.; + + trackParams[0].MinPt[0] = 1.f / 12; // 7cl + trackParams[1].MinPt[0] = 1.f / 12; // 7cl + + trackParams[2].MinTrackLength = 4; + trackParams[2].MinPt[0] = 1.f / 12; // 7cl + trackParams[2].MinPt[1] = 1.f / 5; // 6cl + trackParams[2].MinPt[2] = 1.f / 1; // 5cl + trackParams[2].MinPt[3] = 1.f / 6; // 4cl + + trackParams[2].StartLayerMask = (1 << 6) + (1 << 3); + if (tc.doUPCIteration) { + trackParams[3].MinTrackLength = 4; + trackParams[3].TrackletMinPt = 0.1f; + trackParams[3].CellDeltaTanLambdaSigma *= 4.; + trackParams[3].DeltaROF = 0; // UPC specific setting + } + for (size_t ip = 0; ip < trackParams.size(); ip++) { + auto& param = trackParams[ip]; + param.ZBins = 64; + param.PhiBins = 32; + param.CellsPerClusterLimit = 1.e3f; + param.TrackletsPerClusterLimit = 1.e3f; + // check if something was overridden via configurable params + if (ip < tc.MaxIter) { + if (tc.startLayerMask[ip] > 0) { + trackParams[2].StartLayerMask = tc.startLayerMask[ip]; + } + if (tc.minTrackLgtIter[ip] > 0) { + param.MinTrackLength = tc.minTrackLgtIter[ip]; + } + for (int ilg = tc.MaxTrackLength; ilg >= tc.MinTrackLength; ilg--) { + int lslot0 = (tc.MaxTrackLength - ilg), lslot = lslot0 + ip * (tc.MaxTrackLength - tc.MinTrackLength + 1); + if (tc.minPtIterLgt[lslot] > 0.) { + param.MinPt[lslot0] = tc.minPtIterLgt[lslot]; + } + } + } + } + } else if (mode == TrackingMode::Sync) { + trackParams.resize(1); + trackParams[0].ZBins = 64; + trackParams[0].PhiBins = 32; + trackParams[0].MinTrackLength = 4; + } else if (mode == TrackingMode::Cosmics) { + trackParams.resize(1); + trackParams[0].MinTrackLength = 4; + trackParams[0].CellDeltaTanLambdaSigma *= 10; + trackParams[0].PhiBins = 4; + trackParams[0].ZBins = 16; + trackParams[0].PVres = 1.e5f; + trackParams[0].MaxChi2ClusterAttachment = 60.; + trackParams[0].MaxChi2NDF = 40.; + trackParams[0].TrackletsPerClusterLimit = 100.; + trackParams[0].CellsPerClusterLimit = 100.; + } else { + LOGP(fatal, "Unsupported ITS tracking mode {} ", toString(mode)); + } + + float bFactor = std::abs(o2::base::Propagator::Instance()->getNominalBz()) / 5.0066791; + float bFactorTracklets = bFactor < 0.01 ? 1. : bFactor; // for tracklets only + int nROFsPerIterations = tc.nROFsPerIterations > 0 ? tc.nROFsPerIterations : -1; + + if (tc.nOrbitsPerIterations > 0) { + /// code to be used when the number of ROFs per orbit is known, this gets priority over the number of ROFs per iteration + } + + // global parameters set for every iteration + for (auto& p : trackParams) { + // adjust pT settings to actual mag. field + p.TrackletMinPt *= bFactorTracklets; + for (int ilg = tc.MaxTrackLength; ilg >= tc.MinTrackLength; ilg--) { + int lslot = tc.MaxTrackLength - ilg; + p.MinPt[lslot] *= bFactor; + } + + p.PrintMemory = tc.printMemory; + p.MaxMemory = tc.maxMemory; + p.DropTFUponFailure = tc.dropTFUponFailure; + p.SaveTimeBenchmarks = tc.saveTimeBenchmarks; + p.FataliseUponFailure = tc.fataliseUponFailure; + + if (tc.useMatCorrTGeo) { + p.CorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrTGeo; + } else if (tc.useFastMaterial) { + p.CorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE; + } else { + p.CorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT; + } + + if (p.NLayers == 7) { + for (int i{0}; i < 7; ++i) { + p.SystErrorY2[i] = tc.sysErrY2[i] > 0 ? tc.sysErrY2[i] : p.SystErrorY2[i]; + p.SystErrorZ2[i] = tc.sysErrZ2[i] > 0 ? tc.sysErrZ2[i] : p.SystErrorZ2[i]; + } + } + p.DeltaROF = tc.deltaRof; + p.DoUPCIteration = tc.doUPCIteration; + p.MaxChi2ClusterAttachment = tc.maxChi2ClusterAttachment > 0 ? tc.maxChi2ClusterAttachment : p.MaxChi2ClusterAttachment; + p.MaxChi2NDF = tc.maxChi2NDF > 0 ? tc.maxChi2NDF : p.MaxChi2NDF; + p.PhiBins = tc.LUTbinsPhi > 0 ? tc.LUTbinsPhi : p.PhiBins; + p.ZBins = tc.LUTbinsZ > 0 ? tc.LUTbinsZ : p.ZBins; + p.PVres = tc.pvRes > 0 ? tc.pvRes : p.PVres; + p.NSigmaCut *= tc.nSigmaCut > 0 ? tc.nSigmaCut : 1.f; + p.CellDeltaTanLambdaSigma *= tc.deltaTanLres > 0 ? tc.deltaTanLres : 1.f; + p.TrackletMinPt *= tc.minPt > 0 ? tc.minPt : 1.f; + p.nROFsPerIterations = nROFsPerIterations; + p.PerPrimaryVertexProcessing = tc.perPrimaryVertexProcessing; + for (int iD{0}; iD < 3; ++iD) { + p.Diamond[iD] = tc.diamondPos[iD]; + } + p.UseDiamond = tc.useDiamond; + if (tc.useTrackFollower > 0) { + p.UseTrackFollower = true; + // Bit 0: Allow for mixing of top&bot extension --> implies Bits 1&2 set + // Bit 1: Allow for top extension + // Bit 2: Allow for bot extension + p.UseTrackFollowerMix = ((tc.useTrackFollower & (1 << 0)) != 0); + p.UseTrackFollowerTop = ((tc.useTrackFollower & (1 << 1)) != 0); + p.UseTrackFollowerBot = ((tc.useTrackFollower & (1 << 2)) != 0); + p.TrackFollowerNSigmaCutZ = tc.trackFollowerNSigmaZ; + p.TrackFollowerNSigmaCutPhi = tc.trackFollowerNSigmaPhi; + } + if (tc.cellsPerClusterLimit >= 0) { + p.CellsPerClusterLimit = tc.cellsPerClusterLimit; + } + if (tc.trackletsPerClusterLimit >= 0) { + p.TrackletsPerClusterLimit = tc.trackletsPerClusterLimit; + } + if (tc.findShortTracks >= 0) { + p.FindShortTracks = tc.findShortTracks; + } + } + + return trackParams; +} + +std::vector TrackingMode::getVertexingParameters(TrackingMode::Type mode) +{ + const auto& vc = o2::its::VertexerParamConfig::Instance(); + std::vector vertParams; + if (mode == TrackingMode::Async) { + vertParams.resize(2); // The number of actual iterations will be set as a configKeyVal to allow for pp/PbPb choice + vertParams[1].phiCut = 0.015f; + vertParams[1].tanLambdaCut = 0.015f; + vertParams[1].vertPerRofThreshold = 0; + vertParams[1].deltaRof = 0; + } else if (mode == TrackingMode::Sync) { + vertParams.resize(1); + } else if (mode == TrackingMode::Cosmics) { + vertParams.resize(1); + } else { + LOGP(fatal, "Unsupported ITS vertexing mode {} ", toString(mode)); + } + + // global parameters set for every iteration + for (auto& p : vertParams) { + p.SaveTimeBenchmarks = vc.saveTimeBenchmarks; + p.PrintMemory = vc.printMemory; + p.MaxMemory = vc.maxMemory; + p.DropTFUponFailure = vc.dropTFUponFailure; + p.nIterations = vc.nIterations; + p.deltaRof = vc.deltaRof; + p.allowSingleContribClusters = vc.allowSingleContribClusters; + p.trackletSigma = vc.trackletSigma; + p.maxZPositionAllowed = vc.maxZPositionAllowed; + p.clusterContributorsCut = vc.clusterContributorsCut; + p.phiSpan = vc.phiSpan; + p.nThreads = vc.nThreads; + p.ZBins = vc.ZBins; + p.PhiBins = vc.PhiBins; + } + // set for now outside to not disturb status quo + vertParams[0].vertNsigmaCut = vc.vertNsigmaCut; + vertParams[0].vertRadiusSigma = vc.vertRadiusSigma; + vertParams[0].maxTrackletsPerCluster = vc.maxTrackletsPerCluster; + vertParams[0].lowMultBeamDistCut = vc.lowMultBeamDistCut; + vertParams[0].zCut = vc.zCut; + vertParams[0].phiCut = vc.phiCut; + vertParams[0].pairCut = vc.pairCut; + vertParams[0].clusterCut = vc.clusterCut; + vertParams[0].histPairCut = vc.histPairCut; + vertParams[0].tanLambdaCut = vc.tanLambdaCut; + + return vertParams; +} diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index 09d9cee06d9f9..895e2bf88a52f 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -332,72 +332,6 @@ void Tracker::rectifyClusterIndices() } } -void Tracker::getGlobalConfiguration() -{ - const auto& tc = o2::its::TrackerParamConfig::Instance(); - if (tc.useMatCorrTGeo) { - mTraits->setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrTGeo); - } else if (tc.useFastMaterial) { - mTraits->setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrNONE); - } else { - mTraits->setCorrType(o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); - } - int nROFsPerIterations = tc.nROFsPerIterations > 0 ? tc.nROFsPerIterations : -1; - if (tc.nOrbitsPerIterations > 0) { - /// code to be used when the number of ROFs per orbit is known, this gets priority over the number of ROFs per iteration - } - for (auto& params : mTrkParams) { - if (params.NLayers == 7) { - for (int i{0}; i < 7; ++i) { - params.SystErrorY2[i] = tc.sysErrY2[i] > 0 ? tc.sysErrY2[i] : params.SystErrorY2[i]; - params.SystErrorZ2[i] = tc.sysErrZ2[i] > 0 ? tc.sysErrZ2[i] : params.SystErrorZ2[i]; - } - } - params.DeltaROF = tc.deltaRof; - params.DoUPCIteration = tc.doUPCIteration; - params.MaxChi2ClusterAttachment = tc.maxChi2ClusterAttachment > 0 ? tc.maxChi2ClusterAttachment : params.MaxChi2ClusterAttachment; - params.MaxChi2NDF = tc.maxChi2NDF > 0 ? tc.maxChi2NDF : params.MaxChi2NDF; - params.PhiBins = tc.LUTbinsPhi > 0 ? tc.LUTbinsPhi : params.PhiBins; - params.ZBins = tc.LUTbinsZ > 0 ? tc.LUTbinsZ : params.ZBins; - params.PVres = tc.pvRes > 0 ? tc.pvRes : params.PVres; - params.NSigmaCut *= tc.nSigmaCut > 0 ? tc.nSigmaCut : 1.f; - params.CellDeltaTanLambdaSigma *= tc.deltaTanLres > 0 ? tc.deltaTanLres : 1.f; - params.TrackletMinPt *= tc.minPt > 0 ? tc.minPt : 1.f; - params.nROFsPerIterations = nROFsPerIterations; - params.PerPrimaryVertexProcessing = tc.perPrimaryVertexProcessing; - params.SaveTimeBenchmarks = tc.saveTimeBenchmarks; - params.FataliseUponFailure = tc.fataliseUponFailure; - params.DropTFUponFailure = tc.dropTFUponFailure; - for (int iD{0}; iD < 3; ++iD) { - params.Diamond[iD] = tc.diamondPos[iD]; - } - params.UseDiamond = tc.useDiamond; - if (tc.maxMemory) { - params.MaxMemory = tc.maxMemory; - } - if (tc.useTrackFollower > 0) { - params.UseTrackFollower = true; - // Bit 0: Allow for mixing of top&bot extension --> implies Bits 1&2 set - // Bit 1: Allow for top extension - // Bit 2: Allow for bot extension - params.UseTrackFollowerMix = ((tc.useTrackFollower & (1 << 0)) != 0); - params.UseTrackFollowerTop = ((tc.useTrackFollower & (1 << 1)) != 0); - params.UseTrackFollowerBot = ((tc.useTrackFollower & (1 << 2)) != 0); - params.TrackFollowerNSigmaCutZ = tc.trackFollowerNSigmaZ; - params.TrackFollowerNSigmaCutPhi = tc.trackFollowerNSigmaPhi; - } - if (tc.cellsPerClusterLimit >= 0) { - params.CellsPerClusterLimit = tc.cellsPerClusterLimit; - } - if (tc.trackletsPerClusterLimit >= 0) { - params.TrackletsPerClusterLimit = tc.trackletsPerClusterLimit; - } - if (tc.findShortTracks >= 0) { - params.FindShortTracks = tc.findShortTracks; - } - } -} - void Tracker::adoptTimeFrame(TimeFrame7& tf) { mTimeFrame = &tf; diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index 8dd6b9870115c..da7f31bd678b5 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -616,12 +616,12 @@ void TrackerTraits::processNeighbours(int iLayer, int iLevel, const bou continue; } - if (!propagator->propagateToX(seed, trHit.xTrackingFrame, getBz(), o2::base::PropagatorImpl::MAX_SIN_PHI, o2::base::PropagatorImpl::MAX_STEP, mCorrType)) { + if (!propagator->propagateToX(seed, trHit.xTrackingFrame, getBz(), o2::base::PropagatorImpl::MAX_SIN_PHI, o2::base::PropagatorImpl::MAX_STEP, mTrkParams[0].CorrType)) { CA_DEBUGGER(failed[2]++); continue; } - if (mCorrType == o2::base::PropagatorF::MatCorrType::USEMatCorrNONE) { + if (mTrkParams[0].CorrType == o2::base::PropagatorF::MatCorrType::USEMatCorrNONE) { if (!seed.correctForMaterial(mTrkParams[0].LayerxX0[iLayer - 1], mTrkParams[0].LayerxX0[iLayer - 1] * constants::Radl * constants::Rho, true)) { continue; } @@ -1023,11 +1023,11 @@ bool TrackerTraits::fitTrack(TrackITSExt& track, int start, int end, in return false; } - if (!propInstance->propagateToX(track, trackingHit.xTrackingFrame, getBz(), o2::base::PropagatorImpl::MAX_SIN_PHI, o2::base::PropagatorImpl::MAX_STEP, mCorrType)) { + if (!propInstance->propagateToX(track, trackingHit.xTrackingFrame, getBz(), o2::base::PropagatorImpl::MAX_SIN_PHI, o2::base::PropagatorImpl::MAX_STEP, mTrkParams[0].CorrType)) { return false; } - if (mCorrType == o2::base::PropagatorF::MatCorrType::USEMatCorrNONE) { + if (mTrkParams[0].CorrType == o2::base::PropagatorF::MatCorrType::USEMatCorrNONE) { if (!track.correctForMaterial(mTrkParams[0].LayerxX0[iLayer], mTrkParams[0].LayerxX0[iLayer] * constants::Radl * constants::Rho, true)) { continue; } @@ -1201,7 +1201,7 @@ void TrackerTraits::setBz(float bz) template bool TrackerTraits::isMatLUT() const { - return o2::base::Propagator::Instance()->getMatLUT() && (mCorrType == o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); + return o2::base::Propagator::Instance()->getMatLUT() && (mTrkParams[0].CorrType == o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT); } template diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx index 15348bca9fde7..73095e9a9f769 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx @@ -33,122 +33,20 @@ using namespace o2::its; void ITSTrackingInterface::initialise() { - mRunVertexer = true; - mCosmicsProcessing = false; - std::vector vertParams; - std::vector trackParams; - const auto& vertConf = o2::its::VertexerParamConfig::Instance(); + // get parameters const auto& trackConf = o2::its::TrackerParamConfig::Instance(); - float bFactor = std::abs(o2::base::Propagator::Instance()->getNominalBz()) / 5.0066791; - float bFactorTracklets = bFactor < 0.01 ? 1. : bFactor; // for tracklets only + const auto& vertConf = o2::its::VertexerParamConfig::Instance(); if (mMode == TrackingMode::Unset) { - mMode = (TrackingMode)(trackConf.trackingMode); - LOGP(info, "Tracking mode not set, trying to fetch it from configurable params to: {}", asString(mMode)); - } - if (mMode == TrackingMode::Async) { - trackParams.resize(trackConf.doUPCIteration ? 4 : 3); - vertParams.resize(2); // The number of actual iterations will be set as a configKeyVal to allow for pp/PbPb choice - trackParams[1].TrackletMinPt = 0.2f; - trackParams[1].CellDeltaTanLambdaSigma *= 2.; - trackParams[2].TrackletMinPt = 0.1f; - trackParams[2].CellDeltaTanLambdaSigma *= 4.; - - trackParams[0].MinPt[0] = 1.f / 12; // 7cl - - trackParams[1].MinPt[0] = 1.f / 12; // 7cl - - trackParams[2].MinTrackLength = 4; - trackParams[2].MinPt[0] = 1.f / 12; // 7cl - trackParams[2].MinPt[1] = 1.f / 5; // 6cl - trackParams[2].MinPt[2] = 1.f / 1; // 5cl - trackParams[2].MinPt[3] = 1.f / 6; // 4cl - - trackParams[2].StartLayerMask = (1 << 6) + (1 << 3); - if (o2::its::TrackerParamConfig::Instance().doUPCIteration) { - trackParams[3].MinTrackLength = 4; - trackParams[3].TrackletMinPt = 0.1f; - trackParams[3].CellDeltaTanLambdaSigma *= 4.; - trackParams[3].DeltaROF = 0; // UPC specific setting - } - for (size_t ip = 0; ip < trackParams.size(); ip++) { - auto& param = trackParams[ip]; - param.ZBins = 64; - param.PhiBins = 32; - param.CellsPerClusterLimit = 1.e3f; - param.TrackletsPerClusterLimit = 1.e3f; - // check if something was overridden via configurable params - if (ip < trackConf.MaxIter) { - if (trackConf.startLayerMask[ip] > 0) { - trackParams[2].StartLayerMask = trackConf.startLayerMask[ip]; - } - if (trackConf.minTrackLgtIter[ip] > 0) { - param.MinTrackLength = trackConf.minTrackLgtIter[ip]; - } - for (int ilg = trackConf.MaxTrackLength; ilg >= trackConf.MinTrackLength; ilg--) { - int lslot0 = (trackConf.MaxTrackLength - ilg), lslot = lslot0 + ip * (trackConf.MaxTrackLength - trackConf.MinTrackLength + 1); - if (trackConf.minPtIterLgt[lslot] > 0.) { - param.MinPt[lslot0] = trackConf.minPtIterLgt[lslot]; - } - } - } - } - LOGP(info, "Initializing tracker in async. phase reconstruction with {} passes for tracking and {}/{} for vertexing", trackParams.size(), o2::its::VertexerParamConfig::Instance().nIterations, vertParams.size()); - vertParams[1].phiCut = 0.015f; - vertParams[1].tanLambdaCut = 0.015f; - vertParams[1].vertPerRofThreshold = 0; - vertParams[1].deltaRof = 0; - } else if (mMode == TrackingMode::Sync) { - trackParams.resize(1); - trackParams[0].ZBins = 64; - trackParams[0].PhiBins = 32; - trackParams[0].MinTrackLength = 4; - LOGP(info, "Initializing tracker in sync. phase reconstruction with {} passes", trackParams.size()); - vertParams.resize(1); - } else if (mMode == TrackingMode::Cosmics) { - mCosmicsProcessing = true; - mRunVertexer = false; - trackParams.resize(1); - trackParams[0].MinTrackLength = 4; - trackParams[0].CellDeltaTanLambdaSigma *= 10; - trackParams[0].PhiBins = 4; - trackParams[0].ZBins = 16; - trackParams[0].PVres = 1.e5f; - trackParams[0].MaxChi2ClusterAttachment = 60.; - trackParams[0].MaxChi2NDF = 40.; - trackParams[0].TrackletsPerClusterLimit = 100.; - trackParams[0].CellsPerClusterLimit = 100.; - LOGP(info, "Initializing tracker in reconstruction for cosmics with {} passes", trackParams.size()); - - } else { - throw std::runtime_error(fmt::format("Unsupported ITS tracking mode {:s} ", asString(mMode))); - } - - // TODO this imposes the same memory limits on each iteration - for (auto& p : vertParams) { - p.PrintMemory = vertConf.printMemory; - p.MaxMemory = vertConf.maxMemory; - p.DropTFUponFailure = vertConf.dropTFUponFailure; - } - for (auto& p : trackParams) { - p.PrintMemory = trackConf.printMemory; - p.MaxMemory = trackConf.maxMemory; - p.DropTFUponFailure = trackConf.dropTFUponFailure; - } - - for (auto& params : trackParams) { - params.CorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrLUT; - } - // adjust pT settings to actual mag. field - for (size_t ip = 0; ip < trackParams.size(); ip++) { - auto& param = trackParams[ip]; - param.TrackletMinPt *= bFactorTracklets; - for (int ilg = trackConf.MaxTrackLength; ilg >= trackConf.MinTrackLength; ilg--) { - int lslot = trackConf.MaxTrackLength - ilg; - param.MinPt[lslot] *= bFactor; - } + mMode = (TrackingMode::Type)trackConf.trackingMode; + LOGP(info, "Tracking mode not set, trying to fetch it from configurable params to: {}", TrackingMode::toString(mMode)); } + auto trackParams = TrackingMode::getTrackingParameters(mMode); + auto vertParams = TrackingMode::getVertexingParameters(mMode); + LOGP(info, "Initializing tracker in {} phase reconstruction with {} passes for tracking and {}/{} for vertexing", TrackingMode::toString(mMode), trackParams.size(), o2::its::VertexerParamConfig::Instance().nIterations, vertParams.size()); mTracker->setParameters(trackParams); mVertexer->setParameters(vertParams); + + // threading if (trackConf.nThreads == vertConf.nThreads) { bool clamped{false}; int nThreads = trackConf.nThreads; @@ -404,7 +302,6 @@ void ITSTrackingInterface::updateTimeDependentParams(framework::ProcessingContex GeometryTGeo* geom = GeometryTGeo::Instance(); geom->fillMatrixCache(o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L, o2::math_utils::TransformType::T2GRot, o2::math_utils::TransformType::T2G)); initialise(); - getConfiguration(pc); if (pc.services().get().inputTimesliceId == 0) { // print settings only for the 1st pipeling o2::its::VertexerParamConfig::Instance().printKeyValues(); @@ -423,12 +320,6 @@ void ITSTrackingInterface::updateTimeDependentParams(framework::ProcessingContex } } -void ITSTrackingInterface::getConfiguration(framework::ProcessingContext& pc) -{ - mVertexer->getGlobalConfiguration(); - mTracker->getGlobalConfiguration(); -} - void ITSTrackingInterface::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj) { if (o2::base::GRPGeomHelper::instance().finaliseCCDB(matcher, obj)) { diff --git a/Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx b/Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx index a1a1a90da8963..bd9d1402a1ebf 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Vertexer.cxx @@ -84,36 +84,6 @@ float Vertexer::clustersToVertices(LogFunc logger) return timeInit + timeTracklet + timeSelection + timeVertexing; } -void Vertexer::getGlobalConfiguration() -{ - auto& vc = o2::its::VertexerParamConfig::Instance(); - auto& grc = o2::its::ITSGpuTrackingParamConfig::Instance(); - - // This is odd: we override only the parameters for the first iteration. - // Variations for the next iterations are set in the trackingInterfrace. - mVertParams[0].nIterations = vc.nIterations; - mVertParams[0].deltaRof = vc.deltaRof; - mVertParams[0].allowSingleContribClusters = vc.allowSingleContribClusters; - mVertParams[0].zCut = vc.zCut; - mVertParams[0].phiCut = vc.phiCut; - mVertParams[0].pairCut = vc.pairCut; - mVertParams[0].clusterCut = vc.clusterCut; - mVertParams[0].histPairCut = vc.histPairCut; - mVertParams[0].tanLambdaCut = vc.tanLambdaCut; - mVertParams[0].lowMultBeamDistCut = vc.lowMultBeamDistCut; - mVertParams[0].vertNsigmaCut = vc.vertNsigmaCut; - mVertParams[0].vertRadiusSigma = vc.vertRadiusSigma; - mVertParams[0].trackletSigma = vc.trackletSigma; - mVertParams[0].maxZPositionAllowed = vc.maxZPositionAllowed; - mVertParams[0].clusterContributorsCut = vc.clusterContributorsCut; - mVertParams[0].maxTrackletsPerCluster = vc.maxTrackletsPerCluster; - mVertParams[0].phiSpan = vc.phiSpan; - mVertParams[0].nThreads = vc.nThreads; - mVertParams[0].ZBins = vc.ZBins; - mVertParams[0].PhiBins = vc.PhiBins; - mVertParams[0].SaveTimeBenchmarks = vc.saveTimeBenchmarks; -} - void Vertexer::adoptTimeFrame(TimeFrame7& tf) { mTimeFrame = &tf; diff --git a/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/CookedTrackerSpec.h b/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/CookedTrackerSpec.h index 02e278eeedda9..88e4b06a5c8ce 100644 --- a/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/CookedTrackerSpec.h +++ b/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/CookedTrackerSpec.h @@ -35,7 +35,7 @@ namespace its class CookedTrackerDPL : public Task { public: - CookedTrackerDPL(std::shared_ptr gr, bool useMC, int trgType, const TrackingMode& trMode); + CookedTrackerDPL(std::shared_ptr gr, bool useMC, int trgType, TrackingMode::Type trMode); ~CookedTrackerDPL() override = default; void init(InitContext& ic) final; void run(ProcessingContext& pc) final; @@ -51,7 +51,7 @@ class CookedTrackerDPL : public Task bool mUseMC = true; bool mRunVertexer = true; int mUseTriggers = 0; - TrackingMode mMode = TrackingMode::Sync; + TrackingMode::Type mMode = TrackingMode::Sync; const o2::itsmft::TopologyDictionary* mDict = nullptr; std::unique_ptr mGRP = nullptr; o2::its::CookedTracker mTracker; @@ -62,7 +62,7 @@ class CookedTrackerDPL : public Task /// create a processor spec /// run ITS CookedMatrix tracker -framework::DataProcessorSpec getCookedTrackerSpec(bool useMC, bool useGeom, int useTrig, const std::string& trMode); +framework::DataProcessorSpec getCookedTrackerSpec(bool useMC, bool useGeom, int useTrig, TrackingMode::Type trMode); } // namespace its } // namespace o2 diff --git a/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h b/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h index 7f9efa2098893..c168936cd4946 100644 --- a/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h +++ b/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h @@ -15,7 +15,7 @@ /// @file RecoWorkflow.h #include "Framework/WorkflowSpec.h" - +#include "ITStracking/Configuration.h" #include "GPUDataTypes.h" namespace o2 @@ -26,9 +26,9 @@ namespace its namespace reco_workflow { -framework::WorkflowSpec getWorkflow(bool useMC, bool useCAtracker, const std::string& trmode, const bool overrideBeamPosition = false, - bool upstreamDigits = false, bool upstreamClusters = false, bool disableRootOutput = false, bool useGeom = false, int useTrig = 0, - bool useGPUWF = false, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); +framework::WorkflowSpec getWorkflow(bool useMC, bool useCAtracker, TrackingMode::Type trmode, const bool overrideBeamPosition = false, + bool upstreamDigits = false, bool upstreamClusters = false, bool disableRootOutput = false, bool useGeom = false, int useTrig = 0, + bool useGPUWF = false, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); } } // namespace its diff --git a/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/TrackerSpec.h b/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/TrackerSpec.h index 27c4174fab244..5acbb452faa7e 100644 --- a/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/TrackerSpec.h +++ b/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/TrackerSpec.h @@ -37,7 +37,7 @@ class TrackerDPL : public framework::Task TrackerDPL(std::shared_ptr gr, bool isMC, int trgType, - const TrackingMode& trMode = TrackingMode::Unset, + const TrackingMode::Type trMode = TrackingMode::Unset, const bool overrBeamEst = false, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); ~TrackerDPL() override = default; @@ -58,7 +58,7 @@ class TrackerDPL : public framework::Task }; using o2::its::TrackingMode; -framework::DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int useTrig, const std::string& trMode, const bool overrBeamEst = false, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); +framework::DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int useTrig, TrackingMode::Type trMode, const bool overrBeamEst = false, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); } // namespace o2::its diff --git a/Detectors/ITSMFT/ITS/workflow/src/CookedTrackerSpec.cxx b/Detectors/ITSMFT/ITS/workflow/src/CookedTrackerSpec.cxx index 4a0470adcf07a..640265f881749 100644 --- a/Detectors/ITSMFT/ITS/workflow/src/CookedTrackerSpec.cxx +++ b/Detectors/ITSMFT/ITS/workflow/src/CookedTrackerSpec.cxx @@ -52,7 +52,7 @@ namespace its using Vertex = o2::dataformats::Vertex>; -CookedTrackerDPL::CookedTrackerDPL(std::shared_ptr gr, bool useMC, int trgType, const TrackingMode& trMode) : mGGCCDBRequest(gr), mUseMC(useMC), mUseTriggers{trgType}, mMode(trMode) +CookedTrackerDPL::CookedTrackerDPL(std::shared_ptr gr, bool useMC, int trgType, TrackingMode::Type trMode) : mGGCCDBRequest(gr), mUseMC(useMC), mUseTriggers{trgType}, mMode(trMode) { mVertexerTraitsPtr = std::make_unique(); mVertexerPtr = std::make_unique(mVertexerTraitsPtr.get()); @@ -225,13 +225,13 @@ void CookedTrackerDPL::updateTimeDependentParams(ProcessingContext& pc) if (pc.inputs().getPos("itsTGeo") >= 0) { pc.inputs().get("itsTGeo"); } - mVertexerPtr->getGlobalConfiguration(); + mVertexerPtr->setParameters(TrackingMode::getVertexingParameters(mMode)); o2::its::GeometryTGeo* geom = o2::its::GeometryTGeo::Instance(); geom->fillMatrixCache(o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L, o2::math_utils::TransformType::T2GRot, o2::math_utils::TransformType::T2G)); mTracker.setGeometry(geom); mTracker.setConfigParams(); - LOG(info) << "Tracking mode " << mMode; + LOG(info) << "Tracking mode " << TrackingMode::toString(mMode); if (mMode == TrackingMode::Cosmics) { LOG(info) << "Setting cosmics parameters..."; mTracker.setParametersCosmics(); @@ -269,7 +269,7 @@ void CookedTrackerDPL::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj) } } -DataProcessorSpec getCookedTrackerSpec(bool useMC, bool useGeom, int trgType, const std::string& trModeS) +DataProcessorSpec getCookedTrackerSpec(bool useMC, bool useGeom, int trgType, TrackingMode::Type trmode) { std::vector inputs; inputs.emplace_back("compClusters", "ITS", "COMPCLUSTERS", 0, Lifetime::Timeframe); @@ -315,8 +315,7 @@ DataProcessorSpec getCookedTrackerSpec(bool useMC, bool useGeom, int trgType, co AlgorithmSpec{adaptFromTask(ggRequest, useMC, trgType, - trModeS == "sync" ? o2::its::TrackingMode::Sync : trModeS == "async" ? o2::its::TrackingMode::Async - : o2::its::TrackingMode::Cosmics)}, + trmode)}, Options{{"nthreads", VariantType::Int, 1, {"Number of threads"}}}}; } diff --git a/Detectors/ITSMFT/ITS/workflow/src/RecoWorkflow.cxx b/Detectors/ITSMFT/ITS/workflow/src/RecoWorkflow.cxx index 05e873c18b898..a72c26a3681e1 100644 --- a/Detectors/ITSMFT/ITS/workflow/src/RecoWorkflow.cxx +++ b/Detectors/ITSMFT/ITS/workflow/src/RecoWorkflow.cxx @@ -36,7 +36,7 @@ namespace reco_workflow framework::WorkflowSpec getWorkflow(bool useMC, bool useCAtracker, - const std::string& trmode, + TrackingMode::Type trmode, const bool overrideBeamPosition, bool upstreamDigits, bool upstreamClusters, @@ -56,7 +56,7 @@ framework::WorkflowSpec getWorkflow(bool useMC, if (!disableRootOutput) { specs.emplace_back(o2::its::getClusterWriterSpec(useMC)); } - if (!trmode.empty()) { + if (trmode != TrackingMode::Off) { if (useCAtracker) { if (useGPUWF) { o2::gpu::GPURecoWorkflowSpec::Config cfg; diff --git a/Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx b/Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx index 9f84ee6522567..fedc42c017f7e 100644 --- a/Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx +++ b/Detectors/ITSMFT/ITS/workflow/src/TrackerSpec.cxx @@ -26,7 +26,7 @@ using Vertex = o2::dataformats::Vertex>; TrackerDPL::TrackerDPL(std::shared_ptr gr, bool isMC, int trgType, - const TrackingMode& trMode, + const TrackingMode::Type trMode, const bool overrBeamEst, o2::gpu::GPUDataTypes::DeviceType dType) : mGGCCDBRequest(gr), mRecChain{o2::gpu::GPUReconstruction::CreateInstance(dType, true)}, @@ -79,7 +79,7 @@ void TrackerDPL::end() LOGF(info, "ITS CA-Tracker total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1); } -DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int trgType, const std::string& trModeS, const bool overrBeamEst, o2::gpu::GPUDataTypes::DeviceType dType) +DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int trgType, TrackingMode::Type trMode, const bool overrBeamEst, o2::gpu::GPUDataTypes::DeviceType dType) { std::vector inputs; @@ -132,8 +132,7 @@ DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int trgType, const st AlgorithmSpec{adaptFromTask(ggRequest, useMC, trgType, - trModeS == "sync" ? o2::its::TrackingMode::Sync : trModeS == "async" ? o2::its::TrackingMode::Async - : o2::its::TrackingMode::Cosmics, + trMode, overrBeamEst, dType)}, Options{}}; diff --git a/Detectors/ITSMFT/ITS/workflow/src/its-reco-workflow.cxx b/Detectors/ITSMFT/ITS/workflow/src/its-reco-workflow.cxx index 168e1363d6fb5..b7d72eb3618db 100644 --- a/Detectors/ITSMFT/ITS/workflow/src/its-reco-workflow.cxx +++ b/Detectors/ITSMFT/ITS/workflow/src/its-reco-workflow.cxx @@ -11,7 +11,6 @@ #include "ITSWorkflow/RecoWorkflow.h" #include "CommonUtils/ConfigurableParam.h" -#include "ITStracking/TrackingConfigParam.h" #include "ITStracking/Configuration.h" #include "DetectorsRaw/HBFUtilsInitializer.h" #include "Framework/CallbacksPolicy.h" @@ -45,7 +44,7 @@ void customize(std::vector& workflowOptions) {"trackerCA", o2::framework::VariantType::Bool, false, {"use trackerCA (default: trackerCM)"}}, {"ccdb-meanvertex-seed", o2::framework::VariantType::Bool, false, {"use MeanVertex from CCDB if available to provide beam position seed (default: false)"}}, {"select-with-triggers", o2::framework::VariantType::String, "none", {"use triggers to prescale processed ROFs: phys, trd, none"}}, - {"tracking-mode", o2::framework::VariantType::String, "sync", {"sync,async,cosmics"}}, + {"tracking-mode", o2::framework::VariantType::String, "sync", {"sync,async,cosmics,unset,off"}}, {"disable-tracking", o2::framework::VariantType::Bool, false, {"disable tracking step"}}, {"configKeyValues", VariantType::String, "", {"Semicolon separated key=value strings"}}, {"use-full-geometry", o2::framework::VariantType::Bool, false, {"use full geometry instead of the light-weight ITS part"}}, @@ -75,9 +74,8 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) auto disableRootOutput = configcontext.options().get("disable-root-output"); auto useGeom = configcontext.options().get("use-full-geometry"); if (configcontext.options().get("disable-tracking")) { - trmode = ""; + trmode = "off"; } - std::transform(trmode.begin(), trmode.end(), trmode.begin(), [](unsigned char c) { return std::tolower(c); }); o2::conf::ConfigurableParam::updateFromString(configcontext.options().get("configKeyValues")); int trType = 0; @@ -92,7 +90,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) } auto wf = o2::its::reco_workflow::getWorkflow(useMC, useCAtracker, - trmode, + o2::its::TrackingMode::fromString(trmode), beamPosOVerride, extDigits, extClusters, diff --git a/Detectors/Upgrades/ITS3/reconstruction/src/TrackingInterface.cxx b/Detectors/Upgrades/ITS3/reconstruction/src/TrackingInterface.cxx index afb276e956e76..99ac05e61baf8 100644 --- a/Detectors/Upgrades/ITS3/reconstruction/src/TrackingInterface.cxx +++ b/Detectors/Upgrades/ITS3/reconstruction/src/TrackingInterface.cxx @@ -33,7 +33,6 @@ void ITS3TrackingInterface::updateTimeDependentParams(framework::ProcessingConte auto geom = its::GeometryTGeo::Instance(); geom->fillMatrixCache(o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L, o2::math_utils::TransformType::T2GRot, o2::math_utils::TransformType::T2G)); initialise(); - getConfiguration(pc); if (pc.services().get().inputTimesliceId == 0) { // print settings only for the 1st pipeling o2::its::VertexerParamConfig::Instance().printKeyValues(); o2::its::TrackerParamConfig::Instance().printKeyValues(); diff --git a/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h b/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h index 1760aa1d850eb..1b26a6e756756 100644 --- a/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h +++ b/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h @@ -15,7 +15,7 @@ /// @file RecoWorkflow.h #include "Framework/WorkflowSpec.h" - +#include "ITStracking/Configuration.h" #include "GPUO2Interface.h" #include "GPUReconstruction.h" #include "GPUChainITS.h" @@ -24,15 +24,15 @@ namespace o2::its3::reco_workflow { framework::WorkflowSpec getWorkflow(bool useMC, - const std::string& trmode, - o2::gpu::GPUDataTypes::DeviceType dtype, - bool useGPUWorkflow, - bool upstreamDigits, - bool upstreamClusters, - bool disableRootOutput, - bool useGeom, - int useTrig, - bool overrideBeamPosition); + its::TrackingMode::Type trmode, + o2::gpu::GPUDataTypes::DeviceType dtype, + bool useGPUWorkflow, + bool upstreamDigits, + bool upstreamClusters, + bool disableRootOutput, + bool useGeom, + int useTrig, + bool overrideBeamPosition); } #endif diff --git a/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/TrackerSpec.h b/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/TrackerSpec.h index f5c1d7bf0e947..42f71b6ccebe0 100644 --- a/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/TrackerSpec.h +++ b/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/TrackerSpec.h @@ -37,7 +37,7 @@ class TrackerDPL : public framework::Task TrackerDPL(std::shared_ptr gr, bool isMC, int trgType, - const its::TrackingMode& trMode = its::TrackingMode::Unset, + its::TrackingMode::Type trmode = its::TrackingMode::Unset, const bool overrBeamEst = false, gpu::GPUDataTypes::DeviceType dType = gpu::GPUDataTypes::DeviceType::CPU); ~TrackerDPL() override = default; @@ -63,7 +63,7 @@ class TrackerDPL : public framework::Task /// create a processor spec /// run ITS CA tracker -framework::DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int useTrig, const std::string& trMode, const bool overrBeamEst = false, gpu::GPUDataTypes::DeviceType dType = gpu::GPUDataTypes::DeviceType::CPU); +framework::DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int useTrig, its::TrackingMode::Type trMode, const bool overrBeamEst = false, gpu::GPUDataTypes::DeviceType dType = gpu::GPUDataTypes::DeviceType::CPU); } // namespace o2::its3 diff --git a/Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx b/Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx index 947e53f80ddf1..8a1c1ef73cf2b 100644 --- a/Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx +++ b/Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx @@ -26,7 +26,7 @@ static std::shared_ptr gTask; namespace o2::its3::reco_workflow { -framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::gpu::GPUDataTypes::DeviceType dtype, bool useGPUWorkflow, +framework::WorkflowSpec getWorkflow(bool useMC, its::TrackingMode::Type trmode, o2::gpu::GPUDataTypes::DeviceType dtype, bool useGPUWorkflow, bool upstreamDigits, bool upstreamClusters, bool disableRootOutput, bool useGeom, int useTrig, bool overrideBeamPosition) { framework::WorkflowSpec specs; @@ -43,7 +43,7 @@ framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::g specs.emplace_back(o2::its::getClusterWriterSpec(useMC)); } - if (trmode != "off") { + if (trmode != its::TrackingMode::Off) { if (useGPUWorkflow) { o2::gpu::GPURecoWorkflowSpec::Config cfg; cfg.runITSTracking = true; diff --git a/Detectors/Upgrades/ITS3/workflow/src/TrackerSpec.cxx b/Detectors/Upgrades/ITS3/workflow/src/TrackerSpec.cxx index 5b710a3d11fef..7945f8e0af1df 100644 --- a/Detectors/Upgrades/ITS3/workflow/src/TrackerSpec.cxx +++ b/Detectors/Upgrades/ITS3/workflow/src/TrackerSpec.cxx @@ -49,7 +49,7 @@ using Vertex = o2::dataformats::Vertex>; TrackerDPL::TrackerDPL(std::shared_ptr gr, bool isMC, int trgType, - const its::TrackingMode& trMode, + its::TrackingMode::Type trMode, const bool overrBeamEst, o2::gpu::GPUDataTypes::DeviceType dType) : mGGCCDBRequest(gr), mRecChain{o2::gpu::GPUReconstruction::CreateInstance(dType, true)}, @@ -95,7 +95,7 @@ void TrackerDPL::endOfStream(EndOfStreamContext& ec) LOGF(info, "ITS3 CA-Tracker total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1); } -DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int trgType, const std::string& trModeS, const bool overrBeamEst, o2::gpu::GPUDataTypes::DeviceType dType) +DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int trgType, its::TrackingMode::Type trMode, const bool overrBeamEst, o2::gpu::GPUDataTypes::DeviceType dType) { std::vector inputs; inputs.emplace_back("compClusters", "ITS", "COMPCLUSTERS", 0, Lifetime::Timeframe); @@ -145,10 +145,7 @@ DataProcessorSpec getTrackerSpec(bool useMC, bool useGeom, int trgType, const st "its3-tracker", inputs, outputs, - AlgorithmSpec{adaptFromTask(ggRequest, useMC, trgType, - trModeS == "sync" ? o2::its::TrackingMode::Sync : trModeS == "async" ? o2::its::TrackingMode::Async - : o2::its::TrackingMode::Cosmics, - overrBeamEst, dType)}, + AlgorithmSpec{adaptFromTask(ggRequest, useMC, trgType, trMode, overrBeamEst, dType)}, Options{}}; } diff --git a/Detectors/Upgrades/ITS3/workflow/src/its3-reco-workflow.cxx b/Detectors/Upgrades/ITS3/workflow/src/its3-reco-workflow.cxx index 2f0eda73742cb..e4c78b3323a5e 100644 --- a/Detectors/Upgrades/ITS3/workflow/src/its3-reco-workflow.cxx +++ b/Detectors/Upgrades/ITS3/workflow/src/its3-reco-workflow.cxx @@ -69,7 +69,6 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) auto disableRootOutput = configcontext.options().get("disable-root-output"); auto useGeom = configcontext.options().get("use-full-geometry"); auto useGPUWfx = configcontext.options().get("use-gpu-workflow"); - std::transform(trmode.begin(), trmode.end(), trmode.begin(), [](unsigned char c) { return std::tolower(c); }); o2::conf::ConfigurableParam::updateFromString(configcontext.options().get("configKeyValues")); int trType = 0; @@ -82,7 +81,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) LOG(fatal) << "Unknown trigger type requested for events prescaling: " << selTrig; } } - auto wf = o2::its3::reco_workflow::getWorkflow(useMC, trmode, gpuDevice, useGPUWfx, extDigits, extClusters, disableRootOutput, useGeom, trType, beamPosOVerride); + auto wf = o2::its3::reco_workflow::getWorkflow(useMC, o2::its::TrackingMode::fromString(trmode), gpuDevice, useGPUWfx, extDigits, extClusters, disableRootOutput, useGeom, trType, beamPosOVerride); // configure dpl timer to inject correct firstTForbit: start from the 1st orbit of TF containing 1st sampled orbit o2::raw::HBFUtilsInitializer hbfIni(configcontext, wf); From 0513915a92bc89e45453a611fa73501bdbb3da59 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Sun, 8 Jun 2025 14:13:03 +0200 Subject: [PATCH 2/3] ITS: prefer config params over cli Signed-off-by: Felix Schlepper --- Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx index 73095e9a9f769..374faf96ea509 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx @@ -36,9 +36,9 @@ void ITSTrackingInterface::initialise() // get parameters const auto& trackConf = o2::its::TrackerParamConfig::Instance(); const auto& vertConf = o2::its::VertexerParamConfig::Instance(); - if (mMode == TrackingMode::Unset) { - mMode = (TrackingMode::Type)trackConf.trackingMode; - LOGP(info, "Tracking mode not set, trying to fetch it from configurable params to: {}", TrackingMode::toString(mMode)); + if (auto parmode = (TrackingMode::Type)trackConf.trackingMode; mMode == TrackingMode::Unset || (parmode != TrackingMode::Unset && mMode != parmode)) { + LOGP(info, "Tracking mode overwritten by configurable params from {} to {}", TrackingMode::toString(mMode), TrackingMode::toString(parmode)); + mMode = parmode; } auto trackParams = TrackingMode::getTrackingParameters(mMode); auto vertParams = TrackingMode::getVertexingParameters(mMode); From d893d9cbaa11e1f930cb06f7f4de5cbb68214fb8 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Sun, 22 Jun 2025 12:15:30 +0000 Subject: [PATCH 3/3] Please consider the following formatting changes --- .../include/ITSWorkflow/RecoWorkflow.h | 4 ++-- .../include/ITS3Workflow/RecoWorkflow.h | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h b/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h index c168936cd4946..0ab48d713f7c7 100644 --- a/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h +++ b/Detectors/ITSMFT/ITS/workflow/include/ITSWorkflow/RecoWorkflow.h @@ -27,8 +27,8 @@ namespace reco_workflow { framework::WorkflowSpec getWorkflow(bool useMC, bool useCAtracker, TrackingMode::Type trmode, const bool overrideBeamPosition = false, - bool upstreamDigits = false, bool upstreamClusters = false, bool disableRootOutput = false, bool useGeom = false, int useTrig = 0, - bool useGPUWF = false, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); + bool upstreamDigits = false, bool upstreamClusters = false, bool disableRootOutput = false, bool useGeom = false, int useTrig = 0, + bool useGPUWF = false, o2::gpu::GPUDataTypes::DeviceType dType = o2::gpu::GPUDataTypes::DeviceType::CPU); } } // namespace its diff --git a/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h b/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h index 1b26a6e756756..592a34d94a3ca 100644 --- a/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h +++ b/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h @@ -24,15 +24,15 @@ namespace o2::its3::reco_workflow { framework::WorkflowSpec getWorkflow(bool useMC, - its::TrackingMode::Type trmode, - o2::gpu::GPUDataTypes::DeviceType dtype, - bool useGPUWorkflow, - bool upstreamDigits, - bool upstreamClusters, - bool disableRootOutput, - bool useGeom, - int useTrig, - bool overrideBeamPosition); + its::TrackingMode::Type trmode, + o2::gpu::GPUDataTypes::DeviceType dtype, + bool useGPUWorkflow, + bool upstreamDigits, + bool upstreamClusters, + bool disableRootOutput, + bool useGeom, + int useTrig, + bool overrideBeamPosition); } #endif