Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4VDivisionParameterisation.cc
Go to the documentation of this file.
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
34#include "G4VSolid.hh"
35#include "G4VPhysicalVolume.hh"
36#include "G4RotationMatrix.hh"
37#include "G4ReflectedSolid.hh"
39#include "G4AutoDelete.hh"
40
43
44//--------------------------------------------------------------------------
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
62}
63
64//--------------------------------------------------------------------------
66{
67 if (fDeleteSolid) { delete fmotherSolid; }
68}
69
70//--------------------------------------------------------------------------
74{
76 if (solid->GetEntityType() == "G4ReflectedSolid")
77 {
78 solid = ((G4ReflectedSolid*)solid)->GetConstituentMovedSolid();
79 }
80 return solid;
81}
82
83//--------------------------------------------------------------------------
84void
86ChangeRotMatrix( G4VPhysicalVolume* physVol, G4double rotZ ) const
87{
88 if (fRot == nullptr)
89 {
90 fRot = new G4RotationMatrix();
92 }
93 fRot->rotateZ( rotZ );
94 physVol->SetRotation(fRot);
95}
96
97//--------------------------------------------------------------------------
100CalculateNDiv( 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//--------------------------------------------------------------------------
115CalculateWidth( 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//--------------------------------------------------------------------------
129{
130 G4double maxPar = GetMaxParameter();
131 CheckOffset( maxPar );
132 CheckNDivAndWidth( maxPar );
133}
134
135//--------------------------------------------------------------------------
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//--------------------------------------------------------------------------
152{
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//--------------------------------------------------------------------------
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
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
CLHEP::HepRotation G4RotationMatrix
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
HepRotation & rotateZ(double delta)
Definition: Rotation.cc:87
G4double GetSurfaceTolerance() const
static G4GeometryTolerance * GetInstance()
virtual G4double GetMaxParameter() const =0
G4double CalculateWidth(G4double motherDim, G4int nDiv, G4double offset) const
G4int CalculateNDiv(G4double motherDim, G4double width, G4double offset) const
virtual G4VSolid * ComputeSolid(const G4int, G4VPhysicalVolume *)
static G4ThreadLocal G4RotationMatrix * fRot
G4VDivisionParameterisation(EAxis axis, G4int nDiv, G4double width, G4double offset, DivisionType divType, G4VSolid *motherSolid=nullptr)
void ChangeRotMatrix(G4VPhysicalVolume *physVol, G4double rotZ=0.0) const
virtual G4VSolid * ComputeSolid(const G4int, G4VPhysicalVolume *)
void SetRotation(G4RotationMatrix *)
G4String GetName() const
virtual G4GeometryType GetEntityType() const =0
EAxis
Definition: geomdefs.hh:54
void Register(T *inst)
Definition: G4AutoDelete.hh:65
#define G4ThreadLocal
Definition: tls.hh:77