8#include "GaudiKernel/Bootstrap.h"
9#include "GaudiKernel/IToolSvc.h"
10#include "GaudiKernel/ISvcLocator.h"
11#include "GaudiKernel/MsgStream.h"
13#include "CaloDetDescr/CaloDetDescrElement.h"
19#include "GeoModelKernel/GeoTrd.h"
39 std::ofstream outputFile(
"AGeometry.xml");
43 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not retrieve InDetDD::PixelDetectorManager" <<
endmsg;
46 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not retrieve PixelIDHelper" <<
endmsg;
48 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"Retrieved PixelIDHelper" <<
endmsg;
54 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not retrieve InDetDD::SCT_DetectorManager" <<
endmsg;
57 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not retrieve SCT_IDHelper" <<
endmsg;
59 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"Retrieved SCT_IDHelper" <<
endmsg;
65 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not retrieve InDetDD::TRT_DetectorManager" <<
endmsg;
70 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not retrieve TRT_IDHelper" <<
endmsg;
72 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"Retrieved TRT_IDHelper" <<
endmsg;
84 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"Retrieved CaloDetDescrManager" <<
endmsg;
88 m_larMin[CaloCell_ID::PreSamplerB] = 0.0;
89 m_larMax[CaloCell_ID::PreSamplerB] = 340.0;
96 m_larMin[CaloCell_ID::PreSamplerE] = 29.0;
97 m_larMax[CaloCell_ID::PreSamplerE] = 203.4;
101 m_larMax[CaloCell_ID::EME2] = 203.4;
103 m_larMax[CaloCell_ID::EME3] = 203.4;
105 m_larMax[CaloCell_ID::HEC0] = 203.4;
107 m_larMax[CaloCell_ID::HEC1] = 203.4;
109 m_larMax[CaloCell_ID::HEC2] = 203.4;
111 m_larMax[CaloCell_ID::HEC3] = 203.4;
116 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not retrieve TileDetDescrManager" <<
endmsg;
118 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"Retrieved TileDetDescrManager" <<
endmsg;
123 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not retrieve LArDetectorManager for MBTS" <<
endmsg;
125 if (
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"Retrieved LArDetectorManager for MBTS" <<
endmsg;
131 return StatusCode::SUCCESS;
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
273 <<
"<AGeometry>" << std::endl;
280 for (it=
m_pixel_manager->getDetectorElementBegin(); it<m_pixel_manager->getDetectorElementEnd(); ++it) {
285 if (!element)
continue;
290 double rMin = element->
rMin();
291 double rMax = element->
rMax();
292 double zMax = element->
zMax();
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();
302 out <<
"<ABarrelSiliconDetector c=\"" <<
"PIX" <<
"\" n=\"" <<
"Pixel" <<
"\""
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()) <<
"\""
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;
322 double rMin = element->
rMin();
323 double rMax = element->
rMax();
324 double zMin = element->
zMin();
325 double zMax = element->
zMax();
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();
338 out <<
"<AEndcapSiliconDetector c=\"" <<
"PIX" <<
"\" n=\"" <<
"Pixel" <<
"\""
340 <<
" length=\"" << element->
length()/10. <<
"\""
341 <<
" width=\"" << element->
width()/10. <<
"\""
342 <<
" thickness=\"" << (rMax - rMin - element->
sinTilt()*element->
width())/40. <<
"\""
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;
361 for (it=
m_silicon_manager->getDetectorElementBegin(); it<m_silicon_manager->getDetectorElementEnd(); ++it) {
366 if (!element)
continue;
372 double rMin = element->
rMin();
373 double rMax = element->
rMax();
374 double zMax = element->
zMax();
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();
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();
391 out <<
"<ABarrelSiliconDetector c=\"" <<
"SIL" <<
"\" n=\"" <<
"Silicon" <<
"\""
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()) <<
"\""
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;
412 double rMin = element->
rMin();
413 double rMax = element->
rMax();
414 double zMin = element->
zMin();
415 double zMax = element->
zMax();
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();
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();
437 out <<
"<AEndcapSiliconDetector c=\"" <<
"SIL" <<
"\" n=\"" <<
"Silicon" <<
"\""
439 <<
" length=\"" << element->
length()/10. <<
"\""
440 <<
" width=\"" << element->
width()/10. <<
"\""
441 <<
" thickness=\"" << 2. * (rMax - rMin - element->
sinTilt()*element->
width())/10. <<
"\""
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;
460 for (it=
m_trt_manager->getDetectorElementBegin(); it<m_trt_manager->getDetectorElementEnd(); ++it) {
464 if (!elementIn)
continue;
470 if (posIn.z() < 0)
continue;
481 if (!elementOut)
continue;
487 if (!element)
continue;
492 out <<
"<ABarrelTRTDetector c=\"TRT\" n=\"TRT\""
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;
510 if (!elementOut)
continue;
516 int nphi = (int) floor(2.*
M_PI / fabs(posOut.phi() - posIn.phi()));
518 out <<
"<AEndcapTRTDetector c=\"TRT\" n=\"TRT\""
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;
540 out <<
"<ADisc p=\"YX\" c=\"Sol\" n=\"Solenoid\""
541 <<
" rIn=\"" << rIn <<
"\""
542 <<
" rOut=\"" << rOut <<
"\" />"
545 out <<
"<ARectangle p=\"RZ\" c=\"Sol\" n=\"Solenoid\""
546 <<
" xMin=\"" << zIn <<
"\""
547 <<
" xMax=\"" << zOut <<
"\""
548 <<
" yMin=\"" << rIn <<
"\""
549 <<
" yMax=\"" << rOut <<
"\""
561 if (!descriptor)
continue;
564 for (i=0; i<descriptor->
n_samp(); i++) {
566 if (descriptor->
zcenter(i) <= 0)
continue;
575 if (!name.compare(0, 3,
"ITC")) {
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;
590 int module = tileIdHelper->module(descriptor->
identify());
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;
621 for (
int region=0; region<8; region++) {
623 for (
int inner=0; inner<2; inner++) {
625 int minEtaIndex = 0, maxEtaIndex = 0;
629 for (it=
m_calo_manager->element_begin(); it<m_calo_manager->element_end(); ++it) {
632 int etaIndex, phiIndex;
633 std::string technology;
636 if (!element)
continue;
641 if (element->
is_tile())
continue;
648 if (idHelper->
eta(
id) != idHelper->
eta_min(
id) || idHelper->
side(
id) < 0)
continue;
650 if (idHelper->
region(
id) != region)
continue;
657 if (element->
z() < 0)
continue;
660 etaIndex = idHelper->
eta(
id);
661 phiIndex = idHelper->
phi(
id);
662 if (phiIndex > 0)
continue;
664 if (!oneSuchElement) {
665 oneSuchElement = element;
666 minEtaIndex = maxEtaIndex = etaIndex;
667 minEta = element->
eta();
669 if (etaIndex < minEtaIndex) {
670 minEtaIndex = etaIndex;
671 minEta = element->
eta();
673 if (etaIndex > maxEtaIndex) {
674 maxEtaIndex = etaIndex;
679 if (oneSuchElement) {
689 case CaloCell_ID::PreSamplerB:
691 name =
"LAr Presampler";
695 case CaloCell_ID::EMB1:
696 case CaloCell_ID::EMB2:
697 case CaloCell_ID::EMB3:
700 sampling =
type - CaloCell_ID::PreSamplerB;
703 case CaloCell_ID::PreSamplerE:
705 name =
"LAr_EC_Presampler";
708 case CaloCell_ID::EME1:
709 case CaloCell_ID::EME2:
710 case CaloCell_ID::EME3:
712 name = inner ?
"LAr Inner Endcap" :
"LAr Outer Endcap";
713 sampling =
type - CaloCell_ID::PreSamplerE;
716 case CaloCell_ID::HEC0:
717 case CaloCell_ID::HEC1:
718 case CaloCell_ID::HEC2:
719 case CaloCell_ID::HEC3:
722 sampling =
type - CaloCell_ID::HEC0;
725 case CaloCell_ID::FCAL0:
730 case CaloCell_ID::FCAL1:
735 case CaloCell_ID::FCAL2:
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;
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. <<
"\""
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;
763 out <<
"<AEndcapCalorimeter c=\"" <<
color <<
"\" n=\"" << name <<
"\""
764 <<
" sampling=\"" << sampling <<
"\" region=\"" << region%8 <<
"\""
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;
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;
806 for (
unsigned int c=0; c< myVol->getNChildVols();c++)
808 PVConstLink child = myVol->getChildVol(c);
809 if((child->getLogVol())->getName()==
"MBTS_mother")
811 int sampling=0,numPhi=0;
812 std::string stringOfNames=
"";
814 GeoTrf::Vector3D translate = (child->getX()).translation();
816 double zlocation = translate.z();
818 zlocation=-zlocation;
820 GeoTrf::Transform3D transformToScin;
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);
831 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not find MBTSAirEnv" <<
endmsg;
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);
843 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not find MBTSAluEnv" <<
endmsg;
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);
855 if (
msgLvl(MSG::WARNING))
msg(MSG::WARNING) <<
"Could not find MBTSAirInAlu" <<
endmsg;
859 for (
unsigned int ichildAirInAlu=0; ichildAirInAlu<pvAirInAlu->getNChildVols(); ichildAirInAlu++) {
860 PVConstLink childschild = pvAirInAlu->getChildVol(ichildAirInAlu);
861 if((childschild->getLogVol())->getShape()->typeID() == GeoTrd::getClassTypeID() )
863 std::string currentName = (childschild->getLogVol())->getName();
864 if(currentName!=
"MBTS1" && currentName!=
"MBTS2")
continue;
865 if(stringOfNames.find(currentName,0) == std::string::npos)
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);
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;
897 out <<
"</AGeometry>" << std::endl;
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.
constexpr int pow(int base, int exp) noexcept
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) 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.
This class groups all DetDescr information related to a CaloCell.
bool is_tile() const
cell belongs to Tile
float dphi() const
cell dphi
CaloCell_ID::CaloSample getSampling() const
cell sampling
Identifier identify() const override final
cell identifier
float eta() const
cell eta
float phi() const
cell phi
float deta() const
cell deta
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
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.
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.