ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
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
//
28
//
29
//
30
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
31
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
32
33
#include "DetectorConstruction.hh"
34
#include "DetectorMessenger.hh"
35
#include "
G4NistManager.hh
"
36
#include "
G4RunManager.hh
"
37
38
#include "
G4Material.hh
"
39
#include "
G4Box.hh
"
40
#include "
G4LogicalVolume.hh
"
41
#include "
G4PVPlacement.hh
"
42
#include "
G4UniformMagField.hh
"
43
#include "
G4UserLimits.hh
"
44
45
#include "
G4GeometryManager.hh
"
46
#include "
G4PhysicalVolumeStore.hh
"
47
#include "
G4LogicalVolumeStore.hh
"
48
#include "
G4SolidStore.hh
"
49
50
#include "
G4UnitsTable.hh
"
51
#include "
G4SystemOfUnits.hh
"
52
53
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
54
55
DetectorConstruction::DetectorConstruction
()
56
:
G4VUserDetectorConstruction
(),
57
fP_Box(0), fL_Box(0), fBoxSize(500*
m
), fMaterial(0), fMagField(0),
58
fUserLimits(0), fDetectorMessenger(0)
59
{
60
DefineMaterials
();
61
SetMaterial
(
"Iron"
);
62
63
// create UserLimits
64
fUserLimits
=
new
G4UserLimits
();
65
66
// create commands for interactive definition of the detector
67
fDetectorMessenger
=
new
DetectorMessenger
(
this
);
68
}
69
70
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
71
72
DetectorConstruction::~DetectorConstruction
()
73
{
delete
fDetectorMessenger
;}
74
75
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
76
77
G4VPhysicalVolume
*
DetectorConstruction::Construct
()
78
{
79
return
ConstructVolumes
();
80
}
81
82
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
83
84
void
DetectorConstruction::DefineMaterials
()
85
{
86
G4double
a
,
z
, density;
87
88
new
G4Material
(
"Beryllium"
, z= 4., a= 9.012182*
g
/
mole
, density= 1.848*
g
/
cm3
);
89
new
G4Material
(
"Carbon"
, z= 6., a= 12.011*
g
/
mole
, density= 2.265*
g
/
cm3
);
90
new
G4Material
(
"Iron"
, z=26., a= 55.85*
g
/
mole
, density= 7.870*
g
/
cm3
);
91
92
G4cout
<< *(
G4Material::GetMaterialTable
()) <<
G4endl
;
93
}
94
95
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
96
97
G4VPhysicalVolume
*
DetectorConstruction::ConstructVolumes
()
98
{
99
G4GeometryManager::GetInstance
()->
OpenGeometry
();
100
G4PhysicalVolumeStore::GetInstance
()->
Clean
();
101
G4LogicalVolumeStore::GetInstance
()->
Clean
();
102
G4SolidStore::GetInstance
()->
Clean
();
103
104
G4Box
*
105
sBox =
new
G4Box
(
"Container"
,
//its name
106
fBoxSize
/2,
fBoxSize
/2,
fBoxSize
/2);
//its dimensions
107
108
fL_Box
=
new
G4LogicalVolume
(sBox,
//its shape
109
fMaterial
,
//its material
110
fMaterial
->
GetName
());
//its name
111
112
fL_Box
->
SetUserLimits
(
fUserLimits
);
113
114
fP_Box
=
new
G4PVPlacement
(0,
//no rotation
115
G4ThreeVector
(),
//at (0,0,0)
116
fL_Box
,
//its logical volume
117
fMaterial
->
GetName
(),
//its name
118
0,
//its mother volume
119
false
,
//no boolean operation
120
0);
//copy number
121
122
PrintParameters
();
123
124
//
125
//always return the root volume
126
//
127
return
fP_Box
;
128
}
129
130
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
131
132
void
DetectorConstruction::PrintParameters
()
133
{
134
G4cout
<<
"\n The Box is "
<<
G4BestUnit
(
fBoxSize
,
"Length"
)
135
<<
" of "
<<
fMaterial
->
GetName
() <<
G4endl
;
136
}
137
138
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
139
140
void
DetectorConstruction::SetMaterial
(
const
G4String
&
name
)
141
{
142
G4cout
<<
"###SetMaterial"
<<
G4endl
;
143
144
// get the pointer to the existing material
145
G4Material
*
mat
=
G4Material::GetMaterial
(name,
false
);
146
147
// create the material by its name
148
if
(!mat) { mat =
G4NistManager::Instance
()->
FindOrBuildMaterial
(name); }
149
150
if
(mat && mat !=
fMaterial
) {
151
G4cout
<<
"### New target material: "
<< mat->
GetName
() <<
G4endl
;
152
fMaterial
=
mat
;
153
if
(
fL_Box
) {
154
fL_Box
->
SetMaterial
(mat);
155
G4RunManager::GetRunManager
()->
PhysicsHasBeenModified
();
156
}
157
}
158
}
159
160
161
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
162
163
void
DetectorConstruction::SetSize
(
G4double
value
)
164
{
165
fBoxSize
=
value
;
166
}
167
168
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
169
170
#include "
G4FieldManager.hh
"
171
#include "
G4TransportationManager.hh
"
172
173
void
DetectorConstruction::SetMagField
(
G4double
fieldValue)
174
{
175
//apply a global uniform magnetic field along Z axis
176
G4FieldManager
* fieldMgr
177
=
G4TransportationManager::GetTransportationManager
()->
GetFieldManager
();
178
179
if
(
fMagField
)
delete
fMagField
;
//delete the existing magn field
180
181
if
(fieldValue!=0.)
// create a new one if non nul
182
{
183
fMagField
=
new
G4UniformMagField
(
G4ThreeVector
(0.,0.,fieldValue));
184
fieldMgr->
SetDetectorField
(
fMagField
);
185
fieldMgr->
CreateChordFinder
(
fMagField
);
186
}
187
else
188
{
189
fMagField
= 0;
190
fieldMgr->
SetDetectorField
(
fMagField
);
191
}
192
}
193
194
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
195
196
void
DetectorConstruction::SetMaxStepSize
(
G4double
val)
197
{
198
// set the maximum allowed step size
199
//
200
if
(val <=
DBL_MIN
)
201
{
G4cout
<<
"\n --->warning from SetMaxStepSize: maxStep "
202
<< val <<
" out of range. Command refused"
<<
G4endl
;
203
return
;
204
}
205
fUserLimits
->
SetMaxAllowedStep
(val);
206
}
207
208
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
209
210
#include "
G4RunManager.hh
"
211
212
void
DetectorConstruction::UpdateGeometry
()
213
{
214
G4RunManager::GetRunManager
()->
DefineWorldVolume
(
ConstructVolumes
());
215
}
216
217
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
geant4
tree
geant4-10.6-release
examples
extended
electromagnetic
TestEm6
src
DetectorConstruction.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:24:49
using
1.8.2 with
ECCE GitHub integration