/* This file is part of MAUS: http://micewww.pp.rl.ac.uk/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . * */ #ifndef _SRC_COMMON_CPP_UTILS_MAUSGEOMETRYNAVIGATOR_HH_ #define _SRC_COMMON_CPP_UTILS_MAUSGEOMETRYNAVIGATOR_HH_ #include #include "Geant4/G4PVPlacement.hh" #include "Geant4/G4Navigator.hh" #include "Geant4/G4Material.hh" #include "src/common_cpp/DataStructure/ThreeVector.hh" #include "src/common_cpp/Utils/Globals.hh" namespace MAUS { /** @brief Wrap the G4Navigator class to allow access to the MAUS MC geometry * * In order to allow simplified access to the MAUS Geant4 geoemtry, as the * MC sees it, this class wraps the G4Navigator class to control access. * * It is by default an instance is created in the global initialisation. You * can alternatively set your own world volume pointer to initialise a * different geometry. * * By convention only MAUS ThreeVectors are allowed as arguments. This * simplifies the interface. The user is not expected to understand anything * of Geant4 to use this class. */ class GeometryNavigator { public: /** @brief Constructor - performs default initialisation */ GeometryNavigator(); /** @brief Destructor - Deletes owned memory */ ~GeometryNavigator(); /** @brief Initialise navigator with a different geometry */ void Initialise(G4VPhysicalVolume* global_volume); /** @brief Set the current global position */ void SetPoint(ThreeVector point); /** @brief Increment the current position by the supplied displacement * * Returns the new position. This allows us to use Geant4's intelligent * stepping routines. NOT YET IMPLEMENTED. */ ThreeVector Step(ThreeVector displacement); /** @brief Returns the current global position */ ThreeVector GetCurrentPoint() const {return ToMAUSVec(_current_position);} /** @brief Gets the name of the material */ std::string GetMaterialName() const; /** @brief Returns true if there is more than one element in the material */ bool IsMixture() const; /** @brief Gets the Mass Number * * Units: g/mole * * WARNING: This function will throw an exception if the current material * is a mixture */ double GetA() const; /** @brief Gets the Atomic Number * * Unitless * * WARNING: This function will throw an exception if the current material * is a mixture */ double GetZ() const; /** @brief Gets the Nuclear interaction length * * Units: cm */ double GetNuclearInteractionLength() const; /** @brief Gets the photon attenuation length * * Units: cm */ double GetRadiationLength() const; /** @brief Gets the density * * Units: g/cm^3 */ double GetDensity() const; private: /** @brief Private copy constructor. No Copying! */ GeometryNavigator(const GeometryNavigator&) {} /** @brief Privately set the current global position * * The only function that can create the _touchable_history object. */ void _setPoint(G4ThreeVector); /** @brief Increment the current position with the displacement provided. */ G4ThreeVector _step(G4ThreeVector displacement); static G4ThreeVector ToG4Vec(ThreeVector v) {return G4ThreeVector(v.x(), v.y(), v.z());} static ThreeVector ToMAUSVec(G4ThreeVector v) {return ThreeVector(v.x(), v.y(), v.z());} G4VPhysicalVolume* _global_volume; G4Navigator* _navigator; G4TouchableHistory* _touchable_history; G4ThreeVector _current_position; G4VPhysicalVolume* _current_volume; G4Material* _current_material; }; } #endif // _SRC_COMMON_CPP_UTILS_MAUSGEOMETRYNAVIGATOR_HH_