ATLAS Offline Software
FPGATrackSimPhiRoadFilterTool.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
17 
18 #include "TH2.h"
19 
20 #include <sstream>
21 #include <fstream>
22 #include <cmath>
23 #include <algorithm>
24 #include <boost/dynamic_bitset.hpp>
25 #include <iostream>
26 
27 static inline std::string instance_name(std::string const & s);
28 
29 
31 // AthAlgTool
32 
33 FPGATrackSimPhiRoadFilterTool::FPGATrackSimPhiRoadFilterTool(const std::string& algname, const std::string &name, const IInterface *ifc) :
34  base_class(algname, name, ifc),
35  m_name(instance_name(name))
36 {
37  declareInterface<IFPGATrackSimRoadFilterTool>(this);
38 }
39 
40 
42 {
43  // Retrieve info
44  ATH_CHECK(m_FPGATrackSimMapping.retrieve());
45  m_nLayers = m_FPGATrackSimMapping->PlaneMap_1st()->getNLogiLayers();
46  return StatusCode::SUCCESS;
47 }
48 
49 
51 // Main Algorithm
52 
53 StatusCode FPGATrackSimPhiRoadFilterTool::filterRoads(const std::vector<FPGATrackSimRoad*> & prefilter_roads, std::vector<FPGATrackSimRoad*> & postfilter_roads)
54 {
55  ATH_MSG_DEBUG("Start Phi Road Filter");
56 
57  m_postfilter_roads.clear();
58  postfilter_roads.clear();
59 
60  // Filter roads
61  for (auto & road : prefilter_roads) {
62  FPGATrackSimRoad newroad = buildRoad(road);
63  unsigned hit_layers = newroad.getHitLayers();
64 
65  unsigned layer_cnt=0;
66  for (unsigned lyr = 0; lyr < m_nLayers; lyr++) {
67  if (hit_layers & (1<<lyr)) layer_cnt++;
68  }
69 
70  if (layer_cnt >= m_threshold.value()) {
71  m_postfilter_roads.push_back(newroad);
72  }
73 
74  }
75 
76  // copy roads to outputs
77  postfilter_roads.reserve(m_postfilter_roads.size());
78  for (FPGATrackSimRoad & r : m_postfilter_roads) postfilter_roads.push_back(&r);
79 
80  ATH_MSG_DEBUG("Event Done");
81 
82  m_event++;
83  return StatusCode::SUCCESS;
84 }
85 
87 {
88  ATH_MSG_DEBUG("PhiRoad Build Road");
89  float phi = origr->getX();
90  float qPt = origr->getY();
91 
92  // make new road -- main alg doesn't keep it if not needed
93  FPGATrackSimRoad r(*origr); // only works with Hough roads!
94  r.setNLayers(m_nLayers);
95  layer_bitmask_t hitLayers = 0;
96 
97  // add hits
98  for (unsigned lyr = 0; lyr < m_nLayers; lyr++) {
99  std::vector<const FPGATrackSimHit*> road_hits;
100  for (auto hit : origr->getHits(lyr)) {
101  float phi_expected = -1.0*asin(fpgatracksim::A * hit->getR() * qPt) + phi;
102  if (m_fieldCorrection) phi_expected -= FPGATrackSimHoughTransformTool::fieldCorrection(m_EvtSel->getRegionID(), qPt, hit->getR());
103  if (abs(hit->getGPhi()-phi_expected)< (m_window.value()[lyr]+qPt*m_ptscaling)) {
104  road_hits.push_back(hit);
105  hitLayers |= 1 << hit->getLayer();
106  }
107  }
108  if (road_hits.size() == 0) {
109  FPGATrackSimHit *wcHit = new FPGATrackSimHit();
111  wcHit->setDetType(m_FPGATrackSimMapping->PlaneMap_1st()->getDetType(lyr));
112  wcHit->setLayer(lyr);
113  road_hits.push_back(wcHit);
114  }
115  ATH_MSG_DEBUG("PhiRoad Hits " << lyr << " " << road_hits.size() << " " << origr->getHits(lyr).size());
116  r.setHits(lyr,road_hits);
117  }
118 
119  r.setHitLayers(hitLayers);
120  return r;
121 }
122 
123 static inline std::string instance_name(std::string const & s)
124 {
125  size_t pos = s.find_last_of(".");
126  if (pos != std::string::npos)
127  return s.substr(pos + 1);
128  return s;
129 }
130 
beamspotman.r
def r
Definition: beamspotman.py:676
FPGATrackSimRoad::getHitLayers
layer_bitmask_t getHitLayers() const
Definition: FPGATrackSimRoad.h:82
getMenu.algname
algname
Definition: getMenu.py:53
FPGATrackSimPhiRoadFilterTool::m_EvtSel
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_EvtSel
Definition: FPGATrackSimPhiRoadFilterTool.h:58
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
FPGATrackSimHoughTransformTool::fieldCorrection
static double fieldCorrection(unsigned region, double y, double r)
Definition: FPGATrackSimHoughTransformTool.cxx:301
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
FPGATrackSimPhiRoadFilterTool::m_ptscaling
Gaudi::Property< float > m_ptscaling
Definition: FPGATrackSimPhiRoadFilterTool.h:65
FPGATrackSimPlaneMap.h
Maps physical layers to logical layers.
IFPGATrackSimMappingSvc.h
FPGATrackSimHoughTransformTool.h
Implements road finding using a Hough transform.
FPGATrackSimPhiRoadFilterTool::buildRoad
FPGATrackSimRoad buildRoad(FPGATrackSimRoad *origr) const
Definition: FPGATrackSimPhiRoadFilterTool.cxx:86
FPGATrackSimRoad::getHits
std::vector< const FPGATrackSimHit * > const & getHits(size_t layer) const
Definition: FPGATrackSimRoad.h:87
FPGATrackSimPhiRoadFilterTool.h
Implements road filtering using eta module patterns.
FPGATrackSimRoad::getX
float getX() const
Definition: FPGATrackSimRoad.h:74
FPGATrackSimConstants.h
FPGATrackSimPhiRoadFilterTool::FPGATrackSimPhiRoadFilterTool
FPGATrackSimPhiRoadFilterTool(const std::string &, const std::string &, const IInterface *)
Definition: FPGATrackSimPhiRoadFilterTool.cxx:33
FPGATrackSimHit
Definition: FPGATrackSimHit.h:38
HitType::wildcard
@ wildcard
FPGATrackSimPhiRoadFilterTool::filterRoads
virtual StatusCode filterRoads(const std::vector< FPGATrackSimRoad * > &prefilter_roads, std::vector< FPGATrackSimRoad * > &postfilter_roads) override
Definition: FPGATrackSimPhiRoadFilterTool.cxx:53
FPGATrackSimHit::setDetType
void setDetType(SiliconTech detType)
Definition: FPGATrackSimHit.h:52
FPGATrackSimPhiRoadFilterTool::m_window
Gaudi::Property< std::vector< float > > m_window
Definition: FPGATrackSimPhiRoadFilterTool.h:64
FPGATrackSimPhiRoadFilterTool::initialize
virtual StatusCode initialize() override
Definition: FPGATrackSimPhiRoadFilterTool.cxx:41
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
FPGATrackSimPhiRoadFilterTool::m_event
unsigned m_event
Definition: FPGATrackSimPhiRoadFilterTool.h:79
FPGATrackSimPhiRoadFilterTool::m_postfilter_roads
std::vector< FPGATrackSimRoad > m_postfilter_roads
Definition: FPGATrackSimPhiRoadFilterTool.h:70
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
FPGATrackSimPhiRoadFilterTool::m_threshold
Gaudi::Property< unsigned > m_threshold
Definition: FPGATrackSimPhiRoadFilterTool.h:63
FPGATrackSimHit.h
: FPGATrackSim-specific class to represent an hit in the detector.
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
FPGATrackSimPhiRoadFilterTool::m_FPGATrackSimMapping
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
Definition: FPGATrackSimPhiRoadFilterTool.h:57
FPGATrackSimRoad::getY
float getY() const
Definition: FPGATrackSimRoad.h:75
FPGATrackSimHit::setLayer
void setLayer(unsigned v)
Definition: FPGATrackSimHit.h:87
layer_bitmask_t
uint32_t layer_bitmask_t
Definition: FPGATrackSimTypes.h:22
FPGATrackSimPhiRoadFilterTool::m_fieldCorrection
Gaudi::Property< bool > m_fieldCorrection
Definition: FPGATrackSimPhiRoadFilterTool.h:66
FPGATrackSimPhiRoadFilterTool::m_nLayers
unsigned m_nLayers
Definition: FPGATrackSimPhiRoadFilterTool.h:74
FPGATrackSimTypes.h
FPGATrackSimRoad
Definition: FPGATrackSimRoad.h:29
FPGATrackSimHit::setHitType
void setHitType(HitType type)
Definition: FPGATrackSimHit.h:51