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 // $Id$ 26 // 27 // 27 /// \file common/src/DetectorConstruction0.cc << 28 /// \file DetectorConstruction0.cc 28 /// \brief Implementation of the Common::Detec << 29 /// \brief Implementation of the DetectorConstruction0 class 29 30 30 #include "DetectorConstruction0.hh" 31 #include "DetectorConstruction0.hh" 31 32 32 #include "G4Box.hh" << 33 #include "G4GenericMessenger.hh" << 34 #include "G4LogicalVolume.hh" << 35 #include "G4Material.hh" 33 #include "G4Material.hh" 36 #include "G4NistManager.hh" 34 #include "G4NistManager.hh" >> 35 #include "G4Box.hh" >> 36 #include "G4LogicalVolume.hh" 37 #include "G4PVPlacement.hh" 37 #include "G4PVPlacement.hh" 38 << 38 #include "G4GenericMessenger.hh" 39 namespace Common << 40 { << 41 39 42 //....oooOO0OOooo........oooOO0OOooo........oo 40 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 43 41 44 DetectorConstruction0::DetectorConstruction0(c << 42 DetectorConstruction0::DetectorConstruction0( 45 G << 43 const G4String& materialName, 46 : fMaterialName(materialName), fDimensions(h << 44 G4double hx, G4double hy, G4double hz) >> 45 : G4VUserDetectorConstruction(), >> 46 fMessenger(nullptr), >> 47 fMaterialName(materialName), >> 48 fDimensions(hx, hy, hz), >> 49 fWorldVolume(nullptr) 47 { 50 { 48 DefineCommands(); 51 DefineCommands(); 49 } 52 } 50 53 51 //....oooOO0OOooo........oooOO0OOooo........oo 54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 52 55 53 DetectorConstruction0::~DetectorConstruction0( 56 DetectorConstruction0::~DetectorConstruction0() 54 { 57 { 55 delete fMessenger; 58 delete fMessenger; 56 } 59 } 57 60 58 //....oooOO0OOooo........oooOO0OOooo........oo 61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 59 62 60 G4VPhysicalVolume* DetectorConstruction0::Cons 63 G4VPhysicalVolume* DetectorConstruction0::Construct() 61 { 64 { 62 // Define materials via NIST manager 65 // Define materials via NIST manager 63 // 66 // 64 auto nistManager = G4NistManager::Instance() 67 auto nistManager = G4NistManager::Instance(); 65 68 66 auto material = nistManager->FindOrBuildMate 69 auto material = nistManager->FindOrBuildMaterial(fMaterialName); 67 << 70 68 // World 71 // World 69 // 72 // 70 auto sWorld = new G4Box("World", // name << 73 auto sWorld 71 fDimensions.x(), // << 74 = new G4Box("World", //name 72 fDimensions.y(), fDi << 75 fDimensions.x(), //dimensions (half-lentghs) 73 << 76 fDimensions.y(), 74 fWorldVolume = new G4LogicalVolume(sWorld, << 77 fDimensions.z()); 75 material, << 78 76 "World"); << 79 fWorldVolume 77 << 80 = new G4LogicalVolume(sWorld, //shape 78 auto pWorld = new G4PVPlacement(0, // no ro << 81 material, //material 79 G4ThreeVecto << 82 "World"); //name 80 fWorldVolume << 83 81 "World", // << 84 auto pWorld 82 0, // mothe << 85 = new G4PVPlacement(0, //no rotation 83 false, // n << 86 G4ThreeVector(), //at (0,0,0) 84 0); // copy << 87 fWorldVolume, //logical volume >> 88 "World", //name >> 89 0, //mother volume >> 90 false, //no boolean operation >> 91 0); //copy number 85 92 86 // always return the root volume << 93 //always return the root volume 87 // 94 // 88 return pWorld; 95 return pWorld; 89 } 96 } 90 97 91 //....oooOO0OOooo........oooOO0OOooo........oo 98 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 92 << 99 93 void DetectorConstruction0::SetMaterial(const 100 void DetectorConstruction0::SetMaterial(const G4String& materialName) 94 { 101 { 95 auto nistManager = G4NistManager::Instance() 102 auto nistManager = G4NistManager::Instance(); 96 103 97 auto newMaterial = nistManager->FindOrBuildM 104 auto newMaterial = nistManager->FindOrBuildMaterial(materialName); 98 if (!newMaterial) { << 105 if ( ! newMaterial ) { 99 G4cerr << "Material " << materialName << " 106 G4cerr << "Material " << materialName << " not found." << G4endl; 100 G4cerr << "The box material was not change 107 G4cerr << "The box material was not changed." << G4endl; 101 return; 108 return; 102 } << 109 } 103 << 110 104 if (fWorldVolume) fWorldVolume->SetMaterial( << 111 if ( fWorldVolume ) fWorldVolume->SetMaterial(newMaterial); 105 G4cout << "Material of box changed to " << m 112 G4cout << "Material of box changed to " << materialName << G4endl; 106 } 113 } 107 114 108 //....oooOO0OOooo........oooOO0OOooo........oo 115 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 109 << 116 110 void DetectorConstruction0::SetDimensions(G4Th 117 void DetectorConstruction0::SetDimensions(G4ThreeVector dimensions) 111 { 118 { 112 /// Set world dimension (in half lengths). << 119 /// Set world dimension (in half lengths). 113 /// This setting has effect only if called i << 120 /// This setting has effect only if called in PreInit> phase 114 121 115 fDimensions = dimensions; 122 fDimensions = dimensions; 116 } << 123 } 117 << 124 118 //....oooOO0OOooo........oooOO0OOooo........oo 125 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 119 126 120 void DetectorConstruction0::DefineCommands() 127 void DetectorConstruction0::DefineCommands() 121 { 128 { 122 // Define /B5/detector command directory usi 129 // Define /B5/detector command directory using generic messenger class 123 fMessenger = new G4GenericMessenger(this, "/ << 130 fMessenger = new G4GenericMessenger(this, >> 131 "/detector/", >> 132 "Detector control"); 124 133 125 // setMaterial command 134 // setMaterial command 126 auto& setMaterialCmd = fMessenger->DeclareMe << 135 auto& setMaterialCmd 127 "setMaterial", &DetectorConstruction0::Set << 136 = fMessenger->DeclareMethod("setMaterial", >> 137 &DetectorConstruction0::SetMaterial, >> 138 "Set world material name."); 128 setMaterialCmd.SetParameterName("materialNam 139 setMaterialCmd.SetParameterName("materialName", false); 129 setMaterialCmd.SetDefaultValue("G4_AIR"); 140 setMaterialCmd.SetDefaultValue("G4_AIR"); 130 setMaterialCmd.SetStates(G4State_PreInit); 141 setMaterialCmd.SetStates(G4State_PreInit); 131 142 132 // setDimensions command 143 // setDimensions command 133 auto& setDimensionsCmd = << 144 auto& setDimensionsCmd 134 fMessenger->DeclareMethodWithUnit("setDime << 145 = fMessenger->DeclareMethodWithUnit("setDimensions", "mm", 135 "Set wor << 146 &DetectorConstruction0::SetDimensions, >> 147 "Set world dimensions (in half lentgh)."); 136 setDimensionsCmd.SetParameterName("dimension 148 setDimensionsCmd.SetParameterName("dimensions", false); 137 setDimensionsCmd.SetStates(G4State_PreInit); 149 setDimensionsCmd.SetStates(G4State_PreInit); 138 } 150 } 139 << 151 140 //....oooOO0OOooo........oooOO0OOooo........oo 152 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 141 << 142 } // namespace Common << 143 153