ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimTrackFitterTool.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
6
7#include "GaudiKernel/MsgStream.h"
8
9#include <sstream>
10#include <iostream>
11#include <fstream>
12
15 const std::string& name,
16 const IInterface* parent)
17 : FPGATrackSimTrackingToolBase(type, name, parent)
18{
19}
20
21
22// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
24{
25 ATH_MSG_DEBUG("FPGATrackSimTrackFitterTool::initialize()");
26
28 ATH_CHECK(m_FPGATrackSimBank.retrieve());
29 if (m_useSpacePoints) ATH_CHECK(m_spRoadFilterTool.retrieve(EnableTool{m_spRoadFilterTool}));
30
31 const FPGATrackSimFitConstantBank* nominalbank;
32 std::vector<const FPGATrackSimFitConstantBank*> bankvec;
33 if(!m_do2ndStage){
34 nominalbank = m_FPGATrackSimBank->FitConstantBank_1st();
35 if (!m_guessHits) {
36 for (unsigned int iplane = 0; iplane < m_FPGATrackSimMapping->PlaneMap_1st(0)->getNLogiLayers(); iplane++) {
37 const FPGATrackSimFitConstantBank* bank = m_FPGATrackSimBank->FitConstantBank_1st(iplane);
38 bankvec.push_back(bank);
39 }
40 }
41 }
42 else {
43 nominalbank = m_FPGATrackSimBank->FitConstantBank_2nd();
44 if (!m_guessHits) {
45 for (unsigned int iplane = 0; iplane < m_FPGATrackSimMapping->PlaneMap_2nd(0)->getNLogiLayers(); iplane++) {
46 const FPGATrackSimFitConstantBank* bank = m_FPGATrackSimBank->FitConstantBank_2nd(iplane);
47 bankvec.push_back(bank);
48 }
49 }
50 }
51
52 MsgStream m(msgSvc(), "TrackFitter");
53 m.setLevel(msg().level());
54 m_tfpobj = std::unique_ptr<TrackFitter>(new TrackFitter(nominalbank, bankvec, m_guessHits));
55
56 if(!m_do2ndStage) {
57 m_tfpobj->setPlaneMap(m_FPGATrackSimMapping->PlaneMap_1st(0));
58 m_tfpobj->setRegionMap(m_FPGATrackSimMapping->RegionMap_1st());
59 } else {
60 m_tfpobj->setPlaneMap(m_FPGATrackSimMapping->PlaneMap_2nd(0));
61 m_tfpobj->setRegionMap(m_FPGATrackSimMapping->RegionMap_2nd());
62 }
63
64 // set parameter object to TrackFitter
65 m_tfpobj->setChi2DofRecoveryMin(m_chi2dof_recovery_min);
66 m_tfpobj->setChi2DofRecoveryMax(m_chi2dof_recovery_max);
67
68 m_tfpobj->setDoMajority(m_doMajority);
69
70 m_tfpobj->setRequireFirst(0);
71 m_tfpobj->setDoSecondStage(m_do2ndStage);
72
73 m_tfpobj->setNorecoveryNhits(m_noRecoveryNHits);
74
75 m_tfpobj->setFitFromRoad(m_fitFromRoad);
76
77 if (!m_guessHits && m_doMissingHitsChecks) ATH_MSG_WARNING("We can't do missing hits check if we don't guess hits");
78 m_tfpobj->setDoMissingHitsCheck(m_doMissingHitsChecks);
79 m_tfpobj->setIdealCoordFitType(static_cast<TrackCorrType>(m_idealCoordFitType.value()));
80 m_tfpobj->setDoDeltaGPhis(m_doDeltaGPhis);
81
82 return StatusCode::SUCCESS;
83}
84
85// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
86StatusCode FPGATrackSimTrackFitterTool::getTracks(std::vector<std::shared_ptr<const FPGATrackSimRoad>>& roads, std::vector<FPGATrackSimTrack>& tracks, const FPGATrackSimTrackPars& min, const FPGATrackSimTrackPars& max) {
87 // elaborate the next event
88 if (!m_fitFromRoad) ATH_CHECK(setRoadSectors(roads)); // we do not need to set sectors in this case
89 int status = m_tfpobj->fitTracks(roads,tracks);
90 if (status != FITTRACKS_OK) return StatusCode::FAILURE;
91
92 // Make sure none of our track parameters go outside the appropriate boundary
93 for (auto& track : tracks) {
94 track.setQOverPt(std::clamp(static_cast<double>(track.getQOverPt()),
96 track.setEta(std::clamp(static_cast<double>(track.getEta()),
98 track.setPhi(std::clamp(static_cast<double>(track.getPhi()),
100 track.setD0(std::clamp(static_cast<double>(track.getD0()),
102 track.setZ0(std::clamp(static_cast<double>(track.getZ0()),
104 }
105
106 if (msgLvl(MSG::DEBUG))
107 {
108 ATH_MSG_DEBUG("getTracks() returning " << tracks.size() << " tracks:");
109 for (auto & t : tracks)
110 ATH_MSG_DEBUG("\tchi2 = " << t.getChi2() << " and phi = " << t.getPhi()
111 << " and eta = " << t.getEta() << " and d0 = " << t.getD0()
112 << " and z0 = " << t.getZ0() << "and pt = " << t.getPt());
113 }
114
115 return StatusCode::SUCCESS;
116}
117
118// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
119StatusCode FPGATrackSimTrackFitterTool::getMissingHitsCheckTracks(std::vector<FPGATrackSimTrack>& tracks_guessed)
120{
121 // only call this after we first fit the tracks!
122 tracks_guessed = m_tfpobj->getMissingHitsCheckTracks();
123 return StatusCode::SUCCESS;
124}
125
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Maps physical layers to logical layers.
Maps ITK module indices to FPGATrackSim regions.
#define FITTRACKS_OK
TrackCorrType
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
Gaudi::Property< int > m_chi2dof_recovery_max
Gaudi::Property< bool > m_doMissingHitsChecks
FPGATrackSimTrackFitterTool(const std::string &, const std::string &, const IInterface *)
std::unique_ptr< TrackFitter > m_tfpobj
StatusCode getTracks(std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads, std::vector< FPGATrackSimTrack > &tracks, const FPGATrackSimTrackPars &min, const FPGATrackSimTrackPars &max)
Gaudi::Property< int > m_chi2dof_recovery_min
StatusCode getMissingHitsCheckTracks(std::vector< FPGATrackSimTrack > &tracks_guessed)
ServiceHandle< IFPGATrackSimBankSvc > m_FPGATrackSimBank
ToolHandle< IFPGATrackSimRoadFilterTool > m_spRoadFilterTool
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
StatusCode setRoadSectors(std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads)
FPGATrackSimTrackingToolBase(const std::string &type, const std::string &name, const IInterface *parent)
MsgStream & msg
Definition testRead.cxx:32