ATLAS Offline Software
Loading...
Searching...
No Matches
TrigL2LayerNumberTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
10
13
15 const std::string& n,
16 const IInterface* p ): AthAlgTool(t,n,p),
17 m_useNewScheme(false),
22{
23 declareInterface< ITrigL2LayerNumberTool >( this );
24 declareProperty( "UseNewLayerScheme", m_useNewScheme = false );
25}
26
28
29 StatusCode sc = AthAlgTool::initialize();
30
31 ATH_MSG_DEBUG("In initialize...");
32
33 sc = detStore()->retrieve(m_pixelId, "PixelID");
34 if (sc.isFailure()) {
35 ATH_MSG_FATAL("Could not get Pixel ID helper");
36 return sc;
37 }
38
39 sc = detStore()->retrieve(m_sctId, "SCT_ID");
40 if (sc.isFailure()) {
41 ATH_MSG_FATAL("Could not get SCT ID helper");
42 return sc;
43 }
44
45 sc = detStore()->retrieve(m_pixelManager);
46 if( sc.isFailure() ) {
47 ATH_MSG_ERROR("Could not retrieve Pixel DetectorManager from detStore.");
48 return sc;
49 }
50
51 sc = detStore()->retrieve(m_sctManager);
52 if( sc.isFailure() ) {
53 ATH_MSG_ERROR("Could not retrieve SCT DetectorManager from detStore.");
54 return sc;
55 }
56
57 //calculate the numbers
58
59 if(!m_useNewScheme) {
60
61 const InDetDD::SiNumerology& pixSiNum = m_pixelManager->numerology();
62 const InDetDD::SiNumerology& sctSiNum = m_sctManager->numerology();
63
64 m_MaxSiliconLayerNum = pixSiNum.numLayers()+pixSiNum.numDisks()+sctSiNum.numLayers()+sctSiNum.numDisks();
65 m_OffsetBarrelSCT = pixSiNum.numLayers();
66 m_OffsetEndcapPixels = pixSiNum.numLayers()+sctSiNum.numLayers();
68 m_OffsetEndcapSCT = pixSiNum.numLayers()+sctSiNum.numLayers()+pixSiNum.numDisks();
69 }
70 else {
72
73 ATH_MSG_DEBUG("Total number of unique silicon layers = "<<m_hashMap.size());
74
75 m_MaxSiliconLayerNum = (int)m_hashMap.size();
77 }
78
79
80 ATH_MSG_DEBUG("TrigL2LayerNumberTool initialized ");
81
82 report();
83
84 return sc;
85}
86
88{
89 StatusCode sc = AthAlgTool::finalize();
90 return sc;
91}
92
94
95 ATH_MSG_DEBUG("TrigL2 Layer numbering scheme:");
96 ATH_MSG_DEBUG("Total number of layers = "<<maxSiliconLayerNum());
97 ATH_MSG_DEBUG("OffsetEndcapPixels = "<<offsetEndcapPixels());
98 ATH_MSG_DEBUG("OffsetBarrelSCT = "<<offsetBarrelSCT());
99 ATH_MSG_DEBUG("OffsetEndcapSCT = "<<offsetEndcapSCT());
100}
101
102void TrigL2LayerNumberTool::createModuleHashMap(std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >& hashMap) {
103
104 short subdetid = 1;
105
106 for(int hash = 0; hash<(int)m_pixelId->wafer_hash_max(); hash++) {
107
108 Identifier offlineId = m_pixelId->wafer_id(hash);
109
110 if(offlineId==0) continue;
111
112 short barrel_ec = m_pixelId->barrel_ec(offlineId);
113 if(std::abs(barrel_ec)>2) continue;//no DBM needed
114 short layer_disk = m_pixelId->layer_disk(offlineId);
115 short phi_index = m_pixelId->phi_module(offlineId);
116 short eta_index = m_pixelId->eta_module(offlineId);
117 //auto t = std::make_tuple(subdetid, barrel_ec, layer_disk);
118
119 auto t = std::make_tuple(barrel_ec==0 ? -100 : barrel_ec, subdetid, layer_disk);
120
121 std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >::iterator it = hashMap.find(t);
122 if(it==hashMap.end())
123 hashMap.insert(std::pair<std::tuple<short,short,short>,std::vector<PhiEtaHash> >(t,std::vector<PhiEtaHash>(1, PhiEtaHash(phi_index, eta_index, hash) )));
124 else (*it).second.push_back(PhiEtaHash(phi_index, eta_index, hash));
125 }
126 subdetid = 2;
127 for(int hash = 0; hash<(int)m_sctId->wafer_hash_max(); hash++) {
128
129 Identifier offlineId = m_sctId->wafer_id(hash);
130
131 if(offlineId==0) continue;
132
133 short barrel_ec = m_sctId->barrel_ec(offlineId);
134 short layer_disk = m_sctId->layer_disk(offlineId);
135 short phi_index = m_sctId->phi_module(offlineId);
136 short eta_index = m_sctId->eta_module(offlineId);
137
138 // auto t = std::make_tuple(subdetid, barrel_ec, layer_disk);
139
140 auto t = std::make_tuple(barrel_ec==0 ? -100 : barrel_ec, subdetid, layer_disk);
141
142 std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >::iterator it = hashMap.find(t);
143 if(it==hashMap.end())
144 hashMap.insert(std::pair<std::tuple<short,short,short>,std::vector<PhiEtaHash> >(t,std::vector<PhiEtaHash>(1, PhiEtaHash(phi_index, eta_index, hash))));
145 else (*it).second.push_back(PhiEtaHash(phi_index, eta_index, hash));
146 }
147
148 m_pixelLayers.clear();
149 m_sctLayers.clear();
150
151 m_pixelLayers.resize(m_pixelId->wafer_hash_max(), -100);
152 m_sctLayers.resize(m_sctId->wafer_hash_max(), -100);
153 m_layerGeometry.resize(hashMap.size());
154
155 int layerId=0;
157 for(std::map<std::tuple<short,short,short>,std::vector<PhiEtaHash> >::iterator it = hashMap.begin();it!=hashMap.end();++it, layerId++) {
158
159 short subdetId = std::get<1>((*it).first);
160 short barrel_ec = std::get<0>((*it).first);
161 if(barrel_ec==-100) barrel_ec = 0;
162 //short layer_disc = std::get<2>((*it).first);
163
164 if(barrel_ec == 0) m_LastBarrelLayer++;
165
166 m_layerGeometry[layerId].m_type = barrel_ec;
167 m_layerGeometry[layerId].m_subdet = subdetId;
168
169 float rc=0.0;
170 float minBound = 100000.0;
171 float maxBound =-100000.0;
172 int nModules = 0;
173
174 for(std::vector<PhiEtaHash>::iterator hIt = (*it).second.begin();hIt != (*it).second.end();++hIt) {
175
176 const InDetDD::SiDetectorElement *p{nullptr};
177
178 if(subdetId == 1) {//pixel
179 m_pixelLayers[(*hIt).m_hash] = layerId;
180 p = m_pixelManager->getDetectorElement((*hIt).m_hash);
181 }
182 if(subdetId == 2) {//SCT
183 m_sctLayers[(*hIt).m_hash] = layerId;
184 p = m_sctManager->getDetectorElement((*hIt).m_hash);
185 }
186
187 if (p==nullptr) {
188 ATH_MSG_ERROR("nullptr SiDetectorElement with idHash " << (*hIt).m_hash);
189 continue;
190 }
191 const Amg::Vector3D& C = p->center();
192 if(barrel_ec == 0) {
193 rc += sqrt(C(0)*C(0)+C(1)*C(1));
194 if(p->zMin() < minBound) minBound = p->zMin();
195 if(p->zMax() > maxBound) maxBound = p->zMax();
196 }
197 else {
198 rc += C(2);
199 if(p->rMin() < minBound) minBound = p->rMin();
200 if(p->rMax() > maxBound) maxBound = p->rMax();
201 }
202 nModules++;
203 }
204 m_layerGeometry[layerId].m_refCoord = rc/nModules;
205 m_layerGeometry[layerId].m_minBound = minBound;
206 m_layerGeometry[layerId].m_maxBound = maxBound;
207 }
208
209 int M = (layerId-m_LastBarrelLayer)/2;
210
211 ATH_MSG_DEBUG("List of unique layers in Pixel and SCT :");
212 for(int l=0;l<layerId;l++) {
213
214 int oldL = l;
215
216 if(l>m_LastBarrelLayer-1) {
217 oldL = l-m_LastBarrelLayer;
218 oldL = oldL < M ? oldL : oldL - M;
219 oldL += m_LastBarrelLayer;
220 }
221
222 if(m_layerGeometry[l].m_subdet==1) {
223 ATH_MSG_DEBUG("Layer "<<l<<" ("<<oldL<<") : PIX, reference coordinate ="<< m_layerGeometry[l].m_refCoord<<" boundaries: "<<m_layerGeometry[l].m_minBound<<
224 " "<<m_layerGeometry[l].m_maxBound);
225 }
226 if(m_layerGeometry[l].m_subdet==2) {
227 ATH_MSG_DEBUG("Layer "<<l<<" ("<<oldL<<") : SCT, reference coordinate ="<< m_layerGeometry[l].m_refCoord<<" boundaries: "<<m_layerGeometry[l].m_minBound<<
228 " "<<m_layerGeometry[l].m_maxBound);
229 }
230 }
231}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
static Double_t rc
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
Class to hold geometrical description of a silicon detector element.
Class to extract numerology for Pixel and SCT.
int numLayers() const
Number of layers.
int numDisks() const
Number of disks.
std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > m_hashMap
virtual int offsetEndcapPixels() const
std::vector< short > m_sctLayers
virtual int offsetBarrelSCT() const
virtual int maxSiliconLayerNum() const
const InDetDD::SCT_DetectorManager * m_sctManager
TrigL2LayerNumberTool(const std::string &, const std::string &, const IInterface *)
std::vector< TrigInDetSiLayer > m_layerGeometry
virtual void report() const
std::vector< short > m_pixelLayers
const InDetDD::PixelDetectorManager * m_pixelManager
void createModuleHashMap(std::map< std::tuple< short, short, short >, std::vector< PhiEtaHash > > &)
virtual int offsetEndcapSCT() const
struct color C
Eigen::Matrix< double, 3, 1 > Vector3D