ATLAS Offline Software
Loading...
Searching...
No Matches
GetDetectorPositions.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
14
16
17#include "GaudiKernel/MsgStream.h"
18
19#include "Identifier/Identifier.h"
23
26
28
30
32
34
35#include <cstdlib>
36#include <string>
37#include <vector>
38
40GetDetectorPositions::GetDetectorPositions(std::string const& name, ISvcLocator* pSvcLocator) :
41 AthAlgorithm(name, pSvcLocator),
43 m_doTRT(true),
44 m_outputFileName("IDgeometry.txt"),
45
47 m_PixelHelper(nullptr),
48 m_SCTHelper(nullptr),
49 m_TRTHelper(nullptr),
51
52{
53 declareProperty("OutputTextFile",m_outputFileName);
54 declareProperty("DetailLevel", m_detailLevel);
55 declareProperty("DoTRT", m_doTRT);
56}
57
60 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "initialize()" << endmsg;
61
63 if(m_doTRT){
64 if (detStore()->retrieve(m_TRTHelper, "TRT_ID").isFailure()) {
65 msg(MSG::FATAL) << "Could not get TRT ID helper" << endmsg;
66 return StatusCode::FAILURE;
67 }
68 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "got the TRT ID" << endmsg;
69
70 if ((detStore()->retrieve(m_TRTDetectorManager)).isFailure()) {
71 if(msgLvl(MSG::FATAL)) msg(MSG::FATAL) << "Problem retrieving TRT_DetectorManager" << endmsg;
72 return StatusCode::FAILURE;
73 }
74 }
75
77 if (detStore()->retrieve(m_SCTHelper, "SCT_ID").isFailure()) {
78 msg(MSG::FATAL) << "Could not get SCT ID helper" << endmsg;
79 return StatusCode::FAILURE;
80 }
81 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "got the SCT ID" << endmsg;
82 ATH_CHECK(m_SCTDetEleCollKey.initialize());
83
85 if (detStore()->retrieve(m_PixelHelper, "PixelID").isFailure()) {
86 msg(MSG::FATAL) << "Could not get Pixel ID helper" << endmsg;
87 return StatusCode::FAILURE;
88 }
89 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "got the Pixel ID" << endmsg;
90 ATH_CHECK(m_pixelDetEleCollKey.initialize());
91
93 m_outputFile.open((m_outputFileName).c_str());
94
95 return StatusCode::SUCCESS;
96}
97
100
101 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "execute() check global position" << endmsg;
102
103 //StatusCode sc = StatusCode::SUCCESS;
104 m_eventCount++;
105
107 if (m_eventCount!=0)
108 return StatusCode::SUCCESS;
109
110 std::cout << "========================================================================================" <<std::endl;
111 std::cout << "==================== Getting the Inner Detector Positions ==============================" <<std::endl;
112 std::cout << "========================================================================================" <<std::endl;
113
114 //Write pixel positions
116
117 //Write SCT positions
119
120 //Write TRT positions
121 if(m_doTRT)
123
124 return StatusCode::SUCCESS;
125}
126
129 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "finalize()" << endmsg;
130
132 m_outputFile.close();
133
134 return StatusCode::SUCCESS;
135}
136
139 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writePixelPositions()" << endmsg;
140
142 const InDetDD::SiDetectorElementCollection* elements{*pixelDetEleHandle};
143 if (not pixelDetEleHandle.isValid() or elements==nullptr) {
144 ATH_MSG_ERROR(m_pixelDetEleCollKey.fullKey() << " is not available.");
145 return;
146 }
147 //Loop over pixel elements
148 for (const InDetDD::SiDetectorElement* si_hit: *elements) {
149 Amg::Vector3D p3d = si_hit->center();
150
151 const IdentifierHash wafer_hash = si_hit->identifyHash();
152 const Identifier wafer_id = m_SCTHelper->wafer_id(wafer_hash);
153
154 int pix_barrel_ec = m_PixelHelper->barrel_ec(wafer_id);
155 int pix_layer_disk= m_PixelHelper->layer_disk(wafer_id);
156 int pix_phi_module= m_PixelHelper->phi_module(wafer_id);
157 int pix_eta_module = m_PixelHelper->eta_module(wafer_id);
158 int nPixPhi = m_PixelHelper->phi_index_max(wafer_id)+1;
159 int nPixEta = m_PixelHelper->eta_index_max(wafer_id)+1;
160 float pix_x = p3d.x();
161 float pix_y = p3d.y();
162 float pix_z = p3d.z();
163
164 m_outputFile << 1 << " "
165 << pix_barrel_ec << " "
166 << pix_layer_disk << " "
167 << pix_phi_module << " "
168 << pix_eta_module << " "
169 << pix_x << " "
170 << pix_y << " "
171 << pix_z << " "
172 << nPixPhi << " "
173 << nPixEta << " "
174 << std::endl;
175 }
176
177 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writePixelPositions()" << endmsg;
178 return;
179}
180
183 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeSCTPositions()" << endmsg;
184
186 const InDetDD::SiDetectorElementCollection* elements{*sctDetEleHandle};
187 if (not sctDetEleHandle.isValid() or elements==nullptr) {
188 ATH_MSG_ERROR(m_SCTDetEleCollKey.fullKey() << " is not available.");
189 return;
190 }
191 //Loop over SCT elements
192 for (const InDetDD::SiDetectorElement* si_hit: *elements) {
193 Amg::Vector3D p3d = si_hit->center();
194
195 const IdentifierHash wafer_hash = si_hit->identifyHash();
196 const Identifier wafer_id = m_SCTHelper->wafer_id(wafer_hash);
197
198 int sct_barrel_ec = m_SCTHelper->barrel_ec(wafer_id);
199 int sct_layer_disk= m_SCTHelper->layer_disk(wafer_id);
200 int sct_phi_module= m_SCTHelper->phi_module(wafer_id);
201 int sct_eta_module = m_SCTHelper->eta_module(wafer_id);
202 int nStrips = m_SCTHelper->strip_max(wafer_id)+1;
203 float sct_x = p3d.x();
204 float sct_y = p3d.y();
205 float sct_z = p3d.z();
206
207 m_outputFile << 2 << " "
208 << sct_barrel_ec << " "
209 << sct_layer_disk << " "
210 << sct_phi_module << " "
211 << sct_eta_module << " "
212 << sct_x << " "
213 << sct_y << " "
214 << sct_z << " "
215 << nStrips << " "
216 << std::endl;
217 }
218
219 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writeSCTPositions()" << endmsg;
220 return;
221}
222
225 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTRTPositions()" << endmsg;
226
227 //Write TRT positions
228 switch(m_detailLevel) {
229
230 case 0 :
231 // Only sample each 32nd in phi
233 break;
234
235 case 1 :
236 // Sample each straw
238 break;
239
240 case 2 :
241 // Sample each straw twice
243 break;
244 }
245
246 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTRTPositions()" << endmsg;
247 return;
248}
249
252 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeSimpleTRTPositions()" << endmsg;
253
254 //Loop over TRT elements
255 std::vector<Identifier>::const_iterator trtStrawLayIt = m_TRTHelper->straw_layer_begin();
256 std::vector<Identifier>::const_iterator trtStrawLayItE = m_TRTHelper->straw_layer_end();
257
258 for(; trtStrawLayIt != trtStrawLayItE; ++trtStrawLayIt ) {
259 writeTRTPositions(*trtStrawLayIt);
260 }
261
262 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTRTPositions()" << endmsg;
263 return;
264}
265
268 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeDetailedTRTPositions()" << endmsg;
269
270 TRT_ID::const_expanded_id_iterator trtStrawIt = m_TRTHelper->straw_begin();
271 TRT_ID::const_expanded_id_iterator trtStrawItE = m_TRTHelper->straw_end();
272
273 for (; trtStrawIt != trtStrawItE; ++trtStrawIt) {
274 const ExpandedIdentifier& expId = (*trtStrawIt);
275
276 Identifier trtId = m_TRTHelper->straw_id(expId[2],
277 expId[3],
278 expId[4],
279 expId[5],
280 expId[6]);
281
282 if(doDoubleSampling)
283 writeTwoTRTPositions(trtId);
284 else
285 writeTRTPositions(trtId);
286 }
287
288 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writeDetailedTRTPositions()" << endmsg;
289 return;
290}
291
294 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTRTPositions()" << endmsg;
295
296 const Amg::Vector3D &p3d = m_TRTDetectorManager->getElement( trtId )->center(trtId);
297
298
299 int trt_barrel_ec = m_TRTHelper->barrel_ec(trtId);
300 int trt_layer_or_wheel = m_TRTHelper->layer_or_wheel(trtId);
301 int trt_phi_module = m_TRTHelper->phi_module(trtId);
302 int trt_straw_layer = m_TRTHelper->straw_layer(trtId);
303 int trt_straw = m_TRTHelper->straw(trtId);
304 float trt_x = p3d.x();
305 float trt_y = p3d.y();
306 float trt_z = p3d.z();
307
308 m_outputFile << 3 << " "
309 << trt_barrel_ec << " "
310 << trt_layer_or_wheel << " "
311 << trt_phi_module << " "
312 << trt_straw_layer << " ";
313
314 if(m_detailLevel)
315 m_outputFile << trt_straw << " ";
316
317 m_outputFile << trt_x << " "
318 << trt_y << " "
319 << trt_z << " "
320 << std::endl;
321
322 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writeTRTPositions()" << endmsg;
323 return;
324}
325
326
327
332 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTwoTRTPositions()" << endmsg;
333
334 int trt_barrel_ec = m_TRTHelper->barrel_ec(trtId);
335 int trt_layer_or_wheel = m_TRTHelper->layer_or_wheel(trtId);
336 int trt_phi_module = m_TRTHelper->phi_module(trtId);
337 int trt_straw_layer = m_TRTHelper->straw_layer(trtId);
338 int trt_straw = m_TRTHelper->straw(trtId);
339
340 // We sample the straw position at two places
341 Amg::Vector3D posZSample(0,0,100);
342 Amg::Vector3D firstSampling = m_TRTDetectorManager->getElement( trtId )->strawTransform(trt_straw) * posZSample;
343 float first_X = firstSampling.x();
344 float first_Y = firstSampling.y();
345 float first_Z = firstSampling.z();
346
347 Amg::Vector3D negZSample(0,0,-100);
348 Amg::Vector3D secondSampling = m_TRTDetectorManager->getElement( trtId )->strawTransform(trt_straw) * negZSample;
349 float second_X = secondSampling.x();
350 float second_Y = secondSampling.y();
351 float second_Z = secondSampling.z();
352
353 m_outputFile << 3 << " "
354 << trt_barrel_ec << " "
355 << trt_layer_or_wheel << " "
356 << trt_phi_module << " "
357 << trt_straw_layer << " "
358 << trt_straw << " "
359 << first_X << " "
360 << first_Y << " "
361 << first_Z << " "
362 << std::endl;
363
364 m_outputFile << 3 << " "
365 << trt_barrel_ec << " "
366 << trt_layer_or_wheel << " "
367 << trt_phi_module << " "
368 << trt_straw_layer << " "
369 << trt_straw << " "
370 << second_X << " "
371 << second_Y << " "
372 << second_Z << " "
373 << std::endl;
374
375
376 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writeTRTPositions()" << endmsg;
377 return;
378}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
This is an Identifier helper class for the TRT subdetector.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
StatusCode initialize()
initialize
void writeTRTPositions()
Writing the TRT positions (depends on the level of detail)
void writeTwoTRTPositions(Identifier const &trtId)
Write the TRT Positions, sampling each straw twice Allows the wire-by-wire alignment to be debugged.
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
Pixel Data.
GetDetectorPositions(const std::string &name, ISvcLocator *pSvcLocator)
Authors: John Alison johnda@hep.upenn.edu
const PixelID * m_PixelHelper
Tools.
void writePixelPositions()
Functions to get the data.
void writeSimpleTRTPositions()
Writing the Simple (not all straws) TRT Positions.
unsigned int m_detailLevel
Name of the Output file.
StatusCode execute()
execute
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
SCT Data.
void writeDetailedTRTPositions(bool doDoubleSampling=false)
Writing the Detailed (all straws) TRT Positions.
void writeSCTPositions()
Writing the SCT Positions.
StatusCode finalize()
Finalize.
const InDetDD::TRT_DetectorManager * m_TRTDetectorManager
This is a "hash" representation of an Identifier.
Class to hold the SiDetectorElement objects to be put in the detector store.
Class to hold geometrical description of a silicon detector element.
MultiRange::const_identifier_factory const_expanded_id_iterator
Definition TRT_ID.h:88
Eigen::Matrix< double, 3, 1 > Vector3D
MsgStream & msg
Definition testRead.cxx:32