ATLAS Offline Software
GetDetectorPositions.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
16 
17 #include "GaudiKernel/MsgStream.h"
18 
19 #include "Identifier/Identifier.h"
23 
24 #include "InDetIdentifier/TRT_ID.h"
26 
27 #include "InDetIdentifier/SCT_ID.h"
28 
30 
32 
34 
35 #include <cstdlib>
36 #include <string>
37 #include <vector>
38 
40 GetDetectorPositions::GetDetectorPositions(std::string const& name, ISvcLocator* pSvcLocator) :
41  AthAlgorithm(name, pSvcLocator),
42  m_detailLevel(0),
43  m_doTRT(true),
44  m_outputFileName("IDgeometry.txt"),
45 
47  m_PixelHelper(nullptr),
48  m_SCTHelper(nullptr),
49  m_TRTHelper(nullptr),
50  m_TRTDetectorManager(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;
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;
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 
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 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
GetDetectorPositions::m_PixelHelper
const PixelID * m_PixelHelper
Tools.
Definition: GetDetectorPositions.h:67
GetDetectorPositions::writeSimpleTRTPositions
void writeSimpleTRTPositions()
Writing the Simple (not all straws) TRT Positions.
Definition: GetDetectorPositions.cxx:251
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
GetDetectorPositions::writePixelPositions
void writePixelPositions()
Functions to get the data.
Definition: GetDetectorPositions.cxx:138
GetDetectorPositions::finalize
StatusCode finalize()
Finalize.
Definition: GetDetectorPositions.cxx:128
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:19
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
TRT_DetectorManager.h
PixelID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: PixelID.h:619
GetDetectorPositions::m_pixelDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
Pixel Data.
Definition: GetDetectorPositions.h:61
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
TRT_ID.h
This is an Identifier helper class for the TRT subdetector. This class is a factory for creating comp...
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:206
GetDetectorPositions::writeSCTPositions
void writeSCTPositions()
Writing the SCT Positions.
Definition: GetDetectorPositions.cxx:182
ExpandedIdentifier
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:102
GetDetectorPositions::writeTRTPositions
void writeTRTPositions()
Writing the TRT positions (depends on the level of detail)
Definition: GetDetectorPositions.cxx:224
AthCommonMsg< Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
GetDetectorPositions::writeTwoTRTPositions
void writeTwoTRTPositions(Identifier const &trtId)
Write the TRT Positions, sampling each straw twice Allows the wire-by-wire alignment to be debugged.
Definition: GetDetectorPositions.cxx:331
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:728
SCT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: SCT_ID.h:740
GetDetectorPositions::writeDetailedTRTPositions
void writeDetailedTRTPositions(bool doDoubleSampling=false)
Writing the Detailed (all straws) TRT Positions.
Definition: GetDetectorPositions.cxx:267
GetDetectorPositions::m_outputFileName
std::string m_outputFileName
Definition: GetDetectorPositions.h:57
TRT_ID::straw_layer_end
const_id_iterator straw_layer_end(void) const
Definition: TRT_ID.h:961
ReadCondHandle.h
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
TRT_ID::straw
int straw(const Identifier &id) const
Definition: TRT_ID.h:902
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
PixelID::phi_index_max
int phi_index_max(const Identifier &id) const
Definition: PixelID.cxx:144
MultiRange::const_identifier_factory
Definition: MultiRange.h:52
PixelID::eta_index_max
int eta_index_max(const Identifier &id) const
Definition: PixelID.cxx:163
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
GetDetectorPositions::m_SCTDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
SCT Data.
Definition: GetDetectorPositions.h:64
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
GetDetectorPositions::m_SCTHelper
const SCT_ID * m_SCTHelper
Definition: GetDetectorPositions.h:69
TRT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: TRT_ID.h:866
TRT_ID::straw_layer
int straw_layer(const Identifier &id) const
Definition: TRT_ID.h:893
GetDetectorPositions.h
TRT_ID::layer_or_wheel
int layer_or_wheel(const Identifier &id) const
Definition: TRT_ID.h:884
AthAlgorithm
Definition: AthAlgorithm.h:47
MuonGM::nStrips
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)
Definition: MuonDetDescr/MuonGeoModelTest/src/GeoModelTgcTest.cxx:46
PixelID::layer_disk
int layer_disk(const Identifier &id) const
Definition: PixelID.h:626
EventPrimitives.h
PixelID::eta_module
int eta_module(const Identifier &id) const
Definition: PixelID.h:651
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
IdentifierHash.h
InDetDD::TRT_DetectorManager::getElement
const TRT_BaseElement * getElement(Identifier id) const
Access Elements Generically---------------------------------------------—.
Definition: TRT_DetectorManager.cxx:148
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:734
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
GetDetectorPositions::m_TRTDetectorManager
const InDetDD::TRT_DetectorManager * m_TRTDetectorManager
Definition: GetDetectorPositions.h:72
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
TRT_ID::straw_end
const_expanded_id_iterator straw_end(void) const
Definition: TRT_ID.h:977
TRT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: TRT_ID.h:875
SiDetectorElement.h
GetDetectorPositions::execute
StatusCode execute()
execute
Definition: GetDetectorPositions.cxx:99
InDetDD::TRT_BaseElement::strawTransform
const Amg::Transform3D & strawTransform(unsigned int straw) const
Straw transform - fast access in array, in Tracking frame: Amg.
Definition: TRT_BaseElement.cxx:89
SCT_ID::eta_module
int eta_module(const Identifier &id) const
Definition: SCT_ID.h:746
SCT_ID::strip_max
int strip_max(const Identifier &id) const
Definition: SCT_ID.cxx:187
InDetDD::TRT_BaseElement::center
virtual const Amg::Vector3D & center() const override final
Element Surface: center of a straw layer.
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
GetDetectorPositions::m_TRTHelper
const TRT_ID * m_TRTHelper
Definition: GetDetectorPositions.h:71
TRT_Numerology.h
GetDetectorPositions::GetDetectorPositions
GetDetectorPositions(const std::string &name, ISvcLocator *pSvcLocator)
Authors: John Alison johnda@hep.upenn.edu
Definition: GetDetectorPositions.cxx:40
TRT_ID::straw_begin
const_expanded_id_iterator straw_begin(void) const
For straw ids, only expanded id iterators are available.
Definition: TRT_ID.h:969
TRT_ID::straw_layer_begin
const_id_iterator straw_layer_begin(void) const
Iterators over full set of straw_layer ids. Straw_layer ids are sorted.
Definition: TRT_ID.h:953
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
SCT_ID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side) const
For a single side of module.
Definition: SCT_ID.h:464
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
PixelID::phi_module
int phi_module(const Identifier &id) const
Definition: PixelID.h:644
GetDetectorPositions::m_eventCount
int m_eventCount
Counter.
Definition: GetDetectorPositions.h:75
GetDetectorPositions::initialize
StatusCode initialize()
initialize
Definition: GetDetectorPositions.cxx:59
GetDetectorPositions::m_outputFile
std::ofstream m_outputFile
Definition: GetDetectorPositions.h:58
TRT_ID::straw_id
Identifier straw_id(int barrel_ec, int phi_module, int layer_or_wheel, int straw_layer, int straw) const
Three ways of getting id for a single straw:
Definition: TRT_ID.h:581
GetDetectorPositions::m_doTRT
bool m_doTRT
Definition: GetDetectorPositions.h:56
GetDetectorPositions::m_detailLevel
unsigned int m_detailLevel
Name of the Output file.
Definition: GetDetectorPositions.h:55
Identifier
Definition: IdentifierFieldParser.cxx:14