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
ExN04DetectorConstruction.cc
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file ExN04DetectorConstruction.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
//
29
//
30
31
#include "ExN04DetectorConstruction.hh"
32
#include "ExN04TrackerSD.hh"
33
#include "ExN04CalorimeterSD.hh"
34
#include "ExN04CalorimeterROGeometry.hh"
35
#include "ExN04MuonSD.hh"
36
#include "ExN04TrackerParametrisation.hh"
37
#include "ExN04CalorimeterParametrisation.hh"
38
#include "ExN04Field.hh"
39
40
#include "
G4Material.hh
"
41
#include "
G4MaterialTable.hh
"
42
#include "
G4Element.hh
"
43
#include "
G4ElementTable.hh
"
44
#include "
G4Box.hh
"
45
#include "
G4Tubs.hh
"
46
#include "
G4LogicalVolume.hh
"
47
#include "
G4ThreeVector.hh
"
48
#include "
G4PVPlacement.hh
"
49
#include "
G4PVParameterised.hh
"
50
#include "
G4Transform3D.hh
"
51
#include "
G4RotationMatrix.hh
"
52
#include "
G4FieldManager.hh
"
53
#include "
G4TransportationManager.hh
"
54
#include "
G4SDManager.hh
"
55
#include "
G4VisAttributes.hh
"
56
#include "
G4Colour.hh
"
57
#include "
G4SystemOfUnits.hh
"
58
59
ExN04DetectorConstruction::ExN04DetectorConstruction
()
60
{
61
62
#include "ExN04DetectorParameterDef.icc"
63
DefineMaterials
();
64
65
}
66
67
ExN04DetectorConstruction::~ExN04DetectorConstruction
()
68
{
69
delete
Scinti
;
70
delete
Silicon
;
71
delete
Ar
;
72
delete
Lead
;
73
delete
Air
;
74
75
delete
O
;
76
delete
N
;
77
delete
C
;
78
delete
H
;
79
}
80
81
void
ExN04DetectorConstruction::DefineMaterials
()
82
{
83
//-------------------------------------------------------------------------
84
// Materials
85
//-------------------------------------------------------------------------
86
87
G4double
a
,
z
, density;
88
G4int
nel;
89
90
H
=
new
G4Element
(
"Hydrogen"
,
"H"
, z=1., a= 1.01*
g
/
mole
);
91
C
=
new
G4Element
(
"Carbon"
,
"C"
, z=6., a= 12.01*
g
/
mole
);
92
N
=
new
G4Element
(
"Nitrogen"
,
"N"
, z=7., a= 14.01*
g
/
mole
);
93
O
=
new
G4Element
(
"Oxygen"
,
"O"
, z=8., a= 16.00*
g
/
mole
);
94
95
Air
=
new
G4Material
(
"Air"
, density= 1.29*
mg
/
cm3
, nel=2);
96
Air
->
AddElement
(
N
, 70.*
perCent
);
97
Air
->
AddElement
(
O
, 30.*
perCent
);
98
99
Lead
=
100
new
G4Material
(
"Lead"
, z=82., a= 207.19*
g
/
mole
, density= 11.35*
g
/
cm3
);
101
102
Ar
=
103
new
G4Material
(
"ArgonGas"
,z=18., a= 39.95*
g
/
mole
, density=1.782*
mg
/
cm3
);
104
105
Silicon
=
106
new
G4Material
(
"Silicon"
, z=14., a= 28.09*
g
/
mole
, density= 2.33*
g
/
cm3
);
107
108
Scinti
=
new
G4Material
(
"Scintillator"
, density= 1.032*
g
/
cm3
, nel=2);
109
Scinti
->
AddElement
(
C
, 9);
110
Scinti
->
AddElement
(
H
, 10);
111
}
112
113
G4VPhysicalVolume
*
ExN04DetectorConstruction::Construct
()
114
{
115
//-------------------------------------------------------------------------
116
// Magnetic field
117
//-------------------------------------------------------------------------
118
119
static
G4bool
fieldIsInitialized =
false
;
120
if
(!fieldIsInitialized)
121
{
122
ExN04Field
* myField =
new
ExN04Field
;
123
G4FieldManager
* fieldMgr
124
=
G4TransportationManager::GetTransportationManager
()
125
->
GetFieldManager
();
126
fieldMgr->
SetDetectorField
(myField);
127
fieldMgr->
CreateChordFinder
(myField);
128
fieldIsInitialized =
true
;
129
}
130
131
132
//-------------------------------------------------------------------------
133
// Detector geometry
134
//-------------------------------------------------------------------------
135
136
//------------------------------ experimental hall
137
G4Box
* experimentalHall_box
138
=
new
G4Box
(
"expHall_b"
,
expHall_x
,
expHall_y
,
expHall_z
);
139
G4LogicalVolume
* experimentalHall_log
140
=
new
G4LogicalVolume
(experimentalHall_box,
Air
,
"expHall_L"
,0,0,0);
141
G4VPhysicalVolume
* experimentalHall_phys
142
=
new
G4PVPlacement
(0,
G4ThreeVector
(),experimentalHall_log,
"expHall_P"
,
143
0,
false
,0);
144
experimentalHall_log->
SetVisAttributes
(
G4VisAttributes::GetInvisible
());
145
146
//------------------------------ tracker
147
G4VSolid
* tracker_tubs
148
=
new
G4Tubs
(
"trkTubs_tubs"
,
trkTubs_rmin
,
trkTubs_rmax
,
trkTubs_dz
,
149
trkTubs_sphi
,
trkTubs_dphi
);
150
G4LogicalVolume
* tracker_log
151
=
new
G4LogicalVolume
(tracker_tubs,
Ar
,
"trackerT_L"
,0,0,0);
152
// G4VPhysicalVolume * tracker_phys =
153
new
G4PVPlacement
(0,
G4ThreeVector
(),tracker_log,
"tracker_phys"
,
154
experimentalHall_log,
false
,0);
155
G4VisAttributes
* tracker_logVisAtt
156
=
new
G4VisAttributes
(
G4Colour
(1.0,0.0,1.0));
157
tracker_log->
SetVisAttributes
(tracker_logVisAtt);
158
159
//------------------------------ tracker layers
160
// As an example for Parameterised volume
161
// dummy values for G4Tubs -- modified by parameterised volume
162
G4VSolid
* trackerLayer_tubs
163
=
new
G4Tubs
(
"trackerLayer_tubs"
,
trkTubs_rmin
,
trkTubs_rmax
,
trkTubs_dz
,
164
trkTubs_sphi
,
trkTubs_dphi
);
165
G4LogicalVolume
* trackerLayer_log
166
=
new
G4LogicalVolume
(trackerLayer_tubs,
Silicon
,
"trackerB_L"
,0,0,0);
167
G4VPVParameterisation
* trackerParam
168
=
new
ExN04TrackerParametrisation
;
169
// dummy value : kXAxis -- modified by parameterised volume
170
// G4VPhysicalVolume *trackerLayer_phys =
171
new
G4PVParameterised
(
"trackerLayer_phys"
,trackerLayer_log,tracker_log,
172
kXAxis
,
notrkLayers
, trackerParam);
173
G4VisAttributes
* trackerLayer_logVisAtt
174
=
new
G4VisAttributes
(
G4Colour
(0.5,0.0,1.0));
175
trackerLayer_logVisAtt->
SetForceWireframe
(
true
);
176
trackerLayer_log->
SetVisAttributes
(trackerLayer_logVisAtt);
177
178
//------------------------------ calorimeter
179
G4VSolid
* calorimeter_tubs
180
=
new
G4Tubs
(
"calorimeter_tubs"
,
caloTubs_rmin
,
caloTubs_rmax
,
181
caloTubs_dz
,
caloTubs_sphi
,
caloTubs_dphi
);
182
G4LogicalVolume
* calorimeter_log
183
=
new
G4LogicalVolume
(calorimeter_tubs,
Scinti
,
"caloT_L"
,0,0,0);
184
// G4VPhysicalVolume * calorimeter_phys =
185
new
G4PVPlacement
(0,
G4ThreeVector
(),calorimeter_log,
"caloM_P"
,
186
experimentalHall_log,
false
,0);
187
G4VisAttributes
* calorimeter_logVisATT
188
=
new
G4VisAttributes
(
G4Colour
(1.0,1.0,0.0));
189
calorimeter_logVisATT->
SetForceWireframe
(
true
);
190
calorimeter_log->
SetVisAttributes
(calorimeter_logVisATT);
191
192
//------------------------------- Lead layers
193
// As an example for Parameterised volume
194
// dummy values for G4Tubs -- modified by parameterised volume
195
G4VSolid
* caloLayer_tubs
196
=
new
G4Tubs
(
"caloLayer_tubs"
,
caloRing_rmin
,
caloRing_rmax
,
197
caloRing_dz
,
caloRing_sphi
,
caloRing_dphi
);
198
G4LogicalVolume
* caloLayer_log
199
=
new
G4LogicalVolume
(caloLayer_tubs,
Lead
,
"caloR_L"
,0,0,0);
200
G4VPVParameterisation
* calorimeterParam
201
=
new
ExN04CalorimeterParametrisation
;
202
// dummy value : kXAxis -- modified by parameterised volume
203
// G4VPhysicalVolume * caloLayer_phys =
204
new
G4PVParameterised
(
"caloLayer_phys"
,caloLayer_log,calorimeter_log,
205
kXAxis
,
nocaloLayers
, calorimeterParam);
206
G4VisAttributes
* caloLayer_logVisAtt
207
=
new
G4VisAttributes
(
G4Colour
(0.7,1.0,0.0));
208
caloLayer_log->
SetVisAttributes
(caloLayer_logVisAtt);
209
210
//------------------------------ muon counters
211
// As an example of CSG volumes with rotation
212
G4VSolid
* muoncounter_box
213
=
new
G4Box
(
"muoncounter_box"
,
muBox_width
,
muBox_thick
,
214
muBox_length
);
215
G4LogicalVolume
* muoncounter_log
216
=
new
G4LogicalVolume
(muoncounter_box,
Scinti
,
"mucounter_L"
,0,0,0);
217
for
(
int
i=0; i<
nomucounter
; i++)
218
{
219
G4double
phi
,
x
,
y
,
z
;
220
phi = 360.*
deg
/nomucounter*i;
221
x =
muBox_radius
*std::sin(phi);
222
y =
muBox_radius
*std::cos(phi);
223
z = 0.*
cm
;
224
G4RotationMatrix
rm;
225
rm.
rotateZ
(phi);
226
new
G4PVPlacement
(
G4Transform3D
(rm,
G4ThreeVector
(x,y,z)),
227
muoncounter_log,
"muoncounter_P"
,
228
experimentalHall_log,
false
,i);
229
}
230
G4VisAttributes
* muoncounter_logVisAtt
231
=
new
G4VisAttributes
(
G4Colour
(0.0,1.0,1.0));
232
muoncounter_logVisAtt->
SetForceWireframe
(
true
);
233
muoncounter_log->
SetVisAttributes
(muoncounter_logVisAtt);
234
235
//------------------------------------------------------------------
236
// Sensitive Detector
237
//------------------------------------------------------------------
238
239
G4SDManager
* SDman =
G4SDManager::GetSDMpointer
();
240
241
G4String
trackerSDname =
"/mydet/tracker"
;
242
ExN04TrackerSD
* trackerSD =
new
ExN04TrackerSD
(trackerSDname);
243
SDman->
AddNewDetector
(trackerSD);
244
trackerLayer_log->
SetSensitiveDetector
(trackerSD);
245
246
G4String
calorimeterSDname =
"/mydet/calorimeter"
;
247
ExN04CalorimeterSD
* calorimeterSD =
new
ExN04CalorimeterSD
(calorimeterSDname);
248
G4String
ROgeometryName =
"CalorimeterROGeom"
;
249
G4VReadOutGeometry
* calRO =
new
ExN04CalorimeterROGeometry
(ROgeometryName);
250
calRO->
BuildROGeometry
();
251
calRO->
SetName
(ROgeometryName);
252
calorimeterSD->
SetROgeometry
(calRO);
253
SDman->
AddNewDetector
(calorimeterSD);
254
calorimeter_log->
SetSensitiveDetector
(calorimeterSD);
255
256
G4String
muonSDname =
"/mydet/muon"
;
257
ExN04MuonSD
* muonSD =
new
ExN04MuonSD
(muonSDname);
258
SDman->
AddNewDetector
(muonSD);
259
muoncounter_log->
SetSensitiveDetector
(muonSD);
260
261
//------------------------------------------------------------------
262
// Digitizer modules
263
//------------------------------------------------------------------
264
265
return
experimentalHall_phys;
266
}
267
geant4
tree
geant4-10.6-release
examples
extended
parallel
TopC
ParN04
src
ExN04DetectorConstruction.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:04
using
1.8.2 with
ECCE GitHub integration