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 // Please cite the following paper if you use this software
27 // Nucl.Instrum.Meth.B260:20-27, 2007
28 //
29 // Based on purging magnet advanced example.
30 //
31 
32 #include "DetectorConstruction.hh"
33 
34 #include "G4PhysicalConstants.hh"
35 #include "G4SystemOfUnits.hh"
36 #include "G4NistManager.hh"
37 #include "G4RunManager.hh"
38 
39 // Field
40 #include "G4Mag_UsualEqRhs.hh"
42 #include "G4ClassicalRK4.hh"
43 #include "G4PropagatorInField.hh"
44 
45 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
46 
48 
49 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
50 
52 {
54 
55  // Default values (square field, coef calculation, profile)
56 
57  fModel=1;
58  fG1=-11.964623;
59  fG2=16.494652;
60  fG3=9.866770;
61  fG4=-6.244493;
62  fCoef=0;
63  fProfile=1;
64  fGrid=0;
65 
66 }
67 
68 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
69 
71 { delete fDetectorMessenger;}
72 
73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
74 
76 
77 {
79  return ConstructVolumes();
80 }
81 
82 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
83 
85 {
86  G4String name, symbol;
87  G4double density;
88 
89  G4double z, a;
90 
91  // Vacuum standard definition...
92  density = universe_mean_density;
93  G4Material* vacuum = new G4Material(name="Vacuum", z=1., a=1.01*g/mole,
94  density);
95 
96  // NIST
98  man->SetVerbose(1);
99 
100  //
101 
103 
104  // Default materials in setup.
105  fDefaultMaterial = vacuum;
106  fGridMaterial = man->FindOrBuildMaterial("G4_Ni");
107 }
108 
109 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
110 
112 {
113 
114  fSolidWorld = new G4Box("World", //its name
115  12*m/2,12*m/2,22*m/2); //its size
116 
117 
118  fLogicWorld = new G4LogicalVolume(fSolidWorld, //its solid
119  fDefaultMaterial, //its material
120  "World"); //its name
121 
122  fPhysiWorld = new G4PVPlacement(0, //no rotation
123  G4ThreeVector(), //at (0,0,0)
124  "World", //its name
125  fLogicWorld, //its logical volume
126  NULL, //its mother volume
127  false, //no boolean operation
128  0); //copy number
129 
130 
131  // MAGNET VOLUME
132 
133  fSolidVol = new G4Box("Vol", //its name
134  10*m/2,10*m/2,9.120*m/2); //its size
135 
136 
137  fLogicVol = new G4LogicalVolume(fSolidVol, //its solid
138  fDefaultMaterial, //its material
139  "Vol"); //its name
140 
141  fPhysiVol = new G4PVPlacement(0, //no rotation
142  G4ThreeVector(0,0,-4310*mm), //at (0,0,0)
143  "Vol", //its name
144  fLogicVol, //its logical volume
145  fPhysiWorld, //its mother volume
146  false, //no boolean operation
147  0); //copy number
148 
149  // GRID
150 
151  if (fGrid==1)
152  {
153 
154  G4cout << G4endl;
155 
156  G4cout << " ********************** " << G4endl;
157  G4cout << " **** GRID IN PLACE *** " << G4endl;
158  G4cout << " ********************** " << G4endl;
159 
160  G4double x_grid=5.0*mm;
161  G4double y_grid=5.0*mm;
162  G4double grid_Zpos=(250+200)*mm; // 250+10 mm for object size of 50µm diam
163 
164  //G4double thickness_grid=10*micrometer;
165  G4double thickness_grid=100*micrometer;
166 
167  G4double z_grid=thickness_grid/2.0;
168 
169  fSolidGridVol= new G4Box("GridVolume",x_grid,y_grid,z_grid); //its size
170 
171  fLogicGridVol = new G4LogicalVolume(fSolidGridVol, //its solid
172  fGridMaterial, //its material
173  "GridVolume"); //its name
174 
175  fPhysiGridVol = new G4PVPlacement(0, //no rotation
176  G4ThreeVector(0,0,grid_Zpos), // origin
177  fLogicGridVol, //its logical volume
178  "GridVolume", //its name
179  fLogicWorld, //its mother volume
180  false, //no boolean operation
181  0);
182 
183  // Holes in grid
184 
185  G4double holeSize= 9e-3*mm;
186  G4double pix_grid=1.3e-2*mm;
187  G4int num_half_grid=100;
188 
189  fSolidGridVol_Hole= new G4Box("GridHole",holeSize/2,holeSize/2,z_grid); //its size
190 
192  fDefaultMaterial, //its material
193  "GridHole"); //its name
194 
195 
196  for(int i=-num_half_grid;i<num_half_grid;i++)
197  {
198  for (int j=-num_half_grid;j<num_half_grid;j++)
199  {
200 
201  G4double x0_grid,y0_grid,z0_grid;
202  G4int number_index_grid;
203 
204  x0_grid=pix_grid*i;
205  y0_grid=pix_grid*j;
206  z0_grid=0.0*mm;
207 
208  number_index_grid=(i+num_half_grid)*1000+(j+num_half_grid);
209 
210  fPhysiGridVol_Hole = new G4PVPlacement(0, //no rotation
211  G4ThreeVector(x0_grid,y0_grid,z0_grid),//origin
212  fLogicGridVol_Hole, //its logical volume
213  "GridHole", //its name
214  fLogicGridVol, //its mother volume
215  false, //no boolean operation
216  number_index_grid);
217  }
218  }
219 
220  // Grid imaging plane
221 
222  G4double ContVolSizeXY = 1*m;
223  G4double ImPlaneWidth = 0.001*mm;
224 
226  new G4Box
227  ("ControlVol_GridShadow", ContVolSizeXY/2, ContVolSizeXY/2 , ImPlaneWidth/2);
228 
230  new G4LogicalVolume
231  (fSolidControlVol_GridShadow, fDefaultMaterial, "ControlVol_GridShadow");
232 
234  new G4PVPlacement
235  ( 0, G4ThreeVector(0,0,(250+300)*mm), fLogicControlVol_GridShadow, "ControlVol_GridShadow",
236  fLogicWorld, false, 0);
237 
238 
239  } // end GRID
240 
241  // STEP MINIMUM SIZE
243 
244  return fPhysiWorld;
245 }
246 
247 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
248 
250 {
251  fG1 = value;
253 }
254 
255 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
256 
258 {
259  fG2 = value;
261 }
262 
263 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
264 
266 {
267  fG3 = value;
269 }
270 
271 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
272 
274 {
275  fG4 = value;
277 }
278 
279 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
280 
282 {
283  if (modelChoice==1) fModel=1;
284  if (modelChoice==2) fModel=2;
285  if (modelChoice==3) fModel=3;
287 }
288 
289 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
290 
292 {
293  fCoef=val;
295 }
296 
297 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
298 
300 {
301  return fCoef;
302 }
303 
304 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
305 
307 {
308  fProfile=myProfile;
310 }
311 
312 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
313 
315 {
316  fGrid=myGrid;
318 }
319 
320 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
321 
323 {
325 
326  //This is thread-local
327  G4FieldManager* fFieldMgr =
329 
330  G4Mag_UsualEqRhs* fEquation = new G4Mag_UsualEqRhs (fField);
331 
332  G4ClassicalRK4* fStepper = new G4ClassicalRK4 (fEquation);
333 
334  G4ChordFinder* fChordFinder = new G4ChordFinder(fField,1e-9*m,fStepper);
335 
336  fFieldMgr->SetChordFinder(fChordFinder);
337  fFieldMgr->SetDetectorField(fField);
338 
339  // SI: 01-07-2018 : following settings were initially set to 1e-9*m
340  // instead of 1e-9*m, but they now induce warnings as
341  // *** G4Exception : GeomNav1002
342  // issued by : G4PropagatorInField::ComputeStep
343 
344  fFieldMgr->GetChordFinder()->SetDeltaChord(1e-7*m);
345  fFieldMgr->SetDeltaIntersection(1e-7*m);
346  fFieldMgr->SetDeltaOneStep(1e-7*m);
347 
348  //
349 
350  // To avoid G4MagIntegratorDriver::OneGoodStep:Stepsize underflows in Stepper
351 
352  if (fCoef==1)
353  {
354  G4PropagatorInField* fPropInField =
356  fPropInField->SetMinimumEpsilonStep(1e-11);
357  fPropInField->SetMaximumEpsilonStep(1e-10);
358 
359  }
360  else
361  {
362  G4PropagatorInField* fPropInField =
364  fPropInField->SetMinimumEpsilonStep(1e-9);
365  fPropInField->SetMaximumEpsilonStep(1e-8);
366  }
367 
368 }
369