Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PrintSiElements.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
8 
9 #include "CLHEP/Units/SystemOfUnits.h"
10 
13 #include "InDetIdentifier/SCT_ID.h"
14 #include "Identifier/Identifier.h"
17 
18 #include <iostream>
19 #include <vector>
20 #include <string>
21 #include <sstream>
22 namespace{
23  const Amg::Vector3D origin(0.,0., 0.);
24 }
25 
27 //
28 // Prints out SiDetectorElement transform
29 
31 
32 PrintSiElements::PrintSiElements(const std::string& name, ISvcLocator* pSvcLocator)
33  : AthAlgorithm(name, pSvcLocator),
34  m_firstEvent(true),
35  m_detManagerNames{"Pixel","SCT"}
36 {
37  // Get parameter values from jobOptions file
38  declareProperty("ModulesOnly", m_modulesOnly = true, "Print transforms of modules");
39  declareProperty("ExpandId", m_expandId = true, "Print fields of identifier");
40  declareProperty("NominalPosition", m_nominal = true, "Print out nominal geometry");
41  declareProperty("AlignedPosition", m_aligned = false, "Print out aligned geometry");
42  declareProperty("FullRotationMatrix", m_fullRotationMatrix = false, "If true prints the 9 elements of the rotation matrix");
43  declareProperty("OutputFile", m_outputFileName = "geometry.dat", "Output file name");
44  declareProperty("DetectorManagerNames", m_detManagerNames);
45 }
46 
47 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
48 
50  // Get GeoModelSvc
51  ATH_CHECK(m_geoModelSvc.retrieve());
52  m_fileout.open(m_outputFileName.c_str());
53  ATH_MSG_DEBUG( "Opening output file " << m_outputFileName );
54  if (!m_fileout) {
55  ATH_MSG_ERROR( "Could not open file " << m_outputFileName );
56  return StatusCode::FAILURE;
57  }
58  // Print version infomration
59  m_fileout << "# ATLAS tag: " << m_geoModelSvc->atlasVersion() << std::endl;
60  m_fileout << "# InDet tag: " << m_geoModelSvc->inDetVersionOverride() << std::endl;
61  m_fileout << "# Pixel tag: " << m_geoModelSvc->pixelVersionOverride() << std::endl;
62  m_fileout << "# SCT tag: " << m_geoModelSvc->SCT_VersionOverride() << std::endl;
63  m_fileout << "# TRT tag: " << m_geoModelSvc->TRT_VersionOverride() << std::endl;
64  // ReadCondHandleKey
69  return StatusCode::SUCCESS;
70 }
71 
72 
74 PrintSiElements::printElements(const std::string & managerName){
75  const InDetDD::SiDetectorElementCollection * elements = nullptr;
76  if (managerName=="Pixel") {
78  elements = *pixelDetEleHandle;
79  if (not pixelDetEleHandle.isValid() or elements==nullptr) {
80  ATH_MSG_WARNING(m_pixelDetEleCollKey.fullKey() << " is not available.");
81  return StatusCode::RECOVERABLE;
82  }
83  } else if (managerName=="SCT") {
85  elements = *sctDetEleHandle;
86  if (not sctDetEleHandle.isValid() or elements==nullptr) {
87  ATH_MSG_WARNING(m_SCTDetEleCollKey.fullKey() << " is not available.");
88  return StatusCode::RECOVERABLE;
89  }
90  }
91  else if (managerName=="ITkPixel") {
93  elements = *pixelDetEleHandle;
94  if (not pixelDetEleHandle.isValid() or elements==nullptr) {
95  ATH_MSG_WARNING(m_ITkPixelDetEleCollKey.fullKey() << " is not available.");
96  return StatusCode::RECOVERABLE;
97  }
98  }
99  else if (managerName=="ITkStrip") {
101  elements = *stripDetEleHandle;
102  if (not stripDetEleHandle.isValid() or elements==nullptr) {
103  ATH_MSG_WARNING(m_ITkStripDetEleCollKey.fullKey() << " is not available.");
104  return StatusCode::RECOVERABLE;
105  }
106  }
107  if (elements==nullptr) {
108  ATH_MSG_FATAL("SiDetectorElementCollection elements is nullptr");
109  return StatusCode::FAILURE;
110  }
111 
112  for (const InDetDD::SiDetectorElement * element: *elements) {
113  if (element) {
114  Identifier id = element->identify();
115  int det = 0;
116  int bec = 0;
117  int layer_disk = 0;
118  int phi_module = 0;
119  int eta_module = 0;
120  int side = 0;
121 
122  // Get identifier fields.
123  if (element->isPixel()) {
124  const PixelID * pixIdHelper = dynamic_cast<const PixelID *>(element->getIdHelper());
125  if (pixIdHelper) {
126  det = 1;
127  bec = pixIdHelper->barrel_ec(id);
128  layer_disk = pixIdHelper->layer_disk(id);
129  phi_module = pixIdHelper->phi_module(id);
130  eta_module = pixIdHelper->eta_module(id);
131  side = 0;
132  }
133  } else { // SCT
134  const SCT_ID * sctIdHelper = dynamic_cast<const SCT_ID *>(element->getIdHelper());
135  if (sctIdHelper){
136  det = 2;
137  bec = sctIdHelper->barrel_ec(id);
138  layer_disk = sctIdHelper->layer_disk(id);
139  phi_module = sctIdHelper->phi_module(id);
140  eta_module = sctIdHelper->eta_module(id);
141  side = sctIdHelper->side(id);
142  }
143  }
144 
145  // skip side=1 elements if only print module transforms
146  if (m_modulesOnly && side) continue;
147  //
148  Amg::Transform3D trans;
149  Amg::Transform3D defTrans;
150  if (m_modulesOnly) {
151  trans = element->moduleTransform();
152  defTrans = element->defModuleTransform();
153  //see: https://svnweb.cern.ch/trac/atlasoff/browser/InnerDetector/InDetDetDescr/InDetReadoutGeometry/trunk/InDetReadoutGeometry/SiDetectorElement.h
154  //I dont see appropriate Eigen-returning member
155  } else {
156  trans = element->transform();
157  defTrans = element->defTransform();
158  }
159 
160  std::ostringstream idstr;
161  if (m_expandId) {
162  idstr << 2 << " " << det << " "
163  << bec << " " << layer_disk << " "
164  << phi_module << " " << eta_module << " "
165  << side << " " << id << " ";
166  } else {
167  idstr << element->getIdHelper()->show_to_string(id) << " ";
168  }
169  if (m_nominal) {
170  m_fileout << idstr.str() << printTransform(defTrans) << std::endl;
171  }
172  if (m_aligned) {
173  m_fileout << idstr.str() << printTransform(trans) << std::endl;
174  }
175  }
176  }
177  return StatusCode::SUCCESS;
178 }
179 
181  if (m_firstEvent) {
182  m_firstEvent = false;
183  for(const std::string& detManagerName : m_detManagerNames){
184  printElements(detManagerName).ignore();
185  }
186  }
187  return StatusCode::SUCCESS;
188 }
189 
190 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
192  m_fileout.close();
193  return StatusCode::SUCCESS;
194 }
195 
196 
197 std::string
199  Amg::Vector3D xyz = trans * origin;
200  std::ostringstream ostr;
201  ostr << xyz.x() << " " << xyz.y() << " " << xyz.z() << " ";
202  if (m_fullRotationMatrix) {
203  for (int i=0; i < 3; i++) {
204  for (int j=0; j < 3; j++) {
205  ostr << trans(i,j) << " ";
206  }
207  }
208  } else {
209  double alpha=0, beta=0, gamma=0;
211  ostr << alpha << " " << beta << " " << gamma;
212  }
213  //CLHEP::HepRotation rot = trans.getRotation();
214  //ostr << std::endl << rot;
215  return ostr.str();
216 }
217 
218 void
220  double& alpha, double& beta, double &gamma) const
221 {
222  double siny = trans(0,2);
223  beta = asin(siny);
224  // Check if cosy = 0. This requires special treatment.
225  // can check either element (1,2),(2,2) both equal zero
226  // or (0,1) and (0,0)
227  if ((trans(1,2) == 0) && (trans(2,2) == 0)) {
228  // alpha and gamma are degenerate. We arbitrarily choose
229  // gamma = 0.
230  gamma = 0;
231  alpha = atan2(trans(1,1),trans(2,1));
232  } else {
233  alpha = atan2(-trans(1,2),trans(2,2));
234  gamma = atan2(-trans(0,1),trans(0,0));
235  if (alpha == 0) alpha = 0; // convert -0 to 0
236  if (gamma == 0) gamma = 0; // convert -0 to 0
237  }
238 }
239 
240 
PrintSiElements::m_ITkStripDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_ITkStripDetEleCollKey
Definition: PrintSiElements.h:47
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
add-xsec-uncert-quadrature-N.alpha
alpha
Definition: add-xsec-uncert-quadrature-N.py:110
PrintSiElements::m_fileout
std::ofstream m_fileout
Definition: PrintSiElements.h:34
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
PrintSiElements::printElements
StatusCode printElements(const std::string &managerName)
Definition: PrintSiElements.cxx:74
ParticleGun_SamplingFraction.bec
int bec
Definition: ParticleGun_SamplingFraction.py:89
TRTCalib_Extractor.det
det
Definition: TRTCalib_Extractor.py:36
PixelID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: PixelID.h:619
PrintSiElements::finalize
virtual StatusCode finalize() override
Definition: PrintSiElements.cxx:191
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:210
xyz
#define xyz
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
PrintSiElements::m_outputFileName
std::string m_outputFileName
Definition: PrintSiElements.h:42
PrintSiElements::m_nominal
bool m_nominal
Definition: PrintSiElements.h:39
ReadCondHandle.h
TRT::Hit::side
@ side
Definition: HitInfo.h:83
PrintSiElements::extractAlphaBetaGamma
void extractAlphaBetaGamma(const Amg::Transform3D &trans, double &alpha, double &beta, double &gamma) const
Definition: PrintSiElements.cxx:219
PrintSiElements::PrintSiElements
PrintSiElements(const std::string &name, ISvcLocator *pSvcLocator)
Definition: PrintSiElements.cxx:32
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TrigVtx::gamma
@ gamma
Definition: TrigParticleTable.h:26
PrintSiElements::m_pixelDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
Definition: PrintSiElements.h:44
lumiFormat.i
int i
Definition: lumiFormat.py:85
PrintSiElements::m_ITkPixelDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_ITkPixelDetEleCollKey
Definition: PrintSiElements.h:46
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
PrintSiElements::m_aligned
bool m_aligned
Definition: PrintSiElements.h:40
PrintSiElements.h
AthAlgorithm
Definition: AthAlgorithm.h:47
PrintSiElements::m_modulesOnly
bool m_modulesOnly
Definition: PrintSiElements.h:37
CLHEPtoEigenConverter.h
PixelID::layer_disk
int layer_disk(const Identifier &id) const
Definition: PixelID.h:626
PixelID::eta_module
int eta_module(const Identifier &id) const
Definition: PixelID.h:651
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
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)
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
SiDetectorElement.h
PrintSiElements::m_firstEvent
bool m_firstEvent
Definition: PrintSiElements.h:35
PrintSiElements::printTransform
std::string printTransform(const Amg::Transform3D &trans) const
Definition: PrintSiElements.cxx:198
SCT_ID
Definition: SCT_ID.h:68
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
PrintSiElements::m_detManagerNames
std::vector< std::string > m_detManagerNames
Definition: PrintSiElements.h:48
SCT_ID::eta_module
int eta_module(const Identifier &id) const
Definition: SCT_ID.h:746
PrintSiElements::m_geoModelSvc
ServiceHandle< IGeoModelSvc > m_geoModelSvc
Definition: PrintSiElements.h:43
SCT_ID::side
int side(const Identifier &id) const
Definition: SCT_ID.h:752
PrintSiElements::m_fullRotationMatrix
bool m_fullRotationMatrix
Definition: PrintSiElements.h:41
PrintSiElements::m_SCTDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
Definition: PrintSiElements.h:45
MuonParameters::beta
@ beta
Definition: MuonParamDefs.h:144
PixelID::phi_module
int phi_module(const Identifier &id) const
Definition: PixelID.h:644
IGeoModelSvc.h
PixelID
Definition: PixelID.h:67
PrintSiElements::m_expandId
bool m_expandId
Definition: PrintSiElements.h:38
PrintSiElements::initialize
virtual StatusCode initialize() override
Definition: PrintSiElements.cxx:49
PrintSiElements::execute
virtual StatusCode execute() override
Definition: PrintSiElements.cxx:180
Identifier
Definition: IdentifierFieldParser.cxx:14