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 /* 27 * ============================================================================= 28 * 29 * Filename: CexmcSetup.hh 30 * 31 * Description: physical setup 32 * 33 * Version: 1.0 34 * Created: 10.10.2009 23:15:21 35 * Revision: none 36 * Compiler: gcc 37 * 38 * Author: Alexey Radkov (), 39 * Company: PNPI 40 * 41 * ============================================================================= 42 */ 43 44 #ifndef CEXMC_SETUP_HH 45 #define CEXMC_SETUP_HH 46 47 #include <G4VUserDetectorConstruction.hh> 48 #include <G4AffineTransform.hh> 49 #include <G4ThreeVector.hh> 50 #include <G4RotationMatrix.hh> 51 #include <G4String.hh> 52 #include "CexmcSensitiveDetectorsAttributes.hh" 53 54 class G4GDMLParser; 55 class G4LogicalVolume; 56 class G4VPhysicalVolume; 57 58 59 class CexmcSetup : public G4VUserDetectorConstruction 60 { 61 public: 62 enum SpecialVolumeType 63 { 64 Monitor, 65 VetoCounter, 66 Calorimeter, 67 Target 68 }; 69 70 struct CalorimeterGeometryData 71 { 72 CalorimeterGeometryData() : 73 nCrystalsInColumn( 1 ), nCrystalsInRow( 1 ), crystalWidth( 0 ), 74 crystalHeight( 0 ), crystalLength( 0 ) 75 {} 76 77 G4int nCrystalsInColumn; 78 79 G4int nCrystalsInRow; 80 81 G4double crystalWidth; 82 83 G4double crystalHeight; 84 85 G4double crystalLength; 86 }; 87 88 public: 89 explicit CexmcSetup( const G4String & gdmlFile = "default.gdml", 90 G4bool validateGDMLFile = false ); 91 92 G4VPhysicalVolume * Construct( void ); 93 94 public: 95 const G4AffineTransform & GetTargetTransform( void ) const; 96 97 const G4AffineTransform & GetCalorimeterLeftTransform( void ) const; 98 99 const G4AffineTransform & GetCalorimeterRightTransform( void ) const; 100 101 void ConvertToCrystalGeometry( const G4ThreeVector & src, 102 G4int & row, G4int & column, G4ThreeVector & dst ) const; 103 104 const CalorimeterGeometryData & GetCalorimeterGeometry( void ) const; 105 106 const G4LogicalVolume * GetVolume( SpecialVolumeType volume ) const; 107 108 G4bool IsRightDetector( const G4VPhysicalVolume * pVolume ) const; 109 110 G4bool IsRightCalorimeter( const G4VPhysicalVolume * pVolume ) const; 111 112 private: 113 void SetupSpecialVolumes( const G4GDMLParser & gdmlParser ); 114 115 void ReadTransforms( const G4GDMLParser & gdmlParser ); 116 117 void ReadCalorimeterGeometryData( const G4LogicalVolume * lVolume ); 118 119 void ReadRightDetectors( void ); 120 121 private: 122 static void AssertAndAsignDetectorRole( 123 CexmcDetectorRole & detectorRole, CexmcDetectorRole value ); 124 125 static void RotateMatrix( const G4ThreeVector & pos, 126 G4RotationMatrix & rm ); 127 128 private: 129 G4VPhysicalVolume * world; 130 131 G4String gdmlFile; 132 133 G4bool validateGDMLFile; 134 135 G4bool calorimeterRegionInitialized; 136 137 G4bool calorimeterGeometryDataInitialized; 138 139 G4LogicalVolume * monitorVolume; 140 141 G4LogicalVolume * vetoCounterVolume; 142 143 G4LogicalVolume * calorimeterVolume; 144 145 G4LogicalVolume * targetVolume; 146 147 G4VPhysicalVolume * rightVetoCounter; 148 149 G4VPhysicalVolume * rightCalorimeter; 150 151 G4AffineTransform targetTransform; 152 153 G4AffineTransform calorimeterLeftTransform; 154 155 G4AffineTransform calorimeterRightTransform; 156 157 CalorimeterGeometryData calorimeterGeometry; 158 }; 159 160 161 inline const G4AffineTransform & CexmcSetup::GetTargetTransform( void ) const 162 { 163 return targetTransform; 164 } 165 166 167 inline const G4AffineTransform & CexmcSetup::GetCalorimeterLeftTransform( 168 void ) const 169 { 170 return calorimeterLeftTransform; 171 } 172 173 174 inline const G4AffineTransform & CexmcSetup::GetCalorimeterRightTransform( 175 void ) const 176 { 177 return calorimeterRightTransform; 178 } 179 180 181 inline const CexmcSetup::CalorimeterGeometryData & 182 CexmcSetup::GetCalorimeterGeometry( void ) const 183 { 184 return calorimeterGeometry; 185 } 186 187 188 inline const G4LogicalVolume * CexmcSetup::GetVolume( 189 SpecialVolumeType volume ) const 190 { 191 switch ( volume ) 192 { 193 case Monitor : 194 return monitorVolume; 195 case VetoCounter : 196 return vetoCounterVolume; 197 case Calorimeter : 198 return calorimeterVolume; 199 case Target : 200 return targetVolume; 201 default : 202 return NULL; 203 } 204 } 205 206 207 inline G4bool CexmcSetup::IsRightDetector( 208 const G4VPhysicalVolume * pVolume ) const 209 { 210 if ( pVolume == rightVetoCounter || pVolume == rightCalorimeter ) 211 return true; 212 213 return false; 214 } 215 216 217 inline G4bool CexmcSetup::IsRightCalorimeter( 218 const G4VPhysicalVolume * pVolume ) const 219 { 220 if ( pVolume == rightCalorimeter ) 221 return true; 222 223 return false; 224 } 225 226 227 #endif 228 229