48 #include "GaudiKernel/SystemOfUnits.h"
49 #include "GeoModelKernel/GeoBox.h"
50 #include "GeoModelKernel/GeoDefinitions.h"
51 #include "GeoModelKernel/GeoFullPhysVol.h"
52 #include "GeoModelKernel/GeoIdentifierTag.h"
53 #include "GeoModelKernel/GeoLogVol.h"
54 #include "GeoModelKernel/GeoMaterial.h"
55 #include "GeoModelKernel/GeoNameTag.h"
56 #include "GeoModelKernel/GeoPhysVol.h"
57 #include "GeoModelKernel/GeoSerialDenominator.h"
58 #include "GeoModelKernel/GeoShapeIntersection.h"
59 #include "GeoModelKernel/GeoShapeShift.h"
60 #include "GeoModelKernel/GeoShapeSubtraction.h"
61 #include "GeoModelKernel/GeoShapeUnion.h"
62 #include "GeoModelKernel/GeoTransform.h"
63 #include "GeoModelKernel/GeoTrd.h"
64 #include "GeoModelKernel/GeoTube.h"
71 #define useAssemblies false
75 const std::map<std::string, float> rpcYTrans = {
76 std::make_pair<std::string, float>(
"RPC26", -9.1),
77 std::make_pair<std::string, float>(
"RPC27", -9.1),
78 std::make_pair<std::string, float>(
"RPC28", -27.7),
79 std::make_pair<std::string, float>(
"RPC29", -8.8),
81 const std::map<std::string, float> rpcZTrans = {
82 std::make_pair<std::string, float>(
"RPC26", 3.22),
83 std::make_pair<std::string, float>(
"RPC27", 3.06),
84 std::make_pair<std::string, float>(
"RPC28", 3.11),
85 std::make_pair<std::string, float>(
"RPC29", 3.11),
97 longWidth =
s->GetWidth2();
98 thickness =
s->GetThickness(mysql);
103 std::string stname(m_station->GetName(), 0, 3);
113 <<
" is assembly = " << isAssembly );
122 bool is_barrel = (stName.compare(0, 1,
"B") == 0);
124 std::string geometry_version =
manager->geometryVersion();
127 double totthick =
thickness + extratop + extrabottom;
138 const GeoShape *strd =
nullptr;
140 if ((extratop + extrabottom) != 0.) {
142 dx = extratop / 2. - extrabottom / 2.;
145 strd = &((*maintrd) << GeoTrf::Translate3D(
dx, 0., 0.));
154 if (stname ==
"CSS") {
162 if ((
comp->name).compare(0, 3,
"CSC") == 0) {
164 cthick =
comp->GetThickness(mysql);
165 cypos = clen -
comp->posy + 1.0 -
length / 2.;
166 cxpos = -totthick / 2. +
comp->posz + cthick / 2. + 0.1;
170 GeoIntrusivePtr<GeoShape> box{
new GeoBox(cthick / 2.,
longWidth / 2., (
length - clen) / 2.)};
171 strd = &(strd->subtract((*box) << GeoTrf::Translate3D(cxpos, 0., cypos)));
178 if ((stname ==
"BMS" && std::abs(zi) == 5) || (stname ==
"BMS" && std::abs(zi) == 1 &&
fi != 3)) {
181 double cutthick = 0.;
182 double top_edge = 0.;
186 cutlen =
length - top_edge;
187 if ((
comp->posy != 0 && cutlen > 0.1) ||
comp->dy > 0.75 *
length) {
188 cutthick =
comp->GetThickness(mysql) + 1.;
192 GeoIntrusivePtr<GeoShape> box1{
new GeoBox(cutthick / 2., (
longWidth + 2.) / 2., cutlen)};
193 strd = &(strd->subtract((*box1) << GeoTrf::Translate3D((totthick - cutthick) / 2., 0.,
length / 2.)));
199 bool testEIL = (stname ==
"EIL" && std::abs(zi) != 1 && (std::abs(zi) != 4 ||
fi == 0 ||
fi == 4));
201 if ((
m_enableFineClashFixing && (stname ==
"BML" || stname ==
"BIL" || stname ==
"BOL" || stname ==
"BMS" || stname ==
"BIS" || stname ==
"BOS")) || testEIL) {
202 double root3 = 1.7320508;
204 double mdt_half_thick = -1.;
210 int mdt_index[4] = {0, 0, 0, 0};
213 if (
comp->name.compare(0,3,
"MDT") == 0) {
220 GeoIntrusivePtr<GeoShape> box{
new GeoBox((totthick + 2.) / 2., (
longWidth + 2.) / 2., halfpitch)};
221 GeoIntrusivePtr<const GeoShape> frontcyl{
new GeoTube(0.0, halfpitch + 0.001,
longWidth / 2.)};
223 GeoIntrusivePtr<const GeoShape> backcyl{
new GeoTube(0.0, halfpitch - 0.001, (
longWidth + 2.) / 2.)};
228 strd = &(strd->subtract((*box) << GeoTrf::Translate3D(0., 0.,
length / 2.)));
232 mdt_half_thick =
comp->GetThickness(mysql) / 2.;
233 mdt_pos = -totthick / 2. +
comp->posz + mdt_half_thick;
234 mdt_pos += amdbOrigine_along_thickness;
235 xtube1 =
sign * (mdt_half_thick - (root3 + 1.) * halfpitch);
236 xtube2 =
sign * (mdt_half_thick - (3 * root3 + 1.) * halfpitch);
237 strd = &(strd->add((*frontcyl) << GeoTrf::Translate3D(mdt_pos + xtube1, 0.,
length / 2. - halfpitch)));
238 strd = &(strd->subtract((*backcyl) << GeoTrf::Translate3D(mdt_pos + xtube1, 0., -
length / 2.)));
240 if (stname ==
"BIL" || (stname ==
"BIS" && std::abs(zi) != 8) || testEIL) {
241 strd = &(strd->add((*frontcyl) << GeoTrf::Translate3D(mdt_pos + xtube2, 0.,
length / 2. - halfpitch)));
242 strd = &(strd->subtract((*backcyl) << GeoTrf::Translate3D(mdt_pos + xtube2, 0., -
length / 2.)));
248 if (stname !=
"EIL") {
249 if (zi < 0 && !is_mirrored)
258 if (zi < 0 && !is_mirrored && stName[0] ==
'B') {
260 amdbOrigine_along_length += halfpitch;
263 ATH_MSG_VERBOSE(
"amdb origine: in the length direction = " << amdbOrigine_along_length
264 <<
" in the thickness direction = " << amdbOrigine_along_thickness);
267 ATH_MSG_DEBUG(
"Station " << stName <<
" at zi, fi " << zi <<
" " <<
fi + 1 <<
" will be described as Assembly" );
275 if (stName.compare(0, 3,
"BOG") == 0 && (
manager->IncludeCutoutsBogFlag() ||
manager->IncludeCutoutsFlag())) {
277 ATH_MSG_VERBOSE(
"amdb org: length= " << amdbOrigine_along_length <<
" thickness= " << amdbOrigine_along_thickness );
279 std::string statType = stName.substr(0, 3);
281 ATH_MSG_DEBUG(
"Station " << stName <<
" at zi, fi " << zi <<
" " <<
fi + 1 <<
" has components with cutouts " );
285 bool foundCutouts =
false;
296 if (std::abs(
cut->dx - 600.7) < 0.1) {
301 if (std::abs(
cut->dx + 600.7) < 0.1) {
306 if (std::abs(
cut->lengthY - 180.2) < 0.001) {
309 if (std::abs(
cut->dy - 1019.8) < 0.001) {
310 cut->dy = 1216.4185 -
cut->lengthY;
313 cut->setThickness(totthick * 1.01);
315 (
cut->ijob ==
c->index)) {
327 if (stName.compare(0, 1,
"T") == 0 && stName.compare(2, 1,
"E") == 0 && stName.compare(1, 1,
"4") != 0) {
328 GeoTrd *strdoverlap =
new GeoTrd(totthick / 4, totthick / 4,
width / 2,
longWidth / 2, 400. / 2);
329 strd = &(strd->subtract((*strdoverlap) << GeoTrf::Translate3D(-totthick / 4., 0., -
length / 2 + 400. / 2.)));
332 const GeoMaterial *mtrd =
nullptr;
338 GeoLogVol *ltrd =
new GeoLogVol(std::string(stName) +
"_Station", strd, mtrd);
339 GeoPhysVol *ptrd =
new GeoPhysVol(ltrd);
341 double ypos{0.}, zpos{0.}, xpos{0.}, irad{0.};
342 std::array<int, 2> ndbz{0, 0};
345 int nDoubletR{0}, nRpc{0}, nTgc{0}, nCsc{0}, nMdt{0};
346 double previous_depth = 0.;
347 ATH_MSG_VERBOSE(
" Station Name = " << stName <<
" fi/zi " <<
fi <<
"/" << zi <<
" defining the n. of DoubletR to " );
351 std::string_view cn = std::string_view(
d->name).substr(0, 3);
360 if (!(stname.compare(0, 2,
"BI") == 0) && nDoubletR == 1 && nRpc > 1 &&
depth * previous_depth < 0)
364 previous_depth =
depth;
376 ATH_MSG_DEBUG(
" " << nDoubletR<<
" nMdt/Rpc/Tgc/Csc " << nMdt <<
"/" << nRpc <<
"/" << nTgc <<
"/" << nCsc );
381 double LBheight{0.}, LBwidth{0.}, LByShift{0.};
382 std::array<double, 2> LBpos{-1, -1};
385 std::string_view cname = std::string_view(
c->name).substr(0, 2);
388 LByShift =
lb->yShift;
391 LBpos[numLB] =
c->posy +
c->dy / 2.;
392 LBheight =
lb->height;
401 std::string_view cname = std::string_view(
c->name).substr(0, 3);
402 if (cname ==
"CRO" || cname ==
"CMI" || cname ==
"CHV") {
412 std::string CMIcomponentNumber =
"";
415 std::string_view cn = std::string_view(
d->name).substr(0, 3);
417 CMIcomponentNumber = (
d->name).substr(3, 2);
424 std::string_view cn = std::string_view(
d->name).substr(0, 2);
430 ATH_MSG_ERROR(
"MuonChamber :: cannot associate a CMI subtype to the LB component " );
436 if (stName.compare(0, 1,
"B") == 0) {
437 mstat =
new MuonStation(stName.substr(0, 3),
width, totthick,
length,
longWidth, totthick,
length, zi,
fi + 1,
438 (zi < 0 && !is_mirrored));
440 mstat =
new MuonStation(stName.substr(0, 3),
width,
length, totthick,
longWidth,
length, totthick, zi,
fi + 1,
441 (zi < 0 && !is_mirrored));
443 manager->addMuonStation(std::unique_ptr<MuonStation>(mstat));
444 ATH_MSG_DEBUG(
" Building a MuonStation for this MuonChamber "
445 <<
m_station->
GetName() <<
" at zi, fi " << zi <<
" " <<
fi + 1 <<
" is_mirrored " << is_mirrored);
451 ATH_MSG_VERBOSE(
" Component index " <<
c->index <<
" in loop for " << stName <<
" " << stationType <<
" at zi, fi " << zi <<
" " <<
fi + 1 <<
" cName "
452 <<
c->name <<
" thickness " <<
c->GetThickness(mysql) <<
" length " <<
c->dy <<
" w, lw " <<
c->dx1 <<
" " <<
c->dx2 );
453 ATH_MSG_VERBOSE(
" Component local (amdb) coords " <<
c->posx <<
" " <<
c->posy <<
" " <<
c->posz );
455 ypos = -
thickness / 2. +
c->posz +
c->GetThickness(mysql) / 2.;
459 ypos = -
thickness / 2. + (
c->posz + amdbOrigine_along_thickness) +
c->GetThickness(mysql) / 2.;
460 zpos = -
length / 2. + amdbOrigine_along_length +
c->posy +
c->dy / 2.;
463 const std::string &techname =
c->name;
464 std::string_view
type = std::string_view(techname).substr(0, 3);
466 GeoVPhysVol *lv =
nullptr;
467 GeoVPhysVol *lvd =
nullptr;
468 GeoVPhysVol *lvs =
nullptr;
469 GeoVPhysVol *lvo =
nullptr;
470 GeoFullPhysVol *lvm =
nullptr;
471 GeoFullPhysVol *lvr =
nullptr;
472 GeoFullPhysVol *lvt =
nullptr;
473 GeoFullPhysVol *lvc =
nullptr;
478 std::string statType = stName.substr(0, 3);
479 double cthickness =
c->GetThickness(mysql);
481 std::vector<Cutout *> vcutdef;
482 std::vector<std::unique_ptr<Cutout>> vcutdef_todel;
485 cut->setThickness(cthickness * 1.01);
489 double tempdx =
cut->dx;
490 double tempdy =
cut->dy;
491 double templengthY =
cut->lengthY;
495 if (stName.compare(0, 3,
"BOG") == 0) {
497 cut->lengthY = templengthY + 31.;
503 if (std::abs(
cut->dead1) > 1. && techname ==
"MDT03")
508 cut->lengthY = templengthY;
523 if (stName.compare(0, 3,
"BMS") == 0) {
525 if (std::abs(zi) == 1) {
528 if (
type ==
"RPC" ||
type ==
"DED") {
529 cut->widthXl += 2 * margin;
530 cut->widthXs += 2 * margin;
532 cut->lengthY += 2 * margin;
547 if (stName.compare(0, 3,
"BOS") == 0 && zi == -6 &&
type ==
"MDT") {
548 cut->dy =
c->dy -
cut->dy -
cut->lengthY - halfpitch;
550 if (techname ==
"MDT03")
560 if (
type ==
"MDT" && (is_mirrored || zi < 0) && stName.compare(0, 1,
"B") == 0) {
565 cutmirr->
dx = -cutmirr->
dx;
568 vcutdef.push_back(cutmirr);
569 vcutdef_todel.emplace_back(cutmirr);
570 ATH_MSG_VERBOSE(
"adding for application mirrored cut \n" << *cutmirr );
572 }
else if (
type ==
"RPC" ||
type ==
"DED") {
575 if (stName.compare(0, 3,
"BMS") == 0 && zi == 4 && (
c->index == 20 ||
c->index == 21 ||
c->index == 24 ||
c->index == 25)) {
576 cutRpcType->
dy = 1102.5;
579 if (stName.compare(0, 3,
"BOS") == 0 && zi == 6 &&
type ==
"DED")
580 cutRpcType->
dy = 706.;
582 cutRpcType->
dy = cutRpcType->
dy -
c->posy;
583 cutRpcType->
dx = cutRpcType->
dx -
c->posx;
587 if (
rp->iswap == -1) {
588 cutRpcType->
dy =
c->dy - (cutRpcType->
dy + cutRpcType->
lengthY);
592 ATH_MSG_VERBOSE(
" Rpc or ded cutout redefined as follows \n" << *cutRpcType );
593 vcutdef.push_back(cutRpcType);
594 vcutdef_todel.emplace_back(cutRpcType);
595 }
else if (
type ==
"TGC") {
600 tgccut->
dy -=
c->posy;
603 vcutdef.push_back(tgccut);
604 vcutdef_todel.emplace_back(tgccut);
606 vcutdef.push_back(
cut);
612 ATH_MSG_DEBUG(
c->name <<
" of station " << stName <<
" at fi/zi " <<
fi + 1 <<
"/" << zi <<
" has " << ncutouts <<
" cutouts " );
617 GeoTransform *xfcomponent{
nullptr};
618 GeoAlignableTransform *xfaligncomponent{
nullptr};
622 if (stName.compare(0, 1,
"B") != 0 && is_mirrored)
623 mstat->setxAmdbCRO(-xpos);
625 mstat->setxAmdbCRO(xpos);
629 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos) * GeoTrf::TranslateY3D(xpos);
631 if (zi < 0 && !is_mirrored && stName[0] ==
'B') {
634 htcomponent = htcomponent * GeoTrf::TranslateZ3D(halfpitch);
639 if (zi < 0 && stName.compare(0, 3,
"BOG") == 0 && is_mirrored) {
647 xfaligncomponent =
new GeoAlignableTransform(htcomponent);
648 std::string
key =std::string( stName) + techname;
652 bool mdtCutoutFlag = ((stname ==
"BOS" && std::abs(zi) == 6) || stname ==
"BMG" || techname ==
"MDT14" || (stname ==
"BMS" && (std::abs(zi) == 1 &&
fi == 3)) ||
653 (stname ==
"EMS" && (std::abs(zi) == 1 || std::abs(zi) == 3)));
654 if (((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
656 }
else if (((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG")) == 0) && zi < 0) {
661 if (fpv ==
nullptr) {
662 std::unique_ptr<Mdt>
r = std::make_unique<Mdt>(mysql,
c, stName + techname);
663 ATH_MSG_DEBUG(
" Building an MDT for station " <<
key <<
" component name is " <<
c->name <<
664 " stName "<<stName<<
" techName: "<<techname<<
" manager->IncludeCutoutsFlag() "
665 <<
manager->IncludeCutoutsFlag() <<
" manager->IncludeCutoutsBogFlag() " <<
manager->IncludeCutoutsBogFlag() );
668 if ((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) {
669 lvm =
r->build(matManager, mysql, vcutdef);
671 lvm =
r->build(matManager, mysql);
675 GeoFullPhysVol *rfpv = (GeoFullPhysVol *)fpv;
676 ATH_MSG_VERBOSE(
" This MDT for station " <<
key <<
" component name is " <<
c->name <<
" already exists; clone it " );
680 }
else if (
type ==
"SPA" &&
manager->MinimalGeoFlag() == 0) {
681 if (techname ==
"SPA01" && stName.compare(0, 1,
"C") == 0) {
682 ATH_MSG_DEBUG(
"Ficticious spacer SPA01 in CSC chamber - skip it " );
688 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos);
689 xfcomponent =
new GeoTransform(htcomponent);
690 std::string
key = std::string(stName) + techname;
691 if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
693 }
else if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
698 if (fpv ==
nullptr) {
699 std::unique_ptr<Spacer>
r = std::make_unique<Spacer>(mysql,
c);
700 ATH_MSG_DEBUG(
" Building a SPA for m_station "<<
key <<
" component name is " <<
c->name );
701 if (
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) {
702 lv =
r->build(matManager, 1);
704 lv =
r->build(matManager);
711 }
else if ((
type ==
"CHV" ||
type ==
"CRO" ||
type ==
"CMI" ||
type ==
"LB0" ||
type ==
"LBI") &&
manager->MinimalGeoFlag() == 0) {
712 std::unique_ptr<SpacerBeam>
r = std::make_unique<SpacerBeam>(mysql,
c);
713 BeamHeight =
r->height;
715 double xpos = (
c->posz + amdbOrigine_along_thickness) -
thickness / 2. + BeamHeight / 2.;
716 if (
type.compare(0, 2,
"LB") == 0)
720 if (std::abs(
c->excent) > 0.001) {
729 if (stName ==
"EML1" || stName ==
"EML6") {
730 if ((
c->dx1 >
width) && zpos < 0.) {
733 if ((
c->dx1 /
longWidth) > 0.98 && zpos > 0.) {
742 if (stname ==
"BOL" && zi == 1 && (
fi + 1) == 3) {
743 r->length =
length - halfpitch;
744 zpos = -halfpitch / 2.;
749 htcomponent = GeoTrf::Translate3D(xpos, ypos, zpos) * GeoTrf::RotateX3D(
angle);
751 htcomponent = GeoTrf::Translate3D(xpos, -ypos, zpos) * GeoTrf::RotateX3D(-
angle);
753 xfcomponent =
new GeoTransform(htcomponent);
755 std::string
key = stName + techname;
756 if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
758 }
else if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
762 if (
type.substr(0, 2) ==
"LB")
765 ATH_MSG_DEBUG(
" Building a SpacerBeam for m_station "<<
key <<
" component name is "<<
c->name );
767 if (fpv ==
nullptr || (stName.compare(0, 3,
"BOG") == 0 &&
type ==
"CMI")) {
768 if (stName.compare(0, 3,
"BOG") == 0) {
769 ATH_MSG_VERBOSE(
" Building a SpacerBeam for station " <<
key <<
" component name is " <<
c->name );
771 if (
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) {
772 lvo =
r->build(matManager, 1, is_barrel);
774 lvo =
r->build(matManager, is_barrel);
781 if (stName.compare(0, 3,
"BOG") == 0)
782 ATH_MSG_VERBOSE(
" This spacerbeam for station " <<
key <<
" component name is " <<
c->name <<
" already exists; re-use it " );
786 }
else if (
type ==
"RPC") {
789 int ndivy =
rp->ndivy;
790 int ndivz =
rp->ndivz;
792 if (ndivz != 1 || ndivy != 1) {
793 ATH_MSG_ERROR(
" RPC segmentation z,y " << ndivz <<
" " << ndivy );
796 double xpos =
c->posx;
801 ATH_MSG_VERBOSE(
" In station " << stName <<
" with " << nDoubletR <<
" doubletR,"
802 <<
" RPC " << (
c->name).substr(3, 2) <<
" has swap flag = " <<
rp->iswap <<
" ypos, zpos " << ypos <<
" " << zpos <<
" " );
804 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
805 if (
rp->iswap == -1) {
808 xfaligncomponent =
new GeoAlignableTransform(htcomponent);
812 bool rpcCutoutFlag = (stname ==
"BOS" && std::abs(zi) == 6) || (stname ==
"BMS" && (std::abs(zi) == 2 || std::abs(zi) == 4 || std::abs(zi) == 6)) ||
813 (stname ==
"BMS" && std::abs(zi) == 1 &&
fi == 3);
814 std::string
key = stName + techname;
815 if (((
manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
818 }
else if (((
manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
823 if (fpv ==
nullptr) {
824 std::unique_ptr<Rpc>
r = std::make_unique<Rpc>(mysql,
c);
825 r->setLogVolName(std::string(stName) + techname);
826 if (stName.find(
"BI") != std::string::npos) {
827 std::map<std::string, float>::const_iterator yItr = rpcYTrans.find(techname);
828 if (yItr != rpcYTrans.end())
829 r->y_translation = yItr->second;
830 std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
831 if (zItr != rpcZTrans.end())
832 r->z_translation = zItr->second;
835 if ((
manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) {
836 lvr =
r->build(matManager, mysql,
manager->MinimalGeoFlag(), 1, vcutdef);
838 lvr =
r->build(matManager, mysql,
manager->MinimalGeoFlag());
843 GeoFullPhysVol *rfpv = (GeoFullPhysVol *)fpv;
847 }
else if (
type ==
"DED" &&
manager->MinimalGeoFlag() == 0) {
848 double xpos =
c->posx;
851 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
853 xfcomponent =
new GeoTransform(htcomponent);
855 bool dedCutoutFlag = (stname ==
"BOS" && std::abs(zi) == 6) || (stname ==
"BMS" && (std::abs(zi) == 2 || std::abs(zi) == 4 || std::abs(zi) == 6)) ||
856 (stname ==
"BMS" && std::abs(zi) == 1 &&
fi == 3);
857 std::string
key = std::string(stName) + techname;
858 if (((
manager->IncludeCutoutsFlag() && dedCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
861 }
else if (((
manager->IncludeCutoutsFlag() && dedCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
868 if (fpv ==
nullptr) {
869 std::unique_ptr<Ded>
r = std::make_unique<Ded>(mysql,
c);
870 ATH_MSG_VERBOSE(
" Building a DED for station " <<
key <<
" component name is " <<
c->name );
871 if ((
manager->IncludeCutoutsFlag() && dedCutoutFlag) || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) {
872 lvd =
r->build(matManager, mysql, 1, vcutdef);
874 lvd =
r->build(matManager, mysql);
880 ATH_MSG_VERBOSE(
" Re-using DED for station " <<
key <<
" component name is " <<
c->name );
883 }
else if (
type ==
"SUP" &&
manager->MinimalGeoFlag() == 0) {
889 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
890 std::string
key = std::string(stName) + techname;
891 if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
893 }
else if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
898 if (fpv ==
nullptr) {
904 }
else if (
type ==
"TGC") {
907 irad = tgInner->
posy;
909 double orad = tgOuter->
posy + tgOuter->
dy;
910 double start = -(orad - irad) / 2. + (tg->
posy - irad) + tg->
dy / 2;
912 htcomponent = GeoTrf::TranslateX3D(xstart + tg->
posz) * GeoTrf::TranslateZ3D(
start);
913 xfaligncomponent =
new GeoAlignableTransform(htcomponent);
916 std::string
key = std::string(stName) + techname;
917 if (
manager->IncludeCutoutsFlag()) {
929 sprintf(chswidth,
"%i",
int(10 *
c->dx1));
933 if (fpv ==
nullptr) {
934 std::unique_ptr<Tgc>
t = std::make_unique<Tgc>(mysql,
c);
935 t->setLogVolName(std::string(stName) + techname);
936 if (
manager->IncludeCutoutsFlag()) {
937 lvt =
t->build(matManager, mysql,
manager->MinimalGeoFlag(), 1, vcutdef);
939 lvt =
t->build(matManager, mysql,
manager->MinimalGeoFlag());
943 GeoFullPhysVol *rfpv = (GeoFullPhysVol *)fpv;
947 }
else if (
type ==
"CSC") {
948 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos);
949 xfaligncomponent =
new GeoAlignableTransform(htcomponent);
951 std::string
key = std::string(stName) + techname;
952 if (
manager->IncludeCutoutsFlag() && zi >= 0) {
954 }
else if (
manager->IncludeCutoutsFlag() && zi < 0) {
959 if (fpv ==
nullptr) {
960 std::unique_ptr<Csc>
t = std::make_unique<Csc>(mysql,
c);
961 t->setLogVolName(std::string(stName) + techname);
963 if (
manager->IncludeCutoutsFlag()) {
964 lvc =
t->build(matManager, mysql,
manager->MinimalGeoFlag(), 1, vcutdef);
966 lvc =
t->build(matManager, mysql,
manager->MinimalGeoFlag());
971 GeoFullPhysVol *rfpv = (GeoFullPhysVol *)fpv;
983 if (lvm &&
manager->mdtIdHelper()) {
985 int stationPhi =
fi + 1;
993 GeoNameTag *
nm =
new GeoNameTag(stag);
994 ptrd->add(
new GeoIdentifierTag(
c->index));
997 xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
999 ptrd->add(xfaligncomponent);
1002 std::unique_ptr<MdtReadoutElement>
det = std::make_unique<MdtReadoutElement>(lvm, stName,
manager);
1005 det->setHasCutouts(ncutouts > 0);
1006 det->setNMdtInStation(nMdt);
1008 det->setIdentifier(
id);
1009 det->setMultilayer(ml);
1010 det->setParentStationPV(PVConstLink(ptrd));
1011 det->setParentMuonStation(mstat);
1016 mstat->setBlineFixedPointInAmdbLRS(
c->posx,
c->posy,
c->posz);
1019 if (
c->posy < b0.y())
1020 mstat->setBlineFixedPointInAmdbLRS(b0.x(),
c->posy, b0.z());
1023 int jobIndex =
c->index;
1025 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
1026 ATH_MSG_DEBUG( std::string(stName + techname) <<
" trying to build a MDT Id from stType/eta/phi/ml/tl/t " << stationType <<
"/" << stationEta <<
"/"
1027 << stationPhi <<
"/" << ml <<
"/" << tubel <<
"/" <<
tube <<
endmsg <<
" Copy number is " <<
c->index <<
" tagName " << stag );
1030 manager->addMdtReadoutElement(std::move(
det));
1033 if (lvc &&
manager->cscIdHelper()) {
1035 int stationEta = zi;
1036 int stationPhi =
fi + 1;
1037 int chamberLayer = 1;
1040 std::string stag =
"cl[" +
MuonGM::buildString(chamberLayer, 0) +
"]" + techname +
"component";
1041 GeoNameTag *
nm =
new GeoNameTag(stag);
1042 ptrd->add(
new GeoIdentifierTag(
c->index));
1045 xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1047 ptrd->add(xfaligncomponent);
1050 std::unique_ptr<CscReadoutElement>
det = std::make_unique<CscReadoutElement>(lvc, stName,
manager);
1055 det->setHasCutouts(ncutouts > 0);
1056 Identifier id = csc_id->
channelID(stationType, stationEta, stationPhi, chamberLayer, 1, 0, 1);
1057 det->setIdentifier(
id);
1058 det->setChamberLayer(chamberLayer);
1059 det->setParentStationPV(PVConstLink(ptrd));
1060 det->setParentMuonStation(mstat);
1062 int jobIndex =
c->index;
1064 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
1065 ATH_MSG_DEBUG( stName << techname <<
" trying to build a CSC Id from stType/eta/phi/ml " << stationType <<
"/" << stationEta <<
"/"
1066 << stationPhi <<
"/" << chamberLayer <<
"/ and /1/0/1" <<
endmsg <<
" Copy number is " <<
c->index <<
" tagName " << stag );
1069 manager->addCscReadoutElement(std::move(
det));
1072 if (lvt &&
manager->tgcIdHelper()) {
1073 ATH_MSG_DEBUG(
" Adding a TGC chamber to the tree zi,fi, is_mirrored " << zi <<
" " <<
fi + 1 <<
" " << is_mirrored );
1080 stationEta = tg->
index;
1082 stationEta = -stationEta;
1085 int ttag = 1000 * stationPhi + tg->
index;
1086 std::string stag =
"stPhiJob[" +
MuonGM::buildString(ttag, 0) +
"]" + techname +
"tgccomponent";
1087 GeoNameTag *
nm =
new GeoNameTag(stag);
1096 ptrd->add(
new GeoIdentifierTag(geoid));
1099 xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1102 ptrd->add(xfaligncomponent);
1105 std::unique_ptr<TgcReadoutElement>
det = std::make_unique<TgcReadoutElement>(lvt, stName,
manager);
1108 det->setHasCutouts(ncutouts > 0);
1110 det->setIdentifier(
id);
1111 det->setParentStationPV(PVConstLink(ptrd));
1112 det->setParentMuonStation(mstat);
1114 int jobIndex =
c->index;
1116 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
1118 ATH_MSG_DEBUG( stName << techname <<
" trying to build a TGC Id from stType/eta/phi " << stationType <<
"/" << stationEta <<
"/" << stationPhi
1119 <<
"/ and /1/0/1" <<
endmsg <<
" Copy number is " << geoid <<
" tagName = " << stag );
1120 manager->addTgcReadoutElement(std::move(
det));
1125 int ndivy =
rp->ndivy;
1126 int ndivz =
rp->ndivz;
1128 if (ndivz != 1 || ndivy != 1) {
1129 ATH_MSG_ERROR(
" RPC segmentation z,y " << ndivz <<
" " << ndivy );
1132 double zpos = -
length / 2. +
c->posy +
c->dy / 2.;
1133 double xpos =
c->posx;
1141 int stationEta = zi;
1142 int stationPhi =
fi + 1;
1146 if (nRpc > 1 && nDoubletR == 2 && ypos > 0.)
1151 if (stname.find(
"BI") != std::string::npos) {
1152 if (stname.find(
"BIS") != std::string::npos) {
1154 if (std::abs(stationEta)>= 7){
1155 ATH_MSG_DEBUG(
"BIS78 station eta: "<<stationEta<<
" phi: "<<stationPhi<<
" dR: "<<
doubletR<<
" dZ:"<< doubletZ <<
" rp: "<<
rp->posz);
1157 if (std::abs(stationEta) >= 7 &&
rp->posz > 80)
1164 if (stname.find(
"BIL") != std::string::npos && std::abs(stationEta) < 7 && std::abs(stationEta) != 2 && std::abs(stationEta) != 5) {
1171 if (zi <= 0 && !is_mirrored) {
1199 if (zi < 0 && is_mirrored && doubletZ == 3) {
1203 }
else if (zi < 0 && is_mirrored && doubletZ == 2 &&
doubletR == 1 && stName ==
"BMS6") {
1210 int measuresPhi = 0;
1215 int tag = doubletZ +
doubletR * 100 + dbphi * 1000;
1216 if (
rp->iswap == -1)
1223 if (
rp->iswap == -1)
1228 GeoNameTag *
nm =
new GeoNameTag(stag);
1229 ptrd->add(
new GeoIdentifierTag(geoid));
1232 xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1234 ptrd->add(xfaligncomponent);
1237 std::unique_ptr<RpcReadoutElement>
det = std::make_unique<RpcReadoutElement>(lvr, stName, zi,
fi + 1, is_mirrored,
manager);
1241 det->setIdentifier(
id);
1242 det->setHasCutouts(ncutouts > 0);
1244 det->setDoubletZ(doubletZ);
1247 ATH_MSG_DEBUG( stName << techname <<
" trying to build a RPC Id from stType/eta/phi/dbR/dbZ/dbP " << stationType <<
"/" << stationEta <<
"/"
1249 <<
" Copy number " << geoid <<
" tagName= " << stag );
1250 det->setParentStationPV(PVConstLink(ptrd));
1251 det->setParentMuonStation(mstat);
1253 int jobIndex =
c->index;
1255 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
1258 if (stName.find(
"BI") != std::string::npos) {
1259 std::map<std::string, float>::const_iterator yItr = rpcYTrans.find(techname);
1260 if (yItr != rpcYTrans.end())
1261 det->setYTranslation(yItr->second);
1262 std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
1263 if (zItr != rpcZTrans.end())
1264 det->setZTranslation(zItr->second);
1270 manager->addRpcReadoutElement(std::move(
det));
1274 std::string cname =
c->name;
1275 ATH_MSG_VERBOSE(
" yes, the component is a SupComponent named " << cname );
1276 GeoNameTag *
nm =
new GeoNameTag(stName +
"_stName " + techname +
" supcomponent");
1277 ptrd->add(
new GeoIdentifierTag(
c->index));
1279 ptrd->add(xfcomponent);
1289 GeoNameTag *
nm =
new GeoNameTag(stName +
"_stName " + techname +
" dedcomponent");
1290 ptrd->add(
new GeoIdentifierTag(
c->index));
1293 ptrd->add(xfcomponent);
1305 GeoNameTag *
nm =
new GeoNameTag(stName +
"_stName " + techname +
" component");
1306 ptrd->add(
new GeoIdentifierTag(
c->index));
1309 ptrd->add(xfcomponent);
1314 GeoNameTag *
nm =
new GeoNameTag(stName +
"_stName " + techname +
" component");
1315 ptrd->add(
new GeoIdentifierTag(
c->index));
1317 ptrd->add(xfcomponent);
1322 mstat->updateBlineFixedPointInAmdbLRS();
1330 re->m_Ssize =
cc->dx1;
1331 re->m_LongSsize =
cc->dx2;
1332 re->m_Rsize =
cc->dy;
1333 re->m_LongRsize =
cc->dy;
1334 re->m_Zsize =
cc->GetThickness(mysql);
1335 re->m_LongZsize =
cc->GetThickness(mysql);
1336 re->m_RlengthUpToMaxWidth =
cc->maxwdy;
1337 re->m_excent =
cc->excent;
1340 std::string tname =
cc->name;
1341 re->setTechnologyName(tname);
1343 if (
ip.isAssigned) {
1344 re->setStationS(
ip.shift);
1346 ATH_MSG_ERROR(
" MuonChamber::setCscReadoutGeom: position not found " );
1360 re->m_Etastripwidth =
re->m_Etastrippitch;
1361 re->m_Phistripwidth =
re->m_Phistrippitch;
1367 re->m_Ssize =
cc->dx1;
1368 re->m_LongSsize =
cc->dx2;
1370 if (
re->m_inBarrel) {
1371 re->m_Rsize =
cc->GetThickness(mysql);
1372 re->m_LongRsize =
cc->GetThickness(mysql);
1373 re->m_Zsize =
cc->dy;
1374 re->m_LongZsize =
cc->dy;
1376 re->m_Rsize =
cc->dy;
1377 re->m_LongRsize =
cc->dy;
1378 re->m_Zsize =
cc->GetThickness(mysql);
1379 re->m_LongZsize =
cc->GetThickness(mysql);
1382 re->m_cutoutShift =
cc->cutoutTubeXShift;
1383 re->m_tubelenStepSize =
cc->tubelenStepSize;
1385 if (
ip.isAssigned) {
1386 re->setStationS(
ip.shift);
1388 ATH_MSG_ERROR(
" MuonChamber::setMdtReadoutGeom: position not found " );
1392 std::string tname =
cc->name;
1393 re->setTechnologyName(tname);
1396 re->m_tubepitch = thism->
pitch;
1397 re->m_tubelayerpitch = thism->
y[1] - thism->
y[0];
1399 re->m_deadlength =
cc->deadx;
1403 if (
re->m_inBarrel) {
1404 re->m_ntubesperlayer =
int(
re->m_Zsize /
re->m_tubepitch);
1406 re->m_ntubesinastep =
re->m_ntubesperlayer;
1407 re->m_tubelength[0] =
re->m_Ssize;
1409 re->m_ntubesperlayer =
int(
re->m_Rsize /
re->m_tubepitch);
1410 re->m_nsteps =
int(
re->m_Rsize /
re->m_tubelenStepSize);
1411 re->m_ntubesinastep =
int(
re->m_tubelenStepSize /
re->m_tubepitch);
1412 re->m_tubelength[0] =
re->m_Ssize;
1413 double diff = (
re->m_LongSsize -
re->m_Ssize) * (
re->m_LongRsize -
re->m_tubepitch / 2.) /
re->m_LongRsize;
1414 for (
int is = 0; is <
re->m_nsteps; ++is) {
1415 double len =
re->m_Ssize + is *
diff /
re->m_nsteps;
1416 re->m_tubelength[is] = len;
1420 for (
int tl = 0;
tl <
re->m_nlayers; ++
tl) {
1421 re->m_firstwire_x[
tl] = thism->
x[
tl];
1422 re->m_firstwire_y[
tl] = thism->
y[
tl];
1430 re->m_Ssize =
cc->dx1;
1431 re->m_LongSsize =
cc->dx2;
1432 re->m_Rsize =
cc->GetThickness(mysql);
1433 re->m_LongRsize =
cc->GetThickness(mysql);
1434 re->m_Zsize =
cc->dy;
1435 re->m_LongZsize =
cc->dy;
1437 re->m_hasDEDontop =
true;
1438 if (
cc->iswap == -1)
1439 re->m_hasDEDontop =
false;
1441 if (
ip.isAssigned) {
1442 re->setStationS(
ip.shift);
1444 ATH_MSG_ERROR(
" MuonChamber::setRpcReadoutGeom: position not found " );
1448 std::string tname =
cc->name;
1449 re->setTechnologyName(tname);
1458 if (
re->getStationName().find(
"BI") != std::string::npos) {
1459 re->setNumberOfLayers(3);
1464 if (
re->numberOfLayers() == 3) {
1465 constexpr
double rpc3GapLayerThickness = 11.8;
1469 re->m_gasGap_xPos[
gasGap -1] = (
gasGap - 2) * rpc3GapLayerThickness - 0.74;
1476 if (!
re->m_hasDEDontop) {
1483 re->m_nphistripsperpanel =
int((
re->m_Ssize /
re->m_nphistrippanels) /
re->m_phistrippitch);
1484 if (
re->getStationName().compare(0, 3,
"BME") != 0) {
1485 re->m_nphistripsperpanel-=(
re->m_nphistripsperpanel % 8) ;
1487 re->m_netastripsperpanel =
int((
re->m_Zsize) /
re->m_etastrippitch);
1488 re->m_netastripsperpanel -= (
re->m_netastripsperpanel % 8);
1490 re->m_phipaneldead =
re->m_Ssize /
re->m_nphistrippanels -
1491 re->m_nphistripsperpanel *
re->m_phistrippitch +
1493 re->m_phipaneldead =
re->m_phipaneldead / 2.;
1494 re->m_etapaneldead =
re->m_Zsize -
re->m_netastripsperpanel *
re->m_etastrippitch + genericRpc->
stripSeparation;
1495 re->m_etapaneldead =
re->m_etapaneldead / 2.;
1496 re->m_phistriplength =
re->m_LongZsize;
1497 re->m_etastriplength =
re->m_LongSsize /
re->m_nphistrippanels;
1499 re->m_first_phistrip_s[0] = -
re->m_Ssize / 2. +
re->m_phipaneldead +
re->m_phistripwidth / 2.;
1500 if (
re->m_nphistrippanels == 2) {
1501 re->m_first_phistrip_s[1] =
re->m_phipaneldead +
re->m_phistripwidth / 2.;
1505 re->m_phistrip_z = -
re->m_Zsize / 2. +
offset +
re->m_phistriplength / 2.;
1508 re->m_first_etastrip_z = -
re->m_Zsize / 2. +
re->m_etapaneldead +
re->m_etastripwidth / 2.;
1509 re->m_etastrip_s[0] = -
re->m_Ssize / 2. +
offset +
re->m_etastriplength / 2.;
1510 if (
re->m_nphistrippanels == 2) {
1511 re->m_etastrip_s[1] =
re->m_Ssize / 2. -
offset -
re->m_etastriplength / 2.;
1519 const std::string& stName) {
1521 re->setSsize(
cc->dx1);
1522 re->setLongSsize(
cc->dx2);
1523 re->setRsize(
cc->dy);
1524 re->setLongRsize(
cc->dy);
1525 re->setZsize(
cc->GetThickness(mysql));
1526 re->setLongZsize(
cc->GetThickness(mysql));
1529 re->setFrameThickness(genericTgc->
frame_h,
1533 const std::string &tname =
cc->name;
1535 re->setTechnologyName(tname);
1537 if (
ip.isAssigned) {
1538 re->setStationS(
ip.shift);
1540 throw std::runtime_error(
" MuonChamberLite::setTgcReadoutGeom position not found ");
1544 sprintf(
index,
"%i",
cc->index);
1546 re->setReadOutName(stName.substr(0, 4) +
'_' +
index);
1553 for (std::size_t
i = 0;
i < ncomp; ++
i) {
1554 double newpos = -
re->getZsize() / 2. + thist->
positions[
i] + thist->
tck[
i] / 2.;
1555 if ( thist->
materials[
i].find(
"TGCGas") != std::string::npos) {