Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Public Member Functions | Private Attributes | List of all members
FPGATrackSimWindowExtensionTool Class Reference

#include <FPGATrackSimWindowExtensionTool.h>

Inheritance diagram for FPGATrackSimWindowExtensionTool:
Collaboration diagram for FPGATrackSimWindowExtensionTool:

Public Member Functions

virtual StatusCode initialize () override
 
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
 
virtual StatusCode setupSlices (FPGATrackSimLogicalEventInputHeader *slicedHitHeader) override
 

Private Attributes

ServiceHandle< IFPGATrackSimBankSvcm_FPGATrackSimBankSvc {this, "FPGATrackSimBankSvc", "FPGATrackSimBankSvc"}
 
ServiceHandle< IFPGATrackSimMappingSvcm_FPGATrackSimMapping {this, "FPGATrackSimMappingSvc", "FPGATrackSimMappingSvc"}
 
Gaudi::Property< int > m_threshold { this, "threshold", 11, "Minimum number of hits to fire a road"}
 
Gaudi::Property< std::vector< float > > m_windows {this, "phiWindow", {}, "Default window settings for phi, must be size nlayers."}
 
Gaudi::Property< std::vector< float > > m_zwindows {this, "zWindow", {}, "Default window settings for z, must be size nlayers."}
 
Gaudi::Property< bool > m_fieldCorrection {this, "fieldCorrection", true, "Use magnetic field correction for Hough transform"}
 
Gaudi::Property< bool > m_idealGeoRoads {this, "IdealGeoRoads", true, "Do sector assignment of second stage roads"}
 
Gaudi::Property< bool > m_doRegionalMapping { this, "RegionalMapping", false, "Use the sub-region maps to define the sector"}
 
Gaudi::Property< bool > m_doEtaPatternConsts { this, "doEtaPatternConsts", false, "Whether to use the eta pattern tool for constant generation"}
 
Gaudi::Property< bool > m_useSpacePoints { this, "useSpacePoints", false, "Whether we are using spacepoints."}
 
std::vector< FPGATrackSimRoadm_roads
 
std::map< unsigned, std::map< unsigned, std::vector< std::shared_ptr< const FPGATrackSimHit > > > > m_phits_atLayer
 
unsigned m_nLayers_1stStage = 0
 
unsigned m_nLayers_2ndStage = 0
 
unsigned m_maxMiss = 0
 
FPGATrackSimLogicalEventInputHeaderm_slicedHitHeader = nullptr
 

Detailed Description

Definition at line 33 of file FPGATrackSimWindowExtensionTool.h.

Member Function Documentation

◆ extendTracks()

StatusCode FPGATrackSimWindowExtensionTool::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 
)
overridevirtual

Definition at line 49 of file FPGATrackSimWindowExtensionTool.cxx.

