source: trunk/source/geometry/divisions/src/G4VDivisionParameterisation.cc@ 1215

Last change on this file since 1215 was 1010, checked in by garnier, 17 years ago

update

File size: 6.9 KB
Line 
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//
27// $Id: G4VDivisionParameterisation.cc,v 1.14 2008/12/03 16:41:15 arce Exp $
28// GEANT4 tag $Name: geant4-09-02-ref-02 $
29//
30// class G4VDivisionParameterisation Implementation file
31//
32// 26.05.03 - P.Arce, Initial version
33// 08.04.04 - I.Hrivnacova, Implemented reflection
34// --------------------------------------------------------------------
35
36#include "G4VDivisionParameterisation.hh"
37#include "G4VSolid.hh"
38#include "G4VPhysicalVolume.hh"
39#include "G4RotationMatrix.hh"
40#include "G4ReflectedSolid.hh"
41#include "G4GeometryTolerance.hh"
42
43G4int G4VDivisionParameterisation::verbose = 5;
44
45//--------------------------------------------------------------------------
46G4VDivisionParameterisation::
47G4VDivisionParameterisation( EAxis axis, G4int nDiv,
48 G4double step, G4double offset,
49 DivisionType divType, G4VSolid* motherSolid )
50 : faxis(axis), fnDiv( nDiv), fwidth(step), foffset(offset),
51 fDivisionType(divType), fmotherSolid( motherSolid ), fReflectedSolid(false),
52 fDeleteSolid(false)
53{
54#ifdef G4DIVDEBUG
55 if (verbose >= 1)
56 {
57 G4cout << " G4VDivisionParameterisation no divisions " << fnDiv
58 << " = " << nDiv << G4endl
59 << " offset " << foffset << " = " << offset << G4endl
60 << " step " << fwidth << " = " << step << G4endl;
61 }
62#endif
63
64 theVoluFirstCopyNo = 1;
65 kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
66}
67
68//--------------------------------------------------------------------------
69G4VDivisionParameterisation::~G4VDivisionParameterisation()
70{
71 if (fDeleteSolid) delete fmotherSolid;
72}
73
74//--------------------------------------------------------------------------
75G4VSolid*
76G4VDivisionParameterisation::
77ComputeSolid( const G4int i, G4VPhysicalVolume* pv )
78{
79 G4VSolid* solid = G4VPVParameterisation::ComputeSolid(i, pv);
80 if (solid->GetEntityType() == "G4ReflectedSolid")
81 {
82 solid = ((G4ReflectedSolid*)solid)->GetConstituentMovedSolid();
83 }
84 return solid;
85}
86
87//--------------------------------------------------------------------------
88void
89G4VDivisionParameterisation::
90ChangeRotMatrix( G4VPhysicalVolume *physVol, G4double rotZ ) const
91{
92 G4RotationMatrix* rm = new G4RotationMatrix();
93 rm->rotateZ( rotZ );
94 //----- set rotation
95 //----- delete first old rotation matrix
96 G4RotationMatrix* rmold = physVol->GetRotation();
97 delete rmold;
98 physVol->SetRotation(rm);
99}
100
101//--------------------------------------------------------------------------
102G4int
103G4VDivisionParameterisation::
104CalculateNDiv( G4double motherDim, G4double width, G4double offset ) const
105{
106#ifdef G4DIVDEBUG
107 G4cout << " G4VDivisionParameterisation::CalculateNDiv: "
108 << ( motherDim - offset ) / width
109 << " Motherdim: " << motherDim << ", Offset: " << offset
110 << ", Width: " << width << G4endl;
111#endif
112
113 return G4int( ( motherDim - offset ) / width );
114}
115
116//--------------------------------------------------------------------------
117G4double
118G4VDivisionParameterisation::
119CalculateWidth( G4double motherDim, G4int nDiv, G4double offset ) const
120{
121#ifdef G4DIVDEBUG
122 G4cout << " G4VDivisionParameterisation::CalculateWidth: "
123 << ( motherDim - offset ) / nDiv
124 << ", Motherdim: " << motherDim << ", Offset: " << offset
125 << ", Number of divisions: " << nDiv << G4endl;
126#endif
127
128 return ( motherDim - offset ) / nDiv;
129}
130
131//--------------------------------------------------------------------------
132void G4VDivisionParameterisation::CheckParametersValidity()
133{
134 G4double maxPar = GetMaxParameter();
135 CheckOffset( maxPar );
136 CheckNDivAndWidth( maxPar );
137}
138
139//--------------------------------------------------------------------------
140void G4VDivisionParameterisation::CheckOffset( G4double maxPar )
141{
142 if( foffset >= maxPar )
143 {
144 G4cerr << "ERROR - G4VDivisionParameterisation::CheckOffset()" << G4endl
145 << " Division of solid " << fmotherSolid->GetName()
146 << " has too big offset = " << G4endl
147 << " " << foffset << " > " << maxPar << " !" << G4endl;
148 G4Exception("G4VDivisionParameterisation::CheckOffset()",
149 "IllegalConstruct", FatalException,
150 "Not supported configuration.");
151 }
152}
153
154//--------------------------------------------------------------------------
155void G4VDivisionParameterisation::CheckNDivAndWidth( G4double maxPar )
156{
157 if( (fDivisionType == DivNDIVandWIDTH)
158 && (foffset + fwidth*fnDiv - maxPar > kCarTolerance ) )
159 {
160 G4cerr << "ERROR - G4VDivisionParameterisation::CheckNDivAndWidth()"
161 << G4endl
162 << " Division of solid " << fmotherSolid->GetName()
163 << " has too big offset + width*nDiv = " << G4endl
164 << " " << foffset + fwidth*fnDiv << " > "
165 << foffset << ". Width = "
166 << G4endl
167 << " " << fwidth << ". nDiv = " << fnDiv << " !"
168 << G4endl;
169 G4Exception("G4VDivisionParameterisation::CheckNDivAndWidth()",
170 "IllegalConstruct", FatalException,
171 "Not supported configuration.");
172 }
173}
174
175//--------------------------------------------------------------------------
176G4double G4VDivisionParameterisation::OffsetZ() const
177{
178 // take into account reflection in the offset
179 G4double offset = foffset;
180 if (fReflectedSolid) offset = GetMaxParameter() - fwidth*fnDiv - foffset;
181
182 return offset;
183}
184
185
Note: See TracBrowser for help on using the repository browser.