Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
examples/advanced/nanobeam/src/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 50m 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  fFieldMgr->GetChordFinder()->SetDeltaChord(1e-9*m);
340  fFieldMgr->SetDeltaIntersection(1e-9*m);
341  fFieldMgr->SetDeltaOneStep(1e-9*m);
342 
343  // To avoid G4MagIntegratorDriver::OneGoodStep:Stepsize underflows in Stepper
344 
345  if (fCoef==1)
346  {
347  G4PropagatorInField* fPropInField =
349  fPropInField->SetMinimumEpsilonStep(1e-11);
350  fPropInField->SetMaximumEpsilonStep(1e-10);
351 
352  }
353  else
354  {
355  G4PropagatorInField* fPropInField =
357  fPropInField->SetMinimumEpsilonStep(1e-9);
358  fPropInField->SetMaximumEpsilonStep(1e-8);
359  }
360 
361 }
362 
static G4RunManager * GetRunManager()
Definition: G4RunManager.cc:80
static constexpr double micrometer
Definition: G4SIunits.hh:100
const XML_Char * name
Definition: expat.h:151
CLHEP::Hep3Vector G4ThreeVector
std::vector< ExP01TrackerHit * > a
Definition: ExP01Classes.hh:33
void SetDeltaChord(G4double newval)
void SetMaximumEpsilonStep(G4double newEpsMax)
static G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:593
static constexpr double mm
Definition: G4SIunits.hh:115
#define G4endl
Definition: G4ios.hh:61
float G4float
Definition: G4Types.hh:77
Double_t z
static constexpr double universe_mean_density
#define G4ThreadLocal
Definition: tls.hh:69
G4bool SetDetectorField(G4Field *detectorField, int failMode=0)
void SetVerbose(G4int)
static constexpr double g
Definition: G4SIunits.hh:183
static constexpr double m
Definition: G4SIunits.hh:129
double G4double
Definition: G4Types.hh:76
G4FieldManager * GetFieldManager() const
const XML_Char int const XML_Char * value
Definition: expat.h:331
Definition: G4Box.hh:64
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
void SetUserLimits(G4UserLimits *pULimits)
static G4TransportationManager * GetTransportationManager()
void SetMinimumEpsilonStep(G4double newEpsMin)
void SetChordFinder(G4ChordFinder *aChordFinder)
int G4int
Definition: G4Types.hh:78
void ReinitializeGeometry(G4bool destroyFirst=false, G4bool prop=true)
void SetDeltaIntersection(G4double valueDintersection)
G4GLOB_DLL std::ostream G4cout
G4PropagatorInField * GetPropagatorInField() const
static constexpr double mole
Definition: G4SIunits.hh:286
void SetDeltaOneStep(G4double valueD1step)
static G4NistManager * Instance()
G4ChordFinder * GetChordFinder()