Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 /// \file common/src/DetectorConstruction0.cc 27 /// \file common/src/DetectorConstruction0.cc 28 /// \brief Implementation of the Common::Detec 28 /// \brief Implementation of the Common::DetectorConstruction0 class 29 29 30 #include "DetectorConstruction0.hh" 30 #include "DetectorConstruction0.hh" 31 31 32 #include "G4Box.hh" << 33 #include "G4GenericMessenger.hh" << 34 #include "G4LogicalVolume.hh" << 35 #include "G4Material.hh" 32 #include "G4Material.hh" 36 #include "G4NistManager.hh" 33 #include "G4NistManager.hh" >> 34 #include "G4Box.hh" >> 35 #include "G4LogicalVolume.hh" 37 #include "G4PVPlacement.hh" 36 #include "G4PVPlacement.hh" >> 37 #include "G4GenericMessenger.hh" 38 38 39 namespace Common 39 namespace Common 40 { 40 { 41 41 42 //....oooOO0OOooo........oooOO0OOooo........oo 42 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 43 43 44 DetectorConstruction0::DetectorConstruction0(c << 44 DetectorConstruction0::DetectorConstruction0( 45 G << 45 const G4String& materialName, 46 : fMaterialName(materialName), fDimensions(h << 46 G4double hx, G4double hy, G4double hz) >> 47 : fMaterialName(materialName), >> 48 fDimensions(hx, hy, hz) 47 { 49 { 48 DefineCommands(); 50 DefineCommands(); 49 } 51 } 50 52 51 //....oooOO0OOooo........oooOO0OOooo........oo 53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 52 54 53 DetectorConstruction0::~DetectorConstruction0( 55 DetectorConstruction0::~DetectorConstruction0() 54 { 56 { 55 delete fMessenger; 57 delete fMessenger; 56 } 58 } 57 59 58 //....oooOO0OOooo........oooOO0OOooo........oo 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 59 61 60 G4VPhysicalVolume* DetectorConstruction0::Cons 62 G4VPhysicalVolume* DetectorConstruction0::Construct() 61 { 63 { 62 // Define materials via NIST manager 64 // Define materials via NIST manager 63 // 65 // 64 auto nistManager = G4NistManager::Instance() 66 auto nistManager = G4NistManager::Instance(); 65 67 66 auto material = nistManager->FindOrBuildMate 68 auto material = nistManager->FindOrBuildMaterial(fMaterialName); 67 69 68 // World 70 // World 69 // 71 // 70 auto sWorld = new G4Box("World", // name << 72 auto sWorld 71 fDimensions.x(), // << 73 = new G4Box("World", //name 72 fDimensions.y(), fDi << 74 fDimensions.x(), //dimensions (half-lentghs) 73 << 75 fDimensions.y(), 74 fWorldVolume = new G4LogicalVolume(sWorld, << 76 fDimensions.z()); 75 material, << 77 76 "World"); << 78 fWorldVolume 77 << 79 = new G4LogicalVolume(sWorld, //shape 78 auto pWorld = new G4PVPlacement(0, // no ro << 80 material, //material 79 G4ThreeVecto << 81 "World"); //name 80 fWorldVolume << 82 81 "World", // << 83 auto pWorld 82 0, // mothe << 84 = new G4PVPlacement(0, //no rotation 83 false, // n << 85 G4ThreeVector(), //at (0,0,0) 84 0); // copy << 86 fWorldVolume, //logical volume >> 87 "World", //name >> 88 0, //mother volume >> 89 false, //no boolean operation >> 90 0); //copy number 85 91 86 // always return the root volume << 92 //always return the root volume 87 // 93 // 88 return pWorld; 94 return pWorld; 89 } 95 } 90 96 91 //....oooOO0OOooo........oooOO0OOooo........oo 97 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 92 98 93 void DetectorConstruction0::SetMaterial(const 99 void DetectorConstruction0::SetMaterial(const G4String& materialName) 94 { 100 { 95 auto nistManager = G4NistManager::Instance() 101 auto nistManager = G4NistManager::Instance(); 96 102 97 auto newMaterial = nistManager->FindOrBuildM 103 auto newMaterial = nistManager->FindOrBuildMaterial(materialName); 98 if (!newMaterial) { << 104 if ( ! newMaterial ) { 99 G4cerr << "Material " << materialName << " 105 G4cerr << "Material " << materialName << " not found." << G4endl; 100 G4cerr << "The box material was not change 106 G4cerr << "The box material was not changed." << G4endl; 101 return; 107 return; 102 } 108 } 103 109 104 if (fWorldVolume) fWorldVolume->SetMaterial( << 110 if ( fWorldVolume ) fWorldVolume->SetMaterial(newMaterial); 105 G4cout << "Material of box changed to " << m 111 G4cout << "Material of box changed to " << materialName << G4endl; 106 } 112 } 107 113 108 //....oooOO0OOooo........oooOO0OOooo........oo 114 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 109 115 110 void DetectorConstruction0::SetDimensions(G4Th 116 void DetectorConstruction0::SetDimensions(G4ThreeVector dimensions) 111 { 117 { 112 /// Set world dimension (in half lengths). << 118 /// Set world dimension (in half lengths). 113 /// This setting has effect only if called i << 119 /// This setting has effect only if called in PreInit> phase 114 120 115 fDimensions = dimensions; 121 fDimensions = dimensions; 116 } 122 } 117 123 118 //....oooOO0OOooo........oooOO0OOooo........oo 124 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 119 125 120 void DetectorConstruction0::DefineCommands() 126 void DetectorConstruction0::DefineCommands() 121 { 127 { 122 // Define /B5/detector command directory usi 128 // Define /B5/detector command directory using generic messenger class 123 fMessenger = new G4GenericMessenger(this, "/ << 129 fMessenger = new G4GenericMessenger(this, >> 130 "/detector/", >> 131 "Detector control"); 124 132 125 // setMaterial command 133 // setMaterial command 126 auto& setMaterialCmd = fMessenger->DeclareMe << 134 auto& setMaterialCmd 127 "setMaterial", &DetectorConstruction0::Set << 135 = fMessenger->DeclareMethod("setMaterial", >> 136 &DetectorConstruction0::SetMaterial, >> 137 "Set world material name."); 128 setMaterialCmd.SetParameterName("materialNam 138 setMaterialCmd.SetParameterName("materialName", false); 129 setMaterialCmd.SetDefaultValue("G4_AIR"); 139 setMaterialCmd.SetDefaultValue("G4_AIR"); 130 setMaterialCmd.SetStates(G4State_PreInit); 140 setMaterialCmd.SetStates(G4State_PreInit); 131 141 132 // setDimensions command 142 // setDimensions command 133 auto& setDimensionsCmd = << 143 auto& setDimensionsCmd 134 fMessenger->DeclareMethodWithUnit("setDime << 144 = fMessenger->DeclareMethodWithUnit("setDimensions", "mm", 135 "Set wor << 145 &DetectorConstruction0::SetDimensions, >> 146 "Set world dimensions (in half lentgh)."); 136 setDimensionsCmd.SetParameterName("dimension 147 setDimensionsCmd.SetParameterName("dimensions", false); 137 setDimensionsCmd.SetStates(G4State_PreInit); 148 setDimensionsCmd.SetStates(G4State_PreInit); 138 } 149 } 139 150 140 //....oooOO0OOooo........oooOO0OOooo........oo 151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 141 152 142 } // namespace Common << 153 } 143 154