ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DetectorALICE06.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file DetectorALICE06.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 
33 #include "DetectorALICE06.hh"
34 #include "SensitiveDetector.hh"
35 #include "Materials.hh"
36 
37 #include "G4Material.hh"
38 #include "G4Box.hh"
39 #include "G4LogicalVolume.hh"
40 #include "G4PVPlacement.hh"
41 #include "G4UniformMagField.hh"
42 #include "G4FieldManager.hh"
44 #include "G4SDManager.hh"
45 
46 #include "G4Region.hh"
47 
48 #include "G4UnitsTable.hh"
49 #include "G4SystemOfUnits.hh"
50 #include "G4ios.hh"
51 
52 #include <cmath>
53 
54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
55 
57  : fRadiatorDescription(0)
58 {}
59 
60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
61 
63 {
64  // delete fRadiatorDescription;
65  // the description is deleted in detector construction
66 }
67 
68 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
69 
71 {
72  // Geometry parameters
73  //
74 
75  G4cout << "DetectorALICE06 setup" << G4endl;
76 
77  G4double worldSizeZ = 600.*cm;
78  G4double worldSizeR = 22.*cm;
79 
80  // Radiator and detector parameters
81 
82  G4double radThickness = 0.020*mm;
83  G4double gasGap = 0.500*mm;
84  G4double foilGasRatio = radThickness/(radThickness+gasGap);
85  G4int foilNumber = 120;
86 
87  G4double absorberThickness = 37*mm;
88  G4double absorberRadius = 100.*mm;
89 
90  G4double electrodeThick = 100.0*micrometer;
91  G4double pipeLength = 160.0*cm;
92  G4double mylarThick = 20.0*micrometer;
93  G4double detGap = 0.01*mm;
94 
95  G4double startZ = 100.0*mm;
96 
97  // Materials
98  //
99 
100  // Change to create materials using NIST
103  G4Material* xe15CO2 = Materials::GetInstance()->GetMaterial("Xe15CO2");
104 
105  G4double foilDensity = ch2->GetDensity();
106  G4double gasDensity = air->GetDensity();
107  G4double totDensity = foilDensity*foilGasRatio
108  + gasDensity*(1.0-foilGasRatio);
109 
110  G4double fractionFoil = foilDensity*foilGasRatio/totDensity;
111  G4double fractionGas = 1.0 - fractionFoil;
112  G4Material* radiatorMat = new G4Material("radiatorMat", totDensity, 2);
113  radiatorMat->AddMaterial(ch2, fractionFoil);
114  radiatorMat->AddMaterial(air, fractionGas);
115 
116  // Radiator description
118  fRadiatorDescription->fFoilMaterial = ch2; // CH2; // Kapton; // Mylar ; // Li ; // CH2 ;
119  fRadiatorDescription->fGasMaterial = air; // CO2; // He; //
120  fRadiatorDescription->fFoilThickness = radThickness;
122  fRadiatorDescription->fFoilNumber = foilNumber;
123 
124  G4Material* worldMaterial = air; // CO2;
125  G4Material* absorberMaterial = xe15CO2;
126 
127  // Volumes
128  //
129 
130  G4VSolid* solidWorld
131  = new G4Box("World", worldSizeR, worldSizeR, worldSizeZ/2.);
132 
133  G4LogicalVolume* logicWorld
134  = new G4LogicalVolume(solidWorld, worldMaterial, "World");
135 
136  G4VPhysicalVolume* physicsWorld
137  = new G4PVPlacement(0, G4ThreeVector(), "World", logicWorld, 0, false, 0);
138 
139  // TR radiator envelope
140 
141  G4double radThick = foilNumber*(radThickness + gasGap) - gasGap + detGap;
142  G4double radZ = startZ + 0.5*radThick;
143 
144  G4VSolid* solidRadiator
145  = new G4Box("Radiator", 1.1*absorberRadius, 1.1*absorberRadius, 0.5*radThick);
146 
147  G4LogicalVolume* logicRadiator
148  = new G4LogicalVolume(solidRadiator, radiatorMat, "Radiator");
149 
150  new G4PVPlacement(0, G4ThreeVector(0, 0, radZ),
151  "Radiator", logicRadiator, physicsWorld, false, 0 );
152 
153  fRadiatorDescription->fLogicalVolume = logicRadiator;
154 
155  // Create region for radiator
156 
157  G4Region* radRegion = new G4Region("XTRradiator");
158  radRegion->AddRootLogicalVolume(logicRadiator);
159 
160  // Drift Electrode on both sides of Radiator
161  // (not placed)
162 
163  G4double zElectrode1 = radZ - radThick/2. - electrodeThick/2.;
164  G4double zElectrode2 = radZ + radThick/2. + electrodeThick/2.;
165 
166  G4cout << "zElectrode1 = " << zElectrode1/mm << " mm" <<G4endl;
167  G4cout << "zElectrode2 = " << zElectrode2/mm << " mm" <<G4endl;
168  G4cout << "fElectrodeThick = " << electrodeThick/mm << " mm" << G4endl <<G4endl;
169 
170  // Helium Pipe
171  // (not placed)
172 
173  //Distance between pipe and radiator / absorber
174  G4double pipeDist = 1.*cm;
175  G4double zPipe = zElectrode2 + electrodeThick/2. + pipeDist/2. + pipeLength/2.;
176 
177  G4cout << "zPipe = " << zPipe/mm << " mm" << G4endl;
178  G4cout << "pipeLength = " << pipeLength/mm <<" mm" << G4endl << G4endl;
179 
180  // Mylar Foil on both sides of helium pipe
181  // (not placed)
182 
183  G4double zMylar1 = zPipe - pipeLength/2. - mylarThick/2. - 0.001*mm;
184  G4double zMylar2 = zPipe + pipeLength/2. + mylarThick/2. + 0.001*mm;
185 
186  G4cout << "zMylar1 = " << zMylar1/mm << " mm" << G4endl;
187  G4cout << "zMylar2 = " << zMylar2/mm << " mm" << G4endl;
188  G4cout << "fMylarThick = " << mylarThick/mm << " mm" << G4endl << G4endl;
189 
190  // Mylar Foil on Chamber
191  // (not placed)
192 
193  G4double zMylar = zElectrode2 + electrodeThick/2. + mylarThick/2. + 1.0*mm;
194  zMylar += ( pipeLength + pipeDist );
195 
196  G4cout << "zMylar = " << zMylar/mm <<" mm" <<G4endl;
197  G4cout << "mylarThick = " << mylarThick/mm << " mm" << G4endl << G4endl;
198 
199  // Absorber
200 
201  G4double absorberZ = zMylar + mylarThick + absorberThickness/2.;
202 
203  G4VSolid* solidAbsorber
204  = new G4Box("Absorber", absorberRadius, 10.*mm, absorberThickness/2.);
205 
206  G4LogicalVolume* logicAbsorber
207  = new G4LogicalVolume(solidAbsorber, absorberMaterial, "Absorber");
208 
209  new G4PVPlacement(0, G4ThreeVector(0., 0., absorberZ),
210  "Absorber", logicAbsorber, physicsWorld, false, 0);
211 
212  G4Region* regGasDet = new G4Region("XTRdEdxDetector");
213  regGasDet->AddRootLogicalVolume(logicAbsorber);
214 
215  // Sensitive Detectors: Absorber
216 
217  SensitiveDetector* sd = new SensitiveDetector("AbsorberSD");
219  logicAbsorber->SetSensitiveDetector(sd);
220 
221  // Print geometry parameters
222 
223  G4cout << "\n The WORLD is made of "
224  << worldSizeZ/mm << "mm of " << worldMaterial->GetName();
225  G4cout << ", the transverse size (R) of the world is "
226  << worldSizeR/mm << " mm. " << G4endl;
227  G4cout << " The ABSORBER is made of "
228  << absorberThickness/mm << "mm of " << absorberMaterial->GetName();
229  G4cout << ", the transverse size (R) is "
230  << absorberRadius/mm << " mm. " << G4endl;
231  G4cout << " Z position of the (middle of the) absorber "
232  << absorberZ/mm << " mm." << G4endl;
233 
234  G4cout << "radZ = " << radZ/mm << " mm" << G4endl;
235  G4cout << "startZ = " << startZ/mm<< " mm" << G4endl;
236 
237  G4cout << "fRadThick = " << radThick/mm << " mm"<<G4endl;
238  G4cout << "fFoilNumber = " << foilNumber << G4endl;
239  G4cout << "fRadiatorMat = " << radiatorMat->GetName() << G4endl;
240  G4cout << "WorldMaterial = " << worldMaterial->GetName() << G4endl;
241  G4cout << G4endl;
242 
243  return physicsWorld;
244 }
245 
246 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......