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 /// \file electromagnetic/TestEm17/src/Detecto 26 /// \file electromagnetic/TestEm17/src/DetectorConstruction.cc 27 /// \brief Implementation of the DetectorConst 27 /// \brief Implementation of the DetectorConstruction class 28 // 28 // 29 // 29 // 30 // << 30 // 31 //....oooOO0OOooo........oooOO0OOooo........oo 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 33 33 34 #include "DetectorConstruction.hh" 34 #include "DetectorConstruction.hh" 35 << 36 #include "DetectorMessenger.hh" 35 #include "DetectorMessenger.hh" 37 36 >> 37 #include "G4Material.hh" 38 #include "G4Box.hh" 38 #include "G4Box.hh" 39 #include "G4GeometryManager.hh" << 40 #include "G4LogicalVolume.hh" 39 #include "G4LogicalVolume.hh" 41 #include "G4LogicalVolumeStore.hh" << 42 #include "G4Material.hh" << 43 #include "G4NistManager.hh" << 44 #include "G4PVPlacement.hh" 40 #include "G4PVPlacement.hh" 45 #include "G4PhysicalConstants.hh" << 41 >> 42 #include "G4GeometryManager.hh" 46 #include "G4PhysicalVolumeStore.hh" 43 #include "G4PhysicalVolumeStore.hh" 47 #include "G4RunManager.hh" << 44 #include "G4LogicalVolumeStore.hh" 48 #include "G4SolidStore.hh" 45 #include "G4SolidStore.hh" 49 #include "G4SystemOfUnits.hh" << 46 #include "G4RunManager.hh" >> 47 #include "G4NistManager.hh" >> 48 50 #include "G4UnitsTable.hh" 49 #include "G4UnitsTable.hh" >> 50 #include "G4PhysicalConstants.hh" >> 51 #include "G4SystemOfUnits.hh" 51 52 52 //....oooOO0OOooo........oooOO0OOooo........oo 53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 53 54 54 DetectorConstruction::DetectorConstruction() 55 DetectorConstruction::DetectorConstruction() 55 : G4VUserDetectorConstruction(), fPBox(0), f << 56 :G4VUserDetectorConstruction(),fPBox(0), fLBox(0), fMaterial(0), >> 57 fDetectorMessenger(0) 56 { 58 { 57 fBoxSize = 1 * m; << 59 fBoxSize = 1*m; 58 DefineMaterials(); 60 DefineMaterials(); 59 SetMaterial("G4_Fe"); << 61 SetMaterial("G4_Fe"); 60 fDetectorMessenger = new DetectorMessenger(t 62 fDetectorMessenger = new DetectorMessenger(this); 61 } 63 } 62 64 63 //....oooOO0OOooo........oooOO0OOooo........oo 65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 64 66 65 DetectorConstruction::~DetectorConstruction() 67 DetectorConstruction::~DetectorConstruction() 66 { << 68 { delete fDetectorMessenger;} 67 delete fDetectorMessenger; << 68 } << 69 69 70 //....oooOO0OOooo........oooOO0OOooo........oo 70 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 71 71 72 G4VPhysicalVolume* DetectorConstruction::Const 72 G4VPhysicalVolume* DetectorConstruction::Construct() 73 { 73 { 74 return ConstructVolumes(); 74 return ConstructVolumes(); 75 } 75 } 76 76 77 //....oooOO0OOooo........oooOO0OOooo........oo 77 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 78 78 79 void DetectorConstruction::DefineMaterials() 79 void DetectorConstruction::DefineMaterials() 80 { 80 { 81 // 81 // 82 // define Elements 82 // define Elements 83 // 83 // 84 G4double z, a; << 84 G4double z,a; 85 << 85 86 G4Element* C = new G4Element("Carbon", "C", << 86 G4Element* C = new G4Element("Carbon" ,"C" , z= 6., a= 12.01*g/mole); 87 G4Element* N = new G4Element("Nitrogen", "N" << 87 G4Element* N = new G4Element("Nitrogen" ,"N" , z= 7., a= 14.01*g/mole); 88 G4Element* O = new G4Element("Oxygen", "O", << 88 G4Element* O = new G4Element("Oxygen" ,"O" , z= 8., a= 16.00*g/mole); 89 G4Element* Ca = new G4Element("Calcium", "Ca << 89 G4Element* Ca = new G4Element("Calcium" ,"Ca", z=20., a= 40.08*g/mole); 90 G4Element* H = new G4Element("Hydrogen", "H" << 90 G4Element* H = new G4Element("Hydrogen" ,"H" , z= 1., a= 1.01*g/mole); 91 G4Element* I = new G4Element("Iodine", "I", << 91 G4Element* I = new G4Element("Iodine" ,"I" , z= 53., a= 126.90*g/mole); 92 << 92 93 // 93 // 94 // define materials 94 // define materials 95 // 95 // 96 G4double density; 96 G4double density; 97 G4int ncomponents, natoms; 97 G4int ncomponents, natoms; 98 G4double fractionmass; 98 G4double fractionmass; 99 << 99 100 new G4Material("galactic", z = 1., a = 1.01 << 100 new G4Material("galactic", z=1., a= 1.01*g/mole, universe_mean_density, 101 2.73 * kelvin, 3.e-18 * pasca << 101 kStateGas, 2.73*kelvin, 3.e-18*pascal); 102 << 102 103 G4Material* Air = new G4Material("Air", dens << 103 G4Material* Air = 104 Air->AddElement(N, fractionmass = 70. * perC << 104 new G4Material("Air", density= 1.290*mg/cm3, ncomponents=2); 105 Air->AddElement(O, fractionmass = 30. * perC << 105 Air->AddElement(N, fractionmass=70.*perCent); 106 << 106 Air->AddElement(O, fractionmass=30.*perCent); 107 G4Material* CaCO3 = new G4Material("CaCO3", << 107 108 CaCO3->AddElement(Ca, natoms = 1); << 108 G4Material* CaCO3 = 109 CaCO3->AddElement(C, natoms = 1); << 109 new G4Material("CaCO3", density= 2.80*g/cm3, ncomponents=3); 110 CaCO3->AddElement(O, natoms = 3); << 110 CaCO3->AddElement(Ca, natoms= 1); 111 << 111 CaCO3->AddElement(C , natoms= 1); 112 new G4Material("Carbon", z = 6., a = 12.01 * << 112 CaCO3->AddElement(O , natoms= 3); 113 new G4Material("Iron", z = 26., a = 55.85 * << 113 114 new G4Material("Tin", z = 50., a = 118.7 * g << 114 new G4Material("Carbon", z= 6., a= 12.01*g/mole, density= 2.265*g/cm3); 115 << 115 new G4Material("Iron" , z=26., a= 55.85*g/mole, density= 7.870*g/cm3); 116 G4Material* HI = new G4Material("HI", densit << 116 new G4Material("Tin" , z=50., a= 118.7*g/mole, density= 7.310*g/cm3); 117 HI->AddElement(H, natoms = 1); << 117 118 HI->AddElement(I, natoms = 1); << 118 G4Material* HI = >> 119 new G4Material("HI", density= 2.8*g/cm3, ncomponents=2); //-35oC >> 120 HI->AddElement(H, natoms= 1); >> 121 HI->AddElement(I, natoms= 1); 119 122 120 G4cout << *(G4Material::GetMaterialTable()) 123 G4cout << *(G4Material::GetMaterialTable()) << G4endl; 121 } 124 } 122 125 123 //....oooOO0OOooo........oooOO0OOooo........oo 126 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 124 127 125 G4VPhysicalVolume* DetectorConstruction::Const 128 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes() 126 { 129 { 127 if (fPBox) { << 130 if(fPBox) { return fPBox; } 128 return fPBox; << 129 } << 130 << 131 G4Box* sBox = new G4Box("Container", // its << 132 fBoxSize / 2, fBoxSi << 133 << 134 fLBox = new G4LogicalVolume(sBox, // its sh << 135 fMaterial, // i << 136 fMaterial->GetNa << 137 << 138 fPBox = new G4PVPlacement(0, // no rotation << 139 G4ThreeVector(), << 140 fLBox, // its log << 141 fMaterial->GetName << 142 0, // its mother << 143 false, // no bool << 144 0); // copy numbe << 145 131 >> 132 G4Box* >> 133 sBox = new G4Box("Container", //its name >> 134 fBoxSize/2,fBoxSize/2,fBoxSize/2); //its dimensions >> 135 >> 136 fLBox = new G4LogicalVolume(sBox, //its shape >> 137 fMaterial, //its material >> 138 fMaterial->GetName()); //its name >> 139 >> 140 fPBox = new G4PVPlacement(0, //no rotation >> 141 G4ThreeVector(), //at (0,0,0) >> 142 fLBox, //its logical volume >> 143 fMaterial->GetName(), //its name >> 144 0, //its mother volume >> 145 false, //no boolean operation >> 146 0); //copy number >> 147 146 PrintParameters(); 148 PrintParameters(); 147 << 149 148 // always return the root volume << 150 //always return the root volume 149 // 151 // 150 return fPBox; 152 return fPBox; 151 } 153 } 152 154 153 //....oooOO0OOooo........oooOO0OOooo........oo 155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 154 156 155 void DetectorConstruction::PrintParameters() 157 void DetectorConstruction::PrintParameters() 156 { 158 { 157 G4cout << "\n The Box is " << G4BestUnit(fBo << 159 G4cout << "\n The Box is " << G4BestUnit(fBoxSize,"Length") 158 << G4endl; << 160 << " of " << fMaterial->GetName() << G4endl; 159 } 161 } 160 162 161 //....oooOO0OOooo........oooOO0OOooo........oo 163 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 162 164 163 void DetectorConstruction::SetMaterial(const G 165 void DetectorConstruction::SetMaterial(const G4String& materialChoice) 164 { 166 { 165 // search the material by its name 167 // search the material by its name 166 G4Material* pttoMaterial = G4NistManager::In << 168 G4Material* pttoMaterial = >> 169 G4NistManager::Instance()->FindOrBuildMaterial(materialChoice); 167 170 168 if (pttoMaterial && fMaterial != pttoMateria << 171 if(pttoMaterial && fMaterial != pttoMaterial) { 169 fMaterial = pttoMaterial; 172 fMaterial = pttoMaterial; 170 if (fLBox) { << 173 if(fLBox) { fLBox->SetMaterial(fMaterial); } 171 fLBox->SetMaterial(fMaterial); << 172 } << 173 G4RunManager::GetRunManager()->PhysicsHasB 174 G4RunManager::GetRunManager()->PhysicsHasBeenModified(); 174 } 175 } 175 } 176 } 176 177 177 //....oooOO0OOooo........oooOO0OOooo........oo 178 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 178 179 179 void DetectorConstruction::SetSize(G4double va 180 void DetectorConstruction::SetSize(G4double value) 180 { 181 { 181 fBoxSize = value; 182 fBoxSize = value; 182 } 183 } 183 184 184 //....oooOO0OOooo........oooOO0OOooo........oo 185 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 185 186 186 void DetectorConstruction::UpdateGeometry() 187 void DetectorConstruction::UpdateGeometry() 187 { 188 { 188 G4RunManager::GetRunManager()->DefineWorldVo 189 G4RunManager::GetRunManager()->DefineWorldVolume(ConstructVolumes()); 189 } 190 } 190 191 191 //....oooOO0OOooo........oooOO0OOooo........oo 192 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 192 193