ATLAS Offline Software
FPGATrackSimPlaneMap.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2 
3 
15 #include <numeric>
16 #include <sstream>
17 #include <utility>
18 
19 using namespace asg::msgUserCode;
20 using namespace std;
21 
23 // Constructor/Desctructor
25 
26 
27 FPGATrackSimPlaneMap::FPGATrackSimPlaneMap(const std::string & filepath, unsigned region, unsigned stage, std::vector<int> layerOverrides) :
28  m_map(static_cast<int>(SiliconTech::nTechs),
29  vector<vector<LayerSection>>(static_cast<int>(DetectorZone::nZones))
30  ),
31  m_layerOverrides(std::move(layerOverrides))
32 {
33  ANA_MSG_INFO("Reading " << filepath);
34  ifstream fin(filepath);
35  if (!fin.is_open())
36  {
37  ANA_MSG_FATAL("Couldn't open " << filepath);
38  throw ("FPGATrackSimPlaneMap Couldn't open " + filepath);
39  }
40 
41  // Reads the header of the file to resize all the vector members
43 
44  // Seek to the correct region
45  seek(fin, region);
46 
47  // Reads the rest of the file to populate all the member vectors
49 
50  // Postprocessing on coordinate indices
51  for (uint32_t l = 0; l < m_nLogiLayers; l++)
52  {
55  for (uint32_t i = 0; i < m_dimension[l]; i++)
56  m_coordLayer.push_back(l);
57  }
58 
59  ANA_MSG_INFO("Using " << m_nLogiLayers << " logical layers and " << m_nCoords << " coordinates");
60 }
61 
62 
63 // Reads the header of the file to resize all the vector members
65 {
66  // Initialize read variables
67  vector<int> layerCounts((int)SiliconTech::nTechs * static_cast<int>(DetectorZone::nZones)); // pixel_barrel, pixel_EC, SCT_barrel, SCT_EC
68  std::string line, silicon, detReg, layerKey, geoKey;
69  bool ok = true;
70 
71  // Read Geometry Version
72  ok = ok && getline(fin, line);
74  istringstream sline(line);
75  ok = ok && (sline >> geoKey);
77 
78  ANA_MSG_INFO("Allocating map for geometry " << geoKey <<" diskIndex size="<<m_diskIndex.size());
79  m_moduleRelabel = std::make_unique<FPGATrackSimModuleRelabel>(geoKey, false);
80 
81 
82 
83  // Read number of logical layers
84  if (stage == 1)
85  {
86  ok = ok && getline(fin, line);
88  istringstream sline(line);
89  ok = ok && (sline >> m_nLogiLayers >> layerKey);
90  ok = ok && (layerKey == "logical_s1");
91  ok = ok && getline(fin, line); // skip the 2nd stage line
92  }
93  else if (stage == 2)
94  {
95  ok = ok && getline(fin, line); // skip the 1st stage line
96  ok = ok && getline(fin, line);
98  istringstream sline(line);
99  ok = ok && (sline >> m_nLogiLayers >> layerKey);
100  ok = ok && (layerKey == "logical_s2");
101  }
102  else ANA_MSG_ERROR("Bad stage " << stage << ". Stage should be 1 or 2");
103 
104  if (!m_layerOverrides.empty()) m_nLogiLayers = m_layerOverrides.size();
105 
106  // Read number of physical layers
107  int nHeaderLines = 6;
108  for (int i = 0; i < nHeaderLines; i++)
109  {
110  if (!ok) break;
111  ok = ok && getline(fin, line);
113 
114  istringstream sline(line);
115  ok = ok && (sline >> layerCounts[i] >> silicon >> detReg);
116 
117  ok = ok && ( (i < (nHeaderLines/2) && silicon == "pixel") || (i >= (nHeaderLines/2) && silicon == "SCT") );
118  ok = ok && ( (i % (nHeaderLines/2) == 0 && detReg == "barrel") || (i % (nHeaderLines/2) != 0 && (detReg == "endcap+" || detReg == "endcap-")) );
119  }
120  if (!ok) ANA_MSG_FATAL("Error reading layer counts");
121  m_nDetLayers = std::accumulate(layerCounts.begin(), layerCounts.end(), 0);
122 
123  // Resize objects
124  m_map[(int)SiliconTech::pixel][(int)DetectorZone::barrel].resize(layerCounts[0]);
125  m_map[(int)SiliconTech::pixel][(int)DetectorZone::posEndcap].resize(layerCounts[1]);
126  m_map[(int)SiliconTech::pixel][(int)DetectorZone::negEndcap].resize(layerCounts[2]);
127  m_map[(int)SiliconTech::strip][(int)DetectorZone::barrel].resize(layerCounts[3]);
128  m_map[(int)SiliconTech::strip][(int)DetectorZone::posEndcap].resize(layerCounts[4]);
129  m_map[(int)SiliconTech::strip][(int)DetectorZone::negEndcap].resize(layerCounts[5]);
130 
131  m_dimension.resize(m_nLogiLayers);
132  m_layerInfo.resize(m_nLogiLayers);
134 }
135 
136 // Seeks to the selected region
137 void FPGATrackSimPlaneMap::seek(ifstream & fin, unsigned region)
138 {
139  std::string line, key;
140  unsigned region_read = -1;
141 
142  while (getline(fin, line))
143  {
144  if (line.empty() || line[0] == '!') continue;
146  istringstream sline(line);
147 
148  bool ok = static_cast<bool>(sline >> key >> region_read);
149  if (ok && key == "region" && region_read == region) break;
150  }
151 
152  ANA_MSG_DEBUG("seek() ended at:" << line);
153 }
154 
155 
156 // Reads the rest of the file to populate all the member vectors
158 {
159  // Initialize read variables
160  int BEC{}, physLayer{}, physDisk{}, logiLayer{}, logiLayer1{}, logiLayer2{}, stereo{}, nDim{};
161  string line, silicon, planeKey1, planeKey2, stereoKey;
162  bool ok = true;
163 
164  uint32_t linesRead = 0;
165 
166  // Each line is a detector layer
167  while (getline(fin, line))
168  {
169  if (line.empty() || line[0] == '!') continue;
171  istringstream sline(line);
172 
173  ok = ok && (sline >> silicon >> BEC >> physDisk >> physLayer);
174 
175  // Detector
177  if (BEC == 0) zone = DetectorZone::barrel;
178  else if (BEC == 1) zone = DetectorZone::posEndcap;
179  else if (BEC == 2) zone = DetectorZone::negEndcap;
180  else ANA_MSG_FATAL("Bad Detector zone" << BEC);
181 
182  // Case on silicon type
183  int sil = 0;
185  if (silicon == "pixel")
186  {
187  sil = static_cast<int>(SiliconTech::pixel);
188  nDim = 2;
189  stereo = -1;
190  ok = ok && (sline >> planeKey1 >> logiLayer1 >> planeKey2 >> logiLayer2);
191  ok = ok && (planeKey1 == "plane1" && planeKey2 == "plane2");
192  }
193  else if (silicon == "SCT")
194  {
195  sil = static_cast<int>(SiliconTech::strip);
196  siTech = SiliconTech::strip;
197 
198  nDim = 1;
199  ok = ok && (sline >> stereoKey >> stereo >> planeKey1 >> logiLayer1 >> planeKey2 >> logiLayer2);
200  ok = ok && (planeKey1 == "plane1" && planeKey2 == "plane2" && stereoKey == "stereo");
201  }
202  else ANA_MSG_FATAL("Bad silicon type " << silicon);
203 
204 
205  if (!ok) break;
206 
207  // Logical layer
208  if (!m_layerOverrides.empty()) logiLayer = getOverrideLayer(siTech, zone, physLayer);
209  else if (stage == 1) logiLayer = logiLayer1;
210  else if (stage == 2) logiLayer = logiLayer2;
211 
212  // Check number of layers
213  linesRead++;
214  if (logiLayer >= (int)m_nLogiLayers) ANA_MSG_FATAL("Logical layer " << logiLayer << " exceeds expected number " << m_nLogiLayers);
215 
216  // Store to map
217  m_map.at(sil).at(BEC).at(physLayer).layer = logiLayer;
218  if (logiLayer >= 0)
219  {
220  m_dimension[logiLayer] = nDim;
221  m_map[sil][BEC][physLayer].section = m_layerInfo[logiLayer].size(); // i.e. index into m_layerInfo[logiLayer] entry below
222  m_layerInfo[logiLayer].push_back({ siTech, zone, physLayer, physDisk, stereo});
223  }
224 
225  if (m_nDetLayers == linesRead) break;
226  }
227 
228  if (!ok) ANA_MSG_FATAL("Error reading file");
229 }
230 
231 
233 // Interface Functions
235 
236 
238 {
239  if (hit.isMapped()) return;
240 
241  // re-assign layers in the pixel endcap to be each individual disk
242  // technically this returns a success/fail but I'm not sure we need it?
243  m_moduleRelabel->remap(hit);
244 
245  const LayerSection &pinfo = getLayerSection(hit.getDetType(), hit.getDetectorZone(), hit.getPhysLayer());
246  hit.setSection(pinfo.section);
247  hit.setLayer(pinfo.layer);
248  if (!hit.isMapped()) // failsafe if for some reason someone calls this on a clustered hit again, or something
250 }
251 
252 
254 // Helper Functions
256 
257 // Gets the logical layer number based on the override list
258 int FPGATrackSimPlaneMap::getOverrideLayer(SiliconTech si, DetectorZone dz, int physLayer) // TODO does dz need edit for negEndcap?
259 {
260  int code = static_cast<int>(si) * 1000 + static_cast<int>(dz) * 100 + physLayer;
261  for (unsigned i = 0; i < m_layerOverrides.size(); i++)
262  if (code == m_layerOverrides[i]) return i;
263  return -1;
264 }
265 
267 {
268  std::string out;
269  out += (isPixel(layer) ? "PIX" : "SCT");
270  out += (isEC(layer, section) ? "_EC_" : "_B_");
271  out += std::to_string(getLayerInfo(layer, section).physLayer);
272  return out;
273 }
FPGATrackSimPlaneMap::m_nCoords
uint32_t m_nCoords
Definition: FPGATrackSimPlaneMap.h:151
FPGATrackSimHit::setSection
void setSection(unsigned v)
Definition: FPGATrackSimHit.h:88
Remappings::diskIndices
std::vector< uint32_t > diskIndices(const std::string &geoKey)
for a given geo tag return disk indices remappings the format is this: 'GeometryVersion':'ATLAS-P2-RU...
Definition: Remappings.cxx:16
checkFileSG.line
line
Definition: checkFileSG.py:75
LArNewCalib_Delay_OFC_Cali.BEC
BEC
Definition: LArNewCalib_Delay_OFC_Cali.py:115
SiliconTech::strip
@ strip
FPGATrackSimHit::getPhysLayer
unsigned getPhysLayer() const
Definition: FPGATrackSimHit.cxx:67
python.FPGATrackSimAnalysisConfig.stage
stage
Definition: FPGATrackSimAnalysisConfig.py:604
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
FPGATrackSimPlaneMap.h
Maps physical layers to logical layers.
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
DetectorZone::posEndcap
@ posEndcap
accumulate
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Definition: FPGATrackSimMatrixAccumulator.cxx:22
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
FPGATrackSimPlaneMap::m_nDetLayers
uint32_t m_nDetLayers
Definition: FPGATrackSimPlaneMap.h:150
DetectorZone::nZones
@ nZones
ANA_MSG_ERROR
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:294
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
FPGATrackSimPlaneMap::isEC
bool isEC(uint32_t layer, uint32_t section) const
Definition: FPGATrackSimPlaneMap.h:111
FPGATrackSimPlaneMap::readLayers
void readLayers(std::ifstream &fin, uint32_t stage)
Definition: FPGATrackSimPlaneMap.cxx:157
FPGATrackSimPlaneMap::m_map
std::vector< std::vector< std::vector< LayerSection > > > m_map
Definition: FPGATrackSimPlaneMap.h:161
FPGATrackSimPlaneMap::getLayerSection
const LayerSection & getLayerSection(SiliconTech siTech, DetectorZone zone, uint32_t physLayer) const
Definition: FPGATrackSimPlaneMap.h:120
FPGATrackSimHit
Definition: FPGATrackSimHit.h:38
FPGATrackSimPlaneMap::isPixel
bool isPixel(int pl) const
Definition: FPGATrackSimPlaneMap.h:110
FPGATrackSimPlaneMap::m_layerOverrides
std::vector< int > m_layerOverrides
Definition: FPGATrackSimPlaneMap.h:166
FPGATrackSimPlaneMap::map
void map(FPGATrackSimHit &hit) const
Definition: FPGATrackSimPlaneMap.cxx:237
SiliconTech
SiliconTech
Definition: FPGATrackSimTypes.h:25
lumiFormat.i
int i
Definition: lumiFormat.py:92
FPGATrackSimPlaneMap::seek
void seek(std::ifstream &fin, unsigned region)
Definition: FPGATrackSimPlaneMap.cxx:137
FPGATrackSimPlaneMap::FPGATrackSimPlaneMap
FPGATrackSimPlaneMap(const std::string &filepath, unsigned region, unsigned stage, std::vector< int > layerOverrides=std::vector< int >())
Definition: FPGATrackSimPlaneMap.cxx:27
FPGATrackSimPlaneMap::m_coordOffset
std::vector< uint32_t > m_coordOffset
Definition: FPGATrackSimPlaneMap.h:154
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
ANA_MSG_INFO
#define ANA_MSG_INFO(xmsg)
Macro printing info messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:290
MessageCheck.h
macros for messaging and checking status codes
SiliconTech::nTechs
@ nTechs
FPGATrackSimPlaneMap::getLayerInfo
const LayerInfo & getLayerInfo(uint32_t layer, uint32_t section) const
Definition: FPGATrackSimPlaneMap.h:107
LayerSection
Definition: FPGATrackSimPlaneMap.h:40
ANA_MSG_FATAL
#define ANA_MSG_FATAL(xmsg)
Macro printing fatal messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:296
FPGATrackSimHit::getDetectorZone
DetectorZone getDetectorZone() const
Definition: FPGATrackSimHit.h:56
Remappings.h
pmontree.code
code
Definition: pmontree.py:443
python.draw_obj.zone
def zone(nx, ny)
Definition: draw_obj.py:288
ANA_MSG_VERBOSE
#define ANA_MSG_VERBOSE(xmsg)
Macro printing verbose messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:286
FPGATrackSimPlaneMap::m_nLogiLayers
uint32_t m_nLogiLayers
Definition: FPGATrackSimPlaneMap.h:149
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
LayerSection::section
uint32_t section
Definition: FPGATrackSimPlaneMap.h:42
FPGATrackSimPlaneMap::m_moduleRelabel
std::unique_ptr< FPGATrackSimModuleRelabel > m_moduleRelabel
Definition: FPGATrackSimPlaneMap.h:173
FPGATrackSimPlaneMap::allocateMap
void allocateMap(std::ifstream &fin, uint32_t stage)
Definition: FPGATrackSimPlaneMap.cxx:64
HitType::mapped
@ mapped
DetectorZone::negEndcap
@ negEndcap
FPGATrackSimHit::isMapped
bool isMapped() const
FPGATrackSimPlaneMap::layerName
std::string layerName(uint32_t layer, uint32_t section) const
Definition: FPGATrackSimPlaneMap.cxx:266
FPGATrackSimHit::setLayer
void setLayer(unsigned v)
Definition: FPGATrackSimHit.h:87
DetectorZone
DetectorZone
Definition: FPGATrackSimTypes.h:28
FPGATrackSimPlaneMap::getOverrideLayer
int getOverrideLayer(SiliconTech si, DetectorZone dz, int physLayer)
Definition: FPGATrackSimPlaneMap.cxx:258
LayerSection::layer
int layer
Definition: FPGATrackSimPlaneMap.h:41
FPGATrackSimPlaneMap::m_dimension
std::vector< uint32_t > m_dimension
Definition: FPGATrackSimPlaneMap.h:153
FPGATrackSimHit::getDetType
SiliconTech getDetType() const
Definition: FPGATrackSimHit.h:55
DetectorZone::barrel
@ barrel
compute_lumi.fin
fin
Definition: compute_lumi.py:19
FPGATrackSimPlaneMap::m_layerInfo
std::vector< std::vector< LayerInfo > > m_layerInfo
Definition: FPGATrackSimPlaneMap.h:163
section
void section(const std::string &sec)
Definition: TestTriggerMenuAccess.cxx:22
FPGATrackSimPlaneMap::m_diskIndex
std::vector< uint32_t > m_diskIndex
Definition: FPGATrackSimPlaneMap.h:170
SiliconTech::pixel
@ pixel
FPGATrackSimPlaneMap::m_coordLayer
std::vector< uint32_t > m_coordLayer
Definition: FPGATrackSimPlaneMap.h:158
FPGATrackSimHit::setHitType
void setHitType(HitType type)
Definition: FPGATrackSimHit.h:51
DetectorZone::undefined
@ undefined
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
ANA_MSG_DEBUG
#define ANA_MSG_DEBUG(xmsg)
Macro printing debug messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:288