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.
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.