ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
F01DetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file F01DetectorConstruction.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 //
32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
34 
36 #include "F01DetectorMessenger.hh"
37 
38 #include "F01CalorimeterSD.hh"
39 #include "F01FieldSetup.hh"
40 
41 #include "G4GeometryManager.hh"
42 #include "G4PhysicalVolumeStore.hh"
43 #include "G4LogicalVolumeStore.hh"
44 #include "G4SolidStore.hh"
45 #include "G4SDManager.hh"
46 
47 #include "G4Material.hh"
48 #include "G4Tubs.hh"
49 #include "G4LogicalVolume.hh"
50 #include "G4PVPlacement.hh"
51 #include "G4RunManager.hh"
52 #include "G4AutoDelete.hh"
53 
54 #include "G4PhysicalConstants.hh"
55 #include "G4SystemOfUnits.hh"
56 
57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
58 
61  fDetectorMessenger(0),
62  fSolidWorld(0), fLogicWorld(0), fPhysiWorld(0),
63  fSolidAbsorber(0), fLogicAbsorber(0), fPhysiAbsorber(0),
64  fAbsorberMaterial(0), fAbsorberThickness(0.), fAbsorberRadius(0.),
65  fZAbsorber(0.), fZStartAbs(0.), fZEndAbs(0.),
66  fWorldMaterial(0), fWorldSizeR(0.), fWorldSizeZ(0.)
67 {
68  // default parameter values of the calorimeter
69 
70  fWorldSizeZ = 44000.*mm;
71  fWorldSizeR = 22000.*mm;
72 
73  fAbsorberThickness = 1.0*mm;
74 
75  fAbsorberRadius = 20000.*mm;
76  fZAbsorber = 21990.0*mm;
77 
78  // create commands for interactive definition of the calorimeter
79 
81 
82  // create materials
83 
85 
86 }
87 
88 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
89 
91 {
92  delete fDetectorMessenger;
93 }
94 
95 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
96 
98 {
99  return ConstructCalorimeter();
100 }
101 
102 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
103 
105 {
106  //This function illustrates the possible ways to define materials
107 
108  G4String name, symbol; // a=mass of a mole;
109  G4double a, z, density; // z=mean number of protons;
110  G4int nel;
111  G4int ncomponents;
112  G4double fractionmass, pressure, temperature;
113 
114  //
115  // define Elements
116  //
117 
118  a = 1.01*g/mole;
119  G4Element* elH = new G4Element(name="Hydrogen",symbol="H" , z= 1., a);
120 
121  a = 12.01*g/mole;
122  G4Element* elC = new G4Element(name="Carbon", symbol="C", z=6., a);
123 
124  a = 14.01*g/mole;
125  G4Element* elN = new G4Element(name="Nitrogen",symbol="N" , z= 7., a);
126 
127  a = 16.00*g/mole;
128  G4Element* elO = new G4Element(name="Oxygen" ,symbol="O" , z= 8., a);
129 
130  a = 39.948*g/mole;
131  G4Element* elAr = new G4Element(name="Argon", symbol="Ar", z=18., a);
132 
133  //
134  // define simple materials
135  //
136 
137  // Mylar
138 
139  density = 1.39*g/cm3;
140  G4Material* mylar = new G4Material(name="Mylar", density, nel=3);
141  mylar->AddElement(elO,2);
142  mylar->AddElement(elC,5);
143  mylar->AddElement(elH,4);
144 
145  // Polypropelene
146 
147  G4Material* CH2 = new G4Material ("Polypropelene" , 0.91*g/cm3, 2);
148  CH2->AddElement(elH,2);
149  CH2->AddElement(elC,1);
150 
151  // Krypton as detector gas, STP
152 
153  density = 3.700*mg/cm3;
154  a = 83.80*g/mole;
155  G4Material* Kr = new G4Material(name="Kr",z=36., a, density );
156 
157  // Dry air (average composition)
158 
159  density = 1.7836*mg/cm3; // STP
160  G4Material* argon = new G4Material(name="Argon" , density, ncomponents=1);
161  argon->AddElement(elAr, 1);
162 
163  density = 1.25053*mg/cm3; // STP
164  G4Material* nitrogen = new G4Material(name="N2" , density, ncomponents=1);
165  nitrogen->AddElement(elN, 2);
166 
167  density = 1.4289*mg/cm3; // STP
168  G4Material* oxygen = new G4Material(name="O2" , density, ncomponents=1);
169  oxygen->AddElement(elO, 2);
170 
171  density = 1.2928*mg/cm3; // STP
172  density *= 1.0e-8; // pumped vacuum
173 
174  temperature = STP_Temperature;
175  pressure = 1.0e-8*STP_Pressure;
176 
177  G4Material* air = new G4Material(name="Air" , density, ncomponents=3,
178  kStateGas,temperature,pressure);
179  air->AddMaterial( nitrogen, fractionmass = 0.7557 );
180  air->AddMaterial( oxygen, fractionmass = 0.2315 );
181 
182  air->AddMaterial( argon, fractionmass = 0.0128 );
183 
184  // Xenon as detector gas, STP
185 
186  density = 5.858*mg/cm3;
187  a = 131.29*g/mole;
188  G4Material* Xe = new G4Material(name="Xenon",z=54., a, density );
189 
190  // Carbon dioxide, STP
191 
192  density = 1.842*mg/cm3;
193  G4Material* CarbonDioxide = new G4Material(name="CO2", density, nel=2);
194  CarbonDioxide->AddElement(elC,1);
195  CarbonDioxide->AddElement(elO,2);
196 
197  // 80% Xe + 20% CO2, STP
198 
199  density = 5.0818*mg/cm3;
200  G4Material* Xe20CO2 = new G4Material(name="Xe20CO2", density, ncomponents=2);
201  Xe20CO2->AddMaterial( Xe, fractionmass = 0.922 );
202  Xe20CO2->AddMaterial( CarbonDioxide, fractionmass = 0.078 );
203 
204  // 80% Kr + 20% CO2, STP
205 
206  density = 3.601*mg/cm3;
207  G4Material* Kr20CO2 = new G4Material(name="Kr20CO2", density, ncomponents=2);
208  Kr20CO2->AddMaterial( Kr, fractionmass = 0.89 );
209  Kr20CO2->AddMaterial( CarbonDioxide, fractionmass = 0.11 );
210 
212 
213  // default materials of the calorimeter
214 
215  fAbsorberMaterial = air; // Kr20CO2; // XeCO2CF4;
216 
217  fWorldMaterial = air;
218 }
219 
220 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
221 
223 {
224  // Cleanup old geometry
225 
226  if (fPhysiWorld)
227  {
232  }
233 
234  // complete the Calor parameters definition and Print
235 
238 
239  // World
240 
241  fSolidWorld = new G4Tubs("World", // its name
242  0.,fWorldSizeR,fWorldSizeZ/2.,0.,twopi);// its size
243 
244  fLogicWorld = new G4LogicalVolume(fSolidWorld, // its solid
245  fWorldMaterial, // its material
246  "World"); // its name
247 
248  fPhysiWorld = new G4PVPlacement(0, // no rotation
249  G4ThreeVector(), // at (0,0,0)
250  "World", // its name
251  fLogicWorld, // its logical volume
252  0, // its mother volume
253  false, // no boolean op.
254  0); // copy number
255  // Absorber
256 
257  fSolidAbsorber = new G4Tubs("Absorber", 1.0*mm,
260  0.0,twopi);
261 
264  "Absorber");
265 
267  G4ThreeVector(0.,0.,fZAbsorber),
268  "Absorber",
270  fPhysiWorld,
271  false,
272  0);
273 
274  return fPhysiWorld;
275 }
276 
277 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
278 
280 {
281  G4cout << "\n The WORLD is made of "
282  << fWorldSizeZ/mm << "mm of " << fWorldMaterial->GetName();
283  G4cout << ", the transverse size (R) of the world is "
284  << fWorldSizeR/mm << " mm. " << G4endl;
285  G4cout << " The ABSORBER is made of "
286  << fAbsorberThickness/mm << "mm of " << fAbsorberMaterial->GetName();
287  G4cout << ", the transverse size (R) is " << fAbsorberRadius/mm
288  << " mm. " << G4endl;
289  G4cout << " Z position of the (middle of the) absorber "
290  << fZAbsorber/mm << " mm." << G4endl;
291  G4cout << G4endl;
292 }
293 
294 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
295 
297 {
298  // get the pointer to the material table
299  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
300 
301  // search the material by its name
303  for (size_t j=0 ; j<theMaterialTable->size() ; j++)
304  { material = (*theMaterialTable)[j];
305  if (material->GetName() == materialChoice)
306  {
308  fLogicAbsorber->SetMaterial(material);
310  }
311  }
312 }
313 
314 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
315 
317 {
318  // get the pointer to the material table
319  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
320 
321  // search the material by its name
323  for (size_t j=0 ; j<theMaterialTable->size() ; j++)
324  { material = (*theMaterialTable)[j];
325  if(material->GetName() == materialChoice)
326  {
328  fLogicWorld->SetMaterial(material);
330  }
331  }
332 }
333 
334 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
335 
337 {
338  // change Absorber thickness and recompute the calorimeter parameters
339  fAbsorberThickness = val;
342 }
343 
344 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
345 
347 {
348  // change the transverse size and recompute the calorimeter parameters
349  fAbsorberRadius = val;
352 }
353 
354 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
355 
357 {
358  fWorldSizeZ = val;
361 }
362 
363 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
364 
366 {
367  fWorldSizeR = val;
370 }
371 
372 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
373 
375 {
376  fZAbsorber = val;
379 }
380 
381 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
382 
384 {
385  // Sensitive Detectors: Absorber
386 
387  if (!fCalorimeterSD.Get()) {
388  F01CalorimeterSD* calorimeterSD = new F01CalorimeterSD("CalorSD",this);
389  fCalorimeterSD.Put(calorimeterSD);
390  }
393 
394  // Construct the field creator - this will register the field it creates
395  if (!fEmFieldSetup.Get()) {
396  F01FieldSetup* fieldSetup
397  = new F01FieldSetup(G4ThreeVector( 3.3*tesla, 0.0, 0.0 ),
398  fUseFSALstepper );
399  G4AutoDelete::Register(fieldSetup); // Kernel will delete the F01FieldSetup
400  fEmFieldSetup.Put(fieldSetup);
401  }
402 }
403 
404 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......