Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-09 08:30:04

0001 //==========================================================================
0002 //  AIDA Detector description implementation 
0003 //--------------------------------------------------------------------------
0004 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
0005 // All rights reserved.
0006 //
0007 // For the licensing terms see $DD4hepINSTALL/LICENSE.
0008 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
0009 //
0010 // Author     : M.Frank
0011 //
0012 //==========================================================================
0013 #ifndef DDG4_GEANT4VOLUMEMANAGER_H
0014 #define DDG4_GEANT4VOLUMEMANAGER_H
0015 
0016 // Framework include files
0017 #include <DD4hep/Detector.h>
0018 #include <DD4hep/IDDescriptor.h>
0019 #include <DDG4/Geant4Primitives.h>
0020 
0021 // Geant4 include files
0022 #include <G4VTouchable.hh>
0023 
0024 // Geant4 forward declarations
0025 class G4VPhysicalVolume;
0026 
0027 
0028 /// Namespace for the AIDA detector description toolkit
0029 namespace dd4hep {
0030 
0031   /// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit
0032   namespace sim {
0033 
0034     // Forward declarations
0035     class Geant4VolumeManager;
0036     class Geant4GeometryInfo;
0037 
0038     /// The Geant4VolumeManager to facilitate optimized lookups of cell IDs from touchables.
0039     /** @class Geant4VolumeManager Geant4VolumeManager.h DDG4/Geant4VolumeManager.h
0040      *
0041      * @author  M.Frank
0042      * @version 1.0
0043      */
0044     class Geant4VolumeManager : public Handle<Geant4GeometryInfo>   {
0045     protected:
0046       /// Check the validity of the information before accessing it.
0047       bool checkValidity() const;
0048     protected:
0049       friend class Geant4Mapping;
0050       
0051       /// Default constructor
0052       Geant4VolumeManager() = default;
0053       /// Constructor to be used when reading the already parsed object
0054       Geant4VolumeManager(const Handle<Geant4GeometryInfo>& e)
0055         : Handle<Geant4GeometryInfo>(e) {  }
0056       /// Constructor to be used when reading the already parsed object
0057       Geant4VolumeManager(const Geant4VolumeManager& e) = default;
0058       /// Constructor to be used when reading the already parsed object
0059       template <typename Q> Geant4VolumeManager(const Handle<Q>& e)
0060         : Handle<Geant4GeometryInfo>(e) {
0061       }
0062       /// Assignment operator
0063       Geant4VolumeManager& operator=(const Geant4VolumeManager& c) = default;
0064       
0065     public:
0066       static const VolumeID InvalidPath = VolumeID(-1LL);
0067       static const VolumeID Insensitive = VolumeID(-2LL);
0068       static const VolumeID NonExisting = 0ULL;
0069 
0070       /// Initializing constructor. The tree will automatically be built if possible
0071       Geant4VolumeManager(const Detector& description, Geant4GeometryInfo* info);
0072 
0073       /// Helper: Generate placement path from touchable object
0074       std::vector<const G4VPhysicalVolume*>
0075       placementPath(const G4VTouchable* touchable, bool exception = true) const;
0076       /// Access CELLID by Geant4 touchable object
0077       VolumeID volumeID(const G4VTouchable* touchable) const;
0078       /// Accessfully decoded volume fields  by placement path
0079       void volumeDescriptor(const std::vector<const G4VPhysicalVolume*>& path,
0080                             std::pair<VolumeID,std::vector<std::pair<const BitFieldElement*, VolumeID> > >& volume_desc) const;
0081       /// Access fully decoded volume fields by Geant4 touchable object
0082       void volumeDescriptor(const G4VTouchable* touchable,
0083                             std::pair<VolumeID,std::vector<std::pair<const BitFieldElement*, VolumeID> > >& volume_desc) const;
0084     };
0085   }    // End namespace sim
0086 }      // End namespace dd4hep
0087 #endif // DDG4_GEANT4VOLUMEMANAGER_H