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 //
26 //
27 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
28 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
29 
30 #include "DetectorConstruction.hh"
31 
32 #include "G4SystemOfUnits.hh"
33 #include "G4PhysicalConstants.hh"
34 #include "G4Material.hh"
35 #include "G4Tubs.hh"
36 #include "G4Box.hh"
37 #include "G4LogicalVolume.hh"
38 #include "G4PVPlacement.hh"
39 #include "G4PVReplica.hh"
40 #include "G4Transform3D.hh"
41 #include "G4RotationMatrix.hh"
42 
43 #include "G4GeometryManager.hh"
44 #include "G4PhysicalVolumeStore.hh"
45 #include "G4LogicalVolumeStore.hh"
46 #include "G4SolidStore.hh"
47 
48 #include "G4VisAttributes.hh"
49 
50 
51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
52 
54 :fiberMat(0),lvol_fiber(0), absorberMat(0),lvol_layer(0),
55  moduleMat(0),lvol_module(0), calorimeterMat(0),lvol_calorimeter(0),
56  worldMat(0),pvol_world(0), defaultMat(0)
57 {
58  // materials
60 
61  // default parameter values of calorimeter
62  //
63  fiberDiameter = 1.13*mm; //1.08*mm
64  nbOfFibers = 490; //490
65  distanceInterFibers = 1.35*mm; //1.35*mm
66  layerThickness = 1.73*mm; //1.68*mm
67  milledLayer = 1.00*mm; //1.40*mm ?
68  nbOfLayers = 10; //10
69  nbOfModules = 9; //9
70 
71  fiberLength = (nbOfFibers+0.5)*distanceInterFibers; //662.175*mm
72 }
73 
74 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
75 
77 { }
78 
79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
80 
82 {
83  return ConstructCalorimeter();
84 }
85 
86 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
87 
89 {
90  // define Elements
91  //
92  G4Element* H = new G4Element("Hydrogen","H", 1, 1.01*g/mole);
93  G4Element* C = new G4Element("Carbon", "C", 6, 12.01*g/mole);
94  G4Element* N = new G4Element("Nitrogen","N", 7, 14.01*g/mole);
95  G4Element* O = new G4Element("Oxygen", "O", 8, 16.00*g/mole);
96 
97  G4int natoms, ncomponents;
98  G4double density, massfraction;
99 
100  // Lead
101  //
102  G4Material* Pb =
103  new G4Material("Lead", 82., 207.20*g/mole, density= 0.98*11.20*g/cm3);
104 
105  // Scintillator
106  //
107  G4Material* Sci =
108  new G4Material("Scintillator", density= 1.032*g/cm3, ncomponents=2);
109  Sci->AddElement(C, natoms=8);
110  Sci->AddElement(H, natoms=8);
111 
112  Sci->GetIonisation()->SetBirksConstant(0.126*mm/MeV);
113 
114  // Air
115  //
116  G4Material* Air =
117  new G4Material("Air", density= 1.290*mg/cm3, ncomponents=2);
118  Air->AddElement(N, massfraction=70*perCent);
119  Air->AddElement(O, massfraction=30.*perCent);
120 
121  // example of vacuum
122  //
123  density = universe_mean_density; //from PhysicalConstants.h
124  G4double pressure = 3.e-18*pascal;
125  G4double temperature = 2.73*kelvin;
126  G4Material* Vacuum =
127  new G4Material("Galactic", 1., 1.008*g/mole, density,
128  kStateGas,temperature,pressure);
129 
130  //attribute materials
131  //
132  defaultMat = Vacuum;
133  fiberMat = Sci;
134  absorberMat = Pb;
138 
139  // print table
140  //
142 }
143 
144 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
145 
147 {
148  // Cleanup old geometry
149  //
154 
155  // fibers
156  //
157  G4Tubs*
158  svol_fiber = new G4Tubs("fiber", //name
159  0*mm, 0.5*fiberDiameter, //r1, r2
160  0.5*fiberLength, //half-length
161  0., twopi); //theta1, theta2
162 
163  lvol_fiber = new G4LogicalVolume(svol_fiber, //solid
164  fiberMat, //material
165  "fiber"); //name
166 
167  // layer
168  //
169  G4double sizeX = layerThickness;
171  G4double sizeZ = fiberLength;
172 
173  G4Box*
174  svol_layer = new G4Box("layer", //name
175  0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size
176 
177 
178  lvol_layer = new G4LogicalVolume(svol_layer, //solid
179  absorberMat, //material
180  "layer"); //name
181 
182  // put fibers within layer
183  //
184  G4double Xcenter = 0.;
185  G4double Ycenter = -0.5*(sizeY + distanceInterFibers);
186 
187  for (G4int k=0; k<nbOfFibers; k++) {
188  Ycenter += distanceInterFibers;
189  new G4PVPlacement(0, //no rotation
190  G4ThreeVector(Xcenter,Ycenter,0.), //position
191  lvol_fiber, //logical volume
192  "fiber", //name
193  lvol_layer, //mother
194  false, //no boulean operat
195  k+1); //copy number
196 
197  }
198 
199  // modules
200  //
202  sizeX = moduleThickness;
203  sizeY = fiberLength;
204  sizeZ = fiberLength;
205 
206  G4Box*
207  svol_module = new G4Box("module", //name
208  0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size
209 
210  lvol_module = new G4LogicalVolume(svol_module, //solid
211  absorberMat, //material
212  "module"); //name
213 
214  // put layers within module
215  //
216  Xcenter = -0.5*(nbOfLayers+1)*layerThickness;
217  Ycenter = 0.25*distanceInterFibers;
218 
219  for (G4int k=0; k<nbOfLayers; k++) {
220  Xcenter += layerThickness;
221  Ycenter = - Ycenter;
222  new G4PVPlacement(0, //no rotation
223  G4ThreeVector(Xcenter,Ycenter,0.), //position
224  lvol_layer, //logical volume
225  "layer", //name
226  lvol_module, //mother
227  false, //no boulean operat
228  k+1); //copy number
229 
230  }
231 
232  // calorimeter
233  //
235  sizeX = calorThickness;
236  sizeY = fiberLength;
237  sizeZ = fiberLength;
238 
239  G4Box*
240  svol_calorimeter = new G4Box("calorimeter", //name
241  0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size
242 
243 
244  lvol_calorimeter = new G4LogicalVolume(svol_calorimeter, //solid
245  calorimeterMat, //material
246  "calorimeter"); //name
247 
248  // put modules inside calorimeter
249  //
250  Xcenter = -0.5*(calorThickness + moduleThickness);
251 
252 
253  for (G4int k=0; k<nbOfModules; k++) {
254  Xcenter += moduleThickness;
255  G4RotationMatrix rotm; //rotation matrix to place modules
256  if ((k+1)%2 == 0) rotm.rotateX(90*deg);
257  G4Transform3D transform(rotm, G4ThreeVector(Xcenter,0.,0.));
258  new G4PVPlacement(transform, //rotation+position
259  lvol_module, //logical volume
260  "module", //name
261  lvol_calorimeter, //mother
262  false, //no boulean operat
263  k+1); //copy number
264  }
265 
266  // world
267  //
268  sizeX = 1.2*calorThickness;
269  sizeY = 1.2*fiberLength;
270  sizeZ = 1.2*fiberLength;
271 
272  worldSizeX = sizeX;
273 
274  G4Box*
275  svol_world = new G4Box("world", //name
276  0.5*sizeX, 0.5*sizeY, 0.5*sizeZ); //size
277 
278  lvol_world = new G4LogicalVolume(svol_world, //solid
279  worldMat, //material
280  "world"); //name
281 
282  pvol_world = new G4PVPlacement(0, //no rotation
283  G4ThreeVector(), //at (0,0,0)
284  lvol_world, //logical volume
285  "world", //name
286  0, //mother volume
287  false, //no boolean operation
288  0); //copy number
289 
290  //put calorimeter in world
291  //
292  new G4PVPlacement(0, //no rotation
293  G4ThreeVector(), //at (0,0,0)
294  lvol_calorimeter, //logical volume
295  "calorimeter", //name
296  lvol_world, //mother volume
297  false, //no boolean operation
298  0); //copy number
299 
301 
302  // Visualization attributes
303  //
307 
308  //always return the physical World
309  //
310  return pvol_world;
311 }
312 
313 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
314 
315 #include "G4UnitsTable.hh"
316 
318 {
319  G4cout << "\n-------------------------------------------------------------"
320  << "\n ---> The calorimeter is " << nbOfModules << " Modules"
321  << "\n ---> A Module is " << nbOfLayers << " Layers + 1 milled Layer";
322 
323  G4cout
324  << "\n ---> A Layer is " << G4BestUnit(layerThickness,"Length")
325  << " thickness of " << absorberMat->GetName();
326 
327  G4cout
328  << "\n ---> A Layer includes " << nbOfFibers << " fibers of "
329  << fiberMat->GetName();
330 
331  G4cout
332  << "\n ---> diameter : " << G4BestUnit(fiberDiameter,"Length")
333  << "\n ---> length : " << G4BestUnit(fiberLength,"Length")
334  << "\n ---> distance : " << G4BestUnit(distanceInterFibers,"Length");
335 
336  G4cout
337  << "\n ---> The milled Layer is " << G4BestUnit(milledLayer,"Length")
338  << " thickness of " << absorberMat->GetName();
339 
340  G4cout
341  << "\n\n ---> Module thickness " << G4BestUnit(moduleThickness,"Length");
342 
343  G4cout
344  << "\n\n ---> Total calor thickness " << G4BestUnit(calorThickness,"Length")
345  << "\n Tranverse size " << G4BestUnit(fiberLength,"Length");
346 
347  G4cout << "\n-------------------------------------------------------------\n";
348  G4cout << G4endl;
349 }
350 
351 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
352 
354 #include "G4AutoDelete.hh"
355 
357 {
358  if ( fFieldMessenger.Get() == 0 ) {
359  // Create global magnetic field messenger.
360  // Uniform magnetic field is then created automatically if
361  // the field value is not zero.
362  G4ThreeVector fieldValue = G4ThreeVector();
364  new G4GlobalMagFieldMessenger(fieldValue);
365  //msg->SetVerboseLevel(1);
367  fFieldMessenger.Put( msg );
368 
369  }
370 }
371 
372 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......