ATLAS Offline Software
PrintSiElements.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 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_geoModelSvc("GeoModelSvc",name),
36  m_detManagerNames{"Pixel","SCT"}
37 {
38  // Get parameter values from jobOptions file
39  declareProperty("ModulesOnly", m_modulesOnly = true, "Print transforms of modules");
40  declareProperty("ExpandId", m_expandId = true, "Print fields of identifier");
41  declareProperty("NominalPosition", m_nominal = true, "Print out nominal geometry");
42  declareProperty("AlignedPosition", m_aligned = false, "Print out aligned geometry");
43  declareProperty("FullRotationMatrix", m_fullRotationMatrix = false, "If true prints the 9 elements of the rotation matrix");
44  declareProperty("OutputFile", m_outputFileName = "geometry.dat", "Output file name");
45  declareProperty("GeoModelSvc", m_geoModelSvc);
46  declareProperty("DetectorManagerNames", m_detManagerNames);
47 }
48 
49 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
50 
52  // Get GeoModelSvc
53  const IGeoModelSvc * geoModel;
54  ATH_CHECK(service("GeoModelSvc",geoModel));
55  m_fileout.open(m_outputFileName.c_str());
56  ATH_MSG_DEBUG( "Opening output file " << m_outputFileName );
57  if (!m_fileout) {
58  ATH_MSG_ERROR( "Could not open file " << m_outputFileName );
59  return StatusCode::FAILURE;
60  }
61  // Print version infomration
62  m_fileout << "# ATLAS tag: " << geoModel->atlasVersion() << std::endl;
63  m_fileout << "# InDet tag: " << geoModel->inDetVersionOverride() << std::endl;
64  m_fileout << "# Pixel tag: " << geoModel->pixelVersionOverride() << std::endl;
65  m_fileout << "# SCT tag: " << geoModel->SCT_VersionOverride() << std::endl;
66  m_fileout << "# TRT tag: " << geoModel->TRT_VersionOverride() << std::endl;
67  // ReadCondHandleKey
72  return StatusCode::SUCCESS;
73 }
74 
75 
77 PrintSiElements::printElements(const std::string & managerName){
78  const InDetDD::SiDetectorElementCollection * elements = nullptr;
79  if (managerName=="Pixel") {
81  elements = *pixelDetEleHandle;
82  if (not pixelDetEleHandle.isValid() or elements==nullptr) {
83  ATH_MSG_WARNING(m_pixelDetEleCollKey.fullKey() << " is not available.");
84  return StatusCode::RECOVERABLE;
85  }
86  } else if (managerName=="SCT") {
88  elements = *sctDetEleHandle;
89  if (not sctDetEleHandle.isValid() or elements==nullptr) {
90  ATH_MSG_WARNING(m_SCTDetEleCollKey.fullKey() << " is not available.");
91  return StatusCode::RECOVERABLE;
92  }
93  }
94  else if (managerName=="ITkPixel") {
96  elements = *pixelDetEleHandle;
97  if (not pixelDetEleHandle.isValid() or elements==nullptr) {
98  ATH_MSG_WARNING(m_ITkPixelDetEleCollKey.fullKey() << " is not available.");
99  return StatusCode::RECOVERABLE;
100  }
101  }
102  else if (managerName=="ITkStrip") {
104  elements = *stripDetEleHandle;
105  if (not stripDetEleHandle.isValid() or elements==nullptr) {
106  ATH_MSG_WARNING(m_ITkStripDetEleCollKey.fullKey() << " is not available.");
107  return StatusCode::RECOVERABLE;
108  }
109  }
110  if (elements==nullptr) {
111  ATH_MSG_FATAL("SiDetectorElementCollection elements is nullptr");
112  return StatusCode::FAILURE;
113  }
114 
115  for (const InDetDD::SiDetectorElement * element: *elements) {
116  if (element) {
117  Identifier id = element->identify();
118  int det = 0;
119  int bec = 0;
120  int layer_disk = 0;
121  int phi_module = 0;
122  int eta_module = 0;
123  int side = 0;
124 
125  // Get identifier fields.
126  if (element->isPixel()) {
127  const PixelID * pixIdHelper = dynamic_cast<const PixelID *>(element->getIdHelper());
128  if (pixIdHelper) {
129  det = 1;
130  bec = pixIdHelper->barrel_ec(id);
131  layer_disk = pixIdHelper->layer_disk(id);
132  phi_module = pixIdHelper->phi_module(id);
133  eta_module = pixIdHelper->eta_module(id);
134  side = 0;
135  }
136  } else { // SCT
137  const SCT_ID * sctIdHelper = dynamic_cast<const SCT_ID *>(element->getIdHelper());
138  if (sctIdHelper){
139  det = 2;
140  bec = sctIdHelper->barrel_ec(id);
141  layer_disk = sctIdHelper->layer_disk(id);
142  phi_module = sctIdHelper->phi_module(id);
143  eta_module = sctIdHelper->eta_module(id);
144  side = sctIdHelper->side(id);
145  }
146  }
147 
148  // skip side=1 elements if only print module transforms
149  if (m_modulesOnly && side) continue;
150  //
151  Amg::Transform3D trans;
152  Amg::Transform3D defTrans;
153  if (m_modulesOnly) {
154  trans = element->moduleTransform();
155  defTrans = element->defModuleTransform();
156  //see: https://svnweb.cern.ch/trac/atlasoff/browser/InnerDetector/InDetDetDescr/InDetReadoutGeometry/trunk/InDetReadoutGeometry/SiDetectorElement.h
157  //I dont see appropriate Eigen-returning member
158  } else {
159  trans = element->transform();
160  defTrans = element->defTransform();
161  }
162 
163  std::ostringstream idstr;
164  if (m_expandId) {
165  idstr << 2 << " " << det << " "
166  << bec << " " << layer_disk << " "
167  << phi_module << " " << eta_module << " "
168  << side << " " << id << " ";
169  } else {
170  idstr << element->getIdHelper()->show_to_string(id) << " ";
171  }
172  if (m_nominal) {
173  m_fileout << idstr.str() << printTransform(defTrans) << std::endl;
174  }
175  if (m_aligned) {
176  m_fileout << idstr.str() << printTransform(trans) << std::endl;
177  }
178  }
179  }
180  return StatusCode::SUCCESS;
181 }
182 
184  if (m_firstEvent) {
185  m_firstEvent = false;
186  for(const std::string& detManagerName : m_detManagerNames){
187  printElements(detManagerName).ignore();
188  }
189  }
190  return StatusCode::SUCCESS;
191 }
192 
193 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
195  m_fileout.close();
196  return StatusCode::SUCCESS;
197 }
198 
199 
200 std::string
202  Amg::Vector3D xyz = trans * origin;
203  std::ostringstream ostr;
204  ostr << xyz.x() << " " << xyz.y() << " " << xyz.z() << " ";
205  if (m_fullRotationMatrix) {
206  for (int i=0; i < 3; i++) {
207  for (int j=0; j < 3; j++) {
208  ostr << trans(i,j) << " ";
209  }
210  }
211  } else {
212  double alpha=0, beta=0, gamma=0;
213  extractAlphaBetaGamma(trans, alpha, beta, gamma);
214  ostr << alpha << " " << beta << " " << gamma;
215  }
216  //CLHEP::HepRotation rot = trans.getRotation();
217  //ostr << std::endl << rot;
218  return ostr.str();
219 }
220 
221 void
223  double& alpha, double& beta, double &gamma) const
224 {
225  double siny = trans(0,2);
226  beta = asin(siny);
227  // Check if cosy = 0. This requires special treatment.
228  // can check either element (1,2),(2,2) both equal zero
229  // or (0,1) and (0,0)
230  if ((trans(1,2) == 0) && (trans(2,2) == 0)) {
231  // alpha and gamma are degenerate. We arbitrarily choose
232  // gamma = 0.
233  gamma = 0;
234  alpha = atan2(trans(1,1),trans(2,1));
235  } else {
236  alpha = atan2(-trans(1,2),trans(2,2));
237  gamma = atan2(-trans(0,1),trans(0,0));
238  if (alpha == 0) alpha = 0; // convert -0 to 0
239  if (gamma == 0) gamma = 0; // convert -0 to 0
240  }
241 }
242 
243 
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...
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
IGeoModelSvc
Definition: IGeoModelSvc.h:17
PrintSiElements::printElements
StatusCode printElements(const std::string &managerName)
Definition: PrintSiElements.cxx:77
ParticleGun_SamplingFraction.bec
int bec
Definition: ParticleGun_SamplingFraction.py:89
PixelID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: PixelID.h:619
IGeoModelSvc::pixelVersionOverride
virtual const std::string & pixelVersionOverride() const =0
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:205
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
PrintSiElements::initialize
StatusCode initialize()
Definition: PrintSiElements.cxx:51
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:222
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:92
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
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
WritePulseShapeToCool.det
det
Definition: WritePulseShapeToCool.py:204
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
IGeoModelSvc::inDetVersionOverride
virtual const std::string & inDetVersionOverride() const =0
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
PrintSiElements::finalize
StatusCode finalize()
Definition: PrintSiElements.cxx:194
PixelID::eta_module
int eta_module(const Identifier &id) const
Definition: PixelID.h:651
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
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
IGeoModelSvc::SCT_VersionOverride
virtual const std::string & SCT_VersionOverride() const =0
SiDetectorElement.h
PrintSiElements::m_firstEvent
bool m_firstEvent
Definition: PrintSiElements.h:35
PrintSiElements::execute
StatusCode execute()
Definition: PrintSiElements.cxx:183
IGeoModelSvc::TRT_VersionOverride
virtual const std::string & TRT_VersionOverride() const =0
PrintSiElements::printTransform
std::string printTransform(const Amg::Transform3D &trans) const
Definition: PrintSiElements.cxx:201
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
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
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::atlasVersion
virtual const std::string & atlasVersion() const =0
IGeoModelSvc.h
PixelID
Definition: PixelID.h:67
PrintSiElements::m_expandId
bool m_expandId
Definition: PrintSiElements.h:38