ATLAS Offline Software
Loading...
Searching...
No Matches
GetDetectorPositions.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 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#include <iostream>
39
41GetDetectorPositions::GetDetectorPositions(std::string const& name, ISvcLocator* pSvcLocator) :
42 AthAlgorithm(name, pSvcLocator),
44 m_doTRT(true),
45 m_outputFileName("IDgeometry.txt"),
46
48 m_PixelHelper(nullptr),
49 m_SCTHelper(nullptr),
50 m_TRTHelper(nullptr),
52
53{
54 declareProperty("OutputTextFile",m_outputFileName);
55 declareProperty("DetailLevel", m_detailLevel);
56 declareProperty("DoTRT", m_doTRT);
57}
58
61 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "initialize()" << endmsg;
62
64 if(m_doTRT){
65 if (detStore()->retrieve(m_TRTHelper, "TRT_ID").isFailure()) {
66 msg(MSG::FATAL) << "Could not get TRT ID helper" << endmsg;
67 return StatusCode::FAILURE;
68 }
69 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "got the TRT ID" << endmsg;
70
71 if ((detStore()->retrieve(m_TRTDetectorManager)).isFailure()) {
72 if(msgLvl(MSG::FATAL)) msg(MSG::FATAL) << "Problem retrieving TRT_DetectorManager" << endmsg;
73 return StatusCode::FAILURE;
74 }
75 }
76
78 if (detStore()->retrieve(m_SCTHelper, "SCT_ID").isFailure()) {
79 msg(MSG::FATAL) << "Could not get SCT ID helper" << endmsg;
80 return StatusCode::FAILURE;
81 }
82 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "got the SCT ID" << endmsg;
83 ATH_CHECK(m_SCTDetEleCollKey.initialize());
84
86 if (detStore()->retrieve(m_PixelHelper, "PixelID").isFailure()) {
87 msg(MSG::FATAL) << "Could not get Pixel ID helper" << endmsg;
88 return StatusCode::FAILURE;
89 }
90 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "got the Pixel ID" << endmsg;
91 ATH_CHECK(m_pixelDetEleCollKey.initialize());
92
94 m_outputFile.open((m_outputFileName).c_str());
95
96 return StatusCode::SUCCESS;
97}
98
100StatusCode GetDetectorPositions::execute(const EventContext& /*ctx*/) {
101
102 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "execute() check global position" << endmsg;
103
104 //StatusCode sc = StatusCode::SUCCESS;
105 m_eventCount++;
106
108 if (m_eventCount!=0)
109 return StatusCode::SUCCESS;
110
111 std::cout << "========================================================================================" <<std::endl;
112 std::cout << "==================== Getting the Inner Detector Positions ==============================" <<std::endl;
113 std::cout << "========================================================================================" <<std::endl;
114
115 //Write pixel positions
117
118 //Write SCT positions
120
121 //Write TRT positions
122 if(m_doTRT)
124
125 return StatusCode::SUCCESS;
126}
127
130 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "finalize()" << endmsg;
131
133 m_outputFile.close();
134
135 return StatusCode::SUCCESS;
136}
137
140 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writePixelPositions()" << endmsg;
141
143 const InDetDD::SiDetectorElementCollection* elements{*pixelDetEleHandle};
144 if (not pixelDetEleHandle.isValid() or elements==nullptr) {
145 ATH_MSG_ERROR(m_pixelDetEleCollKey.fullKey() << " is not available.");
146 return;
147 }
148 //Loop over pixel elements
149 for (const InDetDD::SiDetectorElement* si_hit: *elements) {
150 Amg::Vector3D p3d = si_hit->center();
151
152 const IdentifierHash wafer_hash = si_hit->identifyHash();
153 const Identifier wafer_id = m_SCTHelper->wafer_id(wafer_hash);
154
155 int pix_barrel_ec = m_PixelHelper->barrel_ec(wafer_id);
156 int pix_layer_disk= m_PixelHelper->layer_disk(wafer_id);
157 int pix_phi_module= m_PixelHelper->phi_module(wafer_id);
158 int pix_eta_module = m_PixelHelper->eta_module(wafer_id);
159 int nPixPhi = m_PixelHelper->phi_index_max(wafer_id)+1;
160 int nPixEta = m_PixelHelper->eta_index_max(wafer_id)+1;
161 float pix_x = p3d.x();
162 float pix_y = p3d.y();
163 float pix_z = p3d.z();
164
165 m_outputFile << 1 << " "
166 << pix_barrel_ec << " "
167 << pix_layer_disk << " "
168 << pix_phi_module << " "
169 << pix_eta_module << " "
170 << pix_x << " "
171 << pix_y << " "
172 << pix_z << " "
173 << nPixPhi << " "
174 << nPixEta << " "
175 << std::endl;
176 }
177
178 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writePixelPositions()" << endmsg;
179 return;
180}
181
184 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeSCTPositions()" << endmsg;
185
187 const InDetDD::SiDetectorElementCollection* elements{*sctDetEleHandle};
188 if (not sctDetEleHandle.isValid() or elements==nullptr) {
189 ATH_MSG_ERROR(m_SCTDetEleCollKey.fullKey() << " is not available.");
190 return;
191 }
192 //Loop over SCT elements
193 for (const InDetDD::SiDetectorElement* si_hit: *elements) {
194 Amg::Vector3D p3d = si_hit->center();
195
196 const IdentifierHash wafer_hash = si_hit->identifyHash();
197 const Identifier wafer_id = m_SCTHelper->wafer_id(wafer_hash);
198
199 int sct_barrel_ec = m_SCTHelper->barrel_ec(wafer_id);
200 int sct_layer_disk= m_SCTHelper->layer_disk(wafer_id);
201 int sct_phi_module= m_SCTHelper->phi_module(wafer_id);
202 int sct_eta_module = m_SCTHelper->eta_module(wafer_id);
203 int nStrips = m_SCTHelper->strip_max(wafer_id)+1;
204 float sct_x = p3d.x();
205 float sct_y = p3d.y();
206 float sct_z = p3d.z();
207
208 m_outputFile << 2 << " "
209 << sct_barrel_ec << " "
210 << sct_layer_disk << " "
211 << sct_phi_module << " "
212 << sct_eta_module << " "
213 << sct_x << " "
214 << sct_y << " "
215 << sct_z << " "
216 << nStrips << " "
217 << std::endl;
218 }
219
220 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writeSCTPositions()" << endmsg;
221 return;
222}
223
226 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTRTPositions()" << endmsg;
227
228 //Write TRT positions
229 switch(m_detailLevel) {
230
231 case 0 :
232 // Only sample each 32nd in phi
234 break;
235
236 case 1 :
237 // Sample each straw
239 break;
240
241 case 2 :
242 // Sample each straw twice
244 break;
245 }
246
247 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTRTPositions()" << endmsg;
248 return;
249}
250
253 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeSimpleTRTPositions()" << endmsg;
254
255 //Loop over TRT elements
256 std::vector<Identifier>::const_iterator trtStrawLayIt = m_TRTHelper->straw_layer_begin();
257 std::vector<Identifier>::const_iterator trtStrawLayItE = m_TRTHelper->straw_layer_end();
258
259 for(; trtStrawLayIt != trtStrawLayItE; ++trtStrawLayIt ) {
260 writeTRTPositions(*trtStrawLayIt);
261 }
262
263 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTRTPositions()" << endmsg;
264 return;
265}
266
269 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeDetailedTRTPositions()" << endmsg;
270
271 TRT_ID::const_expanded_id_iterator trtStrawIt = m_TRTHelper->straw_begin();
272 TRT_ID::const_expanded_id_iterator trtStrawItE = m_TRTHelper->straw_end();
273
274 for (; trtStrawIt != trtStrawItE; ++trtStrawIt) {
275 const ExpandedIdentifier& expId = (*trtStrawIt);
276
277 Identifier trtId = m_TRTHelper->straw_id(expId[2],
278 expId[3],
279 expId[4],
280 expId[5],
281 expId[6]);
282
283 if(doDoubleSampling)
284 writeTwoTRTPositions(trtId);
285 else
286 writeTRTPositions(trtId);
287 }
288
289 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writeDetailedTRTPositions()" << endmsg;
290 return;
291}
292
295 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTRTPositions()" << endmsg;
296
297 const Amg::Vector3D &p3d = m_TRTDetectorManager->getElement( trtId )->center(trtId);
298
299
300 int trt_barrel_ec = m_TRTHelper->barrel_ec(trtId);
301 int trt_layer_or_wheel = m_TRTHelper->layer_or_wheel(trtId);
302 int trt_phi_module = m_TRTHelper->phi_module(trtId);
303 int trt_straw_layer = m_TRTHelper->straw_layer(trtId);
304 int trt_straw = m_TRTHelper->straw(trtId);
305 float trt_x = p3d.x();
306 float trt_y = p3d.y();
307 float trt_z = p3d.z();
308
309 m_outputFile << 3 << " "
310 << trt_barrel_ec << " "
311 << trt_layer_or_wheel << " "
312 << trt_phi_module << " "
313 << trt_straw_layer << " ";
314
315 if(m_detailLevel)
316 m_outputFile << trt_straw << " ";
317
318 m_outputFile << trt_x << " "
319 << trt_y << " "
320 << trt_z << " "
321 << std::endl;
322
323 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writeTRTPositions()" << endmsg;
324 return;
325}
326
327
328
333 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "In writeTwoTRTPositions()" << endmsg;
334
335 int trt_barrel_ec = m_TRTHelper->barrel_ec(trtId);
336 int trt_layer_or_wheel = m_TRTHelper->layer_or_wheel(trtId);
337 int trt_phi_module = m_TRTHelper->phi_module(trtId);
338 int trt_straw_layer = m_TRTHelper->straw_layer(trtId);
339 int trt_straw = m_TRTHelper->straw(trtId);
340
341 // We sample the straw position at two places
342 Amg::Vector3D posZSample(0,0,100);
343 Amg::Vector3D firstSampling = m_TRTDetectorManager->getElement( trtId )->strawTransform(trt_straw) * posZSample;
344 float first_X = firstSampling.x();
345 float first_Y = firstSampling.y();
346 float first_Z = firstSampling.z();
347
348 Amg::Vector3D negZSample(0,0,-100);
349 Amg::Vector3D secondSampling = m_TRTDetectorManager->getElement( trtId )->strawTransform(trt_straw) * negZSample;
350 float second_X = secondSampling.x();
351 float second_Y = secondSampling.y();
352 float second_Z = secondSampling.z();
353
354 m_outputFile << 3 << " "
355 << trt_barrel_ec << " "
356 << trt_layer_or_wheel << " "
357 << trt_phi_module << " "
358 << trt_straw_layer << " "
359 << trt_straw << " "
360 << first_X << " "
361 << first_Y << " "
362 << first_Z << " "
363 << std::endl;
364
365 m_outputFile << 3 << " "
366 << trt_barrel_ec << " "
367 << trt_layer_or_wheel << " "
368 << trt_phi_module << " "
369 << trt_straw_layer << " "
370 << trt_straw << " "
371 << second_X << " "
372 << second_Y << " "
373 << second_Z << " "
374 << std::endl;
375
376
377 if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Leaving writeTRTPositions()" << endmsg;
378 return;
379}
#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.
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.
StatusCode execute(const EventContext &ctx)
execute
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.
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:90
Eigen::Matrix< double, 3, 1 > Vector3D
MsgStream & msg
Definition testRead.cxx:32