From 1904ab2faacab2c400d242dc5ce58fb41e30421e Mon Sep 17 00:00:00 2001 From: Chengdong Fu <fucd@ihep.ac.cn> Date: Mon, 1 Apr 2024 08:19:58 +0800 Subject: [PATCH] import fitter tool --- Reconstruction/Tracking/CMakeLists.txt | 3 + .../include/Tracking/ITrackFitterTool.h | 40 +++++++ .../Tracking/src/FitterTool/KalTestTool.cpp | 103 ++++++++++++++++++ .../Tracking/src/FitterTool/KalTestTool.h | 43 ++++++++ 4 files changed, 189 insertions(+) create mode 100644 Reconstruction/Tracking/include/Tracking/ITrackFitterTool.h create mode 100644 Reconstruction/Tracking/src/FitterTool/KalTestTool.cpp create mode 100644 Reconstruction/Tracking/src/FitterTool/KalTestTool.h diff --git a/Reconstruction/Tracking/CMakeLists.txt b/Reconstruction/Tracking/CMakeLists.txt index f3e77b47..9ea9ecd6 100644 --- a/Reconstruction/Tracking/CMakeLists.txt +++ b/Reconstruction/Tracking/CMakeLists.txt @@ -1,9 +1,12 @@ +gaudi_add_header_only_library(TrackingLib) + # Modules gaudi_add_module(Tracking SOURCES src/Clupatra/ClupatraAlg.cpp src/Clupatra/clupatra_new.cpp src/FullLDCTracking/FullLDCTrackingAlg.cpp src/TruthTracker/TruthTrackerAlg.cpp + src/FitterTool/KalTestTool.cpp LINK GearSvc EventSeeder TrackSystemSvcLib diff --git a/Reconstruction/Tracking/include/Tracking/ITrackFitterTool.h b/Reconstruction/Tracking/include/Tracking/ITrackFitterTool.h new file mode 100644 index 00000000..4de2b46e --- /dev/null +++ b/Reconstruction/Tracking/include/Tracking/ITrackFitterTool.h @@ -0,0 +1,40 @@ +#ifndef ITrackFitterTool_h +#define ITrackFitterTool_h + +/* + * Description: + * ITrackFitterTool is used to fit a track candidate to obtain track parameter + * + * The interface: + * * Fit: peform on tracker hits according prepared geometry + * + * Author: FU Chengdong <fucd@ihep.ac.cn> + */ + +#include "GaudiKernel/IAlgTool.h" +#include "edm4hep/TrackState.h" +#include <vector> + + + +namespace edm4hep{ + class MutableTrack; + class TrackerHit; +} + +class ITrackFitterTool: virtual public IAlgTool { + public: + + DeclareInterfaceID(ITrackFitterTool, 0, 1); + virtual ~ITrackFitterTool() {} + + virtual int Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits, + const decltype(edm4hep::TrackState::covMatrix)& covMatrix, double maxChi2perHit, bool backward) = 0; + virtual int Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits, + edm4hep::TrackState trackState, double maxChi2perHit, bool backward) = 0; + virtual std::vector<std::pair<edm4hep::TrackerHit, double> >& GetHitsInFit() = 0; + virtual std::vector<std::pair<edm4hep::TrackerHit, double> >& GetOutliers() = 0; + virtual void Clear() = 0; +}; + +#endif diff --git a/Reconstruction/Tracking/src/FitterTool/KalTestTool.cpp b/Reconstruction/Tracking/src/FitterTool/KalTestTool.cpp new file mode 100644 index 00000000..773f1998 --- /dev/null +++ b/Reconstruction/Tracking/src/FitterTool/KalTestTool.cpp @@ -0,0 +1,103 @@ +#include "KalTestTool.h" + +#include "TrackSystemSvc/ITrackSystemSvc.h" +#include "TrackSystemSvc/MarlinTrkUtils.h" +#include "TrackSystemSvc/IMarlinTrack.h" +#include "DetInterface/IGeomSvc.h" + +#include "DD4hep/Detector.h" +#include "DD4hep/DD4hepUnits.h" + +#include "edm4hep/TrackerHit.h" +#include "edm4hep/TrackState.h" +#include "edm4hep/MutableTrack.h" + +DECLARE_COMPONENT(KalTestTool) + +StatusCode KalTestTool::initialize() { + StatusCode sc; + always() << m_fitterName << endmsg; + if (m_fitterName=="KalTest") { + auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc"); + if (!_trackSystemSvc) { + error() << "Failed to find TrackSystemSvc ..." << endmsg; + return StatusCode::FAILURE; + } + m_factoryMarlinTrk = _trackSystemSvc->getTrackSystem(this); + m_factoryMarlinTrk->setOption(MarlinTrk::IMarlinTrkSystem::CFG::useQMS, m_useQMS); + m_factoryMarlinTrk->setOption(MarlinTrk::IMarlinTrkSystem::CFG::usedEdx, m_usedEdx); + m_factoryMarlinTrk->setOption(MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing, m_useSmoothing); + m_factoryMarlinTrk->init(); + } + else { + error() << "fitter " << m_fitterName << " has not been imported" << endmsg; + return StatusCode::FAILURE; + } + + auto _geomSvc = service<IGeomSvc>("GeomSvc"); + if ( !_geomSvc ) { + error() << "Failed to find GeomSvc ..." << endmsg; + return StatusCode::FAILURE; + } + + if (m_magneticField.value()==0) { + const dd4hep::Direction& field = _geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0)); + double Bz = field.z()/dd4hep::tesla; + if (Bz==0) { + error() << "magnetic field = 0, KalmanFilter cannot run" << endmsg; + return StatusCode::FAILURE; + } + m_magneticField = Bz; + } + + return sc; +} + +StatusCode KalTestTool::finalize() { + StatusCode sc; + return sc; +} + +int KalTestTool::Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits, + const decltype(edm4hep::TrackState::covMatrix)& covMatrix, double maxChi2perHit, bool backward) { + if (m_hitsInFit.size()!=0 || m_outliers.size()!=0) { + error() << "Important! vector not clear, still store the data of last event!" << endmsg; + return 0; + } + + if (m_fitterName=="KalTest") { + debug() << "start..." << endmsg; + std::shared_ptr<MarlinTrk::IMarlinTrack> marlinTrack(m_factoryMarlinTrk->createTrack()); + debug() << "created MarlinKalTestTrack" << endmsg; + int status = MarlinTrk::createFinalisedLCIOTrack(marlinTrack.get(), trackHits, &track, backward, covMatrix, m_magneticField, maxChi2perHit); + + marlinTrack->getHitsInFit(m_hitsInFit); + marlinTrack->getOutliers(m_outliers); + return status; + } + + error() << "Don't support the Fitter " << m_fitterName << endmsg; + return 0; +} + +int KalTestTool::Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits, + edm4hep::TrackState trackState, double maxChi2perHit, bool backward) { + if (m_hitsInFit.size()!=0 || m_outliers.size()!=0) { + error() << "Important! vector not clear, still store the data of last event!" << endmsg; + return 0; + } + + if (m_fitterName=="KalTest") { + debug() << "start..." << endmsg; + std::shared_ptr<MarlinTrk::IMarlinTrack> marlinTrack(m_factoryMarlinTrk->createTrack()); + debug() << "created MarlinKalTestTrack" << endmsg; + int status = MarlinTrk::createFinalisedLCIOTrack(marlinTrack.get(), trackHits, &track, backward, &trackState, m_magneticField, maxChi2perHit); + + marlinTrack->getHitsInFit(m_hitsInFit); + marlinTrack->getOutliers(m_outliers); + return status; + } + + error() << "Don't support the Fitter " << m_fitterName << endmsg; + return 0; +} diff --git a/Reconstruction/Tracking/src/FitterTool/KalTestTool.h b/Reconstruction/Tracking/src/FitterTool/KalTestTool.h new file mode 100644 index 00000000..0cce58bc --- /dev/null +++ b/Reconstruction/Tracking/src/FitterTool/KalTestTool.h @@ -0,0 +1,43 @@ +#ifndef KalTestTool_h +#define KalTestTool_h + +#include "GaudiKernel/AlgTool.h" +#include "Tracking/ITrackFitterTool.h" +#include <vector> + +namespace MarlinTrk { + class IMarlinTrkSystem ; +} + +class KalTestTool : public extends<AlgTool, ITrackFitterTool> { + public: + using extends::extends; + //KalTestTool(void* p) { m_pAlgUsing=p; }; + + virtual int Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits, + const decltype(edm4hep::TrackState::covMatrix)& covMatrix, double maxChi2perHit, bool backward = true) override; + virtual int Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits, + edm4hep::TrackState trackState, double maxChi2perHit, bool backward = true) override; + + StatusCode initialize() override; + StatusCode finalize() override; + + std::vector<std::pair<edm4hep::TrackerHit, double> >& GetHitsInFit() override {return m_hitsInFit;}; + std::vector<std::pair<edm4hep::TrackerHit, double> >& GetOutliers() override {return m_outliers;}; + void Clear() override {m_hitsInFit.clear(); m_outliers.clear();}; + + private: + Gaudi::Property<std::string> m_fitterName{this, "Fitter", "KalTest"}; + Gaudi::Property<bool> m_useQMS{this, "MSOn", true}; + Gaudi::Property<bool> m_usedEdx{this, "EnergyLossOn", true}; + Gaudi::Property<bool> m_useSmoothing{this, "Smooth", true}; + Gaudi::Property<double> m_magneticField{this, "MagneticField", 0}; + + MarlinTrk::IMarlinTrkSystem* m_factoryMarlinTrk = nullptr; + + void* m_pAlgUsing = nullptr; + std::vector<std::pair<edm4hep::TrackerHit, double> > m_hitsInFit ; + std::vector<std::pair<edm4hep::TrackerHit, double> > m_outliers ; +}; + +#endif -- GitLab