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 );
115 std::string stname(
m_station->GetName(), 0, 3);
117 double halfpitch =
m_station->mdtHalfPitch(mysql);
118 const std::string stName =
m_station->GetName();
120 const MdtIdHelper *mdt_id = manager->mdtIdHelper();
123 double extratop =
m_station->GetExtraTopThickness();
124 double extrabottom =
m_station->GetExtraBottomThickness();
125 double totthick =
thickness + extratop + extrabottom;
128 double amdbOrigine_along_length =
m_station->getAmdbOrigine_along_length();
129 double amdbOrigine_along_thickness =
m_station->getAmdbOrigine_along_thickness(mysql);
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;
163 for (
int j = 0; j <
m_station->GetNrOfComponents(); j++) {
167 for (
int ii = 0; ii <
m_station->GetNrOfCutouts(); ii++) {
173 if (std::abs(cut->dx - 600.7) < 0.1) {
174 cut->dx = cut->dx + 10. * Gaudi::Units::mm;
175 cut->widthXs = cut->widthXs + 20. * Gaudi::Units::mm;
176 cut->widthXl = cut->widthXl + 20. * Gaudi::Units::mm;
178 if (std::abs(cut->dx + 600.7) < 0.1) {
179 cut->dx = cut->dx - 10. * Gaudi::Units::mm;
180 cut->widthXs = cut->widthXs + 20. * Gaudi::Units::mm;
181 cut->widthXl = cut->widthXl + 20. * Gaudi::Units::mm;
183 if (std::abs(cut->lengthY - 180.2) < 0.001) {
184 cut->lengthY = cut->lengthY + (0.010) * Gaudi::Units::mm;
186 if (std::abs(cut->dy - 1019.8) < 0.001) {
187 cut->dy = 1216.4185 - cut->lengthY;
190 cut->setThickness(totthick * 1.01);
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 " );
214 for (
int j = 0; j <
m_station->GetNrOfComponents(); j++) {
216 std::string_view cn = std::string_view(d->name).substr(0, 3);
221 double depth = -
thickness / 2. + d->posz + d->GetThickness(mysql) / 2.;
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};
245 for (
int i = 0; i <
m_station->GetNrOfComponents(); i++) {
247 std::string_view cname = std::string_view(c->name).substr(0, 2);
251 LBpos[numLB] = c->posy + c->dy / 2.;
252 LBheight =
lb->height;
259 for (
int i = 0; i <
m_station->GetNrOfComponents(); i++) {
261 std::string_view cname = std::string_view(c->name).substr(0, 3);
262 if (cname ==
"CRO" || cname ==
"CMI" || cname ==
"CHV") {
272 std::string CMIcomponentNumber =
"";
273 for (
int j = 0; j <
m_station->GetNrOfComponents(); j++) {
275 std::string_view cn = std::string_view(d->name).substr(0, 3);
277 CMIcomponentNumber = (d->name).substr(3, 2);
282 for (
int j = 0; j <
m_station->GetNrOfComponents(); j++) {
284 std::string_view cn = std::string_view(d->name).substr(0, 2);
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);
308 GeoFullPhysVol *ptrd=(*m_mapFPV)[std::string(stName)+
"_Station"+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)];
311 for (
int i = 0; i <
m_station->GetNrOfComponents(); i++) {
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;
340 for (
int ii = 0; ii <
m_station->GetNrOfCutouts(); ii++) {
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")
361 cut->dy = cut->dy + 15.0 * cos(cut->dead1 * Gaudi::Units::deg);
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")
401 cut->dy = cut->dy + 30.0;
409 if (
type ==
"MDT" && (is_mirrored || zi < 0) && stName.compare(0, 1,
"B") == 0) {
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") {
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;
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") {
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 " );
464 GeoTrf::Transform3D htcomponent(GeoTrf::Transform3D::Identity());
465 GeoAlignableTransform *xfaligncomponent{
nullptr};
469 if (stName.compare(0, 1,
"B") != 0 && is_mirrored)
477 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos) * GeoTrf::TranslateY3D(xpos);
479 if (zi < 0 && !is_mirrored && stName[0] ==
'B') {
481 htcomponent = htcomponent * GeoTrf::RotateX3D(180. * Gaudi::Units::deg);
482 htcomponent = htcomponent * GeoTrf::TranslateZ3D(halfpitch);
487 if (zi < 0 && stName.compare(0, 3,
"BOG") == 0 && is_mirrored) {
492 htcomponent = GeoTrf::RotateX3D(180. * Gaudi::Units::deg) * htcomponent * GeoTrf::RotateX3D(180. * Gaudi::Units::deg);
495 std::string key =std::string( stName) + techname;
496 xfaligncomponent = (*m_mapAXF)[key+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)+
"_"+std::to_string(md->
index)];
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) {
504 }
else if (((manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG")) == 0) && 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);
514 lvm = (*m_mapFPV)[key+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)+
"_"+std::to_string(md->
index)];
516 }
else if (
type ==
"RPC") {
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;
531 ATH_MSG_VERBOSE(
" In station " << stName <<
" with " << nDoubletR <<
" doubletR,"
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) {
536 htcomponent = htcomponent * GeoTrf::RotateY3D(180 * Gaudi::Units::deg);
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);
543 std::string key = stName + techname;
544 if (((manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
547 }
else if (((manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
551 xfaligncomponent = (*m_mapAXF)[key+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)+
"_"+std::to_string(
rp->index)];
552 lvr = (*m_mapFPV)[key+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)+
"_"+std::to_string(
rp->index)];
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;
561 htcomponent = GeoTrf::TranslateX3D(xstart + tg->
posz) * GeoTrf::TranslateZ3D(start);
564 std::string key = std::string(stName) + techname;
565 if (manager->IncludeCutoutsFlag()) {
576 key += std::to_string(
int(10 * c->dx1));
577 xfaligncomponent = (*m_mapAXF)[key+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)];
579 lvt = (*m_mapFPV)[key+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)];
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) {
587 }
else if (manager->IncludeCutoutsFlag() && zi < 0) {
591 xfaligncomponent = (*m_mapAXF)[key+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)];
592 lvc=(*m_mapFPV)[key+
"_"+std::to_string(zi)+
"_"+std::to_string(fi)];
601 if (lvm && manager->mdtIdHelper()) {
603 int stationPhi = fi + 1;
611 const MdtIdHelper *mdt_id = manager->mdtIdHelper();
612 std::unique_ptr<MdtReadoutElement> det = std::make_unique<MdtReadoutElement>(lvm, stName, manager);
615 det->setHasCutouts(ncutouts > 0);
616 det->setNMdtInStation(nMdt);
618 det->setIdentifier(
id);
619 det->setMultilayer(ml);
620 det->setParentMuonStation(mstat);
628 if (c->posy < b0.y())
632 int jobIndex = c->index;
635 manager->addMdtReadoutElement(std::move(det));
638 if (lvc && manager->cscIdHelper()) {
641 int stationPhi = fi + 1;
642 int chamberLayer = 1;
646 std::unique_ptr<CscReadoutElement> det = std::make_unique<CscReadoutElement>(lvc, stName, manager);
650 const CscIdHelper *csc_id = manager->cscIdHelper();
651 det->setHasCutouts(ncutouts > 0);
652 Identifier id = csc_id->
channelID(stationType, stationEta, stationPhi, chamberLayer, 1, 0, 1);
653 det->setIdentifier(
id);
655 det->setChamberLayer(chamberLayer);
656 det->setParentMuonStation(mstat);
658 int jobIndex = c->index;
665 manager->addCscReadoutElement(std::move(det));
668 if (lvt && manager->tgcIdHelper()) {
670 ATH_MSG_DEBUG(
" Adding a TGC chamber to the tree zi,fi, is_mirrored " << zi <<
" " << fi + 1 <<
" " << is_mirrored );
677 const TgcIdHelper *tgc_id = manager->tgcIdHelper();
679 stationEta = tg->
index;
681 stationEta = -stationEta;
685 std::unique_ptr<TgcReadoutElement> det = std::make_unique<TgcReadoutElement>(lvt, stName, manager);
688 det->setHasCutouts(ncutouts > 0);
690 det->setIdentifier(
id);
691 det->setParentMuonStation(mstat);
693 int jobIndex = c->index;
697 manager->addTgcReadoutElement(std::move(det));
699 if (lvr &&
RPCON && manager->rpcIdHelper()) {
701 int ndivy =
rp->ndivy;
702 int ndivz =
rp->ndivz;
704 if (ndivz != 1 || ndivy != 1) {
705 ATH_MSG_ERROR(
" RPC segmentation z,y " << ndivz <<
" " << ndivy );
708 double zpos = -
length / 2. + c->posy + c->dy / 2.;
709 double xpos = c->posx;
716 const RpcIdHelper *rpc_id = manager->rpcIdHelper();
718 int stationPhi = fi + 1;
722 if (nRpc > 1 && nDoubletR == 2 && ypos > 0.)
724 ndbz[doubletR - 1]++;
727 if (stname.find(
"BI") != std::string::npos) {
728 if (stname.find(
"BIS") != std::string::npos) {
730 if (std::abs(stationEta)>= 7){
731 ATH_MSG_DEBUG(
"BIS78 station eta: "<<stationEta<<
" phi: "<<stationPhi<<
" dR: "<<doubletR<<
" dZ:"<< doubletZ <<
" rp: "<<
rp->posz);
733 if (std::abs(stationEta) >= 7 &&
rp->posz > 80)
740 if (stname.find(
"BIL") != std::string::npos && std::abs(stationEta) < 7 && std::abs(stationEta) != 2 && std::abs(stationEta) != 5) {
747 if (zi <= 0 && !is_mirrored) {
748 if (zpos < -100 * Gaudi::Units::mm)
751 if (zpos > 100 * Gaudi::Units::mm)
757 if (std::abs(xpos) > 100. * Gaudi::Units::mm) {
758 if (ndbz[doubletR - 1] > 2) {
761 ndbz[doubletR - 1]--;
770 if (xpos > 400. * Gaudi::Units::mm)
773 int doubletPhi = dbphi;
775 if (zi < 0 && is_mirrored && doubletZ == 3) {
779 }
else if (zi < 0 && is_mirrored && doubletZ == 2 && doubletR == 1 && stName ==
"BMS6") {
789 int tag = doubletZ + doubletR * 100 + dbphi * 1000;
795 int tag =
rp->index + doubletR * 100 + dbphi * 1000;
802 std::unique_ptr<RpcReadoutElement> det = std::make_unique<RpcReadoutElement>(lvr, stName, zi, fi + 1, is_mirrored, manager);
805 det->setHasCutouts(ncutouts > 0);
806 Identifier id = rpc_id->
channelID(stationType, stationEta, stationPhi, doubletR, doubletZ, doubletPhi, gasGap, measuresPhi,
strip);
807 det->setIdentifier(
id);
808 det->setDoubletR(doubletR);
809 det->setDoubletZ(doubletZ);
810 det->setDoubletPhi(doubletPhi);
811 if (stName.find(
"BI") != std::string::npos)
812 det->setNumberOfLayers(3);
813 det->setParentMuonStation(mstat);
815 int jobIndex = c->index;
821 if (stName.find(
"BI") != std::string::npos) {
822 std::map<std::string, float>::const_iterator yItr = rpcYTrans.find(techname);
823 if (yItr != rpcYTrans.end())
824 det->setYTranslation(yItr->second);
825 std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
826 if (zItr != rpcZTrans.end())
827 det->setZTranslation(zItr->second);
833 manager->addRpcReadoutElement(std::move(det));