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 #include "G4Material.hh"
37 #include "G4NistManager.hh"
38 
39 #include "G4Box.hh"
40 #include "G4LogicalVolume.hh"
41 #include "G4PVPlacement.hh"
42 
43 #include "G4GeometryManager.hh"
44 #include "G4PhysicalVolumeStore.hh"
45 #include "G4LogicalVolumeStore.hh"
46 #include "G4SolidStore.hh"
47 #include "G4RunManager.hh"
48 
49 #include "G4UnitsTable.hh"
50 #include "G4SystemOfUnits.hh"
51 
52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
53 
56  fPBox(0), fLBox(0), fMaterial(0), fDetectorMessenger(0)
57 {
58  fBoxSize = 1*m;
60  SetMaterial("Water_ts");
62 }
63 
64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
65 
67 { delete fDetectorMessenger;}
68 
69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
70 
72 {
73  return ConstructVolumes();
74 }
75 
76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
77 
79 {
80  // specific element name for thermal neutronHP
81  // (see G4ParticleHPThermalScatteringNames.cc)
82 
83  G4int ncomponents, natoms;
84 
85  // pressurized water
86  G4Element* H = new G4Element("TS_H_of_Water" ,"H" , 1., 1.0079*g/mole);
87  G4Element* O = new G4Element("Oxygen" ,"O" , 8., 16.00*g/mole);
88  G4Material* H2O =
89  new G4Material("Water_ts", 1.000*g/cm3, ncomponents=2,
90  kStateLiquid, 593*kelvin, 150*bar);
91  H2O->AddElement(H, natoms=2);
92  H2O->AddElement(O, natoms=1);
94 
95  // heavy water
96  G4Isotope* H2 = new G4Isotope("H2",1,2);
97  G4Element* D = new G4Element("TS_D_of_Heavy_Water", "D", 1);
98  D->AddIsotope(H2, 100*perCent);
99  G4Material* D2O = new G4Material("HeavyWater", 1.11*g/cm3, ncomponents=2,
100  kStateLiquid, 293.15*kelvin, 1*atmosphere);
101  D2O->AddElement(D, natoms=2);
102  D2O->AddElement(O, natoms=1);
103 
104  // graphite
105  G4Isotope* C12 = new G4Isotope("C12", 6, 12);
106  G4Element* C = new G4Element("TS_C_of_Graphite","C", ncomponents=1);
107  C->AddIsotope(C12, 100.*perCent);
108  G4Material* graphite =
109  new G4Material("graphite", 2.27*g/cm3, ncomponents=1,
110  kStateSolid, 293*kelvin, 1*atmosphere);
111  graphite->AddElement(C, natoms=1);
112 
114 }
115 
116 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
117 
119  G4String symbol, G4double density, G4int Z, G4int A)
120 {
121  // define a material from an isotope
122  //
123  G4int ncomponents;
124  G4double abundance, massfraction;
125 
126  G4Isotope* isotope = new G4Isotope(symbol, Z, A);
127 
128  G4Element* element = new G4Element(name, symbol, ncomponents=1);
129  element->AddIsotope(isotope, abundance= 100.*perCent);
130 
131  G4Material* material = new G4Material(name, density, ncomponents=1);
132  material->AddElement(element, massfraction=100.*perCent);
133 
134  return material;
135 }
136 
137 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
138 
140 {
141  // Cleanup old geometry
146 
147  G4Box*
148  sBox = new G4Box("Container", //its name
149  fBoxSize/2,fBoxSize/2,fBoxSize/2); //its dimensions
150 
151  fLBox = new G4LogicalVolume(sBox, //its shape
152  fMaterial, //its material
153  fMaterial->GetName()); //its name
154 
155  fPBox = new G4PVPlacement(0, //no rotation
156  G4ThreeVector(), //at (0,0,0)
157  fLBox, //its logical volume
158  fMaterial->GetName(), //its name
159  0, //its mother volume
160  false, //no boolean operation
161  0); //copy number
162 
163  PrintParameters();
164 
165  //always return the root volume
166  //
167  return fPBox;
168 }
169 
170 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
171 
173 {
174  G4cout << "\n The Box is " << G4BestUnit(fBoxSize,"Length")
175  << " of " << fMaterial->GetName()
176  << "\n \n" << fMaterial << G4endl;
177 }
178 
179 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
180 
181 void DetectorConstruction::SetMaterial(G4String materialChoice)
182 {
183  // search the material by its name
184  G4Material* pttoMaterial =
185  G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
186 
187  if (pttoMaterial) {
188  if(fMaterial != pttoMaterial) {
189  fMaterial = pttoMaterial;
190  if(fLBox) { fLBox->SetMaterial(pttoMaterial); }
192  }
193  } else {
194  G4cout << "\n--> warning from DetectorConstruction::SetMaterial : "
195  << materialChoice << " not found" << G4endl;
196  }
197 }
198 
199 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
200 
202 {
203  fBoxSize = value;
205 }
206 
207 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
208