111 {
112 ATH_MSG_VERBOSE(
" Building a MuonChamber for m_station " <<
m_station->GetName() <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" is_mirrored " << is_mirrored
113 << " is assembly = " << isAssembly );
114
115 std::string stname(
m_station->GetName(), 0, 3);
116
117 double halfpitch =
m_station->mdtHalfPitch(mysql);
119
120 const MdtIdHelper *mdt_id =
manager->mdtIdHelper();
122 bool is_barrel = (
stName.compare(0, 1,
"B") == 0);
123
124 std::string geometry_version =
manager->geometryVersion();
125 double extratop =
m_station->GetExtraTopThickness();
126 double extrabottom =
m_station->GetExtraBottomThickness();
127 double totthick =
thickness + extratop + extrabottom;
128
129 GeoTrd *maintrd;
131
134 }
135
137
138 const GeoShape *strd = nullptr;
140 if ((extratop + extrabottom) != 0.) {
141
142 dx = extratop / 2. - extrabottom / 2.;
143
144 ATH_MSG_VERBOSE(
" m_station name " <<
m_station->GetName() <<
" extra top, bottom, dx = " << extratop <<
" " << extrabottom );
145 strd = &((*maintrd) << GeoTrf::Translate3D(dx, 0., 0.));
146 } else {
147 strd = maintrd;
148 }
149
150 double amdbOrigine_along_length =
m_station->getAmdbOrigine_along_length();
151 double amdbOrigine_along_thickness =
m_station->getAmdbOrigine_along_thickness(mysql);
152
153
154 if (stname == "CSS") {
155 StandardComponent *
comp =
nullptr;
156 double clen = 0;
157 double cthick = 0;
158 double cypos = 0;
159 double cxpos = 0;
160 for (
int i = 0;
i <
m_station->GetNrOfComponents();
i++) {
161 comp =
static_cast<StandardComponent *
>(
m_station->GetComponent(i));
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;
167 break;
168 }
169 }
170 GeoIntrusivePtr<GeoShape> box{
new GeoBox(cthick / 2.,
longWidth / 2., (
length - clen) / 2.)};
171 strd = &(strd->subtract((*box) << GeoTrf::Translate3D(cxpos, 0., cypos)));
172 }
173
175
176
177
178 if ((stname == "BMS" && std::abs(zi) == 5) || (stname == "BMS" && std::abs(zi) == 1 && fi != 3)) {
179 StandardComponent *
comp =
nullptr;
180 double cutlen = 0.;
181 double cutthick = 0.;
182 double top_edge = 0.;
183 for (
int i =
m_station->GetNrOfComponents() - 2; i > -1; i--) {
184 comp =
static_cast<StandardComponent *
>(
m_station->GetComponent(i));
186 cutlen =
length - top_edge;
187 if ((
comp->posy != 0 && cutlen > 0.1) ||
comp->dy > 0.75 *
length) {
188 cutthick =
comp->GetThickness(mysql) + 1.;
189 break;
190 }
191 }
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.)));
194 }
195 }
196
197
198 if (!isAssembly) {
199 bool testEIL = (stname == "EIL" && std::abs(zi) != 1 && (std::abs(zi) != 4 || fi == 0 || fi == 4));
200
201 if ((
m_enableFineClashFixing && (stname ==
"BML" || stname ==
"BIL" || stname ==
"BOL" || stname ==
"BMS" || stname ==
"BIS" || stname ==
"BOS")) || testEIL) {
202 double root3 = 1.7320508;
203 StandardComponent *
comp =
nullptr;
204 double mdt_half_thick = -1.;
205 double mdt_pos = 0.;
206 double xtube1 = 0;
207 double xtube2 = 0;
208
210 int mdt_index[4] = {0, 0, 0, 0};
211 for (
int i = 0;
i <
m_station->GetNrOfComponents();
i++) {
212 comp =
static_cast<StandardComponent *
>(
m_station->GetComponent(i));
213 if (
comp->name.compare(0,3,
"MDT") == 0) {
216 }
217 }
218
219
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.)};
222 frontcyl = &((*frontcyl) << GeoTrf::RotateX3D(90. * Gaudi::Units::deg));
223 GeoIntrusivePtr<const GeoShape> backcyl{
new GeoTube(0.0, halfpitch - 0.001, (
longWidth + 2.) / 2.)};
224 backcyl = &((*backcyl) << GeoTrf::RotateX3D(90. * Gaudi::Units::deg));
225
226 if (index > 0) {
227
228 strd = &(strd->subtract((*box) << GeoTrf::Translate3D(0., 0.,
length / 2.)));
230 for (
int i = 0;
i <
index;
i++) {
231 comp =
static_cast<StandardComponent *
>(
m_station->GetComponent(mdt_index[i]));
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.)));
239
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.)));
243 }
244
246 }
247 }
248 if (stname != "EIL") {
249 if (zi < 0 && !is_mirrored)
250 strd = &((*strd) << GeoTrf::RotateX3D(180. * Gaudi::Units::deg));
251 }
252
253 }
254 }
255
256
257
258 if (zi < 0 && !is_mirrored && stName[0] == 'B') {
260 amdbOrigine_along_length += halfpitch;
261 }
262 }
263 ATH_MSG_VERBOSE(
"amdb origine: in the length direction = " << amdbOrigine_along_length
264 << " in the thickness direction = " << amdbOrigine_along_thickness);
265
266 if (isAssembly) {
267 ATH_MSG_DEBUG(
"Station " << stName <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" will be described as Assembly" );
268 }
269
270
271
272
273
274
275 if (
stName.compare(0, 3,
"BOG") == 0 && (
manager->IncludeCutoutsBogFlag() ||
manager->IncludeCutoutsFlag())) {
276
277 ATH_MSG_VERBOSE(
"amdb org: length= " << amdbOrigine_along_length <<
" thickness= " << amdbOrigine_along_thickness );
278
279 std::string statType =
stName.substr(0, 3);
281 ATH_MSG_DEBUG(
"Station " << stName <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" has components with cutouts " );
282 isAssembly = true;
283
284
285 bool foundCutouts = false;
286 for (
int j = 0; j <
m_station->GetNrOfComponents(); j++) {
287 StandardComponent *
c =
static_cast<StandardComponent *
>(
m_station->GetComponent(j));
288
289 if (!foundCutouts) {
290 for (
int ii = 0; ii <
m_station->GetNrOfCutouts(); ii++) {
292
293
294
295
296 if (std::abs(
cut->dx - 600.7) < 0.1) {
297 cut->dx =
cut->dx + 10. * Gaudi::Units::mm;
298 cut->widthXs =
cut->widthXs + 20. * Gaudi::Units::mm;
299 cut->widthXl =
cut->widthXl + 20. * Gaudi::Units::mm;
300 }
301 if (std::abs(
cut->dx + 600.7) < 0.1) {
302 cut->dx =
cut->dx - 10. * Gaudi::Units::mm;
303 cut->widthXs =
cut->widthXs + 20. * Gaudi::Units::mm;
304 cut->widthXl =
cut->widthXl + 20. * Gaudi::Units::mm;
305 }
306 if (std::abs(
cut->lengthY - 180.2) < 0.001) {
307 cut->lengthY =
cut->lengthY + (0.010) * Gaudi::Units::mm;
308 }
309 if (std::abs(
cut->dy - 1019.8) < 0.001) {
310 cut->dy = 1216.4185 -
cut->lengthY;
311 }
312
313 cut->setThickness(totthick * 1.01);
315 (
cut->ijob ==
c->index)) {
316
317 foundCutouts = true;
318 }
319 }
320 }
321 }
322 }
323 }
324
325
326
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.)));
330 }
331
332 const GeoMaterial *mtrd = nullptr;
335 } else {
337 }
338 GeoLogVol *ltrd = new GeoLogVol(std::string(stName) + "_Station", strd, mtrd);
339 PVLink ptrd = new GeoPhysVol(ltrd);
340
341 double ypos{0.}, zpos{0.}, xpos{0.}, irad{0.};
342 std::array<int, 2> ndbz{0, 0};
343
344
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 " );
348
349 for (
int j = 0; j <
m_station->GetNrOfComponents(); j++) {
350 StandardComponent *
d =
static_cast<StandardComponent *
>(
m_station->GetComponent(j));
351 std::string_view cn = std::string_view(
d->name).substr(0, 3);
352 if (cn == "RPC") {
353 nRpc++;
354 if (nRpc == 1)
355 nDoubletR++;
357
358
359
360 if (!(stname.compare(0, 2,
"BI") == 0) && nDoubletR == 1 && nRpc > 1 &&
depth * previous_depth < 0)
361 nDoubletR++;
362
363
364 previous_depth =
depth;
365 }
366 if (cn == "CSC") {
367 nCsc++;
368 }
369 if (cn == "TGC") {
370 nTgc++;
371 }
372 if (cn == "MDT") {
373 nMdt++;
374 }
375 }
376 ATH_MSG_DEBUG(
" " << nDoubletR<<
" nMdt/Rpc/Tgc/Csc " << nMdt <<
"/" << nRpc <<
"/" << nTgc <<
"/" << nCsc );
377
378
379
380 int numLB = -1;
381 double LBheight{0.}, LBwidth{0.}, LByShift{0.};
382 std::array<double, 2> LBpos{-1, -1};
383 for (
int i = 0;
i <
m_station->GetNrOfComponents();
i++) {
384 StandardComponent *
c =
static_cast<StandardComponent *
>(
m_station->GetComponent(i));
385 std::string_view
cname = std::string_view(
c->name).substr(0, 2);
386 if (cname == "LB") {
388 LByShift =
lb->yShift;
389
390 numLB++;
391 LBpos[numLB] =
c->posy +
c->dy / 2.;
392 LBheight =
lb->height;
394 }
395 if (numLB > 0)
396 break;
397 }
398
399 for (
int i = 0;
i <
m_station->GetNrOfComponents();
i++) {
400 StandardComponent *
c =
static_cast<StandardComponent *
>(
m_station->GetComponent(i));
401 std::string_view
cname = std::string_view(
c->name).substr(0, 3);
402 if (cname == "CRO" || cname == "CMI" || cname == "CHV") {
403 CbmComponent *ccbm =
static_cast<CbmComponent *
>(
c);
404 ccbm->lb_height = LBheight;
405 ccbm->lb_width = LBwidth;
406 ccbm->hole_pos1 = LBpos[0];
407 ccbm->hole_pos2 = LBpos[1];
408 }
409 }
410
411
412 std::string CMIcomponentNumber = "";
413 for (
int j = 0; j <
m_station->GetNrOfComponents(); j++) {
414 StandardComponent *
d =
static_cast<StandardComponent *
>(
m_station->GetComponent(j));
415 std::string_view cn = std::string_view(
d->name).substr(0, 3);
416 if (cn == "CMI") {
417 CMIcomponentNumber = (
d->name).substr(3, 2);
418 break;
419 }
420 }
421
422 for (
int j = 0; j <
m_station->GetNrOfComponents(); j++) {
423 StandardComponent *
d =
static_cast<StandardComponent *
>(
m_station->GetComponent(j));
424 std::string_view cn = std::string_view(
d->name).substr(0, 2);
425 if (cn == "LB") {
426 LbiComponent *lbic =
static_cast<LbiComponent *
>(
d);
427 if (lbic) {
428 lbic->associated_CMIsubtype = CMIcomponentNumber;
429 } else
430 ATH_MSG_ERROR(
"MuonChamber :: cannot associate a CMI subtype to the LB component " );
431 }
432 }
433
434
435 MuonStation *mstat{nullptr};
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));
439 } else {
440 mstat =
new MuonStation(
stName.substr(0, 3),
width,
length, totthick,
longWidth,
length, totthick, zi, fi + 1,
441 (zi < 0 && !is_mirrored));
442 }
443 mstat->setPhysVol(ptrd);
444 manager->addMuonStation(std::unique_ptr<MuonStation>(mstat));
445 ATH_MSG_DEBUG(
" Building a MuonStation for this MuonChamber "
446 <<
m_station->GetName() <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" is_mirrored " << is_mirrored);
447
448
449
450 for (
int i = 0;
i <
m_station->GetNrOfComponents();
i++) {
451 StandardComponent *
c =
static_cast<StandardComponent *
>(
m_station->GetComponent(i));
452 ATH_MSG_VERBOSE(
" Component index " <<
c->index <<
" in loop for " << stName <<
" " << stationType <<
" at zi, fi " << zi <<
" " << fi + 1 <<
" cName "
453 <<
c->name <<
" thickness " <<
c->GetThickness(mysql) <<
" length " <<
c->dy <<
" w, lw " <<
c->dx1 <<
" " <<
c->dx2 );
454 ATH_MSG_VERBOSE(
" Component local (amdb) coords " <<
c->posx <<
" " <<
c->posy <<
" " <<
c->posz );
455
456 ypos = -
thickness / 2. +
c->posz +
c->GetThickness(mysql) / 2.;
457 zpos = 0.;
458 xpos = 0.;
459
460 ypos = -
thickness / 2. + (
c->posz + amdbOrigine_along_thickness) +
c->GetThickness(mysql) / 2.;
461 zpos = -
length / 2. + amdbOrigine_along_length +
c->posy +
c->dy / 2.;
463
464 const std::string &techname =
c->name;
465 std::string_view
type = std::string_view(techname).substr(0, 3);
466
467 PVLink lv{}, lvd{}, lvs{}, lvo{};
468 GeoIntrusivePtr<GeoFullPhysVol> lvm{}, lvr{}, lvt{}, lvc{};
469
470 double BeamHeight{0.};
471
472
473 std::string statType =
stName.substr(0, 3);
474 double cthickness =
c->GetThickness(mysql);
475 int ncutouts = 0;
476 std::vector<Cutout *> vcutdef;
477 std::vector<std::unique_ptr<Cutout>> vcutdef_todel;
478 for (
int ii = 0; ii <
m_station->GetNrOfCutouts(); ii++) {
480 cut->setThickness(cthickness * 1.01);
481
483
484 double tempdx =
cut->dx;
485 double tempdy =
cut->dy;
486 double templengthY =
cut->lengthY;
489
490 if (
stName.compare(0, 3,
"BOG") == 0) {
491
492 cut->lengthY = templengthY + 31.;
493 }
494
497
498 if (std::abs(
cut->dead1) > 1. && techname ==
"MDT03")
499 cut->dy =
cut->dy + 15.0 *
cos(
cut->dead1 * Gaudi::Units::deg);
500
501
502
503 cut->lengthY = templengthY;
504
505
506
507
508
509
510
511
512
513 ncutouts++;
516
517
518 if (
stName.compare(0, 3,
"BMS") == 0) {
519 if (fi == 3) {
520 if (std::abs(zi) == 1) {
521 double margin = 1.0;
522
523 if (type == "RPC" || type == "DED") {
524 cut->widthXl += 2 * margin;
525 cut->widthXs += 2 * margin;
527 cut->lengthY += 2 * margin;
528
529 if (zi > 0)
531 }
532 }
533
534 if (zi == -1) {
535 if (type == "MDT")
537 }
538 }
539 }
540
541
542 if (
stName.compare(0, 3,
"BOS") == 0 && zi == -6 && type ==
"MDT") {
543 cut->dy =
c->dy -
cut->dy -
cut->lengthY - halfpitch;
545 if (techname == "MDT03")
547
549
550 }
551
552
553
554
555 if (type ==
"MDT" && (is_mirrored || zi < 0) &&
stName.compare(0, 1,
"B") == 0) {
556
557
558
559 Cutout *cutmirr = new Cutout(*cut);
560 cutmirr->dx = -cutmirr->dx;
561
562
563 vcutdef.push_back(cutmirr);
564 vcutdef_todel.emplace_back(cutmirr);
565 ATH_MSG_VERBOSE(
"adding for application mirrored cut \n" << *cutmirr );
566
567 } else if (type == "RPC" || type == "DED") {
568 Cutout *cutRpcType = new Cutout(*cut);
569
570 if (
stName.compare(0, 3,
"BMS") == 0 && zi == 4 && (
c->index == 20 ||
c->index == 21 ||
c->index == 24 ||
c->index == 25)) {
571 cutRpcType->dy = 1102.5;
572 }
573
574 if (
stName.compare(0, 3,
"BOS") == 0 && zi == 6 && type ==
"DED")
575 cutRpcType->dy = 706.;
576
577 cutRpcType->dy = cutRpcType->dy -
c->posy;
578 cutRpcType->dx = cutRpcType->dx -
c->posx;
579
580 if (type == "RPC") {
581 RpcComponent *
rp =
static_cast<RpcComponent *
>(
c);
582 if (
rp->iswap == -1) {
583 cutRpcType->dy =
c->dy - (cutRpcType->dy + cutRpcType->lengthY);
584 }
585 }
586
587 ATH_MSG_VERBOSE(
" Rpc or ded cutout redefined as follows \n" << *cutRpcType );
588 vcutdef.push_back(cutRpcType);
589 vcutdef_todel.emplace_back(cutRpcType);
590 } else if (type == "TGC") {
591
592
593
594 Cutout *tgccut = new Cutout(*cut);
595 tgccut->dy -=
c->posy;
596
598 vcutdef.push_back(tgccut);
599 vcutdef_todel.emplace_back(tgccut);
600 } else {
601 vcutdef.push_back(cut);
602 }
603 }
604 }
605
606 if (ncutouts > 0) {
607 ATH_MSG_DEBUG(
c->name <<
" of station " << stName <<
" at fi/zi " << fi + 1 <<
"/" << zi <<
" has " << ncutouts <<
" cutouts " );
608
609 }
610
611 GeoTrf::Transform3D htcomponent(GeoTrf::Transform3D::Identity());
612 GeoTransform *xfcomponent{nullptr};
613 GeoAlignableTransform *xfaligncomponent{nullptr};
614
615
616 if (type == "CRO") {
617 if (
stName.compare(0, 1,
"B") != 0 && is_mirrored)
618 mstat->setxAmdbCRO(-xpos);
619 else
620 mstat->setxAmdbCRO(xpos);
621 }
622
623 if (type == "MDT") {
624 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos) * GeoTrf::TranslateY3D(xpos);
625
626 if (zi < 0 && !is_mirrored && stName[0] == 'B') {
627
628 htcomponent = htcomponent * GeoTrf::RotateX3D(180. * Gaudi::Units::deg);
629 htcomponent = htcomponent * GeoTrf::TranslateZ3D(halfpitch);
630 }
631
632
633
634 if (zi < 0 &&
stName.compare(0, 3,
"BOG") == 0 && is_mirrored) {
635
636
637
638
639 htcomponent = GeoTrf::RotateX3D(180. * Gaudi::Units::deg) * htcomponent * GeoTrf::RotateX3D(180. * Gaudi::Units::deg);
640 }
641
642 xfaligncomponent = new GeoAlignableTransform(htcomponent);
643 std::string
key =std::string( stName) + techname;
644
645
646
647 bool mdtCutoutFlag = ((stname == "BOS" && std::abs(zi) == 6) || stname == "BMG" || techname == "MDT14" || (stname == "BMS" && (std::abs(zi) == 1 && fi == 3)) ||
648 (stname == "EMS" && (std::abs(zi) == 1 || std::abs(zi) == 3)));
649 if (((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
651 }
else if (((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG")) == 0) && zi < 0) {
653 }
654
655 GeoVPhysVol *fpv =
m_FPVMAP->GetDetector(key);
656 if (fpv == nullptr) {
657 std::unique_ptr<Mdt>
r = std::make_unique<Mdt>(mysql, c, stName + techname);
658 ATH_MSG_DEBUG(
" Building an MDT for station " << key <<
" component name is " <<
c->name <<
659 " stName "<<stName<<" techName: "<<techname<< " manager->IncludeCutoutsFlag() "
660 <<
manager->IncludeCutoutsFlag() <<
" manager->IncludeCutoutsBogFlag() " <<
manager->IncludeCutoutsBogFlag() );
661
662
663 if ((
manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) {
664 lvm =
r->build(matManager, mysql, vcutdef);
665 } else {
666 lvm =
r->build(matManager, mysql);
667 }
669 } else {
670 GeoFullPhysVol *rfpv = static_cast<GeoFullPhysVol *>(fpv);
671 ATH_MSG_VERBOSE(
" This MDT for station " << key <<
" component name is " <<
c->name <<
" already exists; clone it " );
672 lvm = rfpv->clone();
673 }
674
675 }
else if (type ==
"SPA" &&
manager->MinimalGeoFlag() == 0) {
676 if (techname ==
"SPA01" &&
stName.compare(0, 1,
"C") == 0) {
677 ATH_MSG_DEBUG(
"Ficticious spacer SPA01 in CSC chamber - skip it " );
678
679
680 continue;
681 }
682
683 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos);
684 xfcomponent = new GeoTransform(htcomponent);
685 std::string
key = std::string(stName) + techname;
686 if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
688 }
else if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
690 }
691
692 GeoVPhysVol *fpv =
m_FPVMAP->GetDetector(key);
693 if (fpv == nullptr) {
694 std::unique_ptr<Spacer>
r = std::make_unique<Spacer>(mysql, c);
695 ATH_MSG_DEBUG(
" Building a SPA for m_station "<< key <<
" component name is " <<
c->name );
696 if (
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) {
697 lv =
r->build(matManager, 1);
698 } else {
699 lv =
r->build(matManager);
700 }
703 } else {
704 lv = fpv;
705 }
706 }
else if ((type ==
"CHV" || type ==
"CRO" || type ==
"CMI" || type ==
"LB0" || type ==
"LBI") &&
manager->MinimalGeoFlag() == 0) {
707 std::unique_ptr<SpacerBeam>
r = std::make_unique<SpacerBeam>(mysql, c);
708 BeamHeight =
r->height;
710 double xpos = (
c->posz + amdbOrigine_along_thickness) -
thickness / 2. + BeamHeight / 2.;
711 if (
type.compare(0, 2,
"LB") == 0)
712 xpos -= LByShift;
713
715 if (std::abs(
c->excent) > 0.001) {
719 }
720
721
722
723 if (type == "LB0") {
724 if (stName == "EML1" || stName == "EML6") {
725 if ((
c->dx1 >
width) && zpos < 0.) {
727 }
728 if ((
c->dx1 /
longWidth) > 0.98 && zpos > 0.) {
731 }
732 }
733 }
734
735 if (type == "CMI" || type == "CHV" || type == "CRO") {
736
737 if (stname == "BOL" && zi == 1 && (fi + 1) == 3) {
738 r->length =
length - halfpitch;
739 zpos = -halfpitch / 2.;
740 }
741 }
742
743 if (!is_mirrored) {
744 htcomponent = GeoTrf::Translate3D(xpos, ypos, zpos) * GeoTrf::RotateX3D(
angle);
745 } else {
746 htcomponent = GeoTrf::Translate3D(xpos, -ypos, zpos) * GeoTrf::RotateX3D(-
angle);
747 }
748 xfcomponent = new GeoTransform(htcomponent);
749
751 if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
753 }
else if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
755 }
756
757 if (
type.substr(0, 2) ==
"LB")
759
760 ATH_MSG_DEBUG(
" Building a SpacerBeam for m_station "<< key <<
" component name is "<<
c->name );
761 GeoVPhysVol *fpv =
m_FPVMAP->GetDetector(key);
762 if (fpv ==
nullptr || (
stName.compare(0, 3,
"BOG") == 0 && type ==
"CMI")) {
763 if (
stName.compare(0, 3,
"BOG") == 0) {
764 ATH_MSG_VERBOSE(
" Building a SpacerBeam for station " << key <<
" component name is " <<
c->name );
765 }
766 if (
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) {
767 lvo =
r->build(matManager, 1, is_barrel);
768 } else {
769 lvo =
r->build(matManager, is_barrel);
770 }
772
773
774
775 } else {
776 if (
stName.compare(0, 3,
"BOG") == 0)
777 ATH_MSG_VERBOSE(
" This spacerbeam for station " << key <<
" component name is " <<
c->name <<
" already exists; re-use it " );
778 lvo = fpv;
779 }
780
781 } else if (type == "RPC") {
782
783 RpcComponent *
rp =
static_cast<RpcComponent *
>(
c);
784 int ndivy =
rp->ndivy;
785 int ndivz =
rp->ndivz;
786
787 if (ndivz != 1 || ndivy != 1) {
788 ATH_MSG_ERROR(
" RPC segmentation z,y " << ndivz <<
" " << ndivy );
789 }
790
791 double xpos =
c->posx;
792
793 if (is_mirrored)
794 xpos = -xpos;
795
796 ATH_MSG_VERBOSE(
" In station " << stName <<
" with " << nDoubletR <<
" doubletR,"
797 <<
" RPC " << (
c->name).substr(3, 2) <<
" has swap flag = " <<
rp->iswap <<
" ypos, zpos " << ypos <<
" " << zpos <<
" " );
798
799 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
800 if (
rp->iswap == -1) {
801 htcomponent = htcomponent * GeoTrf::RotateY3D(180 * Gaudi::Units::deg);
802 }
803 xfaligncomponent = new GeoAlignableTransform(htcomponent);
804
805
806
807 bool rpcCutoutFlag = (stname == "BOS" && std::abs(zi) == 6) || (stname == "BMS" && (std::abs(zi) == 2 || std::abs(zi) == 4 || std::abs(zi) == 6)) ||
808 (stname == "BMS" && std::abs(zi) == 1 && fi == 3);
810 if (((
manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
813 }
else if (((
manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
816 }
817 PVLink fpv =
m_FPVMAP->GetDetector(key);
818 if (fpv == nullptr) {
819 std::unique_ptr<Rpc>
r = std::make_unique<Rpc>(mysql, c);
820 r->setLogVolName(std::string(stName) + techname);
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 r->y_translation = yItr->second;
825 std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
826 if (zItr != rpcZTrans.end())
827 r->z_translation = zItr->second;
828 }
829
830 if ((
manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) {
831 lvr =
r->build(matManager, mysql,
manager->MinimalGeoFlag(), 1, vcutdef);
832 } else {
833 lvr =
r->build(matManager, mysql,
manager->MinimalGeoFlag());
834 }
835
837 } else {
838 auto rfpv = dynamic_pointer_cast<GeoFullPhysVol>(fpv);
839 lvr = rfpv->clone();
840 }
841
842 }
else if (type ==
"DED" &&
manager->MinimalGeoFlag() == 0) {
843 double xpos =
c->posx;
844 if (is_mirrored)
845 xpos = -xpos;
846 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
847
848 xfcomponent = new GeoTransform(htcomponent);
849
850 bool dedCutoutFlag = (stname == "BOS" && std::abs(zi) == 6) || (stname == "BMS" && (std::abs(zi) == 2 || std::abs(zi) == 4 || std::abs(zi) == 6)) ||
851 (stname == "BMS" && std::abs(zi) == 1 && fi == 3);
852 std::string
key = std::string(stName) + techname;
853 if (((
manager->IncludeCutoutsFlag() && dedCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
856 }
else if (((
manager->IncludeCutoutsFlag() && dedCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
859 }
861 PVLink fpv =
m_FPVMAP->GetDetector(key);
862
863 if (fpv == nullptr) {
864 std::unique_ptr<Ded>
r = std::make_unique<Ded>(mysql, c);
865 ATH_MSG_VERBOSE(
" Building a DED for station " << key <<
" component name is " <<
c->name );
866 if ((
manager->IncludeCutoutsFlag() && dedCutoutFlag) || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) {
867 lvd =
r->build(matManager, mysql, 1, vcutdef);
868 } else {
869 lvd =
r->build(matManager, mysql);
870 }
871
873 } else {
874 lvd = fpv;
875 ATH_MSG_VERBOSE(
" Re-using DED for station " << key <<
" component name is " <<
c->name );
876 }
877
878 }
else if (type ==
"SUP" &&
manager->MinimalGeoFlag() == 0) {
883
884 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
885 std::string
key = std::string(stName) + techname;
886 if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi >= 0) {
888 }
else if ((
manager->IncludeCutoutsFlag() || (
manager->IncludeCutoutsBogFlag() &&
stName.compare(0, 3,
"BOG") == 0)) && zi < 0) {
890 }
891
892 GeoVPhysVol *fpv =
m_FPVMAP->GetDetector(key);
893 if (fpv == nullptr) {
895 } else {
896 lvs = fpv;
897 }
898
899 } else if (type == "TGC") {
900 TgcComponent *tg =
static_cast<TgcComponent *
>(
m_station->GetComponent(i));
901 TgcComponent *tgInner =
static_cast<TgcComponent *
>(
m_station->GetComponent(0));
902 irad = tgInner->posy;
903 TgcComponent *tgOuter =
static_cast<TgcComponent *
>(
m_station->GetComponent(
m_station->GetNrOfComponents() - 1));
904 double orad = tgOuter->posy + tgOuter->dy;
905 double start = -(orad - irad) / 2. + (tg->posy - irad) + tg->dy / 2;
906 double xstart = -
thickness / 2. + tg->GetThickness(mysql) / 2.;
907 htcomponent = GeoTrf::TranslateX3D(xstart + tg->posz) * GeoTrf::TranslateZ3D(start);
908 xfaligncomponent = new GeoAlignableTransform(htcomponent);
909
910
911 std::string
key = std::string(stName) + techname;
912 if (
manager->IncludeCutoutsFlag()) {
914
915 if (zi >= 0) {
917 } else if (zi < 0) {
919 }
920 }
921 }
922
923 char chswidth[32];
924 sprintf(chswidth,
"%i",
static_cast<int>(10 *
c->dx1));
926
927 GeoVPhysVol *fpv =
m_FPVMAP->GetDetector(key);
928 if (fpv == nullptr) {
929 std::unique_ptr<Tgc>
t = std::make_unique<Tgc>(mysql, c);
930 t->setLogVolName(std::string(stName) + techname);
931 if (
manager->IncludeCutoutsFlag()) {
932 lvt =
t->build(matManager, mysql,
manager->MinimalGeoFlag(), 1, vcutdef);
933 } else {
934 lvt =
t->build(matManager, mysql,
manager->MinimalGeoFlag());
935 }
937 } else {
938 GeoFullPhysVol *rfpv = static_cast<GeoFullPhysVol *>(fpv);
939 lvt = rfpv->clone();
940 }
941
942 } else if (type == "CSC") {
943 htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos);
944 xfaligncomponent = new GeoAlignableTransform(htcomponent);
945
946 std::string
key = std::string(stName) + techname;
947 if (
manager->IncludeCutoutsFlag() && zi >= 0) {
949 }
else if (
manager->IncludeCutoutsFlag() && zi < 0) {
951 }
952
953 GeoVPhysVol *fpv =
m_FPVMAP->GetDetector(key);
954 if (fpv == nullptr) {
955 std::unique_ptr<Csc>
t = std::make_unique<Csc>(mysql, c);
956 t->setLogVolName(std::string(stName) + techname);
957
958 if (
manager->IncludeCutoutsFlag()) {
959 lvc =
t->build(matManager, mysql,
manager->MinimalGeoFlag(), 1, vcutdef);
960 } else {
961 lvc =
t->build(matManager, mysql,
manager->MinimalGeoFlag());
962 }
963
965 } else {
966 GeoFullPhysVol *rfpv = static_cast<GeoFullPhysVol *>(fpv);
967 lvc = rfpv->clone();
968 }
969
970 } else {
971 if (type != "MDT" && type != "RPC" && type != "TGC" && type != "SUP" && type != "DED" && type != "SPA" && type != "CHV" && type != "CRO" && type != "CMI" &&
972 type != "LB0" && type != "LBI") {
974 }
975 }
976
977
978 if (lvm &&
manager->mdtIdHelper()) {
981 int ml = 1;
982 int tubel = 1;
984 if (ypos > 5.)
985 ml = 2;
987
988 GeoNameTag *
nm =
new GeoNameTag(stag);
989 ptrd->add(
new GeoIdentifierTag(
c->index));
990 ptrd->add(nm);
991
992 xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
993
994 ptrd->add(xfaligncomponent);
995 ptrd->add(lvm);
996 const MdtIdHelper *mdt_id =
manager->mdtIdHelper();
997 std::unique_ptr<MdtReadoutElement>
det = std::make_unique<MdtReadoutElement>(lvm, stName, manager);
1000 det->setHasCutouts(ncutouts > 0);
1001 det->setNMdtInStation(nMdt);
1002 Identifier
id = mdt_id->
channelID(stationType, stationEta, stationPhi, ml, tubel, tube);
1003 det->setIdentifier(
id);
1004 det->setMultilayer(ml);
1005 det->setParentMuonStation(mstat);
1007
1008 if (ml == 1) {
1009
1010 mstat->setBlineFixedPointInAmdbLRS(
c->posx,
c->posy,
c->posz);
1011 } else {
1013 if (
c->posy < b0.y())
1014 mstat->setBlineFixedPointInAmdbLRS(b0.x(),
c->posy, b0.z());
1015 }
1016
1017 int jobIndex =
c->index;
1018
1019 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
1020 ATH_MSG_DEBUG( std::string(stName + techname) <<
" trying to build a MDT Id from stType/eta/phi/ml/tl/t " << stationType <<
"/" << stationEta <<
"/"
1021 << stationPhi <<
"/" << ml <<
"/" << tubel <<
"/" << tube <<
endmsg <<
" Copy number is " <<
c->index <<
" tagName " << stag );
1022
1023
1024 manager->addMdtReadoutElement(std::move(det));
1025 }
1026
1027 if (lvc &&
manager->cscIdHelper()) {
1028 CscComponent *cs =
static_cast<CscComponent *
>(
m_station->GetComponent(i));
1031 int chamberLayer = 1;
1032 if (ypos > 0.)
1033 chamberLayer = 2;
1034 std::string stag =
"cl[" +
MuonGM::buildString(chamberLayer, 0) +
"]" + techname +
"component";
1035 GeoNameTag *
nm =
new GeoNameTag(stag);
1036 ptrd->add(
new GeoIdentifierTag(
c->index));
1037 ptrd->add(nm);
1038
1039 xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1040
1041 ptrd->add(xfaligncomponent);
1042 ptrd->add(lvc);
1043
1044 std::unique_ptr<CscReadoutElement>
det = std::make_unique<CscReadoutElement>(lvc, stName, manager);
1047
1048 const CscIdHelper *csc_id =
manager->cscIdHelper();
1049 det->setHasCutouts(ncutouts > 0);
1050 Identifier
id = csc_id->
channelID(stationType, stationEta, stationPhi, chamberLayer, 1, 0, 1);
1051 det->setIdentifier(
id);
1052 det->setChamberLayer(chamberLayer);
1053 det->setParentMuonStation(mstat);
1054
1055 int jobIndex =
c->index;
1056
1057 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
1058 ATH_MSG_DEBUG( stName << techname <<
" trying to build a CSC Id from stType/eta/phi/ml " << stationType <<
"/" << stationEta <<
"/"
1059 << stationPhi <<
"/" << chamberLayer <<
"/ and /1/0/1" <<
endmsg <<
" Copy number is " <<
c->index <<
" tagName " << stag );
1060
1061
1062 manager->addCscReadoutElement(std::move(det));
1063 }
1064
1065 if (lvt &&
manager->tgcIdHelper()) {
1066 ATH_MSG_DEBUG(
" Adding a TGC chamber to the tree zi,fi, is_mirrored " << zi <<
" " << fi + 1 <<
" " << is_mirrored );
1067
1068 TgcComponent *tg =
static_cast<TgcComponent *
>(
m_station->GetComponent(i));
1069 ATH_MSG_VERBOSE(
"There's a TGC named " << techname <<
" of thickness " << tg->GetThickness(mysql) );
1070
1071 const TgcIdHelper *tgc_id =
manager->tgcIdHelper();
1074 if (zi < 0)
1079 std::string stag =
"stPhiJob[" +
MuonGM::buildString(ttag, 0) +
"]" + techname +
"tgccomponent";
1080 GeoNameTag *
nm =
new GeoNameTag(stag);
1081 int geoid = 0;
1084 } else {
1085 if (zi < 0)
1086 ttag = -ttag;
1087 geoid = ttag;
1088 }
1089 ptrd->add(new GeoIdentifierTag(geoid));
1090 ptrd->add(nm);
1091
1092 xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1093
1094
1095 ptrd->add(xfaligncomponent);
1096 ptrd->add(lvt);
1097
1098 std::unique_ptr<TgcReadoutElement>
det = std::make_unique<TgcReadoutElement>(lvt, stName, manager);
1101 det->setHasCutouts(ncutouts > 0);
1102 Identifier
id = tgc_id->
channelID(stationType, stationEta, stationPhi, 1,
false, 1);
1103 det->setIdentifier(
id);
1104 det->setParentMuonStation(mstat);
1105
1106 int jobIndex =
c->index;
1107
1108 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
1109
1110 ATH_MSG_DEBUG( stName << techname <<
" trying to build a TGC Id from stType/eta/phi " << stationType <<
"/" << stationEta <<
"/" << stationPhi
1111 <<
"/ and /1/0/1" <<
endmsg <<
" Copy number is " << geoid <<
" tagName = " << stag );
1112 manager->addTgcReadoutElement(std::move(det));
1113 }
1114
1116 RpcComponent *
rp =
static_cast<RpcComponent *
>(
c);
1117 int ndivy =
rp->ndivy;
1118 int ndivz =
rp->ndivz;
1119
1120 if (ndivz != 1 || ndivy != 1) {
1121 ATH_MSG_ERROR(
" RPC segmentation z,y " << ndivz <<
" " << ndivy );
1122 }
1123
1124 double zpos = -
length / 2. +
c->posy +
c->dy / 2.;
1125 double xpos =
c->posx;
1126
1127
1128 if (is_mirrored)
1129 xpos = -xpos;
1130
1131
1132 const RpcIdHelper *rpc_id =
manager->rpcIdHelper();
1136 int doubletZ = 1;
1137
1138 if (nRpc > 1 && nDoubletR == 2 && ypos > 0.)
1141
1142
1143 if (stname.find("BI") != std::string::npos) {
1144 if (stname.find("BIS") != std::string::npos) {
1145
1146 if (std::abs(stationEta)>= 7){
1147 ATH_MSG_DEBUG(
"BIS78 station eta: "<<stationEta<<
" phi: "<<stationPhi<<
" dR: "<<doubletR<<
" dZ:"<< doubletZ <<
" rp: "<<
rp->posz);
1148 }
1149 if (std::abs(stationEta) >= 7 &&
rp->posz > 80)
1150 doubletZ = 2;
1151 else
1152 doubletZ = 1;
1153 } else {
1154
1155
1156 if (stname.find("BIL") != std::string::npos && std::abs(stationEta) < 7 && std::abs(stationEta) != 2 && std::abs(stationEta) != 5) {
1158 doubletZ = 2;
1159 } else
1160 doubletZ = 1;
1161 }
1162 } else {
1163 if (zi <= 0 && !is_mirrored) {
1164 if (zpos < -100 * Gaudi::Units::mm)
1165 doubletZ = 2;
1166 } else {
1167 if (zpos > 100 * Gaudi::Units::mm)
1168 doubletZ = 2;
1169 }
1170 }
1171
1172
1173 if (std::abs(xpos) > 100. * Gaudi::Units::mm) {
1174 if (ndbz[doubletR - 1] > 2) {
1175 doubletZ = 3;
1176 }
1178 }
1179
1180 int dbphi = 1;
1181
1182
1183
1184
1185
1186 if (xpos > 400. * Gaudi::Units::mm)
1187 dbphi = 2;
1188
1190
1191 if (zi < 0 && is_mirrored && doubletZ == 3) {
1193 if (doubletPhi > 2)
1195 } else if (zi < 0 && is_mirrored && doubletZ == 2 && doubletR == 1 && stName == "BMS6") {
1197 if (doubletPhi > 2)
1199 }
1200
1202 int measuresPhi = 0;
1204
1205 int geoid = 0;
1206 std::string stag;
1207 int tag = doubletZ +
doubletR * 100 + dbphi * 1000;
1208 if (
rp->iswap == -1)
1213 } else {
1215 if (
rp->iswap == -1)
1218 }
1219
1220 GeoNameTag *
nm =
new GeoNameTag(stag);
1221 ptrd->add(new GeoIdentifierTag(geoid));
1222 ptrd->add(nm);
1223
1224 xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1225
1226 ptrd->add(xfaligncomponent);
1227 ptrd->add(lvr);
1228
1229 std::unique_ptr<RpcReadoutElement>
det = std::make_unique<RpcReadoutElement>(lvr, stName, zi, fi + 1, is_mirrored, manager);
1232 Identifier
id = rpc_id->
channelID(stationType, stationEta, stationPhi, doubletR, doubletZ, doubletPhi, gasGap, measuresPhi,
strip);
1233 det->setIdentifier(
id);
1234 det->setHasCutouts(ncutouts > 0);
1235 det->setDoubletR(doubletR);
1236 det->setDoubletZ(doubletZ);
1237 det->setDoubletPhi(doubletPhi);
1238
1239 ATH_MSG_DEBUG( stName << techname <<
" trying to build a RPC Id from stType/eta/phi/dbR/dbZ/dbP " << stationType <<
"/" << stationEta <<
"/"
1240 << stationPhi <<
"/" << doubletR <<
"/" << doubletZ <<
"/" << doubletPhi <<
"///" << gasGap <<
"/" << measuresPhi <<
"/" <<
strip <<
endmsg
1241 << " Copy number " << geoid << " tagName= " << stag );
1242 det->setParentMuonStation(mstat);
1243
1244 int jobIndex =
c->index;
1245
1246 mstat->addMuonReadoutElementWithAlTransf(
det.get(), xfaligncomponent, jobIndex);
1247
1248
1249 if (
stName.find(
"BI") != std::string::npos) {
1250 std::map<std::string, float>::const_iterator yItr = rpcYTrans.find(techname);
1251 if (yItr != rpcYTrans.end())
1252 det->setYTranslation(yItr->second);
1253 std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
1254 if (zItr != rpcZTrans.end())
1255 det->setZTranslation(zItr->second);
1256 }
1257
1261 manager->addRpcReadoutElement(std::move(det));
1262 }
1263
1265 std::string
cname =
c->name;
1266 ATH_MSG_VERBOSE(
" yes, the component is a SupComponent named " << cname );
1267 GeoNameTag *
nm =
new GeoNameTag(stName +
"_stName " + techname +
" supcomponent");
1268 ptrd->add(
new GeoIdentifierTag(
c->index));
1269 ptrd->add(nm);
1270 ptrd->add(xfcomponent);
1274
1275 ptrd->add(lvs);
1277 }
1278
1280 GeoNameTag *
nm =
new GeoNameTag(stName +
"_stName " + techname +
" dedcomponent");
1281 ptrd->add(
new GeoIdentifierTag(
c->index));
1282 ptrd->add(nm);
1283
1284 ptrd->add(xfcomponent);
1285 ptrd->add(lvd);
1286 }
1287
1288 if (lvo) {
1289
1290
1291
1292
1293
1294
1295
1296 GeoNameTag *
nm =
new GeoNameTag(stName +
"_stName " + techname +
" component");
1297 ptrd->add(
new GeoIdentifierTag(
c->index));
1298 ptrd->add(nm);
1299
1300 ptrd->add(xfcomponent);
1301 ptrd->add(lvo);
1302 }
1303
1304 if (lv) {
1305 GeoNameTag *
nm =
new GeoNameTag(stName +
"_stName " + techname +
" component");
1306 ptrd->add(
new GeoIdentifierTag(
c->index));
1307 ptrd->add(nm);
1308 ptrd->add(xfcomponent);
1309 ptrd->add(lv);
1310 }
1311
1312 }
1313 mstat->updateBlineFixedPointInAmdbLRS();
1314
1315 return ptrd;
1316 }
#define ATH_MSG_VERBOSE(x)
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
Identifier channelID(int stationName, int stationEta, int stationPhi, int chamberLayer, int wireLayer, int measuresPhi, int strip) const
Position GetStationPosition(const std::string &nameType, int fi, int zi) const
Technology * GetTechnology(const std::string &name)
int allocPosFindCutout(const std::string &statType, int fi, int zi) const
int allocPosFindSubtype(const std::string &statType, int fi, int zi) const
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
void setMdtReadoutGeom(const MYSQL &mysql, MdtReadoutElement *re, const MdtComponent *cc, const Position &p)
void setCscReadoutGeom(const MYSQL &mysql, CscReadoutElement *re, const CscComponent *cc, const Position &p)
void setRpcReadoutGeom(const MYSQL &mysql, RpcReadoutElement *re, const RpcComponent *cc, const Position &p)
void setTgcReadoutGeom(const MYSQL &mysql, TgcReadoutElement *re, const TgcComponent *cc, const Position &p, const std::string &statname)
int m_enableFineClashFixing
static double zAMDB0(const MYSQL &mysql, const StandardComponent &c)
static double yAMDB0(const MYSQL &mysql, const StandardComponent &c)
static double xAMDB0(const MYSQL &mysql, const StandardComponent &c)
int stationNameIndex(const std::string &name) const
Identifier channelID(int stationName, int stationEta, int stationPhi, int doubletR, int doubletZ, int doubletPhi, int gasGap, int measuresPhi, int strip) const
virtual const GeoMaterial * getMaterial(const std::string &name)=0
Identifier channelID(int stationName, int stationEta, int stationPhi, int gasGap, int isStrip, int channel) const
std::string depth
tag string for intendation
Eigen::Matrix< double, 3, 1 > Vector3D
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.
std::string buildString(int i, int ncha)
int stationPhiTGC(std::string_view stName, int fi, int zi_input)
Converts the AMDB phi index to the Identifier phi Index.
const std::string & stName(StIndex index)
convert StIndex into a string
constexpr uint8_t stationPhi
station Phi 1 to 8
constexpr uint8_t stationEta
1 to 3