ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file DetectorConstruction.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
28 //
29 //
30 
31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
33 
34 #include "DetectorConstruction.hh"
35 #include "DetectorMessenger.hh"
36 
37 #include "G4Material.hh"
38 #include "G4NistManager.hh"
39 #include "G4Box.hh"
40 #include "G4LogicalVolume.hh"
41 #include "G4PVPlacement.hh"
42 #include "G4RunManager.hh"
43 
44 #include "G4GeometryManager.hh"
45 #include "G4PhysicalVolumeStore.hh"
46 #include "G4LogicalVolumeStore.hh"
47 #include "G4SolidStore.hh"
48 
49 #include "G4UnitsTable.hh"
50 #include "G4SystemOfUnits.hh"
51 #include "G4PhysicalConstants.hh"
52 
54 #include "G4AutoDelete.hh"
55 
56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
57 
59 :G4VUserDetectorConstruction(),fPBox(nullptr), fLBox(nullptr),
60  fBox(nullptr), fMaterial(nullptr)
61 {
62  fBoxSize = 10*m;
64  SetMaterial("G4_Al");
66 }
67 
68 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
69 
71 { delete fDetectorMessenger;}
72 
73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
74 
76 {
77  //
78  // define Elements
79  //
80  G4double z,a;
81 
82  G4Element* H = new G4Element("Hydrogen" ,"H" , z= 1., a= 1.01*g/mole);
83  G4Element* C = new G4Element("Hydrogen" ,"C" , z= 6., a= 12.00*g/mole);
84  G4Element* N = new G4Element("Nitrogen" ,"N" , z= 7., a= 14.01*g/mole);
85  G4Element* O = new G4Element("Oxygen" ,"O" , z= 8., a= 16.00*g/mole);
86  G4Element* Ge = new G4Element("Germanium","Ge", z=32., a= 72.59*g/mole);
87  G4Element* Bi = new G4Element("Bismuth" ,"Bi", z=83., a= 208.98*g/mole);
88 
89  //
90  // define materials
91  //
92  G4double density;
93  G4int ncomponents, natoms;
94  G4double fractionmass;
95 
96  G4Material* Air =
97  new G4Material("Air", density= 1.290*mg/cm3, ncomponents=2);
98  Air->AddElement(N, fractionmass=70.*perCent);
99  Air->AddElement(O, fractionmass=30.*perCent);
100 
101  G4Material* H2l =
102  new G4Material("H2liquid", density= 70.8*mg/cm3, ncomponents=1);
103  H2l->AddElement(H, fractionmass=1.);
104 
105  G4Material* H2O =
106  new G4Material("Water", density= 1.000*g/cm3, ncomponents=2);
107  H2O->AddElement(H, natoms=2);
108  H2O->AddElement(O, natoms=1);
111 
112  density = 0.001*mg/cm3;
113  G4Material* CO2 = new G4Material("CO2", density, ncomponents=2);
114  CO2->AddElement(C, natoms=1);
115  CO2->AddElement(O, natoms=2);
116 
117  G4Isotope* d = new G4Isotope("d", 1, 2, 0.0, 0);
118  G4Element* D = new G4Element("Heavy-Hydrogen" ,"D", ncomponents=1);
119  D->AddIsotope(d, 1.0);
120  G4Material* D2 =
121  new G4Material("D2_gas", density= 0.036*mg/cm3, ncomponents=1);
122  D2->AddElement(D, natoms=2);
123 
124  new G4Material("liquidArgon", z=18., a= 39.95*g/mole, density= 1.390*g/cm3);
125 
126  new G4Material("Aluminium" , z=13., a= 26.98*g/mole, density= 2.700*g/cm3);
127 
128  new G4Material("Silicon" , z=14., a= 28.09*g/mole, density= 2.330*g/cm3);
129 
130  new G4Material("Chromium" , z=24., a= 51.99*g/mole, density= 7.140*g/cm3);
131 
132  new G4Material("Germanium" , z=32., a= 72.61*g/mole, density= 5.323*g/cm3);
133 
134  G4Material* BGO =
135  new G4Material("BGO", density= 7.10*g/cm3, ncomponents=3);
136  BGO->AddElement(O , natoms=12);
137  BGO->AddElement(Ge, natoms= 3);
138  BGO->AddElement(Bi, natoms= 4);
139 
140  new G4Material("Iron" , z=26., a= 55.85*g/mole, density= 7.870*g/cm3);
141 
142  new G4Material("Tungsten" , z=74., a=183.85*g/mole, density= 19.30*g/cm3);
143 
144  new G4Material("Gold" , z=79., a=196.97*g/mole, density= 19.32*g/cm3);
145 
146  new G4Material("Lead" , z=82., a=207.19*g/mole, density= 11.35*g/cm3);
147 
148  new G4Material("Uranium" , z=92., a=238.03*g/mole, density= 18.95*g/cm3);
149 
150 
151  G4Material* argonGas =
152  new G4Material("ArgonGas", z=18, a=39.948*g/mole, density= 1.782*mg/cm3,
153  kStateGas, 273.15*kelvin, 1*atmosphere);
154 
155  G4Material* butane =
156  new G4Material("Isobutane",density= 2.42*mg/cm3, ncomponents=2,
157  kStateGas,273.15*kelvin, 1*atmosphere);
158  butane->AddElement(C, natoms=4);
159  butane->AddElement(H, natoms=10);
160 
161  G4Material* ArButane =
162  new G4Material("ArgonButane", density= 1.835*mg/cm3, ncomponents=2,
163  kStateGas,273.15*kelvin,1.*atmosphere);
164  ArButane->AddMaterial(argonGas, fractionmass=70*perCent);
165  ArButane->AddMaterial(butane , fractionmass=30*perCent);
166 
167  // example of vacuum
168  //
169  density = universe_mean_density; //from PhysicalConstants.h
170  new G4Material("Galactic", z=1., a=1.008*g/mole, density,
171  kStateGas,2.73*kelvin,3.e-18*pascal);
172 
173  // use Nist
174  //
176 
177  G4bool isotopes = false;
179  G4Element* Si = man->FindOrBuildElement("Si", isotopes);
180  G4Element* Lu = man->FindOrBuildElement("Lu", isotopes);
181 
182  G4Material* LSO = new G4Material("Lu2SiO5", 7.4*g/cm3, 3);
183  LSO->AddElement(Lu, 2);
184  LSO->AddElement(Si, 1);
185  LSO->AddElement(O , 5);
186 
188 }
189 
190 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
191 
193 {
194  if(fPBox) { return fPBox; }
195  fBox = new G4Box("Container", //its name
196  fBoxSize/2,fBoxSize/2,fBoxSize/2); //its dimensions
197 
198  fLBox = new G4LogicalVolume(fBox, //its shape
199  fMaterial, //its material
200  fMaterial->GetName()); //its name
201 
202  fPBox = new G4PVPlacement(0, //no rotation
203  G4ThreeVector(), //at (0,0,0)
204  fLBox, //its logical volume
205  fMaterial->GetName(), //its name
206  0, //its mother volume
207  false, //no boolean operation
208  0); //copy number
209 
210  PrintParameters();
211 
212  //always return the root volume
213  //
214  return fPBox;
215 }
216 
217 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
218 
220 {
221  G4cout << "\n The Box is " << G4BestUnit(fBoxSize,"Length")
222  << " of " << fMaterial->GetName() << G4endl;
223 }
224 
225 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
226 
227 void DetectorConstruction::SetMaterial(const G4String& materialChoice)
228 {
229  // search the material by its name
230  G4Material* pttoMaterial =
231  G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
232 
233  if (pttoMaterial) {
234  fMaterial = pttoMaterial;
235  if ( fLBox ) { fLBox->SetMaterial(fMaterial); }
236  } else {
237  G4cout << "\n--> warning from DetectorConstruction::SetMaterial : "
238  << materialChoice << " not found" << G4endl;
239  }
241 }
242 
243 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
244 
246 {
247  fBoxSize = value;
248  if(fBox) {
249  fBox->SetXHalfLength(fBoxSize/2);
250  fBox->SetYHalfLength(fBoxSize/2);
251  fBox->SetZHalfLength(fBoxSize/2);
252  }
253 }
254 
255 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
256 
258 {
259  if ( fFieldMessenger.Get() == 0 ) {
260  // Create global magnetic field messenger.
261  // Uniform magnetic field is then created automatically if
262  // the field value is not zero.
263  G4ThreeVector fieldValue = G4ThreeVector();
265  new G4GlobalMagFieldMessenger(fieldValue);
266  //msg->SetVerboseLevel(1);
268  fFieldMessenger.Put( msg );
269 
270  }
271 }
272 
273 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......