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 /// \file electromagnetic/TestEm11/src/Detecto 27 /// \brief Implementation of the DetectorConst 28 // 29 // 30 //....oooOO0OOooo........oooOO0OOooo........oo 31 //....oooOO0OOooo........oooOO0OOooo........oo 32 33 #include "DetectorConstruction.hh" 34 35 #include "DetectorMessenger.hh" 36 37 #include "G4AutoDelete.hh" 38 #include "G4Box.hh" 39 #include "G4GeometryManager.hh" 40 #include "G4GlobalMagFieldMessenger.hh" 41 #include "G4LogicalVolume.hh" 42 #include "G4LogicalVolumeStore.hh" 43 #include "G4Material.hh" 44 #include "G4NistManager.hh" 45 #include "G4PVPlacement.hh" 46 #include "G4PVReplica.hh" 47 #include "G4PhysicalConstants.hh" 48 #include "G4PhysicalVolumeStore.hh" 49 #include "G4RunManager.hh" 50 #include "G4SolidStore.hh" 51 #include "G4SystemOfUnits.hh" 52 #include "G4UImanager.hh" 53 #include "G4UniformMagField.hh" 54 #include "G4UnitsTable.hh" 55 56 #include <iomanip> 57 58 //....oooOO0OOooo........oooOO0OOooo........oo 59 60 DetectorConstruction::DetectorConstruction() 61 { 62 // default parameter values of the absorbers 63 fNbOfAbsor = 1; 64 fAbsorThickness[0] = 0. * mm; // dummy, for 65 fAbsorThickness[1] = 1. * mm; 66 fAbsorSizeYZ = 1. * mm; 67 for (G4int iAbs = 0; iAbs < kMaxAbsor; iAbs+ 68 fNbOfDivisions[iAbs] = 1; 69 } 70 ComputeParameters(); 71 72 // materials 73 DefineMaterials(); 74 SetAbsorMaterial(1, "G4_Si"); 75 76 // create commands for interactive definitio 77 fDetectorMessenger = new DetectorMessenger(t 78 } 79 80 //....oooOO0OOooo........oooOO0OOooo........oo 81 82 DetectorConstruction::~DetectorConstruction() 83 { 84 delete fDetectorMessenger; 85 } 86 87 //....oooOO0OOooo........oooOO0OOooo........oo 88 89 G4VPhysicalVolume* DetectorConstruction::Const 90 { 91 return ConstructVolumes(); 92 } 93 94 //....oooOO0OOooo........oooOO0OOooo........oo 95 96 void DetectorConstruction::DefineMaterials() 97 { 98 G4NistManager* man = G4NistManager::Instance 99 100 man->FindOrBuildMaterial("G4_Al"); 101 man->FindOrBuildMaterial("G4_Si"); 102 man->FindOrBuildMaterial("G4_Fe"); 103 man->FindOrBuildMaterial("G4_Cu"); 104 man->FindOrBuildMaterial("G4_Ge"); 105 man->FindOrBuildMaterial("G4_Mo"); 106 man->FindOrBuildMaterial("G4_Ta"); 107 man->FindOrBuildMaterial("G4_W"); 108 man->FindOrBuildMaterial("G4_Au"); 109 man->FindOrBuildMaterial("G4_Pb"); 110 man->FindOrBuildMaterial("G4_PbWO4"); 111 man->FindOrBuildMaterial("G4_SODIUM_IODIDE") 112 113 man->FindOrBuildMaterial("G4_AIR"); 114 man->FindOrBuildMaterial("G4_WATER"); 115 116 G4Element* H = man->FindOrBuildElement("H"); 117 G4Element* O = man->FindOrBuildElement("O"); 118 119 G4Material* H2O = new G4Material("Water", 1. 120 H2O->AddElement(H, 2); 121 H2O->AddElement(O, 1); 122 H2O->GetIonisation()->SetMeanExcitationEnerg 123 124 G4double density = universe_mean_density; / 125 G4double pressure = 3.e-18 * pascal; 126 G4double temperature = 2.73 * kelvin; 127 G4Material* Galactic = 128 new G4Material("Galactic", 1., 1.008 * g / 129 130 fDefaultMaterial = Galactic; 131 132 // G4cout << *(G4Material::GetMaterialTable 133 } 134 135 //....oooOO0OOooo........oooOO0OOooo........oo 136 137 void DetectorConstruction::ComputeParameters() 138 { 139 // Compute total thickness of absorbers 140 fAbsorSizeX = 0.; 141 for (G4int iAbs = 1; iAbs <= fNbOfAbsor; iAb 142 fAbsorSizeX += fAbsorThickness[iAbs]; 143 } 144 } 145 146 //....oooOO0OOooo........oooOO0OOooo........oo 147 148 G4VPhysicalVolume* DetectorConstruction::Const 149 { 150 // complete the Calor parameters definition 151 ComputeParameters(); 152 153 // Cleanup old geometry 154 G4GeometryManager::GetInstance()->OpenGeomet 155 G4PhysicalVolumeStore::GetInstance()->Clean( 156 G4LogicalVolumeStore::GetInstance()->Clean() 157 G4SolidStore::GetInstance()->Clean(); 158 159 // 160 // World 161 // 162 G4Box* solidWorld = new G4Box("World", // n 163 fAbsorSizeX / 164 165 G4LogicalVolume* logicWorld = new G4LogicalV 166 167 168 169 fPhysiWorld = new G4PVPlacement(0, // no ro 170 G4ThreeVecto 171 logicWorld, 172 "World", // 173 0, // mothe 174 false, // n 175 0); // copy 176 177 // 178 // Absorbers 179 // 180 fXfront[0] = -0.5 * fAbsorSizeX; 181 // 182 for (G4int k = 1; k <= fNbOfAbsor; k++) { 183 G4Material* material = fAbsorMaterial[k]; 184 G4String matname = material->GetName(); 185 186 G4Box* solidAbsor = 187 new G4Box(matname, fAbsorThickness[k] / 188 189 G4LogicalVolume* logicAbsor = new G4Logica 190 191 192 193 fXfront[k] = fXfront[k - 1] + fAbsorThickn 194 G4double xcenter = fXfront[k] + 0.5 * fAbs 195 G4ThreeVector position = G4ThreeVector(xce 196 197 new G4PVPlacement(0, // no rotation 198 position, // position 199 logicAbsor, // logical 200 matname, // name 201 logicWorld, // mother 202 false, // no boulean op 203 k); // copy number 204 205 // divisions, if any 206 // 207 G4double LayerThickness = fAbsorThickness[ 208 G4Box* solidLayer = new G4Box(matname, Lay 209 210 G4LogicalVolume* logicLayer = new G4Logica 211 212 213 214 new G4PVReplica(matname, // name 215 logicLayer, // logical vo 216 logicAbsor, // mother 217 kXAxis, // axis of replic 218 fNbOfDivisions[k], // num 219 LayerThickness); // witdt 220 } 221 222 PrintParameters(); 223 224 // always return the physical World 225 // 226 return fPhysiWorld; 227 } 228 229 //....oooOO0OOooo........oooOO0OOooo........oo 230 231 void DetectorConstruction::PrintParameters() 232 { 233 G4cout << "\n------------------------------- 234 << "\n ---> The Absorber is " << fNbO 235 for (G4int i = 1; i <= fNbOfAbsor; i++) { 236 G4cout << "\n \t" << std::setw(16) << fAbs 237 << G4BestUnit(fAbsorThickness[i], " 238 << " slices"; 239 } 240 G4cout << "\n------------------------------- 241 } 242 243 //....oooOO0OOooo........oooOO0OOooo........oo 244 245 void DetectorConstruction::SetNbOfAbsor(G4int 246 { 247 // set the number of Absorbers 248 // 249 if (ival < 1 || ival > (kMaxAbsor - 1)) { 250 G4cout << "\n ---> warning from SetfNbOfAb 251 << kMaxAbsor - 1 << ". Command refu 252 return; 253 } 254 fNbOfAbsor = ival; 255 G4RunManager::GetRunManager()->ReinitializeG 256 } 257 258 //....oooOO0OOooo........oooOO0OOooo........oo 259 260 void DetectorConstruction::SetAbsorMaterial(G4 261 { 262 // search the material by its name 263 // 264 if (iabs > fNbOfAbsor || iabs <= 0) { 265 G4cout << "\n --->warning from SetfAbsorMa 266 << " out of range. Command refused" 267 return; 268 } 269 270 G4Material* pttoMaterial = G4NistManager::In 271 if (pttoMaterial) { 272 fAbsorMaterial[iabs] = pttoMaterial; 273 G4RunManager::GetRunManager()->PhysicsHasB 274 G4cout << "\n " << pttoMaterial << G4endl; 275 } 276 } 277 278 //....oooOO0OOooo........oooOO0OOooo........oo 279 280 void DetectorConstruction::SetAbsorThickness(G 281 { 282 // change Absorber thickness 283 // 284 if (iabs > fNbOfAbsor || iabs <= 0) { 285 G4cout << "\n --->warning from SetfAbsorTh 286 << " out of range. Command refused" 287 return; 288 } 289 if (val <= DBL_MIN) { 290 G4cout << "\n --->warning from SetfAbsorTh 291 << " out of range. Command refused" 292 return; 293 } 294 fAbsorThickness[iabs] = val; 295 G4RunManager::GetRunManager()->ReinitializeG 296 } 297 298 //....oooOO0OOooo........oooOO0OOooo........oo 299 300 void DetectorConstruction::SetAbsorSizeYZ(G4do 301 { 302 // change the transverse size 303 // 304 if (val <= DBL_MIN) { 305 G4cout << "\n --->warning from SetfAbsorSi 306 << " out of range. Command refused" 307 return; 308 } 309 fAbsorSizeYZ = val; 310 G4RunManager::GetRunManager()->ReinitializeG 311 } 312 313 //....oooOO0OOooo........oooOO0OOooo........oo 314 315 void DetectorConstruction::SetNbOfDivisions(G4 316 { 317 // set the number of divisions 318 // 319 if (iabs > fNbOfAbsor || iabs < 1) { 320 G4cout << "\n --->warning from SetNbOfDivi 321 << " out of range. Command refused" 322 return; 323 } 324 325 if (ival < 1) { 326 G4cout << "\n --->warning from SetNbOfDivi 327 << " must be at least 1. Command re 328 return; 329 } 330 fNbOfDivisions[iabs] = ival; 331 G4RunManager::GetRunManager()->ReinitializeG 332 } 333 334 //....oooOO0OOooo........oooOO0OOooo........oo 335 336 void DetectorConstruction::ConstructSDandField 337 { 338 if (fFieldMessenger.Get() == 0) { 339 // Create global magnetic field messenger. 340 // Uniform magnetic field is then created 341 // the field value is not zero. 342 G4ThreeVector fieldValue = G4ThreeVector() 343 G4GlobalMagFieldMessenger* msg = new G4Glo 344 // msg->SetVerboseLevel(1); 345 G4AutoDelete::Register(msg); 346 fFieldMessenger.Put(msg); 347 } 348 } 349 350 //....oooOO0OOooo........oooOO0OOooo........oo 351