Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // G4PVDivision 27 // 28 // Class description: 29 // 30 // Represents many touchable detector elements differing only in their 31 // positioning. The elements' positions are calculated by means of a simple 32 // linear formula. 33 // 34 // G4PVDivision(const G4String& pName, 35 // G4LogicalVolume* pLogical, 36 // G4LogicalVolume* pMother, 37 // const EAxis pAxis, 38 // const G4int nReplicas, 39 // const G4double width, 40 // const G4double offset=0) 41 // 42 // Division may occur along: 43 // 44 // o Cartesian axes (kXAxis,kYAxis,kZAxis) 45 // 46 // The divisions, of specified width have coordinates of 47 // form (-width*(nReplicas-1)*0.5+n*width,0,0) where n=0.. nReplicas-1 48 // for the case of kXAxis, and are unrotated. 49 // 50 // o Radial axis (cylindrical polar) (kRho) 51 // 52 // The divisions are cons/tubs sections, centred on the origin 53 // and are unrotated. 54 // They have radii of width*n+offset to width*(n+1)+offset 55 // where n=0..nReplicas-1 56 // 57 // o Phi axis (cylindrical polar) (kPhi) 58 // The divisions are `phi sections' or wedges, and of cons/tubs form 59 // They have phi of offset+n*width to offset+(n+1)*width where 60 // n=0..nReplicas-1 61 62 // 09.05.01 - P.Arce, Initial version 63 // ---------------------------------------------------------------------- 64 #ifndef G4PVDIVISION_HH 65 #define G4PVDIVISION_HH 66 67 #include "geomdefs.hh" 68 #include "G4PVReplica.hh" 69 #include "G4VDivisionParameterisation.hh" 70 71 class G4LogicalVolume; 72 class G4VSolid; 73 74 class G4PVDivision : public G4PVReplica 75 { 76 public: // with description 77 78 G4PVDivision(const G4String& pName, 79 G4LogicalVolume* pLogical, 80 G4LogicalVolume* pMother, 81 const EAxis pAxis, 82 const G4int nReplicas, 83 const G4double width, 84 const G4double offset ); 85 // Constructor with number of divisions and width 86 87 G4PVDivision(const G4String& pName, 88 G4LogicalVolume* pLogical, 89 G4LogicalVolume* pMotherLogical, 90 const EAxis pAxis, 91 const G4int nReplicas, 92 const G4double offset ); 93 // Constructor with number of divisions 94 95 G4PVDivision(const G4String& pName, 96 G4LogicalVolume* pLogical, 97 G4LogicalVolume* pMotherLogical, 98 const EAxis pAxis, 99 const G4double width, 100 const G4double offset ); 101 // Constructor with width 102 103 G4PVDivision(const G4String& pName, 104 G4LogicalVolume* pLogical, 105 G4VPhysicalVolume* pMother, 106 const EAxis pAxis, 107 const G4int nReplicas, 108 const G4double width, 109 const G4double offset); 110 // Constructor in mother physical volume (same as first constructor) 111 112 ~G4PVDivision() override; 113 114 G4PVDivision(const G4PVDivision&) = delete; 115 G4PVDivision& operator=(const G4PVDivision&) = delete; 116 117 G4bool IsMany() const override; 118 G4bool IsReplicated() const override; 119 G4int GetMultiplicity() const override; 120 G4VPVParameterisation* GetParameterisation() const override; 121 void GetReplicationData( EAxis& axis, 122 G4int& nReplicas, 123 G4double& width, 124 G4double& offset, 125 G4bool& consuming ) const override; 126 EAxis GetDivisionAxis() const; 127 G4bool IsParameterised() const override; 128 129 EVolume VolumeType() const override; 130 // Characterise the type of volume - normal/replicated/parameterised. 131 132 G4bool IsRegularStructure() const override; 133 G4int GetRegularStructureId() const override; 134 // Methods to identify volume that can have revised 'regular' navigation. 135 // Currently divisions do not qualify for this. 136 137 private: 138 139 void CheckAndSetParameters( const EAxis pAxis, 140 const G4int nDivs, 141 const G4double width, 142 const G4double offset, 143 DivisionType divType, 144 const G4LogicalVolume* pMotherLogical ); 145 146 void SetParameterisation( G4LogicalVolume* motherLogical, 147 const EAxis pAxis, 148 const G4int nReplicas, 149 const G4double width, 150 const G4double offset, 151 DivisionType divType ); 152 void ErrorInAxis( EAxis axis, G4VSolid* solid ); 153 154 protected: 155 156 EAxis faxis; // axis of optimisation 157 EAxis fdivAxis; // axis of division 158 G4int fnReplicas = 0; 159 G4double fwidth = 0.0, foffset = 0.0; 160 G4VDivisionParameterisation* fparam = nullptr; 161 }; 162 163 #endif 164