Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
FPGATrackSimWindowExtensionTool.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 
16 
19 
20 #include <sstream>
21 #include <cmath>
22 #include <algorithm>
23 
24 FPGATrackSimWindowExtensionTool::FPGATrackSimWindowExtensionTool(const std::string& algname, const std::string &name, const IInterface *ifc) :
25  base_class(algname, name, ifc) {
26  declareInterface<IFPGATrackSimTrackExtensionTool>(this);
27  }
28 
29 
31 
32  // Retrieve the mapping service.
33  ATH_CHECK(m_FPGATrackSimMapping.retrieve());
35  m_nLayers_1stStage = m_FPGATrackSimMapping->PlaneMap_1st(0)->getNLogiLayers();
36  m_nLayers_2ndStage = m_FPGATrackSimMapping->PlaneMap_2nd(0)->getNLogiLayers() - m_nLayers_1stStage;
37 
39 
40 
41  // This now needs to be done once for each slice.
42  for (size_t j=0; j<m_FPGATrackSimMapping->GetPlaneMap_2ndSliceSize(); j++){
43  ATH_MSG_INFO("Processing second stage slice " << j);
44  m_phits_atLayer[j] = std::map<unsigned, std::vector<std::shared_ptr<const FPGATrackSimHit>>>();
45  for (unsigned i = m_nLayers_1stStage; i < m_nLayers_2ndStage +m_nLayers_1stStage ; i++) {
46  ATH_MSG_INFO("Processing layer " << i);
47  m_phits_atLayer[j][i] = std::vector<std::shared_ptr<const FPGATrackSimHit>>();
48  }
49  }
50  // Probably need to do something here.
51  return StatusCode::SUCCESS;
52 }
53 
54 StatusCode FPGATrackSimWindowExtensionTool::extendTracks(const std::vector<std::shared_ptr<const FPGATrackSimHit>> & hits,
55  const std::vector<std::shared_ptr<const FPGATrackSimTrack>> & tracks,
56  std::vector<std::shared_ptr<const FPGATrackSimRoad>> & roads) {
57 
58  // Reset the internal second stage roads storage.
59  roads.clear();
60  m_roads.clear();
61  for (auto& sliceEntry : m_phits_atLayer){
62  for (auto& entry : sliceEntry.second) {
63  entry.second.clear();
64  }
65  }
66  const FPGATrackSimRegionMap* rmap_2nd = m_FPGATrackSimMapping->SubRegionMap_2nd();
67  const FPGATrackSimPlaneMap *pmap_2nd = nullptr;
68 
69  // Create one "tower" per slice for this event.
70  // Note that there now might be only one "slice", at least for the time being.
71  if (m_slicedHitHeader) {
72  for (int ireg = 0; ireg < rmap_2nd->getNRegions(); ireg++) {
75  }
76  }
77 
78  // Second stage hits may be unmapped, in which case map them.
79  for (size_t i=0; i<m_FPGATrackSimMapping->GetPlaneMap_2ndSliceSize(); i++){
80  pmap_2nd = m_FPGATrackSimMapping->PlaneMap_2nd(i);
81  for (const std::shared_ptr<const FPGATrackSimHit>& hit : hits) {
82  std::shared_ptr<FPGATrackSimHit> hitCopy = std::make_shared<FPGATrackSimHit>(*hit);
83  pmap_2nd->map(*hitCopy);
84  if (!hitCopy->isMapped()){
85  continue;
86  }
87  if (rmap_2nd->isInRegion(i, *hitCopy)) {
88  m_phits_atLayer[i][hitCopy->getLayer()].push_back(hitCopy);
89  // Also store a copy of the hit object in the header class, for ROOT Output + TV creation.
91  }
92  }
93  }
94  // Now, loop over the tracks.
95  for (std::shared_ptr<const FPGATrackSimTrack> track : tracks) {
96  if (track->passedOR() == 0) {
97  continue;
98  }
99 
100  // Retrieve track parameters.
101  double trackd0 = track->getD0();
102  double trackphi = track->getPhi();
103  double trackz0 = track->getZ0();
104  double tracketa = track->getEta();
105  double cottracktheta = 0.5*(exp(tracketa)-exp(-tracketa));
106  double trackqoverpt = track->getQOverPt();
107 
108  std::vector<int> numHits(m_nLayers_2ndStage + m_nLayers_1stStage, 0);
109 
110  // Copy over the existing hits. We require that the layer assignment in the first stage
111  // is equal to the layer assignment in the second stage.
112  std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> road_hits;
113  road_hits.resize(m_nLayers_1stStage + m_nLayers_2ndStage);
114  layer_bitmask_t hitLayers = 0;
115  int nhit = 0;
116  for (auto hit : track->getFPGATrackSimHits()) {
117  road_hits[hit.getLayer()].push_back(std::make_shared<FPGATrackSimHit>(hit));
118  if (hit.isReal()) {
119  nhit += 1;
120  hitLayers |= 1 << hit.getLayer();
121  numHits[hit.getLayer()]++;
122  }
123  }
124 
125  size_t slice = track->getSubRegion();
126  pmap_2nd = m_FPGATrackSimMapping->PlaneMap_2nd(slice);
128  ATH_MSG_DEBUG("Testing layer " << layer << " with " << m_phits_atLayer[slice][layer].size() << " hit");
129  for (const std::shared_ptr<const FPGATrackSimHit>& hit: m_phits_atLayer[slice][layer]) {
130  // Make sure this hit is in the same subregion as the track. TODO: mapping/slice changes.
131  if (!rmap_2nd->isInRegion(track->getSubRegion(), *hit)) {
132  continue;
133  }
134 
135  double hitphi = hit->getGPhi();
136  double hitr = hit->getR();
137  double hitz = hit->getZ();
138  double pred_hitphi = trackphi - asin(hitr * fpgatracksim::A * 1000 * trackqoverpt - trackd0/hitr);
139  double pred_hitz = trackz0 + hitr*cottracktheta;
140 
141  // Field correction, now pulled from FPGATrackSimFunctions.
142  if (m_fieldCorrection){
143  double fieldCor = fieldCorrection(track->getRegion(), trackqoverpt, hitr);
144  pred_hitphi += fieldCor;
145  }
146 
147  double diff = abs(hitphi-pred_hitphi);
148  double diffz = abs(hitz-pred_hitz);
149 
150  // Apply the actual layer check, only accept hits that fall into a track's window.
151  ATH_MSG_DEBUG("Hit in region, comparing phi: " << diff << " to " << m_windows[layer] << " and z " << diffz << " to " << m_zwindows[layer]);
152  if (diff < m_windows[layer] && diffz < m_zwindows[layer]) {
153  numHits[layer]++;
154  road_hits[layer].push_back(hit);
155  hitLayers |= 1 << hit->getLayer();
156  }
157  }
158  }
159 
160  // now nhit will be equal to the number of layers with hits in the new array.
161  for (auto num: numHits) {
162  if(num > 0) nhit += 1;
163  }
164 
165  // If we have enough hits, create a new road.
166  if (nhit >= m_threshold) {
167  ATH_MSG_DEBUG("Found new road with " << nhit << " hits relative to " << m_threshold);
168  m_roads.emplace_back();
169  FPGATrackSimRoad & road = m_roads.back();
170  road.setRoadID(roads.size() - 1);
171 
172  // Set the "Hough x" and "Hough y" using the track parameters.
173  road.setX(trackphi);
174  road.setY(trackqoverpt);
175  road.setXBin(track->getHoughXBin());
176  road.setYBin(track->getHoughYBin());
177  road.setSubRegion(track->getSubRegion());
178 
179  // figure out bit mask for wild card layers
180  unsigned int wclayers = 0;
181  for (unsigned i = 0; i < numHits.size(); i++){
182  if(numHits[i]==0) wclayers |= (0x1 << i);
183  }
184  road.setWCLayers(wclayers);
185 
186  // set hit layers and hits
187  road.setHitLayers(hitLayers);
188  road.setHits(std::move(road_hits));
189  }
190  }
191 
192  // Copy the roads we found into the output argument and return success.
193  roads.reserve(m_roads.size());
194  for (FPGATrackSimRoad & r : m_roads) {
195  roads.emplace_back(std::make_shared<const FPGATrackSimRoad>(r));
196  }
197  ATH_MSG_DEBUG("Found " << m_roads.size() << " new roads in second stage.");
198 
199  return StatusCode::SUCCESS;
200 }
beamspotman.r
def r
Definition: beamspotman.py:676
getMenu.algname
algname
Definition: getMenu.py:54
TRTCalib_Extractor.hits
hits
Definition: TRTCalib_Extractor.py:35
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FPGATrackSimWindowExtensionTool::m_fieldCorrection
Gaudi::Property< bool > m_fieldCorrection
Definition: FPGATrackSimWindowExtensionTool.h:61
FPGATrackSimHoughFunctions.h
FPGATrackSimHit::getLayer
unsigned getLayer() const
Definition: FPGATrackSimHit.cxx:77
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
FPGATrackSimWindowExtensionTool::m_slicedHitHeader
FPGATrackSimLogicalEventInputHeader * m_slicedHitHeader
Definition: FPGATrackSimWindowExtensionTool.h:81
FPGATrackSimConstants.h
FPGATrackSimTowerInputHeader::addHit
void addHit(const FPGATrackSimHit &s)
Definition: FPGATrackSimTowerInputHeader.h:48
FPGATrackSimWindowExtensionTool::m_FPGATrackSimBankSvc
ServiceHandle< IFPGATrackSimBankSvc > m_FPGATrackSimBankSvc
Definition: FPGATrackSimWindowExtensionTool.h:54
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
FPGATrackSimWindowExtensionTool::extendTracks
virtual StatusCode extendTracks(const std::vector< std::shared_ptr< const FPGATrackSimHit >> &hits, const std::vector< std::shared_ptr< const FPGATrackSimTrack >> &tracks, std::vector< std::shared_ptr< const FPGATrackSimRoad >> &roads) override
Definition: FPGATrackSimWindowExtensionTool.cxx:54
FPGATrackSimLogicalEventInputHeader::getTower
FPGATrackSimTowerInputHeader * getTower(size_t index)
Definition: FPGATrackSimLogicalEventInputHeader.h:39
FPGATrackSimWindowExtensionTool::initialize
virtual StatusCode initialize() override
Definition: FPGATrackSimWindowExtensionTool.cxx:30
FPGATrackSimWindowExtensionTool::m_roads
std::vector< FPGATrackSimRoad > m_roads
Definition: FPGATrackSimWindowExtensionTool.h:72
FPGATrackSimWindowExtensionTool::m_maxMiss
unsigned m_maxMiss
Definition: FPGATrackSimWindowExtensionTool.h:77
perfmonmt-refit.slice
slice
Definition: perfmonmt-refit.py:52
FPGATrackSimPlaneMap::map
void map(FPGATrackSimHit &hit) const
Definition: FPGATrackSimPlaneMap.cxx:234
lumiFormat.i
int i
Definition: lumiFormat.py:85
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
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
fieldCorrection
double fieldCorrection(unsigned region, double qpt, double r)
Definition: FPGATrackSimFunctions.cxx:163
FPGATrackSimLogicalEventInputHeader::addTower
void addTower(const FPGATrackSimTowerInputHeader &s)
Definition: FPGATrackSimLogicalEventInputHeader.h:38
FPGATrackSimWindowExtensionTool::m_windows
Gaudi::Property< std::vector< float > > m_windows
Definition: FPGATrackSimWindowExtensionTool.h:59
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
FPGATrackSimRoad::setX
void setX(float v)
Definition: FPGATrackSimRoad.h:77
FPGATrackSimRegionMap::isInRegion
bool isInRegion(uint32_t region, const FPGATrackSimHit &hit) const
Definition: FPGATrackSimRegionMap.cxx:225
FPGATrackSimWindowExtensionTool::FPGATrackSimWindowExtensionTool
FPGATrackSimWindowExtensionTool(const std::string &, const std::string &, const IInterface *)
Definition: FPGATrackSimWindowExtensionTool.cxx:24
FPGATrackSimWindowExtensionTool::m_FPGATrackSimMapping
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
Definition: FPGATrackSimWindowExtensionTool.h:55
FPGATrackSimPlaneMap
Definition: FPGATrackSimPlaneMap.h:62
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
FPGATrackSimHit.h
: FPGATrackSim-specific class to represent an hit in the detector.
FPGATrackSimRoad::setSubRegion
void setSubRegion(int v)
Definition: FPGATrackSimRoad.h:74
FPGATrackSimWindowExtensionTool::m_nLayers_2ndStage
unsigned m_nLayers_2ndStage
Definition: FPGATrackSimWindowExtensionTool.h:76
FPGATrackSimWindowExtensionTool::m_nLayers_1stStage
unsigned m_nLayers_1stStage
Definition: FPGATrackSimWindowExtensionTool.h:75
FPGATrackSimWindowExtensionTool::m_phits_atLayer
std::map< unsigned, std::map< unsigned, std::vector< std::shared_ptr< const FPGATrackSimHit > > > > m_phits_atLayer
Definition: FPGATrackSimWindowExtensionTool.h:74
FPGATrackSimWindowExtensionTool::m_threshold
Gaudi::Property< int > m_threshold
Definition: FPGATrackSimWindowExtensionTool.h:58
FPGATrackSimHit::isMapped
bool isMapped() const
Definition: FPGATrackSimHit.cxx:13
FPGATrackSimWindowExtensionTool::m_idealGeoRoads
Gaudi::Property< bool > m_idealGeoRoads
Definition: FPGATrackSimWindowExtensionTool.h:62
FPGATrackSimWindowExtensionTool::m_zwindows
Gaudi::Property< std::vector< float > > m_zwindows
Definition: FPGATrackSimWindowExtensionTool.h:60
layer_bitmask_t
uint32_t layer_bitmask_t
Definition: FPGATrackSimTypes.h:22
FPGATrackSimWindowExtensionTool.h
Default track extension algorithm to produce "second stage" roads.
FPGATrackSimRoad::setYBin
void setYBin(unsigned v)
Definition: FPGATrackSimRoad.h:76
FPGATrackSimRegionMap::getNRegions
int getNRegions() const
Definition: FPGATrackSimRegionMap.h:80
FPGATrackSimRegionMap
Definition: FPGATrackSimRegionMap.h:62
FPGATrackSimRoad::setY
void setY(float v)
Definition: FPGATrackSimRoad.h:78
FPGATrackSimRoad::setRoadID
void setRoadID(int roadID)
Definition: FPGATrackSimRoad.h:58
FPGATrackSimRoad::setHitLayers
void setHitLayers(layer_bitmask_t hit_layers)
Definition: FPGATrackSimRoad.h:63
xAOD::track
@ track
Definition: TrackingPrimitives.h:513
FPGATrackSimTowerInputHeader
Definition: FPGATrackSimTowerInputHeader.h:18
FPGATrackSimTypes.h
FPGATrackSimSectorBank.h
This file declares a class that stores the module IDs of the sectors.
FPGATrackSimRoad::setHits
void setHits(std::vector< std::vector< std::shared_ptr< const FPGATrackSimHit >>> &&hits)
Definition: FPGATrackSimRoad.cxx:141
FPGATrackSimRoad
Definition: FPGATrackSimRoad.h:31
FPGATrackSimRoad::setWCLayers
void setWCLayers(layer_bitmask_t wc_layers)
Definition: FPGATrackSimRoad.h:64
FPGATrackSimRoad::setXBin
void setXBin(unsigned v)
Definition: FPGATrackSimRoad.h:75