Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4ParameterisationPara.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 G4ParameterisationPara 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
41#include "G4ThreeVector.hh"
42#include "G4Transform3D.hh"
43#include "G4RotationMatrix.hh"
44#include "G4VPhysicalVolume.hh"
45#include "G4ReflectedSolid.hh"
46#include "G4Para.hh"
47
48//--------------------------------------------------------------------------
51 G4double offset, G4VSolid* msolid,
52 DivisionType divType )
53 : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid )
54{
55 G4Para* msol = (G4Para*)(msolid);
56 if (msolid->GetEntityType() == "G4ReflectedSolid")
57 {
58 // Get constituent solid
59 G4VSolid* mConstituentSolid
60 = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid();
61 msol = (G4Para*)(mConstituentSolid);
62 fmotherSolid = msol;
63
64 // Create a new solid with inversed parameters
65 G4Para* newSolid
66 = new G4Para(msol->GetName(),
67 msol->GetXHalfLength(),
68 msol->GetYHalfLength(),
69 msol->GetZHalfLength(),
70 std::atan(msol->GetTanAlpha()),
71 pi - msol->GetSymAxis().theta(),
72 msol->GetSymAxis().phi());
73
74 msol = newSolid;
75 fmotherSolid = newSolid;
76 fReflectedSolid = true;
77 fDeleteSolid = true;
78 }
79}
80
81//------------------------------------------------------------------------
83{
84}
85
86//------------------------------------------------------------------------
89 G4double width, G4double offset,
90 G4VSolid* msolid, DivisionType divType )
91 : G4VParameterisationPara( axis, nDiv, width, offset, msolid, divType )
92{
94 SetType( "DivisionParaX" );
95
96 G4Para* mpara = (G4Para*)(fmotherSolid);
97 if( divType == DivWIDTH )
98 {
99 fnDiv = CalculateNDiv( 2*mpara->GetXHalfLength(), width, offset );
100 }
101 else if( divType == DivNDIV )
102 {
103 fwidth = CalculateWidth( 2*mpara->GetXHalfLength(), nDiv, offset );
104 }
105
106#ifdef G4DIVDEBUG
107 if( verbose >= 1 )
108 {
109 G4cout << " G4ParameterisationParaX - # divisions " << fnDiv
110 << " = " << nDiv << G4endl
111 << " Offset " << foffset << " = " << offset << G4endl
112 << " Width " << fwidth << " = " << width << G4endl;
113 }
114#endif
115}
116
117//------------------------------------------------------------------------
119{
120 G4Para* msol = (G4Para*)(fmotherSolid);
121 return 2*msol->GetXHalfLength();
122}
123
124//------------------------------------------------------------------------
126{
127}
128
129//------------------------------------------------------------------------
130void
132ComputeTransformation( const G4int copyNo, G4VPhysicalVolume *physVol ) const
133{
134 G4Para* msol = (G4Para*)(fmotherSolid );
135 G4double mdx = msol->GetXHalfLength( );
136
137 //----- translation
138 G4ThreeVector origin(0.,0.,0.);
139 G4double posi = -mdx + foffset+(copyNo+0.5)*fwidth;
140 origin.setX( posi );
141
142#ifdef G4DIVDEBUG
143 if( verbose >= 2 )
144 {
145 G4cout << std::setprecision(8) << " G4ParameterisationParaX "
146 << copyNo << G4endl
147 << " Position: " << origin << " - Axis: " << faxis << G4endl;
148 }
149#endif
150
151 //----- set translation
152 physVol->SetTranslation( origin );
153}
154
155//--------------------------------------------------------------------------
156void
158ComputeDimensions(G4Para& para, const G4int,
159 const G4VPhysicalVolume*) const
160{
161 //---- The division along X of a Para will result a Para
162 G4Para* msol = (G4Para*)(fmotherSolid);
163
164 //---- Get
165 G4double pDx = fwidth/2. - fhgap;
166 G4double pDy = msol->GetYHalfLength();
167 G4double pDz = msol->GetZHalfLength();
168 G4double pAlpha = std::atan(msol->GetTanAlpha());
169 G4double pTheta = msol->GetSymAxis().theta();
170 G4double pPhi = msol->GetSymAxis().phi();
171
172 para.SetAllParameters ( pDx, pDy, pDz, pAlpha, pTheta, pPhi );
173
174#ifdef G4DIVDEBUG
175 if( verbose >= 1 )
176 {
177 G4cout << " G4ParameterisationParaX::ComputeDimensions()"
178 << " - Mother PARA " << G4endl;
179 msol->DumpInfo();
180 G4cout << " - Parameterised PARA: " << G4endl;
181 para.DumpInfo();
182 }
183#endif
184}
185
186//------------------------------------------------------------------------
189 G4double width, G4double offset,
190 G4VSolid* msolid, DivisionType divType )
191 : G4VParameterisationPara( axis, nDiv, width, offset, msolid, divType )
192{
194 SetType( "DivisionParaY" );
195
196 G4Para* mpara = (G4Para*)(fmotherSolid);
197 if( divType == DivWIDTH )
198 {
199 fnDiv = CalculateNDiv( 2*mpara->GetYHalfLength(), width, offset );
200 }
201 else if( divType == DivNDIV )
202 {
203 fwidth = CalculateWidth( 2*mpara->GetYHalfLength(), nDiv, offset );
204 }
205
206#ifdef G4DIVDEBUG
207 if( verbose >= 1 )
208 {
209 G4cout << " G4ParameterisationParaY - # divisions " << fnDiv
210 << " = " << nDiv << G4endl
211 << " Offset " << foffset << " = " << offset << G4endl
212 << " Width " << fwidth << " = " << width << G4endl;
213 }
214#endif
215}
216
217//------------------------------------------------------------------------
219{
220}
221
222//------------------------------------------------------------------------
224{
225 G4Para* msol = (G4Para*)(fmotherSolid);
226 return 2*msol->GetYHalfLength();
227}
228
229//------------------------------------------------------------------------
230void
232ComputeTransformation( const G4int copyNo, G4VPhysicalVolume *physVol ) const
233{
234 G4Para* msol = (G4Para*)(fmotherSolid );
235 G4double mdy = msol->GetYHalfLength( );
236
237 //----- translation
238 G4ThreeVector origin(0.,0.,0.);
239 G4double posiY = -mdy + foffset+(copyNo+0.5)*fwidth;
240 origin.setY( posiY );
241 G4double posiX = posiY * msol->GetTanAlpha();
242 origin.setX( posiX );
243
244#ifdef G4DIVDEBUG
245 if( verbose >= 2 )
246 {
247 G4cout << std::setprecision(8) << " G4ParameterisationParaY "
248 << copyNo << G4endl
249 << " Position: " << origin << " - Axis: " << faxis << G4endl;
250 }
251#endif
252
253 //----- set translation
254 physVol->SetTranslation( origin );
255}
256
257//--------------------------------------------------------------------------
258void
260ComputeDimensions(G4Para& para, const G4int,
261 const G4VPhysicalVolume*) const
262{
263 //---- The division along Y of a Para will result a Para
264 G4Para* msol = (G4Para*)(fmotherSolid);
265
266 //---- Get
267 G4double pDx = msol->GetXHalfLength();
268 G4double pDy = fwidth/2. - fhgap;
269 G4double pDz = msol->GetZHalfLength();
270 G4double pAlpha = std::atan(msol->GetTanAlpha());
271 G4double pTheta = msol->GetSymAxis().theta();
272 G4double pPhi = msol->GetSymAxis().phi();
273
274 para.SetAllParameters ( pDx, pDy, pDz, pAlpha, pTheta, pPhi );
275
276#ifdef G4DIVDEBUG
277 if( verbose >= -1 )
278 {
279 G4cout << " G4ParameterisationParaY::ComputeDimensions()"
280 << " - Mother PARA " << G4endl;
281 msol->DumpInfo();
282 G4cout << " - Parameterised PARA: " << G4endl;
283 para.DumpInfo();
284 }
285#endif
286}
287
288//------------------------------------------------------------------------
291 G4double width, G4double offset,
292 G4VSolid* msolid, DivisionType divType )
293 : G4VParameterisationPara( axis, nDiv, width, offset, msolid, divType )
294{
296 SetType( "DivisionParaZ" );
297
298 G4Para* mpara = (G4Para*)(fmotherSolid);
299 if( divType == DivWIDTH )
300 {
301 fnDiv = CalculateNDiv( 2*mpara->GetZHalfLength(), width, offset );
302 }
303 else if( divType == DivNDIV )
304 {
305 fwidth = CalculateWidth( 2*mpara->GetZHalfLength(), nDiv, offset );
306 }
307
308#ifdef G4DIVDEBUG
309 if( verbose >= -1 )
310 {
311 G4cout << " G4ParameterisationParaZ - # divisions " << fnDiv
312 << " = " << nDiv << G4endl
313 << " Offset " << foffset << " = " << offset << G4endl
314 << " Width " << fwidth << " = " << width << G4endl;
315 }
316#endif
317}
318
319//------------------------------------------------------------------------
321{
322}
323
324//------------------------------------------------------------------------
326{
327 G4Para* msol = (G4Para*)(fmotherSolid);
328 return 2*msol->GetZHalfLength();
329}
330
331//------------------------------------------------------------------------
332void
334ComputeTransformation( const G4int copyNo, G4VPhysicalVolume *physVol ) const
335{
336 G4Para* msol = (G4Para*)(fmotherSolid );
337 G4double mdz = msol->GetZHalfLength( );
338
339 //----- translation
340 G4double posi = -mdz + OffsetZ() + (copyNo+0.5)*fwidth;
341 G4ThreeVector symAxis = msol->GetSymAxis();
342 G4ThreeVector origin( symAxis * posi / symAxis.z() );
343
344#ifdef G4DIVDEBUG
345 if( verbose >= 2 )
346 {
347 G4cout << std::setprecision(8) << " G4ParameterisationParaZ "
348 << copyNo << G4endl
349 << " Position: " << origin << " - Axis: " << faxis << G4endl;
350 }
351#endif
352
353 //----- set translation
354 physVol->SetTranslation( origin );
355}
356
357//--------------------------------------------------------------------------
358void
360ComputeDimensions(G4Para& para, const G4int,
361 const G4VPhysicalVolume*) const
362{
363 //---- The division along Z of a Para will result a Para
364 G4Para* msol = (G4Para*)(fmotherSolid);
365
366 //---- Get
367 G4double pDx = msol->GetXHalfLength();
368 G4double pDy = msol->GetYHalfLength();
369 G4double pDz = fwidth/2. - fhgap;
370 G4double pAlpha = std::atan(msol->GetTanAlpha());
371 G4double pTheta = msol->GetSymAxis().theta();
372 G4double pPhi = msol->GetSymAxis().phi();
373
374 para.SetAllParameters ( pDx, pDy, pDz, pAlpha, pTheta, pPhi );
375
376#ifdef G4DIVDEBUG
377 if( verbose >= -1 )
378 {
379 G4cout << " G4ParameterisationParaZ::ComputeDimensions()"
380 << " - Mother PARA " << G4endl;
381 msol->DumpInfo();
382 G4cout << " - Parameterised PARA: " << G4endl;
383 para.DumpInfo();
384 }
385#endif
386}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
double phi() const
double theta() const
void setY(double)
void setX(double)
Definition: G4Para.hh:77
G4double GetTanAlpha() const
G4ThreeVector GetSymAxis() const
void SetAllParameters(G4double pDx, G4double pDy, G4double pDz, G4double pAlpha, G4double pTheta, G4double pPhi)
Definition: G4Para.cc:73
G4double GetYHalfLength() const
G4double GetZHalfLength() const
G4double GetXHalfLength() const
void ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const
void ComputeDimensions(G4Para &para, const G4int copyNo, const G4VPhysicalVolume *pv) const
G4ParameterisationParaX(EAxis axis, G4int nCopies, G4double offset, G4double step, G4VSolid *msolid, DivisionType divType)
void ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const
void ComputeDimensions(G4Para &para, const G4int copyNo, const G4VPhysicalVolume *pv) const
G4ParameterisationParaY(EAxis axis, G4int nCopies, G4double offset, G4double step, G4VSolid *msolid, DivisionType divType)
void ComputeDimensions(G4Para &para, const G4int copyNo, const G4VPhysicalVolume *pv) const
void ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const
G4ParameterisationParaZ(EAxis axis, G4int nCopies, G4double offset, G4double step, G4VSolid *msolid, DivisionType divType)
void SetType(const G4String &type)
G4double CalculateWidth(G4double motherDim, G4int nDiv, G4double offset) const
G4int CalculateNDiv(G4double motherDim, G4double width, G4double offset) const
G4VParameterisationPara(EAxis axis, G4int nCopies, G4double offset, G4double step, G4VSolid *msolid, DivisionType divType)
void SetTranslation(const G4ThreeVector &v)
G4String GetName() const
void DumpInfo() const
virtual G4GeometryType GetEntityType() const =0
EAxis
Definition: geomdefs.hh:54