diff --git a/algo/ca/core/pars/CaInitManager.cxx b/algo/ca/core/pars/CaInitManager.cxx index c02199999cbca27f31934e4fa51aac70b50a4331..47562e049149410c8f2f5c1565a23b34822b40db 100644 --- a/algo/ca/core/pars/CaInitManager.cxx +++ b/algo/ca/core/pars/CaInitManager.cxx @@ -164,8 +164,12 @@ bool InitManager::FormParametersContainer() { fParameters.fActiveSetup = fParameters.fGeometrySetup; for (const auto& station : fvStationInfo) { - fParameters.fActiveSetup.DisableLayer(station.GetDetectorID(), station.GetStationID()); + if (!station.GetTrackingStatus()) { + fParameters.fActiveSetup.DisableLayer(station.GetDetectorID(), station.GetStationID()); + } } + LOG(info) << "CA: Geometry setup\n" << fParameters.fGeometrySetup.ToString(3); + LOG(info) << "CA: Active setup\n" << fParameters.fActiveSetup.ToString(3); } diff --git a/algo/kf/core/geo/KfField.cxx b/algo/kf/core/geo/KfField.cxx index a1c6632af73e8be960216f9a6fd241f39f04cd47..48417db0e37599e49c6d0b8445582a99951f6fc3 100644 --- a/algo/kf/core/geo/KfField.cxx +++ b/algo/kf/core/geo/KfField.cxx @@ -29,7 +29,7 @@ std::string FieldBase<T, EFieldMode::Intrpl>::ToString(int indentLevel, int verb msg << indent << "Field slices:"; for (int iSlice = 0; iSlice < GetNofFieldSlices(); ++iSlice) { const auto& fldSlice = fvFieldSlices[iSlice]; - msg << indent << "\n - " << fldSlice.ToString(indentLevel + 1, verbose); + msg << '\n' << indent << iSlice << ") " << fldSlice.ToString(0, verbose); } return msg.str(); } @@ -45,7 +45,7 @@ std::string FieldBase<T, EFieldMode::Orig>::ToString(int indentLevel, int /*verb msg << indent << "Original field function"; msg << indent << "Field slice z-positions: "; for (int iSlice = 0; iSlice < GetNofFieldSlices(); ++iSlice) { - msg << indent << "\n " << iSlice << ") " << fvFieldSliceZ[iSlice]; + msg << "\n " << indent << iSlice << ") " << fvFieldSliceZ[iSlice]; } return msg.str(); } diff --git a/algo/kf/core/geo/KfMaterialMap.cxx b/algo/kf/core/geo/KfMaterialMap.cxx index c4024ef5823c0fd43fae21953b99a2e0a6441c8d..2307b2bcec769e0c40dd1a38721a03c88481f120 100644 --- a/algo/kf/core/geo/KfMaterialMap.cxx +++ b/algo/kf/core/geo/KfMaterialMap.cxx @@ -151,8 +151,7 @@ std::string MaterialMap::ToString(int indentLevel, int verbose) const if (verbose > 0) { constexpr char indentCh = '\t'; std::string indent(indentLevel, indentCh); - msg << indent - << format("zRef = {:<12} cm, range [{:<12}, {:<12}] cm, nBins = {:<8}, XYmax = {:<12} cm", fZref, fZmin, fZmax, + msg << format("zRef = {:<12} cm, range [{:<12}, {:<12}] cm, nBins = {:<8}, XYmax = {:<12} cm", fZref, fZmin, fZmax, fNbins, fXYmax); if (verbose > 1) { msg << indent << indentCh << "\nContent(rebinned to 10 bins):\n"; @@ -162,14 +161,14 @@ std::string MaterialMap::ToString(int indentLevel, int verbose) const msg << indent << indentCh << setw(15) << "y [cm] \\ x [cm]" << ' '; for (int iX{0}; iX < mapTmp.fNbins; ++iX) { float xRef{-mapTmp.fXYmax + (mapTmp.fXYmax * (2 * iX + 1)) / mapTmp.fNbins}; - msg << indent << indentCh << setw(8) << xRef << ' '; + msg << setw(10) << xRef << ' '; } msg << '\n'; for (int iY{0}; iY < mapTmp.fNbins; ++iY) { float yRef{-mapTmp.fXYmax + (mapTmp.fXYmax * (2 * iY + 1)) / mapTmp.fNbins}; msg << indent << indentCh << setw(15) << yRef << ' '; for (int iX{0}; iX < mapTmp.fNbins; ++iX) { - msg << indent << indentCh << setw(8) << mapTmp.fTable[iX + mapTmp.fNbins * iY] << ' '; + msg << setw(10) << mapTmp.fTable[iX + mapTmp.fNbins * iY] << ' '; } msg << '\n'; } diff --git a/algo/kf/core/geo/KfModuleIndexMap.cxx b/algo/kf/core/geo/KfModuleIndexMap.cxx index 20754d86702686815d77870411c5af7565c63361..300f688760be8ed83f355c3ce1dd0be4ad44158a 100644 --- a/algo/kf/core/geo/KfModuleIndexMap.cxx +++ b/algo/kf/core/geo/KfModuleIndexMap.cxx @@ -30,32 +30,10 @@ namespace cbm::algo::kf constexpr char IndentCh = '\t'; std::string indent(indentLevel, IndentCh); std::stringstream msg; - if constexpr (0) { - msg << '\n' << indent << format("{:<50} ", "Detector internal to external index map: "); - for (auto id : fvDetIntToExt) { - msg << format("{:>8} ", id); - } - msg << '\n' << indent << format("{:<50} ", "Detector external to internal index map: "); - for (auto id : fvDetExtToInt) { - msg << format("{:>8} ", id); - } - msg << '\n' << indent << format("{:<50} ", "First global ID vs. internal detector: "); - for (auto id : fvDetLocOffset) { - msg << format("{:>8} ", id); - } - msg << '\n' << indent << format("{:<50} ", "Local ID to global ID: "); - for (auto id : fvLocToGlb) { - msg << format("{:>8} ", id); - } - msg << '\n' << indent << format("{:<50} ", "Geo ID to (detID:locID): "); - for (const auto& [iDetExt, iLoc] : fvGlbToLoc) { - msg << format("{:>3}:{:<3}", iDetExt, iLoc); - } - } - + msg << indent << format("{:>8} {:>8} {:>8}\n", "det.ID", "loc.ID", "glob.ID"); for (int iGlb = 0; iGlb < GetNofLayers(); ++iGlb) { const auto& [iDetExt, iLoc] = fvGlbToLoc[iGlb]; - msg << indent << format("- ({:>3}, {:>3}) -- {:>3}\n", iDetExt, iLoc, iGlb); + msg << indent << format("{:>8} {:>8} {:>8}\n", iDetExt, iLoc, iGlb); } return msg.str(); diff --git a/algo/kf/core/geo/KfModuleIndexMap.h b/algo/kf/core/geo/KfModuleIndexMap.h index ad7d5a446deed3aa5465a7a07999d113141f0393..68917257c6d67420cd70023d1450037a45f29883 100644 --- a/algo/kf/core/geo/KfModuleIndexMap.h +++ b/algo/kf/core/geo/KfModuleIndexMap.h @@ -144,23 +144,22 @@ namespace cbm::algo::kf { // Check, if the detector id is there auto iDetExtDsbl{static_cast<int>(detIdDisable)}; - if (iDetExtDsbl >= static_cast<int>(fvDetExtToInt.size())) { + if (iDetExtDsbl >= static_cast<int>(fvDetIntToExt.size())) { return; // Nothing to disable, detector is already not in the map } - auto iDetIntDsbl{fvDetExtToInt[iDetExtDsbl]}; - if (fvDetLocOffset[iDetIntDsbl + 1] <= locIdDisable) { - return; // Nothing to disable, component is already not in the map - } - - auto& iGlbDsbl = fvLocToGlb[fvDetLocOffset[iDetIntDsbl] + locIdDisable]; + auto& iGlbDsbl = fvLocToGlb[fvDetLocOffset[fvDetExtToInt[iDetExtDsbl]] + locIdDisable]; if (iGlbDsbl == -1) { return; // Nothing to disable, component is already inactive } fvGlbToLoc.erase(fvGlbToLoc.begin() + iGlbDsbl); // Removing component from glob->(det, loc) map + for (auto& val : fvLocToGlb) { + if (val > iGlbDsbl) { + --val; + } + } iGlbDsbl = -1; - // NOTE: information on disabled detectors stays there, probably we should remove it } // ------------------------------------------------------------------------------------------------------------------- diff --git a/algo/kf/core/geo/KfSetupBuilder.h b/algo/kf/core/geo/KfSetupBuilder.h index b67338ea5be80de96182af24224e51d85e469b0e..a9bb0375d766d553973f62e233023972db31e710 100644 --- a/algo/kf/core/geo/KfSetupBuilder.h +++ b/algo/kf/core/geo/KfSetupBuilder.h @@ -79,6 +79,7 @@ namespace cbm::algo::kf /// \brief Initializes, validates and cashes the parameters /// \throw std::runtime_error If pre-initialization was incomplete + /// \note Does not touch the field function and field type/mode void Init(); /// \brief Creates a setup instance diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx index 0cfd9c1d121e0f54e7cb8f064cf947e8e9cf8b3e..cebb1bc4df1015b8af02099504bba903da6e1a22 100644 --- a/reco/L1/CbmL1.cxx +++ b/reco/L1/CbmL1.cxx @@ -38,7 +38,7 @@ #include "CaToolsDebugger.h" #include "CaToolsField.h" #include "CbmEvent.h" -#include "CbmKfTrackingSetupInitializer.h" +#include "CbmKfTrackingSetupBuilder.h" #include "CbmMCDataObject.h" #include "CbmStsFindTracks.h" #include "CbmStsHit.h" @@ -74,7 +74,7 @@ using cbm::algo::ca::Parameters; using cbm::ca::MCModule; using cbm::ca::TimeSliceReader; using cbm::ca::tools::MaterialHelper; -using cbm::kf::TrackingSetupInitializer; +using cbm::kf::TrackingSetupBuilder; ClassImp(CbmL1); @@ -497,10 +497,10 @@ try { // ** Initialize KF-setup ** // ************************* { - auto pSetupInitializer = std::make_unique<TrackingSetupInitializer>(); - pSetupInitializer->Use(fUseMVD, fUseSTS, fUseMUCH, fUseTRD, fUseTOF); - pSetupInitializer->Init(cbm::algo::kf::EFieldMode::Intrpl); - auto trackerSetup = pSetupInitializer->MakeSetup<float>(); + auto* pSetupBuilder = TrackingSetupBuilder::Instance(); + pSetupBuilder->Use(fUseMVD, fUseSTS, fUseMUCH, fUseTRD, fUseTOF); + pSetupBuilder->SetFieldMode(cbm::algo::kf::EFieldMode::Intrpl); + auto trackerSetup = pSetupBuilder->MakeSetup<float>(); TString outputFile = fSTAPDataDir + "/" + fSTAPDataPrefix + "." + TString(kSTAPSetupSuffix.data()); cbm::algo::kf::SetupBuilder::Store(trackerSetup, outputFile.Data()); fInitManager.SetGeometrySetup(trackerSetup); @@ -552,24 +552,6 @@ try { } fpAlgo->Init(fTrackingMode); - - if constexpr (1) { - // **** FEATURE: KF-SETUP INITIALIZATION ***** - // Creating a setup - auto pSetupInitializer = std::make_unique<TrackingSetupInitializer>(); - pSetupInitializer->Use(fUseMVD, fUseSTS, fUseMUCH, fUseTRD, fUseTOF); - pSetupInitializer->Init(cbm::algo::kf::EFieldMode::Intrpl); - auto trackerSetup = pSetupInitializer->MakeSetup<double>(); - LOG(info) << "!!!!\n!!!!\n!!!!\n!!!! KF SETUP:\n" - << trackerSetup.ToString(0) << "\nsize: " << sizeof(trackerSetup) << "\n!!!!\n!!!!\n!!!!"; - - // Storing setup - cbm::algo::kf::SetupBuilder::Store(trackerSetup, "./trackerSetup.geo.kf.bin"); - - // Reading setup (now in fvec): - } - - // Initialize time-slice reader fpTSReader = std::make_unique<TimeSliceReader>(); fpTSReader->SetDetector(ca::EDetectorID::kMvd, fUseMVD); diff --git a/reco/kfnew/CMakeLists.txt b/reco/kfnew/CMakeLists.txt index 2b02e92bc89ed9400d3d03274768aec3163fa6be..98e15d274ba0589da563d42f72a04b0f1946ca0a 100644 --- a/reco/kfnew/CMakeLists.txt +++ b/reco/kfnew/CMakeLists.txt @@ -6,7 +6,7 @@ set(INCLUDE_DIRECTORIES set(SRCS ${CMAKE_CURRENT_SOURCE_DIR}/CbmKfTarget.cxx - ${CMAKE_CURRENT_SOURCE_DIR}/CbmKfTrackingSetupInitializer.cxx + ${CMAKE_CURRENT_SOURCE_DIR}/CbmKfTrackingSetupBuilder.cxx ) SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS "-O3") @@ -73,7 +73,7 @@ install( FILES CbmKfOriginalField.h CbmKfTarget.h - CbmKfTrackingSetupInitializer.h + CbmKfTrackingSetupBuilder.h DESTINATION include/ ) diff --git a/reco/kfnew/CbmKfTarget.h b/reco/kfnew/CbmKfTarget.h index f9106f4c2c9af3651539ebe2ce57925f21827359..a1a6af8c8bccbd10757691c4ce2b2a915cd4d1a9 100644 --- a/reco/kfnew/CbmKfTarget.h +++ b/reco/kfnew/CbmKfTarget.h @@ -52,6 +52,7 @@ namespace cbm::kf /// \brief Default constructor Target() = default; + /// \brief Destructor ~Target() = default; diff --git a/reco/kfnew/CbmKfTrackingSetupInitializer.cxx b/reco/kfnew/CbmKfTrackingSetupBuilder.cxx similarity index 62% rename from reco/kfnew/CbmKfTrackingSetupInitializer.cxx rename to reco/kfnew/CbmKfTrackingSetupBuilder.cxx index f2cd0fe495d1ec34b94e22fb5946d1b76be492f6..c19f97ed5789921ba4ffabbba07b5a1960d1532b 100644 --- a/reco/kfnew/CbmKfTrackingSetupInitializer.cxx +++ b/reco/kfnew/CbmKfTrackingSetupBuilder.cxx @@ -2,12 +2,12 @@ SPDX-License-Identifier: GPL-3.0-only Authors: Sergei Zharko [committer] */ -/// \file CbmKfTrackingSetupInitializer.cxx +/// \file CbmKfTrackingSetupBuilder.cxx /// \brief Tracking setup initializer in CBM (source) /// \since 28.08.2024 /// \author Sergei Zharko <s.zharko@gsi.de> -#include "CbmKfTrackingSetupInitializer.h" +#include "CbmKfTrackingSetupBuilder.h" #include "CbmKfOriginalField.h" #include "CbmKfTarget.h" @@ -25,15 +25,17 @@ #include <functional> -using cbm::kf::TrackingSetupInitializer; +using cbm::kf::TrackingSetupBuilder; using kf::tools::MaterialMapFactory; // --------------------------------------------------------------------------------------------------------------------- // -bool TrackingSetupInitializer::Init(cbm::algo::kf::EFieldMode fldMode) +// TODO: Provide separate initialization steps for geo layers and field +bool TrackingSetupBuilder::Init() try { using cbm::algo::kf::EFieldType; using cbm::algo::kf::GeoLayer; + using cbm::algo::kf::defs::MinField; fBuilder.Reset(); // Check, if a subsystem exists in the setup @@ -44,11 +46,21 @@ try { fbUseTof &= CbmSetup::Instance()->IsActive(ECbmModuleId::kTof); // Magnetic field initialization - if (FairRunAna::Instance()->GetField()) { - fBuilder.SetFieldProperty(fldMode, OriginalField(), EFieldType::Normal); + if (auto* pField = FairRunAna::Instance()->GetField()) { + LOG(info) << fabs(pField->GetBx(0., 0., 0.)) << ", " << fabs(pField->GetBy(0., 0., 0.)) << ", " + << fabs(pField->GetBz(0., 0., 0.)) << ", " << pField->GetType(); + if ( + pField->GetType() == 0 + && fabs(pField->GetBx(0., 0., 0.)) < MinField< + double> && fabs(pField->GetBy(0., 0., 0.)) < MinField<double> && fabs(pField->GetBz(0., 0., 0.)) < MinField<double>) { + fBuilder.SetFieldProperty(fFieldMode, ZeroField(), EFieldType::Null); + } + else { + fBuilder.SetFieldProperty(fFieldMode, OriginalField(), EFieldType::Normal); + } } else { - fBuilder.SetFieldProperty(fldMode, ZeroField(), EFieldType::Null); + fBuilder.SetFieldProperty(fFieldMode, ZeroField(), EFieldType::Null); } // Tracking station property initialization @@ -73,7 +85,7 @@ try { CollectStations(fbUseTrd ? CbmTrdTrackingInterface::Instance() : nullptr, ETrackingDetID::Trd); CollectStations(fbUseTof ? CbmTofTrackingInterface::Instance() : nullptr, ETrackingDetID::Tof); - // Retriev target properties + // Retrieve target properties const auto* pTarget = Target::Instance(); fBuilder.SetTargetProperty(pTarget->GetX(), pTarget->GetY(), pTarget->GetZ(), pTarget->GetDz(), pTarget->GetRmax()); @@ -83,25 +95,46 @@ try { pMaterialFactory->SetDoRadialProjection(pTarget->GetZ()); pMaterialFactory->SetNraysPerDim(kMatCreatorNrays); fBuilder.SetMaterialMapFactory(pMaterialFactory); - - fBuilder.Init(); - LOG(info) << "kf::TrackingSetupInitializer: Tracking setup was initialized successfully"; + // Set the initialization flags back + fbInitialized = true; + + LOG(info) << "kf::TrackingSetupBuilder: Tracking setup was initialized successfully"; return true; } catch (const std::exception& err) { - LOG(error) << "kf::TrackingSetupInitializer: Tracking setup was not initialized. Reason: " << err.what(); + LOG(error) << "kf::TrackingSetupBuilder: Tracking setup was not initialized. Reason: " << err.what(); return false; } // --------------------------------------------------------------------------------------------------------------------- // -void TrackingSetupInitializer::Use(bool mvd, bool sts, bool much, bool trd, bool tof) +TrackingSetupBuilder* TrackingSetupBuilder::Instance() +{ + if (fpInstance == nullptr) { + std::lock_guard<std::mutex> lock(fMutex); + fpInstance = new TrackingSetupBuilder{}; + } + return fpInstance; +} + +// --------------------------------------------------------------------------------------------------------------------- +// +void TrackingSetupBuilder::SetFieldMode(cbm::algo::kf::EFieldMode fldMode) +{ + fFieldMode = fldMode; + fbInitialized = false; +} + +// --------------------------------------------------------------------------------------------------------------------- +// +void TrackingSetupBuilder::Use(bool mvd, bool sts, bool much, bool trd, bool tof) { - fbUseMvd = mvd; - fbUseSts = sts; - fbUseMuch = much; - fbUseTrd = trd; - fbUseTof = tof; + fbUseMvd = mvd; + fbUseSts = sts; + fbUseMuch = much; + fbUseTrd = trd; + fbUseTof = tof; + fbInitialized = false; } diff --git a/reco/kfnew/CbmKfTrackingSetupInitializer.h b/reco/kfnew/CbmKfTrackingSetupBuilder.h similarity index 67% rename from reco/kfnew/CbmKfTrackingSetupInitializer.h rename to reco/kfnew/CbmKfTrackingSetupBuilder.h index 66e5838d6b80204ba2891ab0620ce43e0578b35c..5aadffec75a97627ce09d026ef94400fb448f5ea 100644 --- a/reco/kfnew/CbmKfTrackingSetupInitializer.h +++ b/reco/kfnew/CbmKfTrackingSetupBuilder.h @@ -2,7 +2,7 @@ SPDX-License-Identifier: GPL-3.0-only Authors: Sergei Zharko [committer] */ -/// \file CbmKfTrackingSetupInitializer.h +/// \file CbmKfTrackingSetupBuilder.h /// \brief Tracking setup initializer in CBM (source) /// \since 28.08.2024 /// \author Sergei Zharko <s.zharko@gsi.de> @@ -32,13 +32,26 @@ namespace cbm::kf END }; - /// \class TrackingSetupInitializer + /// \class TrackingSetupBuilder /// \brief Encapsulation of the kf::Setup initialization routines for CBM - class TrackingSetupInitializer { + class TrackingSetupBuilder { public: - /// \brief Initializes the instance + /// \brief Instance access + static TrackingSetupBuilder* Instance(); + + /// \brief Makes setup object + template<typename T> + cbm::algo::kf::Setup<T> MakeSetup() + { + if (!fbInitialized) { + this->Init(); + } + return fBuilder.MakeSetup<T>(); + } + + /// \brief Sets field mode /// \param fldMode Field mode - bool Init(cbm::algo::kf::EFieldMode fldMode); + void SetFieldMode(cbm::algo::kf::EFieldMode fldMode); /// \brief Enables/disables detector subsystems in the setup /// \param mvd Is MVD used @@ -48,14 +61,26 @@ namespace cbm::kf /// \param tof Is TOF used void Use(bool mvd, bool sts, bool much, bool trd, bool tof); - /// \brief Makes setup object - template<typename T> - cbm::algo::kf::Setup<T> MakeSetup() - { - return fBuilder.MakeSetup<T>(); - } + // Disable copy and move + TrackingSetupBuilder(const TrackingSetupBuilder&) = delete; + TrackingSetupBuilder(TrackingSetupBuilder&&) = delete; + TrackingSetupBuilder& operator=(const TrackingSetupBuilder&) = delete; + TrackingSetupBuilder& operator=(TrackingSetupBuilder&&) = delete; private: + /// \brief Default constructor + TrackingSetupBuilder() = default; + + /// \brief Destructor + ~TrackingSetupBuilder() = default; + + inline static TrackingSetupBuilder* fpInstance{nullptr}; + inline static std::mutex fMutex{}; + + /// \brief Initializes the instance + /// \param fldMode Field mode + bool Init(); + cbm::algo::kf::SetupBuilder fBuilder{}; // Material map creator properties (TODO: Provide setters, if needed) @@ -66,11 +91,18 @@ namespace cbm::kf static constexpr double kTargFieldInitStep{2.5}; ///< Step between nodes in the target field initialization [cm] static constexpr double kTargMaterialOffset{1}; ///< Offset between target upper limit and its material zMax [cm] + cbm::algo::kf::EFieldMode fFieldMode{cbm::algo::kf::EFieldMode::Intrpl}; + bool fbUseMvd{false}; ///< Are MVD stations included in the tracking setup bool fbUseSts{false}; ///< Are STS stations included in the tracking setup bool fbUseMuch{false}; ///< Are MuCh stations included in the tracking setup bool fbUseTrd{false}; ///< Are TRD stations included in the tracking setup bool fbUseTof{false}; ///< Are TOF stations included in the tracking setup + + /// \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 + bool fbInitialized{false}; ///< Check, if the setup builder initialized };