ATLAS Offline Software
Loading...
Searching...
No Matches
GeometryWriter.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#include "GaudiKernel/Bootstrap.h"
9#include "GaudiKernel/IToolSvc.h"
10#include "GaudiKernel/ISvcLocator.h"
11#include "GaudiKernel/MsgStream.h"
12
13#include "CaloDetDescr/CaloDetDescrElement.h"
17
19#include "GeoModelKernel/GeoTrd.h"
20
29
30
31#include <fstream>
32
33namespace JiveXML {
34
36 {
37 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "writeGeometry()" << endmsg;
38
39 std::ofstream outputFile("AGeometry.xml");
40 writeHeader(outputFile);
41
42 if ( detStore()->retrieve(m_pixel_manager, "Pixel").isFailure() ){
43 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve InDetDD::PixelDetectorManager" << endmsg;
44 } else {
45 if (detStore()->retrieve(m_pixelIdHelper, "PixelID").isFailure() ){
46 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve PixelIDHelper" << endmsg;
47 } else {
48 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved PixelIDHelper" << endmsg;
49 writePixelGeometry(outputFile);
50 }
51 }
52
53 if ( detStore()->retrieve(m_silicon_manager, "SCT").isFailure() ) {
54 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve InDetDD::SCT_DetectorManager" << endmsg;
55 } else {
56 if (detStore()->retrieve(m_sctIdHelper, "SCT_ID").isFailure() ){
57 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve SCT_IDHelper" << endmsg;
58 } else {
59 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved SCT_IDHelper" << endmsg;
60 writeSCTGeometry(outputFile);
61 }
62 }
63
64 if ( detStore()->retrieve(m_trt_manager, "TRT").isFailure() ) {
65 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve InDetDD::TRT_DetectorManager" << endmsg;
66 } else {
67// No SGKey ? As in graphics/VP1/VP1Systems/VP12DGeometrySystems/StoreGateGeometryReader
68// if (detStore()->retrieve(m_trtIdHelper, "TRT_ID").isFailure() ){
69 if (detStore()->retrieve(m_trtIdHelper, "").isFailure() ){
70 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve TRT_IDHelper" << endmsg;
71 } else {
72 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved TRT_IDHelper" << endmsg;
73 writeTRTGeometry(outputFile);
74 }
75 }
76
77 writeSolenoidGeometry(outputFile);
78
79 m_calo_manager = buildCaloDetDescr(serviceLocator()
81 , nullptr
82 , nullptr);
83 {
84 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved CaloDetDescrManager" << endmsg;
85 // Hardcoded LAr zMin, zMax, rMin, rMax
86 m_larMin.reserve(m_numCaloTypes);
87 m_larMax.reserve(m_numCaloTypes);
88 m_larMin[CaloCell_ID::PreSamplerB] = 0.0;
89 m_larMax[CaloCell_ID::PreSamplerB] = 340.0;
90 m_larMin[CaloCell_ID::EMB1] = 0.0;
91 m_larMax[CaloCell_ID::EMB1] = 340.0;
92 m_larMin[CaloCell_ID::EMB2] = 0.0;
93 m_larMax[CaloCell_ID::EMB2] = 340.0;
94 m_larMin[CaloCell_ID::EMB3] = 0.0;
95 m_larMax[CaloCell_ID::EMB3] = 340.0;
96 m_larMin[CaloCell_ID::PreSamplerE] = 29.0;
97 m_larMax[CaloCell_ID::PreSamplerE] = 203.4;
98 m_larMin[CaloCell_ID::EME1] = 29.0;
99 m_larMax[CaloCell_ID::EME1] = 203.4;
100 m_larMin[CaloCell_ID::EME2] = 29.0;
101 m_larMax[CaloCell_ID::EME2] = 203.4;
102 m_larMin[CaloCell_ID::EME3] = 29.0;
103 m_larMax[CaloCell_ID::EME3] = 203.4;
104 m_larMin[CaloCell_ID::HEC0] = 37.2;
105 m_larMax[CaloCell_ID::HEC0] = 203.4;
106 m_larMin[CaloCell_ID::HEC1] = 47.5;
107 m_larMax[CaloCell_ID::HEC1] = 203.4;
108 m_larMin[CaloCell_ID::HEC2] = 47.5;
109 m_larMax[CaloCell_ID::HEC2] = 203.4;
110 m_larMin[CaloCell_ID::HEC3] = 47.5;
111 m_larMax[CaloCell_ID::HEC3] = 203.4;
112 writeLArGeometry(outputFile);
113 }
114
115 if ( detStore()->retrieve(m_tile_manager, "Tile").isFailure() ) {
116 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve TileDetDescrManager" << endmsg;
117 } else {
118 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved TileDetDescrManager" << endmsg;
119 writeTILEGeometry(outputFile);
120 }
121
122 if ( detStore()->retrieve(m_lar_manager, "LArMgr").isFailure() ) {
123 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve LArDetectorManager for MBTS" << endmsg;
124 } else {
125 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved LArDetectorManager for MBTS" << endmsg;
126 writeMBTSGeometry(outputFile);
127 }
128 writeFooter(outputFile);
129 outputFile.close();
130
131 return StatusCode::SUCCESS;
132 }
133
134 void GeometryWriter::writeHeader(std::ofstream &out)
135 {
136 out << "<?xml version=\"1.0\"?>" << std::endl
137 << "<!DOCTYPE AGeometry [" << std::endl
138 << "<!ELEMENT AGeometry (ADisc | ARectangle | ABarrelCalorimeter |" << std::endl
139 << " AEndcapCalorimeter | AGapCalorimeter | AEndcapCryostat |" << std::endl
140 << " ABarrelSiliconDetector | AEndcapSiliconDetector |" << std::endl
141 << " ABarrelTRTDetector | AEndcapTRTDetector)* >" << std::endl
142 << "<!ELEMENT ADisc EMPTY >" << std::endl
143 << "<!ATTLIST ADisc" << std::endl
144 << " p CDATA #REQUIRED" << std::endl
145 << " c CDATA #REQUIRED" << std::endl
146 << " n CDATA #REQUIRED" << std::endl
147 << " rIn CDATA #REQUIRED" << std::endl
148 << " rOut CDATA #REQUIRED" << std::endl
149 << " nIn CDATA \"256\"" << std::endl
150 << " nOut CDATA \"256\">" << std::endl
151 << "<!ELEMENT ARectangle EMPTY >" << std::endl
152 << "<!ATTLIST ARectangle" << std::endl
153 << " p CDATA #REQUIRED" << std::endl
154 << " c CDATA #REQUIRED" << std::endl
155 << " n CDATA #REQUIRED" << std::endl
156 << " xMin CDATA #REQUIRED" << std::endl
157 << " xMax CDATA #REQUIRED" << std::endl
158 << " yMin CDATA #REQUIRED" << std::endl
159 << " yMax CDATA #REQUIRED" << std::endl
160 << " xR (YES|NO) \"YES\"" << std::endl
161 << " yR (YES|NO) \"YES\">" << std::endl
162 << "<!ELEMENT ABarrelCalorimeter EMPTY >" << std::endl
163 << "<!ATTLIST ABarrelCalorimeter" << std::endl
164 << " c CDATA #REQUIRED" << std::endl
165 << " n CDATA #REQUIRED" << std::endl
166 << " sampling CDATA #REQUIRED" << std::endl
167 << " region CDATA #REQUIRED" << std::endl
168 << " rMin CDATA #REQUIRED" << std::endl
169 << " rMax CDATA #REQUIRED" << std::endl
170 << " zMin CDATA #REQUIRED" << std::endl
171 << " zMax CDATA #REQUIRED" << std::endl
172 << " eta0 CDATA #REQUIRED" << std::endl
173 << " deta CDATA #REQUIRED" << std::endl
174 << " neta CDATA #REQUIRED" << std::endl
175 << " meta CDATA #REQUIRED" << std::endl
176 << " phi0 CDATA #REQUIRED" << std::endl
177 << " nphi CDATA #REQUIRED>" << std::endl
178 << "<!ELEMENT AEndcapCalorimeter EMPTY >" << std::endl
179 << "<!ATTLIST AEndcapCalorimeter" << std::endl
180 << " c CDATA #REQUIRED" << std::endl
181 << " n CDATA #REQUIRED" << std::endl
182 << " sampling CDATA #REQUIRED" << std::endl
183 << " region CDATA #REQUIRED" << std::endl
184 << " rMin CDATA #REQUIRED" << std::endl
185 << " rMax CDATA #REQUIRED" << std::endl
186 << " zMin CDATA #REQUIRED" << std::endl
187 << " zMax CDATA #REQUIRED" << std::endl
188 << " eta0 CDATA #REQUIRED" << std::endl
189 << " deta CDATA #REQUIRED" << std::endl
190 << " neta CDATA #REQUIRED" << std::endl
191 << " meta CDATA #REQUIRED" << std::endl
192 << " phi0 CDATA #REQUIRED" << std::endl
193 << " nphi CDATA #REQUIRED>" << std::endl
194 << "<!ELEMENT AGapCalorimeter EMPTY >" << std::endl
195 << "<!ATTLIST AGapCalorimeter" << std::endl
196 << " c CDATA #REQUIRED" << std::endl
197 << " n CDATA #REQUIRED" << std::endl
198 << " sampling CDATA #REQUIRED" << std::endl
199 << " region CDATA #REQUIRED" << std::endl
200 << " rMin CDATA #REQUIRED" << std::endl
201 << " rMax CDATA #REQUIRED" << std::endl
202 << " zMin CDATA #REQUIRED" << std::endl
203 << " zMax CDATA #REQUIRED" << std::endl
204 << " eta CDATA #REQUIRED" << std::endl
205 << " phi0 CDATA #REQUIRED" << std::endl
206 << " nphi CDATA #REQUIRED>" << std::endl
207 << "<!ELEMENT AEndcapCryostat EMPTY >" << std::endl
208 << "<!ATTLIST AEndcapCryostat" << std::endl
209 << " c CDATA #REQUIRED" << std::endl
210 << " n CDATA #REQUIRED" << std::endl
211 << " sampling CDATA #REQUIRED" << std::endl
212 << " region CDATA #REQUIRED" << std::endl
213 << " rMin CDATA #REQUIRED" << std::endl
214 << " rMax CDATA #REQUIRED" << std::endl
215 << " zMin CDATA #REQUIRED" << std::endl
216 << " zMax CDATA #REQUIRED" << std::endl
217 << " neta CDATA #REQUIRED" << std::endl
218 << " nphi CDATA #REQUIRED>" << std::endl
219 << "<!ELEMENT ABarrelSiliconDetector EMPTY >" << std::endl
220 << "<!ATTLIST ABarrelSiliconDetector" << std::endl
221 << " c CDATA #REQUIRED" << std::endl
222 << " n CDATA #REQUIRED" << std::endl
223 << " layer CDATA #REQUIRED" << std::endl
224 << " length CDATA #REQUIRED" << std::endl
225 << " width CDATA #REQUIRED" << std::endl
226 << " thickness CDATA #REQUIRED" << std::endl
227 << " tilt CDATA #REQUIRED" << std::endl
228 << " nz CDATA #REQUIRED" << std::endl
229 << " nphi CDATA #REQUIRED" << std::endl
230 << " r0 CDATA #REQUIRED" << std::endl
231 << " phi0 CDATA #REQUIRED" << std::endl
232 << " zMin CDATA #REQUIRED" << std::endl
233 << " zMax CDATA #REQUIRED>" << std::endl
234 << "<!ELEMENT AEndcapSiliconDetector EMPTY >" << std::endl
235 << "<!ATTLIST AEndcapSiliconDetector" << std::endl
236 << " c CDATA #REQUIRED" << std::endl
237 << " n CDATA #REQUIRED" << std::endl
238 << " layer CDATA #REQUIRED" << std::endl
239 << " length CDATA #REQUIRED" << std::endl
240 << " width CDATA #REQUIRED" << std::endl
241 << " thickness CDATA #REQUIRED" << std::endl
242 << " nz CDATA #REQUIRED" << std::endl
243 << " nphi CDATA #REQUIRED" << std::endl
244 << " rMin CDATA #REQUIRED" << std::endl
245 << " rMax CDATA #REQUIRED" << std::endl
246 << " phi0 CDATA #REQUIRED" << std::endl
247 << " zMin CDATA #REQUIRED" << std::endl
248 << " zMax CDATA #REQUIRED>" << std::endl
249 << "<!ELEMENT ABarrelTRTDetector EMPTY >" << std::endl
250 << "<!ATTLIST ABarrelTRTDetector" << std::endl
251 << " c CDATA #REQUIRED" << std::endl
252 << " n CDATA #REQUIRED" << std::endl
253 << " layer CDATA #REQUIRED" << std::endl
254 << " nphi CDATA #REQUIRED" << std::endl
255 << " rMin CDATA #REQUIRED" << std::endl
256 << " rMax CDATA #REQUIRED" << std::endl
257 << " phiIn CDATA #REQUIRED" << std::endl
258 << " phiOut CDATA #REQUIRED" << std::endl
259 << " zMin CDATA #REQUIRED" << std::endl
260 << " zMax CDATA #REQUIRED>" << std::endl
261 << "<!ELEMENT AEndcapTRTDetector EMPTY >" << std::endl
262 << "<!ATTLIST AEndcapTRTDetector" << std::endl
263 << " c CDATA #REQUIRED" << std::endl
264 << " n CDATA #REQUIRED" << std::endl
265 << " layer CDATA #REQUIRED" << std::endl
266 << " nphi CDATA #REQUIRED" << std::endl
267 << " rMin CDATA #REQUIRED" << std::endl
268 << " rMax CDATA #REQUIRED" << std::endl
269 << " phi0 CDATA #REQUIRED" << std::endl
270 << " zMin CDATA #REQUIRED" << std::endl
271 << " zMax CDATA #REQUIRED>" << std::endl
272 << "]>" << std::endl
273 << "<AGeometry>" << std::endl;
274 }
275
276 void GeometryWriter::writePixelGeometry(std::ofstream &out) {
277
279
280 for (it=m_pixel_manager->getDetectorElementBegin(); it<m_pixel_manager->getDetectorElementEnd(); ++it) {
281
282 const InDetDD::SiDetectorElement *element = *it;
283
284 // Just an extra precaution to avoid crashes.
285 if (!element) continue;
286
287 if (element->isBarrel() && m_pixelIdHelper->phi_module(element->identify()) == 0
288 && m_pixelIdHelper->eta_module(element->identify()) == m_pixelIdHelper->eta_module_min(element->identify())) {
289
290 double rMin = element->rMin();
291 double rMax = element->rMax();
292 double zMax = element->zMax();
293 const InDetDD::SiDetectorElement *next = element->nextInEta();
294 while (next) {
295 if (next->rMin() < rMin) rMin = next->rMin();
296 if (next->rMax() > rMax) rMax = next->rMax();
297 if (next->zMax() > zMax) zMax = next->zMax();
298 next = next->nextInEta();
299 }
300 zMax += 5;
301
302 out << "<ABarrelSiliconDetector c=\"" << "PIX" << "\" n=\"" << "Pixel" << "\""
303 << " layer=\"" << m_pixelIdHelper->layer_disk(element->identify()) << "\""
304 << " length=\"" << element->length()/10. << "\""
305 << " width=\"" << element->width()/10. << "\""
306 << " thickness=\"" << (rMax - rMin - element->sinTilt()*element->width())/40. << "\""
307 << " tilt=\"" << 180./M_PI * asin(element->sinTilt()) << "\""
308 << " nz=\"" << m_pixelIdHelper->eta_module_max(element->identify())
309 - m_pixelIdHelper->eta_module_min(element->identify())+1 << "\""
310 << " nphi=\"" << m_pixelIdHelper->phi_module_max(element->identify())+1 << "\""
311 << " r0=\"" << (rMin+rMax)/20. << "\""
312 << " phi0=\"" << 180./M_PI * (element->phiMin()+element->phiMax())/2. << "\""
313 << " zMin=\"" << -zMax/10. << "\""
314 << " zMax=\"" << zMax/10. << "\""
315 << " />" << std::endl;
316 //if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Pixel barrel out: " << out << endmsg;
317 }
318
319 if (element->isEndcap() && element->zMin() > 0 && m_pixelIdHelper->phi_module(element->identify()) == 0
320 && m_pixelIdHelper->eta_module(element->identify()) == m_pixelIdHelper->eta_module_min(element->identify())) {
321
322 double rMin = element->rMin();
323 double rMax = element->rMax();
324 double zMin = element->zMin();
325 double zMax = element->zMax();
326 const InDetDD::SiDetectorElement *next = element->nextInEta();
327 while (next) {
328 if (next->zMin() < 0) continue;
329 if (next->rMin() < rMin) rMin = next->rMin();
330 if (next->rMax() > rMax) rMax = next->rMax();
331 if (next->zMin() < zMin) zMin = next->zMin();
332 if (next->zMax() > zMax) zMax = next->zMax();
333 next = next->nextInEta();
334 }
335 zMin -= 5;
336 zMax += 5;
337
338 out << "<AEndcapSiliconDetector c=\"" << "PIX" << "\" n=\"" << "Pixel" << "\""
339 << " layer=\"" << m_pixelIdHelper->layer_disk(element->identify()) << "\""
340 << " length=\"" << element->length()/10. << "\""
341 << " width=\"" << element->width()/10. << "\""
342 << " thickness=\"" << (rMax - rMin - element->sinTilt()*element->width())/40. << "\""
343 << " nz=\"" << m_pixelIdHelper->eta_module_max(element->identify())
344 - m_pixelIdHelper->eta_module_min(element->identify())+1 << "\""
345 << " nphi=\"" << m_pixelIdHelper->phi_module_max(element->identify())+1 << "\""
346 << " rMin=\"" << rMin/10. << "\""
347 << " rMax=\"" << rMax/10. << "\""
348 << " phi0=\"" << 180./M_PI * (element->phiMin()+element->phiMax())/2. << "\""
349 << " zMin=\"" << zMin/10. << "\""
350 << " zMax=\"" << zMax/10. << "\""
351 << " />" << std::endl;
352 //if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Pixel endcap out: " << out << endmsg;
353 }
354 }
355 }
356
357 void GeometryWriter::writeSCTGeometry(std::ofstream &out) {
358
360
361 for (it=m_silicon_manager->getDetectorElementBegin(); it<m_silicon_manager->getDetectorElementEnd(); ++it) {
362
363 const InDetDD::SiDetectorElement *element = *it;
364
365 // Just an extra precaution to avoid crashes.
366 if (!element) continue;
367
368 if (element->isBarrel() && element->zMax() > 0 && m_sctIdHelper->phi_module(element->identify()) == 0
369 && m_sctIdHelper->eta_module(element->identify()) == m_sctIdHelper->eta_module_min(element->identify())
370 && m_sctIdHelper->side(element->identify()) > 0) {
371
372 double rMin = element->rMin();
373 double rMax = element->rMax();
374 double zMax = element->zMax();
375 const InDetDD::SiDetectorElement *next = element->nextInEta();
376 while (next) {
377 if (next->rMin() < rMin) rMin = next->rMin();
378 if (next->rMax() > rMax) rMax = next->rMax();
379 if (next->zMax() > zMax) zMax = next->zMax();
380 next = next->nextInEta();
381 }
382 next = element->otherSide();
383 while (next) {
384 if (next->rMin() < rMin) rMin = next->rMin();
385 if (next->rMax() > rMax) rMax = next->rMax();
386 if (next->zMax() > zMax) zMax = next->zMax();
387 next = next->nextInEta();
388 }
389 zMax += 5;
390
391 out << "<ABarrelSiliconDetector c=\"" << "SIL" << "\" n=\"" << "Silicon" << "\""
392 << " layer=\"" << m_sctIdHelper->layer_disk(element->identify()) << "\""
393 << " length=\"" << element->length()/10. << "\""
394 << " width=\"" << element->width()/10. << "\""
395 << " thickness=\"" << 2. * (rMax - rMin - element->sinTilt()*element->width())/10. << "\""
396 << " tilt=\"" << 180./M_PI * asin(element->sinTilt()) << "\""
397 << " nz=\"" << m_sctIdHelper->eta_module_max(element->identify())
398 - m_sctIdHelper->eta_module_min(element->identify())+1 << "\""
399 << " nphi=\"" << m_sctIdHelper->phi_module_max(element->identify())+1 << "\""
400 << " r0=\"" << (rMin+rMax)/20. << "\""
401 << " phi0=\"" << 180./M_PI * (element->phiMin()+element->phiMax())/2. << "\""
402 << " zMin=\"" << -zMax/10. << "\""
403 << " zMax=\"" << zMax/10. << "\""
404 << " />" << std::endl;
405 //if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "SCT barrel out: " << out << endmsg;
406 }
407
408 if (element->isEndcap() && element->zMin() > 0 && m_sctIdHelper->phi_module(element->identify()) == 0
409 && m_sctIdHelper->eta_module(element->identify()) == m_sctIdHelper->eta_module_min(element->identify())
410 && m_sctIdHelper->side(element->identify()) > 0) {
411
412 double rMin = element->rMin();
413 double rMax = element->rMax();
414 double zMin = element->zMin();
415 double zMax = element->zMax();
416 const InDetDD::SiDetectorElement *next = element->nextInEta();
417 while (next) {
418 if (next->zMin() < 0) continue;
419 if (next->rMin() < rMin) rMin = next->rMin();
420 if (next->rMax() > rMax) rMax = next->rMax();
421 if (next->zMin() < zMin) zMin = next->zMin();
422 if (next->zMax() > zMax) zMax = next->zMax();
423 next = next->nextInEta();
424 }
425 next = element->otherSide();
426 while (next) {
427 if (next->zMin() < 0) continue;
428 if (next->rMin() < rMin) rMin = next->rMin();
429 if (next->rMax() > rMax) rMax = next->rMax();
430 if (next->zMin() < zMin) zMin = next->zMin();
431 if (next->zMax() > zMax) zMax = next->zMax();
432 next = next->nextInEta();
433 }
434 zMin -= 5;
435 zMax += 5;
436
437 out << "<AEndcapSiliconDetector c=\"" << "SIL" << "\" n=\"" << "Silicon" << "\""
438 << " layer=\"" << m_sctIdHelper->layer_disk(element->identify()) << "\""
439 << " length=\"" << element->length()/10. << "\""
440 << " width=\"" << element->width()/10. << "\""
441 << " thickness=\"" << 2. * (rMax - rMin - element->sinTilt()*element->width())/10. << "\""
442 << " nz=\"" << m_sctIdHelper->eta_module_max(element->identify())
443 - m_sctIdHelper->eta_module_min(element->identify())+1 << "\""
444 << " nphi=\"" << m_sctIdHelper->phi_module_max(element->identify())+1 << "\""
445 << " rMin=\"" << rMin/10. << "\""
446 << " rMax=\"" << rMax/10. << "\""
447 << " phi0=\"" << 180./M_PI * (element->phiMin()+element->phiMax())/2. << "\""
448 << " zMin=\"" << zMin/10. << "\""
449 << " zMax=\"" << zMax/10. << "\""
450 << " />" << std::endl;
451 //if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "SCT endcap out: " << out << endmsg;
452 }
453 }
454 }
455
456 void GeometryWriter::writeTRTGeometry(std::ofstream &out) {
457
459
460 for (it=m_trt_manager->getDetectorElementBegin(); it<m_trt_manager->getDetectorElementEnd(); ++it) {
461
462 const InDetDD::TRT_BaseElement *elementIn = *it;
463 // Just an extra precaution to avoid crashes.
464 if (!elementIn) continue;
465 Identifier id = elementIn->identify();
466
467 if (m_trtIdHelper->phi_module(id) != 0) continue;
468 if (m_trtIdHelper->straw_layer(id) != 0) continue;
469 Amg::Vector3D posIn = elementIn->strawTransform(0) * Amg::Vector3D(0., 0., 0.);
470 if (posIn.z() < 0) continue;
471
472 const InDetDD::TRT_BaseElement *elementOut;
473
474 if (m_trtIdHelper->is_barrel(id)) {
475 elementOut = m_trt_manager->getBarrelElement(m_trtIdHelper->barrel_ec(id),
476 m_trtIdHelper->layer_or_wheel(id),
477 0,
478 m_trtIdHelper->straw_layer_max(id));
479
480 // Just an extra precaution to avoid crashes.
481 if (!elementOut) continue;
482
483 Amg::Vector3D posOut = elementOut->strawTransform(0) * Amg::Vector3D(0.,0.,0.);
484 // HepGeom::Point3D<double> posOut = elementOut->strawTransform(0) * HepGeom::Point3D<double>(0., 0., 0.);
485
486 const InDetDD::TRT_BarrelElement *element = dynamic_cast<const InDetDD::TRT_BarrelElement *>(elementIn);
487 if (!element) continue;
488 int nphi = (int) round(2.*M_PI / fabs(element->nextInPhi()->center().phi() - element->center().phi()));
489 double dphiIn = 2.*M_PI / (nphi * m_trtIdHelper->straw_max(elementIn->identify()));
490 double dphiOut = 2.*M_PI / (nphi * m_trtIdHelper->straw_max(elementOut->identify()));
491
492 out << "<ABarrelTRTDetector c=\"TRT\" n=\"TRT\""
493 << " layer=\"" << m_trtIdHelper->layer_or_wheel(id) << "\""
494 << " nphi=\"" << nphi << "\""
495 << " rMin=\"" << posIn.perp()/10. - .4 << "\""
496 << " rMax=\"" << posOut.perp()/10. + .4 << "\""
497 << " phiIn=\"" << 180./M_PI * (posIn.phi() - dphiIn - 2e-3) << "\""
498 << " phiOut=\"" << 180./M_PI * (posOut.phi() - dphiOut - 2e-3) << "\""
499 << " zMin=\"" << -(posIn.z() + elementIn->strawLength()/2.)/10. << "\""
500 << " zMax=\"" << (posIn.z() + elementIn->strawLength()/2.)/10. << "\""
501 << " />" << std::endl;
502 //if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "TRT barrel out: " << out << endmsg;
503 } else {
504 elementOut = m_trt_manager->getEndcapElement(1,//m_trtIdHelper->barrel_ec(id),
505 m_trtIdHelper->layer_or_wheel(id),
506 m_trtIdHelper->straw_layer_max(id),
507 0);
508
509 // Just an extra precaution to avoid crashes.
510 if (!elementOut) continue;
511
512 //HepGeom::Point3D<double> posOut = elementOut->strawTransform(m_trtIdHelper->straw_max(id)) * HepGeom::Point3D<double>(0., 0., 0.);
513 Amg::Vector3D posOut = elementOut->strawTransform(m_trtIdHelper->straw_max(id)) * Amg::Vector3D(0.,0.,0.);
514
515 // floor() instead of round() becuase we are neglecting the space between two modules
516 int nphi = (int) floor(2.*M_PI / fabs(posOut.phi() - posIn.phi()));
517
518 out << "<AEndcapTRTDetector c=\"TRT\" n=\"TRT\""
519 << " layer=\"" << m_trtIdHelper->layer_or_wheel(id) << "\""
520 << " nphi=\"" << nphi << "\""
521 << " rMin=\"" << (posIn.perp()-elementIn->strawLength()/2.)/10. << "\""
522 << " rMax=\"" << (posIn.perp()+elementIn->strawLength()/2.)/10. << "\""
523 << " phi0=\"" << 180./M_PI * posIn.phi() << "\""
524 << " zMin=\"" << posIn.z()/10. << "\""
525 << " zMax=\"" << posOut.z()/10. << "\""
526 << " />" << std::endl;
527 //if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "TRT endcap out: " << out << endmsg;
528 }
529
530 }
531 }
532
533 void GeometryWriter::writeSolenoidGeometry(std::ofstream &out) {
534
535 double zIn = -265.0;
536 double zOut = 265.0;
537 double rIn = 122.9;
538 double rOut = 127.4;
539
540 out << "<ADisc p=\"YX\" c=\"Sol\" n=\"Solenoid\""
541 << " rIn=\"" << rIn << "\""
542 << " rOut=\"" << rOut << "\" />"
543 << std::endl;
544
545 out << "<ARectangle p=\"RZ\" c=\"Sol\" n=\"Solenoid\""
546 << " xMin=\"" << zIn << "\""
547 << " xMax=\"" << zOut << "\""
548 << " yMin=\"" << rIn << "\""
549 << " yMax=\"" << rOut << "\""
550 << " xR=\"NO\" />"
551 << std::endl;
552 }
553
554
555 void GeometryWriter::writeTILEGeometry(std::ofstream &out) {
556
557 const TileID *tileIdHelper = m_tile_manager->get_id();
559 for (tileIt=m_tile_manager->tile_descriptors_begin(); tileIt!=m_tile_manager->tile_descriptors_end(); ++tileIt) {
560 const TileDetDescriptor *descriptor = *tileIt;
561 if (!descriptor) continue;
562
563 int i;
564 for (i=0; i<descriptor->n_samp(); i++) {
565
566 if (descriptor->zcenter(i) <= 0) continue;
567
568 std::string name;
569 if (tileIdHelper->is_tile_barrel(descriptor->identify())) name = "TILE Barrel";
570 else if (tileIdHelper->is_tile_extbarrel(descriptor->identify())) name = "Extended TILE";
571 else if (tileIdHelper->is_tile_gap(descriptor->identify())) name = "ITC Gap";
572 else if (tileIdHelper->is_tile_gapscin(descriptor->identify())) name = "ITC Gap Scintillator";
573 else name = "TILE";
574
575 if (!name.compare(0, 3, "ITC")) {
576
577 out << "<AGapCalorimeter c=\"" << "HCAL" << "\" n=\"" << name << "\""
578 << " sampling=\"" << (i < 3 ? i : 3) << "\" region=\"" << 0 << "\""
579 << " rMin=\"" << (descriptor->rcenter(i)-descriptor->dr(i)/2.)/10. << "\""
580 << " rMax=\"" << (descriptor->rcenter(i)+descriptor->dr(i)/2.)/10. << "\""
581 << " zMin=\"" << (descriptor->zcenter(i)-descriptor->dz(i)/2.)/10. << "\""
582 << " zMax=\"" << (descriptor->zcenter(i)+descriptor->dz(i)/2.)/10. << "\""
583 << " eta=\"" << (i < 3 ? tileIdHelper->eta_min(descriptor->identify())-i+2 : i) << "\""
584 << " phi0=\"" << descriptor->phi_min() << "\""
585 << " nphi=\"" << descriptor->n_phi() << "\""
586 << " />" << std::endl;
587 } else {
588 int section = tileIdHelper->section(descriptor->identify());
589 int side = tileIdHelper->side(descriptor->identify());
590 int module = tileIdHelper->module(descriptor->identify());
591 int tower = tileIdHelper->tower(descriptor->identify());
592 Identifier id = tileIdHelper->cell_id(section, side, module, tower, i);
593
594 out << "<ABarrelCalorimeter c=\"" << "HCAL" << "\" n=\"" << name << "\""
595 << " sampling=\"" << i << "\" region=\"" << 0 << "\""
596 << " rMin=\"" << (descriptor->rcenter(i)-descriptor->dr(i)/2.)/10. << "\""
597 << " rMax=\"" << (descriptor->rcenter(i)+descriptor->dr(i)/2.)/10. << "\""
598 << " zMin=\"" << (descriptor->zcenter(i)-descriptor->dz(i)/2.)/10. << "\""
599 << " zMax=\"" << (descriptor->zcenter(i)+descriptor->dz(i)/2.)/10. << "\""
600 << " eta0=\"" << descriptor->eta_min(i) << "\""
601 << " deta=\"" << descriptor->deta(i) << "\""
602 << " neta=\"" << descriptor->n_eta(i) << "\""
603 << " meta=\"" << tileIdHelper->eta_min(id) << "\""
604 << " phi0=\"" << descriptor->phi_min() << "\""
605 << " nphi=\"" << descriptor->n_phi() << "\""
606 << " />" << std::endl;
607 }
608 }
609 }
610 }
611
612 void GeometryWriter::writeLArGeometry(std::ofstream &out) {
613
614 const CaloCell_ID *idHelper = m_calo_manager->getCaloCell_ID();
616
617 // This code is not very efficient in terms of speed. Since it will only be used
618 // when the geometry has changed, the code is made to be easily readable instead.
619 for (int type=0; type<m_numCaloTypes; type++) {
620
621 for (int region=0; region<8; region++) {
622
623 for (int inner=0; inner<2; inner++) {
624
625 int minEtaIndex = 0, maxEtaIndex = 0;
626 double minEta = 0.0;
627 const CaloDetDescrElement *oneSuchElement = 0;
628
629 for (it=m_calo_manager->element_begin(); it<m_calo_manager->element_end(); ++it) {
630
631 const CaloDetDescrElement *element = *it;
632 int etaIndex, phiIndex;
633 std::string technology;
634 std::string name;
635
636 if (!element) continue;
637
638 Identifier id = element->identify();
639
640 // Select everything but TILE.
641 if (element->is_tile()) continue;
642
643 // Select only this sampling.
644 if (element->getSampling() != type) continue;
645
646 // Select only this region.
647 if (element->is_lar_fcal()) {
648 if (idHelper->eta(id) != idHelper->eta_min(id) || idHelper->side(id) < 0) continue;
649 } else {
650 if (idHelper->region(id) != region) continue;
651 }
652
653 // Differentiate between the LAr inner/outer endcap
654 if (inner > 0 && !idHelper->is_em_endcap_inner(id)) continue;
655
656 // Skip -z, we will mirror +z.
657 if (element->z() < 0) continue;
658
659 // Select only the first element in phi.
660 etaIndex = idHelper->eta(id);
661 phiIndex = idHelper->phi(id);
662 if (phiIndex > 0) continue;
663
664 if (!oneSuchElement) {
665 oneSuchElement = element;
666 minEtaIndex = maxEtaIndex = etaIndex;
667 minEta = element->eta();
668 } else {
669 if (etaIndex < minEtaIndex) {
670 minEtaIndex = etaIndex;
671 minEta = element->eta();
672 }
673 if (etaIndex > maxEtaIndex) {
674 maxEtaIndex = etaIndex;
675 }
676 }
677 }
678
679 if (oneSuchElement) {
680
681 std::string color;
682 std::string name;
683 int sampling = 0;
684 enum {BARREL, ENDCAP, FORWARD} part = BARREL;
685
686 const CaloDetDescriptor *descriptor = oneSuchElement->descriptor();
687
688 switch(type) {
689 case CaloCell_ID::PreSamplerB:
690 color = "ECAL";
691 name = "LAr Presampler";
692 sampling = 0;
693 part = BARREL;
694 break;
695 case CaloCell_ID::EMB1:
696 case CaloCell_ID::EMB2:
697 case CaloCell_ID::EMB3:
698 color = "ECAL";
699 name = "LAr";
700 sampling = type - CaloCell_ID::PreSamplerB;
701 part = BARREL;
702 break;
703 case CaloCell_ID::PreSamplerE:
704 color = "ECAL";
705 name = "LAr_EC_Presampler";
706 part = ENDCAP;
707 break;
708 case CaloCell_ID::EME1:
709 case CaloCell_ID::EME2:
710 case CaloCell_ID::EME3:
711 color = "ECAL";
712 name = inner ? "LAr Inner Endcap" : "LAr Outer Endcap";
713 sampling = type - CaloCell_ID::PreSamplerE;
714 part = ENDCAP;
715 break;
716 case CaloCell_ID::HEC0:
717 case CaloCell_ID::HEC1:
718 case CaloCell_ID::HEC2:
719 case CaloCell_ID::HEC3:
720 color = "HCAL";
721 name = "HEC";
722 sampling = type - CaloCell_ID::HEC0;
723 part = ENDCAP;
724 break;
725 case CaloCell_ID::FCAL0:
726 color = "ECAL";
727 name = "FCAL EM";
728 part = FORWARD;
729 break;
730 case CaloCell_ID::FCAL1:
731 color = "HCAL";
732 name = "FCAL HAD 1";
733 part = FORWARD;
734 break;
735 case CaloCell_ID::FCAL2:
736 color = "HCAL";
737 name = "FCAL HAD 2";
738 part = FORWARD;
739 break;
740 }
741
742 double phi0 = 180./M_PI * (oneSuchElement->phi()-oneSuchElement->dphi()/2.);
743 int numPhi = (int) round(2.*M_PI / oneSuchElement->dphi());
744 int numEta = maxEtaIndex - minEtaIndex + 1;
745
746 switch (part) {
747 case BARREL:
748 out << "<ABarrelCalorimeter c=\"" << color << "\" n=\"" << name << "\""
749 << " sampling=\"" << sampling << "\" region=\"" << region%8 << "\""
750 << " rMin=\"" << (oneSuchElement->r()-oneSuchElement->dr()/2.)/10. << "\""
751 << " rMax=\"" << (oneSuchElement->r()+oneSuchElement->dr()/2.)/10. << "\""
752 << " zMin=\"" << m_larMin[type] << "\""
753 << " zMax=\"" << m_larMax[type] << "\""
754 << " eta0=\"" << minEta-oneSuchElement->deta()/2. << "\""
755 << " deta=\"" << oneSuchElement->deta() << "\""
756 << " neta=\"" << numEta << "\""
757 << " meta=\"" << minEtaIndex << "\""
758 << " phi0=\"" << phi0 << "\""
759 << " nphi=\"" << numPhi << "\""
760 << " />" << std::endl;
761 break;
762 case ENDCAP:
763 out << "<AEndcapCalorimeter c=\"" << color << "\" n=\"" << name << "\""
764 << " sampling=\"" << sampling << "\" region=\"" << region%8 << "\""
765 << " rMin=\"" << m_larMin[type] << "\""
766 << " rMax=\"" << m_larMax[type] << "\""
767 << " zMin=\"" << (oneSuchElement->z()-oneSuchElement->dz()/2.)/10. << "\""
768 << " zMax=\"" << (oneSuchElement->z()+oneSuchElement->dz()/2.)/10. << "\""
769 << " eta0=\"" << minEta-oneSuchElement->deta()/2. << "\""
770 << " deta=\"" << oneSuchElement->deta() << "\""
771 << " neta=\"" << numEta << "\""
772 << " meta=\"" << minEtaIndex << "\""
773 << " phi0=\"" << phi0 << "\""
774 << " nphi=\"" << numPhi << "\""
775 << " />" << std::endl;
776 break;
777 case FORWARD:
778 out << "<ADisc p=\"YX\" c=\"" << color << "\" n=\"" << name << "\""
779 << " rIn=\"" << descriptor->calo_r_min()/10. << "\""
780 << " rOut=\"" << descriptor->calo_r_max()/10. << "\""
781 << " />" << std::endl;
782 out << "<ARectangle p=\"RZ\" c=\"" << color << "\" n=\"" << name << "\""
783 << " xMin=\"" << descriptor->calo_z_min()/10. << "\""
784 << " xMax=\"" << descriptor->calo_z_max()/10. << "\""
785 << " yMin=\"" << descriptor->calo_r_min()/10. << "\""
786 << " yMax=\"" << descriptor->calo_r_max()/10. << "\""
787 << " />" << std::endl;
788 }
789 }
790 }
791 }
792 }
793 }
794
795 void GeometryWriter::writeMBTSGeometry(std::ofstream &out) {
796 // volume hierarchy tree leading from MBTS_mother to scintillators:
797 // MBTS_mother
798 // MBTSAirEnv <--- 8 copies
799 // MBTSAluEnv
800 // MBTSAirInAlu
801 // MBTS1
802 // MBTS2
803 // MBTSPlug2In <--- skip this one
804
805 PVConstLink myVol = m_lar_manager->getTreeTop(1U);
806 for (unsigned int c=0; c< myVol->getNChildVols();c++)
807 {
808 PVConstLink child = myVol->getChildVol(c);
809 if((child->getLogVol())->getName()=="MBTS_mother")
810 {
811 int sampling=0,numPhi=0;
812 std::string stringOfNames="";
813
814 GeoTrf::Vector3D translate = (child->getX()).translation(); // vector from origin to MBTS_mother
815
816 double zlocation = translate.z();
817 if(zlocation<0)
818 zlocation=-zlocation;
819
820 GeoTrf::Transform3D transformToScin; // for calculating the vector from MBTS_mother to MBTS scintilators
821
822 PVConstLink pvAirEnv = 0;
823 for (unsigned int cc=0; cc< child->getNChildVols();cc++) {
824 if(((child->getChildVol(cc))->getLogVol())->getName()=="MBTSAirEnv") {
825 pvAirEnv = child->getChildVol(cc);
826 transformToScin = child->getXToChildVol(cc);
827 numPhi++;
828 }
829 }
830 if(!pvAirEnv) {
831 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not find MBTSAirEnv" << endmsg;
832 return;
833 }
834
835 PVConstLink pvAluEnv = 0;
836 for (unsigned int ichildAirEnv=0; ichildAirEnv<pvAirEnv->getNChildVols(); ichildAirEnv++) {
837 if(((pvAirEnv->getChildVol(ichildAirEnv))->getLogVol())->getName()=="MBTSAluEnv") {
838 pvAluEnv = pvAirEnv->getChildVol(ichildAirEnv);
839 transformToScin = transformToScin * pvAirEnv->getXToChildVol(ichildAirEnv);
840 }
841 }
842 if(!pvAluEnv) {
843 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not find MBTSAluEnv" << endmsg;
844 return;
845 }
846
847 PVConstLink pvAirInAlu = 0;
848 for (unsigned int ichildAluEnv=0; ichildAluEnv<pvAluEnv->getNChildVols(); ichildAluEnv++) {
849 if(((pvAluEnv->getChildVol(ichildAluEnv))->getLogVol())->getName()=="MBTSAirInAlu") {
850 pvAirInAlu = pvAluEnv->getChildVol(ichildAluEnv);
851 transformToScin = transformToScin * pvAluEnv->getXToChildVol(ichildAluEnv);
852 }
853 }
854 if(!pvAirInAlu) {
855 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not find MBTSAirInAlu" << endmsg;
856 return;
857 }
858
859 for (unsigned int ichildAirInAlu=0; ichildAirInAlu<pvAirInAlu->getNChildVols(); ichildAirInAlu++) {
860 PVConstLink childschild = pvAirInAlu->getChildVol(ichildAirInAlu);
861 if((childschild->getLogVol())->getShape()->typeID() == GeoTrd::getClassTypeID() )
862 {
863 std::string currentName = (childschild->getLogVol())->getName();
864 if(currentName!="MBTS1" && currentName!="MBTS2") continue;
865 if(stringOfNames.find(currentName,0) == std::string::npos)
866 {
867 stringOfNames+=" " + currentName;
868 GeoTrf::Vector3D translateToScin = (transformToScin * pvAirInAlu->getXToChildVol(ichildAirInAlu)).translation();
869 const GeoTrd* theTrd = dynamic_cast<const GeoTrd*> ((childschild->getLogVol())->getShape());
870 double rho=pow(translateToScin.x(),2.0) + pow(translateToScin.y(),2.0);
871 rho=pow(rho,0.5);
872 double RMin=rho-theTrd->getZHalfLength();
873 double RMax=rho+theTrd->getZHalfLength();
874 double zmovement=translateToScin.z();
875 double zthickness=theTrd->getXHalfLength1();
876 out << "<AEndcapCryostat c=\"HCAL\" n=\"Minimum Bias Trigger Scintillators\""
877 << " sampling=\"" << sampling << "\" region=\"" << 0 << "\""
878 << " rMin=\"" << RMin/10. << "\""
879 << " rMax=\"" << RMax/10. << "\""
880 << " zMin=\"" << (zlocation+zmovement-zthickness)/10. << "\""
881 << " zMax=\"" << (zlocation+zmovement+zthickness)/10. << "\""
882 << " neta=\"" << "1" << "\""
883 << " nphi=\"" << numPhi << "\""
884 << " />" << std::endl;
885 sampling++;
886 }
887 }
888 }
889
890
891 }
892 }
893 }
894
895 void GeometryWriter::writeFooter(std::ofstream &out) {
896
897 out << "</AGeometry>" << std::endl;
898 }
899}
#define FORWARD
#define M_PI
#define endmsg
std::unique_ptr< CaloDetDescrManager > buildCaloDetDescr(ISvcLocator *svcLocator, IMessageSvc *msgSvc, const GeoAlignmentStore *geoAlignStore, const CaloRec::CaloCellPositionShift *cellPosShift)
Definition of CaloDetDescriptor.
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
void section(const std::string &sec)
constexpr int pow(int base, int exp) noexcept
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
int phi(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
int side(const Identifier id) const
Tile field values (NOT_VALID == invalid request)
bool is_em_endcap_inner(const Identifier id) const
test if the id belongs to the EM Endcap inner wheel
int region(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
int eta_min(const Identifier regId) const
min value of eta index (-999 == failure)
int eta(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
Helper class for offline cell identifiers.
Definition CaloCell_ID.h:34
This class groups all DetDescr information related to a CaloCell.
CaloCell_ID::CaloSample getSampling() const
cell sampling
Identifier identify() const override final
cell identifier
bool is_lar_fcal() const
cell belongs to FCAL
const CaloDetDescriptor * descriptor() const
cell descriptor
CaloConstIteratorAdaptor< calo_element_vec::const_iterator > calo_element_const_iterator
This is a base class for LAr and Tile Descriptors The primary goal is to speed up loops over all the ...
double calo_z_min() const
'ideal' geometry: z minimal
double calo_z_max() const
'ideal' geometry: z maximal
double calo_r_min() const
'ideal' geometry: r minimal
double calo_r_max() const
'ideal' geometry: r maximal
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
Class to hold geometrical description of a silicon detector element.
const SiDetectorElement * otherSide() const
Useful for SCT only.
double sinTilt() const
Compute sin(tilt angle) at a given position: at center.
const SiDetectorElement * nextInEta() const
double length() const
Length in eta direction (z - barrel, r - endcap)
double width() const
Methods from design (inline)
virtual Identifier identify() const override final
identifier of this detector element (inline)
Extended TRT_BaseElement to describe a TRT readout element, this is a planar layer with n ( order of ...
const TRT_BarrelElement * nextInPhi() const
Returns the next-in-phi detector element, or zero if none (forseeing gaps, in other words).
Virtual base class of TRT readout elements.
virtual const double & strawLength() const =0
Active straw length.
virtual Identifier identify() const override final
identifier of this detector element:
virtual const Amg::Vector3D & center() const override final
Element Surface: center of a straw layer.
const Amg::Transform3D & strawTransform(unsigned int straw) const
Straw transform - fast access in array, in Tracking frame: Amg.
const LArDetectorManager * m_lar_manager
void writeLArGeometry(std::ofstream &out)
Writes the geometry of the LAr calorimeters.
const PixelID * m_pixelIdHelper
void writeTILEGeometry(std::ofstream &out)
Writes the geometry of the TILE calorimeters.
void writeMBTSGeometry(std::ofstream &out)
Writes the geometry of the Minimum Bias Trigger Scintillators.
void writePixelGeometry(std::ofstream &out)
Writes the geometry of the pixel detector.
const TRT_ID * m_trtIdHelper
const SCT_ID * m_sctIdHelper
void writeFooter(std::ofstream &out)
Writes the footer of the XML file.
std::vector< double > m_larMin
virtual StatusCode writeGeometry() override
Writes the inner detector and calorimeter geometry to an XML file.
const TileDetDescrManager * m_tile_manager
static const int m_numCaloTypes
The number of calorimeter sampling types.
void writeTRTGeometry(std::ofstream &out)
Writes the geometry of the TRT detector.
const InDetDD::SCT_DetectorManager * m_silicon_manager
Silicon detector manager and ID helper.
void writeSolenoidGeometry(std::ofstream &out)
Writes the (hardcoded) geometry of the solenoid.
std::vector< double > m_larMax
const InDetDD::PixelDetectorManager * m_pixel_manager
Pixel detector manager and ID helper.
void writeSCTGeometry(std::ofstream &out)
Writes the geometry of the silicon detector.
std::unique_ptr< CaloDetDescrManager > m_calo_manager
Calorimeter detector manager.
const InDetDD::TRT_DetectorManager * m_trt_manager
TRT detector manager and ID helper.
void writeHeader(std::ofstream &out)
Writes the header of the XML file.
tile_descr_vec::const_iterator tile_descr_const_iterator
float zcenter(unsigned int samp) const
float rcenter(unsigned int samp) const
float eta_min(unsigned int samp) const
Identifier identify(void) const
float deta(unsigned int samp) const
int n_eta(unsigned int samp) const
float dz(unsigned int samp) const
float dr(unsigned int samp) const
Helper class for TileCal offline identifiers.
Definition TileID.h:67
int tower(const Identifier &id) const
bool is_tile_barrel(const Identifier &id) const
Test of an Identifier to see if it belongs to a particular part of the calorimeter.
Identifier cell_id(const Identifier &any_id) const
int side(const Identifier &id) const
int section(const Identifier &id) const
int eta_min(const Identifier &id) const
max values (-999 == failure)
bool is_tile_extbarrel(const Identifier &id) const
bool is_tile_gap(const Identifier &id) const
bool is_tile_gapscin(const Identifier &id) const
Eigen::Matrix< double, 3, 1 > Vector3D
IMessageSvc * getMessageSvc(bool quiet=false)
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.