Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ParameterisationTubs.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//
27// $Id$
28//
29// class G4ParameterisationTubs Implementation file
30//
31// 26.05.03 - P.Arce, Initial version
32// 08.04.04 - I.Hrivnacova, Implemented reflection
33// 21.04.10 - M.Asai, Added gaps
34// --------------------------------------------------------------------
35
37
38#include <iomanip>
39#include "G4ThreeVector.hh"
40#include "G4RotationMatrix.hh"
41#include "G4VPhysicalVolume.hh"
42#include "G4LogicalVolume.hh"
43#include "G4ReflectedSolid.hh"
44#include "G4Tubs.hh"
45
46//--------------------------------------------------------------------------
49 G4double offset, G4VSolid* msolid,
50 DivisionType divType )
51 : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid )
52{
53 G4Tubs* msol = (G4Tubs*)(msolid);
54 if (msolid->GetEntityType() == "G4ReflectedSolid")
55 {
56 //----- get constituent solid
57 G4VSolid* mConstituentSolid
58 = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid();
59 msol = (G4Tubs*)(mConstituentSolid);
60 fmotherSolid = msol;
61 fReflectedSolid = true;
62 }
63}
64
65//------------------------------------------------------------------------
67{
68}
69
70//--------------------------------------------------------------------------
73 G4double width, G4double offset,
74 G4VSolid* msolid, DivisionType divType )
75 : G4VParameterisationTubs( axis, nDiv, width, offset, msolid, divType )
76{
78 SetType( "DivisionTubsRho" );
79
80 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
81 if( divType == DivWIDTH )
82 {
84 width, offset );
85 }
86 else if( divType == DivNDIV )
87 {
89 nDiv, offset );
90 }
91
92#ifdef G4DIVDEBUG
93 if( verbose >= 1 )
94 {
95 G4cout << " G4ParameterisationTubsRho - no divisions " << fnDiv << " = "
96 << nDiv << G4endl
97 << " Offset " << foffset << " = " << offset << G4endl
98 << " Width " << fwidth << " = " << width << G4endl
99 << " DivType " << divType << G4endl;
100 }
101#endif
102}
103
104//--------------------------------------------------------------------------
106{
107}
108
109//------------------------------------------------------------------------
111{
112 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
113 return msol->GetOuterRadius() - msol->GetInnerRadius();
114}
115
116
117//--------------------------------------------------------------------------
118void
120ComputeTransformation(const G4int, G4VPhysicalVolume* physVol) const
121{
122 //----- translation
123 G4ThreeVector origin(0.,0.,0.);
124 //----- set translation
125 physVol->SetTranslation( origin );
126
127 //----- calculate rotation matrix: unit
128
129#ifdef G4DIVDEBUG
130 if( verbose >= 2 )
131 {
132 G4cout << " G4ParameterisationTubsRho " << G4endl
133 << " Offset: " << foffset/deg
134 << " - Width: " << fwidth/deg << G4endl;
135 }
136#endif
137
138 ChangeRotMatrix( physVol );
139
140#ifdef G4DIVDEBUG
141 if( verbose >= 2 )
142 {
143 G4cout << std::setprecision(8) << " G4ParameterisationTubsRho " << G4endl
144 << " Position: " << origin << " - Width: " << fwidth
145 << " - Axis " << faxis << G4endl;
146 }
147#endif
148}
149
150//--------------------------------------------------------------------------
151void
153ComputeDimensions( G4Tubs& tubs, const G4int copyNo,
154 const G4VPhysicalVolume* ) const
155{
156 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
157
158 G4double pRMin = msol->GetInnerRadius() + foffset + fwidth * copyNo + fhgap;
159 G4double pRMax = msol->GetInnerRadius() + foffset + fwidth * (copyNo+1) - fhgap;
160 G4double pDz = msol->GetZHalfLength();
161 //- already rotated G4double pSR = foffset + copyNo*fwidth;
162 G4double pSPhi = msol->GetStartPhiAngle();
163 G4double pDPhi = msol->GetDeltaPhiAngle();;
164
165 tubs.SetInnerRadius( pRMin );
166 tubs.SetOuterRadius( pRMax );
167 tubs.SetZHalfLength( pDz );
168 tubs.SetStartPhiAngle( pSPhi, false );
169 tubs.SetDeltaPhiAngle( pDPhi );
170
171#ifdef G4DIVDEBUG
172 if( verbose >= 2 )
173 {
174 G4cout << " G4ParameterisationTubsRho::ComputeDimensions()" << G4endl
175 << " pRMin: " << pRMin << " - pRMax: " << pRMax << G4endl;
176 tubs.DumpInfo();
177 }
178#endif
179}
180
181//--------------------------------------------------------------------------
184 G4double width, G4double offset,
185 G4VSolid* msolid, DivisionType divType )
186 : G4VParameterisationTubs( axis, nDiv, width, offset, msolid, divType )
187{
189 SetType( "DivisionTubsPhi" );
190
191 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
192 if( divType == DivWIDTH )
193 {
194 fnDiv = CalculateNDiv( msol->GetDeltaPhiAngle(), width, offset );
195 }
196 else if( divType == DivNDIV )
197 {
198 fwidth = CalculateWidth( msol->GetDeltaPhiAngle(), nDiv, offset );
199 }
200
201#ifdef G4DIVDEBUG
202 if( verbose >= 1 )
203 {
204 G4cout << " G4ParameterisationTubsPhi no divisions " << fnDiv << " = "
205 << nDiv << G4endl
206 << " Offset " << foffset << " = " << offset << G4endl
207 << " Width " << fwidth << " = " << width << G4endl;
208 }
209#endif
210}
211
212//--------------------------------------------------------------------------
214{
215}
216
217//------------------------------------------------------------------------
219{
220 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
221 return msol->GetDeltaPhiAngle();
222}
223
224//--------------------------------------------------------------------------
225void
227ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const
228{
229 //----- translation
230 G4ThreeVector origin(0.,0.,0.);
231 //----- set translation
232 physVol->SetTranslation( origin );
233
234 //----- calculate rotation matrix (so that all volumes point to the centre)
235 G4double posi = foffset + copyNo*fwidth;
236
237#ifdef G4DIVDEBUG
238 if( verbose >= 2 )
239 {
240 G4cout << " G4ParameterisationTubsPhi - position: " << posi/deg << G4endl
241 << " copyNo: " << copyNo << " - foffset: " << foffset/deg
242 << " - fwidth: " << fwidth/deg << G4endl;
243 }
244#endif
245
246 ChangeRotMatrix( physVol, -posi );
247
248#ifdef G4DIVDEBUG
249 if( verbose >= 2 )
250 {
251 G4cout << std::setprecision(8) << " G4ParameterisationTubsPhi " << copyNo
252 << G4endl
253 << " Position: " << origin << " - Width: " << fwidth
254 << " - Axis: " << faxis << G4endl;
255 }
256#endif
257}
258
259//--------------------------------------------------------------------------
260void
262ComputeDimensions( G4Tubs& tubs, const G4int,
263 const G4VPhysicalVolume* ) const
264{
265 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
266
267 G4double pRMin = msol->GetInnerRadius();
268 G4double pRMax = msol->GetOuterRadius();
269 G4double pDz = msol->GetZHalfLength();
270 //----- already rotated in 'ComputeTransformation'
271 G4double pSPhi = msol->GetStartPhiAngle() + fhgap;
272 G4double pDPhi = fwidth - 2.*fhgap;
273
274 tubs.SetInnerRadius( pRMin );
275 tubs.SetOuterRadius( pRMax );
276 tubs.SetZHalfLength( pDz );
277 tubs.SetStartPhiAngle( pSPhi, false );
278 tubs.SetDeltaPhiAngle( pDPhi );
279
280#ifdef G4DIVDEBUG
281 if( verbose >= 2 )
282 {
283 G4cout << " G4ParameterisationTubsPhi::ComputeDimensions" << G4endl
284 << " pSPhi: " << pSPhi << " - pDPhi: " << pDPhi << G4endl;
285 tubs.DumpInfo();
286 }
287#endif
288}
289
290//--------------------------------------------------------------------------
293 G4double width, G4double offset,
294 G4VSolid* msolid, DivisionType divType )
295 : G4VParameterisationTubs( axis, nDiv, width, offset, msolid, divType )
296{
298 SetType( "DivisionTubsZ" );
299
300 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
301 if( divType == DivWIDTH )
302 {
303 fnDiv = CalculateNDiv( 2*msol->GetZHalfLength(), width, offset );
304 }
305 else if( divType == DivNDIV )
306 {
307 fwidth = CalculateWidth( 2*msol->GetZHalfLength(), nDiv, offset );
308 }
309
310#ifdef G4DIVDEBUG
311 if( verbose >= 1 )
312 {
313 G4cout << " G4ParameterisationTubsZ: # divisions " << fnDiv << " = "
314 << nDiv << G4endl
315 << " Offset " << foffset << " = " << offset << G4endl
316 << " Width " << fwidth << " = " << width << G4endl;
317 }
318#endif
319}
320
321//--------------------------------------------------------------------------
323{
324}
325
326//------------------------------------------------------------------------
328{
329 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
330 return 2*msol->GetZHalfLength();
331}
332
333//--------------------------------------------------------------------------
334void
336ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const
337{
338 //----- set translation: along Z axis
339 G4Tubs* motherTubs = (G4Tubs*)(fmotherSolid);
340 G4double posi = - motherTubs->GetZHalfLength() + OffsetZ()
341 + fwidth/2 + copyNo*fwidth;
342 G4ThreeVector origin(0.,0.,posi);
343 physVol->SetTranslation( origin );
344
345 //----- calculate rotation matrix: unit
346
347#ifdef G4DIVDEBUG
348 if( verbose >= 2 )
349 {
350 G4cout << " G4ParameterisationTubsZ::ComputeTransformation()" << G4endl
351 << " Position: " << posi << " - copyNo: " << copyNo << G4endl
352 << " foffset " << foffset/deg << " - fwidth " << fwidth/deg
353 << G4endl;
354 }
355#endif
356
357 ChangeRotMatrix( physVol );
358
359#ifdef G4DIVDEBUG
360 if( verbose >= 2 )
361 {
362 G4cout << std::setprecision(8) << " G4ParameterisationTubsZ " << copyNo
363 << G4endl
364 << " Position: " << origin << " - Width: " << fwidth
365 << " - Axis: " << faxis << G4endl;
366 }
367#endif
368}
369
370//--------------------------------------------------------------------------
371void
373ComputeDimensions( G4Tubs& tubs, const G4int,
374 const G4VPhysicalVolume* ) const
375{
376 G4Tubs* msol = (G4Tubs*)(fmotherSolid);
377
378 G4double pRMin = msol->GetInnerRadius();
379 G4double pRMax = msol->GetOuterRadius();
380 // G4double pDz = msol->GetZHalfLength() / GetNoDiv();
381 G4double pDz = fwidth/2. - fhgap;
382 G4double pSPhi = msol->GetStartPhiAngle();
383 G4double pDPhi = msol->GetDeltaPhiAngle();
384
385 tubs.SetInnerRadius( pRMin );
386 tubs.SetOuterRadius( pRMax );
387 tubs.SetZHalfLength( pDz );
388 tubs.SetStartPhiAngle( pSPhi, false );
389 tubs.SetDeltaPhiAngle( pDPhi );
390
391#ifdef G4DIVDEBUG
392 if( verbose >= 2 )
393 {
394 G4cout << " G4ParameterisationTubsZ::ComputeDimensions()" << G4endl
395 << " pDz: " << pDz << G4endl;
396 tubs.DumpInfo();
397 }
398#endif
399}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4ParameterisationTubsPhi(EAxis axis, G4int nCopies, G4double offset, G4double step, G4VSolid *motherSolid, DivisionType divType)
void ComputeDimensions(G4Tubs &tubs, const G4int copyNo, const G4VPhysicalVolume *physVol) const
void ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const
void ComputeDimensions(G4Tubs &tubs, const G4int copyNo, const G4VPhysicalVolume *physVol) const
void ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const
G4ParameterisationTubsRho(EAxis axis, G4int nCopies, G4double offset, G4double step, G4VSolid *motherSolid, DivisionType divType)
void ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const
G4ParameterisationTubsZ(EAxis axis, G4int nCopies, G4double offset, G4double step, G4VSolid *motherSolid, DivisionType divType)
void ComputeDimensions(G4Tubs &tubs, const G4int copyNo, const G4VPhysicalVolume *physVol) const
Definition: G4Tubs.hh:77
G4double GetZHalfLength() const
void SetDeltaPhiAngle(G4double newDPhi)
void SetStartPhiAngle(G4double newSPhi, G4bool trig=true)
G4double GetInnerRadius() const
G4double GetOuterRadius() const
G4double GetStartPhiAngle() const
void SetInnerRadius(G4double newRMin)
void SetOuterRadius(G4double newRMax)
G4double GetDeltaPhiAngle() const
void SetZHalfLength(G4double newDz)
void ChangeRotMatrix(G4VPhysicalVolume *physVol, G4double rotZ=0.) const
void SetType(const G4String &type)
G4double CalculateWidth(G4double motherDim, G4int nDiv, G4double offset) const
G4int CalculateNDiv(G4double motherDim, G4double width, G4double offset) const
G4VParameterisationTubs(EAxis axis, G4int nCopies, G4double offset, G4double step, G4VSolid *msolid, DivisionType divType)
void SetTranslation(const G4ThreeVector &v)
void DumpInfo() const
virtual G4GeometryType GetEntityType() const =0
EAxis
Definition: geomdefs.hh:54