51  {
52 
53  // Reset the internal second stage roads storage.
54  roads.clear();
55  m_roads.clear();
56  for (auto& sliceEntry : m_phits_atLayer){
57  for (auto& entry : sliceEntry.second) {
58  entry.second.clear();
59  }
60  }
61  const FPGATrackSimRegionMap* rmap_2nd = m_FPGATrackSimMapping->SubRegionMap_2nd();
62  const FPGATrackSimPlaneMap *pmap_2nd = nullptr;
63 
64  // Create one "tower" per slice for this event.
65  // Note that there now might be only one "slice", at least for the time being.
66  if (m_slicedHitHeader) {
67  for (int ireg = 0; ireg < rmap_2nd->getNRegions(); ireg++) {
70  }
71  }
72 
73  // Second stage hits may be unmapped, in which case map them.
74  for (size_t i=0; i<m_FPGATrackSimMapping->GetPlaneMap_2ndSliceSize(); i++){
75  pmap_2nd = m_FPGATrackSimMapping->PlaneMap_2nd(i);
76  for (const std::shared_ptr<const FPGATrackSimHit>& hit : hits) {
77  std::shared_ptr<FPGATrackSimHit> hitCopy = std::make_shared<FPGATrackSimHit>(*hit);
78  pmap_2nd->map(*hitCopy);
79  if (!hitCopy->isMapped()){
80  continue;
81  }
82  if (rmap_2nd->isInRegion(i, *hitCopy)) {
83  m_phits_atLayer[i][hitCopy->getLayer()].push_back(hitCopy);
84  // Also store a copy of the hit object in the header class, for ROOT Output + TV creation.
86  }
87  }
88  }
89  // Now, loop over the tracks.
90  for (std::shared_ptr<const FPGATrackSimTrack> track : tracks) {
91  if (track->passedOR() == 0) {
92  continue;
93  }
94 
95  // Retrieve track parameters.
96  double trackd0 = track->getD0();
97  double trackphi = track->getPhi();
98  double trackz0 = track->getZ0();
99  double tracketa = track->getEta();
100  double cottracktheta = 0.5*(exp(tracketa)-exp(-tracketa));
101  double trackqoverpt = track->getQOverPt();
102 
103  std::vector<int> numHits(m_nLayers_2ndStage + m_nLayers_1stStage, 0);
104 
105  // Copy over the existing hits. We require that the layer assignment in the first stage
106  // is equal to the layer assignment in the second stage.
107  std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> road_hits;
108  road_hits.resize(m_nLayers_1stStage + m_nLayers_2ndStage);
109  layer_bitmask_t hitLayers = 0;
110  int nhit = 0;
111  for (auto hit : track->getFPGATrackSimHits()) {
112  road_hits[hit.getLayer()].push_back(std::make_shared<FPGATrackSimHit>(hit));
113  if (hit.isReal()) {
114  nhit += 1;
115  hitLayers |= 1 << hit.getLayer();
116  numHits[hit.getLayer()]++;
117  }
118  }
119 
120  size_t slice = track->getSubRegion();
121  pmap_2nd = m_FPGATrackSimMapping->PlaneMap_2nd(slice);
123  ATH_MSG_DEBUG("Testing layer " << layer << " with " << m_phits_atLayer[slice][layer].size() << " hit");
124  for (const std::shared_ptr<const FPGATrackSimHit>& hit: m_phits_atLayer[slice][layer]) {
125  // Make sure this hit is in the same subregion as the track. TODO: mapping/slice changes.
126  if (!rmap_2nd->isInRegion(track->getSubRegion(), *hit)) {
127  continue;
128  }
129 
130  double hitphi = hit->getGPhi();
131  double hitr = hit->getR();
132  double hitz = hit->getZ();
133  double pred_hitphi = trackphi - asin(hitr * fpgatracksim::A * 1000 * trackqoverpt - trackd0/hitr);
134  double pred_hitz = trackz0 + hitr*cottracktheta;
135 
136  // Field correction, now pulled from FPGATrackSimFunctions.
137  if (m_fieldCorrection){
138  double fieldCor = fieldCorrection(track->getRegion(), trackqoverpt, hitr);
139  pred_hitphi += fieldCor;
140  }
141 
142  double diff = abs(hitphi-pred_hitphi);
143  double diffz = abs(hitz-pred_hitz);
144 
145  // Apply the actual layer check, only accept hits that fall into a track's window.
146  ATH_MSG_DEBUG("Hit in region, comparing phi: " << diff << " to " << m_windows[layer] << " and z " << diffz << " to " << m_zwindows[layer]);
147  if (diff < m_windows[layer] && diffz < m_zwindows[layer]) {
148  numHits[layer]++;
149  road_hits[layer].push_back(hit);
150  hitLayers |= 1 << hit->getLayer();
151  }
152  }
153  }
154 
155  // now nhit will be equal to the number of layers with hits in the new array.
156  for (auto num: numHits) {
157  if(num > 0) nhit += 1;
158  }
159 
160  // If we have enough hits, create a new road.
161  if (nhit >= m_threshold) {
162  ATH_MSG_DEBUG("Found new road with " << nhit << " hits relative to " << m_threshold);
163  m_roads.emplace_back();
164  FPGATrackSimRoad & road = m_roads.back();
165  road.setRoadID(roads.size() - 1);
166 
167  // Set the "Hough x" and "Hough y" using the track parameters.
168  road.setX(trackphi);
169  road.setY(trackqoverpt);
170  road.setXBin(track->getHoughXBin());
171  road.setYBin(track->getHoughYBin());
172  road.setSubRegion(track->getSubRegion());
173 
174  // figure out bit mask for wild card layers
175  unsigned int wclayers = 0;
176  for (unsigned i = 0; i < numHits.size(); i++){
177  if(numHits[i]==0) wclayers |= (0x1 << i);
178  }
179  road.setWCLayers(wclayers);
180 
181  // set hit layers and hits
182  road.setHitLayers(hitLayers);
183  road.setHits(std::move(road_hits));
184  }
185  }
186 
187  // Copy the roads we found into the output argument and return success.
188  roads.reserve(m_roads.size());
189  for (FPGATrackSimRoad & r : m_roads) {
190  roads.emplace_back(std::make_shared<const FPGATrackSimRoad>(r));
191  }
192  ATH_MSG_DEBUG("Found " << m_roads.size() << " new roads in second stage.");
193 
194  return StatusCode::SUCCESS;
195 }

