ATLAS Offline Software
Loading...
Searching...
No Matches
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
14#include "Identifier/Identifier.h"
17
18#include <iostream>
19#include <vector>
20#include <string>
21#include <sstream>
22namespace{
23 const Amg::Vector3D origin(0.,0., 0.);
24}
25
27//
28// Prints out SiDetectorElement transform
29
31
32PrintSiElements::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
65 ATH_CHECK(m_pixelDetEleCollKey.initialize(std::find(m_detManagerNames.begin(), m_detManagerNames.end(), "Pixel") != m_detManagerNames.end()));
66 ATH_CHECK(m_SCTDetEleCollKey.initialize(std::find(m_detManagerNames.begin(), m_detManagerNames.end(), "SCT") != m_detManagerNames.end()));
67 ATH_CHECK(m_ITkPixelDetEleCollKey.initialize(std::find(m_detManagerNames.begin(), m_detManagerNames.end(), "ITkPixel") != m_detManagerNames.end()));
68 ATH_CHECK(m_ITkStripDetEleCollKey.initialize(std::find(m_detManagerNames.begin(), m_detManagerNames.end(), "ITkStrip") != m_detManagerNames.end()));
69 return StatusCode::SUCCESS;
70}
71
72
73StatusCode
74PrintSiElements::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
197std::string
199 Amg::Vector3D xyz = trans * origin;
200 std::ostringstream ostr;
201 ostr << xyz.x() << " " << xyz.y() << " " << xyz.z() << " ";
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;
210 extractAlphaBetaGamma(trans, alpha, beta, gamma);
211 ostr << alpha << " " << beta << " " << gamma;
212 }
213 //CLHEP::HepRotation rot = trans.getRotation();
214 //ostr << std::endl << rot;
215 return ostr.str();
216}
217
218void
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
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
#define xyz
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Class to hold the SiDetectorElement objects to be put in the detector store.
Class to hold geometrical description of a silicon detector element.
This is an Identifier helper class for the Pixel subdetector.
Definition PixelID.h:67
int layer_disk(const Identifier &id) const
Definition PixelID.h:607
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition PixelID.h:600
int eta_module(const Identifier &id) const
Definition PixelID.h:632
int phi_module(const Identifier &id) const
Definition PixelID.h:625
std::ofstream m_fileout
std::string m_outputFileName
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
std::vector< std::string > m_detManagerNames
virtual StatusCode initialize() override
virtual StatusCode execute() override
std::string printTransform(const Amg::Transform3D &trans) const
void extractAlphaBetaGamma(const Amg::Transform3D &trans, double &alpha, double &beta, double &gamma) const
virtual StatusCode finalize() override
StatusCode printElements(const std::string &managerName)
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_ITkPixelDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_ITkStripDetEleCollKey
ServiceHandle< IGeoModelSvc > m_geoModelSvc
PrintSiElements(const std::string &name, ISvcLocator *pSvcLocator)
This is an Identifier helper class for the SCT subdetector.
Definition SCT_ID.h:68
int layer_disk(const Identifier &id) const
Definition SCT_ID.h:687
int side(const Identifier &id) const
Definition SCT_ID.h:705
int phi_module(const Identifier &id) const
Definition SCT_ID.h:693
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition SCT_ID.h:681
int eta_module(const Identifier &id) const
Definition SCT_ID.h:699
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D