ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimPlaneMap.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2
3
10
11
15#include <numeric>
16#include <sstream>
17#include <utility>
18
19using namespace asg::msgUserCode;
20using namespace std;
21
23// Constructor/Desctructor
25
26FPGATrackSimPlaneMap::FPGATrackSimPlaneMap(std::ifstream& fin, unsigned region, unsigned stage, std::vector<int> layerOverrides) :
27 m_map(static_cast<int>(SiliconTech::nTechs),
28 vector<vector<LayerSection>>(static_cast<int>(DetectorZone::nZones))
29 ),
30 m_layerOverrides(std::move(layerOverrides))
31{
32 // Reads the header of the file to resize all the vector members
33 allocateMap(fin, stage);
34
35 // Seek to the correct region
36 seek(fin, region);
37
38 // Reads the rest of the file to populate all the member vectors
39 readLayers(fin, stage);
40
41 // Postprocessing on coordinate indices
42 for (uint32_t l = 0; l < m_nLogiLayers; l++)
43 {
46 for (uint32_t i = 0; i < m_dimension[l]; i++)
47 m_coordLayer.push_back(l);
48 }
49
50 ANA_MSG_DEBUG("Using " << m_nLogiLayers << " logical layers and " << m_nCoords << " coordinates");
51}
52// Reads the header of the file to resize all the vector members
53void FPGATrackSimPlaneMap::allocateMap(ifstream & fin, uint32_t stage)
54{
55 // Initialize read variables
56 vector<int> layerCounts((int)SiliconTech::nTechs * static_cast<int>(DetectorZone::nZones)); // pixel_barrel, pixel_EC, SCT_barrel, SCT_EC
57 std::string line, silicon, detReg, layerKey, geoKey;
58 bool ok = true;
59 // Read Geometry Version
60 ok = ok && getline(fin, line);
61 while (line.empty() || line[0] == '!')
62 {
63 ok = ok && getline(fin, line);
64 }
65 ANA_MSG_VERBOSE(line);
66 istringstream sline(line);
67 ok = ok && (sline >> geoKey);
69
70 ANA_MSG_DEBUG("Allocating map for geometry " << geoKey <<" diskIndex size="<<m_diskIndex.size());
71 m_moduleRelabel = std::make_unique<FPGATrackSimModuleRelabel>(geoKey, false);
72
73
74
75 // Read number of logical layers
76 if (stage == 1)
77 {
78 ok = ok && getline(fin, line);
79 ANA_MSG_VERBOSE(line);
80 istringstream sline(line);
81 ok = ok && (sline >> m_nLogiLayers >> layerKey);
82 ok = ok && (layerKey == "logical_s1");
83 ok = ok && getline(fin, line); // skip the 2nd stage line
84 }
85 else if (stage == 2)
86 {
87 ok = ok && getline(fin, line); // skip the 1st stage line
88 ok = ok && getline(fin, line);
89 ANA_MSG_VERBOSE(line);
90 istringstream sline(line);
91 ok = ok && (sline >> m_nLogiLayers >> layerKey);
92 ok = ok && (layerKey == "logical_s2");
93 }
94 else ANA_MSG_ERROR("Bad stage " << stage << ". Stage should be 1 or 2");
95
96 if (!m_layerOverrides.empty()) m_nLogiLayers = m_layerOverrides.size();
97
98 // Read number of physical layers
99 int nHeaderLines = 6;
100 for (int i = 0; i < nHeaderLines; i++)
101 {
102 if (!ok) break;
103 ok = ok && getline(fin, line);
104 ANA_MSG_VERBOSE(line);
105
106 istringstream sline(line);
107 ok = ok && (sline >> layerCounts[i] >> silicon >> detReg);
108
109 ok = ok && ( (i < (nHeaderLines/2) && silicon == "pixel") || (i >= (nHeaderLines/2) && silicon == "SCT") );
110 ok = ok && ( (i % (nHeaderLines/2) == 0 && detReg == "barrel") || (i % (nHeaderLines/2) != 0 && (detReg == "endcap+" || detReg == "endcap-")) );
111 }
112
113 if (!ok) ANA_MSG_FATAL("Error reading layer counts");
114 m_nDetLayers = std::accumulate(layerCounts.begin(), layerCounts.end(), 0);
115
116 // Resize objects
117 m_map[(int)SiliconTech::pixel][(int)DetectorZone::barrel].resize(layerCounts[0]);
118 m_map[(int)SiliconTech::pixel][(int)DetectorZone::posEndcap].resize(layerCounts[1]);
119 m_map[(int)SiliconTech::pixel][(int)DetectorZone::negEndcap].resize(layerCounts[2]);
120 m_map[(int)SiliconTech::strip][(int)DetectorZone::barrel].resize(layerCounts[3]);
121 m_map[(int)SiliconTech::strip][(int)DetectorZone::posEndcap].resize(layerCounts[4]);
122 m_map[(int)SiliconTech::strip][(int)DetectorZone::negEndcap].resize(layerCounts[5]);
123
127}
128
129// Seeks to the selected region
130void FPGATrackSimPlaneMap::seek(ifstream & fin, unsigned region)
131{
132 std::string line, key;
133 unsigned region_read = -1;
134
135 while (getline(fin, line))
136 {
137 if (line.empty() || line[0] == '!') continue;
138 ANA_MSG_VERBOSE(line);
139 istringstream sline(line);
140
141 bool ok = static_cast<bool>(sline >> key >> region_read);
142 if (ok && key == "region" && region_read == region) break;
143 }
144
145 ANA_MSG_DEBUG("seek() ended at:" << line);
146}
147
148
149// Reads the rest of the file to populate all the member vectors
150void FPGATrackSimPlaneMap::readLayers(ifstream & fin, uint32_t stage)
151{
152 // Initialize read variables
153 int BEC{}, physLayer{}, physDisk{}, logiLayer{}, logiLayer1{}, logiLayer2{}, stereo{}, nDim{};
154 string line, silicon, planeKey1, planeKey2, stereoKey;
155 bool ok = true;
156
157 uint32_t linesRead = 0;
158
159 // Each line is a detector layer
160 while (getline(fin, line))
161 {
162 if (line.empty() || line[0] == '!') continue;
163 ANA_MSG_VERBOSE(line);
164 istringstream sline(line);
165
166 ok = ok && (sline >> silicon >> BEC >> physDisk >> physLayer);
167
168 // Detector
170 if (BEC == 0) zone = DetectorZone::barrel;
171 else if (BEC == 1) zone = DetectorZone::posEndcap;
172 else if (BEC == 2) zone = DetectorZone::negEndcap;
173 else ANA_MSG_FATAL("Bad Detector zone" << BEC);
174
175 // Case on silicon type
176 int sil = 0;
178 if (silicon == "pixel")
179 {
180 sil = static_cast<int>(SiliconTech::pixel);
181 nDim = 2;
182 stereo = -1;
183 ok = ok && (sline >> planeKey1 >> logiLayer1 >> planeKey2 >> logiLayer2);
184 ok = ok && (planeKey1 == "plane1" && planeKey2 == "plane2");
185 }
186 else if (silicon == "SCT")
187 {
188 sil = static_cast<int>(SiliconTech::strip);
189 siTech = SiliconTech::strip;
190
191 nDim = 1;
192 ok = ok && (sline >> stereoKey >> stereo >> planeKey1 >> logiLayer1 >> planeKey2 >> logiLayer2);
193 ok = ok && (planeKey1 == "plane1" && planeKey2 == "plane2" && stereoKey == "stereo");
194 }
195 else ANA_MSG_FATAL("Bad silicon type " << silicon);
196
197
198 if (!ok) break;
199
200 // Logical layer
201 if (!m_layerOverrides.empty()) logiLayer = getOverrideLayer(siTech, zone, physLayer);
202 else if (stage == 1) logiLayer = logiLayer1;
203 else if (stage == 2) logiLayer = logiLayer2;
204
205 // Check number of layers
206 linesRead++;
207 if (logiLayer >= (int)m_nLogiLayers) ANA_MSG_FATAL("Logical layer " << logiLayer << " exceeds expected number " << m_nLogiLayers);
208
209 // Store to map
210 m_map.at(sil).at(BEC).at(physLayer).layer = logiLayer;
211 if (logiLayer >= 0)
212 {
213 m_dimension[logiLayer] = nDim;
214 m_map[sil][BEC][physLayer].section = m_layerInfo[logiLayer].size(); // i.e. index into m_layerInfo[logiLayer] entry below
215 m_layerInfo[logiLayer].push_back({ siTech, zone, physLayer, physDisk, stereo});
216 }
217 if (m_nDetLayers == linesRead) break;
218 }
219
220 if (!ok) ANA_MSG_FATAL("Error reading file");
221}
222
223
225// Interface Functions
228{
229 if (!hit.isRemapped()) {
230 m_moduleRelabel->remap(hit);
231 }
232}
233
235{
236 // re-assign layers in the pixel endcap to be each individual disk
237 // technically this returns a success/fail but I'm not sure we need it?
238 // This should only happen if the hit is not already mapped.
239 const LayerSection &pinfo = getLayerSection(hit.getDetType(), hit.getDetectorZone(), hit.getPhysLayer());
240 hit.setSection(pinfo.section);
241 hit.setLayer(pinfo.layer);
242 if (!hit.isMapped() && hit.getHitType() == HitType::unmapped) { // failsafe if for some reason someone calls this on a clustered hit again, or something
244 }
245 // Special case if this is a spacepoint (now possible because slicing engine happens after SP formation).
246 if (hit.getHitType() == HitType::spacepoint) {
248 hit.setPairedSection(pinfo_sp.section);
249 hit.setPairedLayer(pinfo_sp.layer);
250 }
251}
252
253
255// Helper Functions
257
258// Gets the logical layer number based on the override list
259int FPGATrackSimPlaneMap::getOverrideLayer(SiliconTech si, DetectorZone dz, int physLayer) // TODO does dz need edit for negEndcap?
260{
261 int code = static_cast<int>(si) * 1000 + static_cast<int>(dz) * 100 + physLayer;
262 for (unsigned i = 0; i < m_layerOverrides.size(); i++)
263 if (code == m_layerOverrides[i]) return i;
264 return -1;
265}
266
267std::string FPGATrackSimPlaneMap::layerName(uint32_t layer, uint32_t section) const
268{
269 std::string out;
270 out += (isPixel(layer) ? "PIX" : "SCT");
271 out += (isEC(layer, section) ? "_EC_" : "_B_");
272 out += std::to_string(getLayerInfo(layer, section).physLayer);
273 return out;
274}
macros for messaging and checking status codes
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
#define ANA_MSG_VERBOSE(xmsg)
Macro printing verbose messages.
#define ANA_MSG_DEBUG(xmsg)
Macro printing debug messages.
#define ANA_MSG_FATAL(xmsg)
Macro printing fatal messages.
Maps physical layers to logical layers.
SiliconTech
DetectorZone
void section(const std::string &sec)
void setLayer(unsigned v)
unsigned getPairedPhysLayer() const
void setHitType(HitType type)
void setPairedSection(unsigned v)
void setPairedLayer(unsigned v)
DetectorZone getPairedDetZone() const
SiliconTech getPairedDetType() const
unsigned getPhysLayer(bool old=false) const
bool isMapped() const
SiliconTech getDetType() const
DetectorZone getDetectorZone() const
void setSection(unsigned v)
bool isRemapped() const
HitType getHitType() const
std::vector< uint32_t > m_coordLayer
int getOverrideLayer(SiliconTech si, DetectorZone dz, int physLayer)
std::vector< std::vector< LayerInfo > > m_layerInfo
void readLayers(std::ifstream &fin, uint32_t stage)
std::unique_ptr< FPGATrackSimModuleRelabel > m_moduleRelabel
void seek(std::ifstream &fin, unsigned region)
void allocateMap(std::ifstream &fin, uint32_t stage)
std::vector< uint32_t > m_dimension
FPGATrackSimPlaneMap(std::ifstream &fin, unsigned region, unsigned stage, std::vector< int > layerOverrides=std::vector< int >())
void map(FPGATrackSimHit &hit) const
bool isPixel(int pl) const
void doRemap(FPGATrackSimHit &hit) const
std::vector< std::vector< std::vector< LayerSection > > > m_map
std::string layerName(uint32_t layer, uint32_t section) const
std::vector< int > m_layerOverrides
std::vector< uint32_t > m_coordOffset
std::vector< uint32_t > m_diskIndex
const LayerSection & getLayerSection(SiliconTech siTech, DetectorZone zone, uint32_t physLayer) const
const LayerInfo & getLayerInfo(uint32_t layer, uint32_t section) const
bool isEC(uint32_t layer, uint32_t section) const
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...
STL namespace.