Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-18 08:33:15

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Plugins/Geant4/Geant4PhysicalVolumeSelectors.hpp"
0013 #include "Acts/Surfaces/Surface.hpp"
0014 
0015 #include <cstddef>
0016 #include <memory>
0017 #include <tuple>
0018 #include <vector>
0019 
0020 namespace HepGeom {
0021 class Transform3D;
0022 }
0023 
0024 class G4VPhysicalVolume;
0025 using G4Transform3D = HepGeom::Transform3D;
0026 
0027 namespace Acts {
0028 
0029 class Geant4DetectorElement;
0030 class IGeant4PhysicalVolumeSelector;
0031 class Surface;
0032 
0033 /// A factory to convert Geant4 physical volumes
0034 /// into Geant4 detector elements
0035 ///
0036 class Geant4DetectorSurfaceFactory {
0037  public:
0038   /// Nested configuration struct that holds
0039   /// global lifetime configuration
0040   struct Config {};
0041 
0042   // Collect the sensitive surfaces
0043   using Geant4SensitiveSurface =
0044       std::tuple<std::shared_ptr<Geant4DetectorElement>,
0045                  std::shared_ptr<Surface>>;
0046 
0047   // Collect the passive surfaces
0048   using Geant4PassiveSurface = std::shared_ptr<Surface>;
0049 
0050   /// Nested cache that records the conversion status
0051   struct Cache {
0052     /// The created detector elements - for the detector store
0053     std::vector<Geant4SensitiveSurface> sensitiveSurfaces;
0054     /// The created non-const surfaces - for further processing,
0055     std::vector<Geant4PassiveSurface> passiveSurfaces;
0056     /// matching and conversion statistics: volumes
0057     std::size_t matchedG4Volumes = 0;
0058     /// matching and conversion statistics: surfaces
0059     std::size_t convertedSurfaces = 0;
0060     /// matching and conversion statistics: materials
0061     std::size_t convertedMaterials = 0;
0062   };
0063 
0064   /// Nested option struct that allows per call changeable configuration
0065   struct Options {
0066     /// Convert the length scale
0067     double scaleConversion = 1.;
0068     /// Convert the material
0069     bool convertMaterial = false;
0070     /// Converted material thickness (< 0 indicates keeping original thickness)
0071     double convertedMaterialThickness = -1;
0072     /// A selector for sensitive surfaces
0073     std::shared_ptr<IGeant4PhysicalVolumeSelector> sensitiveSurfaceSelector =
0074         nullptr;
0075     /// A selector for passive surfaces
0076     std::shared_ptr<IGeant4PhysicalVolumeSelector> passiveSurfaceSelector =
0077         nullptr;
0078   };
0079 
0080   /// The Geant4 detector element factory
0081   Geant4DetectorSurfaceFactory() = default;
0082 
0083   /// Construction method of the detector elements
0084   ///
0085   /// @param cache [in,out] into which the Elements are filled
0086   /// @param g4ToGlobal the transformation to global
0087   /// @param g4PhysVol the current physical volume
0088   /// @param option the factory creation option
0089   ///
0090   void construct(Cache& cache, const G4Transform3D& g4ToGlobal,
0091                  const G4VPhysicalVolume& g4PhysVol, const Options& option);
0092 };
0093 
0094 }  // namespace Acts