◆ initialize()

StatusCode FPGATrackSimWindowExtensionTool::initialize ( )
overridevirtual

Definition at line 25 of file FPGATrackSimWindowExtensionTool.cxx.

25  {
26 
27  // Retrieve the mapping service.
28  ATH_CHECK(m_FPGATrackSimMapping.retrieve());
30  m_nLayers_1stStage = m_FPGATrackSimMapping->PlaneMap_1st(0)->getNLogiLayers();
31  m_nLayers_2ndStage = m_FPGATrackSimMapping->PlaneMap_2nd(0)->getNLogiLayers() - m_nLayers_1stStage;
32 
34 
35 
36  // This now needs to be done once for each slice.
37  for (size_t j=0; j<m_FPGATrackSimMapping->GetPlaneMap_2ndSliceSize(); j++){
38  ATH_MSG_INFO("Processing second stage slice " << j);
39  m_phits_atLayer[j] = std::map<unsigned, std::vector<std::shared_ptr<const FPGATrackSimHit>>>();
40  for (unsigned i = m_nLayers_1stStage; i < m_nLayers_2ndStage +m_nLayers_1stStage ; i++) {
41  ATH_MSG_INFO("Processing layer " << i);
42  m_phits_atLayer[j][i] = std::vector<std::shared_ptr<const FPGATrackSimHit>>();
43  }
44  }
45  // Probably need to do something here.
46  return StatusCode::SUCCESS;
47 }

◆ setupSlices()

virtual StatusCode FPGATrackSimWindowExtensionTool::setupSlices ( FPGATrackSimLogicalEventInputHeader slicedHitHeader)
inlineoverridevirtual

Definition at line 46 of file FPGATrackSimWindowExtensionTool.h.

46  {
47  m_slicedHitHeader = slicedHitHeader;
48  return StatusCode::SUCCESS;
49  };

Member Data Documentation

◆ m_doEtaPatternConsts

Gaudi::Property<bool> FPGATrackSimWindowExtensionTool::m_doEtaPatternConsts { this, "doEtaPatternConsts", false, "Whether to use the eta pattern tool for constant generation"}
private

Definition at line 69 of file FPGATrackSimWindowExtensionTool.h.

◆ m_doRegionalMapping

Gaudi::Property<bool> FPGATrackSimWindowExtensionTool::m_doRegionalMapping { this, "RegionalMapping", false, "Use the sub-region maps to define the sector"}
private

Definition at line 68 of file FPGATrackSimWindowExtensionTool.h.

◆ m_fieldCorrection

Gaudi::Property<bool> FPGATrackSimWindowExtensionTool::m_fieldCorrection {this, "fieldCorrection", true, "Use magnetic field correction for Hough transform"}
private

Definition at line 61 of file FPGATrackSimWindowExtensionTool.h.

