112 ATH_MSG_VERBOSE(
" Building a MuonChamberLite for m_station " <<
m_station->
GetName() <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" is_mirrored " << is_mirrored
113 <<
" is assembly = " << isAssembly );
125 double totthick =
thickness + extratop + extrabottom;
134 if (zi < 0 && !is_mirrored &&
stName[0] ==
'B') {
136 amdbOrigine_along_length += halfpitch;
140 << amdbOrigine_along_length <<
" in the thickness direction = " << amdbOrigine_along_thickness);
143 ATH_MSG_DEBUG(
"Station " <<
stName <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" will be described as Assembly" );
152 if (
stName.compare(0, 3,
"BOG") == 0 && (
manager->IncludeCutoutsBogFlag() ||
manager->IncludeCutoutsFlag())) {
154 ATH_MSG_VERBOSE(
"amdb org: length= " << amdbOrigine_along_length <<
" thickness= " << amdbOrigine_along_thickness );
156 std::string statType =
stName.substr(0, 3);
158 ATH_MSG_DEBUG(
"Station " <<
stName <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" has components with cutouts " );
162 bool foundCutouts =
false;
173 if (std::abs(
cut->dx - 600.7) < 0.1) {
178 if (std::abs(
cut->dx + 600.7) < 0.1) {
183 if (std::abs(
cut->lengthY - 180.2) < 0.001) {
186 if (std::abs(
cut->dy - 1019.8) < 0.001) {
187 cut->dy = 1216.4185 -
cut->lengthY;
190 cut->setThickness(totthick * 1.01);
191 if ((
cut->subtype == mysql.allocPosFindSubtype(std::string(statType), fi, zi)) && (
cut->icut == mysql.allocPosFindCutout(std::string(statType), fi, zi)) &&
192 (
cut->ijob ==
c->index)) {
204 double ypos{0.}, zpos{0.}, xpos{0.}, irad{0.};
205 std::array<int, 2 > ndbz{0, 0};
208 int nDoubletR{0}, nRpc{0}, nTgc{0}, nCsc{0}, nMdt{0};
209 double previous_depth = 0.;
211 ATH_MSG_VERBOSE(
" Station Name = " <<
stName <<
" fi/zi " << fi <<
"/" << zi <<
" defining the n. of DoubletR to " );
216 std::string_view cn = std::string_view(
d->name).substr(0, 3);
223 if (!(stname.compare(0, 2,
"BI") == 0) && nDoubletR == 1 && nRpc > 1 &&
depth * previous_depth < 0)
226 previous_depth =
depth;
228 else if (cn ==
"CSC") {
231 else if (cn ==
"TGC") {
234 else if (cn ==
"MDT") {
238 ATH_MSG_DEBUG(
"nDoubletR: " << nDoubletR<<
" nMdt/Rpc/Tgc/Csc " << nMdt <<
"/" << nRpc <<
"/" << nTgc <<
"/" << nCsc );
243 double LBheight{0.}, LBwidth{0.};
244 std::array<double, 2> LBpos{-1, -1};
247 std::string_view cname = std::string_view(
c->name).substr(0, 2);
249 const LBI *
lb =
dynamic_cast<const LBI *
>(mysql.GetTechnology(
c->name));
251 LBpos[numLB] =
c->posy +
c->dy / 2.;
252 LBheight =
lb->height;
261 std::string_view cname = std::string_view(
c->name).substr(0, 3);
262 if (cname ==
"CRO" || cname ==
"CMI" || cname ==
"CHV") {
263 CbmComponent *ccbm =
static_cast<CbmComponent *
>(
c);
264 ccbm->lb_height = LBheight;
265 ccbm->lb_width = LBwidth;
266 ccbm->hole_pos1 = LBpos[0];
267 ccbm->hole_pos2 = LBpos[1];
272 std::string CMIcomponentNumber =
"";
275 std::string_view cn = std::string_view(
d->name).substr(0, 3);
277 CMIcomponentNumber = (
d->name).substr(3, 2);
284 std::string_view cn = std::string_view(
d->name).substr(0, 2);
286 LbiComponent *lbic =
static_cast<LbiComponent *
>(
d);
288 lbic->associated_CMIsubtype = CMIcomponentNumber;
290 ATH_MSG_ERROR(
"MuonChamberLite :: cannot associate a CMI subtype to the LB component " );
296 if (
stName.compare(0, 1,
"B") == 0) {
297 mstat =
new MuonStation(
stName.substr(0, 3),
width, totthick,
length,
longWidth, totthick,
length, zi, fi + 1,
298 (zi < 0 && !is_mirrored));
300 mstat =
new MuonStation(
stName.substr(0, 3),
width,
length, totthick,
longWidth,
length, totthick, zi, fi + 1,
301 (zi < 0 && !is_mirrored));
304 manager->addMuonStation(std::unique_ptr<MuonStation>(mstat));
306 <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" is_mirrored " << is_mirrored);
309 mstat->setPhysVol(ptrd);
313 ATH_MSG_VERBOSE(
" Component index " <<
c->index <<
" in loop for " <<
stName <<
" " << stationType <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" cName "
314 <<
c->name <<
" thickness " <<
c->GetThickness(mysql) <<
" length " <<
c->dy <<
" w, lw " <<
c->dx1 <<
" " <<
c->dx2 );
315 ATH_MSG_VERBOSE(
" Component local (amdb) coords " <<
c->posx <<
" " <<
c->posy <<
" " <<
c->posz );
317 ypos = -
thickness / 2. +
c->posz +
c->GetThickness(mysql) / 2.;
321 ypos = -
thickness / 2. + (
c->posz + amdbOrigine_along_thickness) +
c->GetThickness(mysql) / 2.;
322 zpos = -
length / 2. + amdbOrigine_along_length +
c->posy +
c->dy / 2.;
325 const std::string &techname =
c->name;
326 std::string_view
type = std::string_view(techname).substr(0, 3);
330 GeoIntrusivePtr<GeoFullPhysVol> lvm{}, lvr{}, lvt{}, lvc{};
335 std::string statType =
stName.substr(0, 3);
336 double cthickness =
c->GetThickness(mysql);
338 std::vector<Cutout *> vcutdef;
339 std::vector<std::unique_ptr<Cutout>> vcutdef_todel;
342 cut->setThickness(cthickness * 1.01);
344 if ((
cut->subtype == mysql.allocPosFindSubtype(std::string(statType), fi, zi)) && (
cut->icut == mysql.allocPosFindCutout(std::string(statType), fi, zi)) && (
cut->ijob ==
c->index)) {
346 double tempdx =
cut->dx;
347 double tempdy =
cut->dy;
348 double templengthY =
cut->lengthY;
352 if (
stName.compare(0, 3,
"BOG") == 0) {
354 cut->lengthY = templengthY + 31.;
360 if (std::abs(
cut->dead1) > 1. && techname ==
"MDT03")
365 cut->lengthY = templengthY;
373 if (
stName.compare(0, 3,
"BMS") == 0) {
375 if (std::abs(zi) == 1) {
378 if (
type ==
"RPC" ||
type ==
"DED") {
379 cut->widthXl += 2 * margin;
380 cut->widthXs += 2 * margin;
382 cut->lengthY += 2 * margin;
397 if (
stName.compare(0, 3,
"BOS") == 0 && zi == -6 &&
type ==
"MDT") {
398 cut->dy =
c->dy -
cut->dy -
cut->lengthY - halfpitch;
400 if (techname ==
"MDT03")
409 if (
type ==
"MDT" && (is_mirrored || zi < 0) &&
stName.compare(0, 1,
"B") == 0) {
413 Cutout *cutmirr =
new Cutout(*
cut);
414 cutmirr->dx = -cutmirr->dx;
417 vcutdef.push_back(cutmirr);
418 vcutdef_todel.emplace_back(cutmirr);
419 ATH_MSG_VERBOSE(
"adding for application mirrored cut \n" << *cutmirr );
421 }
else if (
type ==
"RPC" ||
type ==
"DED") {
422 Cutout *cutRpcType =
new Cutout(*
cut);
424 if (
stName.compare(0, 3,
"BMS") == 0 && zi == 4 && (
c->index == 20 ||
c->index == 21 ||
c->index == 24 ||
c->index == 25)) {
425 cutRpcType->dy = 1102.5;
428 if (
stName.compare(0, 3,
"BOS") == 0 && zi == 6 &&
type ==
"DED")
429 cutRpcType->dy = 706.;
431 cutRpcType->dy = cutRpcType->dy -
c->posy;
432 cutRpcType->dx = cutRpcType->dx -
c->posx;
435 RpcComponent *
rp =
static_cast<RpcComponent *
>(
c);
436 if (
rp->iswap == -1) {
437 cutRpcType->dy =
c->dy - (cutRpcType->dy + cutRpcType->lengthY);
441 ATH_MSG_VERBOSE(
" Rpc or ded cutout redefined as follows \n" << *cutRpcType );
442 vcutdef.push_back(cutRpcType);
443 vcutdef_todel.emplace_back(cutRpcType);
444 }
else if (
type ==
"TGC") {
448 Cutout *tgccut =
new Cutout(*
cut);
449 tgccut->dy -=
c->posy;
452 vcutdef.push_back(tgccut);
453 vcutdef_todel.emplace_back(tgccut);
455 vcutdef.push_back(
cut);
461 ATH_MSG_DEBUG(
c->name <<
" of station " <<
stName <<
" at fi/zi " << fi + 1 <<
"/" << zi <<
" has " << ncutouts <<
" cutouts " );
465 GeoAlignableTransform *xfaligncomponent{
nullptr};
469 if (
stName.compare(0, 1,
"B") != 0 && is_mirrored)
470 mstat->setxAmdbCRO(-xpos);
472 mstat->setxAmdbCRO(xpos);
476 MdtComponent *md=
static_cast<MdtComponent *
> (
c);
477 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos) * GeoTrf::TranslateY3D(xpos);
479 if (zi < 0 && !is_mirrored &&
stName[0] ==
'B') {
482 htcomponent = htcomponent * GeoTrf::TranslateZ3D(halfpitch);
487 if (zi < 0 &&
stName.compare(0, 3,
"BOG") == 0 && is_mirrored) {
495 std::string
key =std::string(
stName) + techname;
500 bool mdtCutoutFlag = ((stname ==
"BOS" && std::abs(zi) == 6) || stname ==
"BMG" || techname ==
"MDT14" || (stname ==
"BMS" && (std::abs(zi) == 1 && fi == 3)) ||
501 (stname ==
"EMS" && (std::abs(zi) == 1 || std::abs(zi) == 3)));
502 if (((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
503 key +=
"p" +
buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) +
"_" +
buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
504 }
else if (((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG")) == 0) && zi < 0) {
505 key +=
"m" +
buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) +
"_" +
buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
508 std::unique_ptr<Mdt>
r = std::make_unique<Mdt>(mysql,
c,
stName + techname);
509 if ((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) {
510 if (!vcutdef.empty())
r->processCutouts(vcutdef);
516 }
else if (
type ==
"RPC") {
518 RpcComponent *
rp =
static_cast<RpcComponent *
>(
c);
519 int ndivy =
rp->ndivy;
520 int ndivz =
rp->ndivz;
522 if (ndivz != 1 || ndivy != 1) {
523 ATH_MSG_ERROR(
" RPC segmentation z,y " << ndivz <<
" " << ndivy );
526 double xpos =
c->posx;
532 <<
" RPC " << (
c->name).substr(3, 2) <<
" has swap flag = " <<
rp->iswap <<
" ypos, zpos " << ypos <<
" " << zpos <<
" " );
534 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
535 if (
rp->iswap == -1) {
541 bool rpcCutoutFlag = (stname ==
"BOS" && std::abs(zi) == 6) || (stname ==
"BMS" && (std::abs(zi) == 2 || std::abs(zi) == 4 || std::abs(zi) == 6)) ||
542 (stname ==
"BMS" && std::abs(zi) == 1 && fi == 3);
544 if (((
manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
545 key +=
"p" +
buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) +
"_" +
buildString(mysql.allocPosFindCutout(statType, fi, zi), 0) +
"_" +
547 }
else if (((
manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
548 key +=
"m" +
buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) +
"_" +
buildString(mysql.allocPosFindCutout(statType, fi, zi), 0) +
"_" +
553 }
else if (
type ==
"TGC") {
556 irad = tgInner->posy;
558 double orad = tgOuter->posy + tgOuter->dy;
559 double start = -(orad - irad) / 2. + (tg->posy - irad) + tg->dy / 2;
560 double xstart = -
thickness / 2. + tg->GetThickness(mysql) / 2.;
561 htcomponent = GeoTrf::TranslateX3D(xstart + tg->posz) * GeoTrf::TranslateZ3D(
start);
564 std::string
key = std::string(
stName) + techname;
565 if (
manager->IncludeCutoutsFlag()) {
566 if (mysql.allocPosFindCutout(statType, fi, zi) > 0) {
569 key +=
"p" +
buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) +
"_" +
buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
571 key +=
"m" +
buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) +
"_" +
buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
581 }
else if (
type ==
"CSC") {
582 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos);
584 std::string
key = std::string(
stName) + techname;
585 if (
manager->IncludeCutoutsFlag() && zi >= 0) {
586 key +=
"p" +
buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) +
"_" +
buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
587 }
else if (
manager->IncludeCutoutsFlag() && zi < 0) {
588 key +=
"m" +
buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) +
"_" +
buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
601 if (lvm &&
manager->mdtIdHelper()) {
612 std::unique_ptr<MdtReadoutElement>
det = std::make_unique<MdtReadoutElement>(lvm,
stName,
manager);
613 Position
ip = mysql.GetStationPosition(
stName.substr(0, 3), fi, zi);
615 det->setHasCutouts(ncutouts > 0);
616 det->setNMdtInStation(nMdt);
618 det->setIdentifier(
id);
619 det->setMultilayer(ml);
620 det->setParentStationPV(PVConstLink(ptrd));
621 det->setParentMuonStation(mstat);
626 mstat->setBlineFixedPointInAmdbLRS(
c->posx,
c->posy,
c->posz);
628 const Amg::Vector3D b0 = mstat->getBlineFixedPointInAmdbLRS();
629 if (
c->posy < b0.y())
630 mstat->setBlineFixedPointInAmdbLRS(b0.x(),
c->posy, b0.z());
633 int jobIndex =
c->index;
635 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
636 manager->addMdtReadoutElement(std::move(
det));
639 if (lvc &&
manager->cscIdHelper()) {
643 int chamberLayer = 1;
647 std::unique_ptr<CscReadoutElement>
det = std::make_unique<CscReadoutElement>(lvc,
stName,
manager);
648 Position
ip = mysql.GetStationPosition(
stName.substr(0, 3), fi, zi);
652 det->setHasCutouts(ncutouts > 0);
653 Identifier id = csc_id->
channelID(stationType, stationEta, stationPhi, chamberLayer, 1, 0, 1);
654 det->setIdentifier(
id);
656 det->setChamberLayer(chamberLayer);
657 det->setParentStationPV(PVConstLink(ptrd));
658 det->setParentMuonStation(mstat);
660 int jobIndex =
c->index;
662 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
667 manager->addCscReadoutElement(std::move(
det));
670 if (lvt &&
manager->tgcIdHelper()) {
672 ATH_MSG_DEBUG(
" Adding a TGC chamber to the tree zi,fi, is_mirrored " << zi <<
" " << fi + 1 <<
" " << is_mirrored );
677 ATH_MSG_VERBOSE(
"There's a TGC named " << techname <<
" of thickness " << tg->GetThickness(mysql) );
687 std::unique_ptr<TgcReadoutElement>
det = std::make_unique<TgcReadoutElement>(lvt,
stName,
manager);
688 Position
ip = mysql.GetStationPosition(
stName.substr(0, 3), fi, zi);
690 det->setHasCutouts(ncutouts > 0);
692 det->setIdentifier(
id);
693 det->setParentStationPV(PVConstLink(ptrd));
694 det->setParentMuonStation(mstat);
696 int jobIndex =
c->index;
698 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
700 manager->addTgcReadoutElement(std::move(
det));
703 RpcComponent *
rp =
static_cast<RpcComponent *
>(
c);
704 int ndivy =
rp->ndivy;
705 int ndivz =
rp->ndivz;
707 if (ndivz != 1 || ndivy != 1) {
708 ATH_MSG_ERROR(
" RPC segmentation z,y " << ndivz <<
" " << ndivy );
711 double zpos = -
length / 2. +
c->posy +
c->dy / 2.;
712 double xpos =
c->posx;
725 if (nRpc > 1 && nDoubletR == 2 && ypos > 0.)
730 if (stname.find(
"BI") != std::string::npos) {
731 if (stname.find(
"BIS") != std::string::npos) {
733 if (std::abs(stationEta)>= 7){
734 ATH_MSG_DEBUG(
"BIS78 station eta: "<<stationEta<<
" phi: "<<stationPhi<<
" dR: "<<
doubletR<<
" dZ:"<< doubletZ <<
" rp: "<<
rp->posz);
736 if (std::abs(stationEta) >= 7 &&
rp->posz > 80)
743 if (stname.find(
"BIL") != std::string::npos && std::abs(stationEta) < 7 && std::abs(stationEta) != 2 && std::abs(stationEta) != 5) {
750 if (zi <= 0 && !is_mirrored) {
778 if (zi < 0 && is_mirrored && doubletZ == 3) {
782 }
else if (zi < 0 && is_mirrored && doubletZ == 2 &&
doubletR == 1 &&
stName ==
"BMS6") {
792 int tag = doubletZ +
doubletR * 100 + dbphi * 1000;
805 std::unique_ptr<RpcReadoutElement>
det = std::make_unique<RpcReadoutElement>(lvr,
stName, zi, fi + 1, is_mirrored,
manager);
806 Position
ip = mysql.GetStationPosition(
stName.substr(0, 3), fi, zi);
808 det->setHasCutouts(ncutouts > 0);
810 det->setIdentifier(
id);
812 det->setDoubletZ(doubletZ);
814 if (
stName.find(
"BI") != std::string::npos)
815 det->setNumberOfLayers(3);
816 det->setParentStationPV(PVConstLink(ptrd));
817 det->setParentMuonStation(mstat);
819 int jobIndex =
c->index;
821 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
825 if (
stName.find(
"BI") != std::string::npos) {
826 std::map<std::string, float>::const_iterator yItr = rpcYTrans.find(techname);
827 if (yItr != rpcYTrans.end())
828 det->setYTranslation(yItr->second);
829 std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
830 if (zItr != rpcZTrans.end())
831 det->setZTranslation(zItr->second);
837 manager->addRpcReadoutElement(std::move(
det));
842 mstat->updateBlineFixedPointInAmdbLRS();