diff --git a/algo/ca/core/pars/CaParameters.h b/algo/ca/core/pars/CaParameters.h index de9c472588c1963e2be56ee923d730fb0400882c..a3386d9753bd08c8d22691cff96804ef9a02761c 100644 --- a/algo/ca/core/pars/CaParameters.h +++ b/algo/ca/core/pars/CaParameters.h @@ -74,7 +74,9 @@ namespace cbm::algo::ca /// \brief Copy constructor with type conversion template<typename DataIn> Parameters(const Parameters<DataIn>& other) - : fMaxDoubletsPerSinglet(other.GetMaxDoubletsPerSinglet()) + : fGeometrySetup(other.GetGeometrySetup()) + , fActiveSetup(other.GetActiveSetup()) + , fMaxDoubletsPerSinglet(other.GetMaxDoubletsPerSinglet()) , fMaxTripletPerDoublets(other.GetMaxTripletPerDoublets()) , fCAIterations(other.GetCAIterations()) , fVertexFieldValue(other.GetVertexFieldValue()) diff --git a/reco/L1/CMakeLists.txt b/reco/L1/CMakeLists.txt index 84e5bd1bbeb64541968f1769ea63017e8fbc01a3..4a0da6c73a52643eb24dff5ac87629790ee84c94 100644 --- a/reco/L1/CMakeLists.txt +++ b/reco/L1/CMakeLists.txt @@ -26,6 +26,7 @@ set(SRCS ########################################################################### CbmCaMCModule.cxx CbmCaTimeSliceReader.cxx + CbmCaParametersHandler.cxx CbmL1.cxx OffLineInterface/CbmL1StsTrackFinder.cxx @@ -77,6 +78,7 @@ set(HEADERS CbmL1Track.h CbmL1Vtx.h CbmCaTimeSliceReader.h + CbmCaParametersHandler.h L1Algo/utils/CaUvConverter.h catools/CaToolsWindowFinder.h catools/CaToolsLinkKey.h diff --git a/reco/L1/CbmCaMCModule.h b/reco/L1/CbmCaMCModule.h index ce93b7500ee369bcf3317fbcab01d31351a93a8e..010762ce17aa48fc983adb9d9736ffce777125aa 100644 --- a/reco/L1/CbmCaMCModule.h +++ b/reco/L1/CbmCaMCModule.h @@ -147,7 +147,7 @@ namespace cbm::ca /// @brief Registers CA parameters object /// @param pParameters A shared pointer to the parameters object - void RegisterParameters(std::shared_ptr<ca::Parameters<fvec>>& pParameters) { fpParameters = pParameters; } + void RegisterParameters(std::shared_ptr<ca::Parameters<float>>& pParameters) { fpParameters = pParameters; } /// @brief Registers debug hit container /// @param vQaHits Reference to debug hit container @@ -228,7 +228,7 @@ namespace cbm::ca int fVerbose = 1; ///< Verbosity level int fPerformanceMode = -1; ///< Mode of performance - std::shared_ptr<ca::Parameters<fvec>> fpParameters = nullptr; ///< Pointer to tracking parameters object + std::shared_ptr<ca::Parameters<float>> fpParameters = nullptr; ///< Pointer to tracking parameters object // ------ Input data branches const CbmTimeSlice* fpTimeSlice = nullptr; ///< Current time slice CbmMCEventList* fpMCEventList = nullptr; ///< MC event list diff --git a/reco/L1/CbmCaParametersHandler.cxx b/reco/L1/CbmCaParametersHandler.cxx new file mode 100644 index 0000000000000000000000000000000000000000..e30d7b53cb9321ecff30d4108b35a9272c1ad844 --- /dev/null +++ b/reco/L1/CbmCaParametersHandler.cxx @@ -0,0 +1,60 @@ +/* Copyright (C) 2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt + SPDX-License-Identifier: GPL-3.0-only + Authors: Sergei Zharko [committer] */ + +/// \file CbmCaParametersHandler.cxx +/// \brief Handles an instance of the CA-parameters as a shared pointer (implementation) +/// \since 24.10.2024 +/// \author Sergei Zharko <s.zharko@gsi.de> + +#include "CbmCaParametersHandler.h" + +#include "CaInitManager.h" +#include "CbmKfTrackingSetupBuilder.h" + +#include <sstream> + +namespace cbm::ca +{ + // ------------------------------------------------------------------------------------------------------------------- + // + ParametersHandler* ParametersHandler::Instance() + { + if (fpInstance == nullptr) { + std::lock_guard<std::mutex> lock(fMutex); + fpInstance = new ParametersHandler{}; + } + return fpInstance; + } + + // ------------------------------------------------------------------------------------------------------------------- + // + const ParametersHandler::ParametersPtr_t ParametersHandler::Get(const std::string& name) + { + if (fsInputName.empty()) { + fsInputName = name; + } + else if (fsInputName != name) { + // TODO: More accurate check on the files (the path can be different, but files can be the same) + std::stringstream msg; + msg << "ParametersHandler::Get: an attempt to re-define an instance of CA-parameters from " + << "a different path: \"" << name << "\". The parameters were provided previously from \"" << fsInputName + << "\""; + throw std::logic_error(msg.str()); + } + + if (!fpParameters.get()) { + using cbm::algo::kf::EFieldMode; + using cbm::kf::TrackingSetupBuilder; + // TODO: Probably, make a template from the floating-point data-type? + // Point: having setup of double, defined in the parameters. + // But, if the kf-setup will not be a part of the ca::Parameters, it would not be needed; + ca::InitManager manager; + manager.ReadParametersObject(fsInputName.c_str()); + manager.SetGeometrySetup(TrackingSetupBuilder::Instance()->MakeSetup<ca::fvec>(EFieldMode::Orig)); + fpParameters = std::make_shared<ca::Parameters<float>>(ca::Parameters<float>(manager.TakeParameters())); + } + + return fpParameters; + } +} // namespace cbm::ca diff --git a/reco/L1/CbmCaParametersHandler.h b/reco/L1/CbmCaParametersHandler.h new file mode 100644 index 0000000000000000000000000000000000000000..c938df632a56398d00b326b561ee4b2af40245fd --- /dev/null +++ b/reco/L1/CbmCaParametersHandler.h @@ -0,0 +1,60 @@ +/* Copyright (C) 2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt + SPDX-License-Identifier: GPL-3.0-only + Authors: Sergei Zharko [committer] */ + +/// \file CbmCaParametersHandler.h +/// \brief Handles an instance of the CA-parameters as a shared pointer (header) +/// \since 24.10.2024 +/// \author Sergei Zharko <s.zharko@gsi.de> +/* Copyright (C) 2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt + SPDX-License-Identifier: GPL-3.0-only + Authors: Sergei Zharko [committer] */ + +/// \file CbmCaParametersHandler.h +/// \brief Handles an instance of the CA-parameters as a shared pointer (header) +/// \since 24.10.2024 +/// \author Sergei Zharko <s.zharko@gsi.de> + +#pragma once + +#include "CaParameters.h" +#include "CbmL1DetectorID.h" + +#include <memory> + + +namespace cbm::ca +{ + /// \brief Handles an shared pointer of CA parameters + class ParametersHandler { + using ParametersPtr_t = std::shared_ptr<cbm::algo::ca::Parameters<float>>; + + public: + /// \brief Instance access + static ParametersHandler* Instance(); + + /// \brief Returns an shared pointer to the parameters instance + /// \param filename A name of the file with the parameters + /// \note If the parameters instance was read from different file, an exception will be thrown + /// \throw std::logic_err If there is an attempt to read parameters from two different sources + const ParametersPtr_t Get(const std::string& filename); + + // Disable copy and move + ParametersHandler(const ParametersHandler&) = delete; + ParametersHandler(ParametersHandler&&) = delete; + ParametersHandler& operator=(const ParametersHandler&) = delete; + ParametersHandler& operator=(ParametersHandler&&) = delete; + + private: + /// \brief Default constructor + ParametersHandler() = default; + + /// \brief Destructor + ~ParametersHandler() = default; + + inline static ParametersHandler* fpInstance{nullptr}; + inline static std::mutex fMutex{}; + std::string fsInputName{""}; ///< Name of the input ca.par file + ParametersPtr_t fpParameters{nullptr}; ///< ca::Parameters instance (double precision) + }; +} // namespace cbm::ca diff --git a/reco/L1/CbmCaTimeSliceReader.h b/reco/L1/CbmCaTimeSliceReader.h index 908b28f01140b12dc1e0ff6996bd891e674af60b..90fac5141b0a5fd5c2a73290e96f160da4b0f24d 100644 --- a/reco/L1/CbmCaTimeSliceReader.h +++ b/reco/L1/CbmCaTimeSliceReader.h @@ -109,7 +109,7 @@ namespace cbm::ca /// @brief Registers CA parameters object /// @param pParameters A shared pointer to the parameters object - void RegisterParameters(std::shared_ptr<ca::Parameters<fvec>>& pParameters) { fpParameters = pParameters; } + void RegisterParameters(std::shared_ptr<ca::Parameters<float>>& pParameters) { fpParameters = pParameters; } /// @brief Registers the CA IO data manager instance /// @param pIODataManager Shared pointer to the IO data manager instance @@ -185,7 +185,7 @@ namespace cbm::ca ca::Vector<CbmL1HitDebugInfo>* fpvQaHits = nullptr; ///< Pointer to array of debug hits ca::Vector<CbmL1Track>* fpvTracks = nullptr; ///< Pointer to array of reconstructed tracks std::shared_ptr<ca::DataManager> fpIODataManager = nullptr; ///< Pointer to input data manager - std::shared_ptr<ca::Parameters<fvec>> fpParameters = nullptr; ///< Pointer to tracking parameters object + std::shared_ptr<ca::Parameters<float>> fpParameters = nullptr; ///< Pointer to tracking parameters object // Maps of hit indexes: ext -> int DetIdArr_t<std::unordered_map<int, int>> fvmHitExtToIntIndexMap; ///< Hit index map ext -> int diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx index e945d5127c5e31abb7d9affe6d357bb41c974d45..0f934b50e9af0a0f06fd153e623d10456f49ded9 100644 --- a/reco/L1/CbmL1.cxx +++ b/reco/L1/CbmL1.cxx @@ -505,9 +505,10 @@ try { // // ** Send formed parameters object to ca::Framework instance ** // + std::shared_ptr<ca::Parameters<float>> pParameters{nullptr}; { auto parameters = fInitManager.TakeParameters(); - fpParameters = std::make_shared<ca::Parameters<ca::fvec>>(parameters); + pParameters = std::make_shared<ca::Parameters<float>>(parameters); fpAlgo->ReceiveParameters(std::move(parameters)); } fpAlgo->Init(fTrackingMode); @@ -522,7 +523,7 @@ try { fpTSReader->SetDetector(ca::EDetectorID::kTrd, fUseTRD); fpTSReader->SetDetector(ca::EDetectorID::kTof, fUseTOF); - fpTSReader->RegisterParameters(fpParameters); + fpTSReader->RegisterParameters(pParameters); fpTSReader->RegisterHitIndexContainer(fvExternalHits); fpTSReader->RegisterIODataManager(fpIODataManager); fpTSReader->RegisterQaHitContainer(fvHitDebugInfo); @@ -541,7 +542,7 @@ try { fpMCModule->RegisterMCData(fMCData); fpMCModule->RegisterRecoTrackContainer(fvRecoTracks); fpMCModule->RegisterHitIndexContainer(fvExternalHits); - fpMCModule->RegisterParameters(fpParameters); + fpMCModule->RegisterParameters(pParameters); fpMCModule->RegisterQaHitContainer(fvHitDebugInfo); fpMCModule->RegisterFirstHitIndexes(fpTSReader->GetHitFirstIndexDet()); if (!fpMCModule->InitRun()) { @@ -549,23 +550,23 @@ try { } } - LOG(info) << fpParameters->ToString(1); + LOG(info) << pParameters->ToString(1); LOG(info) << "----- Numbers of stations active in tracking -----"; - LOG(info) << " MVD: " << fpParameters->GetNstationsActive(ca::EDetectorID::kMvd); - LOG(info) << " STS: " << fpParameters->GetNstationsActive(ca::EDetectorID::kSts); - LOG(info) << " MuCh: " << fpParameters->GetNstationsActive(ca::EDetectorID::kMuch); - LOG(info) << " TRD: " << fpParameters->GetNstationsActive(ca::EDetectorID::kTrd); - LOG(info) << " TOF: " << fpParameters->GetNstationsActive(ca::EDetectorID::kTof); - LOG(info) << " Total: " << fpParameters->GetNstationsActive(); + LOG(info) << " MVD: " << pParameters->GetNstationsActive(ca::EDetectorID::kMvd); + LOG(info) << " STS: " << pParameters->GetNstationsActive(ca::EDetectorID::kSts); + LOG(info) << " MuCh: " << pParameters->GetNstationsActive(ca::EDetectorID::kMuch); + LOG(info) << " TRD: " << pParameters->GetNstationsActive(ca::EDetectorID::kTrd); + LOG(info) << " TOF: " << pParameters->GetNstationsActive(ca::EDetectorID::kTof); + LOG(info) << " Total: " << pParameters->GetNstationsActive(); - fNStations = fpParameters->GetNstationsActive(); + fNStations = pParameters->GetNstationsActive(); // monitor the material { LOG(info) << "\033[31;1m-------------------- L1 material -----------------------------\033[0m"; fMaterialMonitor.clear(); for (int i = 0; i < fNStations; i++) { - ca::MaterialMonitor m(&(fpAlgo->GetParameters().GetThicknessMaps()[i]), Form("station %d", i)); + ca::MaterialMonitor m(&(pParameters->GetThicknessMaps()[i]), Form("station %d", i)); LOG(info) << m.ToString(); fMaterialMonitor.push_back(m); } diff --git a/reco/L1/CbmL1.h b/reco/L1/CbmL1.h index 5c8c015c45d429c11c07439ff8726ae68f326489..3d85ccf17b47284a22da855663b1a28c524643b3 100644 --- a/reco/L1/CbmL1.h +++ b/reco/L1/CbmL1.h @@ -430,7 +430,6 @@ class CbmL1 : public FairTask { std::unique_ptr<cbm::ca::TimeSliceReader> fpTSReader = nullptr; ///< event/TS reader std::unique_ptr<cbm::ca::MCModule> fpMCModule = nullptr; ///< MC module - std::shared_ptr<ca::Parameters<fvec>> fpParameters = nullptr; ///< External parameters object cbm::ca::tools::MCData fMCData; ///< MC Data object ca::InitManager fInitManager; ///< Tracking parameters data manager diff --git a/reco/L1/qa/CbmCaInputQaSetup.cxx b/reco/L1/qa/CbmCaInputQaSetup.cxx index 561882768407d0906f1f4e302708a4c32a8999ad..1224bcb0179644fb1a4cf4107f5ec2db017d50ea 100644 --- a/reco/L1/qa/CbmCaInputQaSetup.cxx +++ b/reco/L1/qa/CbmCaInputQaSetup.cxx @@ -9,8 +9,7 @@ #include "CbmCaInputQaSetup.h" -#include "CaInitManager.h" -#include "CbmKfTrackingSetupBuilder.h" +#include "CbmCaParametersHandler.h" #include "CbmL1DetectorID.h" #include "CbmMCDataManager.h" #include "FairRootManager.h" @@ -254,22 +253,10 @@ void InputQaSetup::ExecQa() InitStatus InputQaSetup::InitQa() try { LOG(info) << fName << ": initializing... "; - auto* pSetupBuilder = cbm::kf::TrackingSetupBuilder::Instance(); - auto CheckPresence = [&](ca::EDetectorID detID) { fvbUseDet[detID] = pSetupBuilder->Has(detID); }; - CheckPresence(ca::EDetectorID::kMvd); - CheckPresence(ca::EDetectorID::kSts); - CheckPresence(ca::EDetectorID::kMuch); - CheckPresence(ca::EDetectorID::kTrd); - CheckPresence(ca::EDetectorID::kTof); // Tracking parameters - { - using cbm::algo::kf::EFieldMode; - ca::InitManager manager; - manager.ReadParametersObject(fsParametersFilename.c_str()); - manager.SetGeometrySetup(pSetupBuilder->MakeSetup<ca::fvec>(EFieldMode::Intrpl)); - fpParameters = std::make_unique<ca::Parameters<ca::fvec>>(manager.TakeParameters()); - } + fpParameters = cbm::ca::ParametersHandler::Instance()->Get(fsParametersFilename); + LOG(info) << fName << ": parameters instance, reference: " << fpParameters.use_count(); auto pFairManager = FairRootManager::Instance(); assert(pFairManager); diff --git a/reco/L1/qa/CbmCaInputQaSetup.h b/reco/L1/qa/CbmCaInputQaSetup.h index fd4d08f7ef5afe4c7a56234bda3ba577f9181b76..2abce4ec5054986187e4826cbc4e89426b6ed871 100644 --- a/reco/L1/qa/CbmCaInputQaSetup.h +++ b/reco/L1/qa/CbmCaInputQaSetup.h @@ -84,7 +84,7 @@ namespace cbm::ca CbmMCDataObject* fpMCEventHeader = nullptr; ///< Pointer to MC event header CbmMCEventList* fpMCEventList = nullptr; ///< Pointer to MC event list - std::unique_ptr<ca::Parameters<ca::fvec>> fpParameters = nullptr; ///< Pointer to CA parameters object + std::shared_ptr<ca::Parameters<float>> fpParameters = nullptr; ///< Pointer to CA parameters object std::string fsParametersFilename = ""; ///< Filename for the tracking parameters DetIdArr_t<std::vector<double>> fvXmin; diff --git a/reco/L1/qa/CbmCaOutputQa.cxx b/reco/L1/qa/CbmCaOutputQa.cxx index 5a49b16b6a436bdbd1e1c6590b3450039eb1001d..a78dc04e3d88fb67ba9b62d75431a4f55fc160a3 100644 --- a/reco/L1/qa/CbmCaOutputQa.cxx +++ b/reco/L1/qa/CbmCaOutputQa.cxx @@ -9,10 +9,8 @@ #include "CbmCaOutputQa.h" -#include "CaInitManager.h" #include "CbmCaMCModule.h" -#include "CbmKfTrackingSetupBuilder.h" -#include "CbmQaCanvas.h" +#include "CbmCaParametersHandler.h" #include "FairRootManager.h" #include "Logger.h" #include "TAttLine.h" @@ -796,14 +794,8 @@ try { throw std::runtime_error(errMsg.str()); } - { - using cbm::algo::kf::EFieldMode; - using cbm::kf::TrackingSetupBuilder; - ca::InitManager manager; - manager.ReadParametersObject(fsParametersFilename.c_str()); - manager.SetGeometrySetup(TrackingSetupBuilder::Instance()->MakeSetup<ca::fvec>(EFieldMode::Intrpl)); - fpParameters = std::make_shared<ca::Parameters<ca::fvec>>(manager.TakeParameters()); - } + fpParameters = cbm::ca::ParametersHandler::Instance()->Get(fsParametersFilename); + LOG(info) << fName << ": parameters instance, reference: " << fpParameters.use_count(); // Turn off detectors that are not used in the reconstruction setup diff --git a/reco/L1/qa/CbmCaOutputQa.h b/reco/L1/qa/CbmCaOutputQa.h index e832104c5255eb49606bc8ed43477b0dcb59df29..5fe0e88bf1ca6ca3b63a0dc8c7598514106e31b3 100644 --- a/reco/L1/qa/CbmCaOutputQa.h +++ b/reco/L1/qa/CbmCaOutputQa.h @@ -258,7 +258,7 @@ namespace cbm::ca std::shared_ptr<MCModule> fpMCModule = nullptr; ///< MC module std::shared_ptr<ca::DataManager> fpDataManager = nullptr; ///< Data manager std::shared_ptr<tools::Debugger> fpDebugger = nullptr; ///< Debugger - std::shared_ptr<ca::Parameters<fvec>> fpParameters = nullptr; ///< Tracking parameters object + std::shared_ptr<ca::Parameters<float>> fpParameters = nullptr; ///< Tracking parameters object ca::Vector<CbmL1HitId> fvHitIds{"CbmCaOutputQa::fvHitIds"}; ca::Vector<CbmL1HitDebugInfo> fvHits{"CbmCaOutputQa::fvHits"}; diff --git a/reco/L1/qa/CbmCaTrackTypeQa.cxx b/reco/L1/qa/CbmCaTrackTypeQa.cxx index f2febcd2693f4f5ea7eb3a2fcdd66b6986e08778..3a8bbe32f0dff2d0bfed6a1a3def36cefca70bd7 100644 --- a/reco/L1/qa/CbmCaTrackTypeQa.cxx +++ b/reco/L1/qa/CbmCaTrackTypeQa.cxx @@ -239,8 +239,8 @@ void TrackTypeQa::Init() // Track fitter fTrackFit.SetDoFitVelocity(true); // TODO: set flag to the configuration - fTrackFit.SetMask(fmask::One()); - fFieldRegion = kf::FieldRegion<fvec>(kf::GlobalField::fgOriginalFieldType, kf::GlobalField::fgOriginalField); + fTrackFit.SetMask(true); + fFieldRegion = kf::FieldRegion<double>(kf::GlobalField::fgOriginalFieldType, kf::GlobalField::fgOriginalField); } // --------------------------------------------------------------------------------------------------------------------- @@ -324,15 +324,15 @@ void TrackTypeQa::FillRecoTrack(int iTrkReco, double weight) { // Create an MC point for track vertex MCPoint mcTrkVertex = mcTrack.GetVertexPoint(); - TrackParamV trPar(recoTrack); + kf::TrackParamD trPar(recoTrack); fTrackFit.SetTrack(trPar); // Add material effects int iStFst = (*fpvHits)[recoTrack.GetFirstHitIndex()].GetStationId(); - double dZ = mcTrkVertex.GetZ() - fpParameters->GetStation(iStFst).fZ[0]; + double dZ = mcTrkVertex.GetZ() - fpParameters->GetStation(iStFst).GetZ(); int direction = (dZ > 0.) ? 1 : -1; for (int iSt = iStFst; (iSt >= 0) && (iSt < fpParameters->GetNstationsActive()) - && (direction * (mcTrkVertex.GetZ() - fpParameters->GetStation(iSt).fZ[0]) > 0); + && (direction * (mcTrkVertex.GetZ() - fpParameters->GetStation(iSt).GetZ()) > 0); iSt += direction) { fTrackFit.Extrapolate(fpParameters->GetStation(iSt).fZ, fFieldRegion); auto radThick = fpParameters->GetActiveSetup().GetMaterial(iSt).GetThicknessX0(fTrackFit.Tr().GetX(), diff --git a/reco/L1/qa/CbmCaTrackTypeQa.h b/reco/L1/qa/CbmCaTrackTypeQa.h index ef0e0a12d95c312ed72724cb0e1b30b3033d3a79..7f0d0ba8f4b4724d52a3658bbf358319b154a87c 100644 --- a/reco/L1/qa/CbmCaTrackTypeQa.h +++ b/reco/L1/qa/CbmCaTrackTypeQa.h @@ -160,7 +160,7 @@ namespace cbm::ca /// @brief Registers CA parameters object /// @param pParameters A shared pointer to the parameters object - void RegisterParameters(std::shared_ptr<ca::Parameters<ca::fvec>>& pParameters) { fpParameters = pParameters; } + void RegisterParameters(std::shared_ptr<ca::Parameters<float>>& pParameters) { fpParameters = pParameters; } /// @brief Sets drawing attributes for histograms /// @param markerCol Marker color @@ -293,8 +293,8 @@ namespace cbm::ca TProfile* fph_stations_point = nullptr; ///< Average number of stations with MC point TProfile* fph_stations_hit = nullptr; ///< Average number of stations with hit - cbm::algo::kf::TrackKalmanFilter<ca::fvec> fTrackFit; ///< Track fitter - cbm::algo::kf::FieldRegion<ca::fvec> fFieldRegion; ///< Magnetic field + cbm::algo::kf::TrackKalmanFilter<double> fTrackFit; ///< Track fitter + cbm::algo::kf::FieldRegion<double> fFieldRegion; ///< Magnetic field int fCounterMC = 0; ///< Counter of MC tracks int fCounterClones = 0; ///< Counter of clone tracks @@ -311,7 +311,7 @@ namespace cbm::ca ca::Vector<CbmL1Track>* fpvRecoTracks = nullptr; ///< Pointer to vector of reconstructed tracks ca::Vector<CbmL1HitDebugInfo>* fpvHits = nullptr; ///< Pointer to vector of reconstructed hits tools::MCData* fpMCData = nullptr; ///< Pointer to MC data object - std::shared_ptr<ca::Parameters<ca::fvec>> fpParameters = nullptr; ///< Pointer to parameters object + std::shared_ptr<ca::Parameters<float>> fpParameters = nullptr; ///< Pointer to parameters object // ** Cuts on tracks for a given track class ** diff --git a/reco/kfnew/CbmKfTrackingSetupBuilder.cxx b/reco/kfnew/CbmKfTrackingSetupBuilder.cxx index 315065019f71d02829019e30052ebf1df7e30552..356242cbcfea78e67d2780e936c83550ec486347 100644 --- a/reco/kfnew/CbmKfTrackingSetupBuilder.cxx +++ b/reco/kfnew/CbmKfTrackingSetupBuilder.cxx @@ -58,6 +58,18 @@ void TrackingSetupBuilder::CheckDetectorPresence() } } +// --------------------------------------------------------------------------------------------------------------------- +// +const std::shared_ptr<cbm::algo::kf::Setup<double>> TrackingSetupBuilder::GetSharedGeoSetup() +{ + using cbm::algo::kf::EFieldMode; + using cbm::algo::kf::Setup; + if (!fpGeoSetup.get()) { + fpGeoSetup = std::make_shared<Setup<double>>(this->MakeSetup<double>(EFieldMode::Orig)); + } + return fpGeoSetup; +} + // --------------------------------------------------------------------------------------------------------------------- // void TrackingSetupBuilder::Init() diff --git a/reco/kfnew/CbmKfTrackingSetupBuilder.h b/reco/kfnew/CbmKfTrackingSetupBuilder.h index bc8fabc43ee5ea8b614ed291a47ef05e18501428..72f240b75f10764df6aba8e85eb4a7ddce082808 100644 --- a/reco/kfnew/CbmKfTrackingSetupBuilder.h +++ b/reco/kfnew/CbmKfTrackingSetupBuilder.h @@ -25,6 +25,11 @@ namespace cbm::kf /// \brief Instance access static TrackingSetupBuilder* Instance(); + /// \brief Gets a shared pointer to the geometry setup + /// \note The original magnetic field is defined. + /// \note Use-cases: precise fit in physical analyses and QA. + const std::shared_ptr<cbm::algo::kf::Setup<double>> GetSharedGeoSetup(); + /// \brief Makes setup object /// \param fldMode Field mode (kf::EFiledMode) template<typename T> @@ -79,6 +84,11 @@ namespace cbm::kf cbm::algo::kf::SetupBuilder fBuilder{}; ///< KF-setup builder DetectorIDArray_t<bool> fvbDetUsed{{false}}; ///< Detector subsystem usage flag + /// \brief An instance of the tracking KF-setup in a double precision + /// \note The original magnetic field is defined. + /// \note Use-cases: precise fit in physical analyses and QA. + std::shared_ptr<cbm::algo::kf::Setup<double>> fpGeoSetup{nullptr}; + /// \brief Checks, if the setup was already initialized /// \note Each call of the setup initializer resets the setup builder, so the initialization is called /// in the next MakeSetup call