source: trunk/Documentation/geant4/UserDocumentation/UsersGuides/ForApplicationDeveloper/html/ch04.html @ 902

Last change on this file since 902 was 901, checked in by garnier, 16 years ago

Add Geant4 Documentation at 8.12.2008

File size: 200.7 KB
Line 
1<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 4.  Detector Definition and Response</title><link rel="stylesheet" href="../xml/XSLCustomizationLayer/G4HTMLStylesheet.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.71.1"><link rel="start" href="index.html" title="Geant4 User's Guide for Application Developers"><link rel="up" href="index.html" title="Geant4 User's Guide for Application Developers"><link rel="prev" href="ch03s07.html" title="3.7.  Event Biasing Techniques"><link rel="next" href="ch04s02.html" title="4.2.  Material"><script language="JavaScript">
2function remote_win(fName)
3{
4   var url = "AllResources/Detector/geometry.src/" + fName;
5   RemoteWin=window.open(url,"","resizable=no,toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,copyhistory=0,width=520,height=520")
6   RemoteWin.creator=self
7}
8</script></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 4. 
9Detector Definition and Response
10</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s07.html"><img src="AllResources/IconsGIF/prev.gif" alt="Prev"></a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html"><img src="AllResources/IconsGIF/next.gif" alt="Next"></a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="chap.DetectorDefRespond"></a>Chapter 4. 
11Detector Definition and Response
12</h2></div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="sect.Geom"></a>4.1. 
13Geometry
14</h2></div></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Intro"></a>4.1.1. 
15Introduction
16</h3></div></div></div><p>
17The detector definition requires the representation of its
18geometrical elements, their materials and electronics properties,
19together with visualization attributes and user defined properties.
20The geometrical representation of detector elements focuses on the
21definition of solid models and their spatial position, as well as
22their logical relations to one another, such as in the case of
23containment.
24</p><p>
25Geant4 uses the concept of "Logical Volume" to manage the
26representation of detector element properties. The concept of
27"Physical Volume" is used to manage the representation of the
28spatial positioning of detector elements and their logical
29relations. The concept of "Solid" is used to manage the
30representation of the detector element solid modeling.
31Volumes and solids must be dynamically allocated in the user
32program; objects allocated are automatically registered in
33dedicated stores which also take care to free the memory at
34the end of a job.
35</p><p>
36The Geant4 solid modeler is STEP compliant. STEP is the ISO
37standard defining the protocol for exchanging geometrical data
38between CAD systems. This is achieved by standardizing the
39representation of solid models via the EXPRESS object definition
40language, which is part of the STEP ISO standard.
41</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Solids"></a>4.1.2. 
42Solids
43</h3></div></div></div><p>
44The STEP standard supports multiple solid representations.
45Constructive Solid Geometry (CSG) representations and Boundary
46Represented Solids (BREPs) are available. Different representations
47are suitable for different purposes, applications, required
48complexity, and levels of detail. CSG representations are easy to
49use and normally give superior performance, but they cannot
50reproduce complex solids such as those used in CAD systems. BREP
51representations can handle more extended topologies and reproduce
52the most complex solids.
53</p><p>
54All constructed solids can stream out their contents via
55appropriate methods and streaming operators.
56</p><p>
57For all solids it is possible to estimate the geometrical volume and the
58surface area by invoking the methods:
59
60</p><div class="informalexample"><pre class="programlisting">
61   G4double GetCubicVolume()
62   G4double GetSurfaceArea()
63</pre></div><p>
64
65which return an estimate of the solid volume and total area in internal
66units respectively. For elementary solids the functions compute the exact
67geometrical quantities, while for composite or complex solids an estimate
68is made using Monte Carlo techniques.
69</p><p>
70For all solids it is also possible to generate pseudo-random
71points lying on their surfaces, by invoking the method
72
73</p><div class="informalexample"><pre class="programlisting">
74   G4ThreeVector GetPointOnSurface() const
75</pre></div><p>
76
77which returns the generated point in local coordinates relative to
78the solid.
79</p><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Solids.CSG"></a>4.1.2.1. 
80Constructed Solid Geometry (CSG) Solids
81</h4></div></div></div><p>
82CSG solids are defined directly as three-dimensional primitives.
83They are described by a minimal set of parameters necessary to
84define the shape and size of the solid. CSG solids are Boxes, Tubes
85and their sections, Cones and their sections, Spheres, Wedges, and
86Toruses.
87</p><h5><a name="id383938"></a>
88Box:
89</h5><p> 
90To create a <span class="bold"><strong>box</strong></span> one can use the constructor:
91
92</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
93    <div class="informalexample"><pre class="programlisting">
94   G4Box(const G4String&amp; pName,                         
95               G4double  pX,
96               G4double  pY,
97               G4double  pZ)
98    </pre></div>
99  </td><td align="center" valign="top">
100    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aBox.jpg"></div>
101
102    <a href="javascript:remote_win('pic1.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
103  </a>
104 
105    <span class="underline">In the picture</span>:
106    <code class="literal">
107    <p>
108    pX = 30, pY = 40, pZ = 60                                                       
109    </p>
110    </code>
111  </td></tr></tbody></table></div><p>
112</p><p>
113by giving the box a name and its half-lengths along the X, Y and
114Z axis:
115</p><div class="informaltable"><table border="1"><colgroup><col><col><col><col><col><col></colgroup><tbody><tr><td>
116    <code class="literal">pX</code>
117  </td><td>
118    half length in X
119  </td><td>
120    <code class="literal">pY</code>
121  </td><td>
122    half length in Y
123  </td><td>
124    <code class="literal">pZ</code>
125  </td><td>
126    half length in Z
127  </td></tr></tbody></table></div><p>
128</p><p>
129This will create a box that extends from <code class="literal">-pX</code> to
130<code class="literal">+pX</code> in X, from <code class="literal">-pY</code> to
131<code class="literal">+pY</code> in Y, and from
132<code class="literal">-pZ</code> to <code class="literal">+pZ</code> in Z.
133</p><p>
134For example to create a box that is 2 by 6 by 10 centimeters in
135full length, and called <code class="literal">BoxA</code> one should use the following
136code:
137</p><div class="informalexample"><pre class="programlisting"> 
138   G4Box* aBox = new G4Box("BoxA", 1.0*cm, 3.0*cm, 5.0*cm);
139</pre></div><p>
140</p><h5><a name="id384169"></a>
141Cylindrical Section or Tube:
142</h5><p> 
143Similarly to create a <span class="bold"><strong>cylindrical section</strong></span> 
144or <span class="bold"><strong>tube</strong></span>, one would use the constructor:
145
146</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
147    <div class="informalexample"><pre class="programlisting"> 
148   G4Tubs(const G4String&amp; pName,                       
149                G4double  pRMin,
150                G4double  pRMax,
151                G4double  pDz,
152                G4double  pSPhi,
153                G4double  pDPhi)
154    </pre></div>
155  </td><td align="center" valign="top">
156    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTubs.jpg"></div>
157
158    <a href="javascript:remote_win('pic2.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
159  </a>
160 
161    <span class="underline">In the picture</span>:
162    <code class="literal">
163    <p>
164    pRMin = 10, pRMax = 15, pDz = 20
165    </p>
166    </code>
167  </td></tr></tbody></table></div><p>
168</p><p>
169giving its name <code class="literal">pName</code> and its parameters which are:
170</p><div class="informaltable"><table border="1"><colgroup><col><col><col><col></colgroup><tbody><tr><td>
171    <code class="literal">pRMin</code>
172  </td><td>
173    Inner radius
174  </td><td>
175    <code class="literal">pRMax</code>
176  </td><td>
177    Outer radius
178  </td></tr><tr><td>
179    <code class="literal">pDz</code>
180  </td><td>
181    half length in z
182  </td><td>
183    <code class="literal">pSPhi</code>
184  </td><td>
185    the starting phi angle in radians
186  </td></tr><tr><td>
187    <code class="literal">pDPhi</code>
188  </td><td>
189    the angle of the segment in radians
190  </td><td class="auto-generated"> </td><td class="auto-generated"> </td></tr></tbody></table></div><p>
191</p><h5><a name="id384385"></a>
192Cone or Conical section:
193</h5><p> 
194Similarly to create a <span class="bold"><strong>cone</strong></span>, or
195<span class="bold"><strong>conical section</strong></span>, one would use the constructor
196
197</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
198    <div class="informalexample"><pre class="programlisting"> 
199   G4Cons(const G4String&amp; pName,                       
200                G4double  pRmin1,
201                G4double  pRmax1,
202                G4double  pRmin2,
203                G4double  pRmax2,
204                G4double  pDz,
205                G4double  pSPhi,
206                G4double  pDPhi)
207    </pre></div>
208  </td><td align="center" valign="top">
209    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aCons.jpg"></div>
210
211    <a href="javascript:remote_win('pic3.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
212  </a>
213 
214    <span class="underline">In the picture</span>:
215    <code class="literal">
216    <p>
217    pRmin1 = 5, pRmax1 = 10,
218    pRmin2 = 20, pRmax2 = 25,
219    pDz = 40, pSPhi = 0, pDPhi = 4/3*Pi
220    </p>
221    </code>
222  </td></tr></tbody></table></div><p>
223</p><p>
224giving its name <code class="literal">pName</code>, and its parameters which are:
225</p><div class="informaltable"><table border="1"><colgroup><col><col><col><col></colgroup><tbody><tr><td>
226    <code class="literal">pRmin1</code>
227  </td><td>
228    inside radius at <code class="literal">-pDz</code>
229  </td><td>
230    <code class="literal">pRmax1</code>
231  </td><td>
232    outside radius at <code class="literal">-pDz</code>
233  </td></tr><tr><td>
234    <code class="literal">pRmin2</code>
235  </td><td>
236    inside radius at <code class="literal">+pDz</code>
237  </td><td>
238    <code class="literal">pRmax2</code>
239  </td><td>
240    outside radius at <code class="literal">+pDz</code>
241  </td></tr><tr><td>
242    <code class="literal">pDz</code>
243  </td><td>
244    half length in z
245  </td><td>
246    <code class="literal">pSPhi</code>
247  </td><td>
248    starting angle of the segment in radians
249  </td></tr><tr><td>
250    <code class="literal">pDPhi</code>
251  </td><td>
252    the angle of the segment in radians
253  </td><td class="auto-generated"> </td><td class="auto-generated"> </td></tr></tbody></table></div><p>
254</p><h5><a name="id384653"></a>
255Parallelepiped:
256</h5><p> 
257A <span class="bold"><strong>parallelepiped</strong></span> is constructed
258using:
259
260</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
261    <div class="informalexample"><pre class="programlisting"> 
262   G4Para(const G4String&amp; pName,                                 
263                G4double   dx,
264                G4double   dy,
265                G4double   dz,
266                G4double   alpha,
267                G4double   theta,
268                G4double   phi)
269    </pre></div>
270  </td><td align="center" valign="top">
271    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aPara.jpg"></div>
272
273    <a href="javascript:remote_win('pic4.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
274  </a>
275 
276    <span class="underline">In the picture</span>:
277    <code class="literal">
278    <p>
279    dx = 30, dy = 40, dz = 60
280    </p>
281    </code>
282  </td></tr></tbody></table></div><p>
283</p><p>
284giving its name <code class="literal">pName</code> and its parameters which are:
285</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
286    <code class="literal">dx,dy,dz</code>   
287  </td><td>
288    Half-length in x,y,z
289  </td></tr><tr><td>
290    <code class="literal">alpha</code>
291  </td><td>
292    Angle formed by the y axis and by the plane joining the centre
293    of the faces <span class="emphasis"><em>parallel</em></span> to the z-x plane at -dy and +dy
294  </td></tr><tr><td>
295    <code class="literal">theta</code>
296  </td><td>
297    Polar angle of the line joining the centres of the faces at -dz
298    and +dz in z
299  </td></tr><tr><td>
300    <code class="literal">phi</code>
301  </td><td>
302    Azimuthal angle of the line joining the centres of the faces at
303    -dz and +dz in z
304  </td></tr></tbody></table></div><p>
305</p><h5><a name="id384860"></a>
306Trapezoid:
307</h5><p> 
308To construct a <span class="bold"><strong>trapezoid</strong></span> use:
309
310</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
311    <div class="informalexample"><pre class="programlisting"> 
312   G4Trd(const G4String&amp; pName,                           
313               G4double  dx1,
314               G4double  dx2,
315               G4double  dy1,
316               G4double  dy2,
317               G4double  dz)
318    </pre></div>
319  </td><td align="center" valign="top">
320    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTrd.jpg"></div>
321
322    <a href="javascript:remote_win('pic5.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
323  </a>
324 
325    <span class="underline">In the picture</span>:
326    <code class="literal">
327    <p>
328    dx1 = 30, dx2 = 10,
329    dy1 = 40, dy2 = 15,
330    dz = 60
331    </p>
332    </code>
333  </td></tr></tbody></table></div><p>
334</p><p>
335to obtain a solid with name <code class="literal">pName</code> and parameters
336
337</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
338    <code class="literal">dx1</code>
339  </td><td>
340    Half-length along x at the surface positioned at <code class="literal">-dz</code>
341  </td></tr><tr><td>
342    <code class="literal">dx2</code>
343  </td><td>
344    &gt;Half-length along x at the surface positioned at <code class="literal">+dz</code>
345  </td></tr><tr><td>
346    <code class="literal">dy1</code>
347  </td><td>
348    Half-length along y at the surface positioned at <code class="literal">-dz</code>
349  </td></tr><tr><td>
350    <code class="literal">dy2</code>
351  </td><td>
352    &gt;Half-length along y at the surface positioned at <code class="literal">+dz</code>
353  </td></tr><tr><td>
354    <code class="literal">dz</code>
355  </td><td>
356    Half-length along z axis
357  </td></tr></tbody></table></div><p>
358</p><h5><a name="id385097"></a>
359Generic Trapezoid:
360</h5><p> 
361To build a <span class="bold"><strong>generic trapezoid</strong></span>,
362the <code class="literal">G4Trap</code> class is provided. Here are the two costructors
363for a Right Angular Wedge and for the general trapezoid for it:
364
365</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
366    <div class="informalexample"><pre class="programlisting"> 
367 G4Trap(const G4String&amp; pName,                       
368              G4double   pZ,
369              G4double   pY,
370              G4double   pX,
371              G4double   pLTX)
372
373 G4Trap(const G4String&amp; pName,                         
374              G4double   pDz,   G4double   pTheta,
375              G4double   pPhi,  G4double   pDy1,
376              G4double   pDx1,  G4double   pDx2,
377              G4double   pAlp1, G4double   pDy2,
378              G4double   pDx3,  G4double   pDx4,
379              G4double   pAlp2)
380    </pre></div>
381  </td><td align="center" valign="top">
382    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTrap.jpg"></div>
383
384    <a href="javascript:remote_win('pic6.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
385  </a>
386 
387    <span class="underline">In the picture</span>:
388    <code class="literal">
389    <p>
390    pDx1 = 30, pDx2 = 40, pDy1 = 40,
391    pDx3 = 10, pDx4 = 14, pDy2 = 16,
392    pDz = 60, pTheta = 20*Degree,
393    pPhi = 5*Degree, pAlp1 = pAlp2 = 10*Degree
394    </p>
395    </code>
396  </td></tr></tbody></table></div><p>
397</p><p>
398to obtain a Right Angular Wedge with name <code class="literal">pName</code> and
399parameters:
400</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
401    <code class="literal">pZ</code>
402  </td><td>
403    Length along z
404  </td></tr><tr><td>
405    <code class="literal">pY</code>
406  </td><td>
407    Length along y
408  </td></tr><tr><td>
409    <code class="literal">pX</code>
410  </td><td>
411    Length along x at the wider side
412  </td></tr><tr><td>
413    <code class="literal">pLTX</code>
414  </td><td>
415    Length along x at the narrower side (<code class="literal">plTX&lt;=pX</code>)
416  </td></tr></tbody></table></div><p>
417</p><p>
418or to obtain the general trapezoid (see the Software Reference
419Manual):
420</p><p>
421</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
422   <code class="literal">pDx1</code> 
423  </td><td>
424    Half x length of the side at y=-pDy1 of the face at -pDz
425  </td></tr><tr><td>
426    <code class="literal">pDx2</code>
427  </td><td>
428    Half x length of the side at y=+pDy1 of the face at -pDz
429  </td></tr><tr><td>
430    <code class="literal">pDz</code>
431  </td><td>
432    Half z length
433  </td></tr><tr><td>
434    <code class="literal">pTheta</code>
435  </td><td>
436    Polar angle of the line joining the centres of the faces at -/+pDz
437  </td></tr><tr><td>
438    <code class="literal">pPhi</code>
439  </td><td>
440    Azimuthal angle of the line joining the centre of the face at -pDz to the centre of the face at +pDz
441  </td></tr><tr><td>
442    <code class="literal">pDy1</code>
443  </td><td>
444    Half y length at -pDz
445  </td></tr><tr><td>
446    <code class="literal">pDy2</code>
447  </td><td>
448    Half y length at +pDz
449  </td></tr><tr><td>
450    <code class="literal">pDx3</code>
451  </td><td>
452    Half x length of the side at y=-pDy2 of the face at +pDz
453  </td></tr><tr><td>
454    <code class="literal">pDx4</code>
455  </td><td>
456    Half x length of the side at y=+pDy2 of the face at +pDz
457  </td></tr><tr><td>
458    <code class="literal">pAlp1</code>
459  </td><td>
460    Angle with respect to the y axis from the centre of the side
461    (lower endcap)
462  </td></tr><tr><td>
463    <code class="literal">pAlp2</code>
464  </td><td>
465    Angle with respect to the y axis from the centre of the side
466    (upper endcap)
467  </td></tr></tbody></table></div><p>
468</p><p>
469<span class="bold"><strong>Note on <code class="literal">pAlph1/2</code></strong></span>: the
470two angles have to be the
471same due to the planarity condition.
472</p><h5><a name="id385530"></a>
473Sphere or Spherical Shell Section:
474</h5><p> 
475To build a <span class="bold"><strong>sphere</strong></span>, or a
476<span class="bold"><strong>spherical shell section</strong></span>, use:
477
478</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
479    <div class="informalexample"><pre class="programlisting"> 
480   G4Sphere(const G4String&amp; pName,                     
481                  G4double   pRmin,
482                  G4double   pRmax,
483                  G4double   pSPhi,
484                  G4double   pDPhi,
485                  G4double   pSTheta,
486                  G4double   pDTheta )
487    </pre></div>
488  </td><td align="center" valign="top">
489    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aSphere.jpg"></div>
490
491    <a href="javascript:remote_win('pic7.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
492  </a>
493 
494    <span class="underline">In the picture</span>:
495    <code class="literal">
496    <p>
497      pRmin = 100, pRmax = 120,
498      pSPhi = 0*Degree, pDPhi = 180*Degree,
499      pSTheta = 0 Degree, pDTheta = 180*Degree
500    </p>
501    </code>
502  </td></tr></tbody></table></div><p>
503</p><p>
504to obtain a solid with name <code class="literal">pName</code> and parameters:
505
506</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
507    pRmin
508  </td><td>
509    Inner radius
510  </td></tr><tr><td>
511    pRmax
512  </td><td>
513    Outer radius
514  </td></tr><tr><td>
515    pSPhi
516  </td><td>
517    Starting Phi angle of the segment in radians
518  </td></tr><tr><td>
519    pDPhi
520  </td><td>
521    Delta Phi angle of the segment in radians
522  </td></tr><tr><td>
523    pSTheta
524  </td><td>
525    Starting Theta angle of the segment in radians
526  </td></tr><tr><td>
527    pDTheta
528  </td><td>
529    Delta Theta angle of the segment in radians
530  </td></tr></tbody></table></div><p>
531</p><h5><a name="id385737"></a>
532Full Solid Sphere:
533</h5><p> 
534To build a <span class="bold"><strong>full solid sphere</strong></span>
535use:
536
537</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
538    <div class="informalexample"><pre class="programlisting"> 
539   G4Orb(const G4String&amp; pName,                                   
540               G4double  pRmax)
541    </pre></div>
542  </td><td align="center" valign="top">
543    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aOrb.jpg"></div>
544
545    <a href="javascript:remote_win('pic8.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
546  </a>
547 
548    <span class="underline">In the picture</span>:
549    <code class="literal">
550    <p>
551      pRmax = 100
552    </p>
553    </code>
554  </td></tr></tbody></table></div><p>
555</p><p>
556The Orb can be obtained from a Sphere with:
557<code class="literal">pRmin</code> = 0, <code class="literal">pSPhi</code> = 0,
558<code class="literal">pDPhi</code> = 2*Pi,
559<code class="literal">pSTheta</code> = 0, <code class="literal">pDTheta</code> = Pi
560
561</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
562    pRmax
563  </td><td>
564    Outer radius
565  </td></tr></tbody></table></div><p>
566</p><h5><a name="id385906"></a>
567Torus:
568</h5><p> 
569To build a <span class="bold"><strong>torus</strong></span> use:
570
571</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
572    <div class="informalexample"><pre class="programlisting"> 
573   G4Torus(const G4String&amp; pName,                       
574                 G4double   pRmin,
575                 G4double   pRmax,
576                 G4double   pRtor,
577                 G4double   pSPhi,
578                 G4double   pDPhi)
579    </pre></div>
580  </td><td align="center" valign="top">
581    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTorus.jpg"></div>
582
583    <a href="javascript:remote_win('pic9.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
584  </a>
585 
586    <span class="underline">In the picture</span>:
587    <code class="literal">
588    <p>
589      pRmin = 40, pRmax = 60, pRtor = 200,
590      pSPhi = 0, pDPhi = 90*Degree
591    </p>
592    </code>
593  </td></tr></tbody></table></div><p>
594</p><p>
595to obtain a solid with name <code class="literal">pName</code> and parameters:
596
597</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
598    pRmin
599  </td><td>
600    Inside radius
601  </td></tr><tr><td>
602    pRmax
603  </td><td>
604    Outside radius
605  </td></tr><tr><td>
606    pRtor
607  </td><td>
608    Swept radius of torus
609  </td></tr><tr><td>
610    pSPhi
611  </td><td>
612    Starting Phi angle in radians (<code class="literal">fSPhi+fDPhi&lt;=2PI</code>,
613    <code class="literal">fSPhi&gt;-2PI</code>)
614  </td></tr><tr><td>
615    pDPhi
616  </td><td>
617    Delta angle of the segment in radians
618  </td></tr></tbody></table></div><p>
619</p><p>
620In addition, the Geant4 Design Documentation shows in the Solids
621Class Diagram the complete list of CSG classes, and the STEP
622documentation contains a detailed EXPRESS description of each CSG
623solid.
624</p><h4><a name="id386112"></a>
625Specific CSG Solids
626</h4><h5><a name="id386121"></a>
627Polycons:
628</h5><p> 
629<span class="bold"><strong>Polycons</strong></span> (PCON) are implemented in Geant4 through the
630<code class="literal">G4Polycon</code> class:
631
632</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
633    <div class="informalexample"><pre class="programlisting"> 
634   G4Polycone(const G4String&amp; pName,                   
635                    G4double   phiStart,
636                    G4double   phiTotal,
637                    G4int      numZPlanes,
638                    const G4double   zPlane[],
639                    const G4double   rInner[],
640                    const G4double   rOuter[])
641
642   G4Polycone(const G4String&amp; pName,                     
643                    G4double   phiStart,
644                    G4double   phiTotal,
645                    G4int      numRZ,
646                    const G4double  r[],
647                    const G4double  z[])
648    </pre></div>
649  </td><td align="center" valign="top">
650    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aBREPSolidPCone.jpg"></div>
651
652    <a href="javascript:remote_win('pic10.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
653  </a>
654 
655    <span class="underline">In the picture</span>:
656    <code class="literal">
657    <p>
658      phiStart = 1/4*Pi, phiTotal = 3/2*Pi, numZPlanes = 9,
659      rInner = { 0, 0, 0, 0, 0, 0, 0, 0, 0},
660      rOuter = { 0, 10, 10, 5 , 5, 10 , 10 , 2, 2},
661      z = { 5, 7, 9, 11, 25, 27, 29, 31, 35 }
662    </p>
663    </code>
664  </td></tr></tbody></table></div><p>
665</p><p>
666where:
667
668</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
669    phiStart
670  </td><td>
671    Initial Phi starting angle
672  </td></tr><tr><td>
673    phiTotal
674  </td><td>
675    Total Phi angle
676  </td></tr><tr><td>
677    numZPlanes
678  </td><td>
679    Number of z planes
680  </td></tr><tr><td>
681    numRZ
682  </td><td>
683    Number of corners in r,z space
684  </td></tr><tr><td>
685    zPlane
686  </td><td>
687    Position of z planes
688  </td></tr><tr><td>
689    rInner
690  </td><td>
691    Tangent distance to inner surface
692  </td></tr><tr><td>
693    rOuter
694  </td><td>
695    Tangent distance to outer surface
696  </td></tr><tr><td>
697    r
698  </td><td>
699    r coordinate of corners
700  </td></tr><tr><td>
701    z
702  </td><td>
703    z coordinate of corners
704  </td></tr></tbody></table></div><p>
705</p><h5><a name="id386355"></a>
706Polyhedra (PGON):
707</h5><p> 
708<span class="bold"><strong>Polyhedra</strong></span> (PGON) are implemented through
709<code class="literal">G4Polyhedra</code>:
710
711</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
712    <div class="informalexample"><pre class="programlisting"> 
713   G4Polyhedra(const G4String&amp; pName,                   
714                     G4double  phiStart,
715                     G4double  phiTotal,
716                     G4int     numSide,
717                     G4int     numZPlanes,
718               const G4double  zPlane[],
719               const G4double  rInner[],
720               const G4double  rOuter[] )
721
722   G4Polyhedra(const G4String&amp; pName,
723                     G4double  phiStart,
724                     G4double  phiTotal,
725                     G4int     numSide,
726                     G4int     numRZ,
727               const G4double  r[],
728               const G4double  z[] )
729    </pre></div>
730  </td><td align="center" valign="top">
731    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aBREPSolidPolyhedra.jpg"></div>
732
733    <a href="javascript:remote_win('pic11.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
734  </a>
735 
736    <span class="underline">In the picture</span>:
737    <code class="literal">
738    <p>
739    phiStart = -1/4*Pi, phiTotal= 5/4*Pi,
740    numSide = 3, nunZPlanes = 7,
741    rInner = { 0, 0, 0, 0, 0, 0, 0 },
742    rOuter = { 0, 15, 15, 4, 4, 10, 10 },
743    z = { 0, 5, 8, 13 , 30, 32, 35 }
744    </p>
745    </code>
746  </td></tr></tbody></table></div><p>
747</p><p>
748where:
749</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
750    <code class="literal">phiStart</code>
751  </td><td>
752    Initial Phi starting angle
753  </td></tr><tr><td>
754    <code class="literal">phiTotal</code>
755  </td><td>
756    Total Phi angle
757  </td></tr><tr><td>
758    <code class="literal">numSide</code>
759  </td><td>
760    Number of sides
761  </td></tr><tr><td>
762    <code class="literal">numZPlanes</code>
763  </td><td>
764    Number of z planes
765  </td></tr><tr><td>
766    <code class="literal">numRZ</code>
767  </td><td>
768    Number of corners in r,z space
769  </td></tr><tr><td>
770    zPlane
771  </td><td>
772    Position of z planes
773  </td></tr><tr><td>
774    <code class="literal">rInner</code>
775  </td><td>
776    Tangent distance to inner surface
777  </td></tr><tr><td>
778    rOuter
779  </td><td>
780    Tangent distance to outer surface
781  </td></tr><tr><td>
782    <code class="literal">r</code>
783  </td><td>
784    r coordinate of corners
785  </td></tr><tr><td>
786    <code class="literal">z</code>
787  </td><td>
788    z coordinate of corners
789  </td></tr></tbody></table></div><p>
790</p><h5><a name="id386642"></a>
791Tube with an elliptical cross section:
792</h5><p> 
793A <span class="bold"><strong>tube with an elliptical cross
794section</strong></span> (ELTU) can be defined as follows:
795
796</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
797    <div class="informalexample"><pre class="programlisting"> 
798   G4EllipticalTube(const G4String&amp; pName,                   
799                          G4double  Dx,
800                          G4double  Dy,
801                          G4double  Dz)
802    </pre></div>
803
804    The equation of the surface in x/y is <code class="literal">1.0 = (x/dx)**2 +(y/dy)**2</code>
805  </td><td align="center" valign="top">
806    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aEllipticalTube.jpg"></div>
807
808    <a href="javascript:remote_win('pic12.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
809  </a>
810 
811    <span class="underline">In the picture</span>:
812    <code class="literal">
813    <p>
814    Dx = 5, Dy = 10, Dz = 20
815    </p>
816    </code>
817  </td></tr></tbody></table></div><p>
818</p><p>
819</p><div class="informaltable"><table border="1"><colgroup><col><col><col><col><col><col></colgroup><tbody><tr><td>
820    Dx
821  </td><td>
822    Half length X
823  </td><td>
824    Dy
825  </td><td>
826    Half length Y
827  </td><td>
828    Dz
829  </td><td>
830    Half length Z
831  </td></tr></tbody></table></div><p>
832</p><h5><a name="id386804"></a>
833General Ellipsoid:
834</h5><p> 
835The general <span class="bold"><strong>ellipsoid</strong></span> with
836possible cut in <code class="literal">Z</code> can be defined as follows:
837
838</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
839    <div class="informalexample"><pre class="programlisting"> 
840   G4Ellipsoid(const G4String&amp; pName,                   
841                     G4double  pxSemiAxis,
842                     G4double  pySemiAxis,
843                     G4double  pzSemiAxis,
844                     G4double  pzBottomCut=0,
845                     G4double  pzTopCut=0)
846    </pre></div>
847  </td><td align="center" valign="top">
848    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aEllipsoid.jpg"></div>
849
850    <a href="javascript:remote_win('pic13.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
851  </a>
852 
853    <span class="underline">In the picture</span>:
854    <code class="literal">
855    <p>
856    pxSemiAxis = 10, pySemiAxis = 20, pzSemiAxis = 50,
857    pzBottomCut = -10, pzTopCut = 40
858    </p>
859    </code>
860  </td></tr></tbody></table></div><p>
861</p><p>
862A general (or triaxial) ellipsoid is a quadratic surface which is
863given in Cartesian coordinates by:
864
865</p><div class="informalexample"><pre class="programlisting">
866   1.0 = (x/pxSemiAxis)**2 + (y/pySemiAxis)**2 + (z/pzSemiAxis)**2
867</pre></div><p>
868
869where:
870
871</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
872    <code class="literal">pxSemiAxis</code>
873  </td><td>
874    Semiaxis in X
875  </td></tr><tr><td>
876    pySemiAxis
877  </td><td>
878    Semiaxis in Y
879  </td></tr><tr><td>
880    pzSemiAxis
881  </td><td>
882    Semiaxis in Z
883  </td></tr><tr><td>
884    pzBottomCut
885  </td><td>
886    lower cut plane level, z
887  </td></tr><tr><td>
888    pzTopCut
889  </td><td>
890    upper cut plane level, z
891  </td></tr></tbody></table></div><p>
892</p><h5><a name="id387009"></a>
893Cone with Elliptical Cross Section:
894</h5><p> 
895A <span class="bold"><strong>cone with an elliptical cross section</strong></span> 
896can be defined as follows:
897
898</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
899    <div class="informalexample"><pre class="programlisting"> 
900   G4EllipticalCone(const G4String&amp; pName,             
901                          G4double  pxSemiAxis,
902                          G4double  pySemiAxis,
903                          G4double  zMax,
904                          G4double  pzTopCut)
905    </pre></div>
906  </td><td align="center" valign="top">
907    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aEllipticalCone.jpg"></div>
908
909    <a href="javascript:remote_win('pic14.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
910  </a>
911 
912    <span class="underline">In the picture</span>:
913    <code class="literal">
914    <p>
915    pxSemiAxis = 30/75, pySemiAxis = 60/75, zMax = 50, pzTopCut = 25
916    </p>
917    </code>
918  </td></tr></tbody></table></div><p>
919</p><p>
920where:
921
922</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
923    pxSemiAxis
924  </td><td>
925    Semiaxis in X
926  </td></tr><tr><td>
927    pySemiAxis
928  </td><td>
929    Semiaxis in Y
930  </td></tr><tr><td>
931    zMax
932  </td><td>
933    Height of elliptical cone
934  </td></tr><tr><td>
935    pzTopCut
936  </td><td>
937    upper cut plane level
938  </td></tr></tbody></table></div><p>
939</p><p>
940An elliptical cone of height <code class="literal">zMax</code>, semiaxis
941<code class="literal">pxSemiAxis</code>, and semiaxis <code class="literal">pySemiAxis</code> 
942is given by the parametric equations:
943
944</p><div class="informalexample"><pre class="programlisting"> 
945   x = pxSemiAxis * ( zMax - u ) / u * Cos(v)
946   y = pySemiAxis * ( zMax - u ) / u * Sin(v)
947   z = u
948</pre></div><p> 
949
950Where <code class="literal">v</code> is between <code class="literal">0</code> and
951<code class="literal">2*Pi</code>, and
952<code class="literal">u</code> between <code class="literal">0</code> and
953<code class="literal">h</code> respectively.
954</p><h5><a name="id387250"></a>
955Paraboloid, a solid with parabolic profile:
956</h5><p> 
957A <span class="bold"><strong>solid with parabolic profile</strong></span> and possible cuts along
958the <code class="literal">Z</code> axis can be defined as follows:
959
960</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
961    <div class="informalexample"><pre class="programlisting"> 
962   G4Parabolid(const G4String&amp; pName,                   
963                     G4double  R1,
964                     G4double  R2,
965                     G4double  Dz)
966    </pre></div>
967
968    The equation for the solid is:
969<div class="informalexample"><pre class="programlisting"> 
970   rho**2 &lt;= k1 * z + k2;
971       -dz &lt;= z &lt;= dz
972   r1**2 = k1 * (-dz) + k2
973   r2**2 = k1 * ( dz) + k2
974</pre></div> 
975
976  </td><td align="center" valign="top">
977    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aParaboloid.jpg"></div>
978
979    <a href="javascript:remote_win('pic21.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
980  </a>
981 
982    <span class="underline">In the picture</span>:
983    <code class="literal">
984    <p>
985    R1 = 20, R2 = 35, Dz = 20
986    </p>
987    </code>
988  </td></tr></tbody></table></div><p>
989</p><p>
990</p><div class="informaltable"><table border="1"><colgroup><col><col><col><col><col><col></colgroup><tbody><tr><td>
991    R1
992  </td><td>
993    Radius at -Dz
994  </td><td>
995    R2
996  </td><td>
997    Radius at +Dz greater than R1
998  </td><td>
999    Dz
1000  </td><td>
1001    Half length Z
1002  </td></tr></tbody></table></div><p>
1003</p><h5><a name="id387420"></a>
1004Tube with Hyperbolic Profile:
1005</h5><p> 
1006A <span class="bold"><strong>tube with a hyperbolic
1007profile</strong></span> (HYPE) can be defined as follows:
1008
1009</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
1010    <div class="informalexample"><pre class="programlisting"> 
1011   G4Hype(const G4String&amp; pName,                       
1012                G4double  innerRadius,
1013                G4double  outerRadius,
1014                G4double  innerStereo,
1015                G4double  outerStereo,
1016                G4double  halfLenZ)
1017    </pre></div>
1018  </td><td align="center" valign="top">
1019    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aHyperboloid.jpg"></div>
1020
1021    <a href="javascript:remote_win('pic15.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
1022  </a>
1023 
1024    <span class="underline">In the picture</span>:
1025    <code class="literal">
1026    <p>
1027    innerStereo = 0.7, outerStereo = 0.7,
1028    halfLenZ = 50,
1029    innerRadius = 20, outerRadius = 30
1030    </p>
1031    </code>
1032  </td></tr></tbody></table></div><p>
1033</p><p>
1034<code class="literal">G4Hype</code> is shaped with curved sides parallel to the
1035<code class="literal">z</code>-axis, has a specified half-length along the <code class="literal">z</code>
1036axis about which it is centred, and a given minimum and maximum
1037radius.
1038</p><p>
1039A minimum radius of <code class="literal">0</code> defines a filled Hype (with
1040hyperbolic inner surface), i.e. inner radius = 0 AND inner stereo
1041angle = 0.
1042</p><p>
1043The inner and outer hyperbolic surfaces can have different stereo
1044angles. A stereo angle of <code class="literal">0</code> gives a cylindrical
1045surface:
1046
1047</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1048    <code class="literal">innerRadius</code>
1049  </td><td>
1050    Inner radius
1051  </td></tr><tr><td>
1052    <code class="literal">outerRadius</code>
1053  </td><td>
1054    Outer radius
1055  </td></tr><tr><td>
1056    <code class="literal">innerStereo</code>
1057  </td><td>
1058    Inner stereo angle in radians
1059  </td></tr><tr><td>
1060    <code class="literal">outerStereo</code>
1061  </td><td>
1062    Outer stereo angle in radians
1063  </td></tr><tr><td>
1064    <code class="literal">halfLenZ</code>
1065  </td><td>
1066    Half length in Z
1067  </td></tr></tbody></table></div><p>
1068</p><h5><a name="id387670"></a>
1069Tetrahedra:
1070</h5><p> 
1071A <span class="bold"><strong>tetrahedra</strong></span> solid can be
1072defined as follows:
1073
1074</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
1075    <div class="informalexample"><pre class="programlisting"> 
1076   G4Tet(const G4String&amp; pName,                         
1077               G4ThreeVector  anchor,
1078               G4ThreeVector  p2,
1079               G4ThreeVector  p3,
1080               G4ThreeVector  p4,
1081               G4bool         *degeneracyFlag=0)
1082    </pre></div>
1083  </td><td align="center" valign="top">
1084    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTet.jpg"></div>
1085
1086    <a href="javascript:remote_win('pic16.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
1087  </a>
1088 
1089    <span class="underline">In the picture</span>:
1090    <code class="literal">
1091    <p>
1092    anchor = {0, 0, sqrt(3)},
1093    p2 = { 0, 2*sqrt(2/3), -1/sqrt(3) },
1094    p3 = { -sqrt(2), -sqrt(2/3),-1/sqrt(3) },
1095    p4 = { sqrt(2), -sqrt(2/3) , -1/sqrt(3) }
1096    </p>
1097    </code>
1098  </td></tr></tbody></table></div><p>
1099</p><p>
1100The solid is defined by 4 points in space:
1101
1102</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1103    <code class="literal">anchor</code>
1104  </td><td>
1105    Anchor point
1106  </td></tr><tr><td>
1107    <code class="literal">p2</code>
1108  </td><td>
1109    Point 2
1110  </td></tr><tr><td>
1111    <code class="literal">p3</code>
1112  </td><td>
1113    Point 3
1114  </td></tr><tr><td>
1115    <code class="literal">p4</code>
1116  </td><td>
1117    Point 4
1118  </td></tr><tr><td>
1119    degeneracyFlag
1120  </td><td>
1121    Flag indicating degeneracy of points
1122  </td></tr><tr><td>
1123   
1124  </td><td>
1125   
1126  </td></tr></tbody></table></div><p>
1127</p><h5><a name="id387885"></a>
1128Extruded Polygon:
1129</h5><p>
1130The extrusion of an arbitrary polygon
1131(<span class="bold"><strong>extruded solid</strong></span>) with fixed outline
1132in the defined <code class="literal">Z</code> sections can be defined as follows
1133(in a general way, or as special construct with two <code class="literal">Z</code>
1134sections):
1135
1136</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
1137    <div class="informalexample"><pre class="programlisting"> 
1138   G4ExtrudedSolid(const G4String&amp;                pName,
1139                         std::vector&lt;G4TwoVector&gt; polygon,
1140                         std::vector&lt;ZSection&gt;    zsections)
1141
1142   G4ExtrudedSolid(const G4String&amp;                pName,
1143                         std::vector&lt;G4TwoVector&gt; polygon,
1144                         G4double                 hz,
1145                         G4TwoVector off1, G4double scale1,
1146                         G4TwoVector off2, G4double scale2)
1147    </pre></div>
1148  </td><td align="center" valign="top">
1149    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aExtrudedSolid.jpg"></div>
1150
1151    <a href="javascript:remote_win('pic22.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
1152  </a>
1153 
1154    <span class="underline">In the picture</span>:
1155    <code class="literal">
1156    <p>
1157    poligon = {-30,-30},{-30,30},{30,30},{30,-30},
1158              {15,-30},{15,15},{-15,15},{-15,-30}</p>
1159    <p>
1160    zsections = [-60,{0,30},0.8], [-15, {0,-30},1.],
1161                [10,{0,0},0.6], [60,{0,30},1.2]</p>
1162    </code>
1163  </td></tr></tbody></table></div><p>
1164</p><p>
1165The z-sides of the solid are the scaled versions of the same polygon.
1166
1167</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1168    <code class="literal">polygon</code>
1169  </td><td>
1170    the vertices of the outlined polygon defined in clock-wise order
1171  </td></tr><tr><td>
1172    <code class="literal">zsections</code>
1173  </td><td>
1174     the z-sections defined by z position in increasing order
1175  </td></tr><tr><td>
1176    <code class="literal">hz</code>
1177  </td><td>
1178    Half length in Z
1179  </td></tr><tr><td>
1180    <code class="literal">off1, off2</code>
1181  </td><td>
1182    Offset of the side in -hz and +hz respectively
1183  </td></tr><tr><td>
1184    <code class="literal">scale1, scale2</code>
1185  </td><td>
1186    Scale of the side in -hz and +hz respectively
1187  </td></tr></tbody></table></div><p>
1188</p><h5><a name="id388115"></a>
1189Box Twisted:
1190</h5><p> 
1191A <span class="bold"><strong>box twisted</strong></span> along one axis
1192can be defined as follows:
1193
1194</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
1195    <div class="informalexample"><pre class="programlisting"> 
1196   G4TwistedBox(const G4String&amp; pName,                 
1197                      G4double  twistedangle,
1198                      G4double  pDx,
1199                      G4double  pDy,
1200                      G4double  pDz)
1201    </pre></div>
1202  </td><td align="center" valign="top">
1203    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTwistedBox.jpg"></div>
1204
1205    <a href="javascript:remote_win('pic17.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
1206  </a>
1207 
1208    <span class="underline">In the picture</span>:
1209    <code class="literal">
1210    <p>
1211    twistedangle = 30*Degree, pDx = 30, pDy =40, pDz = 60
1212    </p>
1213    </code>
1214  </td></tr></tbody></table></div><p>
1215</p><p>
1216<code class="literal">G4TwistedBox</code> is a box twisted along the z-axis. The
1217twist angle cannot be greater than 90 degrees:
1218
1219</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1220    <code class="literal">twistedangle</code>
1221  </td><td>
1222    Twist angle
1223  </td></tr><tr><td>
1224    <code class="literal">pDx</code>
1225  </td><td>
1226    Half x length
1227  </td></tr><tr><td>
1228    <code class="literal">pDy</code>
1229  </td><td>
1230    Half y length
1231  </td></tr><tr><td>
1232    <code class="literal">pDz</code>
1233  </td><td>
1234    Half z length
1235  </td></tr></tbody></table></div><p>
1236</p><h5><a name="id388315"></a>
1237Trapezoid Twisted along One Axis:
1238</h5><p> 
1239<span class="emphasis"><em>trapezoid twisted</em></span> along one axis can be defined as
1240follows:
1241
1242</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
1243    <div class="informalexample"><pre class="programlisting"> 
1244   G4TwistedTrap(const G4String&amp; pName,                 
1245                       G4double  twistedangle,
1246                       G4double  pDxx1,
1247                       G4double  pDxx2,
1248                       G4double  pDy,
1249                       G4double   pDz)
1250 
1251   G4TwistedTrap(const G4String&amp; pName,
1252                       G4double  twistedangle,
1253                       G4double  pDz,
1254                       G4double  pTheta,
1255                       G4double  pPhi,
1256                       G4double  pDy1,
1257                       G4double  pDx1,
1258                       G4double  pDx2,
1259                       G4double  pDy2,
1260                       G4double  pDx3,
1261                       G4double  pDx4,
1262                       G4double  pAlph)
1263    </pre></div>
1264  </td><td align="center" valign="top">
1265    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTwistedTrap.jpg"></div>
1266
1267    <a href="javascript:remote_win('pic18.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
1268  </a>
1269 
1270    <span class="underline">In the picture</span>:
1271    <code class="literal">
1272    <p>
1273    pDx1 = 30, pDx2 = 40, pDy1 = 40,
1274    pDx3 = 10, pDx4 = 14, pDy2 = 16,
1275    pDz = 60,
1276    pTheta = 20*Degree, pDphi = 5*Degree,
1277    pAlph = 10*Degree, twistedangle = 30*Degree
1278    </p>
1279    </code>
1280  </td></tr></tbody></table></div><p>
1281</p><p>
1282The first constructor of <code class="literal">G4TwistedTrap</code> produces a
1283regular trapezoid twisted along the <code class="literal">z</code>-axis, where the caps
1284of the trapezoid are of the same shape and size.
1285</p><p>
1286The second constructor produces a generic trapezoid with polar,
1287azimuthal and tilt angles.
1288</p><p>
1289The twist angle cannot be greater than 90 degrees:
1290
1291</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1292    <code class="literal">twistedangle</code>
1293  </td><td>
1294    Twisted angle
1295  </td></tr><tr><td>
1296    <code class="literal">pDx1</code>
1297  </td><td>
1298    Half x length at y=-pDy
1299  </td></tr><tr><td>
1300    <code class="literal">pDx2</code>
1301  </td><td>
1302    Half x length at y=+pDy
1303  </td></tr><tr><td>
1304    <code class="literal">pDy</code>
1305  </td><td>
1306    Half y length
1307  </td></tr><tr><td>
1308    <code class="literal">pDz</code>
1309  </td><td>
1310    Half z length
1311  </td></tr><tr><td>
1312    <code class="literal">pTheta</code>
1313  </td><td>
1314    Polar angle of the line joining the centres of the faces at -/+pDz
1315  </td></tr><tr><td>
1316    <code class="literal">pDy1</code>
1317  </td><td>
1318    Half y length at -pDz
1319  </td></tr><tr><td>
1320    <code class="literal">pDx1</code>
1321  </td><td>
1322    Half x length at -pDz, y=-pDy1
1323  </td></tr><tr><td>
1324    <code class="literal">pDx2</code>
1325  </td><td>
1326    Half x length at -pDz, y=+pDy1
1327  </td></tr><tr><td>
1328    <code class="literal">pDy2</code>
1329  </td><td>
1330    Half y length at +pDz
1331
1332  </td></tr><tr><td>
1333    <code class="literal">pDx3</code>
1334  </td><td>
1335    Half x length at +pDz, y=-pDy2
1336  </td></tr><tr><td>
1337    <code class="literal">pDx4</code>
1338  </td><td>
1339    Half x length at +pDz, y=+pDy2
1340  </td></tr><tr><td>
1341    <code class="literal">pAlph</code>
1342  </td><td>
1343    Angle with respect to the y axis from the centre of the side
1344  </td></tr></tbody></table></div><p>
1345</p><h5><a name="id388684"></a>
1346Twisted Trapezoid with <code class="literal">x</code> and <code class="literal">y</code> dimensions
1347varying along <code class="literal">z</code>:
1348</h5><p> 
1349A <span class="bold"><strong>twisted trapezoid</strong></span> with the
1350<code class="literal">x</code> and <code class="literal">y</code> dimensions
1351<span class="bold"><strong>varying along <code class="literal">z</code></strong></span> can be
1352defined as follows:
1353
1354</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
1355    <div class="informalexample"><pre class="programlisting"> 
1356   G4TwistedTrd(const G4String&amp; pName,                 
1357                      G4double  pDx1,
1358                      G4double  pDx2,
1359                      G4double  pDy1,
1360                      G4double  pDy2,
1361                      G4double  pDz,
1362                      G4double  twistedangle)
1363    </pre></div>
1364  </td><td align="center" valign="top">
1365    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTwistedTrd.jpg"></div>
1366
1367    <a href="javascript:remote_win('pic19.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
1368  </a>
1369 
1370    <span class="underline">In the picture</span>:
1371    <code class="literal">
1372    <p>
1373    dx1 = 30, dx2 = 10,
1374    dy1 = 40, dy2 = 15,
1375    dz = 60, twistedangle = 30*Degree
1376    </p>
1377    </code>
1378  </td></tr></tbody></table></div><p>
1379</p><p>
1380where:
1381</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1382    <code class="literal">pDx1</code>
1383  </td><td>
1384    Half x length at the surface positioned at -dz
1385  </td></tr><tr><td>
1386    <code class="literal">pDx2</code>
1387  </td><td>
1388    Half x length at the surface positioned at +dz
1389  </td></tr><tr><td>
1390    <code class="literal">pDy1</code>
1391  </td><td>
1392    Half y length at the surface positioned at -dz
1393  </td></tr><tr><td>
1394    <code class="literal">pDy2</code>
1395  </td><td>
1396    Half y length at the surface positioned at +dz
1397  </td></tr><tr><td>
1398    <code class="literal">pDz</code>
1399  </td><td>
1400    Half z length
1401  </td></tr><tr><td>
1402    <code class="literal">twistedangle</code>
1403  </td><td>
1404    Twisted angle
1405  </td></tr></tbody></table></div><p>
1406</p><h5><a name="id388951"></a>
1407Tube Section Twisted along Its Axis:
1408</h5><p> 
1409A <span class="bold"><strong>tube section twisted</strong></span> along
1410its axis can be defined as follows:
1411
1412</p><div class="informaltable"><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="left" valign="top">
1413    <div class="informalexample"><pre class="programlisting"> 
1414   G4TwistedTubs(const G4String&amp; pName,                 
1415                       G4double  twistedangle,
1416                       G4double  endinnerrad,
1417                       G4double  endouterrad,
1418                       G4double  halfzlen,
1419                       G4double  dphi)
1420    </pre></div>
1421  </td><td align="center" valign="top">
1422    <div class="mediaobject"><img src="./AllResources/Detector/geometry.src/aTwistedTubs.jpg"></div>
1423
1424    <a href="javascript:remote_win('pic20.html ')" onMouseOver="window.status='Get alive picture...'; return true">[Rotate the Picture]<br />
1425  </a>
1426 
1427    <span class="underline">In the picture</span>:
1428    <code class="literal">
1429    <p>
1430    endinnerrad = 10, endouterrad = 15,
1431    halfzlen = 20, dphi = 90*Degree,
1432    twistedangle = 60*Degree
1433    </p>
1434    </code>
1435  </td></tr></tbody></table></div><p>
1436</p><p>
1437<code class="literal">G4TwistedTubs</code> is a sort of twisted cylinder which,
1438placed along the <code class="literal">z</code>-axis and divided into
1439<code class="literal">phi</code>-segments is shaped like an hyperboloid, where each of
1440its segmented pieces can be tilted with a stereo angle.
1441</p><p>
1442It can have inner and outer surfaces with the same stereo angle:
1443</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1444    <code class="literal">twistedangle</code>
1445  </td><td>
1446    Twisted angle
1447  </td></tr><tr><td>
1448    <code class="literal">endinnerrad</code>
1449  </td><td>
1450    Inner radius at endcap
1451  </td></tr><tr><td>
1452    <code class="literal">endouterrad</code>
1453  </td><td>
1454    Outer radius at endcap
1455  </td></tr><tr><td>
1456    <code class="literal">halfzlen</code>
1457  </td><td>
1458    Half z length
1459  </td></tr><tr><td>
1460    <code class="literal">dphi</code>
1461  </td><td>
1462    Phi angle of a segment
1463  </td></tr></tbody></table></div><p>
1464</p><p>
1465Additional constructors are provided, allowing the shape to be
1466specified either as:
1467
1468</p><div class="itemizedlist"><ul type="disc" compact><li><p>
1469    the number of segments in <code class="literal">phi</code> and the total angle for
1470    all segments, or
1471  </p></li><li><p>
1472    a combination of the above constructors providing instead the
1473    inner and outer radii at <code class="literal">z=0</code> with different
1474    <code class="literal">z</code>-lengths along negative and positive
1475    <code class="literal">z</code>-axis.
1476  </p></li></ul></div><p>
1477</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Solids.BoolOp"></a>4.1.2.2. 
1478Solids made by Boolean operations
1479</h4></div></div></div><p>
1480Simple solids can be combined using Boolean operations. For
1481example, a cylinder and a half-sphere can be combined with the
1482union Boolean operation.
1483</p><p>
1484Creating such a new <span class="emphasis"><em>Boolean</em></span> solid, requires:
1485
1486</p><div class="itemizedlist"><ul type="disc" compact><li><p>
1487    Two solids
1488  </p></li><li><p>
1489    A Boolean operation: union, intersection or subtraction.
1490  </p></li><li><p>
1491    Optionally a transformation for the second solid.
1492  </p></li></ul></div><p>
1493</p><p>
1494The solids used should be either CSG solids (for examples a box,
1495a spherical shell, or a tube) or another Boolean solid: the product
1496of a previous Boolean operation. An important purpose of Boolean
1497solids is to allow the description of solids with peculiar shapes
1498in a simple and intuitive way, still allowing an efficient
1499geometrical navigation inside them.
1500</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title"></h3><p>
1501The solids used can actually be of any type. However, in
1502order to fully support the export of a Geant4 solid model via STEP
1503to CAD systems, we restrict the use of Boolean operations to this
1504subset of solids. But this subset contains all the most interesting
1505use cases.
1506</p></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title"></h3><p>
1507The tracking cost for navigating in a Boolean solid in the
1508current implementation, is proportional to the number of
1509constituent solids. So care must be taken to avoid extensive,
1510unecessary use of Boolean solids in performance-critical areas of a
1511geometry description, where each solid is created from Boolean
1512combinations of many other solids.
1513</p></div><p>
1514Examples of the creation of the simplest Boolean solids are
1515given below:
1516
1517</p><div class="informalexample"><pre class="programlisting">
1518  G4Box*  box =
1519    new G4Box("Box",20*mm,30*mm,40*mm);
1520  G4Tubs* cyl =
1521    new G4Tubs("Cylinder",0,50*mm,50*mm,0,twopi);  // r:     0 mm -&gt; 50 mm
1522                                                   // z:   -50 mm -&gt; 50 mm
1523                                                   // phi:   0 -&gt;  2 pi
1524  G4UnionSolid* union =
1525    new G4UnionSolid("Box+Cylinder", box, cyl);
1526  G4IntersectionSolid* intersection =
1527    new G4IntersectionSolid("Box*Cylinder", box, cyl);
1528  G4SubtractionSolid* subtraction =
1529    new G4SubtractionSolid("Box-Cylinder", box, cyl);
1530 </pre></div><p>
1531
1532where the union, intersection and subtraction of a box and cylinder
1533are constructed.
1534</p><p>
1535The more useful case where one of the solids is displaced from
1536the origin of coordinates also exists. In this case the second
1537solid is positioned relative to the coordinate system (and thus
1538relative to the first). This can be done in two ways:
1539
1540</p><div class="itemizedlist"><ul type="disc" compact><li><p>
1541    Either by giving a rotation matrix and translation vector that
1542    are used to transform the coordinate system of the second solid to
1543    the coordinate system of the first solid. This is called the
1544    <span class="emphasis"><em>passive</em></span> method.
1545  </p></li><li><p>
1546    Or by creating a transformation that moves the second solid
1547    from its desired position to its standard position, e.g., a box's
1548    standard position is with its centre at the origin and sides
1549    parallel to the three axes. This is called the
1550    <span class="emphasis"><em>active</em></span> method.
1551  </p></li></ul></div><p>
1552</p><p>
1553In the first case, the translation is applied first to move the
1554origin of coordinates. Then the rotation is used to rotate the
1555coordinate system of the second solid to the coordinate system of
1556the first.
1557
1558</p><div class="informalexample"><pre class="programlisting">
1559    G4RotationMatrix* yRot = new G4RotationMatrix;  // Rotates X and Z axes only
1560    yRot-&gt;rotateY(M_PI/4.*rad);                     // Rotates 45 degrees
1561    G4ThreeVector zTrans(0, 0, 50);
1562
1563    G4UnionSolid* unionMoved =
1564      new G4UnionSolid("Box+CylinderMoved", box, cyl, yRot, zTrans);
1565    //
1566    // The new coordinate system of the cylinder is translated so that
1567    // its centre is at +50 on the original Z axis, and it is rotated
1568    // with its X axis halfway between the original X and Z axes.
1569
1570    // Now we build the same solid using the alternative method
1571    //
1572    G4RotationMatrix invRot = *(yRot-&gt;invert());
1573    G4Transform3D transform(invRot, zTrans); 
1574    G4UnionSolid* unionMoved =
1575      new G4UnionSolid("Box+CylinderMoved", box, cyl, transform);
1576</pre></div><p>
1577</p><p>
1578Note that the first constructor that takes a pointer to the
1579rotation-matrix (<code class="literal">G4RotationMatrix*</code>), does NOT copy it.
1580Therefore once used a rotation-matrix to construct a Boolean solid,
1581it must NOT be modified.
1582</p><p>
1583In contrast, with the alternative method shown, a
1584<code class="literal">G4Transform3D</code> is provided to the constructor by value, and
1585its transformation is stored by the Boolean solid. The user may
1586modify the <code class="literal">G4Transform3D</code> and eventually use it again.
1587</p><p>
1588When positioning a volume associated to a Boolean solid, the
1589relative center of coordinates considered for the positioning is
1590the one related to the <span class="emphasis"><em>first</em></span> of the two constituent
1591solids.
1592</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Solids.BREPS"></a>4.1.2.3. 
1593Boundary Represented (BREPS) Solids
1594</h4></div></div></div><p>
1595BREP solids are defined via the description of their boundaries.
1596The boundaries can be made of planar and second order surfaces.
1597Eventually these can be trimmed and have holes. The resulting
1598solids, such as polygonal, polyconical solids are known as
1599Elementary BREPS.
1600</p><p>
1601In addition, the boundary surfaces can be made of Bezier
1602surfaces and B-Splines, or of NURBS
1603(Non-Uniform-Rational-B-Splines) surfaces. The resulting solids are
1604Advanced BREPS.
1605</p><p>
1606
1607</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title"></h3><p>
1608Currently, the implementation for surfaces
1609generated by Beziers, B-Splines or NURBS is only at the level of
1610prototype and not fully functional.
1611</p><p>
1612Extensions in this area are foreseen in future.
1613</p></div><p>
1614
1615</p><p>
1616We have defined a few simple Elementary BREPS, that can be
1617instantiated simply by a user in a manner similar to the
1618construction of Constructed Solids (CSGs). We summarize their
1619capabilities in the following section.
1620</p><p>
1621
1622</p><p>
1623Most BREPS Solids are however defined by creating each surface
1624separately and tying them together.
1625</p><p>
1626
1627
1628</p><h5><a name="id389460"></a>
1629Specific BREP Solids:
1630</h5><p>
1631
1632</p><p>
1633We have defined one polygonal and one polyconical shape using
1634BREPS. The polycone provides a shape defined by a series of conical
1635sections with the same axis, contiguous along it.
1636</p><p>
1637
1638</p><p>
1639The polyconical solid <code class="literal">G4BREPSolidPCone</code> is a shape
1640defined by a set of inner and outer conical or cylindrical surface
1641sections and two planes perpendicular to the Z axis. Each conical
1642surface is defined by its radius at two different planes
1643perpendicular to the Z-axis. Inner and outer conical surfaces are
1644defined using common Z planes.
1645</p><p>
1646
1647</p><div class="informalexample"><pre class="programlisting"> 
1648  G4BREPSolidPCone( const G4String&amp; pName,
1649                          G4double  start_angle,
1650                          G4double  opening_angle,                   
1651                          G4int     num_z_planes,    // sections,
1652                          G4double  z_start,                   
1653                    const G4double  z_values[],
1654                    const G4double  RMIN[],
1655                    const G4double  RMAX[]  )
1656</pre></div><p> 
1657
1658</p><p>
1659The conical sections do not need to fill 360 degrees, but can have
1660a common start and opening angle.
1661</p><p>
1662
1663</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1664    <code class="literal">start_angle</code>
1665  </td><td>
1666    starting angle
1667  </td></tr><tr><td>
1668    <code class="literal">opening_angle</code>
1669  </td><td>
1670    opening angle
1671  </td></tr><tr><td>
1672    <code class="literal">num_z_planes</code>
1673  </td><td>
1674    number of planes perpendicular to the z-axis used.
1675  </td></tr><tr><td>
1676    <code class="literal">z_start</code>
1677  </td><td>
1678    starting value of z
1679  </td></tr><tr><td>
1680    <code class="literal">z_values</code>
1681  </td><td>
1682    z coordinates of each plane
1683  </td></tr><tr><td>
1684    <code class="literal">RMIN</code>
1685  </td><td>
1686    radius of inner cone at each plane
1687  </td></tr><tr><td>
1688    <code class="literal">RMAX</code>
1689  </td><td>
1690    radius of outer cone at each plane
1691  </td></tr></tbody></table></div><p>
1692</p><p>
1693The polygonal solid <code class="literal">G4BREPSolidPolyhedra</code> is a shape
1694defined by an inner and outer polygonal surface and two planes
1695perpendicular to the Z axis. Each polygonal surface is created by
1696linking a series of polygons created at different planes
1697perpendicular to the Z-axis. All these polygons all have the same
1698number of sides (<code class="literal">sides</code>) and are defined at the same Z
1699planes for both inner and outer polygonal surfaces.
1700</p><p>
1701The polygons do not need to fill 360 degrees, but have a start
1702and opening angle.
1703</p><p>
1704The constructor takes the following parameters:
1705
1706</p><div class="informalexample"><pre class="programlisting"> 
1707  G4BREPSolidPolyhedra( const G4String&amp; pName,
1708                              G4double  start_angle,
1709                              G4double  opening_angle,
1710                              G4int     sides,
1711                              G4int     num_z_planes,     
1712                              G4double  z_start,
1713                        const G4double  z_values[],
1714                        const G4double  RMIN[],
1715                        const G4double  RMAX[]  )
1716</pre></div><p> 
1717
1718which in addition to its name have the following meaning:
1719
1720</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1721    <code class="literal">start_angle</code>
1722  </td><td>
1723    starting angle
1724  </td></tr><tr><td>
1725    <code class="literal">opening_angle</code>
1726  </td><td>
1727    opening angle
1728  </td></tr><tr><td>
1729    <code class="literal">sides</code>
1730  </td><td>
1731    number of sides of each polygon in the x-y plane
1732  </td></tr><tr><td>
1733    <code class="literal">num_z_planes</code>
1734  </td><td>
1735    number of planes perpendicular to the z-axis used.
1736  </td></tr><tr><td>
1737    <code class="literal">z_start</code>
1738  </td><td>
1739    starting value of z
1740  </td></tr><tr><td>
1741    <code class="literal">z_values</code>
1742  </td><td>
1743    z coordinates of each plane
1744  </td></tr><tr><td>
1745    <code class="literal">RMIN</code>
1746  </td><td>
1747    radius of inner polygon at each corner
1748  </td></tr><tr><td>
1749    <code class="literal">RMAX</code>
1750  </td><td>
1751    radius of outer polygon at each corner
1752  </td></tr></tbody></table></div><p>
1753   
1754the shape is defined by the number of sides <code class="literal">sides</code> of
1755the polygon in the plane perpendicular to the z-axis.
1756</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Solids.Tessel"></a>4.1.2.4. 
1757Tessellated Solids
1758</h4></div></div></div><p>
1759In Geant4 it is also implemented a class
1760<code class="literal">G4TessellatedSolid</code> which can be used to generate a generic
1761solid defined by a number of facets (<code class="literal">G4VFacet</code>). Such
1762constructs are especially important for conversion of complex
1763geometrical shapes imported from CAD systems bounded with generic
1764surfaces into an approximate description with facets of defined
1765dimension (see <a href="ch04.html#fig.Geom.Solid_1" title="Figure 4.1. 
1766  Example of geometries imported from CAD system and converted to
1767  tessellated solids.
1768">Figure 4.1</a>).
1769
1770</p><div class="figure"><a name="fig.Geom.Solid_1"></a><div class="figure-contents"><div class="mediaobject" align="center"><img src="./AllResources/Detector/geometry.src/cad-tess-combined.jpg" align="middle" alt="Example of geometries imported from CAD system and converted to tessellated solids."></div></div><p class="title"><b>Figure 4.1. 
1771  Example of geometries imported from CAD system and converted to
1772  tessellated solids.
1773</b></p></div><p><br class="figure-break">
1774</p><p>
1775They can also be used to generate a solid bounded with a generic
1776surface made of planar facets. It is important that the supplied
1777facets shall form a fully enclose space to represent the solid.
1778</p><p>
1779Two types of facet can be used for the construction of a
1780<code class="literal">G4TessellatedSolid</code>: a triangular facet
1781(<code class="literal">G4TriangularFacet</code>) and a quadrangular facet
1782(<code class="literal">G4QuadrangularFacet</code>).
1783</p><p>
1784An example on how to generate a simple tessellated shape is
1785given below.
1786
1787</p><div class="example"><a name="programlist_Geom_1"></a><p class="title"><b>Example 4.1. 
1788An example of a simple tessellated solid with
1789<code class="literal">G4TessellatedSolid</code>.
1790</b></p><div class="example-contents"><pre class="programlisting">
1791        // First declare a tessellated solid
1792        //
1793        G4TessellatedSolid solidTarget = new G4TessellatedSolid("Solid_name");
1794
1795        // Define the facets which form the solid
1796        //
1797        G4double targetSize = 10*cm ;
1798        G4TriangularFacet *facet1 = new
1799        G4TriangularFacet (G4ThreeVector(-targetSize,-targetSize,        0.0),
1800                           G4ThreeVector(+targetSize,-targetSize,        0.0),
1801                           G4ThreeVector(        0.0,        0.0,+targetSize),
1802                           ABSOLUTE);
1803        G4TriangularFacet *facet2 = new
1804        G4TriangularFacet (G4ThreeVector(+targetSize,-targetSize,        0.0),
1805                           G4ThreeVector(+targetSize,+targetSize,        0.0),
1806                           G4ThreeVector(        0.0,        0.0,+targetSize),
1807                           ABSOLUTE);
1808        G4TriangularFacet *facet3 = new
1809        G4TriangularFacet (G4ThreeVector(+targetSize,+targetSize,        0.0),
1810                           G4ThreeVector(-targetSize,+targetSize,        0.0),
1811                           G4ThreeVector(        0.0,        0.0,+targetSize),
1812                           ABSOLUTE);
1813        G4TriangularFacet *facet4 = new
1814        G4TriangularFacet (G4ThreeVector(-targetSize,+targetSize,        0.0),
1815                           G4ThreeVector(-targetSize,-targetSize,        0.0),
1816                           G4ThreeVector(        0.0,        0.0,+targetSize),
1817                           ABSOLUTE);
1818        G4QuadrangularFacet *facet5 = new
1819        G4QuadrangularFacet (G4ThreeVector(-targetSize,-targetSize,        0.0),
1820                             G4ThreeVector(-targetSize,+targetSize,        0.0),
1821                             G4ThreeVector(+targetSize,+targetSize,        0.0),
1822                             G4ThreeVector(+targetSize,-targetSize,        0.0),
1823                             ABSOLUTE);
1824
1825        // Now add the facets to the solid
1826        //
1827        solidTarget-&gt;AddFacet((G4VFacet*) facet1);
1828        solidTarget-&gt;AddFacet((G4VFacet*) facet2);
1829        solidTarget-&gt;AddFacet((G4VFacet*) facet3);
1830        solidTarget-&gt;AddFacet((G4VFacet*) facet4);
1831        solidTarget-&gt;AddFacet((G4VFacet*) facet5);
1832
1833        Finally declare the solid is complete
1834        //
1835        solidTarget-&gt;SetSolidClosed(true);
1836</pre></div></div><p><br class="example-break">
1837</p><p>
1838The <code class="literal">G4TriangularFacet</code> class is used for the contruction
1839of <code class="literal">G4TessellatedSolid</code>. It is defined by three vertices,
1840which shall be supplied in <span class="emphasis"><em>anti-clockwise order</em></span> looking from
1841the outside of the solid where it belongs. Its constructor looks
1842like:
1843
1844</p><div class="informalexample"><pre class="programlisting">
1845        G4TriangularFacet ( const G4ThreeVector     Pt0,
1846                            const G4ThreeVector     vt1,
1847                            const G4ThreeVector     vt2,
1848                                  G4FacetVertexType fType )
1849</pre></div><p> 
1850
1851i.e., it takes 4 parameters to define the three vertices:
1852
1853</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1854    <code class="literal">G4FacetVertexType</code>
1855  </td><td>
1856    <code class="literal">ABSOLUTE</code> in which case <code class="literal">Pt0</code>,
1857    <code class="literal">vt1</code> and <code class="literal">vt2</code> 
1858    are the three vertices in anti-clockwise order looking from the outside.
1859  </td></tr><tr><td>
1860    <code class="literal">G4FacetVertexType</code>
1861  </td><td>
1862    <code class="literal">RELATIVE</code> in which case the first vertex is
1863    <code class="literal">Pt0</code>, the second vertex is <code class="literal">Pt0+vt1</code> and
1864    the third vertex is <code class="literal">Pt0+vt2</code>, all in anti-clockwise order
1865    when looking from the outside.
1866</td></tr></tbody></table></div><p>
1867</p><p>
1868The <code class="literal">G4QuadrangularFacet</code> class can be used for the
1869contruction of <code class="literal">G4TessellatedSolid</code> as well. It is defined
1870by four vertices, which shall be in the same plane and be supplied
1871in <span class="emphasis"><em>anti-clockwise order</em></span> looking from the outside of the
1872solid where it belongs. Its constructor looks like:
1873
1874</p><div class="informalexample"><pre class="programlisting">
1875        G4QuadrangularFacet ( const G4ThreeVector     Pt0,
1876                              const G4ThreeVector     vt1,
1877                              const G4ThreeVector     vt2,
1878                              const G4ThreeVector     vt3,
1879                                    G4FacetVertexType fType )
1880</pre></div><p>
1881
1882i.e., it takes 5 parameters to define the four vertices:
1883
1884</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
1885    <code class="literal">G4FacetVertexType</code>
1886  </td><td>
1887    <code class="literal">ABSOLUTE</code> in which case <code class="literal">Pt0</code>,
1888    <code class="literal">vt1</code>, <code class="literal">vt2</code> and <code class="literal">vt3</code> 
1889    are the four vertices required in anti-clockwise order when looking
1890    from the outside.
1891  </td></tr><tr><td>
1892    <code class="literal">G4FacetVertexType</code>
1893  </td><td>
1894    <code class="literal">RELATIVE</code> in which case the first vertex is
1895    <code class="literal">Pt0</code>, the second vertex is <code class="literal">Pt0+vt</code>,
1896    the third vertex is <code class="literal">Pt0+vt2</code> and the fourth vertex is
1897    <code class="literal">Pt0+vt3</code>, in anti-clockwise order when looking from the
1898    outside.
1899  </td></tr></tbody></table></div><p>
1900</p><h5><a name="id390254"></a>
1901Importing CAD models as tessellated shapes
1902</h5><p>
1903Tessellated solids can also be used to import geometrical models from CAD
1904systems (see <a href="ch04.html#fig.Geom.Solid_1" title="Figure 4.1. 
1905  Example of geometries imported from CAD system and converted to
1906  tessellated solids.
1907">Figure 4.1</a>). In order to do this, it
1908is required to convert first the CAD shapes into tessellated surfaces. A
1909way to do this is to save the shapes in the geometrical model as STEP files
1910and convert them using a tool like
1911<a href="http://www.steptools.com/products/stviewer/" target="_top">STViewer</a> or
1912<a href="http://www.trad.fr/en/" target="_top">FASTRAD</a> to
1913tessellated (faceted surfaces) solids. This strategy allows to import any shape
1914with some degree of approximation; the converted CAD models can then be
1915imported through <a href="http://cern.ch/gdml/" target="_top">GDML (Geometry Description
1916Markup Language)</a> into Geant4 and be represented as
1917<code class="literal">G4TessellatedSolid</code> shapes.
1918</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.LogVol"></a>4.1.3. 
1919Logical Volumes
1920</h3></div></div></div><p>
1921The Logical Volume manages the information associated with
1922detector elements represented by a given Solid and Material,
1923independently from its physical position in the detector.
1924</p><p>
1925A Logical Volume knows which physical volumes are contained
1926within it. It is uniquely defined to be their mother volume. A
1927Logical Volume thus represents a hierarchy of unpositioned volumes
1928whose positions relative to one another are well defined. By
1929creating Physical Volumes, which are placed instances of a Logical
1930Volume, this hierarchy or tree can be repeated.
1931</p><p>
1932A Logical Volume also manages the information relative to the
1933Visualization attributes (<a href="ch08s06.html" title="8.6. 
1934Visualization Attributes
1935">Section 8.6</a>) and
1936user-defined parameters related to tracking, electro-magnetic field
1937or cuts (through the <code class="literal">G4UserLimits</code> interface).
1938</p><p>
1939By default, tracking optimization of the geometry (voxelization)
1940is applied to the volume hierarchy identified by a logical volume.
1941It is possible to change the default behavior by choosing not to
1942apply geometry optimization for a given logical volume. This
1943feature does not apply to the case where the associated physical
1944volume is a parameterised volume; in this case, optimization is
1945always applied.
1946
1947</p><div class="informalexample"><pre class="programlisting">
1948    G4LogicalVolume( G4VSolid*             pSolid,
1949                     G4Material*           pMaterial,
1950                     const G4String&amp;       Name,
1951                     G4FieldManager*       pFieldMgr=0,
1952                     G4VSensitiveDetector* pSDetector=0,
1953                     G4UserLimits*         pULimits=0,
1954                     G4bool                Optimise=true )
1955</pre></div><p>
1956</p><p>
1957The logical volume provides a way to estimate the <span class="emphasis"><em>mass</em></span> of
1958a tree of volumes defining a detector or sub-detector. This can be
1959achieved by calling the method:
1960
1961</p><div class="informalexample"><pre class="programlisting">
1962    G4double GetMass(G4bool forced=false)
1963</pre></div><p>
1964</p><p>
1965The mass of the logical volume tree is computed from the estimated
1966geometrical volume of each solid and material associated with the
1967logical volume and its daughters. Note that this computation may
1968require a considerable amount of time, depending on the complexity
1969of the geometry tree. The returned value is cached by default and
1970can be used for successive calls, unless recomputation is forced by
1971providing <code class="literal">true</code> for the boolean argument
1972<code class="literal">forced</code> in input.
1973Computation should be forced if the geometry setup has
1974changed after the previous call.
1975</p><p>
1976Finally, the Logical Volume manages the information relative to
1977the Envelopes hierarchy required for fast Monte Carlo
1978parameterisations (<a href="ch05s02.html#sect.PhysProc.Param" title="5.2.6. 
1979Parameterization
1980">Section 5.2.6</a>).
1981</p><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.LogVol.SubReg"></a>4.1.3.1. 
1982Sub-detector Regions
1983</h4></div></div></div><p>
1984In complex geometry setups, such as those found in large detectors
1985in particle physics experiments, it is useful to think of specific
1986Logical Volumes as representing parts (sub-detectors) of the entire
1987detector setup which perform specific functions. In such setups,
1988the processing speed of a real simulation can be increased by
1989assigning specific production <span class="emphasis"><em>cuts</em></span> to each of these detector
1990parts. This allows a more detailed simulation to occur only in
1991those regions where it is required.
1992</p><p>
1993The concept of detector <span class="emphasis"><em>Region</em></span> was introduced to address
1994this need. Once the final geometry setup of the detector has been
1995defined, a region can be specified by constructing it with:
1996
1997</p><div class="informalexample"><pre class="programlisting">
1998    G4Region( const G4String&amp;          rName )
1999</pre></div><p>
2000
2001where:
2002
2003</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
2004      <code class="literal">rName</code>
2005    </td><td>
2006      String identifier for the detector region
2007    </td></tr></tbody></table></div><p>
2008</p><p>
2009A <code class="literal">G4Region</code> must then be assigned to a logical volume,
2010in order to make it a <span class="emphasis"><em>Root Logical Volume</em></span>:
2011
2012</p><div class="informalexample"><pre class="programlisting">
2013    G4Region* emCalorimeter = new G4Region("EM-Calorimeter");
2014    emCalorimeter-&gt;AddRootLogicalVolume(emCalorimeter);
2015</pre></div><p>
2016</p><p>
2017A root logical volume is the first volume at the top of the
2018hierarchy to which a given region is assigned. Once the region is
2019assigned to the root logical volume, the information is
2020automatically propagated to the volume tree, so that each daughter
2021volume shares the same region. Propagation on a tree branch will be
2022interrupted if an already existing root logical volume is
2023encountered.
2024</p><p>
2025A specific <span class="emphasis"><em>Production Cut</em></span> can be assigned to the region,
2026by defining and assigning to it a <code class="literal">G4ProductionCut</code>
2027object
2028
2029</p><div class="informalexample"><pre class="programlisting">
2030    emCalorimeter-&gt;SetProductionCuts(emCalCuts);
2031</pre></div><p>
2032</p><p>
2033<a href="ch05s04.html#sect.ProThres.Set" title="5.4.2. 
2034Set production threshold (SetCut methods)
2035">Section 5.4.2</a> describes how to define a
2036production cut. The same region can be assigned to more than one
2037root logical volume, and root logical volumes can be removed from
2038an existing region. A logical volume can have only
2039<span class="emphasis"><em>one</em></span> region assigned to it. Regions will
2040be automatically registered in a store which will take care of
2041destroying them at the end of the job. A default region with a
2042default production cut is automatically created and assigned to the
2043world volume.
2044</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.PhysVol"></a>4.1.4. 
2045Physical Volumes
2046</h3></div></div></div><p>
2047Physical volumes represent the spatial positioning of the
2048volumes describing the detector elements. Several techniques can be
2049used. They range from the simple placement of a single copy to the
2050repeated positioning using either a simple linear formula or a user
2051specified function.
2052</p><p>
2053The simple placement involves the definition of a transformation
2054matrix for the volume to be positioned. Repeated positioning is
2055defined using the number of times a volume should be replicated at
2056a given distance along a given direction. Finally it is possible to
2057define a parameterised formula to specify the position of multiple
2058copies of a volume. Details about these methods are given
2059below.
2060</p><p>
2061<span class="bold"><strong>Note</strong></span> - For geometries which vary between runs and for
2062which components of the old geometry setup are explicitely
2063-deleted-, it is required to consider the proper order of deletion
2064(which is the exact inverse of the actual construction, i.e., first
2065delete physical volumes and then logical volumes). Deleting a
2066logical volume does NOT delete its daughter volumes.
2067</p><p>
2068It is not necessary to delete the geometry setup at the end of a
2069job, the system will take care to free the volume and solid stores
2070at the end of the job. The user has to take care of the deletion of
2071any additional transformation or rotation matrices allocated
2072dinamically in his/her own application.
2073</p><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.PhysVol.PlaceSingle"></a>4.1.4.1. 
2074Placements: single positioned copy
2075</h4></div></div></div><p>
2076In this case, the Physical Volume is created by associating a
2077Logical Volume with a Rotation Matrix and a Translation vector. The
2078Rotation Matrix represents the rotation of the reference frame of
2079the considered volume relatively to its mother volume's reference
2080frame. The Translation Vector represents the translation of the
2081current volume in the reference frame of its mother volume.
2082</p><p>
2083Transformations including reflections are not allowed.
2084</p><p>
2085To create a Placement one must construct it using:
2086
2087</p><div class="informalexample"><pre class="programlisting">
2088    G4PVPlacement(       G4RotationMatrix*  pRot,
2089                   const G4ThreeVector&amp;     tlate,
2090                         G4LogicalVolume*   pCurrentLogical,
2091                   const G4String&amp;          pName,
2092                         G4LogicalVolume*   pMotherLogical,
2093                         G4bool             pMany,
2094                         G4int              pCopyNo,
2095                         G4bool             pSurfChk=false )
2096</pre></div><p>
2097
2098where:
2099
2100</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
2101    <code class="literal">pRot</code>
2102  </td><td>
2103    Rotation with respect to its mother volume
2104  </td></tr><tr><td>
2105    <code class="literal">tlate</code>
2106  </td><td>
2107    Translation with respect to its mother volume
2108  </td></tr><tr><td>
2109    <code class="literal">pCurrentLogical</code>
2110  </td><td>
2111    The associated Logical Volume
2112  </td></tr><tr><td>
2113    <code class="literal">pName</code>
2114  </td><td>
2115    String identifier for this placement
2116  </td></tr><tr><td>
2117    <code class="literal">pMotherLogical</code>
2118  </td><td>
2119    The associated mother volume
2120  </td></tr><tr><td>
2121    <code class="literal">pMany</code>
2122  </td><td>
2123    For future use. Can be set to false
2124  </td></tr><tr><td>
2125    <code class="literal">pCopyNo</code>
2126  </td><td>
2127    Integer which identifies this placement
2128  </td></tr><tr><td>
2129    <code class="literal">pSurfChk</code>
2130  </td><td>
2131    if true activates check for overlaps with existing volumes
2132  </td></tr></tbody></table></div><p>
2133</p><p>
2134Care must be taken because the rotation matrix is not copied by
2135a <code class="literal">G4PVPlacement</code>. So the user must not modify it after
2136creating a Placement that uses it. However the same rotation matrix
2137can be re-used for many volumes.
2138</p><p>
2139Currently boolean operations are not implemented at the level of
2140physical volume. So <code class="literal">pMany</code> must be false. However, an
2141alternative implementation of boolean operations exists. In this
2142approach a solid can be created from the union, intersection or
2143subtraction of two solids. See  <a href="ch04.html#sect.Geom.Solids.BoolOp" title="4.1.2.2. 
2144Solids made by Boolean operations
2145">Section 4.1.2.2</a>
2146 above for an explanation of this.
2147</p><p>
2148The mother volume must be specified for all volumes
2149<span class="emphasis"><em>except</em></span> the world volume.
2150</p><p>
2151An alternative way to specify a Placement utilizes a different
2152method to place the volume. The solid itself is moved by rotating
2153and translating it to bring it into the system of coordinates of
2154the mother volume. This <span class="emphasis"><em>active</em></span> method can be utilized using
2155the following constructor:
2156
2157</p><div class="informalexample"><pre class="programlisting">
2158    G4PVPlacement(       G4Transform3D      solidTransform,
2159                         G4LogicalVolume*   pCurrentLogical,
2160                   const G4String&amp;          pName,
2161                         G4LogicalVolume*   pMotherLogical,
2162                         G4bool             pMany,
2163                         G4int              pCopyNo,
2164                         G4bool             pSurfChk=false )
2165</pre></div><p>
2166</p><p>
2167An alternative method to specify the mother volume is to specify
2168its placed physical volume. It can be used in either of the above
2169methods of specifying the placement's position and rotation. The
2170effect will be exactly the same as for using the mother logical
2171volume.
2172</p><p>
2173Note that a Placement Volume can still represent multiple
2174detector elements. This can happen if several copies exist of the
2175mother logical volume. Then different detector elements will belong
2176to different branches of the tree of the hierarchy of geometrical
2177volumes.
2178</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.PhysVol.RepeatVol"></a>4.1.4.2. 
2179Repeated volumes
2180</h4></div></div></div><p>
2181In this case, a single Physical Volume represents multiple copies
2182of a volume within its mother volume, allowing to save memory. This
2183is normally done when the volumes to be positioned follow a well
2184defined rotational or translational symmetry along a Cartesian or
2185cylindrical coordinate. The Repeated Volumes technique is available
2186for volumes described by CSG solids.
2187</p><h5><a name="id398081"></a>
2188Replicas:
2189</h5><p>
2190Replicas are <span class="emphasis"><em>repeated volumes</em></span> in the case when the
2191multiple copies of the volume are all identical. The coordinate
2192axis and the number of replicas need to be specified for the
2193program to compute at run time the transformation matrix
2194corresponding to each copy.
2195
2196</p><div class="informalexample"><pre class="programlisting">
2197    G4PVReplica( const G4String&amp;          pName,
2198                       G4LogicalVolume*   pCurrentLogical,
2199                       G4LogicalVolume*   pMotherLogical, // OR G4VPhysicalVolume*
2200                 const EAxis              pAxis,
2201                 const G4int              nReplicas,
2202                 const G4double           width,
2203                 const G4double           offset=0 )
2204</pre></div><p>
2205
2206where:
2207
2208</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
2209    <code class="literal">pName</code>
2210  </td><td>
2211    String identifier for the replicated volume
2212  </td></tr><tr><td>
2213    <code class="literal">pCurrentLogical</code>
2214  </td><td>
2215    The associated Logical Volume
2216   </td></tr><tr><td>
2217    <code class="literal">pMotherLogical</code>
2218  </td><td>
2219    The associated mother volume
2220  </td></tr><tr><td>
2221    <code class="literal">pAxis</code>
2222  </td><td>
2223    The axis along with the replication is applied
2224  </td></tr><tr><td>
2225    <code class="literal">nReplicas</code>
2226  </td><td>
2227    The number of replicated volumes
2228  </td></tr><tr><td>
2229    <code class="literal">width</code>
2230  </td><td>
2231    The width of a single replica along the axis of replication
2232  </td></tr><tr><td>
2233    <code class="literal">offset</code>
2234  </td><td>
2235    Possible offset associated to mother offset along the axis of
2236    replication
2237  </td></tr></tbody></table></div><p>
2238</p><p>
2239<code class="literal">G4PVReplica</code> represents <code class="literal">nReplicas</code> volumes
2240differing only in their positioning, and completely <span class="bold"><strong>filling</strong></span>
2241the containing mother volume. Consequently if a
2242<code class="literal">G4PVReplica</code> is 'positioned' inside a given mother it
2243<span class="bold"><strong>MUST</strong></span> be the mother's only daughter volume. Replica's
2244correspond to divisions or slices that completely fill the mother
2245volume and have no offsets. For Cartesian axes, slices are
2246considered perpendicular to the axis of replication.
2247</p><p>
2248The replica's positions are calculated by means of a linear
2249formula. Replication may occur along:
2250
2251</p><div class="itemizedlist"><ul type="disc" compact><li><p>
2252    <span class="emphasis"><em>Cartesian axes <code class="literal">(kXAxis,kYAxis,kZAxis)</code></em></span>
2253    </p><p>
2254    The replications, of specified width have coordinates of form
2255    <code class="literal">(-width*(nReplicas-1)*0.5+n*width,0,0)</code>
2256    </p><p>
2257    </p><p>
2258    where <code class="literal">n=0.. nReplicas-1</code> for the case of <code class="literal">kXAxis</code>,
2259    and are unrotated.
2260    </p><p>
2261  </p></li><li><p>
2262    <span class="emphasis"><em>Radial axis (cylindrical polar) <code class="literal">(kRho)</code></em></span>
2263    </p><p>
2264    The replications are cons/tubs sections, centred on the origin and
2265    are unrotated.
2266    </p><p>
2267    </p><p>
2268    They have radii of <code class="literal">width*n+offset</code> to
2269    <code class="literal">width*(n+1)+offset</code> where
2270    <code class="literal">n=0..nReplicas-1</code>
2271    </p><p>
2272  </p></li><li><p>
2273    <span class="emphasis"><em>Phi axis (cylindrical polar) <code class="literal">(kPhi)</code></em></span>
2274    </p><p>
2275    The replications are <span class="emphasis"><em>phi sections</em></span> or
2276    <span class="emphasis"><em>wedges</em></span>, and of cons/tubs form.
2277    </p><p>
2278    </p><p>
2279    They have <code class="literal">phi</code> of <code class="literal">offset+n*width</code> to
2280    <code class="literal">offset+(n+1)*width</code> where
2281    <code class="literal">n=0..nReplicas-1</code>
2282    </p><p>
2283  </p></li></ul></div><p>
2284</p><p>
2285The coordinate system of the replicas is at the centre of each
2286replica for the cartesian axis. For the radial case, the coordinate
2287system is unchanged from the mother. For the <code class="literal">phi</code> axis, the
2288new coordinate system is rotated such that the X axis bisects the
2289angle made by each wedge, and Z remains parallel to the mother's Z
2290axis.
2291</p><p>
2292The solid associated via the replicas' logical volume should
2293have the dimensions of the first volume created and must be of the
2294correct symmetry/type, in order to assist in good
2295visualisation.
2296</p><p>
2297ex. For X axis replicas in a box, the solid should be another box
2298with the dimensions of the replications. (same Y &amp; Z dimensions
2299as mother box, X dimension = mother's X dimension/nReplicas).
2300</p><p>
2301Replicas may be placed inside other replicas, provided the above
2302rule is observed. Normal placement volumes may be placed inside
2303replicas, provided that they do not intersect the mother's or any
2304previous replica's boundaries. Parameterised volumes may not be
2305placed inside.
2306</p><p>
2307Because of these rules, it is not possible to place any other
2308volume inside a replication in <code class="literal">radius</code>.
2309</p><p>
2310The world volume <span class="emphasis"><em>cannot</em></span> act as a replica, therefore it
2311cannot be sliced.
2312</p><p>
2313During tracking, the translation + rotation associated with each
2314<code class="literal">G4PVReplica</code> object is modified according to the currently
2315'active' replication. The solid is not modified and consequently
2316has the wrong parameters for the cases of <code class="literal">phi</code> and
2317<code class="literal">r</code> replication and for when the cross-section of the mother
2318is not constant along the replication.
2319</p><p>
2320Example:
2321
2322</p><div class="example"><a name="programlist_Geom.PhysVol_1"></a><p class="title"><b>Example 4.2. 
2323An example of simple replicated volumes with <code class="literal">G4PVReplica</code>.
2324</b></p><div class="example-contents"><pre class="programlisting">
2325           G4PVReplica repX("Linear Array",
2326                            pRepLogical,
2327                            pContainingMother,
2328                            kXAxis, 5, 10*mm);
2329
2330           G4PVReplica repR("RSlices",
2331                            pRepRLogical,
2332                            pContainingMother,
2333                            kRho, 5, 10*mm, 0);
2334
2335           G4PVReplica repRZ("RZSlices",
2336                             pRepRZLogical,
2337                             &amp;repR,
2338                             kZAxis, 5, 10*mm);
2339
2340           G4PVReplica repRZPhi("RZPhiSlices",
2341                                pRepRZPhiLogical,
2342                                &amp;repRZ,
2343                                kPhi, 4, M_PI*0.5*rad, 0);
2344</pre></div></div><p><br class="example-break">
2345</p><p>
2346<code class="literal">RepX</code> is an array of 5 replicas of width 10*mm,
2347positioned inside and completely filling the volume pointed by
2348<code class="literal">pContainingMother</code>. The mother's X length must be
23495*10*mm=50*mm (for example, if the mother's solid were a Box of
2350half lengths [25,25,25] then the replica's solid must be a box of
2351half lengths [25,25,5]).
2352</p><p>
2353If the containing mother's solid is a tube of radius 50*mm and
2354half Z length of 25*mm, <code class="literal">RepR</code> divides the mother tube into
23555 cylinders (hence the solid associated with <code class="literal">pRepRLogical</code>
2356must be a tube of radius 10*mm, and half Z length 25*mm);
2357<code class="literal">repRZ</code> divides it into 5 shorter cylinders (the solid
2358associated with <code class="literal">pRepRZLogical</code> must be a tube of radius
235910*mm, and half Z length 5*mm); finally, <code class="literal">repRZPhi</code> divides
2360it into 4 tube segments with full angle of 90 degrees (the solid
2361associated with <code class="literal">pRepRZPhiLogical</code> must be a tube segment of
2362radius 10*mm, half Z length 5*mm and delta phi of
2363M_PI*0.5*rad).
2364</p><p>
2365No further volumes may be placed inside these replicas. To do so
2366would result in intersecting boundaries due to the <code class="literal">r</code>
2367replications.
2368</p><h5><a name="id398650"></a>
2369Parameterised Volumes:
2370</h5><p>
2371Parameterised Volumes are <span class="emphasis"><em>repeated volumes</em></span> in the case in
2372which the multiple copies of a volume can be different in size,
2373solid type, or material. The solid's type, its dimensions, the
2374material and the transformation matrix can all be parameterised in
2375function of the copy number, both when a strong symmetry exist and
2376when it does not. The user implements the desired parameterisation
2377function and the program computes and updates automatically at run
2378time the information associated to the Physical Volume.
2379</p><p>
2380An example of creating a parameterised volume (by dimension and
2381position) exists in novice example N02. The implementation is
2382provided in the two classes <code class="literal">ExN02DetectorConstruction</code> and
2383<code class="literal">ExN02ChamberParameterisation</code>.
2384</p><p>
2385To create a parameterised volume, one must first create its
2386logical volume like <code class="literal">trackerChamberLV</code> below. Then one must
2387create his own parameterisation class
2388(<span class="emphasis"><em>ExN02ChamberParameterisation</em></span>) and instantiate an object of
2389this class (<code class="literal">chamberParam</code>). We will see how to create the
2390parameterisation below.
2391
2392</p><div class="example"><a name="programlist_Geom.PhysVol_2"></a><p class="title"><b>Example 4.3. 
2393An example of Parameterised volumes.
2394</b></p><div class="example-contents"><pre class="programlisting">
2395  //------------------------------
2396  // Tracker segments
2397  //------------------------------
2398  // An example of Parameterised volumes
2399  // dummy values for G4Box -- modified by parameterised volume
2400  G4VSolid * solidChamber =
2401                new G4Box("chamberBox", 10.*cm, 10.*cm, 10.*cm);
2402
2403  G4LogicalVolume * trackerChamberLV
2404    = new G4LogicalVolume(solidChamber, Aluminum, "trackerChamberLV");
2405  G4VPVParameterisation * chamberParam
2406    = new ExN02ChamberParameterisation(
2407                         6,           //  NoChambers,
2408                        -240.*cm,     //  Z of centre of first
2409                        80*cm,        //  Z spacing of centres
2410                        20*cm,        //  Width Chamber,
2411                        50*cm,        //  lengthInitial,
2412                        trackerSize*2.); //  lengthFinal
2413
2414  G4VPhysicalVolume *trackerChamber_phys
2415    = new G4PVParameterised("TrackerChamber_parameterisedPV",
2416                       trackerChamberLV, // Its logical volume
2417                       logicTracker,     // Mother logical volume
2418                       kUndefined,       // Allow default voxelising -- no axis
2419                       6,                // Number of chambers
2420                       chamberParam);    // The parameterisation
2421  // "kUndefined" is the suggested choice, giving 3D voxelisation (i.e. along the three
2422  // cartesian axes, as is applied for placements.
2423  //
2424  // Note:  In some cases where volume have clear separation along a single axis,
2425  // this axis (eg kZAxis) can be used to choose (force) optimisation only along
2426  // this axis in geometrical calculations.
2427  // When an axis is given it forces the use of one-dimensional voxelisation.
2428</pre></div></div><p><br class="example-break">
2429</p><p>
2430The general constructor is:
2431
2432</p><div class="informalexample"><pre class="programlisting">
2433    G4PVParameterised( const G4String&amp;              pName,
2434                             G4LogicalVolume*       pCurrentLogical,
2435                             G4LogicalVolume*       pMotherLogical, // OR G4VPhysicalVolume*
2436                       const EAxis                  pAxis,
2437                       const G4int                  nReplicas,
2438                             G4VPVParameterisation* pParam,
2439                             G4bool                 pSurfChk=false )
2440 
2441</pre></div><p>
2442</p><p>
2443Note that for a parameterised volume the user must always
2444specify a mother volume. So the world volume can <span class="emphasis"><em>never</em></span> be a
2445parameterised volume, nor it can be sliced. The mother volume can
2446be specified either as a physical or a logical volume.
2447</p><p>
2448<code class="literal">pAxis</code> specifies the tracking optimisation algorithm to
2449apply: if a valid axis (the axis along which the parameterisation
2450is performed) is specified, a simple one-dimensional voxelisation
2451algorithm is applied; if "kUndefined" is specified instead, the
2452default three-dimensional voxelisation algorithm applied for normal
2453placements will be activated. In the latter case, more voxels will
2454be generated, therefore a greater amount of memory will be consumed
2455by the optimisation algorithm.
2456</p><p>
2457<code class="literal">pSurfChk</code> if <code class="literal">true</code> activates a check for
2458overlaps with existing volumes or paramaterised instances.
2459</p><p>
2460The parameterisation mechanism associated to a parameterised
2461volume is defined in the parameterisation class and its methods.
2462Every parameterisation must create two methods:
2463
2464</p><div class="itemizedlist"><ul type="disc" compact><li><p>
2465    <code class="literal">ComputeTransformation</code> defines where one of the copies
2466    is placed,
2467  </p></li><li><p>
2468    <code class="literal">ComputeDimensions</code> defines the size of one copy, and
2469  </p></li><li><p>
2470    a constructor that initializes any member variables that are
2471    required.
2472  </p></li></ul></div><p>
2473
2474</p><p>
2475An example is <code class="literal">ExN02ChamberParameterisation</code> that
2476parameterises a series of boxes of different sizes
2477
2478</p><div class="example"><a name="programlist_Geom.PhysVol_3"></a><p class="title"><b>Example 4.4. 
2479An example of Parameterised boxes of different sizes.
2480</b></p><div class="example-contents"><pre class="programlisting">
2481 class ExN02ChamberParameterisation : public G4VPVParameterisation
2482 {
2483   ...
2484   void ComputeTransformation(const G4int       copyNo,
2485                              G4VPhysicalVolume *physVol) const;
2486
2487   void ComputeDimensions(G4Box&amp;              trackerLayer,
2488                          const G4int             copyNo,
2489                          const G4VPhysicalVolume *physVol) const;
2490   ...
2491 }
2492</pre></div></div><p><br class="example-break">
2493</p><p>
2494
2495</p><p>
2496These methods works as follows:
2497</p><p>
2498
2499</p><p>
2500The <code class="literal">ComputeTransformation</code> method is called with a copy
2501number for the instance of the parameterisation under
2502consideration. It must compute the transformation for this copy,
2503and set the physical volume to utilize this transformation:
2504
2505</p><div class="informalexample"><pre class="programlisting">
2506 void ExN02ChamberParameterisation::ComputeTransformation
2507 (const G4int copyNo,G4VPhysicalVolume *physVol) const
2508 {
2509   G4double      Zposition= fStartZ + copyNo * fSpacing;
2510   G4ThreeVector origin(0,0,Zposition);
2511   physVol-&gt;SetTranslation(origin);
2512   physVol-&gt;SetRotation(0);
2513 }
2514</pre></div><p>
2515</p><p>
2516
2517</p><p>
2518Note that the translation and rotation given in this scheme are
2519those for the frame of coordinates (the <span class="emphasis"><em>passive</em></span> method).
2520They are <span class="bold"><strong>not</strong></span> for the
2521<span class="emphasis"><em>active</em></span> method, in which the
2522solid is rotated into the mother frame of coordinates.
2523</p><p>
2524
2525</p><p>
2526Similarly the <code class="literal">ComputeDimensions</code> method is used to set
2527the size of that copy.
2528
2529</p><div class="informalexample"><pre class="programlisting">
2530 void ExN02ChamberParameterisation::ComputeDimensions
2531 (G4Box &amp; trackerChamber, const G4int copyNo,
2532  const G4VPhysicalVolume * physVol) const
2533 {
2534   G4double  halfLength= fHalfLengthFirst + (copyNo-1) * fHalfLengthIncr;
2535   trackerChamber.SetXHalfLength(halfLength);
2536   trackerChamber.SetYHalfLength(halfLength);
2537   trackerChamber.SetZHalfLength(fHalfWidth);
2538 }
2539</pre></div><p> 
2540</p><p>
2541
2542</p><p>
2543The user must ensure that the type of the first argument of this
2544method (in this example <code class="literal">G4Box &amp;</code>) corresponds to the
2545type of object the user give to the logical volume of parameterised
2546physical volume.
2547</p><p>
2548
2549</p><p>
2550More advanced usage allows the user:
2551
2552</p><div class="itemizedlist"><ul type="disc" compact><li><p>
2553    to change the type of solid by creating a <code class="literal">ComputeSolid</code>
2554    method, or
2555  </p></li><li><p>
2556    to change the material of the volume by creating a
2557    <code class="literal">ComputeMaterial</code> method. This method can also utilise
2558    information from a parent or other ancestor volume (see the Nested
2559    Parameterisation below.)
2560  </p></li></ul></div><p>
2561
2562for the parameterisation.
2563</p><p>
2564
2565</p><p>
2566Example N07 shows a simple parameterisation by material. A more
2567complex example is provided in
2568<code class="literal">examples/extended/medical/DICOM</code>, where a phantom grid of
2569cells is built using a parameterisation by material defined through
2570a map.
2571</p><p>
2572
2573</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
2574Currently for many cases it is not possible to add
2575daughter volumes to a parameterised volume. Only parameterised
2576volumes all of whose solids have the same size are allowed to
2577contain daughter volumes. When the size or type of solid varies,
2578adding daughters is not supported.
2579</p><p>
2580So the full power of parameterised volumes can be used only for
2581"leaf" volumes, which contain no other volumes.
2582</p></div><p>
2583
2584
2585
2586</p><h5><a name="id399003"></a>
2587Advanced parameterisations for 'nested' parameterised volumes
2588</h5><p>
2589
2590</p><p>
2591A new type of parameterisation enables a user to have the
2592daughter's material also depend on the copy number of the parent
2593when a parameterised volume (daughter) is located inside another
2594(parent) repeated volume. The parent volume can be a replica, a
2595parameterised volume, or a division if the key feature of modifying
2596its contents is utilised. (Note: a 'nested' parameterisation inside
2597a placement volume is not supported, because all copies of a
2598placement volume must be identical at all levels.)
2599</p><p>
2600
2601</p><p>
2602In such a " nested" parameterisation , the user must provide a
2603<code class="literal">ComputeMaterial</code> method that utilises the new argument that
2604represents the touchable history of the parent volume:
2605
2606</p><div class="informalexample"><pre class="programlisting">
2607// Sample Parameterisation
2608class SampleNestedParameterisation : public G4VNestedParameterisation
2609{
2610 public:
2611   // .. other methods ...
2612    // Mandatory method, required and reason for this class
2613    virtual G4Material* ComputeMaterial(G4VPhysicalVolume *currentVol,
2614                                                           const G4int no_lev,
2615                                                           const G4VTouchable *parentTouch);
2616 private:
2617    G4Material *material1, *material2; 
2618};
2619</pre></div><p> 
2620</p><p>
2621
2622</p><p>
2623The implementation of the method can utilise any information
2624from a parent or other ancestor volume of its parameterised
2625physical volume, but typically it will use only the copy
2626number:
2627
2628</p><div class="informalexample"><pre class="programlisting"> 
2629 G4Material*
2630 SampleNestedParameterisation::ComputeMaterial(G4VPhysicalVolume *currentVol,
2631                                               const G4int no_lev,
2632                                               const G4VTouchable *parentTouchable)
2633 {
2634    G4Material *material=0;
2635       
2636    // Get the information about the parent volume
2637    G4int no_parent= parentTouchable-&gt;GetReplicaNumber();
2638    G4int no_total= no_parent + no_lev;
2639    // A simple 'checkerboard' pattern of two materials
2640    if( no_total / 2 == 1 ) material= material1;
2641    else  material= material2;
2642    // Set the material to the current logical volume
2643    G4LogicalVolume* currentLogVol= currentVol-&gt;GetLogicalVolume();
2644    currentLogVol-&gt;SetMaterial( material );
2645    return material;
2646 }
2647</pre></div><p> 
2648</p><p>
2649
2650</p><p>
2651Nested parameterisations are suitable for the case of regular,
2652'voxel' geometries in which a large number of 'equal' volumes are
2653required, and their only difference is in their material. By
2654creating two (or more) levels of parameterised physical volumes it
2655is possible to divide space, while requiring only limited
2656additional memory for very fine-level optimisation. This provides
2657fast navigation. Alternative implementations, taking into account
2658the regular structure of such geometries in navigation are under
2659study.
2660</p><p>
2661
2662
2663</p><h5><a name="id399078"></a>
2664Divisions of Volumes
2665</h5><p>
2666
2667</p><p>
2668Divisions in Geant4 are implemented as a specialized type of
2669parameterised volumes.
2670</p><p>
2671
2672</p><p>
2673They serve to divide a volume into identical copies along one of
2674its axes, providing the possibility to define an <span class="emphasis"><em>offset</em></span>, and
2675without the limitation that the daugthers have to fill the mother
2676volume as it is the case for the replicas. In the case, for
2677example, of a tube divided along its radial axis, the copies are
2678not strictly identical, but have increasing radii, although their
2679widths are constant.
2680</p><p>
2681
2682</p><p>
2683To divide a volume it will be necessary to provide:
2684
2685</p><div class="orderedlist"><ol type="1" compact><li><p>
2686    the axis of division, and
2687  </p></li><li><p>
2688    either
2689    </p><div class="itemizedlist"><ul type="disc" compact><li><p>
2690        the number of divisions (so that the width of each division
2691        will be automatically calculated), or
2692      </p></li><li><p>
2693        the division width (so that the number of divisions will be
2694        automatically calculated to fill as much of the mother as
2695        possible), or
2696      </p></li><li><p>
2697        both the number of divisions and the division width (this is
2698        especially designed for the case where the copies do not fully fill
2699        the mother).
2700      </p></li></ul></div><p>
2701  </p></li></ol></div><p>
2702</p><p>
2703
2704</p><p>
2705An <span class="emphasis"><em>offset</em></span> can be defined so that the first copy will
2706start at some distance from the mother wall. The dividing copies
2707will be then distributed to occupy the rest of the volume.
2708</p><p>
2709
2710</p><p>
2711There are three constructors, corresponding to the three input
2712possibilities described above:
2713
2714</p><div class="itemizedlist"><ul type="disc" compact><li><p>
2715    Giving only the number of divisions:
2716
2717    </p><div class="informalexample"><pre class="programlisting">
2718     G4PVDivision( const G4String&amp; pName,
2719                         G4LogicalVolume* pCurrentLogical,
2720                         G4LogicalVolume* pMotherLogical,
2721                   const EAxis pAxis,
2722                   const G4int nDivisions,
2723                   const G4double offset )
2724    </pre></div><p>
2725  </p></li><li><p>
2726    Giving only the division width:
2727
2728    </p><div class="informalexample"><pre class="programlisting">
2729     G4PVDivision( const G4String&amp; pName,
2730                         G4LogicalVolume* pCurrentLogical,
2731                         G4LogicalVolume* pMotherLogical,
2732                   const EAxis pAxis,
2733                   const G4double width,
2734                   const G4double offset )
2735    </pre></div><p>
2736  </p></li><li><p>
2737    Giving the number of divisions and the division width:
2738
2739    </p><div class="informalexample"><pre class="programlisting">
2740     G4PVDivision( const G4String&amp; pName,
2741                         G4LogicalVolume* pCurrentLogical,
2742                         G4LogicalVolume* pMotherLogical,
2743                   const EAxis pAxis,
2744                   const G4int nDivisions,
2745                   const G4double width,
2746                   const G4double offset )
2747    </pre></div><p>
2748  </p></li></ul></div><p>
2749
2750where:
2751
2752</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
2753    <code class="literal">pName</code>
2754  </td><td>
2755    String identifier for the replicated volume
2756  </td></tr><tr><td>
2757    <code class="literal">pCurrentLogical</code>
2758  </td><td>
2759    The associated Logical Volume
2760  </td></tr><tr><td>
2761    <code class="literal">pMotherLogical</code>
2762  </td><td>
2763    The associated mother Logical Volume
2764  </td></tr><tr><td>
2765    <code class="literal">pAxis</code>
2766  </td><td>
2767    The axis along which the division is applied
2768  </td></tr><tr><td>
2769    <code class="literal">nDivisions</code>
2770  </td><td>
2771    The number of divisions
2772  </td></tr><tr><td>
2773    <code class="literal">width</code>
2774  </td><td>
2775    The width of a single division along the axis
2776  </td></tr><tr><td>
2777    <code class="literal">offset</code>
2778  </td><td>
2779    Possible offset associated to the mother along the axis of division
2780  </td></tr></tbody></table></div><p>
2781</p><p>
2782
2783</p><p>
2784The parameterisation is calculated automatically using the
2785values provided in input. Therefore the dimensions of the solid
2786associated with <code class="literal">pCurrentLogical</code> will not be used, but
2787recomputed through the
2788<code class="literal">G4VParameterisation::ComputeDimension()</code> method.
2789</p><p>
2790
2791</p><p>
2792Since <code class="literal">G4VPVParameterisation</code> may have different
2793<code class="literal">ComputeDimension()</code> methods for each solid type, the user
2794must provide a solid that is of the same type as of the one
2795associated to the mother volume.
2796</p><p>
2797
2798</p><p>
2799As for any replica, the coordinate system of the divisions is
2800related to the centre of each division for the cartesian axis. For
2801the radial axis, the coordinate system is the same of the mother
2802volume. For the phi axis, the new coordinate system is rotated such
2803that the X axis bisects the angle made by each wedge, and Z remains
2804parallel to the mother's Z axis.
2805</p><p>
2806
2807</p><p>
2808As divisions are parameterised volumes with constant dimensions,
2809they may be placed inside other divisions, except in the case of
2810divisions along the radial axis.
2811</p><p>
2812
2813</p><p>
2814It is also possible to place other volumes inside a volume where a
2815division is placed.
2816</p><p>
2817
2818</p><p>
2819The list of volumes that currently support divisioning and the
2820possible division axis are summarised below:
2821
2822</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>
2823    <code class="literal">G4Box</code>
2824  </td><td>
2825    <code class="literal">kXAxis</code>, <code class="literal">kYAxis</code>, <code class="literal">kZAxis</code>
2826  </td></tr><tr><td>
2827    <code class="literal">G4Tubs</code>
2828  </td><td>
2829    <code class="literal">kRho</code>, <code class="literal">kPhi</code>, <code class="literal">kZAxis</code>
2830  </td></tr><tr><td>
2831    <code class="literal">G4Cons</code>
2832  </td><td>
2833    <code class="literal">kRho</code>, <code class="literal">kPhi</code>, <code class="literal">kZAxis</code>
2834  </td></tr><tr><td>
2835    <code class="literal">G4Trd</code>
2836  </td><td>
2837    <code class="literal">kXAxis</code>, <code class="literal">kYAxis</code>, <code class="literal">kZAxis</code>
2838  </td></tr><tr><td>
2839    <code class="literal">G4Para</code>
2840  </td><td>
2841    <code class="literal">kXAxis</code>, <code class="literal">kYAxis</code>, <code class="literal">kZAxis</code>
2842  </td></tr><tr><td>
2843    <code class="literal">G4Polycone</code>
2844  </td><td>
2845    <code class="literal">kRho</code>, <code class="literal">kPhi</code>, <code class="literal">kZAxis</code> (*)
2846  </td></tr><tr><td>
2847    <code class="literal">G4Polyhedra</code>
2848  </td><td>
2849    <code class="literal">kRho</code>, <code class="literal">kPhi</code>, <code class="literal">kZAxis</code> (**)
2850  </td></tr></tbody></table></div><p>
2851</p><p>
2852
2853
2854</p><p>
2855(*) - <code class="literal">G4Polycone</code>:
2856
2857</p><div class="itemizedlist"><ul type="disc" compact><li><p>
2858    <code class="literal">kZAxis</code> - the number of divisions has to be the same as
2859    solid sections, (i.e. <code class="literal">numZPlanes-1</code>), the width will
2860    <span class="emphasis"><em>not</em></span> be taken into account.</p></li></ul></div><p>
2861</p><p>
2862
2863</p><p>
2864(**) - <code class="literal">G4Polyhedra</code>:
2865
2866</p><div class="itemizedlist"><ul type="disc" compact><li><p>
2867    <code class="literal">kPhi</code> - the number of divisions has to be the same as
2868    solid sides, (i.e. <code class="literal">numSides</code>), the width will
2869    <span class="emphasis"><em>not</em></span> be taken into account.
2870  </p></li><li><p>
2871    <code class="literal">kZAxis</code> - the number of divisions has to be the same as
2872    solid sections, (i.e. <code class="literal">numZPlanes-1</code>), the width will
2873    <span class="emphasis"><em>not</em></span> be taken into account.
2874  </p></li></ul></div><p>
2875</p><p>
2876
2877</p><p>
2878In the case of division along <code class="literal">kRho</code> of <code class="literal">G4Cons</code>,
2879<code class="literal">G4Polycone</code>, <code class="literal">G4Polyhedra</code>, if width is provided, it
2880is taken as the width at the <code class="literal">-Z</code> radius; the width at other
2881radii will be scaled to this one.
2882</p><p>
2883
2884</p><p>
2885Examples are given below in listings
2886<a href="ch04.html#programlist_Geom.PhysVol_3" title="Example 4.4. 
2887An example of Parameterised boxes of different sizes.
2888">Example 4.4</a> and
2889<a href="ch04.html#programlist_Geom.PhysVol_4" title="Example 4.5. 
2890An example of a box division along different axes, with or without offset.
2891">Example 4.5</a>.
2892
2893</p><div class="example"><a name="programlist_Geom.PhysVol_4"></a><p class="title"><b>Example 4.5. 
2894An example of a box division along different axes, with or without offset.
2895</b></p><div class="example-contents"><pre class="programlisting">
2896 G4Box* motherSolid = new G4Box("motherSolid", 0.5*m, 0.5*m, 0.5*m);
2897 G4LogicalVolume* motherLog = new G4LogicalVolume(motherSolid, material, "mother",0,0,0);
2898 G4Para* divSolid = new G4Para("divSolid", 0.512*m, 1.21*m, 1.43*m);
2899 G4LogicalVolume* childLog = new G4LogicalVolume(divSolid, material, "child",0,0,0);
2900
2901 G4PVDivision divBox1("division along X giving nDiv",
2902                      childLog, motherLog, kXAxis, 5, 0.);
2903
2904 G4PVDivision divBox2("division along X giving width and offset",
2905                      childLog, motherLog, kXAxis, 0.1*m, 0.45*m);
2906
2907 G4PVDivision divBox3("division along X giving nDiv, width and offset",
2908                      childLog, motherLog, kXAxis, 3, 0.1*m, 0.5*m);
2909</pre></div></div><p><br class="example-break">
2910
2911</p><div class="itemizedlist"><ul type="disc" compact><li><p>
2912    <code class="literal">divBox1</code> is a division of a box along its <code class="literal">X</code>
2913    axis in 5 equal copies. Each copy will have a dimension in meters
2914    of <code class="literal">[0.2, 1., 1.]</code>.
2915  </p></li><li><p>
2916    <code class="literal">divBox2</code> is a division of the same box along its
2917    <code class="literal">X</code> axis with a width of <code class="literal">0.1</code> meters and
2918    an offset of <code class="literal">0.5</code> meters. As the mother dimension along
2919    <code class="literal">X</code> of
2920    <code class="literal">1</code> meter (<code class="literal">0.5*m</code> of halflength),
2921    the division will
2922    be sized in total <code class="literal">1 - 0.45 = 0.55</code> meters. Therefore,
2923    there's space for 5 copies, the first extending from <code class="literal">-0.05</code>
2924    to <code class="literal">0.05</code> meters in the mother's frame and the last from
2925    <code class="literal">0.35</code> to <code class="literal">0.45</code> meters.
2926  </p></li><li><p>
2927    <code class="literal">divBox3</code> is a division of the same box along its
2928    <code class="literal">X</code> axis in 3 equal copies of width <code class="literal">0.1</code> 
2929    meters and an offset of <code class="literal">0.5</code> meters.
2930    The first copy will extend from
2931    <code class="literal">0.</code> to <code class="literal">0.1</code> meters in the mother's frame
2932    and the last from <code class="literal">0.2</code> to <code class="literal">0.3</code> 
2933    meters.
2934  </p></li></ul></div><p>
2935</p><p>
2936
2937</p><div class="example"><a name="programlist_Geom.PhysVol_5"></a><p class="title"><b>Example 4.6. 
2938An example of division of a polycone.
2939</b></p><div class="example-contents"><pre class="programlisting">
2940  G4double* zPlanem = new G4double[3];
2941            zPlanem[0]= -1.*m;
2942            zPlanem[1]= -0.25*m;
2943            zPlanem[2]=  1.*m;
2944  G4double* rInnerm = new G4double[3];
2945            rInnerm[0]=0.;
2946            rInnerm[1]=0.1*m;
2947            rInnerm[2]=0.5*m;
2948  G4double* rOuterm  = new G4double[3];
2949            rOuterm[0]=0.2*m;
2950            rOuterm[1]=0.4*m;
2951            rOuterm[2]=1.*m;
2952  G4Polycone* motherSolid = new G4Polycone("motherSolid", 20.*deg, 180.*deg,
2953                                           3, zPlanem, rInnerm, rOuterm);
2954  G4LogicalVolume* motherLog = new G4LogicalVolume(motherSolid, material, "mother",0,0,0);
2955
2956  G4double* zPlaned = new G4double[3];
2957            zPlaned[0]= -3.*m;
2958            zPlaned[1]= -0.*m;
2959            zPlaned[2]=  1.*m;
2960  G4double* rInnerd = new G4double[3];
2961            rInnerd[0]=0.2;
2962            rInnerd[1]=0.4*m;
2963            rInnerd[2]=0.5*m;
2964  G4double* rOuterd  = new G4double[3];
2965            rOuterd[0]=0.5*m;
2966            rOuterd[1]=0.8*m;
2967            rOuterd[2]=2.*m;
2968  G4Polycone* divSolid = new G4Polycone("divSolid", 0.*deg, 10.*deg,
2969                                        3, zPlaned, rInnerd, rOuterd);
2970  G4LogicalVolume* childLog = new G4LogicalVolume(divSolid, material, "child",0,0,0);
2971
2972  G4PVDivision divPconePhiW("division along phi giving width and offset",
2973                            childLog, motherLog, kPhi, 30.*deg, 60.*deg);
2974
2975  G4PVDivision divPconeZN("division along Z giving nDiv and offset",
2976                          childLog, motherLog, kZAxis, 2, 0.1*m);
2977</pre></div></div><p><br class="example-break">
2978
2979</p><div class="itemizedlist"><ul type="disc" compact><li><p>
2980    <code class="literal">divPconePhiW</code> is a division of a polycone along its
2981    <code class="literal">phi</code> axis in equal copies of width 30 degrees with an
2982    offset of 60 degrees. As the mother extends from 0 to 180 degrees,
2983    there's space for 4 copies. All the copies have a starting angle of
2984    20 degrees (as for the mother) and a <code class="literal">phi</code> extension of 30
2985    degrees. They are rotated around the <code class="literal">Z</code> axis by 60 and 30
2986    degrees, so that the first copy will extend from 80 to 110 and the
2987    last from 170 to 200 degrees.
2988  </p></li><li><p>
2989    <code class="literal">divPconeZN</code> is a division of the same polycone along
2990    its <code class="literal">Z</code> axis. As the mother polycone has two sections, it
2991    will be divided in two one-section polycones, the first one
2992    extending from -1 to -0.25 meters, the second from -0.25 to 1
2993    meters. Although specified, the offset will not be used.
2994  </p></li></ul></div><p>
2995</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Touch"></a>4.1.5. 
2996Touchables: Uniquely Identifying a Volume
2997</h3></div></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Touch.Intro"></a>4.1.5.1. 
2998Introduction to Touchables
2999</h4></div></div></div><p>
3000A <span class="emphasis"><em>touchable</em></span> for a volume serves the purpose of providing
3001a unique identification for a detector element. This can be useful
3002for description of the geometry alternative to the one used by the
3003Geant4 tracking system, such as a Sensitive Detectors based
3004read-out geometry, or a parameterised geometry for fast Monte
3005Carlo. In order to create a <span class="emphasis"><em>touchable volume</em></span>, several
3006techniques can be implemented: for example, in Geant4 touchables
3007are implemented as solids associated to a transformation-matrix in
3008the global reference system, or as a hierarchy of physical volumes
3009up to the root of the geometrical tree.
3010</p><p>
3011A touchable is a geometrical entity (volume or solid) which has
3012a unique placement in a detector description. It is represented by
3013an abstract base class which can be implemented in a variety of
3014ways. Each way must provide the capabilities of obtaining the
3015transformation and solid that is described by the touchable.
3016</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Touch.WhatCan"></a>4.1.5.2. 
3017What can a Touchable do?
3018</h4></div></div></div><p>
3019All <code class="literal">G4VTouchable</code> implementations must respond to the
3020two following "requests", where in all cases, by <code class="literal">depth</code> it
3021is meant the number of levels <span class="emphasis"><em>up</em></span> in the tree to be
3022considered (the default and current one is <code class="literal">0</code>):
3023
3024</p><div class="orderedlist"><ol type="1" compact><li><p>
3025    <code class="literal">GetTranslation(depth)</code>
3026  </p></li><li><p>
3027    <code class="literal">GetRotation(depth)</code>
3028  </p></li></ol></div><p>
3029
3030that return the components of the volume's transformation.
3031</p><p>
3032Additional capabilities are available from implementations with
3033more information. These have a default implementation that causes
3034an exception.
3035</p><p>
3036Several capabilities are available from touchables with physical
3037volumes:
3038
3039</p><div class="orderedlist"><ol start="3" type="1"><li><p>
3040    <code class="literal">GetSolid(depth)</code> gives the solid associated to the
3041    touchable.
3042  </p></li><li><p>
3043    <code class="literal">GetVolume(depth)</code> gives the physical volume.
3044  </p></li><li><p>
3045    <code class="literal">GetReplicaNumber(depth)</code> or
3046    <code class="literal">GetCopyNumber(depth)</code> which return the copy number of the
3047    physical volume (replicated or not).
3048  </p></li></ol></div><p>
3049</p><p>
3050Touchables that store volume hierarchy (history) have the whole
3051stack of parent volumes available. Thus it is possible to add a
3052little more state in order to extend its functionality. We add a
3053"pointer" to a level and a member function to move the level in
3054this stack. Then calling the above member functions for another
3055level the information for that level can be retrieved.
3056</p><p>
3057The top of the history tree is, by convention, the world
3058volume.
3059
3060</p><div class="orderedlist"><ol start="6" type="1"><li><p>
3061    <code class="literal">GetHistoryDepth()</code> gives the depth of the history
3062    tree.
3063  </p></li><li><p>
3064    </p><p>
3065    <code class="literal">MoveUpHistory(num)</code> moves the current pointer inside
3066    the touchable to point <code class="literal">num</code> levels up the history tree.
3067    Thus, e.g., calling it with <code class="literal">num=1</code> will cause the internal
3068    pointer to move to the mother of the current volume.
3069    </p><p>
3070    </p><p>
3071    WARNING: this function changes the state of the touchable and can
3072    cause errors in tracking if applied to Pre/Post step
3073    touchables.
3074    </p><p>
3075  </p></li></ol></div><p>
3076</p><p>
3077These methods are valid only for the <span class="emphasis"><em>touchable-history</em></span> type,
3078as specified also below.
3079</p><p>
3080An update method, with different arguments is available, so that
3081the information in a touchable can be updated:
3082
3083</p><div class="orderedlist"><ol start="8" type="1"><li><p>
3084    <code class="literal">UpdateYourself(vol, history)</code> takes a physical volume
3085    pointer and can additionally take a <code class="literal">NavigationHistory</code>
3086    pointer.
3087  </p></li></ol></div><p>
3088</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Touch.History"></a>4.1.5.3. 
3089Touchable history holds stack of geometry data
3090</h4></div></div></div><p>
3091As shown in Sections
3092<a href="ch04.html#sect.Geom.LogVol" title="4.1.3. 
3093Logical Volumes
3094">Section 4.1.3</a> and <a href="ch04.html#sect.Geom.PhysVol" title="4.1.4. 
3095Physical Volumes
3096">Section 4.1.4</a>,
3097a logical volume represents unpositioned detector elements, and a physical
3098volume can represent multiple detector elements. On the other hand,
3099touchables provide a unique identification for a detector element.
3100In particular, the Geant4 transportation process and the tracking
3101system exploit touchables as implemented in
3102<code class="literal">G4TouchableHistory</code>. The touchable history is the minimal
3103set of information required to specify the full genealogy of a
3104given physical volume (up to the root of the geometrical tree).
3105These touchable volumes are made available to the user at every
3106step of the Geant4 tracking in <code class="literal">G4VUserSteppingAction</code>.
3107</p><p>
3108To create/access a <code class="literal">G4TouchableHistory</code> the user must
3109message <code class="literal">G4Navigator</code> which provides the method
3110<code class="literal">CreateTouchableHistoryHandle()</code>:
3111
3112</p><div class="informalexample"><pre class="programlisting">
3113  G4TouchableHistoryHandle CreateTouchableHistoryHandle() const;
3114</pre></div><p>
3115
3116this will return a handle to the touchable.
3117</p><p>
3118The methods that differentiate the touchable-history from other
3119touchables (since they have meaning only for this type...),
3120are:
3121
3122</p><div class="informalexample"><pre class="programlisting">
3123  G4int GetHistoryDepth()  const;
3124  G4int MoveUpHistory( G4int num_levels = 1 );
3125</pre></div><p>
3126</p><p>
3127The first method is used to find out how many levels deep in the
3128geometry tree the current volume is. The second method asks the
3129touchable to eliminate its deepest level.
3130</p><p>
3131As mentioned above, <code class="literal">MoveUpHistory(num)</code> significantly
3132modifies the state of a touchable.
3133</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Assemb"></a>4.1.6. 
3134Creating an Assembly of Volumes
3135</h3></div></div></div><p>
3136<code class="literal">G4AssemblyVolume</code> is a helper class which allows several
3137logical volumes to be combined together in an arbitrary way in 3D
3138space. The result is a placement of a normal logical volume, but
3139where final physical volumes are many.
3140</p><p>
3141However, an <span class="emphasis"><em>assembly</em></span> volume does not act as a real mother
3142volume, being an envelope for its daughter volumes. Its role is
3143over at the time the placement of the logical assembly volume is
3144done. The physical volume objects become independent copies of each
3145of the assembled logical volumes.
3146</p><p>
3147This class is particularly useful when there is a need to create
3148a regular pattern in space of a complex component which consists of
3149different shapes and can't be obtained by using replicated volumes
3150or parametrised volumes (see also <a href="ch04.html#fig.Geom.Assem_1" title="Figure 4.2. 
3151Examples of assembly of volumes.
3152">Figure 4.2</a> 
3153reful usage of <code class="literal">G4AssemblyVolume</code> must be considered
3154though, in order to avoid cases of "proliferation" of physical volumes
3155all placed in the same mother.
3156</p><div class="figure"><a name="fig.Geom.Assem_1"></a><div class="figure-contents"><div class="mediaobject" align="center"><img src="./AllResources/Detector/geometry.src/avex1and2.jpg" align="middle" alt="Assembly volumes"></div></div><p class="title"><b>Figure 4.2. 
3157Examples of <span class="emphasis"><em>assembly</em></span> of volumes.
3158</b></p></div><br class="figure-break"><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Assemb.Fill"></a>4.1.6.1. 
3159Filling an assembly volume with its "daughters"
3160</h4></div></div></div><p>
3161Participating logical volumes are represented as a triplet of
3162&lt;logical volume, translation, rotation&gt;
3163(<code class="literal">G4AssemblyTriplet</code> class).
3164</p><p>
3165The adopted approach is to place each participating logical volume
3166with respect to the assembly's coordinate system, according to the
3167specified translation and rotation.
3168</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Assemb.Place"></a>4.1.6.2. 
3169Assembly volume placement
3170</h4></div></div></div><p>
3171An assembly volume object is composed of a set of logical
3172volumes; imprints of it can be made inside a mother logical
3173volume.
3174</p><p>
3175Since the assembly volume class generates physical volumes
3176during each imprint, the user has no way to specify identifiers for
3177these. An internal counting mechanism is used to compose uniquely
3178the names of the physical volumes created by the invoked
3179<code class="literal">MakeImprint(...)</code> method(s).
3180</p><p>
3181The name for each of the physical volume is generated with
3182the following format:
3183
3184</p><div class="informalexample"><pre class="programlisting">
3185    av_<span class="bold"><strong>WWW</strong></span>_impr_<span class="bold"><strong>XXX</strong></span>_<span class="bold"><strong>YYY</strong></span>_<span class="bold"><strong>ZZZ</strong></span>
3186</pre></div><p>
3187
3188where:
3189
3190</p><div class="itemizedlist"><ul type="disc" compact><li><p>
3191    <span class="bold"><strong>WWW</strong></span> - assembly volume instance number
3192  </p></li><li><p>
3193    <span class="bold"><strong>XXX</strong></span> - assembly volume imprint number
3194  </p></li><li><p>
3195    <span class="bold"><strong>YYY</strong></span> - the name of the placed logical
3196    volume
3197  </p></li><li><p>
3198    <span class="bold"><strong>ZZZ</strong></span> - the logical volume index inside the assembly
3199    volume
3200  </p></li></ul></div><p>
3201</p><p>
3202It is however possible to access the constituent physical volumes
3203of an assembly and eventually customise ID and copy-number.
3204</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Assemb.Destruct"></a>4.1.6.3. 
3205Destruction of an assembly volume
3206</h4></div></div></div><p>
3207At destruction all the generated physical volumes and associated
3208rotation matrices of the imprints will be destroyed. A list of
3209physical volumes created by <code class="literal">MakeImprint()</code> method is kept,
3210in order to be able to cleanup the objects when not needed anymore.
3211This requires the user to keep the assembly objects in memory
3212during the whole job or during the life-time of the
3213<code class="literal">G4Navigator</code>, logical volume store and physical volume
3214store may keep pointers to physical volumes generated by the
3215assembly volume.
3216</p><p>
3217The <code class="literal">MakeImprint()</code> method will operate correctly also on
3218transformations including reflections and can be applied also to
3219recursive assemblies (i.e., it is possible to generate imprints of
3220assemblies including other assemblies).
3221Giving <code class="literal">true</code> as the last argument of the
3222<code class="literal">MakeImprint()</code> method,
3223it is possible to activate the volumes overlap check for the assembly's
3224constituents (the default is <code class="literal">false</code>).
3225</p><p>
3226At destruction of a <code class="literal">G4AssemblyVolume</code>, all its generated
3227physical volumes and rotation matrices will be freed.
3228</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Assemb.Example"></a>4.1.6.4. 
3229Example
3230</h4></div></div></div><p>
3231This example shows how to use the <code class="literal">G4AssemblyVolume</code>
3232class. It implements a layered detector where each layer consists
3233of 4 plates.
3234</p><p>
3235In the code below, at first the world volume is defined, then
3236solid and logical volume for the plate are created, followed by the
3237definition of the assembly volume for the layer.
3238</p><p>
3239The assembly volume for the layer is then filled by the plates in
3240the same way as normal physical volumes are placed inside a mother
3241volume.
3242</p><p>
3243Finally the layers are placed inside the world volume as the
3244imprints of the assembly volume (see <a href="ch04.html#programlist_Geom.Assem_1" title="Example 4.7. 
3245An example of usage of the G4AssemblyVolume class.
3246">Example 4.7</a>).
3247
3248</p><div class="example"><a name="programlist_Geom.Assem_1"></a><p class="title"><b>Example 4.7. 
3249An example of usage of the <code class="literal">G4AssemblyVolume</code> class.
3250</b></p><div class="example-contents"><pre class="programlisting">
3251 static unsigned int layers = 5;
3252
3253 void TstVADetectorConstruction::ConstructAssembly()
3254 {
3255   // Define world volume
3256   G4Box* WorldBox = new G4Box( "WBox", worldX/2., worldY/2., worldZ/2. );
3257   G4LogicalVolume*   worldLV  = new G4LogicalVolume( WorldBox, selectedMaterial, "WLog", 0, 0, 0);
3258   G4VPhysicalVolume* worldVol = new G4PVPlacement(0, G4ThreeVector(), "WPhys",worldLV,
3259                                                   0, false, 0);
3260
3261   // Define a plate
3262   G4Box* PlateBox = new G4Box( "PlateBox", plateX/2., plateY/2., plateZ/2. );
3263   G4LogicalVolume* plateLV = new G4LogicalVolume( PlateBox, Pb, "PlateLV", 0, 0, 0 );
3264
3265   // Define one layer as one assembly volume
3266   G4AssemblyVolume* assemblyDetector = new G4AssemblyVolume();
3267
3268   // Rotation and translation of a plate inside the assembly
3269   G4RotationMatrix Ra;
3270   G4ThreeVector Ta;
3271
3272   // Rotation of the assembly inside the world
3273   G4RotationMatrix Rm;
3274
3275   // Fill the assembly by the plates
3276   Ta.setX( caloX/4. ); Ta.setY( caloY/4. ); Ta.setZ( 0. );
3277   assemblyDetector-&gt;AddPlacedVolume( plateLV, G4Transform3D(Ta,Ra) );
3278
3279   Ta.setX( -1*caloX/4. ); Ta.setY( caloY/4. ); Ta.setZ( 0. );
3280   assemblyDetector-&gt;AddPlacedVolume( plateLV, G4Transform3D(Ta,Ra) );
3281
3282   Ta.setX( -1*caloX/4. ); Ta.setY( -1*caloY/4. ); Ta.setZ( 0. );
3283   assemblyDetector-&gt;AddPlacedVolume( plateLV, G4Transform3D(Ta,Ra) );
3284
3285   Ta.setX( caloX/4. ); Ta.setY( -1*caloY/4. ); Ta.setZ( 0. );
3286   assemblyDetector-&gt;AddPlacedVolume( plateLV, G4Transform3D(Ta,Ra) );
3287
3288   // Now instantiate the layers
3289   for( unsigned int i = 0; i &lt; layers; i++ )
3290   {
3291     // Translation of the assembly inside the world
3292     G4ThreeVector Tm( 0,0,i*(caloZ + caloCaloOffset) - firstCaloPos );
3293     assemblyDetector-&gt;MakeImprint( worldLV, G4Transform3D(Tm,Rm) );
3294   }
3295}
3296</pre></div></div><p><br class="example-break">
3297</p><p>
3298The resulting detector will look as in <a href="ch04.html#fig.Geom.Assem_2" title="Figure 4.3. 
3299The geometry corresponding to the previous example code (An example of usage of the G4AssemblyVolume class).
3300">Figure 4.3</a>,
3301below:
3302
3303</p><div class="figure"><a name="fig.Geom.Assem_2"></a><div class="figure-contents"><div class="mediaobject" align="center"><img src="AllResources/Detector/geometry.src/avpic.jpg" align="middle" alt="Assembly volume detector"></div></div><p class="title"><b>Figure 4.3. 
3304The geometry corresponding to the previous example code (An example of usage of the <code class="literal">G4AssemblyVolume</code> class).
3305</b></p></div><p><br class="figure-break">
3306</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Reflec"></a>4.1.7. 
3307Reflecting Hierarchies of Volumes
3308</h3></div></div></div><p>
3309Hierarchies of volumes based on <span class="emphasis"><em>CSG</em></span> or
3310<span class="emphasis"><em>specific</em></span> solids can be reflected by means of the
3311<code class="literal">G4ReflectionFactory</code> class and <code class="literal">G4ReflectedSolid</code>,
3312which implements a solid that has been shifted from its original
3313reference frame to a new 'reflected' one. The reflection
3314transformation is applied as a decomposition into rotation and
3315translation transformations.
3316</p><p>
3317The factory is a singleton object which provides the following
3318methods:
3319
3320</p><div class="informalexample"><pre class="programlisting">
3321   G4PhysicalVolumesPair Place(const G4Transform3D&amp;   transform3D,
3322                               const G4String&amp;        name,
3323                                     G4LogicalVolume* LV,
3324                                     G4LogicalVolume* motherLV,
3325                                     G4bool           isMany,
3326                                     G4int            copyNo,
3327                                     G4bool           surfCheck=false)
3328 
3329   G4PhysicalVolumesPair Replicate(const G4String&amp;        name,
3330                                         G4LogicalVolume* LV,
3331                                         G4LogicalVolume* motherLV,
3332                                         EAxis            axis,
3333                                         G4int            nofReplicas,
3334                                         G4double         width,
3335                                         G4double         offset=0)
3336                                                                                             
3337   G4PhysicalVolumesPair Divide(const G4String&amp;        name,
3338                                      G4LogicalVolume* LV,
3339                                      G4LogicalVolume* motherLV,
3340                                      EAxis            axis,
3341                                      G4int            nofDivisions,
3342                                      G4double         width,
3343                                      G4double         offset);
3344</pre></div><p>
3345</p><p>
3346The method <code class="literal">Place()</code> used for placements, evaluates the
3347passed transformation. In case the transformation contains a
3348reflection, the factory will act as follows:
3349
3350</p><div class="orderedlist"><ol type="1" compact><li><p>
3351    Performs the transformation decomposition.
3352  </p></li><li><p>
3353    Creates a new reflected solid and logical volume, or retrieves
3354    them from a map if the reflected object was already created.
3355  </p></li><li><p>
3356    Transforms the daughters (if any) and place them in the given mother.
3357  </p></li></ol></div><p>
3358</p><p>
3359If successful, the result is a pair of physical volumes, where the
3360second physical volume is a placement in a reflected mother.
3361Optionally, it is also possible to force the overlaps check at the
3362time of placement, by activating the <code class="literal">surfCheck</code> flag.
3363</p><p>
3364The method <code class="literal">Replicate()</code> creates replicas in the given
3365mother. If successful, the result is a pair of physical volumes,
3366where the second physical volume is a replica in a reflected
3367mother.
3368</p><p>
3369The method <code class="literal">Divide()</code> creates divisions in the given mother.
3370If successful, the result is a pair of physical volumes, where the
3371second physical volume is a division in a reflected mother. There
3372exists also two more variants of this method which may specify or
3373not width or number of divisions.
3374</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">
3375Notes
3376</h3><p>
3377</p><div class="itemizedlist"><ul type="disc" compact><li><p>
3378    In order to reflect hierarchies containing divided volumes, it
3379    is necessary to explicitely instantiate a concrete <span class="emphasis"><em>division</em></span>
3380    factory -before- applying the actual reflection: (i.e. -
3381    <code class="literal">G4PVDivisionFactory::GetInstance();</code>).
3382  </p></li><li><p>
3383    Reflection of generic parameterised volumes is not possible yet.
3384  </p></li></ul></div><p>
3385</p></div><div class="example"><a name="programlist_Geom.Reflec_1"></a><p class="title"><b>Example 4.8. 
3386An example of usage of the
3387<code class="literal">G4ReflectionFactory</code> class.</b></p><div class="example-contents"><pre class="programlisting">
3388 #include "G4ReflectionFactory.hh"
3389 
3390 // Calor placement with rotation
3391 
3392 G4double calThickness = 100*cm;
3393 G4double Xpos = calThickness*1.5;
3394 G4RotationMatrix* rotD3 = new G4RotationMatrix();
3395 rotD3-&gt;rotateY(10.*deg);
3396 
3397 G4VPhysicalVolume* physiCalor =
3398     new G4PVPlacement(rotD3,                     // rotation
3399                       G4ThreeVector(Xpos,0.,0.), // at (Xpos,0,0)
3400                       logicCalor,     // its logical volume (defined elsewhere)
3401                       "Calorimeter",  // its name
3402                       logicHall,      // its mother volume (defined elsewhere)
3403                       false,          // no boolean operation
3404                       0);             // copy number
3405 
3406 // Calor reflection with rotation
3407 //
3408 G4Translate3D translation(-Xpos, 0., 0.);
3409 G4Transform3D rotation = G4Rotate3D(*rotD3);
3410 G4ReflectX3D  reflection;
3411 G4Transform3D transform = translation*rotation*reflection;
3412 
3413 G4ReflectionFactory::Instance()
3414          -&gt;Place(transform,     // the transformation with reflection
3415                  "Calorimeter", // the actual name
3416                  logicCalor,    // the logical volume
3417                  logicHall,     // the mother volume
3418                  false,         // no boolean operation
3419                  1,             // copy number
3420                  false);        // no overlap check triggered
3421 
3422 // Replicate layers
3423 //
3424 G4ReflectionFactory::Instance()
3425          -&gt;Replicate("Layer",    // layer name
3426                      logicLayer, // layer logical volume (defined elsewhere)
3427                      logicCalor, // its mother
3428                      kXAxis,     // axis of replication
3429                      5,          // number of replica
3430                      20*cm);     // width of replica
3431</pre></div></div><br class="example-break"></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Navig"></a>4.1.8. 
3432The Geometry Navigator
3433</h3></div></div></div><p>
3434Navigation through the geometry at tracking time is implemented
3435by the class <code class="literal">G4Navigator</code>. The navigator is used to locate
3436points in the geometry and compute distances to geometry
3437boundaries. At tracking time, the navigator is intended to be the
3438only point of interaction with tracking.
3439</p><p>
3440Internally, the G4Navigator has several private helper/utility
3441classes:
3442
3443</p><div class="itemizedlist"><ul type="disc" compact><li><p>
3444    <span class="bold"><strong>G4NavigationHistory</strong></span> - stores the compounded
3445    transformations, replication/parameterisation information, and
3446    volume pointers at each level of the hierarchy to the current
3447    location. The volume types at each level are also stored - whether
3448    normal (placement), replicated or parameterised.
3449  </p></li><li><p>
3450    <span class="bold"><strong>G4NormalNavigation</strong></span> - provides location &amp; 
3451    distance computation functions for geometries containing 'placement'
3452    volumes, with no voxels.
3453  </p></li><li><p>
3454    <span class="bold"><strong>G4VoxelNavigation</strong></span> - provides location and distance
3455    computation functions for geometries containing 'placement'
3456    physical volumes with voxels. Internally a stack of voxel
3457    information is maintained. Private functions allow for isotropic
3458    distance computation to voxel boundaries and for computation of the
3459    'next voxel' in a specified direction.
3460  </p></li><li><p>
3461    <span class="bold"><strong>G4ParameterisedNavigation</strong></span> - provides location and
3462    distance computation functions for geometries containing
3463    parameterised volumes with voxels. Voxel information is maintained
3464    similarly to <code class="literal">G4VoxelNavigation</code>, but computation can also
3465    be simpler by adopting voxels to be one level deep only
3466    (<span class="emphasis"><em>unrefined</em></span>, or 1D optimisation)
3467  </p></li><li><p>
3468    <span class="bold"><strong>G4ReplicaNavigation</strong></span> - provides location and distance
3469    computation functions for replicated volumes.
3470  </p></li></ul></div><p>
3471</p><p>
3472In addition, the navigator maintains a set of flags for
3473exiting/entry optimisation. A navigator is not a singleton class;
3474this is mainly to allow a design extension in future (e.g
3475geometrical event biasing).
3476</p><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Navig.NavigTrack"></a>4.1.8.1. 
3477Navigation and Tracking
3478</h4></div></div></div><p>
3479The main functions required for tracking in the geometry are
3480described below. Additional functions are provided to return the
3481net transformation of volumes and for the creation of touchables.
3482None of the functions implicitly requires that the geometry be
3483described hierarchically.
3484
3485</p><div class="itemizedlist"><ul type="disc" compact><li><p>
3486    <span class="bold"><strong>SetWorldVolume()</strong></span>
3487    </p><p>
3488    Sets the first volume in the hierarchy. It must be unrotated and
3489    untranslated from the origin.
3490    </p><p>
3491  </p></li><li><p>
3492    <span class="bold"><strong>LocateGlobalPointAndSetup()</strong></span>
3493    </p><p>
3494    Locates the volume containing the specified global point. This
3495    involves a traverse of the hierarchy, requiring the computation of
3496    compound transformations, testing replicated and parameterised
3497    volumes (etc). To improve efficiency this search may be performed
3498    relative to the last, and this is the recommended way of calling
3499    the function. A 'relative' search may be used for the first call of
3500    the function which will result in the search defaulting to a search
3501    from the root node of the hierarchy. Searches may also be performed
3502    using a <code class="literal">G4TouchableHistory</code>.
3503    </p><p>
3504  </p></li><li><p>
3505    <span class="bold"><strong>LocateGlobalPointAndUpdateTouchableHandle()</strong></span>
3506    </p><p>
3507    First, search the geometrical hierarchy like the above method
3508    <code class="literal">LocateGlobalPointAndSetup()</code>. Then use the volume found and
3509    its navigation history to update the touchable.
3510    </p><p>
3511  </p></li><li><p>
3512    <span class="bold"><strong>ComputeStep()</strong></span>
3513    </p><p>
3514    Computes the distance to the next boundary intersected along the
3515    specified unit direction from a specified point. The point must be
3516    have been located prior to calling <code class="literal">ComputeStep()</code>.
3517    </p><p>
3518    </p><p>
3519    When calling <code class="literal">ComputeStep()</code>, a proposed physics step is
3520    passed. If it can be determined that the first intersection lies at
3521    or beyond that distance then <code class="literal">kInfinity</code> is returned. In any
3522    case, if the returned step is greater than the physics step, the
3523    physics step must be taken.
3524    </p><p>
3525  </p></li><li><p>
3526    <span class="bold"><strong>SetGeometricallyLimitedStep()</strong></span>
3527    </p><p>
3528    Informs the navigator that the last computed step was taken in its
3529    entirety. This enables entering/exiting optimisation, and should be
3530    called prior to calling <code class="literal">LocateGlobalPointAndSetup()</code>.
3531    </p><p>
3532  </p></li><li><p>
3533    <span class="bold"><strong>CreateTouchableHistory()</strong></span>
3534    </p><p>
3535    Creates a <code class="literal">G4TouchableHistory</code> object, for which the caller
3536    has deletion responsibility. The 'touchable' volume is the volume
3537    returned by the last Locate operation. The object includes a copy
3538    of the current NavigationHistory, enabling the efficient relocation
3539    of points in/close to the current volume in the hierarchy.
3540    </p><p>
3541  </p></li></ul></div><p>
3542</p><p>
3543As stated previously, the navigator makes use of utility classes to
3544perform location and step computation functions. The different
3545navigation utilities manipulate the <code class="literal">G4NavigationHistory</code>
3546object.
3547</p><p>
3548In <code class="literal">LocateGlobalPointAndSetup()</code> the process of locating a
3549point breaks down into three main stages - optimisation,
3550determination that the point is contained with a subtree (mother
3551and daughters), and determination of the actual containing
3552daughter. The latter two can be thought of as scanning first 'up'
3553the hierarchy until a volume that is guaranteed to contain the
3554point is found, and then scanning 'down' until the actual volume
3555that contains the point is found.
3556</p><p>
3557In <code class="literal">ComputeStep()</code> three types of computation are treated
3558depending on the current containing volume:
3559
3560</p><div class="itemizedlist"><ul type="disc" compact><li><p>
3561    The volume contains normal (placement) daughters (or none)
3562  </p></li><li><p>
3563    The volume contains a single parameterised volume object,
3564    representing many volumes
3565  </p></li><li><p>
3566    The volume is a replica and contains normal (placement) daughters
3567  </p></li></ul></div><p>
3568</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Navig.LocPnt"></a>4.1.8.2. 
3569Using the navigator to locate points
3570</h4></div></div></div><p>
3571More than one navigator objects can be created inside an application; these
3572navigators can act independently for different purposes. The main navigator
3573which is "<span class="emphasis"><em>activated</em></span> automatically at the startup of a
3574simulation program is the navigator used for the
3575<span class="emphasis"><em>tracking</em></span> and attached the world volume
3576of the main tracking (or <span class="emphasis"><em>mass</em></span>) geometry.
3577</p><p>
3578The navigator for tracking can be retrieved at any state of the application
3579by messagging the <code class="literal">G4TransportationManager</code>:
3580
3581</p><div class="informalexample"><pre class="programlisting">
3582  G4Navigator* tracking_navigator =
3583    G4TransportationManager::GetInstance()-&gt;GetNavigatorForTracking();
3584</pre></div><p>
3585
3586The navigator for tracking also retains all the information of the current
3587history of volumes transversed at a precise moment of the tracking during a
3588run. Therefore, if the navigator for tracking is used during tracking for
3589locating a generic point in the tree of volumes, the actual particle gets
3590also -relocated- in the specified position and tracking will be of course
3591affected !
3592</p><p>
3593In order to avoid the problem above and provide information about location
3594of a point without affecting the tracking, it is suggested to either use an
3595alternative <code class="literal">G4Navigator</code> object (which can then be assigned
3596to the world-volume), or access the information through the step.
3597</p><h5><a name="id405028"></a>
3598Using the 'step' to retrieve geometrical information
3599</h5><p>
3600During the tracking run, geometrical information can be retrieved through
3601the touchable handle associated to the current step. For example, to identify
3602the exact copy-number of a specific physical volume in the mass geometry,
3603one should do the following:
3604
3605</p><div class="informalexample"><pre class="programlisting">
3606  // Given the pointer to the step object ...
3607  //
3608  G4Step* aStep = ..;
3609
3610  // ... retrieve the 'pre-step' point
3611  //
3612  G4StepPoint* preStepPoint = aStep-&gt;GetPreStepPoint();
3613
3614  // ... retrieve a touchable handle and access to the information
3615  //
3616  G4TouchableHandle theTouchable = preStepPoint-&gt;GetTouchableHandle();
3617  G4int copyNo = theTouchable-&gt;GetCopyNumber();
3618  G4int motherCopyNo = theTouchable-&gt;GetCopyNumber(1);
3619</pre></div><p>
3620</p><p>
3621To determine the exact position in global coordinates in the mass geometry
3622and convert to local coordinates (local to the current volume):
3623
3624</p><div class="informalexample"><pre class="programlisting">
3625  G4ThreeVector worldPosition = preStepPoint-&gt;GetPosition();
3626  G4ThreeVector localPosition = theTouchable-&gt;GetHistory()-&gt;
3627                GetTopTransform().TransformPoint(worldPosition);
3628</pre></div><p>
3629</p><h5><a name="id405073"></a>
3630Using an alternative navigator to locate points
3631</h5><p>
3632In order to know (when in the <code class="literal">idle</code> state of the
3633application) in which physical volume a given point is located
3634in the detector geometry, it is necessary to create an alternative
3635navigator object first and assign it to the world volume:
3636
3637</p><div class="informalexample"><pre class="programlisting">
3638  G4Navigator* aNavigator = new G4Navigator();
3639  aNavigator-&gt;SetWorldVolume(worldVolumePointer);
3640</pre></div><p>
3641</p><p>
3642Then, locate the point <code class="literal">myPoint</code> (defined in global coordinates),
3643retrieve a <span class="emphasis"><em>touchable handle</em></span> and do whatever you need with it:
3644
3645</p><div class="informalexample"><pre class="programlisting">
3646  aNavigator-&gt;LocateGlobalPointAndSetup(myPoint);
3647  G4TouchableHistoryHandle aTouchable =
3648    aNavigator-&gt;CreateTouchableHistoryHandle();
3649
3650  // Do whatever you need with it ...
3651  // ... convert point in local coordinates (local to the current volume)
3652  //
3653  G4ThreeVector localPosition = aTouchable-&gt;GetHistory()-&gt;
3654                GetTopTransform().TransformPoint(myPoint);
3655
3656  // ... convert back to global coordinates system
3657  G4ThreeVector globalPosition = aTouchable-&gt;GetHistory()-&gt;
3658                GetTopTransform().Inverse().TransformPoint(localPosition);
3659</pre></div><p>
3660</p><p>
3661If outside of the tracking run and given a generic local position (local to a
3662given volume in the geometry tree), it is -not- possible to determine a priori
3663its global position and convert it to the global coordinates system.
3664The reason for this is rather simple, nobody can guarantee that the given
3665(local) point is located in the right -copy- of the physical volume !
3666In order to retrieve this information, some extra knowledge related to the
3667absolute position of the physical volume is required first, i.e. one should
3668first determine a global point belonging to that volume, eventually making
3669a dedicated scan of the geometry tree through a dedicated
3670<code class="literal">G4Navigator</code> object and then apply the method above after
3671having created the touchable for it.
3672</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Navig.ParaGeom"></a>4.1.8.3. 
3673Navigation in parallel geometries
3674</h4></div></div></div><p>
3675Since release 8.2 of Geant4, it is possible to define geometry trees which
3676are <code class="literal">parallel</code> to the tracking geometry and having them
3677assigned to navigator objects that transparently communicate in sync with
3678the normal tracking geometry.
3679</p><p>
3680Parallel geometries can be defined for several uses (fast shower
3681parameterisation, geometrical biasing, particle scoring, readout
3682geometries, etc ...) and can <span class="emphasis"><em>overlap</em></span> with the mass
3683geometry defined for the tracking. The <code class="literal">parallel</code> 
3684transportation will be activated only after the registration of the
3685parallel geometry in the detector description
3686setup; see Section <a href="ch04s07.html" title="4.7. 
3687Parallel Geometries
3688">Section 4.7</a> for how to define a parallel
3689geometry and register it to the run-manager.
3690</p><p>
3691The <code class="literal">G4TransportationManager</code> provides all the utilities to verify,
3692retrieve and activate the navigators associated to the various parallel
3693geometries defined.
3694</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Navig.PhantomGeom"></a>4.1.8.4. 
3695Fast navigation in regular patterned geometries and phantoms
3696</h4></div></div></div><p>
3697Since release 9.1 of Geant4, a specialised navigation algorithm has
3698been introduced to allow for optimal memory use and extremely efficient
3699navigation in geometries represented by a regular pattern of volumes
3700and particularly three-dimensional grids of boxes. A typical application
3701of this kind is the case of a DICOM phantoms for medical physics studies.
3702</p><p>
3703The class <code class="literal">G4RegularNavigation</code> is used and automatically
3704activated when such geometries are defined. It is required to the user to
3705implement a parameterisation of the kind <code class="literal">G4PhantomParameterisation</code>
3706and place the parameterised volume containing it in a container volume, so that
3707all cells in the three-dimensional grid (<span class="emphasis"><em>voxels</em></span>) completely
3708fill the container volume.
3709This way the location of a point inside a voxel can be done in a fast way,
3710transforming the position to the coordinate system of the container volume
3711and doing a simple calculation of the kind:
3712
3713</p><div class="informalexample"><pre class="programlisting">
3714  copyNo_x = (localPoint.x()+fVoxelHalfX*fNoVoxelX)/(fVoxelHalfX*2.)
3715</pre></div><p>
3716
3717where <code class="literal">fVoxelHalfX</code> is the half dimension of the voxel along
3718<code class="literal">X</code> and <code class="literal">fNoVoxelX</code> is the number of voxels
3719in the <code class="literal">X</code> dimension.
3720Voxel <code class="literal">0</code> will be the one closest to the corner
3721<code class="literal">(fVoxelHalfX*fNoVoxelX, fVoxelHalfY*fNoVoxelY, fVoxelHalfZ*fNoVoxelZ)</code>.
3722</p><p>
3723Having the voxels filling completely the container volume allows to avoid
3724the lengthy computation of <code class="literal">ComputeStep()</code> and
3725<code class="literal">ComputeSafety</code> methods required in the traditional
3726navigation algorithm.
3727In this case, when a track is inside the parent volume, it has always to
3728be inside one of the voxels and it will be only necessary to calculate
3729the distance to the walls of the current voxel.
3730</p><h5><a name="id405313"></a>
3731Skipping borders of voxels with same material
3732</h5><p>
3733Another speed optimisation can be provided by skipping the frontiers
3734of two voxels which the same material assigned, so that bigger steps
3735can be done. This optimisation may be not very useful when the number of
3736materials is very big (in which case the probability of having contiguous
3737voxels with same material is reduced), or when the physical step is small
3738compared to the voxel dimensions (very often the case of electrons).
3739The optimisation can be switched off in such cases, by invoking the
3740following method with argument <code class="literal">skip = 0</code>:
3741
3742</p><div class="informalexample"><pre class="programlisting">
3743  G4RegularParameterisation::SetSkipEqualMaterials( G4bool skip );
3744</pre></div><p>
3745</p><h5><a name="id405344"></a>
3746Example
3747</h5><p>
3748To use the specialised navigation, it is required to first create an object
3749of type  <code class="literal">G4PhantomParameterisation</code>:
3750
3751</p><div class="informalexample"><pre class="programlisting">
3752  G4PhantomParameterisation* param = new G4PhantomParameterisation();
3753</pre></div><p>
3754
3755Then, fill it with the all the necessary data:
3756
3757</p><div class="informalexample"><pre class="programlisting">
3758  // Voxel dimensions in the three dimensions
3759  //
3760  G4double halfX = ...;
3761  G4double halfY = ...;
3762  G4double halfZ = ...;
3763  param-&gt;SetVoxelDimensions( halfX, halfY, halfZ );
3764
3765  // Number of voxels in the three dimensions
3766  //
3767  G4int nVoxelX = ...;
3768  G4int nVoxelY = ...;
3769  G4int nVoxelZ = ...;
3770  param-&gt;SetNoVoxel( nVoxelX, nVoxelY, nVoxelZ );
3771
3772  // Vector of materials of the voxels
3773  //
3774  std::vector &lt; G4Material* &gt; theMaterials;
3775  theMaterials.push_back( new G4Material( ...
3776  theMaterials.push_back( new G4Material( ...
3777  param-&gt;SetMaterials( theMaterials );
3778
3779  // List of material indices
3780  // For each voxel it is a number that correspond to the index of its
3781  // material in the vector of materials defined above;
3782  //
3783  size_t* mateIDs = new size_t[nVoxelX*nVoxelY*nVoxelZ];
3784  mateIDs[0] = n0;
3785  mateIDs[1] = n1;
3786  ...
3787  param-&gt;SetMaterialIndices( mateIDs );
3788</pre></div><p>
3789
3790Then, define the volume that contains all the voxels:
3791
3792</p><div class="informalexample"><pre class="programlisting">
3793  G4Box* cont_solid = new G4Box("PhantomContainer",nVoxelX*halfX.,nVoxelY*halfY.,nVoxelZ*halfZ);
3794  G4LogicalVolume* cont_logic =
3795    new G4LogicalVolume( cont_solid,
3796                         matePatient,        // material is not relevant here...
3797                         "PhantomContainer",
3798                         0, 0, 0 );
3799  G4VPhysicalVolume * cont_phys =
3800    new G4PVPlacement(rotm,                  // rotation
3801                      pos,                   // translation
3802                      cont_logic,            // logical volume
3803                      "PhantomContainer",    // name
3804                      world_logic,           // mother volume
3805                      false,                 // No op. bool.
3806                      1);                    // Copy number
3807
3808</pre></div><p>
3809
3810The physical volume should be assigned as the container volume of the
3811parameterisation:
3812
3813</p><div class="informalexample"><pre class="programlisting">
3814  param-&gt;BuildContainerSolid(cont_phys);
3815
3816  // Assure that the voxels are completely filling the container volume
3817  //
3818  param-&gt;CheckVoxelsFillContainer( cont_solid-&gt;GetXHalfLength(),
3819                                      cont_solid-&gt;GetyHalfLength(),
3820                                      cont_solid-&gt;GetzHalfLength() );
3821
3822  // The parameterised volume which uses this parameterisation is placed
3823  // in the container logical volume
3824  //
3825  G4PVParameterised * patient_phys =
3826    new G4PVParameterised("Patient",               // name
3827                          patient_logic,           // logical volume
3828                          cont_logic,              // mother volume
3829                          kXAxis,                  // optimisation hint
3830                          nVoxelX*nVoxelY*nVoxelZ, // number of voxels
3831                          param);                  // parameterisation
3832
3833  // Indicate that this physical volume is having a regular structure
3834  //
3835  patient_phys-&gt;SetRegularStructureId(1);
3836</pre></div><p>
3837</p>
3838
3839An example showing the application of the optimised navigation algorithm
3840for phantoms geometries is available in
3841<code class="literal">examples/extended/medical/DICOM</code>. It implements a real
3842application for reading <code class="literal">DICOM</code> images and convert them to
3843Geant4 geometries with defined materials and densities, allowing for
3844different implementation solutions to be chosen (non optimised, classical
38453D optimisation, nested parameterisations and use of
3846<code class="literal">G4PhantomParameterisation</code>).
3847
3848</div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Navig.RunTime"></a>4.1.8.5. 
3849Run-time commands
3850</h4></div></div></div><p>
3851When running in <span class="emphasis"><em>verbose</em></span> mode (i.e. the default,
3852<code class="literal">G4VERBOSE</code> set while installing the Geant4 kernel
3853libraries), the navigator provides a few commands to control its
3854behavior. It is possible to select different verbosity levels (up
3855to 5), with the command:
3856
3857</p><div class="informalexample"><pre class="programlisting">
3858  geometry/navigator/verbose [verbose_level]
3859</pre></div><p>
3860
3861or to force the navigator to run in <span class="emphasis"><em>check</em></span> mode:
3862
3863</p><div class="informalexample"><pre class="programlisting">
3864  geometry/navigator/check_mode [true/false]
3865</pre></div><p>
3866</p><p>
3867The latter will force more strict and less tolerant checks in
3868step/safety computation to verify the correctness of the solids'
3869response in the geometry.
3870</p><p>
3871By combining <span class="emphasis"><em>check_mode</em></span> with verbosity level-1, additional
3872verbosity checks on the response from the solids can be activated.
3873</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Tolerance"></a>4.1.8.6. 
3874Setting Geometry Tolerance to be relative
3875</h4></div></div></div><p>
3876The tolerance value defining the accuracy of tracking on the surfaces
3877is by default set to a reasonably small value of <span class="emphasis"><em>10E-9 mm</em></span>.
3878Such accuracy may be however redundant for use on simulation of detectors
3879of big size or macroscopic dimensions. Since release 9.0, it is possible to
3880specify the surface tolerance to be relative to the extent of the world volume
3881defined for containing the geometry setup.
3882</p><p>
3883The class <code class="literal">G4GeometryManager</code> can be used to activate
3884the computation of the surface tolerance to be relative to the geometry
3885setup which has been defined. It can be done this way:
3886
3887</p><div class="informalexample"><pre class="programlisting">
3888  G4GeometryManager::GetInstance()-&gt;SetWorldMaximumExtent(WorldExtent);
3889</pre></div><p>
3890
3891where, <code class="literal">WorldExtent</code> is the actual maximum extent of the
3892world volume used for placing the whole geometry setup.
3893</p><p>
3894Such call to <code class="literal">G4GeometryManager</code> must be done
3895<span class="bold"><strong>before</strong></span> defining any geometrical component of
3896the setup (solid shape or volume), and can be done only
3897<span class="bold"><strong>once</strong></span> !
3898</p><p>
3899The class <code class="literal">G4GeometryTolerance</code> is to be used for retrieving the
3900actual values defined for tolerances, surface (Cartesian), angular or radial
3901respectively:
3902
3903</p><div class="informalexample"><pre class="programlisting">
3904  G4GeometryTolerance::GetInstance()-&gt;GetSurfaceTolerance();
3905  G4GeometryTolerance::GetInstance()-&gt;GetAngularTolerance();
3906  G4GeometryTolerance::GetInstance()-&gt;GetRadialTolerance();
3907</pre></div><p>
3908
3909</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Edit"></a>4.1.9. 
3910A Simple Geometry Editor
3911</h3></div></div></div><p>
3912GGE is the Geant4 Graphical Geometry Editor. It is implemented
3913in JAVA and is part of the Momo environment. GGE aims to serve
3914physicists who have a little knowledge of C++ and the Geant4
3915toolkit to construct his or her own detector geometry in a
3916graphical manner.
3917</p><p>
3918GGE provides methods to:
3919
3920</p><div class="orderedlist"><ol type="1" compact><li><p>
3921    construct a detector geometry including <code class="literal">G4Element</code>,
3922    <code class="literal">G4Material</code>, <code class="literal">G4Solids</code>,
3923    <code class="literal">G4LogicalVolume</code>,
3924    <code class="literal">G4PVPlacement</code>, etc.
3925  </p></li><li><p>
3926    view the detector geometry using existing visualization system like DAWN
3927  </p></li><li><p>
3928    keep the detector object in a persistent way
3929  </p></li><li><p>
3930    produce corresponding C++ codes after the norm of Geant4 toolkit
3931  </p></li><li><p>
3932    make a Geant4 executable under adequate environment
3933  </p></li></ol></div><p>
3934</p><p>
3935GGE is implemented with Java, using Java Foundation Class,
3936Swing-1.0.2. In essence, GGE is made a set of tables which contain
3937all relevant parameters to construct a simple detector
3938geometry.
3939</p><p>
3940The software, installation instructions and notes for GGE and other
3941JAVA-based UI tools can be freely downloaded from the
3942<a href="http://erpc1.naruto-u.ac.jp/~geant4/" target="_top">
3943Geant4 GUI and Environments web site
3944</a>
3945 of Naruto University of Education in Japan.
3946</p><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Edit.Mate"></a>4.1.9.1. 
3947Materials: elements and mixtures
3948</h4></div></div></div><p>
3949GGE provides the database of elements in a form of the periodic
3950table, which users can use to construct new materials. GGE provides
3951a pre-constructed database of materials taken from the PDG book.
3952They can be loaded, used, edited and saved as persistent
3953objects.
3954</p><p>
3955Users can also create new materials either from scratch or by
3956combining other materials.
3957
3958</p><div class="itemizedlist"><ul type="disc" compact><li><p>
3959    creating a material from scratch:
3960    </p><p>
3961    </p><div class="informaltable"><table border="1"><colgroup><col><col><col><col><col><col><col><col><col><col><col></colgroup><tbody><tr><td>Use</td><td>Name</td><td>A</td><td>Z</td><td>Density</td><td>Unit</td><td>State</td><td>Temperature</td><td>Unit</td><td>Pressure</td><td>Unit</td></tr></tbody></table></div><p>
3962    </p><p>
3963    </p><p>
3964    Only the elements and materials used in the logical volumes are
3965    kept in the detector object and are used to generate C++
3966    constructors. <span class="bold"><strong>Use</strong></span> marks the used materials.
3967    </p><p>
3968  </p></li><li><p>
3969    Constructor to create a material from a combination of
3970    elements, subsequently added via <code class="literal">AddElement</code>
3971    </p><p>
3972    </p><div class="informaltable"><table border="1"><colgroup><col><col><col><col><col><col><col><col><col></colgroup><tbody><tr><td>Use</td><td>Name</td><td>Elements</td><td>Density</td><td>Unit</td><td>State</td><td>Temperature</td><td>Unit</td><td>Pressure</td><td>Unit</td></tr></tbody></table></div><p>
3973    </p><p>
3974
3975    </p><p>
3976    By clicking the column <span class="bold"><strong>Elements</strong></span>, a new
3977    window is open to select one of two methods:
3978
3979    </p><div class="itemizedlist"><ul type="circle" compact><li><p>
3980        Add an element, giving fraction by weight
3981      </p></li><li><p>
3982        Add an element, giving number of atoms.
3983      </p></li></ul></div><p>
3984    </p><p>
3985  </p></li></ul></div><p>
3986</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Edit.Solids"></a>4.1.9.2. 
3987Solids
3988</h4></div></div></div><p>
3989The most popular CSG solids (<code class="literal">G4Box</code>, <code class="literal">G4Tubs</code>,
3990<code class="literal">G4Cons</code>, <code class="literal">G4Trd</code>) and specific BREPs solids
3991(Pcons, Pgons) are supported at present. All related parameters of such a
3992solid can be specified in a parameter widget.
3993</p><p>
3994Users will be able to view each solid using DAWN.
3995</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Edit.LogVol"></a>4.1.9.3. 
3996Logical Volume
3997</h4></div></div></div><p>
3998GGE can specify the following items:
3999
4000</p><div class="informaltable"><table border="1"><colgroup><col><col><col><col></colgroup><tbody><tr><td>Name</td><td>Solid</td><td>Material</td><td>VisAttribute</td></tr></tbody></table></div><p>
4001</p><p>
4002The construction and assignment of appropriate entities for
4003<code class="literal">G4FieldManager</code> and <code class="literal">G4VSensitiveDetector</code> 
4004are left to the user.
4005</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Edit.PhysVol"></a>4.1.9.4. 
4006Physical Volume
4007</h4></div></div></div><p>
4008A single copy of a physical volume can be created. Also repeated
4009copies can be created in several manners. First, a user can
4010translate the logical volume linearly.
4011
4012</p><div class="informaltable"><table border="1"><colgroup><col><col><col><col><col><col><col><col><col></colgroup><tbody><tr><td>Name</td><td>LogicalVolume</td><td>MotherVolume</td><td>Many</td><td>X0, Y0, Z0</td><td>Direction</td><td>StepSize</td><td>Unit</td><td>CopyNumber</td></tr></tbody></table></div><p>
4013</p><p>
4014Combined translation and rotation are also possible, placing an
4015object repeatedly on a ``cylindrical'' pattern. Simple models of
4016replicas and parametrised volume are also implemented. In the
4017replicas, a volume is slices to create new sub-volumes. In
4018parametrised volumes, several patterns of volumes can be
4019created.
4020</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Edit.GeneCode"></a>4.1.9.5. 
4021Generation of C++ code: <code class="literal">MyDetectorConstruction.cc</code>
4022</h4></div></div></div><p>
4023By simply pushing a button, source code in the form of an
4024include file and a source file are created. They are called
4025<code class="literal">MyDetectorConstruction.cc</code> and <code class="literal">.hh</code> files.
4026They reflect all current user modifications in real-time.
4027</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Edit.Vis"></a>4.1.9.6. 
4028Visualization
4029</h4></div></div></div><p>
4030Examples of individual solids can be viewed with the help of
4031DAWN. The visualization of the whole geometry is be done after the
4032compilation of the source code <code class="literal">MyDetectorConstruction.cc</code>
4033with appropriate parts of Geant4. (In particular only the geometry
4034and visualization, together with the small other parts they depend
4035on, are needed.)
4036</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.ConvGeom"></a>4.1.10. 
4037Converting Geometries from Geant3.21
4038</h3></div></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.ConvGeom.App"></a>4.1.10.1. 
4039Approach
4040</h4></div></div></div><p>
4041<span class="bold"><strong>G3toG4</strong></span> is the Geant4 facility to convert
4042GEANT 3.21 geometries into Geant4. This is done in two stages:
4043
4044</p><div class="orderedlist"><ol type="1" compact><li><p>
4045    The user supplies a GEANT 3.21 RZ-file (.rz) containing the
4046    initialization data structures. An executable <code class="literal">rztog4</code> reads
4047    this file and produces an ASCII <span class="emphasis"><em>call list</em></span> file containing
4048    instructions on how to build the geometry. The source code of
4049    <code class="literal">rztog4</code> is FORTRAN.
4050  </p></li><li><p>
4051    A call list interpreter (<code class="literal">G4BuildGeom.cc</code>) reads these
4052    instructions and builds the geometry in the user's client code for
4053    Geant4.
4054  </p></li></ol></div><p>
4055</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.ConvGeom.Import"></a>4.1.10.2. 
4056Importing converted geometries into Geant4
4057</h4></div></div></div><p>
4058Two examples of how to use the call list interpreter are
4059supplied in the directory <code class="literal">examples/extended/g3tog4</code>:
4060
4061</p><div class="orderedlist"><ol type="1" compact><li><p>
4062    <code class="literal">cltog4</code> is a simple example which simply invokes the
4063    call list interpreter method <code class="literal">G4BuildGeom</code> from the
4064    <code class="literal">G3toG4DetectorConstruction</code> class, builds the geometry and
4065    exits.
4066  </p></li><li><p>
4067    <code class="literal">clGeometry</code>, is more complete and is patterned as for
4068    the novice Geant4 examples. It also invokes the call list
4069    interpreter, but in addition, allows the geometry to be visualized
4070    and particles to be tracked.
4071  </p></li></ol></div><p>
4072</p><p>
4073To compile and build the G3toG4 libraries, you need to have set in
4074your environment the variable <code class="literal">G4LIB_BUILD_G3TOG4</code> at the
4075time of installation. The G3toG4 libraries are not built by
4076default. Then, simply type
4077
4078</p><div class="informalexample"><pre class="programlisting">
4079  gmake
4080</pre></div><p>
4081
4082from the top-level <code class="literal">source/g3tog4</code> directory.
4083</p><p>
4084To build the converter executable <code class="literal">rztog4</code>, simply
4085type
4086
4087</p><div class="informalexample"><pre class="programlisting">
4088  gmake bin
4089</pre></div><p>
4090</p><p>
4091To make everything, simply type:
4092
4093</p><div class="informalexample"><pre class="programlisting">
4094  gmake global
4095</pre></div><p>
4096</p><p>
4097To remove all <code class="literal">G3toG4</code> libraries, executables and .d files,
4098simply type
4099
4100</p><div class="informalexample"><pre class="programlisting">
4101  gmake clean
4102</pre></div><p>
4103</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.ConvGeom.Curr"></a>4.1.10.3. 
4104Current Status
4105</h4></div></div></div><p>
4106The package has been tested with the geometries from experiments
4107like: BaBar, CMS, Atlas, Alice, Zeus, L3, and Opal.
4108</p><p>
4109Here is a comprehensive list of features supported and not
4110supported or implemented in the current version of the package:
4111
4112</p><div class="itemizedlist"><ul type="disc" compact><li><p>
4113    Supported shapes: all GEANT 3.21 shapes except for
4114    <code class="literal">GTRA</code>, <code class="literal">CTUB</code>.
4115  </p></li><li><p>
4116    <code class="literal">PGON</code>, <code class="literal">PCON</code> are built using the
4117    <span class="emphasis"><em>specific</em></span> solids <code class="literal">G4Polycone</code> and
4118    <code class="literal">G4Polyhedra</code>.
4119  </p></li><li><p>
4120    GEANT 3.21 <code class="literal">MANY</code> feature is only partially
4121    supported.
4122    <code class="literal">MANY</code> positions are resolved in the
4123    <code class="literal">G3toG4MANY()</code> function, which has to be processed before
4124    <code class="literal">G3toG4BuildTree()</code> (it is not called by default).
4125    In order to resolve <code class="literal">MANY</code>, the user code has to provide
4126    additional info using <code class="literal">G4gsbool(G4String volName, G4String
4127    manyVolName)</code> function for all the overlapping volumes.
4128    Daughters of overlapping volumes are then resolved automatically
4129    and should not be specified via <code class="literal">Gsbool</code>.
4130    <span class="bold"><strong>Limitation</strong></span>: a volume with a
4131    <code class="literal">MANY</code> position can have
4132    only this one position; if more than one position is needed a new
4133    volume has to be defined (<code class="literal">gsvolu()</code>) for each
4134    position.
4135  </p></li><li><p>
4136    <code class="literal">GSDV*</code> routines for dividing volumes are implemented,
4137    using <code class="literal">G4PVReplica</code>s, for shapes:
4138
4139    </p><div class="itemizedlist"><ul type="circle" compact><li><p>
4140        <code class="literal">BOX</code>, <code class="literal">TUBE</code>,
4141        <code class="literal">TUBS</code>, <code class="literal">PARA</code> - all axes;
4142      </p></li><li><p>
4143        <code class="literal">CONE</code>, <code class="literal">CONS</code> - axes 2, 3;
4144      </p></li><li><p>
4145        <code class="literal">TRD1</code>, <code class="literal">TRD2</code>,
4146        <code class="literal">TRAP</code> - axis 3;
4147      </p></li><li><p>
4148        <code class="literal">PGON</code>, <code class="literal">PCON</code> - axis 2;
4149      </p></li><li><p>
4150        <code class="literal">PARA</code> -axis 1; axis 2,3 for a special case
4151      </p></li></ul></div><p>
4152  </p></li><li><p>
4153    <code class="literal">GSPOSP</code> is implemented via individual logical volumes
4154    for each instantiation.
4155  </p></li><li><p>
4156    <code class="literal">GSROTM</code> is implemented. Reflections of hierachies based
4157    on plain CSG solids are implemented through the <code class="literal">G3Division</code>
4158    class.
4159  </p></li><li><p>
4160    Hits are not implemented.
4161  </p></li><li><p>
4162    Conversion of GEANT 3.21 magnetic field is currently not
4163    supported. However, the usage of magnetic field has to be turned on.
4164  </p></li></ul></div><p>
4165</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Overlap"></a>4.1.11. 
4166Detecting Overlapping Volumes
4167</h3></div></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Overlap.Prob"></a>4.1.11.1. 
4168The problem of overlapping volumes
4169</h4></div></div></div><p>
4170Volumes are often positioned within other volumes with the
4171intent that one is fully contained within the other. If, however, a
4172volume extends beyond the boundaries of its mother volume, it is
4173defined as overlapping. It may also be intended that volumes are
4174positioned within the same mother volume such that they do not
4175intersect one another. When such volumes do intersect, they are
4176also defined as overlapping.
4177</p><p>
4178The problem of detecting overlaps between volumes is bounded by
4179the complexity of the solid model description. Hence it requires
4180the same mathematical sophistication which is needed to describe
4181the most complex solid topology, in general. However, a tunable
4182accuracy can be obtained by approximating the solids via first
4183and/or second order surfaces and checking their intersections.
4184</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Overlap.BuiltIn"></a>4.1.11.2. 
4185Detecting overlaps: built-in kernel commands
4186</h4></div></div></div><p>
4187In general, the most powerful clash detection algorithms are
4188provided by CAD systems, treating the intersection between the
4189solids in their topological form.
4190</p><p>
4191Geant4 provides some built-in run-time commands to activate
4192verification tests for the user-defined geometry:
4193
4194</p><div class="informalexample"><pre class="programlisting">
4195     geometry/test/grid_test [recursion_flag]
4196     --&gt; to start verification of geometry for overlapping regions
4197         based on standard lines grid setup. If the "recursion_flag" is
4198         set to 'false' (the default), the check is limited to the first
4199         depth level of the geometry tree; otherwise it visits recursively
4200         the whole geometry tree. In the latter case, it may take a long
4201         time, depending on the complexity of the geometry.
4202     geometry/test/cylinder_test [recursion_flag]
4203     --&gt; shoots lines according to a cylindrical pattern. If the
4204         "recursion_flag" is set to 'false' (the default), the check is
4205         limited to the first depth level of the geometry tree; otherwise
4206         it visits recursively the whole geometry tree. In the latter case,
4207         it may take a long time, depending on the complexity of the geometry.
4208     geometry/test/line_test [recursion_flag]
4209     --&gt; shoots a line according to a specified direction and position
4210         defined by the user. If the "recursion_flag" is set to 'false'
4211         (the default), the check is limited to the first depth level of the
4212         geometry tree; otherwise it visits recursively the whole geometry
4213         tree.
4214     geometry/test/position
4215     --&gt; to specify position for the line_test.
4216     geometry/test/direction
4217     --&gt; to specify direction for the line_test.
4218     geometry/test/grid_cells
4219     --&gt; to define the resolution of the lines in the grid test as number
4220         of cells, specifying them for each dimension, X, Y and Z.
4221         The new settings will be applied to the grid_test command.
4222     geometry/test/cylinder_geometry
4223     --&gt; to define the details of the cylinder geometry, by specifying:
4224             nPhi - number of lines per Phi
4225             nZ   - number of Z points
4226             nRho - number of Rho points
4227         The new settings will be applied to the cylinder_test command.
4228     geometry/test/cylinder_scaleZ
4229     --&gt; to define the resolution of the cylinder geometry, by specifying
4230         the fraction scale for points along Z.
4231         The new settings will be applied to the cylinder_test command.
4232     geometry/test/cylinder_scaleRho
4233     --&gt; to define the resolution of the cylinder geometry, by specifying
4234         the fraction scale for points along Rho.
4235         The new settings will be applied to the cylinder_test command.
4236     geometry/test/recursion_start
4237     --&gt; to set the initial level in the geometry tree for starting the
4238         recursion (default value being zero, i.e. the world volume).
4239         The new settings will then be applied to any recursive test.
4240     geometry/test/recursion_depth
4241     --&gt; to set the depth in the geometry tree for recursion, so that
4242         recursion will stop after having reached the specified depth (the
4243         default being the full depth of the geometry tree).
4244         The new settings will then be applied to any recursive test.
4245</pre></div><p> 
4246</p><p>
4247To detect overlapping volumes, the built-in test uses the
4248intersection of solids with linear trajectories. For example,
4249consider <a href="ch04.html#fig.Geom.Overlap_1" title="Figure 4.4. 
4250  Different cases of placed volumes overlapping each other.
4251">Figure 4.4</a>:
4252
4253</p><div class="figure"><a name="fig.Geom.Overlap_1"></a><div class="figure-contents"><div class="mediaobject" align="center"><img src="./AllResources/Detector/geometry.src/geomtest.gif" align="middle" alt="Different cases of placed volumes overlapping each other."></div></div><p class="title"><b>Figure 4.4. 
4254  Different cases of placed volumes overlapping each other.
4255</b></p></div><p><br class="figure-break">
4256</p><p>
4257Here we have a line intersecting some physical volume (large,
4258black rectangle). Belonging to the volume are four daughters: A, B,
4259C, and D. Indicated by the dots are the intersections of the line
4260with the mother volume and the four daughters.
4261</p><p>
4262This example has two geometry errors. First, volume A sticks
4263outside its mother volume (this practice, sometimes used in
4264GEANT3.21, is not allowed in Geant4). This can be noticed because
4265the intersection point (leftmost magenta dot) lies outside the
4266mother volume, as defined by the space between the two black
4267dots.
4268</p><p>
4269The second error is that daughter volumes A and B overlap. This
4270is noticeable because one of the intersections with A (rightmost
4271magenta dot) is inside the volume B, as defined as the space
4272between the red dots. Alternatively, one of the intersections with
4273B (leftmost red dot) is inside the volume A, as defined as the
4274space between the magenta dots.
4275</p><p>
4276Each of these two types of errors is represented by a line
4277segment, which has a start point, an end point, and, a length.
4278Depending on the type of error, the points are most clearly
4279recognized in either the coordinate system of the volume, the
4280global coordinate system, or the coordinate system of the daughters
4281involved.
4282</p><p>
4283Also notice that certain errors will be missed unless a line is
4284supplied in precisely the correct path. Unfortunately, it is hard
4285to predict which lines are best at uncovering potential geometry
4286errors. Instead, the geometry testing code uses a grid of lines, in
4287the hope of at least uncovering gross geometry errors. More subtle
4288errors could easily be missed.
4289</p><p>
4290Another difficult issue is roundoff error. For example,
4291daughters C and D lie precisely next to each other. It is possible,
4292due to roundoff, that one of the intersections points will lie just
4293slightly inside the space of the other. In addition, a volume that
4294lies tightly up against the outside of its mother may have an
4295intersection point that just slightly lies outside the mother.
4296</p><p>
4297To avoid spurious errors caused by roundoff, a rather generous
4298tolerance of 0.1 micron is used by default. This tolerance can be
4299adjusted as needed by the application through the run-time
4300command:
4301
4302</p><div class="informalexample"><pre class="programlisting">
4303   geometry/test/tolerance &lt;new-value&gt;
4304</pre></div><p>
4305</p><p>
4306Finally, notice that no mention is made of the possible daughter
4307volumes of A, B, C, and D. To keep the code simple, only the
4308immediate daughters of a volume are checked at one pass. To test
4309these "granddaughter" volumes, the daughters A, B, C, and D each
4310have to be tested themselves in turn. To make this more automatic,
4311an optional recursive algorithm is included; it first tests a
4312target volume, then it loops over all daughter volumes and calls
4313itself.
4314</p><p>
4315Pay attention! For a complex geometry, checking the entire
4316volume hierarchy can be extremely time consuming.
4317</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Overlap.AtConst"></a>4.1.11.3. 
4318Detecting overlaps at construction
4319</h4></div></div></div><p>
4320Since release 8.0, the Geant4 geometry modeler provides the
4321ability to detect overlaps of placed volumes (normal placements or
4322parameterised) at the time of construction. This check is optional
4323and can be activated when instantiating a placement (see
4324<code class="literal">G4PVPlacement</code> constructor in
4325<a href="ch04.html#sect.Geom.PhysVol.PlaceSingle" title="4.1.4.1. 
4326Placements: single positioned copy
4327">Section 4.1.4.1</a>) or a parameterised
4328volume (see <code class="literal">G4PVParameterised</code> constructor in
4329<a href="ch04.html#sect.Geom.PhysVol.RepeatVol" title="4.1.4.2. 
4330Repeated volumes
4331">Section 4.1.4.2</a>).
4332</p><p>
4333The positioning of that specific volume will be checked against all
4334volumes in the same hierarchy level and its mother volume.
4335Depending on the complexity of the geometry being checked, the
4336check may require considerable CPU time; it is therefore suggested
4337to use it only for debugging the geometry setup and to apply it
4338only to the part of the geometry setup which requires
4339debugging.
4340</p><p>
4341The classes <code class="literal">G4PVPlacement</code> and
4342<code class="literal">G4PVParameterised</code> also provide a method:
4343
4344</p><div class="informalexample"><pre class="programlisting">
4345   G4bool CheckOverlaps(G4int res=1000, G4double tol=0., G4bool verbose=true)
4346</pre></div><p>
4347
4348which will force the check for the specified volume. The check
4349verifies if each placed or parameterised instance is overlapping
4350with other instances or with its mother volume. A default
4351resolution for the number of points to be generated and verified is
4352provided. The method returns <code class="literal">true</code> if an overlap
4353occurs. It is also possible to specify a "tolerance" by which overlaps
4354not exceeding such quantity will not be reported; by default, all
4355overlaps are reported.
4356</p><p>
4357<span class="bold"><strong>Using the visualization driver: DAVID</strong></span>
4358</p><p>
4359The Geant4 visualization offers a powerful debugging tool for
4360detecting potential intersections of physical volumes. The Geant4
4361<a href="http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAVID.html" target="_top">
4362DAVID</a> visualization tool  can infact
4363automatically detect the overlaps between the volumes defined in
4364Geant4 and converted to a graphical representation for
4365visualization purposes. The accuracy of the graphical
4366representation can be tuned onto the exact geometrical description.
4367In the debugging, physical-volume surfaces are automatically
4368decomposed into 3D polygons, and intersections of the generated
4369polygons are investigated. If a polygon intersects with another
4370one, physical volumes which these polygons belong to are visualized
4371in color (red is the default). The <a href="ch04.html#fig.Geom.Overlap_2" title="Figure 4.5. 
4372  A geometry with overlapping volumes highlighted by DAVID.
4373">Figure 4.5</a> 
4374below is a sample visualization of a detector geometry with intersecting
4375physical volumes highlighted:
4376
4377</p><div class="figure"><a name="fig.Geom.Overlap_2"></a><div class="figure-contents"><div class="mediaobject" align="center"><img src="./AllResources/Detector/geometry.src/DAVID_SAMPLE.gif" align="middle" alt="A geometry with overlapping volumes highlighted by DAVID."></div></div><p class="title"><b>Figure 4.5. 
4378  A geometry with overlapping volumes highlighted by DAVID.
4379</b></p></div><p><br class="figure-break">
4380</p><p>
4381At present physical volumes made of the following solids are
4382able to be debugged: <code class="literal">G4Box</code>, <code class="literal">G4Cons</code>,
4383<code class="literal">G4Para</code>, <code class="literal">G4Sphere</code>, <code class="literal">G4Trd</code>,
4384<code class="literal">G4Trap</code>, <code class="literal">G4Tubs</code>. (Existence of other solids is
4385harmless.)
4386</p><p>
4387Visual debugging of physical-volume surfaces is performed with
4388the DAWNFILE driver defined in the visualization category and with
4389the two application packages, i.e. Fukui Renderer "DAWN" and a
4390visual intersection debugger "DAVID".
4391<a href="http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAWN.html" target="_top">
4392DAWN</a> and
4393<a href="http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAVID.html" target="_top">
4394DAVID</a> can be downloaded from the Web.
4395</p><p>
4396How to compile Geant4 with the DAWNFILE driver incorporated is
4397described in <a href="ch08s03.html" title="8.3. 
4398The Visualization Drivers
4399">Section 8.3</a>.
4400</p><p>
4401If the DAWNFILE driver, DAWN and DAVID are all working well in
4402your host machine, the visual intersection debugging of
4403physical-volume surfaces can be performed as follows:
4404</p><p>
4405Run your Geant4 executable, invoke the DAWNFILE driver, and
4406execute visualization commands to visualize your detector
4407geometry:
4408
4409</p><div class="informalexample"><pre class="programlisting">
4410     Idle&gt; /vis/open DAWNFILE
4411     .....(setting camera etc)...
4412     Idle&gt; /vis/drawVolume
4413     Idle&gt; /vis/viewer/update
4414</pre></div><p>
4415</p><p>
4416Then a file "g4.prim", which describes the detector geometry, is
4417generated in the current directory and DAVID is invoked to read it.
4418(The description of the format of the file g4.prim can be found
4419from the
4420<a href="http://geant4.kek.jp/GEANT4/vis/DAWN/G4PRIM_FORMAT_24/" target="_top">
4421DAWN web site documentation</a>.)
4422</p><p>
4423If DAVID detects intersection of physical-volume surfaces, it
4424automatically invokes DAWN to visualize the detector geometry with
4425the intersected physical volumes highlighted (See the above sample
4426visualization).
4427</p><p>
4428If no intersection is detected, visualization is skipped and the
4429following message is displayed on the console:
4430
4431</p><div class="informalexample"><pre class="programlisting">
4432     ------------------------------------------------------
4433     !!! Number of intersected volumes : 0 !!!
4434     !!! Congratulations ! \(^o^)/         !!!
4435     ------------------------------------------------------
4436</pre></div><p>
4437</p><p>
4438If you always want to skip visualization, set an environmental
4439variable as follows beforehand:
4440
4441</p><div class="informalexample"><pre class="programlisting">
4442     %  setenv DAVID_NO_VIEW  1
4443</pre></div><p>
4444</p><p>
4445To control the precision associated to computation of
4446intersections (default precision is set to 9), it is possible to
4447use the environmental variable for the DAWNFILE graphics driver, as
4448follows:
4449
4450</p><div class="informalexample"><pre class="programlisting">
4451     %  setenv G4DAWNFILE_PRECISION  10
4452</pre></div><p>
4453</p><p>
4454If necessary, re-visualize the detector geometry with
4455intersected parts highlighted. The data are saved in a file
4456"g4david.prim" in the current directory. This file can be
4457re-visualized with DAWN as follows:
4458
4459</p><div class="informalexample"><pre class="programlisting">
4460     % dawn g4david.prim
4461</pre></div><p>
4462</p><p>
4463It is also helpful to convert the generated file g4david.prim
4464into a VRML-formatted file and perform interactive visualization of
4465it with your WWW browser. The file conversion tool
4466<code class="literal">prim2wrml</code> can be downloaded from the
4467<a href="http://geant4.kek.jp/GEANT4/vis/DAWN/About_prim2vrml1.html" target="_top">
4468DAWN web site download pages</a>.
4469</p><p>
4470For more details, see the
4471<a href="http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAVID.html" target="_top">
4472document of DAVID</a> mentioned above.
4473</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="sect.Geom.Overlap.OLAP"></a>4.1.11.4. 
4474Using the geometry debugging tool OLAP
4475</h4></div></div></div><p>
4476<span class="bold"><strong>OLAP</strong></span> is a tool developed in the CMS experiment
4477at CERN to help in identifying ovelapping volumes in a detector geometry. It
4478is placed in the area for specific tools/examples, in
4479<code class="literal">geant4/examples/extended/geometry</code>. The technique consists
4480in shooting <code class="literal">geantinos</code> particles in one direction and the
4481opposite one, and verifying that the boundary crossings are the
4482same.
4483</p><p>
4484The tool can be used for any Geant4 geometry, provided that the
4485user geometry to be debugged is available as a subclass of
4486<code class="literal">G4VUserDetectorConstruction</code> and is used to construct the
4487<code class="literal">OlapDetConstr</code> class of the tool. A dummy class
4488<code class="literal">RandomDetector</code> is provided for this purpose in the tool
4489itself.
4490</p><p>
4491Run-time commands are provided by the tool to navigate in the
4492geometry tree. UNIX like navigation of the logical volume hierarchy
4493is provided by the <code class="literal">/olap/cd</code> command. The root of the
4494logical volume tree can be accessed by the character '/'. Any node
4495in the volume tree can be accessed by a '/' separated string of
4496regular expressions. If '/' is at the beginning of the string, the
4497tree hierarchy is transversed from the root, otherwise from the
4498currently chosen logical volume. Further the command <code class="literal">/olap/goto
4499[regexp]</code> can be used to jump to the first logical volume
4500matching the expression <code class="literal">[regexp]</code>. Every successful
4501navigation command (<code class="literal">/olap/cd</code>, <code class="literal">olap/goto</code>) results
4502in the construction of a <code class="literal">NewWorld</code>, the mother volume being
4503the argument of the command and the daughter volumes being the
4504direct daughters of the mother volume.
4505</p><p>
4506<code class="literal">/olap/pwd</code> always shows where in the full geometrical
4507hierarchy the current <code class="literal">NewWorld</code> and mother volume are
4508located.
4509</p><p>
4510For more detailed information, view the <code class="literal">README</code> file
4511provided with the tool.
4512</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Dyna"></a>4.1.12. 
4513Dynamic Geometry Setups
4514</h3></div></div></div><p>
4515Geant4 can handle geometries which vary in time (e.g. a geometry
4516varying between two runs in the same job).
4517</p><p>
4518It is considered a change to the geometry setup, whenever:
4519
4520</p><div class="itemizedlist"><ul type="disc" compact><li><p>
4521    the shape or dimension of an existing solid is modified;
4522  </p></li><li><p>
4523    the positioning (translation or rotation) of a volume is
4524    changed;
4525  </p></li><li><p>
4526    a volume (or a set of volumes, tree) is removed/replaced or
4527    added.
4528  </p></li></ul></div><p>
4529</p><p>
4530Whenever such a change happens, the geometry setup needs to be
4531first "opened" for the change to be applied and afterwards "closed"
4532for the optimisation to be reorganised.
4533</p><p>
4534In the general case, in order to notify the Geant4 system of the
4535change in the geometry setup, the <code class="literal">G4RunManager</code> has to be
4536messaged once the new geometry setup has been finalised:
4537
4538</p><div class="informalexample"><pre class="programlisting">
4539     G4RunManager::GeometryHasBeenModified();
4540</pre></div><p> 
4541</p><p>
4542The above notification needs to be performed also if a material
4543associated to a <span class="emphasis"><em>positioned</em></span> volume is changed, in order to
4544allow for the internal materials/cuts table to be updated. However,
4545for relatively complex geometries the re-optimisation step may be
4546extremely inefficient, since it has the effect that the whole
4547geometry setup will be re-optimised and re-initialised. In cases
4548where only a limited portion of the geometry has changed, it may be
4549suitable to apply the re-optimisation only to the affected portion
4550of the geometry (subtree).
4551</p><p>
4552Since release 7.1 of the Geant4 toolkit, it is possible to apply
4553re-optimisation local to the subtree of the geometry which has
4554changed. The user will have to explicitly "open/close" the geometry
4555providing a pointer to the top physical volume concerned:
4556
4557</p><div class="example"><a name="programlist_Geom.Dyna_1"></a><p class="title"><b>Example 4.9. 
4558Opening and closing a portion of the geometry without
4559notifying the <code class="literal">G4RunManager</code>.
4560</b></p><div class="example-contents"><pre class="programlisting">
4561 #include "G4GeometryManager.hh"
4562 
4563 // Open geometry for the physical volume to be modified ...
4564 //
4565 G4GeometryManager::OpenGeometry(physCalor);
4566 
4567 // Modify dimension of the solid ...
4568 //
4569 physCalor-&gt;GetLogicalVolume()-&gt;GetSolid()-&gt;SetXHalfLength(12.5*cm);
4570 
4571 // Close geometry for the portion modified ...
4572 //
4573 G4GeometryManager::CloseGeometry(physCalor);
4574</pre></div></div><p><br class="example-break">
4575</p><p>
4576If the existing geometry setup is modified locally in more than
4577one place, it may be convenient to apply such a technique only
4578once, by specifying a physical volume on top of the hierarchy
4579(subtree) containing all changed portions of the setup.
4580</p><p>
4581An alternative solution for dealing with dynamic geometries is
4582to specify NOT to apply optimisation for the subtree affected by
4583the change and apply the general solution of invoking the
4584<code class="literal">G4RunManager</code>. In this case, a performance penalty at
4585run-time may be observed (depending on the complexity of the
4586not-optimised subtree), considering that, without optimisation,
4587intersections to all volumes in the subtree will be explicitely
4588computed each time.
4589</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.GDML"></a>4.1.13. 
4590Importing XML Models Using GDML
4591</h3></div></div></div><p>
4592Geometry Description Markup Language (<a href="http://cern.ch/gdml/" target="_top">GDML</a>)
4593is a markup language based on XML and suited for the description of detector
4594geometry models. It allows for easy exchange of geometry data in a
4595<span class="emphasis"><em>human-readable</em></span> XML-based description and structured
4596formatting.
4597</p><p>
4598The GDML parser is component of Geant4 which can be built
4599and installed as an optional choice. It allows for importing and
4600exporting GDML files, following the schema specified in the GDML
4601documentation. The installation of the plugin is optional and requires
4602the installation of the
4603<a href="http://xerces.apache.org/xerces-c/" target="_top">XercesC</a>
4604DOM parser.
4605</p><p>
4606An example of how to import and export a detector description
4607model based on
4608<a href="http://cern.ch/gdml/" target="_top">
4609<span class="bold"><strong>GDML</strong></span> 
4610</a>
4611is provided and can be found in <code class="literal">examples/extended/gdml</code>.
4612A description on how to define a geometry in GDML together with
4613an annotated example, is provided in the
4614<a href="http://cern.ch/gdml/g4example.html" target="_top">
4615GDML example page</a>.
4616</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sect.Geom.Persistency"></a>4.1.14. 
4617Saving geometry tree objects in binary format
4618</h3></div></div></div><p>
4619The Geant4 geometry tree can be stored in the Root binary file format
4620using the <span class="emphasis"><em>reflection</em></span> technique provided by the
4621Reflex tool (included in Root). Such a binary file can then be used
4622to quickly load the geometry into the memory or to move geometries
4623between different Geant4 applications.
4624</p><p>
4625See <a href="http://cern.ch/geant4/UserDocumentation/UsersGuides/ForApplicationDeveloper/html/ch04s06.html" target="_top">Chapter 4.6</a>
4626for details and references.
4627</p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s07.html"><img src="AllResources/IconsGIF/prev.gif" alt="Prev"></a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch04s02.html"><img src="AllResources/IconsGIF/next.gif" alt="Next"></a></td></tr><tr><td width="40%" align="left" valign="top">3.7. 
4628Event Biasing Techniques
4629 </td><td width="20%" align="center"><a accesskey="h" href="index.html"><img src="AllResources/IconsGIF/home.gif" alt="Home"></a></td><td width="40%" align="right" valign="top"> 4.2. 
4630Material
4631</td></tr></table></div></body></html>
Note: See TracBrowser for help on using the repository browser.