File indexing completed on 2025-08-05 08:09:34
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/Detector/MultiWireStructureBuilder.hpp"
0010
0011 #include "Acts/Detector/DetectorComponents.hpp"
0012 #include "Acts/Detector/DetectorVolumeBuilder.hpp"
0013 #include "Acts/Detector/LayerStructureBuilder.hpp"
0014 #include "Acts/Detector/ProtoBinning.hpp"
0015 #include "Acts/Detector/VolumeStructureBuilder.hpp"
0016 #include "Acts/Detector/detail/IndexedSurfacesGenerator.hpp"
0017 #include "Acts/Detector/detail/ReferenceGenerators.hpp"
0018 #include "Acts/Detector/interface/IExternalStructureBuilder.hpp"
0019 #include "Acts/Detector/interface/IInternalStructureBuilder.hpp"
0020 #include "Acts/Geometry/GeometryContext.hpp"
0021 #include "Acts/Geometry/VolumeBounds.hpp"
0022 #include "Acts/Navigation/DetectorVolumeFinders.hpp"
0023 #include "Acts/Navigation/SurfaceCandidatesUpdaters.hpp"
0024 #include "Acts/Utilities/GridAxisGenerators.hpp"
0025 #include "Acts/Utilities/Logger.hpp"
0026
0027 #include <algorithm>
0028 #include <functional>
0029 #include <iostream>
0030 #include <string>
0031 #include <vector>
0032
0033 class MultiWireInternalStructureBuilder
0034 : public Acts::Experimental::IInternalStructureBuilder {
0035 public:
0036 struct Config {
0037
0038 std::vector<std::shared_ptr<Acts::Surface>> iSurfaces;
0039
0040
0041 std::vector<Acts::Experimental::ProtoBinning> binning;
0042
0043
0044 std::string auxiliary = "";
0045
0046
0047 Acts::Transform3 transform = Acts::Transform3::Identity();
0048 };
0049
0050
0051
0052 MultiWireInternalStructureBuilder(
0053 const Config& cfg,
0054 std::unique_ptr<const Acts::Logger> mlogger = Acts::getDefaultLogger(
0055 "MUltiWireInternalBuilder", Acts::Logging::INFO))
0056 : Acts::Experimental::IInternalStructureBuilder(),
0057 m_cfg(cfg),
0058 m_logger(std::move(mlogger)) {}
0059
0060 Acts::Experimental::InternalStructure construct(
0061 const Acts::GeometryContext& gctx) const final {
0062 if (!m_cfg.auxiliary.empty()) {
0063 ACTS_DEBUG(m_cfg.auxiliary);
0064 }
0065
0066 Acts::Experimental::DetectorVolumeUpdater internalVolumeUpdater =
0067 Acts::Experimental::tryNoVolumes();
0068
0069 auto internalSurfaces = m_cfg.iSurfaces;
0070 Acts::Experimental::detail::IndexedSurfacesGenerator<
0071 decltype(internalSurfaces), Acts::Experimental::MultiLayerSurfacesImpl>
0072 isg{internalSurfaces,
0073 {},
0074 {m_cfg.binning[0u].binValue, m_cfg.binning[1u].binValue},
0075 {m_cfg.binning[0u].expansion, m_cfg.binning[1u].expansion},
0076 m_cfg.transform};
0077 Acts::Experimental::detail::CenterReferenceGenerator rGenerator;
0078 Acts::GridAxisGenerators::EqBoundEqBound aGenerator{
0079 {m_cfg.binning[0u].edges.front(), m_cfg.binning[0u].edges.back()},
0080 m_cfg.binning[0u].edges.size() - 1,
0081 {m_cfg.binning[1u].edges.front(), m_cfg.binning[1u].edges.back()},
0082 m_cfg.binning[1u].edges.size() - 1};
0083
0084 auto sfCandidatesUpdater = isg(gctx, aGenerator, rGenerator);
0085
0086 return {internalSurfaces,
0087 {},
0088 std::move(sfCandidatesUpdater),
0089 std::move(internalVolumeUpdater)};
0090 }
0091
0092 private:
0093
0094 Config m_cfg;
0095
0096
0097 const Acts::Logger& logger() const { return *m_logger; }
0098
0099
0100 std::unique_ptr<const Acts::Logger> m_logger;
0101 };
0102
0103 Acts::Experimental::MultiWireStructureBuilder::MultiWireStructureBuilder(
0104 const Acts::Experimental::MultiWireStructureBuilder::Config& config,
0105 std::unique_ptr<const Acts::Logger> logger)
0106 : mCfg(config), mLogger(std::move(logger)) {
0107
0108 if (mCfg.mlSurfaces.empty()) {
0109 throw std::invalid_argument(
0110 "MultiWireStructureBuilder: No surfaces are given");
0111 } else if (mCfg.mlBinning.size() != 2u) {
0112 throw ::std::invalid_argument(
0113 "MultiWireStructureBuilder: Invalid binning provided");
0114 }
0115 }
0116
0117 Acts::Experimental::DetectorComponent
0118 Acts::Experimental::MultiWireStructureBuilder::construct(
0119 const Acts::GeometryContext& gctx) {
0120
0121 Acts::Experimental::VolumeStructureBuilder::Config vsConfig;
0122 vsConfig.boundsType = Acts::VolumeBounds::eTrapezoid;
0123 vsConfig.transform = mCfg.transform;
0124 vsConfig.boundValues = mCfg.mlBounds;
0125 vsConfig.auxiliary = "Construct External Structure";
0126
0127
0128 MultiWireInternalStructureBuilder::Config iConfig;
0129 iConfig.iSurfaces = mCfg.mlSurfaces;
0130 iConfig.binning = mCfg.mlBinning;
0131 iConfig.transform = mCfg.transform.inverse();
0132 iConfig.auxiliary = "Construct Internal Structure";
0133
0134 Acts::Experimental::DetectorVolumeBuilder::Config dvConfig;
0135 dvConfig.auxiliary = "Construct Detector Volume";
0136 dvConfig.name = mCfg.name;
0137 dvConfig.internalsBuilder =
0138 std::make_shared<MultiWireInternalStructureBuilder>(
0139 iConfig,
0140 Acts::getDefaultLogger("MultiWire Internal Structure Builder",
0141 Acts::Logging::VERBOSE));
0142 dvConfig.externalsBuilder =
0143 std::make_shared<Acts::Experimental::VolumeStructureBuilder>(
0144 vsConfig, Acts::getDefaultLogger("VolumeStructureBuilder",
0145 Acts::Logging::VERBOSE));
0146 auto dvBuilder = std::make_shared<Acts::Experimental::DetectorVolumeBuilder>(
0147 dvConfig,
0148 Acts::getDefaultLogger("DetectorVolumeBuilder", Acts::Logging::VERBOSE));
0149
0150 auto dvComponent = dvBuilder->construct(gctx);
0151
0152 return dvComponent;
0153 }