ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
F02DetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file F02DetectorConstruction.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 "F02DetectorMessenger.hh"
37 
38 #include "F02CalorimeterSD.hh"
39 #include "F02ElectricFieldSetup.hh"
40 
41 #include "G4GeometryManager.hh"
42 #include "G4PhysicalVolumeStore.hh"
43 #include "G4LogicalVolumeStore.hh"
44 #include "G4SolidStore.hh"
45 
46 #include "G4Material.hh"
47 #include "G4Tubs.hh"
48 #include "G4LogicalVolume.hh"
49 #include "G4PVPlacement.hh"
50 #include "G4RunManager.hh"
51 #include "G4AutoDelete.hh"
52 #include "G4SDManager.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  fWorldChanged(false), fZAbsorber(0.), fZStartAbs(0.), fZEndAbs(0.),
66  fWorldMaterial(0), fWorldSizeR(0.), fWorldSizeZ(0.)
67 {
68  // default parameter values of the calorimeter
69 
70  fWorldSizeZ = 80.*cm;
71  fWorldSizeR = 20.*cm;
72 
73  fAbsorberThickness = 40.0*mm;
74 
75  fAbsorberRadius = 10.*cm;
76  fZAbsorber = 36.*cm;
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 
173  temperature = STP_Temperature;
174  pressure = 1.0e-0*STP_Pressure;
175 
176  G4Material* air = new G4Material(name="Air" , density, ncomponents=3,
177  kStateGas,temperature,pressure);
178  air->AddMaterial( nitrogen, fractionmass = 0.7557 );
179  air->AddMaterial( oxygen, fractionmass = 0.2315 );
180  air->AddMaterial( argon, fractionmass = 0.0128 );
181 
182  // Xenon as detector gas, STP
183 
184  density = 5.858*mg/cm3;
185  a = 131.29*g/mole;
186  G4Material* Xe = new G4Material(name="Xenon",z=54., a, density );
187 
188  // Carbon dioxide, STP
189 
190  density = 1.842*mg/cm3;
191  G4Material* CarbonDioxide = new G4Material(name="CO2", density, nel=2);
192  CarbonDioxide->AddElement(elC,1);
193  CarbonDioxide->AddElement(elO,2);
194 
195  // 80% Xe + 20% CO2, STP
196 
197  density = 5.0818*mg/cm3;
198  G4Material* Xe20CO2 = new G4Material(name="Xe20CO2", density, ncomponents=2);
199  Xe20CO2->AddMaterial( Xe, fractionmass = 0.922 );
200  Xe20CO2->AddMaterial( CarbonDioxide, fractionmass = 0.078 );
201 
202  // 80% Kr + 20% CO2, STP
203 
204  density = 3.601*mg/cm3;
205  G4Material* Kr20CO2 = new G4Material(name="Kr20CO2", density, ncomponents=2);
206  Kr20CO2->AddMaterial( Kr, fractionmass = 0.89 );
207  Kr20CO2->AddMaterial( CarbonDioxide, fractionmass = 0.11 );
208 
210 
211  // default materials of the calorimeter
212 
213  fAbsorberMaterial = Kr20CO2; // XeCO2CF4;
214 
215  fWorldMaterial = air;
216 }
217 
218 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
219 
221 {
222  // Cleanup old geometry
223 
224  if (fPhysiWorld)
225  {
230  }
231 
232  // complete the Calor parameters definition and Print
233 
236 
237  // World
238 
239  fSolidWorld = new G4Tubs("World", // its name
240  0.,fWorldSizeR,fWorldSizeZ/2.,0.,twopi);// its size
241 
242  fLogicWorld = new G4LogicalVolume(fSolidWorld, // its solid
243  fWorldMaterial, // its material
244  "World"); // its name
245 
246  fPhysiWorld = new G4PVPlacement(0, // no rotation
247  G4ThreeVector(), // at (0,0,0)
248  "World", // its name
249  fLogicWorld, // its logical volume
250  0, // its mother volume
251  false, // no boolean op.
252  0); // copy number
253  // Absorber
254 
255  fSolidAbsorber = new G4Tubs("Absorber",0.,
258  0.0,twopi);
259 
262  "Absorber");
263 
265  G4ThreeVector(0.,0.,fZAbsorber),
266  "Absorber",
268  fPhysiWorld,
269  false,
270  0);
271 
272  return fPhysiWorld;
273 }
274 
275 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
276 
278 {
279  G4cout << "\n The WORLD is made of "
280  << fWorldSizeZ/mm << "mm of " << fWorldMaterial->GetName();
281  G4cout << ", the transverse size (R) of the world is "
282  << fWorldSizeR/mm << " mm. " << G4endl;
283  G4cout << " The ABSORBER is made of "
284  << fAbsorberThickness/mm << "mm of " << fAbsorberMaterial->GetName();
285  G4cout << ", the transverse size (R) is " << fAbsorberRadius/mm
286  << " mm. " << G4endl;
287  G4cout << " Z position of the (middle of the) absorber "
288  << fZAbsorber/mm << " mm." << G4endl;
289  G4cout << G4endl;
290 }
291 
292 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
293 
295 {
296  // get the pointer to the material table
297  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
298 
299  // search the material by its name
301  for (size_t j=0 ; j<theMaterialTable->size() ; j++)
302  { material = (*theMaterialTable)[j];
303  if (material->GetName() == materialChoice)
304  {
306  fLogicAbsorber->SetMaterial(material);
308  }
309  }
310 }
311 
312 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
313 
315 {
316  // get the pointer to the material table
317  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
318 
319  // search the material by its name
321  for (size_t j=0 ; j<theMaterialTable->size() ; j++)
322  { material = (*theMaterialTable)[j];
323  if(material->GetName() == materialChoice)
324  {
326  fLogicWorld->SetMaterial(material);
328  }
329  }
330 }
331 
332 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
333 
335 {
336  // change Absorber thickness and recompute the calorimeter parameters
337  fAbsorberThickness = val;
340 }
341 
342 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
343 
345 {
346  // change the transverse size and recompute the calorimeter parameters
347  fAbsorberRadius = val;
350 }
351 
352 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
353 
355 {
356  fWorldChanged = true;
357  fWorldSizeZ = val;
360 }
361 
362 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
363 
365 {
366  fWorldChanged = true;
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  F02CalorimeterSD* calorimeterSD = new F02CalorimeterSD("CalorSD",this);
389  fCalorimeterSD.Put(calorimeterSD);
390  }
393 
394  // Construct the field creator - this will register the field it creates
395 
396  if (!fEmFieldSetup.Get()) {
397  F02ElectricFieldSetup* fieldSetup = new F02ElectricFieldSetup();
398  G4AutoDelete::Register(fieldSetup); //Kernel will delete the messenger
399  fEmFieldSetup.Put(fieldSetup);
400  }
401 }
402 
403 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......