◆ m_FPGATrackSimBankSvc

ServiceHandle<IFPGATrackSimBankSvc> FPGATrackSimWindowExtensionTool::m_FPGATrackSimBankSvc {this, "FPGATrackSimBankSvc", "FPGATrackSimBankSvc"}
private

Definition at line 54 of file FPGATrackSimWindowExtensionTool.h.

◆ m_FPGATrackSimMapping

ServiceHandle<IFPGATrackSimMappingSvc> FPGATrackSimWindowExtensionTool::m_FPGATrackSimMapping {this, "FPGATrackSimMappingSvc", "FPGATrackSimMappingSvc"}
private

Definition at line 55 of file FPGATrackSimWindowExtensionTool.h.

◆ m_idealGeoRoads

Gaudi::Property<bool> FPGATrackSimWindowExtensionTool::m_idealGeoRoads {this, "IdealGeoRoads", true, "Do sector assignment of second stage roads"}
private

Definition at line 62 of file FPGATrackSimWindowExtensionTool.h.

◆ m_maxMiss

unsigned FPGATrackSimWindowExtensionTool::m_maxMiss = 0
private

Definition at line 77 of file FPGATrackSimWindowExtensionTool.h.

◆ m_nLayers_1stStage

unsigned FPGATrackSimWindowExtensionTool::m_nLayers_1stStage = 0
private

Definition at line 75 of file FPGATrackSimWindowExtensionTool.h.

◆ m_nLayers_2ndStage

unsigned FPGATrackSimWindowExtensionTool::m_nLayers_2ndStage = 0
private

Definition at line 76 of file FPGATrackSimWindowExtensionTool.h.

◆ m_phits_atLayer

std::map<unsigned, std::map<unsigned, std::vector<std::shared_ptr<const FPGATrackSimHit> > > > FPGATrackSimWindowExtensionTool::m_phits_atLayer
private

Definition at line 74 of file FPGATrackSimWindowExtensionTool.h.

◆ m_roads

std::vector<FPGATrackSimRoad> FPGATrackSimWindowExtensionTool::m_roads
private

Definition at line 72 of file FPGATrackSimWindowExtensionTool.h.

◆ m_slicedHitHeader

FPGATrackSimLogicalEventInputHeader* FPGATrackSimWindowExtensionTool::m_slicedHitHeader = nullptr
private

Definition at line 81 of file FPGATrackSimWindowExtensionTool.h.

◆ m_threshold

Gaudi::Property<int> FPGATrackSimWindowExtensionTool::m_threshold { this, "threshold", 11, "Minimum number of hits to fire a road"}
private

Definition at line 58 of file FPGATrackSimWindowExtensionTool.h.

◆ m_useSpacePoints

Gaudi::Property<bool> FPGATrackSimWindowExtensionTool::m_useSpacePoints { this, "useSpacePoints", false, "Whether we are using spacepoints."}
private

Definition at line 70 of file FPGATrackSimWindowExtensionTool.h.

◆ m_windows

Gaudi::Property<std::vector<float> > FPGATrackSimWindowExtensionTool::m_windows {this, "phiWindow", {}, "Default window settings for phi, must be size nlayers."}
private

Definition at line 59 of file FPGATrackSimWindowExtensionTool.h.

◆ m_zwindows

Gaudi::Property<std::vector<float> > FPGATrackSimWindowExtensionTool::m_zwindows {this, "zWindow", {}, "Default window settings for z, must be size nlayers."}
private

Definition at line 60 of file FPGATrackSimWindowExtensionTool.h.


The documentation for this class was generated from the following files:
beamspotman.r
def r
Definition: beamspotman.py:676
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
FPGATrackSimHit::getLayer
unsigned getLayer() const
Definition: FPGATrackSimHit.cxx:87
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
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
FPGATrackSimLogicalEventInputHeader::getTower
FPGATrackSimTowerInputHeader * getTower(size_t index)
Definition: FPGATrackSimLogicalEventInputHeader.h:39
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
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::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
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
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
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