ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
F03DetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file F03DetectorConstruction.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 "F03DetectorMessenger.hh"
37 
38 #include "F03CalorimeterSD.hh"
39 #include "F03FieldSetup.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  fSolidRadSlice(0), fLogicRadSlice(0), fPhysiRadSlice(0),
65  fSolidRadiator(0), fLogicRadiator(0), fPhysiRadiator(0),
66  fWorldMaterial(0), fAbsorberMaterial(0), fRadiatorMat(0),
67  // default parameter values of the calorimeter
68  fWorldSizeR( 22000.*mm),
69  fWorldSizeZ( 44000.*mm),
70  fAbsorberThickness( 1.*mm),
71  fAbsorberRadius( 20000.*mm),
72  fZAbsorber( 21990.*mm),
73  fZStartAbs( 0.),
74  fZEndAbs( 0.),
75  fRadThickness( 100.*mm),
76  fGasGap( 100.*mm),
77  fDetGap( 1.*mm),
78  fFoilNumber(2)
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  temperature = STP_Temperature;
174  pressure = 1.0e-8*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 and TR radiator
212 
213  fRadiatorMat = air; // CH2 ; // mylar;
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  G4bool checkOverlaps = true;
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  checkOverlaps); // checkOverlaps
256 
257  // TR radiator envelope
259  G4double zRad = fZAbsorber - 0.5*(radThick + fAbsorberThickness);
260 
261  G4cout << "zRad = " << zRad/mm << " mm" << G4endl;
262  G4cout << "radThick = " << radThick/mm << " mm" << G4endl;
263  G4cout << "fFoilNumber = " << fFoilNumber << G4endl;
264  G4cout << "fRadiatorMat = " << fRadiatorMat->GetName() << G4endl;
265  G4cout << "WorldMaterial = " << fWorldMaterial->GetName() << G4endl;
266 
267  fSolidRadiator = new G4Tubs("Radiator", 0.0, fAbsorberRadius, 0.5*radThick,
268  0.0, twopi);
269 
271  "Radiator");
272 
273  fPhysiRadiator = new G4PVPlacement(0, G4ThreeVector(0,0,zRad),
274  "Radiator", fLogicRadiator, fPhysiWorld, false, 0,
275  checkOverlaps);
276 
277 
278  fSolidRadSlice = new G4Tubs("RadSlice",0.0, fAbsorberRadius, 0.5*fRadThickness,
279  0.0, twopi);
280 
282 
283  // Radiator slice
284  G4double radSliceThick = fRadThickness +fGasGap;
285  G4double zStart = 0.5*(-radThick + radSliceThick) + fDetGap;
286  // start on the board of radiator enevelope + det gap
287 
288  for (G4int j=0;j<fFoilNumber;j++)
289  {
290  G4double zSlice = zStart + j*radSliceThick;
291  G4cout << zSlice/mm << " mm" << "\t";
292 
293  fPhysiRadSlice = new G4PVPlacement(0,G4ThreeVector(0.,0., zSlice),
294  "RadSlice",fLogicRadSlice,
295  fPhysiRadiator,false,j, checkOverlaps);
296  }
297  G4cout << G4endl;
298 
299  // Absorber
300 
301  fSolidAbsorber = new G4Tubs("Absorber", 1.0*mm,
304  0.0,twopi);
305 
308  "Absorber");
309 
311  G4ThreeVector(0.,0.,fZAbsorber),
312  "Absorber",
314  fPhysiWorld,
315  false,
316  0,
317  checkOverlaps);
318 
319  return fPhysiWorld;
320 }
321 
322 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
323 
325 {
326  G4cout << "\n The WORLD is made of "
327  << fWorldSizeZ/mm << "mm of " << fWorldMaterial->GetName();
328  G4cout << ", the transverse size (R) of the world is "
329  << fWorldSizeR/mm << " mm. " << G4endl;
330  G4cout << " The ABSORBER is made of "
331  << fAbsorberThickness/mm << "mm of " << fAbsorberMaterial->GetName();
332  G4cout << ", the transverse size (R) is " << fAbsorberRadius/mm
333  << " mm. " << G4endl;
334  G4cout << " Z position of the (middle of the) absorber "
335  << fZAbsorber/mm << " mm." << G4endl;
336  G4cout << G4endl;
337 }
338 
339 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
340 
342 {
343  // get the pointer to the material table
344  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
345 
346  // search the material by its name
348  for (size_t j=0 ; j<theMaterialTable->size() ; j++)
349  { material = (*theMaterialTable)[j];
350  if (material->GetName() == materialChoice)
351  {
353  fLogicAbsorber->SetMaterial(material);
355  }
356  }
357 }
358 
359 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
360 
362 {
363  // get the pointer to the material table
364  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
365 
366  // search the material by its name
368  for (size_t j=0 ; j<theMaterialTable->size() ; j++)
369  { material = (*theMaterialTable)[j];
370  if(material->GetName() == materialChoice)
371  {
373  fLogicWorld->SetMaterial(material);
375  }
376  }
377 }
378 
379 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
380 
382 {
383  // change Absorber thickness and recompute the calorimeter parameters
384  fAbsorberThickness = val;
387 }
388 
389 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
390 
392 {
393  // change the transverse size and recompute the calorimeter parameters
394  fAbsorberRadius = val;
397 }
398 
399 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
400 
402 {
403  fWorldSizeZ = val;
406 }
407 
408 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
409 
411 {
412  fWorldSizeR = val;
415 }
416 
417 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
418 
420 {
421  fZAbsorber = val;
424 }
425 
426 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
427 
429 {
430  // Sensitive Detectors: Absorber
431 
432  if (!fCalorimeterSD.Get()) {
433  F03CalorimeterSD* calorimeterSD = new F03CalorimeterSD("CalorSD",this);
434  fCalorimeterSD.Put(calorimeterSD);
435  }
438 
439  // Construct the field creator - this will register the field it creates
440 
441  if (!fEmFieldSetup.Get()) {
442  F03FieldSetup* emFieldSetup = new F03FieldSetup();
443 
444  fEmFieldSetup.Put(emFieldSetup);
445  G4AutoDelete::Register(emFieldSetup); //Kernel will delete the messenger
446  }
447  // Set local field manager and local field in radiator and its daughters:
448  G4bool allLocal = true;
450  allLocal );
451 }
452 
453 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......