TrackingVolumeBuilder interface method - returns vector of ptrs to tracking Volumes.
86 {
87
88 Trk::Material dummyMaterial;
89
90 const LArDetectorManager* lArMgr=nullptr;
92 ATH_MSG_FATAL(
"Could not get LArDetectorManager! Calo TrackingGeometry will not be built");
93 return {};
94 }
95
96
98 ATH_MSG_DEBUG(
"Retrieved " << numTreeTops <<
" tree tops from the LArDetDescrManager. " );
99
100 for (unsigned int itreetop = 0; itreetop<numTreeTops; ++itreetop){
101 PVConstLink currentVPhysVolLink = lArMgr->
getTreeTop(itreetop);
102 const GeoLogVol* currentLogVol = currentVPhysVolLink->getLogVol();
103
104 unsigned int currentChilds = currentVPhysVolLink->getNChildVols();
105
106 ATH_MSG_DEBUG(
"Processing " << currentLogVol->getName() <<
"... has "
107 << currentChilds << " childs, position " << currentVPhysVolLink->getX(geoAlign).translation());
108
109 }
110
111
113
114 ATH_MSG_DEBUG(
"============ Barrel Section ======================" );
115
116 Trk::TrackingVolume* solenoid = nullptr;
117 Trk::TrackingVolume* solenoidLArBarrelGap = nullptr;
118 Trk::TrackingVolume* lArBarrelPresampler = nullptr;
119 Trk::TrackingVolume* lArBarrel = nullptr;
120
121 std::shared_ptr<Trk::CylinderVolumeBounds> solenoidBounds = nullptr;
122 std::shared_ptr<Trk::CylinderVolumeBounds> solenoidLArBarrelGapBounds = nullptr;
123
124
125 Trk::Material solenoidMaterial = Trk::Material( 69.9, 811.5, 28.9, 13.8, 0.003);
126 auto lArBarrelPresamplerMaterial = std::make_shared<Trk::Material>(130., 634.4, 33.7, 15.4, 0.0017);
127 auto lArBarrelMaterial = std::make_shared<Trk::Material>( 26.2, 436.3, 65.4, 27.8, 0.0035);
128
129
130 std::vector<std::pair<const Trk::Surface*, const Trk::Surface*>> entrySurf =
132 std::vector<std::pair<const Trk::Surface*, const Trk::Surface*>> exitSurf =
134
135 StoredPhysVol* storedPV = nullptr;
136
137
139
140 std::shared_ptr<Trk::CylinderVolumeBounds> lArBarrelPosBounds = nullptr;
141 std::shared_ptr<Trk::CylinderVolumeBounds> lArBarrelNegBounds = nullptr;
142
146 storedPV = nullptr;
147 }
148 }
149 GeoFullPhysVol* lArBarrelPosPhysVol =
151
152
153
157 storedPV = nullptr;
158 }
159 }
160 GeoFullPhysVol* lArBarrelNegPhysVol =
162
163 const GeoLogVol* lArBarrelPosLogVol = lArBarrelPosPhysVol ? lArBarrelPosPhysVol->getLogVol() : nullptr;
164 const GeoLogVol* lArBarrelNegLogVol = lArBarrelNegPhysVol ? lArBarrelNegPhysVol->getLogVol() : nullptr;
165
166
167
168 double lArBarrelHalflength = 0.;
169 std::vector<double> zBoundaries;
170
171
172 if (lArBarrelPosLogVol && lArBarrelNegLogVol){
173
174 int poschilds = lArBarrelPosPhysVol->getNChildVols();
175 int negchilds = lArBarrelNegPhysVol->getNChildVols();
176
177 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArBarrelPosPhysVol->getAbsoluteName()
178 << " (" << poschilds << " childs) ." );
179 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArBarrelNegPhysVol->getAbsoluteName()
180 << " (" << negchilds << " childs) ." );
181
182
183 const GeoShape* lArBarrelPosShape = lArBarrelPosLogVol->getShape();
184 const GeoShape* lArBarrelNegShape = lArBarrelNegLogVol->getShape();
185
186
187 const GeoPcon* lArBarrelPosPcon = dynamic_cast<const GeoPcon*>(lArBarrelPosShape);
189 const GeoPcon* lArBarrelNegPcon = dynamic_cast<const GeoPcon*>(lArBarrelNegShape);
191
192 if (lArBarrelPosBounds)
193 ATH_MSG_VERBOSE(
" -> Positive Barrel Bounds: " << *lArBarrelPosBounds );
194 if (lArBarrelNegBounds)
195 ATH_MSG_VERBOSE(
" -> Negative Barrel Bounds: " << *lArBarrelNegBounds );
196
197
198 }
199
200 if (lArBarrelPosBounds && lArBarrelNegBounds){
201
202
203 double lArBarrelRmin = lArBarrelPosBounds->innerRadius();
204 double lArBarrelRmax = lArBarrelPosBounds->outerRadius();
205 lArBarrelHalflength = zBoundaries[1];
206
207
208 auto lArBarrelBoundsPos = std::make_shared<Trk::CylinderVolumeBounds>(
209 lArBarrelRmin, lArBarrelRmax, 0.5 * lArBarrelHalflength);
210 auto lArBarrelBoundsNeg =
211 std::make_shared<Trk::CylinderVolumeBounds>(*lArBarrelBoundsPos);
212
213
216 auto lArBPosTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArBPos));
217 auto lArBNegTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArBNeg));
218
219
220
221
222 std::vector<Trk::IdentifiedMaterial> matID;
223
225 matID.emplace_back(lArBarrelMaterial,0);
226 matID.emplace_back(lArBarrelMaterial,baseID+1);
227 matID.emplace_back(lArBarrelMaterial,baseID+2);
228 matID.emplace_back(lArBarrelMaterial,baseID+3);
229
230 matID.emplace_back(lArBarrelMaterial->scale(1.3),baseID+1);
231 matID.emplace_back(lArBarrelMaterial->scale(1.3),baseID+2);
232 matID.emplace_back(lArBarrelMaterial->scale(0.6),baseID+3);
233 matID.emplace_back(lArBarrelMaterial->scale(0.7),baseID+3);
234 matID.emplace_back(lArBarrelMaterial->scale(0.8),baseID+3);
235 matID.emplace_back(lArBarrelMaterial->scale(0.9),baseID+3);
236 matID.emplace_back(lArBarrelMaterial->scale(1.1),baseID+3);
237
238
241
242 std::vector<std::vector<size_t> > indexP(bubn.bins());
243 std::vector<std::vector<size_t> > indexN;
244
245 std::vector< Trk::BinUtility> layBUN(bubn.bins());
246 std::vector< Trk::BinUtility> layBUP(bubp.bins());
247
248 double r1 = entrySurf[CaloCell_ID::EMB1].second->bounds().r();
249 double r2 = entrySurf[CaloCell_ID::EMB2].second->bounds().r();
250 double r3 = entrySurf[CaloCell_ID::EMB3].second->bounds().r();
251
252 std::vector<float> offset2{};
253 const Trk::SlidingCylinderSurface* scyl2 = dynamic_cast<const Trk::SlidingCylinderSurface* > (entrySurf[CaloCell_ID::EMB2].second);
254 if (scyl2) offset2 = scyl2->
offset();
255 std::vector<float> offset3{};
256 const Trk::SlidingCylinderSurface* scyl3 = dynamic_cast<const Trk::SlidingCylinderSurface* > (entrySurf[CaloCell_ID::EMB3].second);
257 if (scyl3) offset3 = scyl3->
offset();
258
259 std::vector<float>
steps;
260 for (
unsigned int i=0;
i< bubn.bins();
i++) {
262 steps.push_back(lArBarrelBoundsNeg->innerRadius());
263 std::vector<size_t> indx; indx.clear();
264 indx.push_back(0);
266 indx.push_back( i<14 ? 1:4 );
267 steps.push_back(r2 + offset2[i] );
268 indx.push_back( i<14 ? 2:5 );
269 steps.push_back(r3 + offset3[i]);
270
271 if (i>19) indx.push_back(7);
272 else if (i>17) indx.push_back(8);
273 else if (i>15) indx.push_back(9);
274 else if (i>13) indx.push_back(3);
275 else if (i>11) indx.push_back(6);
276 else if (i>9) indx.push_back(7);
277 else if (i>7) indx.push_back(8);
278 else if (i>5) indx.push_back(8);
279 else if (i>4) indx.push_back(9);
280 else indx.push_back(3);
281
282 steps.push_back(lArBarrelBoundsNeg->outerRadius());
285 layBUP[bubp.bins()-1-
i] = rBU;
286 indexN.push_back(indx);
287 indexP[bubp.bins()-1-
i] = std::vector<size_t>(indx);
288 }
289
290 const Trk::BinnedMaterial lArBarrelMaterialBinPos(*lArBarrelMaterial,bubp,layBUP,indexP,matID);
291 const Trk::BinnedMaterial lArBarrelMaterialBinNeg(*lArBarrelMaterial,bubn,layBUN,indexN,matID);
292
293
294 auto *lArBarrelPos = new Trk::AlignableTrackingVolume(
295 std::move(lArBPosTransform),
296 std::move(lArBarrelBoundsPos),
297 lArBarrelMaterialBinPos,
298 1,
299 "Calo::Detectors::LAr::BarrelPos");
300
301 auto *lArBarrelNeg = new Trk::AlignableTrackingVolume(
302 std::move(lArBNegTransform),
303 std::move(lArBarrelBoundsNeg),
304 lArBarrelMaterialBinNeg,
305 1,
306 "Calo::Detectors::LAr::BarrelNeg");
307
308
309 std::vector<Trk::TrackingVolume*> volsB;
310 volsB.push_back(lArBarrelNeg);
311 volsB.push_back(lArBarrelPos);
312
314 dummyMaterial,
315 "Calo::Container::LAr::Barrel");
316 }
317
318
320
322 {
324 {
326 storedPV = nullptr;
327 }
328 }
329 GeoFullPhysVol* solenoidPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
330
331
332 const GeoLogVol* solenoidLogVol = solenoidPhysVol ? solenoidPhysVol->getLogVol() : nullptr;
333
334
335 if (solenoidLogVol){
336 int childs = solenoidPhysVol->getNChildVols();
337
339 << solenoidPhysVol->getAbsoluteName() << " (" << childs << " childs) ." );
340
341 const GeoShape* solenoidShape = solenoidLogVol->getShape();
342
343 const GeoTubs* solenoidTubs = dynamic_cast<const GeoTubs*>(solenoidShape);
344 solenoidBounds = std::make_shared<Trk::CylinderVolumeBounds>(solenoidTubs->getRMin(),solenoidTubs->getRMax(),lArBarrelHalflength);
345
346 const GeoMaterial* solenoidMaterialGM = solenoidLogVol->getMaterial();
347 if (solenoidMaterialGM) {
349 }
350 }
351
352
353 if (solenoidBounds) {
354
356
357 solenoid = new Trk::TrackingVolume(
358 nullptr,
359 solenoidBounds,
360 solenoidMaterial,
361 nullptr, nullptr,
362 "Calo::Solenoid");
363
364 }
365
366
368
369 std::shared_ptr<Trk::CylinderVolumeBounds> lArBarrelPresamplerPosBounds = nullptr;
370 std::shared_ptr<Trk::CylinderVolumeBounds> lArBarrelPresamplerNegBounds = nullptr;
371
373 {
375 {
376 ATH_MSG_DEBUG(
"Unable to retrieve Stored PV PRESAMPLER_B_POS" );
377 storedPV = nullptr;
378 }
379 }
380 GeoFullPhysVol* lArBarrelPresamplerPosPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
381
382
383
385 {
387 {
388 ATH_MSG_DEBUG(
"Unable to retrieve Stored PV PRESAMPLER_B_NEG" );
389 storedPV = nullptr;
390 }
391 }
392 GeoFullPhysVol* lArBarrelPresamplerNegPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
393
394
395 const GeoLogVol* lArBarrelPresamplerPosLogVol = lArBarrelPresamplerPosPhysVol ? lArBarrelPresamplerPosPhysVol->getLogVol() : nullptr;
396 const GeoLogVol* lArBarrelPresamplerNegLogVol = lArBarrelPresamplerNegPhysVol ? lArBarrelPresamplerNegPhysVol->getLogVol() : nullptr;
397
398
399 if (lArBarrelPresamplerPosLogVol && lArBarrelPresamplerNegLogVol){
400
401 int poschilds = lArBarrelPresamplerPosPhysVol->getNChildVols();
402 int negchilds = lArBarrelPresamplerNegPhysVol->getNChildVols();
403
405 << lArBarrelPresamplerPosPhysVol->getAbsoluteName() << " (" << poschilds << " childs) ." );
407 << lArBarrelPresamplerNegPhysVol->getAbsoluteName() << " (" << negchilds << " childs) ." );
408
411 auto lArPBPosTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArBPos));
412 auto lArPBNegTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArBNeg));
413
414
415 const GeoShape* lArBarrelPresamplerPosShape = lArBarrelPresamplerPosLogVol->getShape();
416
417
418 const GeoTubs* lArBarrelPresamplerPosTubs = dynamic_cast<const GeoTubs*>(lArBarrelPresamplerPosShape);
419 lArBarrelPresamplerPosBounds = std::make_shared<Trk::CylinderVolumeBounds>(lArBarrelPresamplerPosTubs->getRMin(),
420 lArBarrelPresamplerPosTubs->getRMax(),
421 0.5*lArBarrelHalflength);
422
423
424 if (lArBarrelPresamplerPosBounds){
425 lArBarrelPresamplerNegBounds = std::make_shared<Trk::CylinderVolumeBounds>(*lArBarrelPresamplerPosBounds);
427 << *lArBarrelPresamplerPosBounds );
428 }
429 if (lArBarrelPresamplerNegBounds){
431 << *lArBarrelPresamplerNegBounds );
432 }
433
434
435
436
437
438 std::vector<float> bpsteps{
float(lArBarrelPresamplerPosBounds->innerRadius()),
439 float(lArBarrelPresamplerPosBounds->outerRadius())};
441 const Trk::BinUtility& rBUc(rBU);
442
443 std::vector<size_t> dummylay (1,0);
444
445 std::vector<Trk::IdentifiedMaterial> matBP;
446
448 matBP.emplace_back(lArBarrelPresamplerMaterial,baseID);
449
450 const Trk::BinnedMaterial lArBarrelPresamplerMaterialBinPos(*lArBarrelPresamplerMaterial,rBU,dummylay,matBP);
451 const Trk::BinnedMaterial lArBarrelPresamplerMaterialBinNeg(*lArBarrelPresamplerMaterial,rBUc,dummylay,matBP);
452
453 auto *lArBarrelPresamplerPos = new Trk::AlignableTrackingVolume(
454 std::move(lArPBPosTransform),
455 lArBarrelPresamplerPosBounds,
456 lArBarrelPresamplerMaterialBinPos,
457 0,
458 "Calo::Detectors::LAr::BarrelPresamplerPos");
459
460 auto *lArBarrelPresamplerNeg = new Trk::AlignableTrackingVolume(
461 std::move(lArPBNegTransform),
462 std::move(lArBarrelPresamplerNegBounds),
463 lArBarrelPresamplerMaterialBinNeg,
464 0,
465 "Calo::Detectors::LAr::BarrelPresamplerNeg");
466
467
468 std::vector<Trk::TrackingVolume*> volsBP;
469 volsBP.push_back(lArBarrelPresamplerNeg);
470 volsBP.push_back(lArBarrelPresamplerPos);
471
473 dummyMaterial,
474 "Calo::Container::LAr::BarrelPresampler");
475 }
476
477
478
479 if (solenoidBounds && lArBarrelPresamplerPosBounds) {
480 solenoidLArBarrelGapBounds = std::make_shared<Trk::CylinderVolumeBounds>(solenoidBounds->outerRadius(),
481 lArBarrelPresamplerPosBounds->innerRadius(),
482 lArBarrelHalflength);
483
484
485
486 Trk::Material solenoidGapMaterial= Trk::Material(182.6, 1007., 22.9, 10.9, 0.0012);
487
488 solenoidLArBarrelGap = new Trk::TrackingVolume(nullptr,
489 std::move(solenoidLArBarrelGapBounds),
490 solenoidGapMaterial,
491 nullptr, nullptr,
492 "Calo::GapVolumes::LAr::SolenoidPresamplerGap");
493 }
494
496
497 ATH_MSG_DEBUG(
"============ Endcap Section ======================" );
498
499
500
501
502
503
504
505
506
507 Trk::TrackingVolume* lArPositiveEndcapInnerGap = nullptr;
508 Trk::TrackingVolume* lArPositiveEndcap = nullptr;
509 Trk::TrackingVolume* lArPositiveHec = nullptr;
510 Trk::TrackingVolume* lArPositiveHecFcalCover = nullptr;
511 Trk::TrackingVolume* lArPositiveFcal = nullptr;
512 Trk::TrackingVolume* lArPosECPresampler = nullptr;
513
514
515 Trk::TrackingVolume* lArNegativeEndcapInnerGap = nullptr;
516 Trk::TrackingVolume* lArNegativeEndcap = nullptr;
517 Trk::TrackingVolume* lArNegativeHec = nullptr;
518 Trk::TrackingVolume* lArNegativeHecFcalCover = nullptr;
519 Trk::TrackingVolume* lArNegativeFcal = nullptr;
520 Trk::TrackingVolume* lArNegECPresampler = nullptr;
521
522
523 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveHecBounds = nullptr;
524 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveHecFcalCoverBounds = nullptr;
525 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveFcalBounds = nullptr;
526
527 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeHecBounds = nullptr;
528 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeHecFcalCoverBounds = nullptr;
529 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeFcalBounds = nullptr;
530
531
532 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveEndcapBounds;
533 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeEndcapBounds;
534
536 {
538 {
540 storedPV = nullptr;
541 }
542 }
543 GeoFullPhysVol* lArPositiveEndcapPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
544
545 const GeoLogVol* lArPositiveEndcapLogVol = lArPositiveEndcapPhysVol ? lArPositiveEndcapPhysVol->getLogVol() : nullptr;
546
548 {
550 {
552 storedPV = nullptr;
553 }
554 }
555 GeoFullPhysVol* lArNegativeEndcapPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
556
557 const GeoLogVol* lArNegativeEndcapLogVol = lArNegativeEndcapPhysVol ? lArNegativeEndcapPhysVol->getLogVol() : nullptr;
558
559
560 const GeoMaterial* lArPositiveEndcapMaterial = nullptr;
561
562
563 std::vector<double> positiveEndcapZboundaries;
564 std::vector<double> negativeEndcapZboundaries;
565
566 double lArEndcapZpos = 0.;
567
568
569 if (lArPositiveEndcapLogVol && lArNegativeEndcapLogVol){
570
571 int poschilds = lArPositiveEndcapPhysVol->getNChildVols();
572 int negchilds = lArNegativeEndcapPhysVol->getNChildVols();
573
574 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveEndcapPhysVol->getAbsoluteName()
575 << " (" << poschilds << " childs)." );
576 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeEndcapPhysVol->getAbsoluteName()
577 << " (" << negchilds << " childs)." );
578
579
580
581 const GeoShape* lArPositiveEndcapShape = lArPositiveEndcapLogVol->getShape();
582 const GeoShape* lArNegativeEndcapShape = lArNegativeEndcapLogVol->getShape();
583
584
586 ? lArPositiveEndcapPhysVol->getCachedAbsoluteTransform(geoAlign)
587 : lArPositiveEndcapPhysVol->getAbsoluteTransform();
588
589 Amg::Vector3D lArPositiveEndcapNomPosition = lArPositiveEndcapTransform.translation();
590
591
592
593 const GeoPcon* lArPositiveEndcapPcon = dynamic_cast<const GeoPcon*>(lArPositiveEndcapShape);
594 if (lArPositiveEndcapPcon)
595 lArPositiveEndcapBounds = std::shared_ptr<Trk::CylinderVolumeBounds>
597 positiveEndcapZboundaries));
598
599 const GeoPcon* lArNegativeEndcapPcon = dynamic_cast<const GeoPcon*>(lArNegativeEndcapShape);
600 if (lArNegativeEndcapPcon)
601 lArNegativeEndcapBounds = std::shared_ptr<Trk::CylinderVolumeBounds>
603 negativeEndcapZboundaries));
604
605 if (lArPositiveEndcapBounds)
606 ATH_MSG_DEBUG(
" -> Positive Endcap Bounds: " << *lArPositiveEndcapBounds );
607 if (lArNegativeEndcapBounds)
608 ATH_MSG_DEBUG(
" -> Negative Endcap Bounds: " << *lArNegativeEndcapBounds );
609
610 double positiveEndcapZpos = 0.5 *(positiveEndcapZboundaries[1] + positiveEndcapZboundaries[0]);
611
612 lArEndcapZpos = positiveEndcapZpos+lArPositiveEndcapNomPosition.z();
613
614 ATH_MSG_DEBUG(
" located at z-positions " << lArEndcapZpos <<
" / " << -lArEndcapZpos );
615
616
617 lArPositiveEndcapMaterial = lArPositiveEndcapLogVol->getMaterial();
618
619
620 }
621
622 double lArEndcapHalfZ = 0.;
623 double lArEndcapZmin = 0.;
624 double lArEndcapZmax = 0.;
625 double lArEndcapInnerRadius = 0;
626 double lArEndcapOuterRadius = 0;
627
628
629 if (lArPositiveEndcapBounds && lArNegativeEndcapBounds && lArPositiveEndcapMaterial){
630
631
632
633 auto lArEndcapMaterial= std::make_shared<Trk::Material>(22.21, 402.2, 72.6, 30.5, 0.0039);
634
635 lArEndcapHalfZ = lArPositiveEndcapBounds->halflengthZ();
636 lArEndcapZmin = lArEndcapZpos - lArPositiveEndcapBounds->halflengthZ();
637 lArEndcapZmax = lArEndcapZpos + lArPositiveEndcapBounds->halflengthZ();
638 lArEndcapInnerRadius = lArPositiveEndcapBounds->innerRadius();
639 lArEndcapOuterRadius = lArPositiveEndcapBounds->outerRadius();
640
643 auto lArPositiveEndcapTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArEndcapPositionPos));
644 auto lArNegativeEndcapTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArEndcapPositionNeg));
645
646
649
650
651 std::vector<Trk::IdentifiedMaterial> matEID;
652
654 matEID.emplace_back(lArEndcapMaterial,0);
655 matEID.emplace_back(lArEndcapMaterial,baseID+1);
656 matEID.emplace_back(lArEndcapMaterial,baseID+2);
657 matEID.emplace_back(lArEndcapMaterial,baseID+3);
658
659 matEID.emplace_back(lArEndcapMaterial->scale(1.05),baseID+1);
660 matEID.emplace_back(lArEndcapMaterial->scale(1.1),baseID+1);
661 matEID.emplace_back(lArEndcapMaterial->scale(1.15),baseID+1);
662 matEID.emplace_back(lArEndcapMaterial->scale(1.2),baseID+1);
663 matEID.emplace_back(lArEndcapMaterial->scale(1.25),baseID+1);
664 matEID.emplace_back(lArEndcapMaterial->scale(1.3),baseID+1);
665 matEID.emplace_back(lArEndcapMaterial->scale(1.35),baseID+1);
666 matEID.emplace_back(lArEndcapMaterial->scale(1.4),baseID+1);
667 matEID.emplace_back(lArEndcapMaterial->scale(1.05),baseID+2);
668 matEID.emplace_back(lArEndcapMaterial->scale(1.1),baseID+2);
669 matEID.emplace_back(lArEndcapMaterial->scale(1.15),baseID+2);
670 matEID.emplace_back(lArEndcapMaterial->scale(1.2),baseID+2);
671 matEID.emplace_back(lArEndcapMaterial->scale(1.25),baseID+2);
672 matEID.emplace_back(lArEndcapMaterial->scale(1.3),baseID+2);
673 matEID.emplace_back(lArEndcapMaterial->scale(1.35),baseID+2);
674 matEID.emplace_back(lArEndcapMaterial->scale(1.4),baseID+2);
675 matEID.emplace_back(lArEndcapMaterial->scale(1.45),baseID+2);
676 matEID.emplace_back(lArEndcapMaterial->scale(0.7),baseID+3);
677 matEID.emplace_back(lArEndcapMaterial->scale(0.75),baseID+3);
678 matEID.emplace_back(lArEndcapMaterial->scale(0.8),baseID+3);
679 matEID.emplace_back(lArEndcapMaterial->scale(0.85),baseID+3);
680 matEID.emplace_back(lArEndcapMaterial->scale(0.9),baseID+3);
681 matEID.emplace_back(lArEndcapMaterial->scale(0.95),baseID+3);
682 matEID.emplace_back(lArEndcapMaterial->scale(1.05),baseID+3);
683 matEID.emplace_back(lArEndcapMaterial->scale(1.1),baseID+3);
684 matEID.emplace_back(lArEndcapMaterial->scale(1.15),baseID+3);
685 matEID.emplace_back(lArEndcapMaterial->scale(1.2),baseID+3);
686
687
688 std::vector< Trk::BinUtility> layEUP(bup.bins());
689
690 std::vector<std::vector<size_t> > indexEP;
691
692 float z1 = entrySurf[CaloCell_ID::EME1].first->center().z();
693 float z2 = entrySurf[CaloCell_ID::EME2].first->center().z();
694 float z3 = entrySurf[CaloCell_ID::EME3].first->center().z();
695
696 std::vector<float> offset2;
697 const Trk::SlidingDiscSurface* sd2 = dynamic_cast<const Trk::SlidingDiscSurface* > (entrySurf[CaloCell_ID::EME2].first);
698 if (sd2) offset2 = sd2->
offset();
699 std::vector<float>offset3;
700 const Trk::SlidingDiscSurface* sd3 = dynamic_cast<const Trk::SlidingDiscSurface* > (entrySurf[CaloCell_ID::EME3].first);
701 if (sd3) offset3 = sd3->
offset();
702
703 std::vector<float>
steps;
704 for (
unsigned int i=0;
i< bup.bins();
i++) {
706 std::vector<size_t> indx; indx.clear();
707 steps.push_back( lArEndcapZmin);
708 indx.push_back(0);
710 if (i<4) indx.push_back(1);
711 else if (i<6) indx.push_back(4);
712 else if (i<8) indx.push_back(5);
713 else if (i<10) indx.push_back(6);
714 else if (i<12) indx.push_back(7);
715 else if (i<14) indx.push_back(8);
716 else if (i<16) indx.push_back(9);
717 else if (i<18) indx.push_back(10);
718 else if (i<23) indx.push_back(11);
719 else indx.push_back(1);
720
721 float z2c = z2 + offset2[
i];
722 if (z2c!=
steps.back()) {
steps.push_back(z2c); indx.push_back(2);}
723 else { indx.back()=2; }
724 if (i<4) {}
725 else if (i<6) indx.back()=12;
726 else if (i<8) indx.back()=13;
727 else if (i<10) indx.back()=14;
728 else if (i<12) indx.back()=15;
729 else if (i<14) indx.back()=16;
730 else if (i<16) indx.back()=17;
731 else if (i<18) indx.back()=18;
732 else if (i<21) indx.back()=19;
733 else if (i<23) indx.back()=20;
734 else if (i<25) indx.back()=14;
735 else if (i<27) indx.back()=15;
736 else if (i<29) indx.back()=16;
737 else if (i<31) indx.back()=17;
738 else if (i<33) indx.back()=18;
739 else if (i<35) indx.back()=19;
740 else if (i<37) indx.back()=20;
741
742 steps.push_back(z3 + offset3[i] );
743 if (i<6) indx.push_back(21);
744 else if (i<8) indx.push_back(22);
745 else if (i<10) indx.push_back(23);
746 else if (i<12) indx.push_back(24);
747 else if (i<14) indx.push_back(25);
748 else if (i<16) indx.push_back(26);
749 else if (i<18) indx.push_back(3);
750 else if (i<20) indx.push_back(28);
751 else if (i<23) indx.push_back(29);
752 else if (i<25) indx.push_back(22);
753 else if (i<27) indx.push_back(23);
754 else if (i<29) indx.push_back(24);
755 else if (i<31) indx.push_back(26);
756 else if (i<33) indx.push_back(3);
757 else if (i<35) indx.push_back(27);
758 else indx.push_back(28);
759 steps.push_back(lArEndcapZmax);
762 indexEP.push_back(indx);
763 }
764
765
766 std::vector< Trk::BinUtility> layEUN(bun.bins());
767 std::vector<std::vector<size_t> > indexEN;
768 for ( int j=indexEP.size()-1; j>-1; j--) {
769 std::vector<size_t> indx; indx.clear();
770 for (
int jj=indexEP[j].
size()-1; jj>-1; jj--) {
771 indx.push_back(indexEP[j][jj]);
772 }
773 indexEN.push_back(indx);
774 }
775
776 z1 = entrySurf[CaloCell_ID::EME1].second->center().z();
777 z2 = entrySurf[CaloCell_ID::EME2].second->center().z();
778 z3 = entrySurf[CaloCell_ID::EME3].second->center().z();
779
780 offset2.clear();
781 sd2 = dynamic_cast<const Trk::SlidingDiscSurface* > (entrySurf[CaloCell_ID::EME2].second);
782 if (sd2) offset2 = sd2->
offset();
783 offset3.clear();
784 sd3 = dynamic_cast<const Trk::SlidingDiscSurface* > (entrySurf[CaloCell_ID::EME3].second);
785 if (sd3) offset3 = sd3->
offset();
786
787 for (
unsigned int i=0;
i< bun.bins();
i++) {
789 steps.push_back(-lArEndcapZmax);
790 steps.push_back(z3 + offset3[i] );
791 steps.push_back(z2 + offset2[i] );
792 if (z1!=
steps.back()) {
steps.push_back(z1); }
793 steps.push_back(-lArEndcapZmin);
796 }
797
798 const Trk::BinnedMaterial lArEndcapMaterialBinnedPos(*lArEndcapMaterial,bup,layEUP,indexEP,matEID);
799 const Trk::BinnedMaterial lArEndcapMaterialBinnedNeg(*lArEndcapMaterial,bun,layEUN,indexEN,matEID);
800
801 lArPositiveEndcap = new Trk::AlignableTrackingVolume(
802 std::move(lArPositiveEndcapTransform),
803 std::move(lArPositiveEndcapBounds),
804 lArEndcapMaterialBinnedPos,
805 5,
806 "Calo::Detectors::LAr::PositiveEndcap");
807
808 lArNegativeEndcap = new Trk::AlignableTrackingVolume(
809 std::move(lArNegativeEndcapTransform),
810 std::move(lArNegativeEndcapBounds),
811 lArEndcapMaterialBinnedNeg,
812 5,
813 "Calo::Detectors::LAr::NegativeEndcap");
814 }
815
816
818
819 std::shared_ptr<Trk::CylinderVolumeBounds> lArECPresamplerBounds = nullptr;
820
822 {
824 {
825 ATH_MSG_DEBUG(
"Unable to retrieve Stored PV PRESAMPLER_EC_POS" );
826 storedPV = nullptr;
827 }
828 }
829 GeoFullPhysVol* lArECPresamplerPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
830
831
832 const GeoLogVol* lArECPresamplerLogVol = lArECPresamplerPhysVol ? lArECPresamplerPhysVol->getLogVol() : nullptr;
833
834
835 std::vector<Trk::IdentifiedMaterial> matECP;
836 auto mAr = std::make_shared<Trk::Material>(140., 1170./1.4, 40., 18., 0.0014);
837 auto mAl = std::make_shared<Trk::Material>(88.93, 388.8, 27., 13., 0.0027);
838
839
841 matECP.emplace_back(mAl,0);
842 matECP.emplace_back(mAr,baseID);
843
844 if ( lArECPresamplerLogVol ) {
845
846 const GeoShape* lArECPresamplerShape = lArECPresamplerLogVol->getShape();
848 ? lArECPresamplerPhysVol->getCachedAbsoluteTransform(geoAlign)
849 : lArECPresamplerPhysVol->getAbsoluteTransform();
850
851 const GeoTubs* psTubs = dynamic_cast<const GeoTubs*>(lArECPresamplerShape);
852
853 float d = psTubs->getZHalfLength();
854
855 float ecd = 32.5 ;
856
857 float zec = lArECPresamplerTransform.translation().z()-ecd+
d;
860 auto lArPosECPresamplerTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArECPresamplerPos));
861 auto lArNegECPresamplerTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArECPresamplerNeg));
862
863 lArECPresamplerBounds = std::make_shared<Trk::CylinderVolumeBounds>(psTubs->getRMin(),psTubs->getRMax(),ecd);
864
865
866 std::vector<float> ecp;
867 ecp.push_back( zec-ecd);
868 ecp.push_back( zec+ecd-2*d);
869 ecp.push_back( zec+ecd);
871
872
873 std::vector<size_t> iep{0,1};
874
875
876 const Trk::BinnedMaterial lArECPresamplerMaterialBinPos(*lArBarrelPresamplerMaterial,hecp,iep,matECP);
877
878
879 lArPosECPresampler = new Trk::AlignableTrackingVolume(
880 std::move(lArPosECPresamplerTransform),
881 std::make_shared<Trk::CylinderVolumeBounds>(*lArECPresamplerBounds),
882 lArECPresamplerMaterialBinPos,
883 4,
884 "Calo::Detectors::LAr::PositiveECPresampler");
885
886
887 std::vector<float> ecpn;
888 ecpn.push_back(-zec-ecd);
889 ecpn.push_back(-zec-ecd+2*d);
890 ecpn.push_back(-zec+ecd);
892
893
894 std::vector<size_t> ien{1,0};
895
896
897 const Trk::BinnedMaterial lArECPresamplerMaterialBinNeg(*lArBarrelPresamplerMaterial,hecpn,ien,matECP);
898
899 lArNegECPresampler = new Trk::AlignableTrackingVolume(
900 std::move(lArNegECPresamplerTransform),
901 std::move(lArECPresamplerBounds),
902 lArECPresamplerMaterialBinNeg,
903 4,
904 "Calo::Detectors::LAr::NegativeECPresampler");
905
906
907 }
908
909
910 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveHec1Bounds = nullptr;
911 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveHec2Bounds = nullptr;
912 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeHec1Bounds = nullptr;
913 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeHec2Bounds = nullptr;
914
915
917
920 storedPV = nullptr;
921 }
922
923 }
924 GeoFullPhysVol* lArPositiveHec1PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
925
927
930 storedPV = nullptr;
931 }
932
933 }
934 GeoFullPhysVol* lArPositiveHec2PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
935
937
940 storedPV = nullptr;
941 }
942
943 }
944 GeoFullPhysVol* lArNegativeHec1PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
945
947
950 storedPV = nullptr;
951 }
952
953 }
954
955 GeoFullPhysVol* lArNegativeHec2PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
956
957 const GeoLogVol* lArPositiveHec1LogVol = lArPositiveHec1PhysVol ? lArPositiveHec1PhysVol->getLogVol() : nullptr;
958 const GeoLogVol* lArPositiveHec2LogVol = lArPositiveHec2PhysVol ? lArPositiveHec2PhysVol->getLogVol() : nullptr;
959 const GeoLogVol* lArNegativeHec1LogVol = lArNegativeHec1PhysVol ? lArNegativeHec1PhysVol->getLogVol() : nullptr;
960 const GeoLogVol* lArNegativeHec2LogVol = lArNegativeHec2PhysVol ? lArNegativeHec2PhysVol->getLogVol() : nullptr;
961
962 std::vector<double> positiveEndcapZboundariesHec1;
963 std::vector<double> positiveEndcapZboundariesHec2;
964 std::vector<double> negativeEndcapZboundariesHec1;
965 std::vector<double> negativeEndcapZboundariesHec2;
966 double hecEnd = 0;
967
968
969 if (lArPositiveHec1LogVol && lArPositiveHec2LogVol && lArNegativeHec1LogVol && lArNegativeHec2LogVol){
970
971 int poschildsHec1 = lArPositiveHec1PhysVol->getNChildVols();
972 int poschildsHec2 = lArPositiveHec2PhysVol->getNChildVols();
973 int negchildsHec1 = lArNegativeHec1PhysVol->getNChildVols();
974 int negchildsHec2 = lArNegativeHec2PhysVol->getNChildVols();
975
976 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveHec1PhysVol->getAbsoluteName()
977 << " (" << poschildsHec1 << " childs) ." );
978 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeHec2PhysVol->getAbsoluteName()
979 << " (" << poschildsHec2 << " childs) ." );
980 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveHec1PhysVol->getAbsoluteName()
981 << " (" << negchildsHec1 << " childs) ." );
982 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeHec2PhysVol->getAbsoluteName()
983 << " (" << negchildsHec2 << " childs) ." );
984
985
986 const GeoShape* lArPositiveHec1Shape = lArPositiveHec1LogVol->getShape();
987 const GeoShape* lArPositiveHec2Shape = lArPositiveHec2LogVol->getShape();
988 const GeoShape* lArNegativeHec1Shape = lArNegativeHec1LogVol->getShape();
989 const GeoShape* lArNegativeHec2Shape = lArNegativeHec2LogVol->getShape();
990
991
993 ? lArPositiveHec1PhysVol->getCachedAbsoluteTransform(geoAlign)
994 : lArPositiveHec1PhysVol->getAbsoluteTransform();
996 ? lArPositiveHec2PhysVol->getCachedAbsoluteTransform(geoAlign)
997 : lArPositiveHec2PhysVol->getAbsoluteTransform();
999 ? lArNegativeHec1PhysVol->getCachedAbsoluteTransform(geoAlign)
1000 : lArNegativeHec1PhysVol->getAbsoluteTransform();
1002 ? lArNegativeHec2PhysVol->getCachedAbsoluteTransform(geoAlign)
1003 : lArNegativeHec2PhysVol->getAbsoluteTransform();
1004
1005 Amg::Vector3D lArPositiveHec1NomPosition = lArPositiveHec1Transform.translation();
1006 Amg::Vector3D lArPositiveHec2NomPosition = lArPositiveHec2Transform.translation();
1007 Amg::Vector3D lArNegativeHec1NomPosition = lArNegativeHec1Transform.translation();
1008 Amg::Vector3D lArNegativeHec2NomPosition = lArNegativeHec2Transform.translation();
1009
1010
1011 const GeoPcon* lArPositiveHec1Pcon = dynamic_cast<const GeoPcon*>(lArPositiveHec1Shape);
1013 positiveEndcapZboundariesHec1) : nullptr;
1014 const GeoPcon* lArPositiveHec2Pcon = dynamic_cast<const GeoPcon*>(lArPositiveHec2Shape);
1016 positiveEndcapZboundariesHec2) : nullptr;
1017 const GeoPcon* lArNegativeHec1Pcon = dynamic_cast<const GeoPcon*>(lArNegativeHec1Shape);
1019 negativeEndcapZboundariesHec1) : nullptr;
1020 const GeoPcon* lArNegativeHec2Pcon = dynamic_cast<const GeoPcon*>(lArNegativeHec2Shape);
1022 negativeEndcapZboundariesHec2) : nullptr;
1023
1024 if (lArPositiveHec1Bounds)
1025 ATH_MSG_VERBOSE(
" -> Positive Hec1 Bounds: " << *lArPositiveHec1Bounds );
1026 if (lArPositiveHec2Bounds)
1027 ATH_MSG_VERBOSE(
" -> Positive Hec2 Bounds: " << *lArPositiveHec2Bounds );
1028
1029 if (lArNegativeHec1Bounds)
1030 ATH_MSG_VERBOSE(
" -> Negative Hec1 Bounds: " << *lArNegativeHec1Bounds );
1031 if (lArNegativeHec2Bounds)
1032 ATH_MSG_VERBOSE(
" -> Negative Hec2 Bounds: " << *lArNegativeHec2Bounds );
1033
1034
1035 double positiveHec1Zpos = 0.5 *(positiveEndcapZboundariesHec1[1] + positiveEndcapZboundariesHec1[0]);
1036 double positiveHec2Zpos = 0.5 *(positiveEndcapZboundariesHec2[1] + positiveEndcapZboundariesHec2[0]);
1037 double negativeHec1Zpos = -fabs(0.5 *(negativeEndcapZboundariesHec1[1] + negativeEndcapZboundariesHec1[0]));
1038 double negativeHec2Zpos = -fabs(0.5 *(negativeEndcapZboundariesHec2[1] + negativeEndcapZboundariesHec2[0]));
1039
1040 ATH_MSG_VERBOSE(
" Positive parts located at: " << positiveHec1Zpos + lArPositiveHec1NomPosition.z()
1041 << " / " << positiveHec2Zpos + lArPositiveHec2NomPosition.z() );
1042
1043 ATH_MSG_VERBOSE(
" Negative parts located at: " << negativeHec1Zpos + lArNegativeHec1NomPosition.z()
1044 << " / " << negativeHec2Zpos + lArNegativeHec2NomPosition.z() );
1045
1046 }
1047
1048
1049
1050
1051
1052
1053
1054
1055 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveFcal1Bounds = nullptr;
1056 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveFcal2Bounds = nullptr;
1057 std::shared_ptr<Trk::CylinderVolumeBounds> lArPositiveFcal3Bounds = nullptr;
1058
1059
1060 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeFcal1Bounds = nullptr;
1061 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeFcal2Bounds = nullptr;
1062 std::shared_ptr<Trk::CylinderVolumeBounds> lArNegativeFcal3Bounds = nullptr;
1063
1065 {
1067 {
1069 storedPV = nullptr;
1070 }
1071 }
1072 GeoFullPhysVol* lArPositiveFcal1PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1073
1075 {
1077 {
1079 storedPV = nullptr;
1080 }
1081 }
1082 GeoFullPhysVol* lArPositiveFcal2PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1083
1084
1086 {
1088 {
1090 storedPV = nullptr;
1091 }
1092 }
1093 GeoFullPhysVol* lArPositiveFcal3PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1094
1096 {
1098 {
1100 storedPV = nullptr;
1101 }
1102 }
1103 GeoFullPhysVol* lArNegativeFcal1PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1104
1106 {
1108 {
1110 storedPV = nullptr;
1111 }
1112 }
1113 GeoFullPhysVol* lArNegativeFcal2PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1114
1116 {
1118 {
1120 storedPV = nullptr;
1121 }
1122 }
1123 GeoFullPhysVol* lArNegativeFcal3PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1124
1125 const GeoLogVol* lArPositiveFcal1LogVol = lArPositiveFcal1PhysVol ? lArPositiveFcal1PhysVol->getLogVol() : nullptr;
1126 const GeoLogVol* lArPositiveFcal2LogVol = lArPositiveFcal2PhysVol ? lArPositiveFcal2PhysVol->getLogVol() : nullptr;
1127 const GeoLogVol* lArPositiveFcal3LogVol = lArPositiveFcal3PhysVol ? lArPositiveFcal3PhysVol->getLogVol() : nullptr;
1128
1129 const GeoLogVol* lArNegativeFcal1LogVol = lArNegativeFcal1PhysVol ? lArNegativeFcal1PhysVol->getLogVol() : nullptr;
1130 const GeoLogVol* lArNegativeFcal2LogVol = lArNegativeFcal2PhysVol ? lArNegativeFcal2PhysVol->getLogVol() : nullptr;
1131 const GeoLogVol* lArNegativeFcal3LogVol = lArNegativeFcal3PhysVol ? lArNegativeFcal3PhysVol->getLogVol() : nullptr;
1132
1133
1134 double lArFcalHalflength = 0.;
1135 double lArFcalZposition = 0.;
1136 double lArFcalZmin = 0.;
1137 double lArFcalZmax = 0.;
1138
1139
1140 if (lArPositiveFcal1LogVol &&
1141 lArPositiveFcal2LogVol &&
1142 lArPositiveFcal3LogVol &&
1143 lArNegativeFcal1LogVol &&
1144 lArNegativeFcal2LogVol &&
1145 lArNegativeFcal3LogVol){
1146
1147 int poschildsFcal1 = lArPositiveFcal1PhysVol->getNChildVols();
1148 int poschildsFcal2 = lArPositiveFcal2PhysVol->getNChildVols();
1149 int poschildsFcal3 = lArPositiveFcal3PhysVol->getNChildVols();
1150
1151 int negchildsFcal1 = lArNegativeFcal1PhysVol->getNChildVols();
1152 int negchildsFcal2 = lArNegativeFcal2PhysVol->getNChildVols();
1153 int negchildsFcal3 = lArNegativeFcal3PhysVol->getNChildVols();
1154
1155
1156 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveFcal1PhysVol->getAbsoluteName()
1157 << " (" << poschildsFcal1 << " childs) ." );
1158 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveFcal2PhysVol->getAbsoluteName()
1159 << " (" << poschildsFcal2 << " childs) ." );
1160 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveFcal3PhysVol->getAbsoluteName()
1161 << " (" << poschildsFcal3 << " childs) ." );
1162
1163 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeFcal1PhysVol->getAbsoluteName()
1164 << " (" << negchildsFcal1 << " childs) ." );
1165 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeFcal2PhysVol->getAbsoluteName()
1166 << " (" << negchildsFcal2 << " childs) ." );
1167 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeFcal3PhysVol->getAbsoluteName()
1168 << " (" << negchildsFcal3 << " childs) ." );
1169
1170
1171 const GeoShape* lArPositiveFcal1Shape = lArPositiveFcal1LogVol->getShape();
1172 const GeoShape* lArPositiveFcal2Shape = lArPositiveFcal2LogVol->getShape();
1173 const GeoShape* lArPositiveFcal3Shape = lArPositiveFcal3LogVol->getShape();
1174
1175 const GeoShape* lArNegativeFcal1Shape = lArNegativeFcal1LogVol->getShape();
1176 const GeoShape* lArNegativeFcal2Shape = lArNegativeFcal2LogVol->getShape();
1177 const GeoShape* lArNegativeFcal3Shape = lArNegativeFcal3LogVol->getShape();
1178
1179
1180
1182 ? lArPositiveFcal1PhysVol->getCachedAbsoluteTransform(geoAlign)
1183 : lArPositiveFcal1PhysVol->getAbsoluteTransform();
1185 ? lArPositiveFcal2PhysVol->getCachedAbsoluteTransform(geoAlign)
1186 : lArPositiveFcal2PhysVol->getAbsoluteTransform();
1188 ? lArPositiveFcal3PhysVol->getCachedAbsoluteTransform(geoAlign)
1189 : lArPositiveFcal3PhysVol->getAbsoluteTransform();
1190
1192 ? lArNegativeFcal1PhysVol->getCachedAbsoluteTransform(geoAlign)
1193 : lArNegativeFcal1PhysVol->getAbsoluteTransform();
1195 ? lArNegativeFcal2PhysVol->getCachedAbsoluteTransform(geoAlign)
1196 : lArNegativeFcal2PhysVol->getAbsoluteTransform();
1198 ? lArNegativeFcal3PhysVol->getCachedAbsoluteTransform(geoAlign)
1199 : lArNegativeFcal3PhysVol->getAbsoluteTransform();
1200
1201 Amg::Vector3D lArPositiveFcal1NomPosition = lArPositiveFcal1Transform.translation();
1202 Amg::Vector3D lArPositiveFcal2NomPosition = lArPositiveFcal2Transform.translation();
1203 Amg::Vector3D lArPositiveFcal3NomPosition = lArPositiveFcal3Transform.translation();
1204
1205 Amg::Vector3D lArNegativeFcal1NomPosition = lArNegativeFcal1Transform.translation();
1206 Amg::Vector3D lArNegativeFcal2NomPosition = lArNegativeFcal2Transform.translation();
1207 Amg::Vector3D lArNegativeFcal3NomPosition = lArNegativeFcal3Transform.translation();
1208
1209
1210 const GeoTubs* lArPositiveFcal1Tubs = dynamic_cast<const GeoTubs*>(lArPositiveFcal1Shape);
1212 const GeoTubs* lArPositiveFcal2Tubs = dynamic_cast<const GeoTubs*>(lArPositiveFcal2Shape);
1214 const GeoTubs* lArPositiveFcal3Tubs = dynamic_cast<const GeoTubs*>(lArPositiveFcal3Shape);
1216
1217 const GeoTubs* lArNegativeFcal1Tubs = dynamic_cast<const GeoTubs*>(lArNegativeFcal1Shape);
1219 const GeoTubs* lArNegativeFcal2Tubs = dynamic_cast<const GeoTubs*>(lArNegativeFcal2Shape);
1221 const GeoTubs* lArNegativeFcal3Tubs = dynamic_cast<const GeoTubs*>(lArNegativeFcal3Shape);
1223
1224 if (lArPositiveFcal1Bounds)
1225 ATH_MSG_VERBOSE(
" -> Positive Fcal1 Bounds: " << *lArPositiveFcal1Bounds );
1226 if (lArPositiveFcal2Bounds)
1227 ATH_MSG_VERBOSE(
" -> Positive Fcal2 Bounds: " << *lArPositiveFcal2Bounds );
1228 if (lArPositiveFcal3Bounds)
1229 ATH_MSG_VERBOSE(
" -> Positive Fcal3 Bounds: " << *lArPositiveFcal3Bounds );
1230
1231
1232 if (lArNegativeFcal1Bounds)
1233 ATH_MSG_VERBOSE(
" -> Negative Fcal1 Bounds: " << *lArNegativeFcal1Bounds );
1234 if (lArNegativeFcal2Bounds)
1235 ATH_MSG_VERBOSE(
" -> Negative Fcal2 Bounds: " << *lArNegativeFcal2Bounds );
1236 if (lArNegativeFcal3Bounds)
1237 ATH_MSG_VERBOSE(
" -> Negative Fcal3 Bounds: " << *lArNegativeFcal3Bounds );
1238
1239
1240 ATH_MSG_VERBOSE(
" Positive parts located at: " << lArPositiveFcal1NomPosition.z()
1241 << " / " << lArPositiveFcal2NomPosition.z() << " / " << lArPositiveFcal3NomPosition.z() );
1242
1243 ATH_MSG_VERBOSE(
" Negative parts located at: " << lArNegativeFcal1NomPosition.z()
1244 << " / " << lArNegativeFcal2NomPosition.z() << " / " << lArNegativeFcal3NomPosition.z() );
1245
1246
1247
1248
1249 lArFcalHalflength = lArPositiveFcal3NomPosition.z() + lArPositiveFcal3Bounds->halflengthZ()
1250 - lArPositiveFcal1NomPosition.z() + lArNegativeFcal1Bounds->halflengthZ();
1251
1252 lArFcalHalflength *= 0.5;
1253
1254
1255
1256 lArFcalZposition = lArPositiveFcal3NomPosition.z() + lArPositiveFcal3Bounds->halflengthZ();
1257 lArFcalZposition += lArPositiveFcal1NomPosition.z() - lArNegativeFcal1Bounds->halflengthZ();
1258 lArFcalZposition *= 0.5;
1259 }
1260
1261
1262
1263
1264
1265
1266 double lArHecZmax = lArFcalZposition - lArFcalHalflength;
1267 double lArHecZmin = 0;
1268 if (lArPositiveEndcap && lArEndcapHalfZ != 0)
1269 lArHecZmin = lArPositiveEndcap->
center().z() + lArEndcapHalfZ;
1270 else
1272
1273
1274 double caloSurfZOffset = 0;
1275
1277
1279 double rmin;
1280 double rmax;
1281 double hphi;
1284 m_calosurf->get_disk_surface(CaloCell_ID::HEC0, 1, pos,
z, rmin, rmax, hphi,
depth, &caloDDM);
1285 caloSurfZOffset = lArHecZmin -
z;
1286 lArHecZmax =
z +
depth + caloSurfZOffset;
1287 m_calosurf->get_disk_surface(CaloCell_ID::HEC3, 1, pos,
z, rmin, rmax, hphi,
depth, &caloDDM);
1288 hecEnd =
z +
depth + caloSurfZOffset;
1289 }
1290
1291
1292 double lArHecZpos = 0.5*(lArHecZmax + lArHecZmin);
1293 double lArHecHalflength = 0.5*(lArHecZmax - lArHecZmin);
1294
1295 double hecFcalCoverHalflength = 0.5*(hecEnd - lArHecZmax);
1296 double hecFcalCoverZpos = 0.5*(lArHecZmax + hecEnd);
1297
1298 lArFcalHalflength = hecFcalCoverHalflength;
1299 lArFcalZposition = hecFcalCoverZpos;
1300
1301
1302 std::vector<Trk::IdentifiedMaterial> matHEC;
1303 auto lArHecFcalCoverMaterial= std::make_shared<Trk::Material>(18.4, 201.9, 57.2, 26.1, 0.0071);
1304 auto lArHecMaterial = std::make_shared<Trk::Material>(19., 224.4, 56.7, 25.8, 0.007);
1305
1306
1313
1314
1315
1316 if (lArPositiveFcal1Bounds && lArNegativeFcal1Bounds){
1317
1318
1319
1320 lArPositiveHecFcalCoverBounds = std::make_shared<Trk::CylinderVolumeBounds>(lArPositiveFcal1Bounds->outerRadius(),
1321 lArEndcapOuterRadius,
1322 hecFcalCoverHalflength);
1323
1324 lArNegativeHecFcalCoverBounds = std::make_shared<Trk::CylinderVolumeBounds>(*lArPositiveHecFcalCoverBounds);
1325
1326 ATH_MSG_DEBUG(
"Smoothed LAr Hec (Fcal covering part) bounds : " << *lArPositiveHecFcalCoverBounds );
1327 ATH_MSG_DEBUG(
" -> at z-position: +/- " << hecFcalCoverZpos );
1328
1329
1330 Amg::Vector3D lArPositiveHecFcalCoverPos(0.,0.,hecFcalCoverZpos);
1331 Amg::Vector3D lArPositiveHecFcalCoverNeg(0.,0.,-hecFcalCoverZpos);
1332 auto lArPositiveHecFcalCoverTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArPositiveHecFcalCoverPos));
1333 auto lArNegativeHecFcalCoverTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArPositiveHecFcalCoverNeg));
1334
1335
1336
1337 std::vector<float> spCover;
1338 spCover.push_back(hecFcalCoverZpos-hecFcalCoverHalflength);
1339 spCover.push_back(entrySurf[CaloCell_ID::HEC1].
first->center().z());
1340 spCover.push_back(entrySurf[CaloCell_ID::HEC2].
first->center().z());
1341 spCover.push_back(entrySurf[CaloCell_ID::HEC3].
first->center().z());
1342 spCover.push_back(hecFcalCoverZpos+hecFcalCoverHalflength);
1344
1345
1346 std::vector<size_t> hfc{0,2,3,4};
1347
1348
1349 const Trk::BinnedMaterial lArHecFcalCoverMaterialBinPos(*lArHecFcalCoverMaterial,hfp,hfc,matHEC);
1350
1351 lArPositiveHecFcalCover = new Trk::AlignableTrackingVolume(
1352 std::move(lArPositiveHecFcalCoverTransform),
1353 std::move(lArPositiveHecFcalCoverBounds),
1354 lArHecFcalCoverMaterialBinPos,
1355 9,
1356
1357 "Calo::Detectors::LAr::PositiveHecFcalCover");
1358
1359 std::vector<float> snCover;
1360 snCover.push_back(-hecFcalCoverZpos-hecFcalCoverHalflength);
1361 snCover.push_back(entrySurf[CaloCell_ID::HEC3].
second->center().z());
1362 snCover.push_back(entrySurf[CaloCell_ID::HEC2].
second->center().z());
1363 snCover.push_back(entrySurf[CaloCell_ID::HEC1].
second->center().z());
1364 snCover.push_back(-hecFcalCoverZpos+hecFcalCoverHalflength);
1366
1367
1368 std::vector<size_t> hfcn{4,3,2,0};
1369
1370
1371 const Trk::BinnedMaterial lArHecFcalCoverMaterialBinNeg(*lArHecFcalCoverMaterial,hfn,hfcn,matHEC);
1372
1373 lArNegativeHecFcalCover = new Trk::AlignableTrackingVolume(
1374 std::move(lArNegativeHecFcalCoverTransform),
1375 std::move(lArNegativeHecFcalCoverBounds),
1376 lArHecFcalCoverMaterialBinNeg,
1377 9,
1378
1379 "Calo::Detectors::LAr::NegativeHecFcalCover");
1380 }
1381
1382
1383
1384 if (lArPositiveFcal1Bounds && lArEndcapOuterRadius != 0){
1385
1386
1387
1388 double lArHecRmin = 0.5*(lArPositiveFcal1Bounds->outerRadius()+lArEndcapInnerRadius);
1389 double lArHecRmax = lArEndcapOuterRadius;
1391
1392 lArPositiveHecBounds = std::make_shared<Trk::CylinderVolumeBounds>(lArHecRmin, lArHecRmax, lArHecHalflength);
1393 lArNegativeHecBounds = std::make_shared<Trk::CylinderVolumeBounds>(*lArPositiveHecBounds);
1394
1395 ATH_MSG_DEBUG(
"Smoothed LAr Hec bounds : " << *lArPositiveHecBounds );
1397
1398
1401 auto lArPositiveHecTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArPositiveHecPos));
1402 auto lArNegativeHecTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArPositiveHecNeg));
1403
1404
1405
1406 std::vector<float> sphec;
1407 sphec.push_back(lArHecZpos-lArHecHalflength);
1408 sphec.push_back(entrySurf[CaloCell_ID::HEC0].
first->center().z());
1409 sphec.push_back(lArHecZpos+lArHecHalflength);
1411
1412
1413 std::vector<size_t> hf{0,1};
1414
1415
1416 const Trk::BinnedMaterial lArHecMaterialBinPos(*lArHecMaterial,hp,hf,matHEC);
1417
1418 lArPositiveHec = new Trk::AlignableTrackingVolume(
1419 std::move(lArPositiveHecTransform),
1420 std::move(lArPositiveHecBounds),
1421 lArHecMaterialBinPos,
1422 8,
1423
1424 "Calo::Detectors::LAr::PositiveHec");
1425
1426
1427 std::vector<float> snhec;
1428 snhec.push_back(-lArHecZpos-lArHecHalflength);
1429 snhec.push_back(entrySurf[CaloCell_ID::HEC0].
second->center().z());
1430 snhec.push_back(-lArHecZpos+lArHecHalflength);
1432
1433
1434 std::vector<size_t>
hfn{1,0};
1435
1436
1437 const Trk::BinnedMaterial lArHecMaterialBinNeg(*lArHecMaterial,hn,hfn,matHEC);
1438
1439 lArNegativeHec = new Trk::AlignableTrackingVolume(
1440 std::move(lArNegativeHecTransform),
1441 std::move(lArNegativeHecBounds),
1442 lArHecMaterialBinNeg,
1443 8,
1444
1445 "Calo::Detectors::LAr::NegativeHec");
1446 }
1447
1448
1449
1450 std::vector<Trk::IdentifiedMaterial> matFCAL;
1451
1452 auto lArFcalMaterial = std::make_shared<Trk::Material>(8.4, 175.5, 100.8, 42.1, 0.0097);
1453 auto lArFcalMaterial0 = std::make_shared<Trk::Material>(96., 560., 30.3, 14.3, 0.0025);
1454
1455
1457 matFCAL.emplace_back(lArFcalMaterial0,0);
1458 matFCAL.emplace_back(lArFcalMaterial->scale(0.5),baseID+1);
1459 matFCAL.emplace_back(lArFcalMaterial->scale(1.5),baseID+2);
1460 matFCAL.emplace_back(lArFcalMaterial->scale(1.4),baseID+3);
1461
1462
1463 if (lArPositiveFcal1Bounds && lArPositiveFcal2Bounds && lArPositiveFcal3Bounds &&
1464 lArNegativeFcal1Bounds && lArNegativeFcal2Bounds && lArNegativeFcal3Bounds){
1465
1466
1467 double lArFcalRmin = lArPositiveFcal1Bounds->innerRadius();
1468 double lArFcalRmax = lArPositiveFcal1Bounds->outerRadius();
1469
1470 lArPositiveFcalBounds = std::make_shared<Trk::CylinderVolumeBounds>(lArFcalRmin, lArFcalRmax, lArFcalHalflength);
1471 lArNegativeFcalBounds = std::make_shared<Trk::CylinderVolumeBounds>(*lArPositiveFcalBounds);
1472
1473 ATH_MSG_DEBUG(
"Smoothed LAr Fcal bounds : " << *lArPositiveFcalBounds );
1474 ATH_MSG_DEBUG(
" -> at z-position: +/- " << lArFcalZposition );
1475
1476
1477 lArFcalZmin = lArFcalZposition - lArFcalHalflength;
1478 lArFcalZmax = lArFcalZposition + lArFcalHalflength;
1479
1480
1481 std::vector<float> spfc;
1482 spfc.push_back(lArFcalZmin);
1483 spfc.push_back(entrySurf[CaloCell_ID::FCAL0].
first->center().z());
1484 spfc.push_back(entrySurf[CaloCell_ID::FCAL1].
first->center().z());
1485 spfc.push_back(entrySurf[CaloCell_ID::FCAL2].
first->center().z());
1486 spfc.push_back(lArFcalZmax);
1488
1489
1490 std::vector<size_t> hf{0,1,2,3};
1491
1492
1493 const Trk::BinnedMaterial lArFcalMaterialBinPos(*lArFcalMaterial,fcp,hf,matFCAL);
1494
1495
1496 std::vector<float> snfc;
1497 snfc.push_back(-lArFcalZmax);
1498 snfc.push_back(entrySurf[CaloCell_ID::FCAL2].
second->center().z());
1499 snfc.push_back(entrySurf[CaloCell_ID::FCAL1].
second->center().z());
1500 snfc.push_back(entrySurf[CaloCell_ID::FCAL0].
second->center().z());
1501 snfc.push_back(-lArFcalZmin);
1503
1504
1505 std::vector<size_t>
hfn{3,2,1,0};
1506
1507
1508 const Trk::BinnedMaterial lArFcalMaterialBinNeg(*lArFcalMaterial,fcn,hfn,matFCAL);
1509
1510
1513 auto lArPositiveFcalTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArPositiveFcalPos));
1514 auto lArNegativeFcalTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArPositiveFcalNeg));
1515
1516
1517 lArPositiveFcal = new Trk::AlignableTrackingVolume(
1518 std::move(lArPositiveFcalTransform),
1519 std::move(lArPositiveFcalBounds),
1520 lArFcalMaterialBinPos,
1521 21,
1522
1523 "Calo::Detectors::LAr::PositiveFcal");
1524
1525 lArNegativeFcal = new Trk::AlignableTrackingVolume(
1526 std::move(lArNegativeFcalTransform),
1527 std::move(lArNegativeFcalBounds),
1528 lArFcalMaterialBinNeg,
1529 21,
1530
1531 "Calo::Detectors::LAr::NegativeFcal");
1532 }
1533
1534
1535
1536
1537
1538 const PVConstLink topEC = lArMgr->
getTreeTop(1U);
1541 const PVConstLink
mbts=
getChild(topEC,
"MBTS_mother",trIn);
1542
1543 float mbtsZ{-1};
1544 float mbts_rmin{0};
1545 float mbts_rmax{0};
1546
1547 if (mbts) {
1548
1549 const PVConstLink mbts1=
getChild(mbts,
"MBTS1",trIn);
1550 if (mbts1) mbtsZ=fabs(trIn.translation().z());
1551 if (mbts1) {
1553
1554 const GeoLogVol* clv = mbts1->getLogVol();
1555 const GeoTrd* trd=dynamic_cast<const GeoTrd*> (clv->getShape());
1556 if (trd) mbts_rmin = trIn.translation().perp()-trd->getZHalfLength();
1557 }
1558
1559 const PVConstLink mbts2=
getChild(mbts,
"MBTS2",tr2);
1560 if (mbts2) {
1561 const GeoLogVol* clv = mbts2->getLogVol();
1562 const GeoTrd* trd=dynamic_cast<const GeoTrd*> (clv->getShape());
1563 if (trd) mbts_rmax = (tr2.translation().
perp()+trd->getZHalfLength())/
cos(acos(-1.)/8);
1564 }
1566
1567 } else {
1569 }
1570
1571 if (mbtsZ>0. && mbts_rmin>0. && mbts_rmax>0.){
1572
1573 auto lArNegativeMBTSBounds = std::make_shared<Trk::CylinderVolumeBounds>(
1574 mbts_rmin,
1575 mbts_rmax,
1576 10. );
1577
1578 ATH_MSG_DEBUG(
"Filled in LAr MBTS bounds : " << *lArNegativeMBTSBounds );
1580
1581
1584 auto lArPositiveMBTSTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArEndcapInnerGapPos));
1585 auto lArNegativeMBTSTransform = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(lArEndcapInnerGapNeg));
1586
1587
1588 lArPositiveEndcapInnerGap = new Trk::TrackingVolume(
1589 std::move(lArPositiveMBTSTransform),
1590 std::make_shared<Trk::CylinderVolumeBounds>(*lArNegativeMBTSBounds),
1591 dummyMaterial,
1592 nullptr, nullptr,
1593 "Calo::Detectors::MBTS");
1594
1595 lArNegativeEndcapInnerGap = new Trk::TrackingVolume(
1596 std::move(lArNegativeMBTSTransform),
1597 std::move(lArNegativeMBTSBounds),
1598 dummyMaterial,
1599 nullptr, nullptr,
1600 "Calo::Detectors::MBTS");
1601 }
1602
1603 if (
msgLvl(MSG::DEBUG)) {
1604 ATH_MSG_DEBUG(
"Checking the existence of all Tracking Volumes:" );
1607 ATH_MSG_DEBUG(
" -> Calo::GapVolumes::LAr::SolenoidPresamplerGap ");
1609 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::BarrelPresampler ");
1613 if (lArPositiveEndcapInnerGap) {
1614 ATH_MSG_DEBUG(
" -> Calo::GapVolumes::LAr::PositiveEndcapInnerGap ");
1616 }
1617 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::PositiveEndcap ");
1623 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::LArPositiveHecFcalCover ");
1625 if (lArNegativeEndcapInnerGap) {
1626 ATH_MSG_DEBUG(
" -> Calo::GapVolumes::LAr::NegativeEndcapInnerGap ");
1628 }
1629 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::NegativeEndcap ");
1635 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::LArNegativeHecFcalCover ");
1637 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::LArPositiveECPresampler ");
1639 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::LArNegativeECPresampler ");
1641 }
1642
1643
1644 auto lArTrackingVolumes = std::vector<Trk::TrackingVolume*>();
1645
1646
1647 if (solenoid && solenoidLArBarrelGap && lArBarrelPresampler && lArBarrel &&
1648 lArPositiveEndcap && lArPositiveHec && lArPositiveFcal && lArPositiveHecFcalCover &&
1649 lArNegativeEndcap && lArNegativeHec && lArNegativeFcal && lArNegativeHecFcalCover){
1650
1651
1652
1653
1654 lArTrackingVolumes.push_back(solenoid);
1656 lArTrackingVolumes.push_back(solenoidLArBarrelGap);
1658 lArTrackingVolumes.push_back(lArBarrelPresampler);
1660 lArTrackingVolumes.push_back(lArBarrel);
1662
1663 lArTrackingVolumes.push_back(lArPositiveEndcapInnerGap);
1664 lArTrackingVolumes.push_back(lArPositiveEndcap);
1666 lArTrackingVolumes.push_back(lArPositiveHec);
1668 lArTrackingVolumes.push_back(lArPositiveFcal);
1670 lArTrackingVolumes.push_back(lArPositiveHecFcalCover);
1672
1673 lArTrackingVolumes.push_back(lArNegativeEndcapInnerGap);
1674 lArTrackingVolumes.push_back(lArNegativeEndcap);
1676 lArTrackingVolumes.push_back(lArNegativeHec);
1678 lArTrackingVolumes.push_back(lArNegativeFcal);
1680 lArTrackingVolumes.push_back(lArNegativeHecFcalCover);
1682 lArTrackingVolumes.push_back(lArPosECPresampler);
1684 lArTrackingVolumes.push_back(lArNegECPresampler);
1686
1687 }
1688 return lArTrackingVolumes;
1689}
Scalar perp() const
perp method - perpendicular length
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
virtual unsigned int getNumTreeTops() const override
Gets the number of tree tops.
virtual PVConstLink getTreeTop(unsigned int i) const override
Gets the ith tree top.
static void printCheckResult(MsgStream &log, const Trk::TrackingVolume *vol)
FloatProperty m_scale_HECmaterial
StringProperty m_lArMgrLocation
helper for volume creation
GeoFullPhysVol * getPhysVol()
Destructor.
static Material convert(const GeoMaterial *gm)
Single conversion , input type GeoMaterial - output type Trk::MaterialProperties.
static std::shared_ptr< CylinderVolumeBounds > convert(const GeoTubs *gtub)
Convert a tubs.
const std::vector< float > & offset() const
This method allows access to the radial offset values.
const std::vector< float > & offset() const
This method allows access to the radial offset values.
void registerColorCode(unsigned int icolor)
Register the color code.
const Amg::Vector3D & center() const
returns the center of the volume
std::string depth
tag string for intendation
bool contains(const std::string &s, const std::string ®x)
does a string contain the substring
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D
retrieve(aClass, aKey=None)