801 Acts::CylinderVolumeBuilder::Config cvbCfg;
802 Acts::CylinderVolumeBuilder cvb(
806 Acts::VolumeConfig sctNegEC =
807 cvb.analyzeContent(gctx, sct_lb.negativeLayers(gctx), {});
809 Acts::VolumeConfig sctPosEC =
810 cvb.analyzeContent(gctx, sct_lb.positiveLayers(gctx), {});
812 Acts::VolumeConfig sctBrl =
813 cvb.analyzeContent(gctx, sct_lb.centralLayers(gctx), {});
816 Acts::VolumeConfig trtNegEC =
817 cvb.analyzeContent(gctx, trt_lb.negativeLayers(gctx), {});
819 Acts::VolumeConfig trtPosEC =
820 cvb.analyzeContent(gctx, trt_lb.positiveLayers(gctx), {});
822 Acts::VolumeConfig trtBrl =
823 cvb.analyzeContent(gctx, trt_lb.centralLayers(gctx), {});
827 double absZMinEC =
std::min(std::abs(trtNegEC.zMax), std::abs(trtPosEC.zMin));
828 double absZMaxEC =
std::max(std::abs(trtNegEC.zMin), std::abs(trtPosEC.zMax));
830 trtNegEC.zMin = -absZMaxEC;
831 trtNegEC.zMax = -absZMinEC;
832 trtPosEC.zMin = absZMinEC;
833 trtPosEC.zMax = absZMaxEC;
835 using CVBBV = Acts::CylinderVolumeBounds::BoundValues;
838 bool isSCTSmallerInZ =
false;
840 ATH_MSG_VERBOSE(
"Shrinking SCT in R (and maybe in increase size in Z) to fit around Pixel");
841 auto pixelBounds =
dynamic_cast<const Acts::CylinderVolumeBounds *
>(
842 &
pixel->volumeBounds());
843 double sctNegECzMin =
std::min(sctNegEC.zMin, -pixelBounds->get(CVBBV::eHalfLengthZ));
844 double sctPosECzMax =
std::max(sctPosEC.zMax, pixelBounds->get(CVBBV::eHalfLengthZ));
846 ATH_MSG_VERBOSE(
"- SCT +-EC.rMin: " << sctNegEC.rMin <<
" -> " << pixelBounds->get(CVBBV::eMaxR));
847 ATH_MSG_VERBOSE(
"- SCT BRL.rMin: " << sctBrl.rMin <<
" -> " << pixelBounds->get(CVBBV::eMaxR));
848 ATH_MSG_VERBOSE(
"- SCT EC.zMin: " << sctNegEC.zMin <<
" -> " << sctNegECzMin);
849 ATH_MSG_VERBOSE(
"- SCT EC.zMax: " << sctPosEC.zMax <<
" -> " << sctPosECzMax);
851 sctNegEC.rMin = pixelBounds->get(CVBBV::eMaxR);
852 sctPosEC.rMin = pixelBounds->get(CVBBV::eMaxR);
853 sctBrl.rMin = pixelBounds->get(CVBBV::eMaxR);
855 isSCTSmallerInZ = sctPosEC.zMax < pixelBounds->get(CVBBV::eHalfLengthZ);
857 sctNegEC.zMin = sctNegECzMin;
858 sctPosEC.zMax = sctPosECzMax;
868 << sctNegEC.toString());
869 ATH_MSG_VERBOSE(
"- SCT::Barrel: " << sctBrl.layers.size() <<
" layers, "
870 << sctBrl.toString());
873 << sctPosEC.toString());
878 << trtNegEC.toString());
879 ATH_MSG_VERBOSE(
"- TRT::Barrel: " << trtBrl.layers.size() <<
" layers, "
880 << trtBrl.toString());
883 << trtPosEC.toString());
887 sctBrl.zMax = (sctBrl.zMax + sctPosEC.zMin) / 2.;
888 sctBrl.zMin = -sctBrl.zMax;
892 trtBrl.zMin = sctBrl.zMin;
893 trtBrl.zMax = sctBrl.zMax;
896 trtNegEC.zMin = sctNegEC.zMin;
897 trtPosEC.zMax = sctPosEC.zMax;
900 trtNegEC.zMax = trtBrl.zMin;
901 sctNegEC.zMax = trtBrl.zMin;
902 trtPosEC.zMin = trtBrl.zMax;
903 sctPosEC.zMin = trtBrl.zMax;
906 sctBrl.rMax = trtBrl.rMin;
907 sctNegEC.rMax = trtNegEC.rMin;
908 sctPosEC.rMax = trtPosEC.rMin;
911 trtNegEC.rMax = trtBrl.rMax;
912 trtPosEC.rMax = trtBrl.rMax;
914 ATH_MSG_VERBOSE(
"Dimensions after synchronization between SCT and TRT");
918 << sctNegEC.toString());
919 ATH_MSG_VERBOSE(
"- SCT::Barrel: " << sctBrl.layers.size() <<
" layers, "
920 << sctBrl.toString());
923 << sctPosEC.toString());
928 << trtNegEC.toString());
929 ATH_MSG_VERBOSE(
"- TRT::Barrel: " << trtBrl.layers.size() <<
" layers, "
930 << trtBrl.toString());
933 << trtPosEC.toString());
935 auto makeTVol = [&](
const auto &vConf,
const auto &
name) {
936 return cvh.createTrackingVolume(gctx, vConf.layers, {},
938 vConf.rMin, vConf.rMax, vConf.zMin,
943 auto tvSctNegEC = makeTVol(sctNegEC,
"SCT::NegativeEndcap");
944 auto tvSctBrl = makeTVol(sctBrl,
"SCT::Barrel");
945 auto tvSctPosEC = makeTVol(sctPosEC,
"SCT::PositiveEndcap");
947 auto tvTrtNegEC = makeTVol(trtNegEC,
"TRT::NegativeEndcap");
948 auto tvTrtBrl = makeTVol(trtBrl,
"TRT::Barrel");
949 auto tvTrtPosEC = makeTVol(trtPosEC,
"TRT::PositiveEndcap");
953 cvh.createContainerTrackingVolume(gctx, {tvSctNegEC, tvTrtNegEC});
955 cvh.createContainerTrackingVolume(gctx, {tvSctPosEC, tvTrtPosEC});
956 auto barrel = cvh.createContainerTrackingVolume(gctx, {tvSctBrl, tvTrtBrl});
961 cvh.createContainerTrackingVolume(gctx, {negEC,
barrel, posEC});
966 auto containerBounds =
dynamic_cast<const Acts::CylinderVolumeBounds *
>(
967 &container->volumeBounds());
968 auto pixelBounds =
dynamic_cast<const Acts::CylinderVolumeBounds *
>(
969 &
pixel->volumeBounds());
970 std::vector<std::shared_ptr<Acts::TrackingVolume>> noVolumes;
972 if(!isSCTSmallerInZ) {
974 auto posGap = cvh.createGapTrackingVolume(
977 pixelBounds->get(CVBBV::eMinR), pixelBounds->get(CVBBV::eMaxR),
978 pixelBounds->get(CVBBV::eHalfLengthZ),
979 containerBounds->get(CVBBV::eHalfLengthZ),
982 "Pixel::PositiveGap");
983 auto negGap = cvh.createGapTrackingVolume(
986 pixelBounds->get(CVBBV::eMinR), pixelBounds->get(CVBBV::eMaxR),
987 -containerBounds->get(CVBBV::eHalfLengthZ),
988 -pixelBounds->get(CVBBV::eHalfLengthZ),
991 "Pixel::NegativeGap");
993 auto pixelContainer =
994 cvh.createContainerTrackingVolume(gctx, {negGap,
pixel, posGap});
997 cvh.createContainerTrackingVolume(gctx, {pixelContainer, container});
1002 cvh.createContainerTrackingVolume(gctx, {
pixel, container});