77 {
78
80
81 Trk::TrackingVolume* calorimeter = nullptr;
82
83
85
86
87 double enclosedInnerSectorHalflength = 0.;
88 double enclosedInnerSectorRadius = 0.;
89
90 if (innerVol) {
93
94
95 const Trk::CylinderVolumeBounds* innerDetectorBounds =
96 dynamic_cast<const Trk::CylinderVolumeBounds*>(
98 if (!innerDetectorBounds)
99 std::abort();
100
101 enclosedInnerSectorHalflength = innerDetectorBounds->
halflengthZ();
102 enclosedInnerSectorRadius = innerDetectorBounds->
outerRadius();
103
104 keyDim.emplace_back(enclosedInnerSectorRadius, enclosedInnerSectorHalflength);
105 }
106
109
110
111 unsigned int ii = 0;
112 for (
unsigned int i = 0;
i < envelopeDefsIn.size();
i++) {
113 if (envelopeDefsIn[i].second > envelopeDefsIn[ii].second)
115 else if (envelopeDefsIn[i].second == envelopeDefsIn[ii].second &&
116 envelopeDefsIn[i].first > envelopeDefsIn[ii].first)
118 }
119
120
121 int irot = 1;
122 unsigned int inext = ii + 1;
123 if (inext == envelopeDefsIn.size())
124 inext = 0;
125 if (envelopeDefsIn[inext].second != envelopeDefsIn[ii].second) {
126 irot = -1;
127 inext = ii > 0 ? ii - 1 : envelopeDefsIn.size() - 1;
128 }
129
130
132 if (irot > 0) {
133 for (
unsigned int i = inext;
i < envelopeDefsIn.size();
i++)
134 envelopeDefs.push_back(envelopeDefsIn[i]);
135 if (inext > 0)
136 for (
unsigned int i = 0;
i <= inext - 1;
i++)
137 envelopeDefs.push_back(envelopeDefsIn[i]);
138 } else {
140 while (i >= 0) {
141 envelopeDefs.push_back(envelopeDefsIn[i]);
143 };
144 inext = envelopeDefsIn.size() - 1;
145 while (inext >= ii) {
146 envelopeDefs.push_back(envelopeDefsIn[inext]);
147 inext = inext - 1;
148 };
149 }
150
152
155 for (
unsigned int i = 0;
i < envelopeDefs.size();
i++) {
157 << envelopeDefs[i].second);
158 if (std::abs(envelopeDefs[i].second) < envEnclosingVolumeHalfZ)
159 envEnclosingVolumeHalfZ = std::abs(envelopeDefs[i].second);
160
161 if (envelopeDefs[i].first > 1100. && envelopeDefs[i].first < 1200. &&
162 envelopeDefs[i].second > 0.) {
163
164 if (enclosedInnerSectorRadius != envelopeDefs[i].first)
166 "Enclosed ID volume radius does not match ID envelope, adjusting "
167 "Calo.");
168 envEnclosingVolumeHalfZ = envelopeDefs[
i].second;
169 if (!innerVol) {
170 enclosedInnerSectorRadius = envelopeDefs[
i].first;
171 enclosedInnerSectorHalflength = envelopeDefs[
i].second;
172 }
173 }
174
175
176
177 if (envelopeDefs[i].second > 0. && envelopeDefs[i].second < 6785. &&
178 (envelopeDefs[i].first > 1200. ||
179 envelopeDefs[i].second > envEnclosingVolumeHalfZ)) {
180 if (msCutouts.empty())
181 msCutouts.push_back(envelopeDefs[i]);
182 else {
183 RZPairVector::iterator envIter = msCutouts.begin();
184 while (envIter != msCutouts.end() &&
185 (*envIter).second < envelopeDefs[i].second)
186 ++envIter;
187 while (envIter != msCutouts.end() &&
188 (*envIter).second == envelopeDefs[i].second &&
189 (*envIter).first > envelopeDefs[i].first)
190 ++envIter;
191 msCutouts.insert(envIter, envelopeDefs[i]);
192 }
193 }
194
195 }
196 if (
msgLvl(MSG::VERBOSE)) {
197 for (
unsigned int i = 0;
i < msCutouts.size();
i++)
199 << i << ":" << msCutouts[i].first << ","
200 << msCutouts[i].second);
201 }
202
203
206
207 if (!msCutouts.empty()) {
208 caloDefaultRadius = msCutouts[0].first;
209 caloDefaultHalflengthZ = msCutouts[0].second;
211 " Calo central cylinder dimensions adjusted using EnvelopeSvc:"
213 }
214
215
216
217 if (!innerVol) {
218 auto idBounds = std::make_shared<Trk::CylinderVolumeBounds>(
219 enclosedInnerSectorRadius, enclosedInnerSectorHalflength);
220
222
223 innerVol =
224 new Trk::TrackingVolume(std::move(idTr), std::move(idBounds),
m_caloMaterial,
nullptr,
225 nullptr, "Calo::GapVolumes::DummyID");
226
227 keyDim.emplace_back(enclosedInnerSectorRadius, enclosedInnerSectorHalflength);
228 }
229
230
232
235 for (
unsigned int i = 0;
i < bpDefs.size();
i++) {
237 << bpDefs[i].second);
238
239
240 if (bpDefs[i].first > 10. && bpDefs[i].first < 200. &&
241 bpDefs[i].second >= envEnclosingVolumeHalfZ &&
242 bpDefs[i].second <= msCutouts.back().second) {
243 bpCutouts.push_back(bpDefs[i]);
244 }
245 if (i > 0 && i < 4)
246 keyDim.push_back(bpDefs[i]);
247 }
248
249
250
251
252
253 if (bpCutouts.size() > 1 &&
254 bpCutouts.back().second == bpCutouts[bpCutouts.size() - 2].second)
255 bpCutouts.erase(bpCutouts.end() - 1);
256
257 for (
unsigned int i = 0;
i < bpCutouts.size();
i++)
259 << i << ":" << bpCutouts[i].first << ","
260 << bpCutouts[i].second);
261
262 keyDim.emplace_back(caloDefaultRadius, caloDefaultHalflengthZ);
263
266
267
268
269
270
271 const std::vector<Trk::TrackingVolume*> lArVolumes =
273
276
277
278 Trk::TrackingVolume* solenoid = lArVolumes[0];
279 Trk::TrackingVolume* solenoidlArPresamplerGap = lArVolumes[1];
280 Trk::TrackingVolume* lArBarrelPresampler = lArVolumes[2];
281 Trk::TrackingVolume* lArBarrel = lArVolumes[3];
282
283
284 Trk::TrackingVolume* lArPositiveMBTS = lArVolumes[4];
285 Trk::TrackingVolume* lArPositiveEndcap = lArVolumes[5];
286 Trk::TrackingVolume* lArPositiveHec = lArVolumes[6];
287 Trk::TrackingVolume* lArPositiveFcal = lArVolumes[7];
288 Trk::TrackingVolume* lArPositiveHecFcalCover = lArVolumes[8];
289
290 Trk::TrackingVolume* lArNegativeMBTS = lArVolumes[9];
291 Trk::TrackingVolume* lArNegativeEndcap = lArVolumes[10];
292 Trk::TrackingVolume* lArNegativeHec = lArVolumes[11];
293 Trk::TrackingVolume* lArNegativeFcal = lArVolumes[12];
294 Trk::TrackingVolume* lArNegativeHecFcalCover = lArVolumes[13];
295 Trk::TrackingVolume* lArPosECPresampler = lArVolumes[14];
296 Trk::TrackingVolume* lArNegECPresampler = lArVolumes[15];
297
298
299
300
301 std::vector<Trk::TrackingVolume*> tileVolumes =
303
308 "--------------- detailed output "
309 "---------------------------------------------------------- ");
310 auto tileVolIter = tileVolumes.begin();
311 auto tileVolIterEnd = tileVolumes.end();
312 for (; tileVolIter != tileVolIterEnd;
313 (*tileVolIter)->screenDump(
msg(MSG::VERBOSE)), ++tileVolIter)
314 ;
315 }
316
317
318 Trk::TrackingVolume* tileCombined = tileVolumes[0];
319
320 Trk::TrackingVolume* tilePositiveExtendedBarrel = tileVolumes[1];
321
322 const Trk::CylinderVolumeBounds* ebBounds =
323 dynamic_cast<const Trk::CylinderVolumeBounds*>(
325
326 double rTileMin = ebBounds ? ebBounds->
innerRadius() : 2288.;
327 double zTileMin = ebBounds ? tilePositiveExtendedBarrel->
center().z() -
329 : 3559.5;
330
331 keyDim.emplace_back(rTileMin, zTileMin);
332 for (
unsigned int i = 0;
i < keyDim.size();
i++) {
333 ATH_MSG_VERBOSE(
"key dimensions:" << i <<
":" << keyDim[i].first <<
","
334 << keyDim[i].second);
335 }
336
337
338 const Trk::CylinderVolumeBounds* solenoidBounds =
339 dynamic_cast<const Trk::CylinderVolumeBounds*>(
341 if (!solenoidBounds){
342 std::abort();
343 }
344 const Trk::CylinderVolumeBounds* lArBarrelBounds =
345 dynamic_cast<const Trk::CylinderVolumeBounds*>(
347 if (!lArBarrelBounds){
348 std::abort();
349 }
350 const Trk::CylinderVolumeBounds* lArPositiveEndcapBounds =
351 dynamic_cast<const Trk::CylinderVolumeBounds*>(
353 if (!lArPositiveEndcapBounds){
354 std::abort();
355 }
356 const Trk::CylinderVolumeBounds* lArNegativeEndcapBounds =
357 dynamic_cast<const Trk::CylinderVolumeBounds*>(
359 if (!lArNegativeEndcapBounds){
360 std::abort();
361 }
362 const Trk::CylinderVolumeBounds* lArPositiveHecBounds =
363 dynamic_cast<const Trk::CylinderVolumeBounds*>(
365 if (!lArPositiveHecBounds){
366 std::abort();
367 }
368 const Trk::CylinderVolumeBounds* lArPositiveFcalBounds =
369 dynamic_cast<const Trk::CylinderVolumeBounds*>(
371 if (!lArPositiveFcalBounds){
372 std::abort();
373 }
374 const Trk::CylinderVolumeBounds* lArNegativeFcalBounds =
375 dynamic_cast<const Trk::CylinderVolumeBounds*>(
377 if (!lArNegativeFcalBounds){
378 std::abort();
379 }
380 const Trk::CylinderVolumeBounds* tileCombinedBounds =
381 dynamic_cast<const Trk::CylinderVolumeBounds*>(
383 if (!tileCombinedBounds){
384 std::abort();
385 }
386
387
388
389 Trk::TrackingVolume* lArTileCentralSectorGap = nullptr;
390
391 Trk::TrackingVolume* lArPositiveSectorInnerGap = nullptr;
392 Trk::TrackingVolume* lArPositiveSectorOuterGap = nullptr;
393 Trk::TrackingVolume* lArPositiveSectorOuterGap0 = nullptr;
394 Trk::TrackingVolume* lArCentralPositiveGap = nullptr;
395
396 Trk::TrackingVolume* lArNegativeSectorInnerGap = nullptr;
397 Trk::TrackingVolume* lArNegativeSectorOuterGap = nullptr;
398 Trk::TrackingVolume* lArNegativeSectorOuterGap0 = nullptr;
399 Trk::TrackingVolume* lArCentralNegativeGap = nullptr;
400
401 Trk::TrackingVolume* trtSolenoidGap = nullptr;
402
403 double caloPositiveOuterBoundary = tileCombinedBounds->
halflengthZ();
404
405 double lArPositiveOuterBoundary = lArPositiveFcal->
center().z();
406 lArPositiveOuterBoundary += lArPositiveFcalBounds->
halflengthZ();
407
408
409
410 Trk::Material tilePositiveSectorInnerGapMaterial =
411 Trk::Material(58., 565., 30.7, 14.6, 0.0025);
412
413
414 float caloVolsOuterRadius = tileCombinedBounds->
outerRadius();
415 float caloVolsExtendZ = caloPositiveOuterBoundary;
416
418
419
420 Trk::Material lArSectorInnerGapMaterial =
421 Trk::Material(361., 1370., 14.5, 7., 0.0009);
422
423
424 float rInnerGapBP = 0.;
425 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> innerGapBP =
427 bpCutouts, keyDim[0].second,
428
429 keyDim.back().second, "InnerGap", rInnerGapBP);
430
431 double z = 0.5 * (keyDim.back().second + keyDim[0].second);
432
433 auto mbtsNegLayers = std::make_unique<std::vector<Trk::Layer*>>();
434 auto mbtsPosLayers = std::make_unique<std::vector<Trk::Layer*>>();
435
436 if (lArPositiveMBTS && lArNegativeMBTS) {
437
438 const Trk::CylinderVolumeBounds* mbtsBounds =
439 dynamic_cast<const Trk::CylinderVolumeBounds*>(
444
445 auto dibo = std::make_shared<Trk::DiscBounds>(rmin, rmax);
446
451
452 Trk::DiscLayer* mbtsNegLayer = new Trk::DiscLayer(
453 mbtsNegZpos, dibo,
454
455 Trk::HomogeneousLayerMaterial(
457 1.);
458 Trk::DiscLayer* mbtsPosLayer = new Trk::DiscLayer(
459 mbtsPosZpos, std::make_shared<Trk::DiscBounds>(*dibo),
460
461 Trk::HomogeneousLayerMaterial(
463 1. * Gaudi::Units::mm);
464
465 mbtsNegLayers->push_back(mbtsNegLayer);
466 mbtsPosLayers->push_back(mbtsPosLayer);
467 }
468 }
469
470
471 auto lArG1Bounds = std::make_shared<Trk::CylinderVolumeBounds>(
472 rInnerGapBP,
473
474 keyDim[0].first, 0.5 * (keyDim.back().second - keyDim[0].second));
475
476 auto lArG1P =
478 lArPositiveSectorInnerGap = new Trk::TrackingVolume(
479 std::move(lArG1P), std::make_shared<Trk::CylinderVolumeBounds>(*lArG1Bounds),
480 lArSectorInnerGapMaterial, std::move(mbtsPosLayers),
481 "Calo::GapVolumes::LAr::PositiveSectorInnerGap");
482
483 auto lArG1N =
485 lArNegativeSectorInnerGap = new Trk::TrackingVolume(
486 std::move(lArG1N),
487 std::move(lArG1Bounds),
488 lArSectorInnerGapMaterial,
489 std::move(mbtsNegLayers), "Calo::GapVolumes::LAr::NegativeSectorInnerGap");
490
491
492 Trk::TrackingVolume* positiveInnerGap = nullptr;
493 if (innerGapBP.first) {
494 std::vector<Trk::TrackingVolume*> volsInnerGap;
495 volsInnerGap.push_back(innerGapBP.first);
496 volsInnerGap.push_back(lArPositiveSectorInnerGap);
498 volsInnerGap,
m_caloMaterial,
"Calo::Container::PositiveInnerGap");
499 } else
500 positiveInnerGap = lArPositiveSectorInnerGap;
501
502 Trk::TrackingVolume* negativeInnerGap = nullptr;
503 if (innerGapBP.second) {
504 std::vector<Trk::TrackingVolume*> volsInnerGap;
505 volsInnerGap.push_back(innerGapBP.second);
506 volsInnerGap.push_back(lArNegativeSectorInnerGap);
508 volsInnerGap,
m_caloMaterial,
"Calo::Container::NegativeInnerGap");
509 } else
510 negativeInnerGap = lArNegativeSectorInnerGap;
511
512
513 std::vector<Trk::TrackingVolume*> inBufferVolumes;
514 inBufferVolumes.push_back(negativeInnerGap);
515 inBufferVolumes.push_back(innerVol);
516 inBufferVolumes.push_back(positiveInnerGap);
517
518 Trk::TrackingVolume* inDetEnclosed =
521 "Calo::Container::EnclosedInnerDetector");
522
524
526
527
528 float rEndcapBP = 0.;
529 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> endcapBP =
531 lArPositiveEndcap->
center().z() +
533 "Endcap", rEndcapBP);
534
535
536 const Trk::CylinderVolumeBounds* ecpBounds =
537 dynamic_cast<const Trk::CylinderVolumeBounds*>(
539 if (!ecpBounds){
540 std::abort();
541 }
542
546
547 auto ecpPos = std::make_unique<Amg::Transform3D>(lArPosECPresampler->
transform());
548 auto ecpNeg = std::make_unique<Amg::Transform3D>(lArNegECPresampler->
transform());
549
550 auto ecpUpBounds = std::make_shared<Trk::CylinderVolumeBounds>(ecpRmax, keyDim.back().first, ecpHz);
551 auto ecpDownBounds = std::make_shared<Trk::CylinderVolumeBounds>(rEndcapBP, ecpRmin, ecpHz);
552
553 Trk::TrackingVolume* ecPresamplerCoverPos = new Trk::TrackingVolume(
554 std::make_unique<Amg::Transform3D>(*ecpPos), std::make_shared<Trk::CylinderVolumeBounds>(*ecpUpBounds),
555 m_Al,
nullptr,
nullptr,
556 "Calo::GapVolumes::LAr::PositiveECPresamplerCover");
557 Trk::TrackingVolume* ecPresamplerCoverNeg = new Trk::TrackingVolume(
558 std::make_unique<Amg::Transform3D>(*ecpNeg),
559 std::move(ecpUpBounds),
m_Al,
nullptr,
nullptr,
560 "Calo::GapVolumes::LAr::NegativeECPresamplerCover");
561 Trk::TrackingVolume* ecPresamplerInnerPos = new Trk::TrackingVolume(
562 std::move(ecpPos), std::make_shared<Trk::CylinderVolumeBounds>(*ecpDownBounds),
564 nullptr, "Calo::GapVolumes::LAr::PositiveECPresamplerInner");
565 Trk::TrackingVolume* ecPresamplerInnerNeg = new Trk::TrackingVolume(
566 std::move(ecpNeg),
567 std::move(ecpDownBounds),
569 nullptr, "Calo::GapVolumes::LAr::NegativeECPresamplerInner");
570
571
572 std::vector<Trk::TrackingVolume*> volsECP;
573 volsECP.push_back(ecPresamplerInnerPos);
574 volsECP.push_back(lArPosECPresampler);
575 volsECP.push_back(ecPresamplerCoverPos);
576 Trk::TrackingVolume* positiveECP =
578 volsECP,
m_caloMaterial,
"Calo::Container::PositiveECPresamplerR");
579 std::vector<Trk::TrackingVolume*> volsECN;
580 volsECN.push_back(ecPresamplerInnerNeg);
581 volsECN.push_back(lArNegECPresampler);
582 volsECN.push_back(ecPresamplerCoverNeg);
583 Trk::TrackingVolume* negativeECP =
585 volsECN,
m_caloMaterial,
"Calo::Container::NegativeECPresamplerR");
586
587
588 z = lArPosECPresampler->
center().z() - ecpHz;
589 float z1 = lArPosECPresampler->
center().z() + ecpHz;
590 float z2 =
592
595
598
599 auto ecpIBounds = std::make_shared<Trk::CylinderVolumeBounds>(
600 rEndcapBP, keyDim.back().first, 0.5 * (
z - keyDim.back().second));
601
602 auto ecOPos = std::make_unique<Amg::Transform3D>(
604
605 auto ecONeg = std::make_unique<Amg::Transform3D>(
607
608 auto ecpOBounds = std::make_shared<Trk::CylinderVolumeBounds>(
609 rEndcapBP, keyDim.back().first, 0.5 * (z2 - z1));
610
611 Trk::TrackingVolume* ecPresamplerInPos = new Trk::TrackingVolume(
612 std::move(ecIPos), std::make_shared<Trk::CylinderVolumeBounds>(*ecpIBounds),
613 m_Ar,
nullptr,
nullptr,
614 "Calo::GapVolumes::LAr::PositiveECPresamplerIn");
615 Trk::TrackingVolume* ecPresamplerInNeg = new Trk::TrackingVolume(
616 std::move(ecINeg), std::move(ecpIBounds),
617 m_Ar,
nullptr,
nullptr,
618 "Calo::GapVolumes::LAr::NegativeECPresamplerIn");
619 Trk::TrackingVolume* ecPresamplerOutPos = new Trk::TrackingVolume(
620 std::move(ecOPos), std::make_shared<Trk::CylinderVolumeBounds>(*ecpOBounds),
621 m_Ar,
nullptr,
nullptr,
622 "Calo::GapVolumes::LAr::PositiveECPresamplerOut");
623 Trk::TrackingVolume* ecPresamplerOutNeg = new Trk::TrackingVolume(
624 std::move(ecONeg), std::move(ecpOBounds),
625 m_Ar,
nullptr,
nullptr,
626 "Calo::GapVolumes::LAr::NegativeECPresamplerOut");
627
628
629 std::vector<Trk::TrackingVolume*> volECP;
630 volECP.push_back(ecPresamplerInPos);
631 volECP.push_back(positiveECP);
632 volECP.push_back(ecPresamplerOutPos);
633 Trk::TrackingVolume* positiveEP =
636 std::vector<Trk::TrackingVolume*> volECN;
637 volECN.push_back(ecPresamplerOutNeg);
638 volECN.push_back(negativeECP);
639 volECN.push_back(ecPresamplerInNeg);
640 Trk::TrackingVolume* negativeEP =
643
644
648
649 auto ecPos =
650 std::make_unique<Amg::Transform3D>(lArPositiveEndcap->
transform());
651 auto ecNeg =
652 std::make_unique<Amg::Transform3D>(lArNegativeEndcap->
transform());
653
654 auto ecUpBounds =
655 std::make_shared<Trk::CylinderVolumeBounds>(ecpRmax, keyDim.back().first, ecpHz);
656 auto ecDownBounds =
657 std::make_shared<Trk::CylinderVolumeBounds>(rEndcapBP, ecpRmin, ecpHz);
658
659 Trk::TrackingVolume* ecCoverPos = new Trk::TrackingVolume(
660 std::make_unique<Amg::Transform3D>(*ecPos),
661 std::make_shared<Trk::CylinderVolumeBounds>(*ecUpBounds),
662 m_Ar,
nullptr,
nullptr,
663 "Calo::GapVolumes::LAr::PositiveEndcapCover");
664 Trk::TrackingVolume* ecCoverNeg = new Trk::TrackingVolume(
665 std::make_unique<Amg::Transform3D>(*ecNeg),
666 std::move(ecUpBounds),
667 m_Ar,
nullptr,
nullptr,
668 "Calo::GapVolumes::LAr::NegativeEndcapCover");
669 Trk::TrackingVolume* ecInnerPos = new Trk::TrackingVolume(
670 std::move(ecPos), std::make_shared<Trk::CylinderVolumeBounds>(*ecDownBounds),
672 nullptr, "Calo::GapVolumes::LAr::PositiveEndcapInner");
673 Trk::TrackingVolume* ecInnerNeg = new Trk::TrackingVolume(
674 std::move(ecNeg),
675 std::move(ecDownBounds),
677 nullptr, "Calo::GapVolumes::LAr::NegativeEndcapInner");
678
679
680 std::vector<Trk::TrackingVolume*> volsEC;
681 volsEC.push_back(ecInnerPos);
682 volsEC.push_back(lArPositiveEndcap);
683 volsEC.push_back(ecCoverPos);
684 Trk::TrackingVolume* positiveEC =
687 std::vector<Trk::TrackingVolume*> volsEN;
688 volsEN.push_back(ecInnerNeg);
689 volsEN.push_back(lArNegativeEndcap);
690 volsEN.push_back(ecCoverNeg);
691 Trk::TrackingVolume* negativeEC =
694
695
696 std::vector<Trk::TrackingVolume*> volEEP;
697 volEEP.push_back(positiveEP);
698 volEEP.push_back(positiveEC);
699 Trk::TrackingVolume* positiveEEP =
702 std::vector<Trk::TrackingVolume*> volEEN;
703 volEEN.push_back(negativeEC);
704 volEEN.push_back(negativeEP);
705 Trk::TrackingVolume* negativeEEP =
708
709
710
711 std::vector<Trk::TrackingVolume*> volsEndcapPos;
712 if (endcapBP.first)
713 volsEndcapPos.push_back(endcapBP.first);
714 volsEndcapPos.push_back(positiveEEP);
715
716 std::unique_ptr<Trk::TrackingVolume> positiveEndcap(
718 volsEndcapPos,
m_caloMaterial,
"Calo::Container::PositiveEndcap"));
719
720 std::vector<Trk::TrackingVolume*> volsEndcapNeg;
721 if (endcapBP.second)
722 volsEndcapNeg.push_back(endcapBP.second);
723 volsEndcapNeg.push_back(negativeEEP);
724
725 std::unique_ptr<Trk::TrackingVolume> negativeEndcap(
727 volsEndcapNeg,
m_caloMaterial,
"Calo::Container::NegativeEndcap"));
728
730
731
732 float rHecBP = 0.;
733 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> hecBP =
735 bpCutouts,
738 "Hec", rHecBP);
739
740 Trk::Material lArHecInnerGapMaterial =
741 Trk::Material(390., 1223., 18., 9., 0.0014);
742
743
744 auto lArHecInnerGapBounds =
745 std::make_shared<Trk::CylinderVolumeBounds>(rHecBP, lArPositiveHecBounds->
innerRadius(),
747
748 auto lArHecPos = std::make_unique<Amg::Transform3D>(
750 auto lArHecNeg = std::make_unique<Amg::Transform3D>(
752
753 Trk::TrackingVolume* lArPositiveHecInnerGap = new Trk::TrackingVolume(
754 std::make_unique<Amg::Transform3D>(*lArHecPos),
755 lArHecInnerGapBounds,
m_Al,
nullptr,
nullptr,
756 "Calo::GapVolumes::LAr::PositiveHecInnerGap");
757
758 Trk::TrackingVolume* lArNegativeHecInnerGap = new Trk::TrackingVolume(
759 std::make_unique<Amg::Transform3D>(*lArHecNeg),
760 std::make_shared<Trk::CylinderVolumeBounds>(*lArHecInnerGapBounds),
761 m_Al,
nullptr,
nullptr,
762 "Calo::GapVolumes::LAr::NegativeHecInnerGap");
763
764 auto lArHecOuterGapBounds =
765 std::make_shared<Trk::CylinderVolumeBounds>(lArPositiveHecBounds->
outerRadius(),
766 keyDim.back().first,
768
769 Trk::TrackingVolume* lArPositiveHecOuterGap = new Trk::TrackingVolume(
770 std::move(lArHecPos), std::make_shared<Trk::CylinderVolumeBounds>(*lArHecOuterGapBounds),
772 nullptr, "Calo::GapVolumes::LAr::PositiveHecOuterGap");
773
774 Trk::TrackingVolume* lArNegativeHecOuterGap = new Trk::TrackingVolume(
775 std::move(lArHecNeg),
776 std::move(lArHecOuterGapBounds),
m_Ar,
777 nullptr, nullptr, "Calo::GapVolumes::LAr::NegativeHecOuterGap");
778
779
780
781 std::vector<Trk::TrackingVolume*> volsHecPos;
782 if (hecBP.first)
783 volsHecPos.push_back(hecBP.first);
784 volsHecPos.push_back(lArPositiveHecInnerGap);
785 volsHecPos.push_back(lArPositiveHec);
786 volsHecPos.push_back(lArPositiveHecOuterGap);
787
788 std::unique_ptr<Trk::TrackingVolume> positiveHec(
791
792 std::vector<Trk::TrackingVolume*> volsHecNeg;
793 if (hecBP.second){
794 volsHecNeg.push_back(hecBP.second);
795 }
796 volsHecNeg.push_back(lArNegativeHecInnerGap);
797 volsHecNeg.push_back(lArNegativeHec);
798 volsHecNeg.push_back(lArNegativeHecOuterGap);
799
800 std::unique_ptr<Trk::TrackingVolume> negativeHec(
803
805
806
807
808 float rFcalBP = 0.;
809 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> fcalBP =
811 bpCutouts,
814 "Fcal", rFcalBP);
815
816
817
818
819 if (rFcalBP > lArPositiveFcalBounds->
innerRadius()) {
821 << rFcalBP <<
">" << lArPositiveFcalBounds->
innerRadius()
822 << ", abort");
823 return nullptr;
824 }
825
826
827 auto lArFcalInnerGapBounds =
828 std::make_shared<Trk::CylinderVolumeBounds>(rFcalBP,
831
832 auto lArFcalPos = std::make_unique<Amg::Transform3D>(
834 auto lArFcalNeg = std::make_unique<Amg::Transform3D>(
836
837 Trk::TrackingVolume* lArPositiveFcalInnerGap = new Trk::TrackingVolume(
838 std::make_unique<Amg::Transform3D>(*lArFcalPos),
839 std::make_shared<Trk::CylinderVolumeBounds>(*lArFcalInnerGapBounds),
840 m_Al,
nullptr,
nullptr,
841 "Calo::GapVolumes::LAr::PositiveFcalInnerGap");
842
843 Trk::TrackingVolume* lArNegativeFcalInnerGap = new Trk::TrackingVolume(
844 std::make_unique<Amg::Transform3D>(*lArFcalNeg),
845 std::move(lArFcalInnerGapBounds),
m_Al,
nullptr,
846 nullptr, "Calo::GapVolumes::LAr::NegativeFcalInnerGap");
847
848
849 auto lArFcalOuterGapBounds =
850 std::make_shared<Trk::CylinderVolumeBounds>(lArPositiveHecBounds->
outerRadius(),
851 keyDim.back().first,
853
854 Trk::TrackingVolume* lArPositiveFcalOuterGap = new Trk::TrackingVolume(
855 std::move(lArFcalPos), std::make_shared<Trk::CylinderVolumeBounds>(*lArFcalOuterGapBounds),
856 m_Ar,
nullptr,
nullptr,
"Calo::GapVolumes::LAr::PositiveFcalOuterGap");
857
858 Trk::TrackingVolume* lArNegativeFcalOuterGap = new Trk::TrackingVolume(
859 std::move(lArFcalNeg), std::move(lArFcalOuterGapBounds),
m_Ar,
860 nullptr, nullptr, "Calo::GapVolumes::LAr::NegativeFcalOuterGap");
861
862
863
864 std::vector<Trk::TrackingVolume*> volsFcalPos;
865 if (fcalBP.first){
866 volsFcalPos.push_back(fcalBP.first);
867 }
868 volsFcalPos.push_back(lArPositiveFcalInnerGap);
869 volsFcalPos.push_back(lArPositiveFcal);
870 volsFcalPos.push_back(lArPositiveHecFcalCover);
871 volsFcalPos.push_back(lArPositiveFcalOuterGap);
872
873 std::unique_ptr<Trk::TrackingVolume> positiveFcal(
876
877 std::vector<Trk::TrackingVolume*> volsFcalNeg;
878 if (fcalBP.second){
879 volsFcalNeg.push_back(fcalBP.second);
880 }
881 volsFcalNeg.push_back(lArNegativeFcalInnerGap);
882 volsFcalNeg.push_back(lArNegativeFcal);
883 volsFcalNeg.push_back(lArNegativeHecFcalCover);
884 volsFcalNeg.push_back(lArNegativeFcalOuterGap);
885
886 std::unique_ptr<Trk::TrackingVolume> negativeFcal(
889
891
892
893
894 float rOutBP = 0.;
895 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> outBP =
897 caloPositiveOuterBoundary, "Outer", rOutBP);
898
899 Trk::Material lArSectorOuterGapMat =
900 Trk::Material(20.5, 723., 64., 28., 0.0084);
901
902 auto lArSectorOuterG0Bounds =
903 std::make_shared<Trk::CylinderVolumeBounds>(
904 rOutBP, 430.,
905
906 0.5 * (caloPositiveOuterBoundary - lArPositiveOuterBoundary));
907
908 auto lArSectorOuterG1Bounds =
909 std::make_shared<Trk::CylinderVolumeBounds>(
910 430., keyDim.back().first,
911
912 0.5 * (caloPositiveOuterBoundary - lArPositiveOuterBoundary));
913
914 z = 0.5 * (caloPositiveOuterBoundary + lArPositiveOuterBoundary);
915
916 auto lArSecOutG1P =
918 auto lArSecOutG0P =
920
921 lArPositiveSectorOuterGap0 = new Trk::TrackingVolume(
922 std::move(lArSecOutG0P), std::make_shared<Trk::CylinderVolumeBounds>(*lArSectorOuterG0Bounds),
923 lArSectorOuterGapMat, nullptr,
924 nullptr, "Calo::GapVolumes::LAr::PositiveSectorOuterGap0");
925
926 lArPositiveSectorOuterGap = new Trk::TrackingVolume(
927 std::move(lArSecOutG1P), std::make_shared<Trk::CylinderVolumeBounds> (*lArSectorOuterG1Bounds),
928 m_Ar,
nullptr,
nullptr,
929 "Calo::GapVolumes::LAr::PositiveSectorOuterGap");
930
931 auto lArSecOutG1N =
933 auto lArSecOutG0N =
935
936 lArNegativeSectorOuterGap0 =
937 new Trk::TrackingVolume(std::move(lArSecOutG0N),
938 std::move(lArSectorOuterG0Bounds),
939 lArSectorOuterGapMat, nullptr, nullptr,
940 "Calo::GapVolumes::LAr::NegativeSectorOuterGap0");
941
942 lArNegativeSectorOuterGap = new Trk::TrackingVolume(
943 std::move(lArSecOutG1N),
944 std::move(lArSectorOuterG1Bounds),
946 nullptr, "Calo::GapVolumes::LAr::NegativeSectorOuterGap");
947
948
949 std::vector<Trk::TrackingVolume*> volsOuterGapP;
950 if (outBP.first){
951 volsOuterGapP.push_back(outBP.first);
952 }
953 volsOuterGapP.push_back(lArPositiveSectorOuterGap0);
954 volsOuterGapP.push_back(lArPositiveSectorOuterGap);
955 std::unique_ptr<Trk::TrackingVolume> positiveOuterGap(
957 volsOuterGapP,
m_caloMaterial,
"Calo::Container::PositiveOuterGap"));
958
959 std::vector<Trk::TrackingVolume*> volsOuterGapN;
960 if (outBP.second){
961 volsOuterGapN.push_back(outBP.second);
962 }
963 volsOuterGapN.push_back(lArNegativeSectorOuterGap0);
964 volsOuterGapN.push_back(lArNegativeSectorOuterGap);
965 std::unique_ptr<Trk::TrackingVolume> negativeOuterGap(
967 volsOuterGapN,
m_caloMaterial,
"Calo::Container::NegativeOuterGap"));
968
970
971
972 Trk::TrackingVolume* lArNegativeSector = nullptr;
973
974 std::vector<Trk::TrackingVolume*> lArNegativeSectorVolumes;
975
976 lArNegativeSectorVolumes.push_back(negativeOuterGap.release());
977
978 lArNegativeSectorVolumes.push_back(negativeFcal.release());
979
980 lArNegativeSectorVolumes.push_back(negativeHec.release());
981
982 lArNegativeSectorVolumes.push_back(negativeEndcap.release());
983
986 "Calo::LAr::Container::NegativeSector");
987
988
989 Trk::TrackingVolume* lArPositiveSector = nullptr;
990
991 std::vector<Trk::TrackingVolume*> lArPositiveSectorVolumes;
992
993 lArPositiveSectorVolumes.push_back(positiveEndcap.release());
994
995 lArPositiveSectorVolumes.push_back(positiveHec.release());
996
997 lArPositiveSectorVolumes.push_back(positiveFcal.release());
998
999 lArPositiveSectorVolumes.push_back(positiveOuterGap.release());
1000
1003 "Calo::LAr::Container::PositiveSector");
1004
1006
1007
1008
1009 auto trtSolGapBounds = std::make_shared<Trk::CylinderVolumeBounds>(
1012
1013
1014 Trk::Material solGapMat(535., 2871., 18.6, 9.1, 0.00038);
1015
1016 trtSolenoidGap =
1017 new Trk::TrackingVolume(nullptr, std::move(trtSolGapBounds), solGapMat, nullptr,
1018 nullptr, "Calo::GapVolumes::SolenoidGap");
1019
1020 auto lArTileCentralG1Bounds =
1021 std::make_shared<Trk::CylinderVolumeBounds>(lArBarrelBounds->
outerRadius(),
1024
1025 lArTileCentralSectorGap = new Trk::TrackingVolume(
1026 nullptr, std::move(lArTileCentralG1Bounds),
m_Ar,
nullptr,
nullptr,
1027 "Calo::GapVolumes::LArTileCentralSectorGap");
1028
1029 Trk::TrackingVolume* lArCentralBarrelSector = nullptr;
1030
1031 std::vector<Trk::TrackingVolume*> lArCentralBarrelSectorVolumes;
1032
1033 lArCentralBarrelSectorVolumes.push_back(trtSolenoidGap);
1034
1035 lArCentralBarrelSectorVolumes.push_back(solenoid);
1036
1037 lArCentralBarrelSectorVolumes.push_back(solenoidlArPresamplerGap);
1038
1039 lArCentralBarrelSectorVolumes.push_back(lArBarrelPresampler);
1040
1041 lArCentralBarrelSectorVolumes.push_back(lArBarrel);
1042
1043 lArCentralBarrelSectorVolumes.push_back(lArTileCentralSectorGap);
1044
1045 lArCentralBarrelSector =
1048 "Calo::Containers::LAr::CentralBarrelSector", false, true);
1050
1051
1052
1053
1054 std::vector<Trk::IdentifiedMaterial> matCrack;
1055
1057 matCrack.emplace_back(std::make_shared<Trk::Material>(
m_Scint), baseID);
1058 matCrack.emplace_back(std::make_shared<Trk::Material>(
m_caloMaterial), -1);
1059 matCrack.emplace_back(std::make_shared<Trk::Material>(
m_Al), -1);
1060
1061 double etadist;
1062
1064 (caloDDM->
is_in(1.65, 0.0, CaloCell_ID::TileGap3, etadist)) ? 6 : 3;
1067
1068 std::vector<std::vector<size_t>> indexP;
1069 std::vector<std::vector<size_t>> indexN;
1070
1071 std::vector<Trk::BinUtility> layDN(bun.bins());
1072 std::vector<Trk::BinUtility> layUP(bup.bins());
1073 double crackZ1 = 3532.;
1074 double crackZ2 = 3540.;
1075
1076 std::vector<float>
steps;
1077 for (
unsigned int i = 0;
i < bup.bins();
i++) {
1079 std::vector<size_t> indx;
1080 indx.clear();
1081 steps.push_back(crackZ1);
1082 indx.push_back(i < bup.bins() - 1 ? 0 : 1);
1083 steps.push_back(crackZ2);
1084 indx.push_back(2);
1085 steps.push_back(keyDim.back().second);
1088 indexP.push_back(indx);
1089 }
1090
1091 const Trk::BinnedMaterial crackBinPos(
m_crackMaterial, bup, layUP, indexP,
1092 matCrack);
1093
1094 auto crackBoundsPos = std::make_shared<Trk::CylinderVolumeBounds>(
1095 keyDim[0].first, tileCombinedBounds->
innerRadius(),
1096 0.5 * (keyDim.back().second - crackZ1));
1097 z = 0.5 * (keyDim.back().second + crackZ1);
1098 auto crackPosTransform =
1100
1101 Trk::AlignableTrackingVolume* crackPos = new Trk::AlignableTrackingVolume(
1102 std::move(crackPosTransform), crackBoundsPos, crackBinPos, 17,
1103 "Calo::Detectors::Tile::CrackPos");
1104
1105 for (
unsigned int i = 0;
i < bun.bins();
i++) {
1107 std::vector<size_t> indx;
1108 indx.clear();
1109 steps.push_back(-keyDim.back().second);
1110 indx.push_back(2);
1111 steps.push_back(-crackZ2);
1112 indx.push_back(i > 0 ? 0 : 1);
1113 steps.push_back(-crackZ1);
1116 indexN.push_back(indx);
1117 }
1118
1119 const Trk::BinnedMaterial crackBinNeg(
m_crackMaterial, bun, layDN, indexN, matCrack);
1120
1121 auto crackNegTransform =
1123
1124 Trk::AlignableTrackingVolume* crackNeg = new Trk::AlignableTrackingVolume(
1125 std::move(crackNegTransform),
1126 std::make_shared<Trk::CylinderVolumeBounds>(*crackBoundsPos), crackBinNeg, 17,
1127 "Calo::Detectors::Tile::CrackNeg");
1129
1130 auto lArCentralG1Bounds = std::make_shared<Trk::CylinderVolumeBounds>(
1131 keyDim[0].first, tileCombinedBounds->
innerRadius(),
1132 0.5 * (crackZ1 - lArBarrelBounds->
halflengthZ()));
1133
1135 auto lArCentralG1P =
1137
1138 lArCentralPositiveGap = new Trk::TrackingVolume(
1139 std::move(lArCentralG1P),
1140 std::make_shared<Trk::CylinderVolumeBounds>(*lArCentralG1Bounds),
m_Ar,
nullptr,
nullptr,
1141 "Calo::GapVolumes::LArCentralPositiveGap");
1142
1143 auto lArCentralG1N =
1145
1146 lArCentralNegativeGap = new Trk::TrackingVolume(
1147 std::move(lArCentralG1N),
1148 std::move(lArCentralG1Bounds),
1150 nullptr, "Calo::GapVolumes::LArCentralNegativeGap");
1151
1152
1153 Trk::TrackingVolume* lArCentralSector = nullptr;
1154
1155 std::vector<Trk::TrackingVolume*> lArCentralSectorVolumes;
1156
1157 lArCentralSectorVolumes.push_back(crackNeg);
1158
1159 lArCentralSectorVolumes.push_back(lArCentralNegativeGap);
1160
1161 lArCentralSectorVolumes.push_back(lArCentralBarrelSector);
1162
1163 lArCentralSectorVolumes.push_back(lArCentralPositiveGap);
1164
1165 lArCentralSectorVolumes.push_back(crackPos);
1166
1169 "Calo::Containers::LAr::CentralSector");
1170
1171
1172 Trk::TrackingVolume* caloCentralSector = nullptr;
1173
1174 std::vector<Trk::TrackingVolume*> caloCentralSectorVolumes;
1175
1176 caloCentralSectorVolumes.push_back(inDetEnclosed);
1177
1178 caloCentralSectorVolumes.push_back(lArCentralSector);
1179
1182 "Calo::Containers::CaloCentralSector");
1183
1185
1186
1187 Trk::TrackingVolume* lArCombined = nullptr;
1188
1189 std::vector<Trk::TrackingVolume*> lArCombinedVolumes;
1190
1191 lArCombinedVolumes.push_back(lArNegativeSector);
1192
1193 lArCombinedVolumes.push_back(caloCentralSector);
1194
1195 lArCombinedVolumes.push_back(lArPositiveSector);
1196
1198 lArCombinedVolumes,
m_caloMaterial,
"Calo::Containers::LAr::Combined");
1199
1200
1201 Trk::TrackingVolume* caloCombined = nullptr;
1202
1203 std::vector<Trk::TrackingVolume*> caloVolumes;
1204
1205 caloVolumes.push_back(lArCombined);
1206
1207 caloVolumes.push_back(tileCombined);
1208
1211
1213
1214
1215
1216 Trk::TrackingVolume* centralBuffer = nullptr;
1217 Trk::TrackingVolume* ecPosBuffer = nullptr;
1218 Trk::TrackingVolume* ecNegBuffer = nullptr;
1219
1220 if (caloVolsOuterRadius > caloDefaultRadius) {
1222 "Calo volumes exceeds envelope radius: adjusting envelope "
1223 "(de-synchronizing...)");
1224 caloDefaultRadius = caloVolsOuterRadius;
1225 }
1226
1227 if (caloVolsOuterRadius < caloDefaultRadius) {
1229 "Build radial buffer to synchronize the boundaries in between R "
1230 << caloVolsOuterRadius << " and " << caloDefaultRadius);
1231
1232 auto centralSynBounds = std::make_shared<Trk::CylinderVolumeBounds>(
1233 caloVolsOuterRadius, caloDefaultRadius, caloVolsExtendZ);
1234 centralBuffer = new Trk::TrackingVolume(
1235 nullptr, std::move(centralSynBounds),
m_caloMaterial,
nullptr,
nullptr,
1236 "Calo::GapVolumes::EnvelopeBuffer");
1237 }
1238
1239 if (caloVolsExtendZ < caloDefaultHalflengthZ) {
1241 "Build longitudinal buffers to synchronize the boundaries in between Z "
1242 << caloVolsExtendZ << " and " << caloDefaultHalflengthZ);
1243
1244 auto endcapSynBounds = std::make_shared<Trk::CylinderVolumeBounds>(
1245 0., caloDefaultRadius,
1246 0.5 * (caloDefaultHalflengthZ - caloVolsExtendZ));
1247
1248 Trk::Material ecBuffMat(53. / 0.38, 355. / 0.38, 20., 10.,
1249 0.0053 *
pow(0.38, 3));
1250
1251 float zPos = 0.5 * (caloDefaultHalflengthZ + caloVolsExtendZ);
1252 ecPosBuffer = new Trk::TrackingVolume(
1254 std::make_shared<Trk::CylinderVolumeBounds>(*endcapSynBounds),
1255 m_Ar,
nullptr,
nullptr,
1256 "Calo::GapVolumes::PosECBuffer");
1257
1258 ecNegBuffer = new Trk::TrackingVolume(
1260 std::move(endcapSynBounds),
m_Ar,
nullptr,
nullptr,
1261 "Calo::GapVolumes::NegECBuffer");
1262 }
1263
1265 "All gap volumes for the Calorimeter created. Starting to build Volume "
1266 "Hiearchy.");
1267
1269
1271
1272
1273 int nCutVol = 0;
1274 std::vector<float> zCutStep;
1275 std::vector<float> rCutStep;
1276 if (msCutouts.size() > 1) {
1277 zCutStep.push_back(msCutouts[0].second);
1278 rCutStep.push_back(msCutouts[0].first);
1279 for (
unsigned int i = 1;
i < msCutouts.size();
i++) {
1280 if (msCutouts[i].second == zCutStep.back())
1281 rCutStep.push_back(msCutouts[i].first);
1282 else
1283 zCutStep.push_back(msCutouts[i].second);
1284 }
1285 nCutVol = zCutStep.size() - 1;
1286 }
1287 if (nCutVol > 0)
1289
1290 std::vector<Trk::TrackingVolume*> forwardCutoutVols;
1291 std::vector<Trk::TrackingVolume*> backwardCutoutVols;
1292
1293
1294 std::vector<Trk::Material> cutOutMat;
1295 cutOutMat.emplace_back(19.9, 213., 50., 23.,
1296 0.0065);
1298
1299
1300 if (nCutVol > 0) {
1301
1302
1303 float rout = rCutStep[0];
1304 float zlow = zCutStep[0];
1305 for (
unsigned int i = 1;
i < zCutStep.size();
i++) {
1306 float zup = zCutStep[
i];
1307 float rcut = rCutStep[
i];
1308 std::stringstream
ss;
1310
1311 float rCutOutBP = 0.;
1312 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> cutOutBP =
1314 rCutOutBP);
1315
1316
1317 unsigned int mindex =
i > 1 ? 1 :
i;
1318
1319 auto cutInBounds =
1320 std::make_shared<Trk::CylinderVolumeBounds>(rCutOutBP, rcut, 0.5 * (zup - zlow));
1321 Trk::TrackingVolume* caloInPos = new Trk::TrackingVolume(
1322 std::make_unique<Amg::Transform3D>(
1324 std::make_shared<Trk::CylinderVolumeBounds>(*cutInBounds),
1325 cutOutMat[mindex], nullptr, nullptr,
1326 "Calo::GapVolumes::CaloPositiveCutIn" +
ss.str());
1327 Trk::TrackingVolume* caloInNeg = new Trk::TrackingVolume(
1328 std::make_unique<Amg::Transform3D>(
1330 std::move(cutInBounds),
1331 cutOutMat[mindex], nullptr, nullptr,
1332 "Calo::GapVolumes::CaloNegativeCutIn" +
ss.str());
1333
1334
1335 auto cutOutBounds = std::make_shared<Trk::CylinderVolumeBounds>(rcut, rout, 0.5 * (zup - zlow));
1336 Trk::TrackingVolume* caloOutPos = new Trk::TrackingVolume(
1337 std::make_unique<Amg::Transform3D>(
1339 std::make_shared<Trk::CylinderVolumeBounds>(*cutOutBounds),
m_caloMaterial,
nullptr,
nullptr,
1340 "Muon::GapVolumes::CaloPositiveCutOut" +
ss.str());
1341 Trk::TrackingVolume* caloOutNeg = new Trk::TrackingVolume(
1342 std::make_unique<Amg::Transform3D>(
1344 std::move(cutOutBounds),
1346 "Muon::GapVolumes::CaloNegativeCutOut" +
ss.str());
1347
1348
1351
1352
1353 std::vector<Trk::TrackingVolume*> cvPos;
1354 cvPos.push_back(cutOutBP.first);
1355 cvPos.push_back(caloInPos);
1356 cvPos.push_back(caloOutPos);
1357 Trk::TrackingVolume* cutOutPos =
1360 "Calo::GapVolumes::CaloPositiveCutoutVolume" +
ss.str());
1361 forwardCutoutVols.push_back(cutOutPos);
1362
1363 std::vector<Trk::TrackingVolume*> cvNeg;
1364 cvNeg.push_back(cutOutBP.second);
1365 cvNeg.push_back(caloInNeg);
1366 cvNeg.push_back(caloOutNeg);
1367 Trk::TrackingVolume* cutOutNeg =
1370 "Calo::GapVolumes::CaloNegativeCutoutVolume" +
ss.str());
1371 backwardCutoutVols.insert(backwardCutoutVols.begin(), cutOutNeg);
1372
1373 zlow = zup;
1374 }
1375 }
1376
1378
1379 if (!centralBuffer) {
1380
1381 calorimeter = caloCombined;
1382
1383 } else {
1384
1385 std::vector<Trk::TrackingVolume*> envRVols;
1386 envRVols.push_back(caloCombined);
1387 envRVols.push_back(centralBuffer);
1388
1389
1390 if (!forwardCutoutVols.empty() || ecNegBuffer) {
1391
1392 Trk::TrackingVolume* caloRVolume =
1395 std::vector<Trk::TrackingVolume*> envZVols;
1396 envZVols.reserve(backwardCutoutVols.size());
1397 for (auto& backwardCutoutVol : backwardCutoutVols)
1398 envZVols.push_back(backwardCutoutVol);
1399 if (ecNegBuffer)
1400 envZVols.push_back(ecNegBuffer);
1401 envZVols.push_back(caloRVolume);
1402 if (ecPosBuffer)
1403 envZVols.push_back(ecPosBuffer);
1404 for (auto& forwardCutoutVol : forwardCutoutVols)
1405 envZVols.push_back(forwardCutoutVol);
1406
1409
1410 } else {
1411
1414 }
1415 }
1416
1418 "TrackingVolume 'Calorimeter' built successfully. Wrap it in "
1419 "TrackingGeometry.");
1420
1421 auto caloTrackingGeometry = std::make_unique<Trk::TrackingGeometry>(calorimeter);
1422
1423 if (
msgLvl(MSG::VERBOSE) && caloTrackingGeometry){
1424 caloTrackingGeometry->printVolumeHierarchy(
msg(MSG::VERBOSE));
1425 }
1426
1428 caloTrackingGeometry->indexStaticLayers(
signature());
1429 }
1430
1431 return caloTrackingGeometry;
1432}
#define ATH_MSG_VERBOSE(x)
constexpr int pow(int base, int exp) noexcept
bool msgLvl(const MSG::Level lvl) const
bool is_in(double eta, double phi, CaloCell_ID::CaloSample sample, double &etadist) const
return true if direction eta,phi crosses ANY of the corresponding descriptors
BooleanProperty m_indexStaticLayers
forces robust indexing for layers
StringProperty m_exitVolume
name of the Calo container
DoubleProperty m_caloDefaultHalflengthZ
the halflength in z if not built from
PublicToolHandle< Trk::ICaloTrackingVolumeBuilder > m_lArVolumeBuilder
Volume Builder for the Tile Calorimeter.
std::pair< Trk::TrackingVolume *, Trk::TrackingVolume * > createBeamPipeVolumes(const RZPairVector &bpCutouts, float, float, const std::string &, float &) const
method to build enclosed beam pipe volumes
DoubleProperty m_caloDefaultRadius
the radius if not built from GeoModel
Trk::GeometrySignature signature() const
The unique signature.
ServiceHandle< IEnvelopeDefSvc > m_enclosingEnvelopeSvc
BooleanProperty m_buildMBTS
MBTS like detectors.
Trk::Material m_crackMaterial
PublicToolHandle< Trk::ICaloTrackingVolumeBuilder > m_tileVolumeBuilder
Material properties.
double innerRadius() const
This method returns the inner radius.
double halflengthZ() const
This method returns the halflengthZ.
double outerRadius() const
This method returns the outer radius.
const std::string & volumeName() const
Returns the VolumeName - for debug reason, might be depreciated later.
void screenDump(MsgStream &msg) const
const Amg::Vector3D & center() const
returns the center of the volume
const Amg::Transform3D & transform() const
Return methods for geometry transform.
const VolumeBounds & volumeBounds() const
returns the volumeBounds()
Eigen::Affine3d Transform3D
static const Amg::Transform3D s_idTransform
idendity transformation