Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:27:41

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