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
G4VDivisionParameterisation.cc
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file G4VDivisionParameterisation.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
// G4VDivisionParameterisation implementation
27
//
28
// 26.05.03 - P.Arce, Initial version
29
// 08.04.04 - I.Hrivnacova, Implemented reflection
30
// 21.04.10 - M.Asai, Added gaps
31
// --------------------------------------------------------------------
32
33
#include "
G4VDivisionParameterisation.hh
"
34
#include "
G4VSolid.hh
"
35
#include "
G4VPhysicalVolume.hh
"
36
#include "
G4RotationMatrix.hh
"
37
#include "
G4ReflectedSolid.hh
"
38
#include "
G4GeometryTolerance.hh
"
39
#include "
G4AutoDelete.hh
"
40
41
const
G4int
G4VDivisionParameterisation::verbose
= 5;
42
G4ThreadLocal
G4RotationMatrix
*
G4VDivisionParameterisation::fRot
=
nullptr
;
43
44
//--------------------------------------------------------------------------
45
G4VDivisionParameterisation::
46
G4VDivisionParameterisation
(
EAxis
axis,
G4int
nDiv,
47
G4double
step
,
G4double
offset
,
48
DivisionType
divType,
G4VSolid
* motherSolid )
49
: faxis(axis), fnDiv( nDiv), fwidth(step), foffset(offset),
50
fDivisionType(divType), fmotherSolid( motherSolid )
51
{
52
#ifdef G4DIVDEBUG
53
if
(
verbose
>= 1)
54
{
55
G4cout
<<
" G4VDivisionParameterisation no divisions "
<<
fnDiv
56
<<
" = "
<< nDiv <<
G4endl
57
<<
" offset "
<<
foffset
<<
" = "
<< offset <<
G4endl
58
<<
" step "
<<
fwidth
<<
" = "
<< step <<
G4endl
;
59
}
60
#endif
61
kCarTolerance
=
G4GeometryTolerance::GetInstance
()->
GetSurfaceTolerance
();
62
}
63
64
//--------------------------------------------------------------------------
65
G4VDivisionParameterisation::~G4VDivisionParameterisation
()
66
{
67
if
(
fDeleteSolid
) {
delete
fmotherSolid
; }
68
}
69
70
//--------------------------------------------------------------------------
71
G4VSolid
*
72
G4VDivisionParameterisation::
73
ComputeSolid
(
const
G4int
i,
G4VPhysicalVolume
* pv )
74
{
75
G4VSolid
* solid =
G4VPVParameterisation::ComputeSolid
(i, pv);
76
if
(solid->
GetEntityType
() ==
"G4ReflectedSolid"
)
77
{
78
solid = ((
G4ReflectedSolid
*)solid)->GetConstituentMovedSolid();
79
}
80
return
solid;
81
}
82
83
//--------------------------------------------------------------------------
84
void
85
G4VDivisionParameterisation::
86
ChangeRotMatrix
(
G4VPhysicalVolume
* physVol,
G4double
rotZ )
const
87
{
88
if
(
fRot
==
nullptr
)
89
{
90
fRot
=
new
G4RotationMatrix
();
91
G4AutoDelete::Register
(
fRot
);
92
}
93
fRot
->
rotateZ
( rotZ );
94
physVol->
SetRotation
(
fRot
);
95
}
96
97
//--------------------------------------------------------------------------
98
G4int
99
G4VDivisionParameterisation::
100
CalculateNDiv
(
G4double
motherDim,
G4double
width,
G4double
offset
)
const
101
{
102
#ifdef G4DIVDEBUG
103
G4cout
<<
" G4VDivisionParameterisation::CalculateNDiv: "
104
<< ( motherDim -
offset
) / width
105
<<
" Motherdim: "
<< motherDim <<
", Offset: "
<< offset
106
<<
", Width: "
<< width <<
G4endl
;
107
#endif
108
109
return
G4int
( ( motherDim - offset ) / width );
110
}
111
112
//--------------------------------------------------------------------------
113
G4double
114
G4VDivisionParameterisation::
115
CalculateWidth
(
G4double
motherDim,
G4int
nDiv,
G4double
offset
)
const
116
{
117
#ifdef G4DIVDEBUG
118
G4cout
<<
" G4VDivisionParameterisation::CalculateWidth: "
119
<< ( motherDim -
offset
) / nDiv
120
<<
", Motherdim: "
<< motherDim <<
", Offset: "
<< offset
121
<<
", Number of divisions: "
<< nDiv <<
G4endl
;
122
#endif
123
124
return
( motherDim - offset ) / nDiv;
125
}
126
127
//--------------------------------------------------------------------------
128
void
G4VDivisionParameterisation::CheckParametersValidity
()
129
{
130
G4double
maxPar =
GetMaxParameter
();
131
CheckOffset
( maxPar );
132
CheckNDivAndWidth
( maxPar );
133
}
134
135
//--------------------------------------------------------------------------
136
void
G4VDivisionParameterisation::CheckOffset
(
G4double
maxPar )
137
{
138
if
(
foffset
>= maxPar )
139
{
140
std::ostringstream
message
;
141
message <<
"Configuration not supported."
<<
G4endl
142
<<
"Division of solid "
<<
fmotherSolid
->
GetName
()
143
<<
" has too big offset = "
<<
G4endl
144
<<
" "
<<
foffset
<<
" > "
<< maxPar <<
" !"
;
145
G4Exception
(
"G4VDivisionParameterisation::CheckOffset()"
,
146
"GeomDiv0001"
,
FatalException
, message);
147
}
148
}
149
150
//--------------------------------------------------------------------------
151
void
G4VDivisionParameterisation::CheckNDivAndWidth
(
G4double
maxPar )
152
{
153
if
( (
fDivisionType
==
DivNDIVandWIDTH
)
154
&& (
foffset
+
fwidth
*
fnDiv
- maxPar >
kCarTolerance
) )
155
{
156
std::ostringstream
message
;
157
message <<
"Configuration not supported."
<<
G4endl
158
<<
"Division of solid "
<<
fmotherSolid
->
GetName
()
159
<<
" has too big offset + width*nDiv = "
<<
G4endl
160
<<
" "
<<
foffset
+
fwidth
*
fnDiv
<<
" > "
161
<<
foffset
<<
". Width = "
162
<<
G4endl
163
<<
" "
<<
fwidth
<<
". nDiv = "
<<
fnDiv
<<
" !"
;
164
G4Exception
(
"G4VDivisionParameterisation::CheckNDivAndWidth()"
,
165
"GeomDiv0001"
,
FatalException
, message);
166
}
167
}
168
169
//--------------------------------------------------------------------------
170
G4double
G4VDivisionParameterisation::OffsetZ
()
const
171
{
172
// take into account reflection in the offset
173
174
G4double
offset
=
foffset
;
175
if
(
fReflectedSolid
)
176
{
177
offset =
GetMaxParameter
() -
fwidth
*
fnDiv
-
foffset
;
178
}
179
180
return
offset
;
181
}
182
183
geant4
tree
geant4-10.6-release
source
geometry
divisions
src
G4VDivisionParameterisation.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:16
using
1.8.2 with
ECCE GitHub integration