Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 /// \file common/src/DetectorConstruction.cc 28 /// \brief Implementation of the Common::Detec 29 30 #include "DetectorConstruction.hh" 31 32 #include "G4Box.hh" 33 #include "G4GenericMessenger.hh" 34 #include "G4LogicalVolume.hh" 35 #include "G4Material.hh" 36 #include "G4NistManager.hh" 37 #include "G4PVPlacement.hh" 38 39 namespace Common 40 { 41 42 //....oooOO0OOooo........oooOO0OOooo........oo 43 44 DetectorConstruction::DetectorConstruction(con 45 G4d 46 con 47 G4d 48 : fBoxMaterialName(boxMaterialName), 49 fWorldMaterialName(worldMaterialName), 50 fBoxDimensions(boxHx * 2, boxHy * 2, boxHz 51 fWorldSizeFactor(worldSizeFactor) 52 { 53 DefineCommands(); 54 } 55 56 //....oooOO0OOooo........oooOO0OOooo........oo 57 58 DetectorConstruction::~DetectorConstruction() 59 { 60 delete fMessenger; 61 } 62 63 //....oooOO0OOooo........oooOO0OOooo........oo 64 65 G4VPhysicalVolume* DetectorConstruction::Const 66 { 67 // Define materials via NIST manager 68 // 69 auto nistManager = G4NistManager::Instance() 70 71 auto worldMaterial = nistManager->FindOrBuil 72 auto boxMaterial = nistManager->FindOrBuildM 73 74 // Geometry parameters 75 // 76 G4ThreeVector worldDimensions = fBoxDimensio 77 78 // World 79 // 80 auto sWorld = new G4Box("World", // name 81 worldDimensions.x(), 82 worldDimensions.y(), 83 84 fWorldVolume = new G4LogicalVolume(sWorld, 85 worldMate 86 "World"); 87 88 auto pWorld = new G4PVPlacement(0, // no ro 89 G4ThreeVecto 90 fWorldVolume 91 "World", // 92 0, // mothe 93 false, // n 94 0); // copy 95 96 // Box 97 // 98 auto sBox = new G4Box("Box", // its name 99 fBoxDimensions.x(), / 100 fBoxDimensions.y(), fB 101 102 fBoxVolume = new G4LogicalVolume(sBox, // i 103 boxMaterial 104 "Box"); // 105 106 new G4PVPlacement(0, // no rotation 107 G4ThreeVector(), // at (0 108 fBoxVolume, // its logica 109 "Box", // its name 110 fWorldVolume, // its moth 111 false, // no boolean oper 112 0); // copy number 113 114 // always return the root volume 115 // 116 return pWorld; 117 } 118 119 //....oooOO0OOooo........oooOO0OOooo........oo 120 121 void DetectorConstruction::SetBoxMaterial(cons 122 { 123 auto nistManager = G4NistManager::Instance() 124 125 auto newMaterial = nistManager->FindOrBuildM 126 if (!newMaterial) { 127 G4cerr << "Material " << materialName << " 128 G4cerr << "The box material was not change 129 return; 130 } 131 132 if (fBoxVolume) fBoxVolume->SetMaterial(newM 133 G4cout << "Material of box changed to " << m 134 } 135 136 //....oooOO0OOooo........oooOO0OOooo........oo 137 138 void DetectorConstruction::SetWorldMaterial(co 139 { 140 auto nistManager = G4NistManager::Instance() 141 142 auto newMaterial = nistManager->FindOrBuildM 143 if (!newMaterial) { 144 G4cerr << "Material " << materialName << " 145 G4cerr << "The box material was not change 146 return; 147 } 148 149 if (fWorldVolume) fWorldVolume->SetMaterial( 150 G4cout << "Material of box changed to " << m 151 } 152 153 //....oooOO0OOooo........oooOO0OOooo........oo 154 155 void DetectorConstruction::SetBoxDimensions(G4 156 { 157 /// Set box dimension (in half lengths). 158 /// This setting has effect only if called i 159 160 fBoxDimensions = dimensions; 161 } 162 163 //....oooOO0OOooo........oooOO0OOooo........oo 164 165 void DetectorConstruction::SetWorldSizeFactor( 166 { 167 /// Set the multiplication factor from box d 168 /// This setting has effect only if called i 169 170 fWorldSizeFactor = factor; 171 } 172 173 //....oooOO0OOooo........oooOO0OOooo........oo 174 175 void DetectorConstruction::DefineCommands() 176 { 177 // Define /B5/detector command directory usi 178 fMessenger = new G4GenericMessenger(this, "/ 179 180 // setBoxMaterial command 181 auto& setBoxMaterialCmd = fMessenger->Declar 182 "setBoxMaterial", &DetectorConstruction::S 183 setBoxMaterialCmd.SetParameterName("boxMater 184 setBoxMaterialCmd.SetDefaultValue("G4_AIR"); 185 186 // setWorldMaterial command 187 auto& setWorldMaterialCmd = fMessenger->Decl 188 "setWorldMaterial", &DetectorConstruction: 189 setWorldMaterialCmd.SetParameterName("worldM 190 setWorldMaterialCmd.SetDefaultValue("G4_AIR" 191 192 // setBoxDimensions command 193 auto& setBoxDimensionsCmd = fMessenger->Decl 194 "setBoxDimensions", "mm", &DetectorConstru 195 "Set box dimensions (in half lentgh)."); 196 setBoxDimensionsCmd.SetParameterName("boxDim 197 setBoxDimensionsCmd.SetStates(G4State_PreIni 198 199 // setWorldSizeFactor command 200 auto& setWorldSizeFactorCmd = fMessenger->De 201 "setWorldSizeFactor", &DetectorConstructio 202 "Set the multiplication factor from box di 203 setWorldSizeFactorCmd.SetParameterName("worl 204 setWorldSizeFactorCmd.SetRange("WorldSizeFac 205 setWorldSizeFactorCmd.SetStates(G4State_PreI 206 } 207 208 //....oooOO0OOooo........oooOO0OOooo........oo 209 210 } // namespace Common 211