source: trunk/documents/UserDoc/DocBookUsersGuides/ForApplicationDeveloper/xml/Detector/geomSolids.xml @ 1013

Last change on this file since 1013 was 904, checked in by garnier, 16 years ago

ajout de la doc

File size: 75.3 KB
Line 
1<!-- ******************************************************** -->
2<!--                                                          -->
3<!--  [History]                                               -->
4<!--    Converted to DocBook: Katsuya Amako, Aug-2006         -->
5<!--    Changed by: Gabriele Cosmo, 18-Apr-2005               -->
6<!--                                                          -->
7<!-- ******************************************************** -->
8
9
10<!-- ******************* Section (Level#2) ****************** -->
11<sect2 id="sect.Geom.Solids">
12<title>
13Solids
14</title>
15
16<para>
17The STEP standard supports multiple solid representations.
18Constructive Solid Geometry (CSG) representations and Boundary
19Represented Solids (BREPs) are available. Different representations
20are suitable for different purposes, applications, required
21complexity, and levels of detail. CSG representations are easy to
22use and normally give superior performance, but they cannot
23reproduce complex solids such as those used in CAD systems. BREP
24representations can handle more extended topologies and reproduce
25the most complex solids.
26</para>
27
28<para>
29All constructed solids can stream out their contents via
30appropriate methods and streaming operators.
31</para>
32
33<para>
34For all solids it is possible to estimate the geometrical volume and the
35surface area by invoking the methods:
36
37<informalexample>
38<programlisting>
39   G4double GetCubicVolume()
40   G4double GetSurfaceArea()
41</programlisting>
42</informalexample>
43
44which return an estimate of the solid volume and total area in internal
45units respectively. For elementary solids the functions compute the exact
46geometrical quantities, while for composite or complex solids an estimate
47is made using Monte Carlo techniques.
48</para>
49
50<para>
51For all solids it is also possible to generate pseudo-random
52points lying on their surfaces, by invoking the method
53
54<informalexample>
55<programlisting>
56   G4ThreeVector GetPointOnSurface() const
57</programlisting>
58</informalexample>
59
60which returns the generated point in local coordinates relative to
61the solid.
62</para>
63
64
65<!-- ******************* Section (Level#3) ****************** -->
66<sect3 id="sect.Geom.Solids.CSG">
67<title>
68Constructed Solid Geometry (CSG) Solids
69</title>
70
71<para>
72CSG solids are defined directly as three-dimensional primitives.
73They are described by a minimal set of parameters necessary to
74define the shape and size of the solid. CSG solids are Boxes, Tubes
75and their sections, Cones and their sections, Spheres, Wedges, and
76Toruses.
77</para>
78
79<!-- ******* Bridgehead ******* -->
80<bridgehead renderas='sect4'>
81Box:
82</bridgehead>
83
84<para> 
85To create a <emphasis role="bold">box</emphasis> one can use the constructor:
86
87<informaltable frame="none" pgwide="0">
88<tgroup cols="2" colsep="0">
89<tbody>
90<row>
91  <entry valign="top" align="left">
92    <informalexample>
93    <programlisting>
94   G4Box(const G4String&amp; pName,                         
95               G4double  pX,
96               G4double  pY,
97               G4double  pZ)
98    </programlisting> 
99    </informalexample>
100  </entry>
101  <entry valign="top" align="center">
102    <mediaobject>
103    <imageobject  role="fo">
104      <imagedata fileref="./AllResources/Detector/geometry.src/aBox.jpg"
105                 format="JPG" contentwidth="3.5cm" />
106    </imageobject>
107    <imageobject  role="html">
108      <imagedata fileref="./AllResources/Detector/geometry.src/aBox.jpg"
109                 format="JPG" />
110    </imageobject>
111    </mediaobject>
112
113    <?JavaScript pic1.html ?>
114    <emphasis role="underline">In the picture</emphasis>:
115    <literal>
116    <para>
117    pX = 30, pY = 40, pZ = 60                                                       
118    </para>
119    </literal>
120  </entry>
121</row>
122</tbody>
123</tgroup>
124</informaltable>
125</para>
126
127<para>
128by giving the box a name and its half-lengths along the X, Y and
129Z axis:
130<informaltable pgwide="0">
131<tgroup cols="6">
132<tbody>
133<row>
134  <entry>
135    <literal>pX</literal>
136  </entry>
137  <entry>
138    half length in X
139  </entry>
140  <entry>
141    <literal>pY</literal>
142  </entry>
143  <entry>
144    half length in Y
145  </entry>
146  <entry>
147    <literal>pZ</literal>
148  </entry>
149  <entry>
150    half length in Z
151  </entry>
152</row>
153</tbody>
154</tgroup>
155</informaltable>
156</para>
157   
158<para>
159This will create a box that extends from <literal>-pX</literal> to
160<literal>+pX</literal> in X, from <literal>-pY</literal> to
161<literal>+pY</literal> in Y, and from
162<literal>-pZ</literal> to <literal>+pZ</literal> in Z.
163</para>
164
165<para>
166For example to create a box that is 2 by 6 by 10 centimeters in
167full length, and called <literal>BoxA</literal> one should use the following
168code:
169<informalexample>
170<programlisting> 
171   G4Box* aBox = new G4Box("BoxA", 1.0*cm, 3.0*cm, 5.0*cm);
172</programlisting>
173</informalexample>
174</para>
175
176<!-- ******* Bridgehead ******* -->
177<bridgehead renderas='sect4'>
178Cylindrical Section or Tube:
179</bridgehead>
180
181<para> 
182Similarly to create a <emphasis role="bold">cylindrical section</emphasis> 
183or <emphasis role="bold">tube</emphasis>, one would use the constructor:
184
185<informaltable frame="none" pgwide="0">
186<tgroup cols="2" colsep="0">
187<tbody>
188<row>
189  <entry valign="top" align="left">
190    <informalexample>
191    <programlisting> 
192   G4Tubs(const G4String&amp; pName,                       
193                G4double  pRMin,
194                G4double  pRMax,
195                G4double  pDz,
196                G4double  pSPhi,
197                G4double  pDPhi)
198    </programlisting> 
199    </informalexample>
200  </entry>
201  <entry valign="top" align="center">
202    <mediaobject>
203    <imageobject role="fo">
204      <imagedata fileref="./AllResources/Detector/geometry.src/aTubs.jpg"
205                 format="JPG" contentwidth="3.5cm" />
206    </imageobject>
207    <imageobject role="html">
208      <imagedata fileref="./AllResources/Detector/geometry.src/aTubs.jpg"
209                 format="JPG" />
210    </imageobject>
211    </mediaobject>
212
213    <?JavaScript pic2.html ?>
214    <emphasis role="underline">In the picture</emphasis>:
215    <literal>
216    <para>
217    pRMin = 10, pRMax = 15, pDz = 20
218    </para>
219    </literal>
220  </entry>
221</row>
222</tbody>
223</tgroup>
224</informaltable>
225</para>
226
227<para>
228giving its name <literal>pName</literal> and its parameters which are:
229<informaltable pgwide="0">
230<tgroup cols="4">
231<tbody>
232<row>
233  <entry>
234    <literal>pRMin</literal>
235  </entry>
236  <entry>
237    Inner radius
238  </entry>
239  <entry>
240    <literal>pRMax</literal>
241  </entry>
242  <entry>
243    Outer radius
244  </entry>
245</row>
246<row>
247  <entry>
248    <literal>pDz</literal>
249  </entry>
250  <entry>
251    half length in z
252  </entry>
253  <entry>
254    <literal>pSPhi</literal>
255  </entry>
256  <entry>
257    the starting phi angle in radians
258  </entry>
259</row>
260<row>
261  <entry>
262    <literal>pDPhi</literal>
263  </entry>
264  <entry>
265    the angle of the segment in radians
266  </entry>
267</row>
268</tbody>
269</tgroup>
270</informaltable>
271</para>
272
273<!-- ******* Bridgehead ******* -->
274<bridgehead renderas='sect4'>
275Cone or Conical section:
276</bridgehead>
277
278<para> 
279Similarly to create a <emphasis role="bold">cone</emphasis>, or
280<emphasis role="bold">conical section</emphasis>, one would use the constructor
281
282<informaltable frame="none" pgwide="0">
283<tgroup cols="2" colsep="0">
284<tbody>
285<row>
286  <entry valign="top" align="left">
287    <informalexample>
288    <programlisting> 
289   G4Cons(const G4String&amp; pName,                       
290                G4double  pRmin1,
291                G4double  pRmax1,
292                G4double  pRmin2,
293                G4double  pRmax2,
294                G4double  pDz,
295                G4double  pSPhi,
296                G4double  pDPhi)
297    </programlisting>
298    </informalexample>
299  </entry>
300  <entry valign="top" align="center">
301    <mediaobject>
302    <imageobject  role="fo">
303      <imagedata fileref="./AllResources/Detector/geometry.src/aCons.jpg"
304                 format="JPG" contentwidth="3.5cm" />
305    </imageobject>
306    <imageobject  role="html">
307      <imagedata fileref="./AllResources/Detector/geometry.src/aCons.jpg"
308                 format="JPG" />
309    </imageobject>
310    </mediaobject>
311
312    <?JavaScript pic3.html ?>
313    <emphasis role="underline">In the picture</emphasis>:
314    <literal>
315    <para>
316    pRmin1 = 5, pRmax1 = 10,
317    pRmin2 = 20, pRmax2 = 25,
318    pDz = 40, pSPhi = 0, pDPhi = 4/3*Pi
319    </para>
320    </literal>
321  </entry>
322</row>
323</tbody>
324</tgroup>
325</informaltable>
326</para>
327
328<para>
329giving its name <literal>pName</literal>, and its parameters which are:
330<informaltable pgwide="0">
331<tgroup cols="4">
332<tbody>
333<row>
334  <entry>
335    <literal>pRmin1</literal>
336  </entry>
337  <entry>
338    inside radius at <literal>-pDz</literal>
339  </entry>
340  <entry>
341    <literal>pRmax1</literal>
342  </entry>
343  <entry>
344    outside radius at <literal>-pDz</literal>
345  </entry>
346</row>
347<row>
348  <entry>
349    <literal>pRmin2</literal>
350  </entry>
351  <entry>
352    inside radius at <literal>+pDz</literal>
353  </entry>
354  <entry>
355    <literal>pRmax2</literal>
356  </entry>
357  <entry>
358    outside radius at <literal>+pDz</literal>
359  </entry>
360</row>
361<row>
362  <entry>
363    <literal>pDz</literal>
364  </entry>
365  <entry>
366    half length in z
367  </entry>
368  <entry>
369    <literal>pSPhi</literal>
370  </entry>
371  <entry>
372    starting angle of the segment in radians
373  </entry>
374</row>
375<row>
376  <entry>
377    <literal>pDPhi</literal>
378  </entry>
379  <entry>
380    the angle of the segment in radians
381  </entry>
382</row>
383</tbody>
384</tgroup>
385</informaltable>
386</para>
387   
388<!-- ******* Bridgehead ******* -->
389<bridgehead renderas='sect4'>
390Parallelepiped:
391</bridgehead>
392
393<para> 
394A <emphasis role="bold">parallelepiped</emphasis> is constructed
395using:
396
397<informaltable frame="none" pgwide="0">
398<tgroup cols="2" colsep="0">
399<tbody>
400<row>
401  <entry valign="top" align="left">
402    <informalexample>
403    <programlisting> 
404   G4Para(const G4String&amp; pName,                                 
405                G4double   dx,
406                G4double   dy,
407                G4double   dz,
408                G4double   alpha,
409                G4double   theta,
410                G4double   phi)
411    </programlisting> 
412    </informalexample>
413  </entry>
414  <entry valign="top" align="center">
415    <mediaobject>
416    <imageobject  role="fo">
417      <imagedata fileref="./AllResources/Detector/geometry.src/aPara.jpg"
418                 format="JPG" contentwidth="3.5cm" />
419    </imageobject>
420    <imageobject  role="html">
421      <imagedata fileref="./AllResources/Detector/geometry.src/aPara.jpg"
422                 format="JPG" />
423    </imageobject>
424    </mediaobject>
425
426    <?JavaScript pic4.html ?>
427    <emphasis role="underline">In the picture</emphasis>:
428    <literal>
429    <para>
430    dx = 30, dy = 40, dz = 60
431    </para>
432    </literal>
433  </entry>
434</row>
435</tbody>
436</tgroup>
437</informaltable>
438</para>
439
440<para>
441giving its name <literal>pName</literal> and its parameters which are:
442<informaltable pgwide="0">
443<tgroup cols="2">
444<tbody>
445<row>
446  <entry>
447    <literal>dx,dy,dz</literal>   
448  </entry>
449  <entry>
450    Half-length in x,y,z
451  </entry>
452</row>
453<row>
454  <entry>
455    <literal>alpha</literal>
456  </entry>
457  <entry>
458    Angle formed by the y axis and by the plane joining the centre
459    of the faces <emphasis>parallel</emphasis> to the z-x plane at -dy and +dy
460  </entry>
461</row>
462<row>
463  <entry>
464    <literal>theta</literal>
465  </entry>
466  <entry>
467    Polar angle of the line joining the centres of the faces at -dz
468    and +dz in z
469  </entry>
470</row>
471<row>
472  <entry>
473    <literal>phi</literal>
474  </entry>
475  <entry>
476    Azimuthal angle of the line joining the centres of the faces at
477    -dz and +dz in z
478  </entry>
479</row>
480</tbody>
481</tgroup>
482</informaltable>
483</para>
484
485<!-- ******* Bridgehead ******* -->
486<bridgehead renderas='sect4'>
487Trapezoid:
488</bridgehead>
489
490<para> 
491To construct a <emphasis role="bold">trapezoid</emphasis> use:
492
493<informaltable frame="none" pgwide="0">
494<tgroup cols="2" colsep="0">
495<tbody>
496<row>
497  <entry valign="top" align="left">
498    <informalexample>
499    <programlisting> 
500   G4Trd(const G4String&amp; pName,                           
501               G4double  dx1,
502               G4double  dx2,
503               G4double  dy1,
504               G4double  dy2,
505               G4double  dz)
506    </programlisting> 
507    </informalexample>
508  </entry>
509  <entry valign="top" align="center">
510    <mediaobject>
511    <imageobject  role="fo">
512      <imagedata fileref="./AllResources/Detector/geometry.src/aTrd.jpg"
513                 format="JPG" contentwidth="3.5cm" />
514    </imageobject>
515    <imageobject  role="html">
516      <imagedata fileref="./AllResources/Detector/geometry.src/aTrd.jpg"
517                 format="JPG" />
518    </imageobject>
519    </mediaobject>
520
521    <?JavaScript pic5.html ?>
522    <emphasis role="underline">In the picture</emphasis>:
523    <literal>
524    <para>
525    dx1 = 30, dx2 = 10,
526    dy1 = 40, dy2 = 15,
527    dz = 60
528    </para>
529    </literal>
530  </entry>
531</row>
532</tbody>
533</tgroup>
534</informaltable>
535</para>
536
537<para>
538to obtain a solid with name <literal>pName</literal> and parameters
539
540<informaltable pgwide="0">
541<tgroup cols="2">
542<tbody>
543<row>
544  <entry>
545    <literal>dx1</literal>
546  </entry>
547  <entry>
548    Half-length along x at the surface positioned at <literal>-dz</literal>
549  </entry>
550</row>
551<row>
552  <entry>
553    <literal>dx2</literal>
554  </entry>
555  <entry>
556    Half-length along x at the surface positioned at <literal>+dz</literal>
557  </entry>
558</row>
559<row>
560  <entry>
561    <literal>dy1</literal>
562  </entry>
563  <entry>
564    Half-length along y at the surface positioned at <literal>-dz</literal>
565  </entry>
566</row>
567<row>
568  <entry>
569    <literal>dy2</literal>
570  </entry>
571  <entry>
572    Half-length along y at the surface positioned at <literal>+dz</literal>
573  </entry>
574</row>
575<row>
576  <entry>
577    <literal>dz</literal>
578  </entry>
579  <entry>
580    Half-length along z axis
581  </entry>
582</row>
583</tbody>
584</tgroup>
585</informaltable>
586</para>
587   
588<!-- ******* Bridgehead ******* -->
589<bridgehead renderas='sect4'>
590Generic Trapezoid:
591</bridgehead>
592
593<para> 
594To build a <emphasis role="bold">generic trapezoid</emphasis>,
595the <literal>G4Trap</literal> class is provided. Here are the two costructors
596for a Right Angular Wedge and for the general trapezoid for it:
597
598<informaltable frame="none" pgwide="0">
599<tgroup cols="2" colsep="0">
600<tbody>
601<row>
602  <entry valign="top" align="left">
603    <informalexample>
604    <programlisting> 
605 G4Trap(const G4String&amp; pName,                       
606              G4double   pZ,
607              G4double   pY,
608              G4double   pX,
609              G4double   pLTX)
610
611 G4Trap(const G4String&amp; pName,                         
612              G4double   pDz,   G4double   pTheta,
613              G4double   pPhi,  G4double   pDy1,
614              G4double   pDx1,  G4double   pDx2,
615              G4double   pAlp1, G4double   pDy2,
616              G4double   pDx3,  G4double   pDx4,
617              G4double   pAlp2)
618    </programlisting> 
619    </informalexample>
620  </entry>
621  <entry valign="top" align="center">
622    <mediaobject>
623    <imageobject  role="fo">
624      <imagedata fileref="./AllResources/Detector/geometry.src/aTrap.jpg"
625                 format="JPG" contentwidth="3.5cm" />
626    </imageobject>
627    <imageobject  role="html">
628      <imagedata fileref="./AllResources/Detector/geometry.src/aTrap.jpg"
629                 format="JPG" />
630    </imageobject>
631    </mediaobject>
632
633    <?JavaScript pic6.html ?>
634    <emphasis role="underline">In the picture</emphasis>:
635    <literal>
636    <para>
637    pDx1 = 30, pDx2 = 40, pDy1 = 40,
638    pDx3 = 10, pDx4 = 14, pDy2 = 16,
639    pDz = 60, pTheta = 20*Degree,
640    pPhi = 5*Degree, pAlp1 = pAlp2 = 10*Degree
641    </para>
642    </literal>
643  </entry>
644</row>
645</tbody>
646</tgroup>
647</informaltable>
648</para>
649
650<para>
651to obtain a Right Angular Wedge with name <literal>pName</literal> and
652parameters:
653<informaltable pgwide="0">
654<tgroup cols="2">
655<tbody>
656<row>
657  <entry>
658    <literal>pZ</literal>
659  </entry>
660  <entry>
661    Length along z
662  </entry>
663</row>
664<row>
665  <entry>
666    <literal>pY</literal>
667  </entry>
668  <entry>
669    Length along y
670  </entry>
671</row>
672<row>
673  <entry>
674    <literal>pX</literal>
675  </entry>
676  <entry>
677    Length along x at the wider side
678  </entry>
679</row>
680<row>
681  <entry>
682    <literal>pLTX</literal>
683  </entry>
684  <entry>
685    Length along x at the narrower side (<literal>plTX&lt;=pX</literal>)
686  </entry>
687</row>
688</tbody>
689</tgroup>
690</informaltable>
691</para>
692
693<para>
694or to obtain the general trapezoid (see the Software Reference
695Manual):
696</para>
697   
698<para>
699<informaltable pgwide="0">
700<tgroup cols="2">
701<tbody>
702<row>
703  <entry>
704   <literal>pDx1</literal> 
705  </entry>
706  <entry>
707    Half x length of the side at y=-pDy1 of the face at -pDz
708  </entry>
709</row>
710<row>
711  <entry>
712    <literal>pDx2</literal>
713  </entry>
714  <entry>
715    Half x length of the side at y=+pDy1 of the face at -pDz
716  </entry>
717</row>
718<row>
719  <entry>
720    <literal>pDz</literal>
721  </entry>
722  <entry>
723    Half z length
724  </entry>
725</row>
726<row>
727  <entry>
728    <literal>pTheta</literal>
729  </entry>
730  <entry>
731    Polar angle of the line joining the centres of the faces at -/+pDz
732  </entry>
733</row>
734<row>
735  <entry>
736    <literal>pPhi</literal>
737  </entry>
738  <entry>
739    Azimuthal angle of the line joining the centre of the face at -pDz to the centre of the face at +pDz
740  </entry>
741</row>
742<row>
743  <entry>
744    <literal>pDy1</literal>
745  </entry>
746  <entry>
747    Half y length at -pDz
748  </entry>
749</row>
750<row>
751  <entry>
752    <literal>pDy2</literal>
753  </entry>
754  <entry>
755    Half y length at +pDz
756  </entry>
757</row>
758<row>
759  <entry>
760    <literal>pDx3</literal>
761  </entry>
762  <entry>
763    Half x length of the side at y=-pDy2 of the face at +pDz
764  </entry>
765</row>
766<row>
767  <entry>
768    <literal>pDx4</literal>
769  </entry>
770  <entry>
771    Half x length of the side at y=+pDy2 of the face at +pDz
772  </entry>
773</row>
774<row>
775  <entry>
776    <literal>pAlp1</literal>
777  </entry>
778  <entry>
779    Angle with respect to the y axis from the centre of the side
780    (lower endcap)
781  </entry>
782</row>
783<row>
784  <entry>
785    <literal>pAlp2</literal>
786  </entry>
787  <entry>
788    Angle with respect to the y axis from the centre of the side
789    (upper endcap)
790  </entry>
791</row>
792</tbody>
793</tgroup>
794</informaltable>
795</para>
796   
797<para>
798<emphasis role="bold">Note on <literal>pAlph1/2</literal></emphasis>: the
799two angles have to be the
800same due to the planarity condition.
801</para>
802
803<!-- ******* Bridgehead ******* -->
804<bridgehead renderas='sect4'>
805Sphere or Spherical Shell Section:
806</bridgehead>
807
808<para> 
809To build a <emphasis role="bold">sphere</emphasis>, or a
810<emphasis role="bold">spherical shell section</emphasis>, use:
811
812<informaltable frame="none" pgwide="0">
813<tgroup cols="2" colsep="0">
814<tbody>
815<row>
816  <entry valign="top" align="left">
817    <informalexample>
818    <programlisting> 
819   G4Sphere(const G4String&amp; pName,                     
820                  G4double   pRmin,
821                  G4double   pRmax,
822                  G4double   pSPhi,
823                  G4double   pDPhi,
824                  G4double   pSTheta,
825                  G4double   pDTheta )
826    </programlisting> 
827    </informalexample>
828  </entry>
829  <entry valign="top" align="center">
830    <mediaobject>
831    <imageobject  role="fo">
832      <imagedata fileref="./AllResources/Detector/geometry.src/aSphere.jpg"
833                 format="JPG" contentwidth="3.5cm" />
834    </imageobject>
835    <imageobject  role="html">
836      <imagedata fileref="./AllResources/Detector/geometry.src/aSphere.jpg"
837                 format="JPG" />
838    </imageobject>
839    </mediaobject>
840
841    <?JavaScript pic7.html ?>
842    <emphasis role="underline">In the picture</emphasis>:
843    <literal>
844    <para>
845      pRmin = 100, pRmax = 120,
846      pSPhi = 0*Degree, pDPhi = 180*Degree,
847      pSTheta = 0 Degree, pDTheta = 180*Degree
848    </para>
849    </literal>
850  </entry>
851</row>
852</tbody>
853</tgroup>
854</informaltable>
855</para>
856
857<para>
858to obtain a solid with name <literal>pName</literal> and parameters:
859
860<informaltable pgwide="0">
861<tgroup cols="2">
862<tbody>
863<row>
864  <entry>
865    pRmin
866  </entry>
867  <entry>
868    Inner radius
869  </entry>
870</row>
871<row>
872  <entry>
873    pRmax
874  </entry>
875  <entry>
876    Outer radius
877  </entry>
878</row>
879<row>
880  <entry>
881    pSPhi
882  </entry>
883  <entry>
884    Starting Phi angle of the segment in radians
885  </entry>
886</row>
887<row>
888  <entry>
889    pDPhi
890  </entry>
891  <entry>
892    Delta Phi angle of the segment in radians
893  </entry>
894</row>
895<row>
896  <entry>
897    pSTheta
898  </entry>
899  <entry>
900    Starting Theta angle of the segment in radians
901  </entry>
902</row>
903<row>
904  <entry>
905    pDTheta
906  </entry>
907  <entry>
908    Delta Theta angle of the segment in radians
909  </entry>
910</row>
911</tbody>
912</tgroup>
913</informaltable>
914</para>
915   
916<!-- ******* Bridgehead ******* -->
917<bridgehead renderas='sect4'>
918Full Solid Sphere:
919</bridgehead>
920
921<para> 
922To build a <emphasis role="bold">full solid sphere</emphasis>
923use:
924
925<informaltable frame="none" pgwide="0">
926<tgroup cols="2" colsep="0">
927<tbody>
928<row>
929  <entry valign="top" align="left">
930    <informalexample>
931    <programlisting> 
932   G4Orb(const G4String&amp; pName,                                   
933               G4double  pRmax)
934    </programlisting> 
935    </informalexample>
936  </entry>
937  <entry valign="top" align="center">
938    <mediaobject>
939    <imageobject  role="fo">
940      <imagedata fileref="./AllResources/Detector/geometry.src/aOrb.jpg"
941                 format="JPG" contentwidth="3.5cm" />
942    </imageobject>
943    <imageobject  role="html">
944      <imagedata fileref="./AllResources/Detector/geometry.src/aOrb.jpg"
945                 format="JPG" />
946    </imageobject>
947    </mediaobject>
948
949    <?JavaScript pic8.html ?>
950    <emphasis role="underline">In the picture</emphasis>:
951    <literal>
952    <para>
953      pRmax = 100
954    </para>
955    </literal>
956  </entry>
957</row>
958</tbody>
959</tgroup>
960</informaltable>
961</para>
962
963<para>
964The Orb can be obtained from a Sphere with:
965<literal>pRmin</literal> = 0, <literal>pSPhi</literal> = 0,
966<literal>pDPhi</literal> = 2*Pi,
967<literal>pSTheta</literal> = 0, <literal>pDTheta</literal> = Pi
968
969<informaltable pgwide="0">
970<tgroup cols="2">
971<tbody>
972<row>
973  <entry>
974    pRmax
975  </entry>
976  <entry>
977    Outer radius
978  </entry>
979</row>
980</tbody>
981</tgroup>
982</informaltable>
983</para>
984   
985<!-- ******* Bridgehead ******* -->
986<bridgehead renderas='sect4'>
987Torus:
988</bridgehead>
989
990<para> 
991To build a <emphasis role="bold">torus</emphasis> use:
992
993<informaltable frame="none" pgwide="0">
994<tgroup cols="2" colsep="0">
995<tbody>
996<row>
997  <entry valign="top" align="left">
998    <informalexample>
999    <programlisting> 
1000   G4Torus(const G4String&amp; pName,                       
1001                 G4double   pRmin,
1002                 G4double   pRmax,
1003                 G4double   pRtor,
1004                 G4double   pSPhi,
1005                 G4double   pDPhi)
1006    </programlisting> 
1007    </informalexample>
1008  </entry>
1009  <entry valign="top" align="center">
1010    <mediaobject>
1011    <imageobject  role="fo">
1012      <imagedata fileref="./AllResources/Detector/geometry.src/aTorus.jpg"
1013                 format="JPG" contentwidth="3.5cm" />
1014    </imageobject>
1015    <imageobject  role="html">
1016      <imagedata fileref="./AllResources/Detector/geometry.src/aTorus.jpg"
1017                 format="JPG" />
1018    </imageobject>
1019    </mediaobject>
1020
1021    <?JavaScript pic9.html ?>
1022    <emphasis role="underline">In the picture</emphasis>:
1023    <literal>
1024    <para>
1025      pRmin = 40, pRmax = 60, pRtor = 200,
1026      pSPhi = 0, pDPhi = 90*Degree
1027    </para>
1028    </literal>
1029  </entry>
1030</row>
1031</tbody>
1032</tgroup>
1033</informaltable>
1034</para>
1035
1036<para>
1037to obtain a solid with name <literal>pName</literal> and parameters:
1038
1039<informaltable pgwide="0">
1040<tgroup cols="2">
1041<tbody>
1042<row>
1043  <entry>
1044    pRmin
1045  </entry>
1046  <entry>
1047    Inside radius
1048  </entry>
1049</row>
1050<row>
1051  <entry>
1052    pRmax
1053  </entry>
1054  <entry>
1055    Outside radius
1056  </entry>
1057</row>
1058<row>
1059  <entry>
1060    pRtor
1061  </entry>
1062  <entry>
1063    Swept radius of torus
1064  </entry>
1065</row>
1066<row>
1067  <entry>
1068    pSPhi
1069  </entry>
1070  <entry>
1071    Starting Phi angle in radians (<literal>fSPhi+fDPhi&lt;=2PI</literal>,
1072    <literal>fSPhi&gt;-2PI</literal>)
1073  </entry>
1074</row>
1075<row>
1076  <entry>
1077    pDPhi
1078  </entry>
1079  <entry>
1080    Delta angle of the segment in radians
1081  </entry>
1082</row>
1083</tbody>
1084</tgroup>
1085</informaltable>
1086</para>
1087   
1088<para>
1089In addition, the Geant4 Design Documentation shows in the Solids
1090Class Diagram the complete list of CSG classes, and the STEP
1091documentation contains a detailed EXPRESS description of each CSG
1092solid.
1093</para>
1094
1095
1096
1097<!-- ******* Bridgehead ******* -->
1098<bridgehead renderas='sect3'>
1099Specific CSG Solids
1100</bridgehead>
1101
1102<!-- ******* Bridgehead ******* -->
1103<bridgehead renderas='sect4'>
1104Polycons:
1105</bridgehead>
1106
1107<para> 
1108<emphasis role="bold">Polycons</emphasis> (PCON) are implemented in Geant4 through the
1109<literal>G4Polycon</literal> class:
1110
1111<informaltable frame="none" pgwide="0">
1112<tgroup cols="2" colsep="0">
1113<tbody>
1114<row>
1115  <entry valign="top" align="left">
1116    <informalexample>
1117    <programlisting> 
1118   G4Polycone(const G4String&amp; pName,                   
1119                    G4double   phiStart,
1120                    G4double   phiTotal,
1121                    G4int      numZPlanes,
1122                    const G4double   zPlane[],
1123                    const G4double   rInner[],
1124                    const G4double   rOuter[])
1125
1126   G4Polycone(const G4String&amp; pName,                     
1127                    G4double   phiStart,
1128                    G4double   phiTotal,
1129                    G4int      numRZ,
1130                    const G4double  r[],
1131                    const G4double  z[])
1132    </programlisting> 
1133    </informalexample>
1134  </entry>
1135  <entry valign="top" align="center">
1136    <mediaobject>
1137    <imageobject  role="fo">
1138      <imagedata fileref="./AllResources/Detector/geometry.src/aBREPSolidPCone.jpg"
1139                 format="JPG" contentwidth="3.5cm" />
1140    </imageobject>
1141    <imageobject  role="html">
1142      <imagedata fileref="./AllResources/Detector/geometry.src/aBREPSolidPCone.jpg"
1143                 format="JPG" />
1144    </imageobject>
1145    </mediaobject>
1146
1147    <?JavaScript pic10.html ?>
1148    <emphasis role="underline">In the picture</emphasis>:
1149    <literal>
1150    <para>
1151      phiStart = 1/4*Pi, phiTotal = 3/2*Pi, numZPlanes = 9,
1152      rInner = { 0, 0, 0, 0, 0, 0, 0, 0, 0},
1153      rOuter = { 0, 10, 10, 5 , 5, 10 , 10 , 2, 2},
1154      z = { 5, 7, 9, 11, 25, 27, 29, 31, 35 }
1155    </para>
1156    </literal>
1157  </entry>
1158</row>
1159</tbody>
1160</tgroup>
1161</informaltable>
1162</para>
1163
1164<para>
1165where:
1166
1167<informaltable pgwide="0">
1168<tgroup cols="2">
1169<tbody>
1170<row>
1171  <entry>
1172    phiStart
1173  </entry>
1174  <entry>
1175    Initial Phi starting angle
1176  </entry>
1177</row>
1178<row>
1179  <entry>
1180    phiTotal
1181  </entry>
1182  <entry>
1183    Total Phi angle
1184  </entry>
1185</row>
1186<row>
1187  <entry>
1188    numZPlanes
1189  </entry>
1190  <entry>
1191    Number of z planes
1192  </entry>
1193</row>
1194<row>
1195  <entry>
1196    numRZ
1197  </entry>
1198  <entry>
1199    Number of corners in r,z space
1200  </entry>
1201</row>
1202<row>
1203  <entry>
1204    zPlane
1205  </entry>
1206  <entry>
1207    Position of z planes
1208  </entry>
1209</row>
1210<row>
1211  <entry>
1212    rInner
1213  </entry>
1214  <entry>
1215    Tangent distance to inner surface
1216  </entry>
1217</row>
1218<row>
1219  <entry>
1220    rOuter
1221  </entry>
1222  <entry>
1223    Tangent distance to outer surface
1224  </entry>
1225</row>
1226<row>
1227  <entry>
1228    r
1229  </entry>
1230  <entry>
1231    r coordinate of corners
1232  </entry>
1233</row>
1234<row>
1235  <entry>
1236    z
1237  </entry>
1238  <entry>
1239    z coordinate of corners
1240  </entry>
1241</row>
1242</tbody>
1243</tgroup>
1244</informaltable>
1245</para>
1246   
1247<!-- ******* Bridgehead ******* -->
1248<bridgehead renderas='sect4'>
1249Polyhedra (PGON):
1250</bridgehead>
1251
1252<para> 
1253<emphasis role="bold">Polyhedra</emphasis> (PGON) are implemented through
1254<literal>G4Polyhedra</literal>:
1255
1256<informaltable frame="none" pgwide="0">
1257<tgroup cols="2" colsep="0">
1258<tbody>
1259<row>
1260  <entry valign="top" align="left">
1261    <informalexample>
1262    <programlisting> 
1263   G4Polyhedra(const G4String&amp; pName,                   
1264                     G4double  phiStart,
1265                     G4double  phiTotal,
1266                     G4int     numSide,
1267                     G4int     numZPlanes,
1268               const G4double  zPlane[],
1269               const G4double  rInner[],
1270               const G4double  rOuter[] )
1271
1272   G4Polyhedra(const G4String&amp; pName,
1273                     G4double  phiStart,
1274                     G4double  phiTotal,
1275                     G4int     numSide,
1276                     G4int     numRZ,
1277               const G4double  r[],
1278               const G4double  z[] )
1279    </programlisting> 
1280    </informalexample>
1281  </entry>
1282  <entry valign="top" align="center">
1283    <mediaobject>
1284    <imageobject  role="fo">
1285      <imagedata fileref="./AllResources/Detector/geometry.src/aBREPSolidPolyhedra.jpg"
1286                 format="JPG" contentwidth="3.5cm" />
1287    </imageobject>
1288    <imageobject  role="html">
1289      <imagedata fileref="./AllResources/Detector/geometry.src/aBREPSolidPolyhedra.jpg"
1290                 format="JPG" />
1291    </imageobject>
1292    </mediaobject>
1293
1294    <?JavaScript pic11.html ?>
1295    <emphasis role="underline">In the picture</emphasis>:
1296    <literal>
1297    <para>
1298    phiStart = -1/4*Pi, phiTotal= 5/4*Pi,
1299    numSide = 3, nunZPlanes = 7,
1300    rInner = { 0, 0, 0, 0, 0, 0, 0 },
1301    rOuter = { 0, 15, 15, 4, 4, 10, 10 },
1302    z = { 0, 5, 8, 13 , 30, 32, 35 }
1303    </para>
1304    </literal>
1305  </entry>
1306</row>
1307</tbody>
1308</tgroup>
1309</informaltable>
1310</para>
1311
1312<para>
1313where:
1314<informaltable pgwide="0">
1315<tgroup cols="2">
1316<tbody>
1317<row>
1318  <entry>
1319    <literal>phiStart</literal>
1320  </entry>
1321  <entry>
1322    Initial Phi starting angle
1323  </entry>
1324</row>
1325<row>
1326  <entry>
1327    <literal>phiTotal</literal>
1328  </entry>
1329  <entry>
1330    Total Phi angle
1331  </entry>
1332</row>
1333<row>
1334  <entry>
1335    <literal>numSide</literal>
1336  </entry>
1337  <entry>
1338    Number of sides
1339  </entry>
1340</row>
1341<row>
1342  <entry>
1343    <literal>numZPlanes</literal>
1344  </entry>
1345  <entry>
1346    Number of z planes
1347  </entry>
1348</row>
1349<row>
1350  <entry>
1351    <literal>numRZ</literal>
1352  </entry>
1353  <entry>
1354    Number of corners in r,z space
1355  </entry>
1356</row>
1357<row>
1358  <entry>
1359    zPlane
1360  </entry>
1361  <entry>
1362    Position of z planes
1363  </entry>
1364</row>
1365<row>
1366  <entry>
1367    <literal>rInner</literal>
1368  </entry>
1369  <entry>
1370    Tangent distance to inner surface
1371  </entry>
1372</row>
1373<row>
1374  <entry>
1375    rOuter
1376  </entry>
1377  <entry>
1378    Tangent distance to outer surface
1379  </entry>
1380</row>
1381<row>
1382  <entry>
1383    <literal>r</literal>
1384  </entry>
1385  <entry>
1386    r coordinate of corners
1387  </entry>
1388</row>
1389<row>
1390  <entry>
1391    <literal>z</literal>
1392  </entry>
1393  <entry>
1394    z coordinate of corners
1395  </entry>
1396</row>
1397</tbody>
1398</tgroup>
1399</informaltable>
1400</para>
1401
1402<!-- ******* Bridgehead ******* -->
1403<bridgehead renderas='sect4'>
1404Tube with an elliptical cross section:
1405</bridgehead>
1406
1407<para> 
1408A <emphasis role="bold">tube with an elliptical cross
1409section</emphasis> (ELTU) can be defined as follows:
1410
1411<informaltable frame="none" pgwide="0">
1412<tgroup cols="2" colsep="0">
1413<tbody>
1414<row>
1415  <entry valign="top" align="left">
1416    <informalexample>
1417    <programlisting> 
1418   G4EllipticalTube(const G4String&amp; pName,                   
1419                          G4double  Dx,
1420                          G4double  Dy,
1421                          G4double  Dz)
1422    </programlisting> 
1423    </informalexample>
1424
1425    The equation of the surface in x/y is <literal>1.0 = (x/dx)**2 +(y/dy)**2</literal>
1426  </entry>
1427  <entry valign="top" align="center">
1428    <mediaobject>
1429    <imageobject  role="fo">
1430      <imagedata fileref="./AllResources/Detector/geometry.src/aEllipticalTube.jpg"
1431                 format="JPG" contentwidth="3.5cm" />
1432    </imageobject>
1433    <imageobject  role="html">
1434      <imagedata fileref="./AllResources/Detector/geometry.src/aEllipticalTube.jpg"
1435                 format="JPG" />
1436    </imageobject>
1437    </mediaobject>
1438
1439    <?JavaScript pic12.html ?>
1440    <emphasis role="underline">In the picture</emphasis>:
1441    <literal>
1442    <para>
1443    Dx = 5, Dy = 10, Dz = 20
1444    </para>
1445    </literal>
1446  </entry>
1447</row>
1448</tbody>
1449</tgroup>
1450</informaltable>
1451</para>
1452
1453<para>
1454<informaltable pgwide="0">
1455<tgroup cols="6">
1456<tbody>
1457<row>
1458  <entry>
1459    Dx
1460  </entry>
1461  <entry>
1462    Half length X
1463  </entry>
1464  <entry>
1465    Dy
1466  </entry>
1467  <entry>
1468    Half length Y
1469  </entry>
1470  <entry>
1471    Dz
1472  </entry>
1473  <entry>
1474    Half length Z
1475  </entry>
1476</row>
1477</tbody>
1478</tgroup>
1479</informaltable>
1480</para>
1481   
1482<!-- ******* Bridgehead ******* -->
1483<bridgehead renderas='sect4'>
1484General Ellipsoid:
1485</bridgehead>
1486
1487<para> 
1488The general <emphasis role="bold">ellipsoid</emphasis> with
1489possible cut in <literal>Z</literal> can be defined as follows:
1490
1491<informaltable frame="none" pgwide="0">
1492<tgroup cols="2" colsep="0">
1493<tbody>
1494<row>
1495  <entry valign="top" align="left">
1496    <informalexample>
1497    <programlisting> 
1498   G4Ellipsoid(const G4String&amp; pName,                   
1499                     G4double  pxSemiAxis,
1500                     G4double  pySemiAxis,
1501                     G4double  pzSemiAxis,
1502                     G4double  pzBottomCut=0,
1503                     G4double  pzTopCut=0)
1504    </programlisting> 
1505    </informalexample>
1506  </entry>
1507  <entry valign="top" align="center">
1508    <mediaobject>
1509    <imageobject  role="fo">
1510      <imagedata fileref="./AllResources/Detector/geometry.src/aEllipsoid.jpg"
1511                 format="JPG" contentwidth="3.5cm" />
1512    </imageobject>
1513    <imageobject  role="html">
1514      <imagedata fileref="./AllResources/Detector/geometry.src/aEllipsoid.jpg"
1515                 format="JPG" />
1516    </imageobject>
1517    </mediaobject>
1518
1519    <?JavaScript pic13.html ?>
1520    <emphasis role="underline">In the picture</emphasis>:
1521    <literal>
1522    <para>
1523    pxSemiAxis = 10, pySemiAxis = 20, pzSemiAxis = 50,
1524    pzBottomCut = -10, pzTopCut = 40
1525    </para>
1526    </literal>
1527  </entry>
1528</row>
1529</tbody>
1530</tgroup>
1531</informaltable>
1532</para>
1533
1534<para>
1535A general (or triaxial) ellipsoid is a quadratic surface which is
1536given in Cartesian coordinates by:
1537
1538<informalexample>
1539<programlisting>
1540   1.0 = (x/pxSemiAxis)**2 + (y/pySemiAxis)**2 + (z/pzSemiAxis)**2
1541</programlisting>
1542</informalexample>
1543
1544where:
1545
1546<informaltable pgwide="0">
1547<tgroup cols="2">
1548<tbody>
1549<row>
1550  <entry>
1551    <literal>pxSemiAxis</literal>
1552  </entry>
1553  <entry>
1554    Semiaxis in X
1555  </entry>
1556</row>
1557<row>
1558  <entry>
1559    pySemiAxis
1560  </entry>
1561  <entry>
1562    Semiaxis in Y
1563  </entry>
1564</row>
1565<row>
1566  <entry>
1567    pzSemiAxis
1568  </entry>
1569  <entry>
1570    Semiaxis in Z
1571  </entry>
1572</row>
1573<row>
1574  <entry>
1575    pzBottomCut
1576  </entry>
1577  <entry>
1578    lower cut plane level, z
1579  </entry>
1580</row>
1581<row>
1582  <entry>
1583    pzTopCut
1584  </entry>
1585  <entry>
1586    upper cut plane level, z
1587  </entry>
1588</row>
1589</tbody>
1590</tgroup>
1591</informaltable>
1592</para>
1593   
1594<!-- ******* Bridgehead ******* -->
1595<bridgehead renderas='sect4'>
1596Cone with Elliptical Cross Section:
1597</bridgehead>
1598
1599<para> 
1600A <emphasis role="bold">cone with an elliptical cross section</emphasis> 
1601can be defined as follows:
1602
1603<informaltable frame="none" pgwide="0">
1604<tgroup cols="2" colsep="0">
1605<tbody>
1606<row>
1607  <entry valign="top" align="left">
1608    <informalexample>
1609    <programlisting> 
1610   G4EllipticalCone(const G4String&amp; pName,             
1611                          G4double  pxSemiAxis,
1612                          G4double  pySemiAxis,
1613                          G4double  zMax,
1614                          G4double  pzTopCut)
1615    </programlisting> 
1616    </informalexample>
1617  </entry>
1618  <entry valign="top" align="center">
1619    <mediaobject>
1620    <imageobject  role="fo">
1621      <imagedata fileref="./AllResources/Detector/geometry.src/aEllipticalCone.jpg"
1622                 format="JPG" contentwidth="3.5cm" />
1623    </imageobject>
1624    <imageobject  role="html">
1625      <imagedata fileref="./AllResources/Detector/geometry.src/aEllipticalCone.jpg"
1626                 format="JPG" />
1627    </imageobject>
1628    </mediaobject>
1629
1630    <?JavaScript pic14.html ?>
1631    <emphasis role="underline">In the picture</emphasis>:
1632    <literal>
1633    <para>
1634    pxSemiAxis = 30/75, pySemiAxis = 60/75, zMax = 50, pzTopCut = 25
1635    </para>
1636    </literal>
1637  </entry>
1638</row>
1639</tbody>
1640</tgroup>
1641</informaltable>
1642</para>
1643
1644<para>
1645where:
1646
1647<informaltable pgwide="0">
1648<tgroup cols="2">
1649<tbody>
1650<row>
1651  <entry>
1652    pxSemiAxis
1653  </entry>
1654  <entry>
1655    Semiaxis in X
1656  </entry>
1657</row>
1658<row>
1659  <entry>
1660    pySemiAxis
1661  </entry>
1662  <entry>
1663    Semiaxis in Y
1664  </entry>
1665</row>
1666<row>
1667  <entry>
1668    zMax
1669  </entry>
1670  <entry>
1671    Height of elliptical cone
1672  </entry>
1673</row>
1674<row>
1675  <entry>
1676    pzTopCut
1677  </entry>
1678  <entry>
1679    upper cut plane level
1680  </entry>
1681</row>
1682</tbody>
1683</tgroup>
1684</informaltable>
1685</para>
1686   
1687<para>
1688An elliptical cone of height <literal>zMax</literal>, semiaxis
1689<literal>pxSemiAxis</literal>, and semiaxis <literal>pySemiAxis</literal> 
1690is given by the parametric equations:
1691
1692<informalexample>
1693<programlisting> 
1694   x = pxSemiAxis * ( zMax - u ) / u * Cos(v)
1695   y = pySemiAxis * ( zMax - u ) / u * Sin(v)
1696   z = u
1697</programlisting>
1698</informalexample> 
1699
1700Where <literal>v</literal> is between <literal>0</literal> and
1701<literal>2*Pi</literal>, and
1702<literal>u</literal> between <literal>0</literal> and
1703<literal>h</literal> respectively.
1704</para>
1705
1706
1707<!-- ******* Bridgehead ******* -->
1708<bridgehead renderas='sect4'>
1709Paraboloid, a solid with parabolic profile:
1710</bridgehead>
1711
1712<para> 
1713A <emphasis role="bold">solid with parabolic profile</emphasis> and possible cuts along
1714the <literal>Z</literal> axis can be defined as follows:
1715
1716<informaltable frame="none" pgwide="0">
1717<tgroup cols="2" colsep="0">
1718<tbody>
1719<row>
1720  <entry valign="top" align="left">
1721    <informalexample>
1722    <programlisting> 
1723   G4Paraboloid(const G4String&amp; pName,                   
1724                     G4double  Dz,
1725                     G4double  R1,
1726                     G4double  R2)
1727    </programlisting> 
1728    </informalexample>
1729
1730    The equation for the solid is:
1731<informalexample>
1732<programlisting> 
1733   rho**2 &lt;= k1 * z + k2;
1734       -dz &lt;= z &lt;= dz
1735   r1**2 = k1 * (-dz) + k2
1736   r2**2 = k1 * ( dz) + k2
1737</programlisting>
1738</informalexample> 
1739
1740  </entry>
1741  <entry valign="top" align="center">
1742    <mediaobject>
1743    <imageobject  role="fo">
1744      <imagedata fileref="./AllResources/Detector/geometry.src/aParaboloid.jpg"
1745                 format="JPG" contentwidth="3.5cm" />
1746    </imageobject>
1747    <imageobject  role="html">
1748      <imagedata fileref="./AllResources/Detector/geometry.src/aParaboloid.jpg"
1749                 format="JPG" />
1750    </imageobject>
1751    </mediaobject>
1752
1753    <?JavaScript pic21.html ?>
1754    <emphasis role="underline">In the picture</emphasis>:
1755    <literal>
1756    <para>
1757    R1 = 20, R2 = 35, Dz = 20
1758    </para>
1759    </literal>
1760  </entry>
1761</row>
1762</tbody>
1763</tgroup>
1764</informaltable>
1765</para>
1766
1767<para>
1768<informaltable pgwide="0">
1769<tgroup cols="6">
1770<tbody>
1771<row>
1772  <entry>
1773    Dz
1774  </entry>
1775  <entry>
1776    Half length Z
1777  </entry>
1778  <entry>
1779    R1
1780  </entry>
1781  <entry>
1782    Radius at -Dz
1783  </entry>
1784  <entry>
1785    R2
1786  </entry>
1787  <entry>
1788    Radius at +Dz greater than R1
1789  </entry>
1790</row>
1791</tbody>
1792</tgroup>
1793</informaltable>
1794</para>
1795   
1796<!-- ******* Bridgehead ******* -->
1797<bridgehead renderas='sect4'>
1798Tube with Hyperbolic Profile:
1799</bridgehead>
1800
1801<para> 
1802A <emphasis role="bold">tube with a hyperbolic
1803profile</emphasis> (HYPE) can be defined as follows:
1804
1805<informaltable frame="none" pgwide="0">
1806<tgroup cols="2" colsep="0">
1807<tbody>
1808<row>
1809  <entry valign="top" align="left">
1810    <informalexample>
1811    <programlisting> 
1812   G4Hype(const G4String&amp; pName,                       
1813                G4double  innerRadius,
1814                G4double  outerRadius,
1815                G4double  innerStereo,
1816                G4double  outerStereo,
1817                G4double  halfLenZ)
1818    </programlisting> 
1819    </informalexample>
1820  </entry>
1821  <entry valign="top" align="center">
1822    <mediaobject>
1823    <imageobject  role="fo">
1824      <imagedata fileref="./AllResources/Detector/geometry.src/aHyperboloid.jpg"
1825                 format="JPG" contentwidth="3.5cm" />
1826    </imageobject>
1827    <imageobject  role="html">
1828      <imagedata fileref="./AllResources/Detector/geometry.src/aHyperboloid.jpg"
1829                 format="JPG" />
1830    </imageobject>
1831    </mediaobject>
1832
1833    <?JavaScript pic15.html ?>
1834    <emphasis role="underline">In the picture</emphasis>:
1835    <literal>
1836    <para>
1837    innerStereo = 0.7, outerStereo = 0.7,
1838    halfLenZ = 50,
1839    innerRadius = 20, outerRadius = 30
1840    </para>
1841    </literal>
1842  </entry>
1843</row>
1844</tbody>
1845</tgroup>
1846</informaltable>
1847</para>
1848
1849<para>
1850<literal>G4Hype</literal> is shaped with curved sides parallel to the
1851<literal>z</literal>-axis, has a specified half-length along the <literal>z</literal>
1852axis about which it is centred, and a given minimum and maximum
1853radius.
1854</para>
1855
1856<para>
1857A minimum radius of <literal>0</literal> defines a filled Hype (with
1858hyperbolic inner surface), i.e. inner radius = 0 AND inner stereo
1859angle = 0.
1860</para>
1861
1862<para>
1863The inner and outer hyperbolic surfaces can have different stereo
1864angles. A stereo angle of <literal>0</literal> gives a cylindrical
1865surface:
1866
1867<informaltable pgwide="0">
1868<tgroup cols="2">
1869<tbody>
1870<row>
1871  <entry>
1872    <literal>innerRadius</literal>
1873  </entry>
1874  <entry>
1875    Inner radius
1876  </entry>
1877</row>
1878<row>
1879  <entry>
1880    <literal>outerRadius</literal>
1881  </entry>
1882  <entry>
1883    Outer radius
1884  </entry>
1885</row>
1886<row>
1887  <entry>
1888    <literal>innerStereo</literal>
1889  </entry>
1890  <entry>
1891    Inner stereo angle in radians
1892  </entry>
1893</row>
1894<row>
1895  <entry>
1896    <literal>outerStereo</literal>
1897  </entry>
1898  <entry>
1899    Outer stereo angle in radians
1900  </entry>
1901</row>
1902<row>
1903  <entry>
1904    <literal>halfLenZ</literal>
1905  </entry>
1906  <entry>
1907    Half length in Z
1908  </entry>
1909</row>
1910</tbody>
1911</tgroup>
1912</informaltable>
1913</para>
1914   
1915
1916<!-- ******* Bridgehead ******* -->
1917<bridgehead renderas='sect4'>
1918Tetrahedra:
1919</bridgehead>
1920
1921<para> 
1922A <emphasis role="bold">tetrahedra</emphasis> solid can be
1923defined as follows:
1924
1925<informaltable frame="none" pgwide="0">
1926<tgroup cols="2" colsep="0">
1927<tbody>
1928<row>
1929  <entry valign="top" align="left">
1930    <informalexample>
1931    <programlisting> 
1932   G4Tet(const G4String&amp; pName,                         
1933               G4ThreeVector  anchor,
1934               G4ThreeVector  p2,
1935               G4ThreeVector  p3,
1936               G4ThreeVector  p4,
1937               G4bool         *degeneracyFlag=0)
1938    </programlisting> 
1939    </informalexample>
1940  </entry>
1941  <entry valign="top" align="center">
1942    <mediaobject>
1943    <imageobject  role="fo">
1944      <imagedata fileref="./AllResources/Detector/geometry.src/aTet.jpg"
1945                 format="JPG" contentwidth="3.5cm" />
1946    </imageobject>
1947    <imageobject  role="html">
1948      <imagedata fileref="./AllResources/Detector/geometry.src/aTet.jpg"
1949                 format="JPG" />
1950    </imageobject>
1951    </mediaobject>
1952
1953    <?JavaScript pic16.html ?>
1954    <emphasis role="underline">In the picture</emphasis>:
1955    <literal>
1956    <para>
1957    anchor = {0, 0, sqrt(3)},
1958    p2 = { 0, 2*sqrt(2/3), -1/sqrt(3) },
1959    p3 = { -sqrt(2), -sqrt(2/3),-1/sqrt(3) },
1960    p4 = { sqrt(2), -sqrt(2/3) , -1/sqrt(3) }
1961    </para>
1962    </literal>
1963  </entry>
1964</row>
1965</tbody>
1966</tgroup>
1967</informaltable>
1968</para>
1969
1970<para>
1971The solid is defined by 4 points in space:
1972
1973<informaltable pgwide="0">
1974<tgroup cols="2">
1975<tbody>
1976<row>
1977  <entry>
1978    <literal>anchor</literal>
1979  </entry>
1980  <entry>
1981    Anchor point
1982  </entry>
1983</row>
1984<row>
1985  <entry>
1986    <literal>p2</literal>
1987  </entry>
1988  <entry>
1989    Point 2
1990  </entry>
1991</row>
1992<row>
1993  <entry>
1994    <literal>p3</literal>
1995  </entry>
1996  <entry>
1997    Point 3
1998  </entry>
1999</row>
2000<row>
2001  <entry>
2002    <literal>p4</literal>
2003  </entry>
2004  <entry>
2005    Point 4
2006  </entry>
2007</row>
2008<row>
2009  <entry>
2010    degeneracyFlag
2011  </entry>
2012  <entry>
2013    Flag indicating degeneracy of points
2014  </entry>
2015</row>
2016<row>
2017  <entry>
2018   
2019  </entry>
2020  <entry>
2021   
2022  </entry>
2023</row>
2024</tbody>
2025</tgroup>
2026</informaltable>
2027</para>
2028
2029
2030<!-- ******* Bridgehead ******* -->
2031<bridgehead renderas='sect4'>
2032Extruded Polygon:
2033</bridgehead>
2034
2035<para>
2036The extrusion of an arbitrary polygon
2037(<emphasis role="bold">extruded solid</emphasis>) with fixed outline
2038in the defined <literal>Z</literal> sections can be defined as follows
2039(in a general way, or as special construct with two <literal>Z</literal>
2040sections):
2041
2042<informaltable frame="none" pgwide="0">
2043<tgroup cols="2" colsep="0">
2044<tbody>
2045<row>
2046  <entry valign="top" align="left">
2047    <informalexample>
2048    <programlisting> 
2049   G4ExtrudedSolid(const G4String&amp;                pName,
2050                         std::vector&lt;G4TwoVector&gt; polygon,
2051                         std::vector&lt;ZSection&gt;    zsections)
2052
2053   G4ExtrudedSolid(const G4String&amp;                pName,
2054                         std::vector&lt;G4TwoVector&gt; polygon,
2055                         G4double                 hz,
2056                         G4TwoVector off1, G4double scale1,
2057                         G4TwoVector off2, G4double scale2)
2058    </programlisting> 
2059    </informalexample>
2060  </entry>
2061  <entry valign="top" align="center">
2062    <mediaobject>
2063    <imageobject  role="fo">
2064      <imagedata fileref="./AllResources/Detector/geometry.src/aExtrudedSolid.jpg"
2065                 format="JPG" contentwidth="3.5cm" />
2066    </imageobject>
2067    <imageobject  role="html">
2068      <imagedata fileref="./AllResources/Detector/geometry.src/aExtrudedSolid.jpg"
2069                 format="JPG" />
2070    </imageobject>
2071    </mediaobject>
2072
2073    <?JavaScript pic22.html ?>
2074    <emphasis role="underline">In the picture</emphasis>:
2075    <literal>
2076    <para>
2077    poligon = {-30,-30},{-30,30},{30,30},{30,-30},
2078              {15,-30},{15,15},{-15,15},{-15,-30}</para>
2079    <para>
2080    zsections = [-60,{0,30},0.8], [-15, {0,-30},1.],
2081                [10,{0,0},0.6], [60,{0,30},1.2]</para>
2082    </literal>
2083  </entry>
2084</row>
2085</tbody>
2086</tgroup>
2087</informaltable>
2088</para>
2089
2090<para>
2091The z-sides of the solid are the scaled versions of the same polygon.
2092
2093<informaltable pgwide="0">
2094<tgroup cols="2">
2095<tbody>
2096<row>
2097  <entry>
2098    <literal>polygon</literal>
2099  </entry>
2100  <entry>
2101    the vertices of the outlined polygon defined in clock-wise order
2102  </entry>
2103</row>
2104<row>
2105  <entry>
2106    <literal>zsections</literal>
2107  </entry>
2108  <entry>
2109     the z-sections defined by z position in increasing order
2110  </entry>
2111</row>
2112<row>
2113  <entry>
2114    <literal>hz</literal>
2115  </entry>
2116  <entry>
2117    Half length in Z
2118  </entry>
2119</row>
2120<row>
2121  <entry>
2122    <literal>off1, off2</literal>
2123  </entry>
2124  <entry>
2125    Offset of the side in -hz and +hz respectively
2126  </entry>
2127</row>
2128<row>
2129  <entry>
2130    <literal>scale1, scale2</literal>
2131  </entry>
2132  <entry>
2133    Scale of the side in -hz and +hz respectively
2134  </entry>
2135</row>
2136</tbody>
2137</tgroup>
2138</informaltable>
2139</para>
2140
2141
2142<!-- ******* Bridgehead ******* -->
2143<bridgehead renderas='sect4'>
2144Box Twisted:
2145</bridgehead>
2146
2147<para> 
2148A <emphasis role="bold">box twisted</emphasis> along one axis
2149can be defined as follows:
2150
2151<informaltable frame="none" pgwide="0">
2152<tgroup cols="2" colsep="0">
2153<tbody>
2154<row>
2155  <entry valign="top" align="left">
2156    <informalexample>
2157    <programlisting> 
2158   G4TwistedBox(const G4String&amp; pName,                 
2159                      G4double  twistedangle,
2160                      G4double  pDx,
2161                      G4double  pDy,
2162                      G4double  pDz)
2163    </programlisting> 
2164    </informalexample>
2165  </entry>
2166  <entry valign="top" align="center">
2167    <mediaobject>
2168    <imageobject  role="fo">
2169      <imagedata fileref="./AllResources/Detector/geometry.src/aTwistedBox.jpg"
2170                 format="JPG" contentwidth="3.5cm" />
2171    </imageobject>
2172    <imageobject  role="html">
2173      <imagedata fileref="./AllResources/Detector/geometry.src/aTwistedBox.jpg"
2174                 format="JPG" />
2175    </imageobject>
2176    </mediaobject>
2177
2178    <?JavaScript pic17.html ?>
2179    <emphasis role="underline">In the picture</emphasis>:
2180    <literal>
2181    <para>
2182    twistedangle = 30*Degree, pDx = 30, pDy =40, pDz = 60
2183    </para>
2184    </literal>
2185  </entry>
2186</row>
2187</tbody>
2188</tgroup>
2189</informaltable>
2190</para>
2191
2192<para>
2193<literal>G4TwistedBox</literal> is a box twisted along the z-axis. The
2194twist angle cannot be greater than 90 degrees:
2195
2196<informaltable pgwide="0">
2197<tgroup cols="2">
2198<tbody>
2199<row>
2200  <entry>
2201    <literal>twistedangle</literal>
2202  </entry>
2203  <entry>
2204    Twist angle
2205  </entry>
2206</row>
2207<row>
2208  <entry>
2209    <literal>pDx</literal>
2210  </entry>
2211  <entry>
2212    Half x length
2213  </entry>
2214</row>
2215<row>
2216  <entry>
2217    <literal>pDy</literal>
2218  </entry>
2219  <entry>
2220    Half y length
2221  </entry>
2222</row>
2223<row>
2224  <entry>
2225    <literal>pDz</literal>
2226  </entry>
2227  <entry>
2228    Half z length
2229  </entry>
2230</row>
2231</tbody>
2232</tgroup>
2233</informaltable>
2234</para>
2235   
2236
2237<!-- ******* Bridgehead ******* -->
2238<bridgehead renderas='sect4'>
2239Trapezoid Twisted along One Axis:
2240</bridgehead>
2241
2242<para> 
2243<emphasis>trapezoid twisted</emphasis> along one axis can be defined as
2244follows:
2245
2246<informaltable frame="none" pgwide="0">
2247<tgroup cols="2" colsep="0">
2248<tbody>
2249<row>
2250  <entry valign="top" align="left">
2251    <informalexample>
2252    <programlisting> 
2253   G4TwistedTrap(const G4String&amp; pName,                 
2254                       G4double  twistedangle,
2255                       G4double  pDxx1,
2256                       G4double  pDxx2,
2257                       G4double  pDy,
2258                       G4double   pDz)
2259 
2260   G4TwistedTrap(const G4String&amp; pName,
2261                       G4double  twistedangle,
2262                       G4double  pDz,
2263                       G4double  pTheta,
2264                       G4double  pPhi,
2265                       G4double  pDy1,
2266                       G4double  pDx1,
2267                       G4double  pDx2,
2268                       G4double  pDy2,
2269                       G4double  pDx3,
2270                       G4double  pDx4,
2271                       G4double  pAlph)
2272    </programlisting> 
2273    </informalexample>
2274  </entry>
2275  <entry valign="top" align="center">
2276    <mediaobject>
2277    <imageobject  role="fo">
2278      <imagedata fileref="./AllResources/Detector/geometry.src/aTwistedTrap.jpg"
2279                 format="JPG" contentwidth="3.5cm" />
2280    </imageobject>
2281    <imageobject  role="html">
2282      <imagedata fileref="./AllResources/Detector/geometry.src/aTwistedTrap.jpg"
2283                 format="JPG" />
2284    </imageobject>
2285    </mediaobject>
2286
2287    <?JavaScript pic18.html ?>
2288    <emphasis role="underline">In the picture</emphasis>:
2289    <literal>
2290    <para>
2291    pDx1 = 30, pDx2 = 40, pDy1 = 40,
2292    pDx3 = 10, pDx4 = 14, pDy2 = 16,
2293    pDz = 60,
2294    pTheta = 20*Degree, pDphi = 5*Degree,
2295    pAlph = 10*Degree, twistedangle = 30*Degree
2296    </para>
2297    </literal>
2298  </entry>
2299</row>
2300</tbody>
2301</tgroup>
2302</informaltable>
2303</para>
2304
2305<para>
2306The first constructor of <literal>G4TwistedTrap</literal> produces a
2307regular trapezoid twisted along the <literal>z</literal>-axis, where the caps
2308of the trapezoid are of the same shape and size.
2309</para>
2310
2311<para>
2312The second constructor produces a generic trapezoid with polar,
2313azimuthal and tilt angles.
2314</para>
2315
2316<para>
2317The twist angle cannot be greater than 90 degrees:
2318
2319<informaltable pgwide="0">
2320<tgroup cols="2">
2321<tbody>
2322<row>
2323  <entry>
2324    <literal>twistedangle</literal>
2325  </entry>
2326  <entry>
2327    Twisted angle
2328  </entry>
2329</row>
2330<row>
2331  <entry>
2332    <literal>pDx1</literal>
2333  </entry>
2334  <entry>
2335    Half x length at y=-pDy
2336  </entry>
2337</row>
2338<row>
2339  <entry>
2340    <literal>pDx2</literal>
2341  </entry>
2342  <entry>
2343    Half x length at y=+pDy
2344  </entry>
2345</row>
2346<row>
2347  <entry>
2348    <literal>pDy</literal>
2349  </entry>
2350  <entry>
2351    Half y length
2352  </entry>
2353</row>
2354<row>
2355  <entry>
2356    <literal>pDz</literal>
2357  </entry>
2358  <entry>
2359    Half z length
2360  </entry>
2361</row>
2362<row>
2363  <entry>
2364    <literal>pTheta</literal>
2365  </entry>
2366  <entry>
2367    Polar angle of the line joining the centres of the faces at -/+pDz
2368  </entry>
2369</row>
2370<row>
2371  <entry>
2372    <literal>pDy1</literal>
2373  </entry>
2374  <entry>
2375    Half y length at -pDz
2376  </entry>
2377</row>
2378<row>
2379  <entry>
2380    <literal>pDx1</literal>
2381  </entry>
2382  <entry>
2383    Half x length at -pDz, y=-pDy1
2384  </entry>
2385</row>
2386<row>
2387  <entry>
2388    <literal>pDx2</literal>
2389  </entry>
2390  <entry>
2391    Half x length at -pDz, y=+pDy1
2392  </entry>
2393</row>
2394<row>
2395  <entry>
2396    <literal>pDy2</literal>
2397  </entry>
2398  <entry>
2399    Half y length at +pDz
2400
2401  </entry>
2402</row>
2403<row>
2404  <entry>
2405    <literal>pDx3</literal>
2406  </entry>
2407  <entry>
2408    Half x length at +pDz, y=-pDy2
2409  </entry>
2410</row>
2411<row>
2412  <entry>
2413    <literal>pDx4</literal>
2414  </entry>
2415  <entry>
2416    Half x length at +pDz, y=+pDy2
2417  </entry>
2418</row>
2419<row>
2420  <entry>
2421    <literal>pAlph</literal>
2422  </entry>
2423  <entry>
2424    Angle with respect to the y axis from the centre of the side
2425  </entry>
2426</row>
2427</tbody>
2428</tgroup>
2429</informaltable>
2430</para>
2431
2432<!-- ******* Bridgehead ******* -->
2433<bridgehead renderas='sect4'>
2434Twisted Trapezoid with <literal>x</literal> and <literal>y</literal> dimensions
2435varying along <literal>z</literal>:
2436</bridgehead>
2437
2438<para> 
2439A <emphasis role="bold">twisted trapezoid</emphasis> with the
2440<literal>x</literal> and <literal>y</literal> dimensions
2441<emphasis role="bold">varying along <literal>z</literal></emphasis> can be
2442defined as follows:
2443
2444<informaltable frame="none" pgwide="0">
2445<tgroup cols="2" colsep="0">
2446<tbody>
2447<row>
2448  <entry valign="top" align="left">
2449    <informalexample>
2450    <programlisting> 
2451   G4TwistedTrd(const G4String&amp; pName,                 
2452                      G4double  pDx1,
2453                      G4double  pDx2,
2454                      G4double  pDy1,
2455                      G4double  pDy2,
2456                      G4double  pDz,
2457                      G4double  twistedangle)
2458    </programlisting> 
2459    </informalexample>
2460  </entry>
2461  <entry valign="top" align="center">
2462    <mediaobject>
2463    <imageobject  role="fo">
2464      <imagedata fileref="./AllResources/Detector/geometry.src/aTwistedTrd.jpg"
2465                 format="JPG" contentwidth="3.5cm" />
2466    </imageobject>
2467    <imageobject  role="html">
2468      <imagedata fileref="./AllResources/Detector/geometry.src/aTwistedTrd.jpg"
2469                 format="JPG" />
2470    </imageobject>
2471    </mediaobject>
2472
2473    <?JavaScript pic19.html ?>
2474    <emphasis role="underline">In the picture</emphasis>:
2475    <literal>
2476    <para>
2477    dx1 = 30, dx2 = 10,
2478    dy1 = 40, dy2 = 15,
2479    dz = 60, twistedangle = 30*Degree
2480    </para>
2481    </literal>
2482  </entry>
2483</row>
2484</tbody>
2485</tgroup>
2486</informaltable>
2487</para>
2488
2489<para>
2490where:
2491<informaltable pgwide="0">
2492<tgroup cols="2">
2493<tbody>
2494<row>
2495  <entry>
2496    <literal>pDx1</literal>
2497  </entry>
2498  <entry>
2499    Half x length at the surface positioned at -dz
2500  </entry>
2501</row>
2502<row>
2503  <entry>
2504    <literal>pDx2</literal>
2505  </entry>
2506  <entry>
2507    Half x length at the surface positioned at +dz
2508  </entry>
2509</row>
2510<row>
2511  <entry>
2512    <literal>pDy1</literal>
2513  </entry>
2514  <entry>
2515    Half y length at the surface positioned at -dz
2516  </entry>
2517</row>
2518<row>
2519  <entry>
2520    <literal>pDy2</literal>
2521  </entry>
2522  <entry>
2523    Half y length at the surface positioned at +dz
2524  </entry>
2525</row>
2526<row>
2527  <entry>
2528    <literal>pDz</literal>
2529  </entry>
2530  <entry>
2531    Half z length
2532  </entry>
2533</row>
2534<row>
2535  <entry>
2536    <literal>twistedangle</literal>
2537  </entry>
2538  <entry>
2539    Twisted angle
2540  </entry>
2541</row>
2542</tbody>
2543</tgroup>
2544</informaltable>
2545</para>
2546   
2547<!-- ******* Bridgehead ******* -->
2548<bridgehead renderas='sect4'>
2549Tube Section Twisted along Its Axis:
2550</bridgehead>
2551
2552<para> 
2553A <emphasis role="bold">tube section twisted</emphasis> along
2554its axis can be defined as follows:
2555
2556<informaltable frame="none" pgwide="0">
2557<tgroup cols="2" colsep="0">
2558<tbody>
2559<row>
2560  <entry valign="top" align="left">
2561    <informalexample>
2562    <programlisting> 
2563   G4TwistedTubs(const G4String&amp; pName,                 
2564                       G4double  twistedangle,
2565                       G4double  endinnerrad,
2566                       G4double  endouterrad,
2567                       G4double  halfzlen,
2568                       G4double  dphi)
2569    </programlisting> 
2570    </informalexample>
2571  </entry>
2572  <entry valign="top" align="center">
2573    <mediaobject>
2574    <imageobject  role="fo">
2575      <imagedata fileref="./AllResources/Detector/geometry.src/aTwistedTubs.jpg"
2576                 format="JPG" contentwidth="3.5cm" />
2577    </imageobject>
2578    <imageobject  role="html">
2579      <imagedata fileref="./AllResources/Detector/geometry.src/aTwistedTubs.jpg"
2580                 format="JPG" />
2581    </imageobject>
2582    </mediaobject>
2583
2584    <?JavaScript pic20.html ?>
2585    <emphasis role="underline">In the picture</emphasis>:
2586    <literal>
2587    <para>
2588    endinnerrad = 10, endouterrad = 15,
2589    halfzlen = 20, dphi = 90*Degree,
2590    twistedangle = 60*Degree
2591    </para>
2592    </literal>
2593  </entry>
2594</row>
2595</tbody>
2596</tgroup>
2597</informaltable>
2598</para>
2599
2600<para>
2601<literal>G4TwistedTubs</literal> is a sort of twisted cylinder which,
2602placed along the <literal>z</literal>-axis and divided into
2603<literal>phi</literal>-segments is shaped like an hyperboloid, where each of
2604its segmented pieces can be tilted with a stereo angle.
2605</para>
2606
2607<para>
2608It can have inner and outer surfaces with the same stereo angle:
2609<informaltable pgwide="0">
2610<tgroup cols="2">
2611<tbody>
2612<row>
2613  <entry>
2614    <literal>twistedangle</literal>
2615  </entry>
2616  <entry>
2617    Twisted angle
2618  </entry>
2619</row>
2620<row>
2621  <entry>
2622    <literal>endinnerrad</literal>
2623  </entry>
2624  <entry>
2625    Inner radius at endcap
2626  </entry>
2627</row>
2628<row>
2629  <entry>
2630    <literal>endouterrad</literal>
2631  </entry>
2632  <entry>
2633    Outer radius at endcap
2634  </entry>
2635</row>
2636<row>
2637  <entry>
2638    <literal>halfzlen</literal>
2639  </entry>
2640  <entry>
2641    Half z length
2642  </entry>
2643</row>
2644<row>
2645  <entry>
2646    <literal>dphi</literal>
2647  </entry>
2648  <entry>
2649    Phi angle of a segment
2650  </entry>
2651</row>
2652</tbody>
2653</tgroup>
2654</informaltable>
2655</para>
2656   
2657<para>
2658Additional constructors are provided, allowing the shape to be
2659specified either as:
2660
2661<itemizedlist spacing="compact">
2662  <listitem><para>
2663    the number of segments in <literal>phi</literal> and the total angle for
2664    all segments, or
2665  </para></listitem>
2666  <listitem><para>
2667    a combination of the above constructors providing instead the
2668    inner and outer radii at <literal>z=0</literal> with different
2669    <literal>z</literal>-lengths along negative and positive
2670    <literal>z</literal>-axis.
2671  </para></listitem>
2672</itemizedlist>
2673</para>
2674
2675</sect3>
2676
2677
2678<!-- ******************* Section (Level#3) ****************** -->
2679<sect3 id="sect.Geom.Solids.BoolOp">
2680<title>
2681Solids made by Boolean operations
2682</title>
2683
2684<para>
2685Simple solids can be combined using Boolean operations. For
2686example, a cylinder and a half-sphere can be combined with the
2687union Boolean operation.
2688</para>
2689
2690<para>
2691Creating such a new <emphasis>Boolean</emphasis> solid, requires:
2692
2693<itemizedlist spacing="compact">
2694  <listitem><para>
2695    Two solids
2696  </para></listitem>
2697  <listitem><para>
2698    A Boolean operation: union, intersection or subtraction.
2699  </para></listitem>
2700  <listitem><para>
2701    Optionally a transformation for the second solid.
2702  </para></listitem>
2703</itemizedlist>
2704</para>
2705
2706<para>
2707The solids used should be either CSG solids (for examples a box,
2708a spherical shell, or a tube) or another Boolean solid: the product
2709of a previous Boolean operation. An important purpose of Boolean
2710solids is to allow the description of solids with peculiar shapes
2711in a simple and intuitive way, still allowing an efficient
2712geometrical navigation inside them.
2713</para>
2714
2715<note><title></title>
2716<para>
2717The solids used can actually be of any type. However, in
2718order to fully support the export of a Geant4 solid model via STEP
2719to CAD systems, we restrict the use of Boolean operations to this
2720subset of solids. But this subset contains all the most interesting
2721use cases.
2722</para>
2723</note>
2724
2725<note><title></title>
2726<para>
2727The tracking cost for navigating in a Boolean solid in the
2728current implementation, is proportional to the number of
2729constituent solids. So care must be taken to avoid extensive,
2730unecessary use of Boolean solids in performance-critical areas of a
2731geometry description, where each solid is created from Boolean
2732combinations of many other solids.
2733</para>
2734</note>
2735
2736<para>
2737Examples of the creation of the simplest Boolean solids are
2738given below:
2739
2740<informalexample>
2741<programlisting>
2742  G4Box*  box =
2743    new G4Box("Box",20*mm,30*mm,40*mm);
2744  G4Tubs* cyl =
2745    new G4Tubs("Cylinder",0,50*mm,50*mm,0,twopi);  // r:     0 mm -&gt; 50 mm
2746                                                   // z:   -50 mm -&gt; 50 mm
2747                                                   // phi:   0 -&gt;  2 pi
2748  G4UnionSolid* union =
2749    new G4UnionSolid("Box+Cylinder", box, cyl);
2750  G4IntersectionSolid* intersection =
2751    new G4IntersectionSolid("Box*Cylinder", box, cyl);
2752  G4SubtractionSolid* subtraction =
2753    new G4SubtractionSolid("Box-Cylinder", box, cyl);
2754 </programlisting>
2755</informalexample>
2756
2757where the union, intersection and subtraction of a box and cylinder
2758are constructed.
2759</para>
2760
2761<para>
2762The more useful case where one of the solids is displaced from
2763the origin of coordinates also exists. In this case the second
2764solid is positioned relative to the coordinate system (and thus
2765relative to the first). This can be done in two ways:
2766
2767<itemizedlist spacing="compact">
2768  <listitem><para>
2769    Either by giving a rotation matrix and translation vector that
2770    are used to transform the coordinate system of the second solid to
2771    the coordinate system of the first solid. This is called the
2772    <emphasis>passive</emphasis> method.
2773  </para></listitem>
2774  <listitem><para>
2775    Or by creating a transformation that moves the second solid
2776    from its desired position to its standard position, e.g., a box's
2777    standard position is with its centre at the origin and sides
2778    parallel to the three axes. This is called the
2779    <emphasis>active</emphasis> method.
2780  </para></listitem>
2781</itemizedlist>
2782</para>
2783
2784<para>
2785In the first case, the translation is applied first to move the
2786origin of coordinates. Then the rotation is used to rotate the
2787coordinate system of the second solid to the coordinate system of
2788the first.
2789
2790<informalexample>
2791<programlisting>
2792    G4RotationMatrix* yRot = new G4RotationMatrix;  // Rotates X and Z axes only
2793    yRot-&gt;rotateY(M_PI/4.*rad);                     // Rotates 45 degrees
2794    G4ThreeVector zTrans(0, 0, 50);
2795
2796    G4UnionSolid* unionMoved =
2797      new G4UnionSolid("Box+CylinderMoved", box, cyl, yRot, zTrans);
2798    //
2799    // The new coordinate system of the cylinder is translated so that
2800    // its centre is at +50 on the original Z axis, and it is rotated
2801    // with its X axis halfway between the original X and Z axes.
2802
2803    // Now we build the same solid using the alternative method
2804    //
2805    G4RotationMatrix invRot = *(yRot-&gt;invert());
2806    G4Transform3D transform(invRot, zTrans); 
2807    G4UnionSolid* unionMoved =
2808      new G4UnionSolid("Box+CylinderMoved", box, cyl, transform);
2809</programlisting>
2810</informalexample>
2811</para>
2812
2813<para>
2814Note that the first constructor that takes a pointer to the
2815rotation-matrix (<literal>G4RotationMatrix*</literal>), does NOT copy it.
2816Therefore once used a rotation-matrix to construct a Boolean solid,
2817it must NOT be modified.
2818</para>
2819
2820<para>
2821In contrast, with the alternative method shown, a
2822<literal>G4Transform3D</literal> is provided to the constructor by value, and
2823its transformation is stored by the Boolean solid. The user may
2824modify the <literal>G4Transform3D</literal> and eventually use it again.
2825</para>
2826
2827<para>
2828When positioning a volume associated to a Boolean solid, the
2829relative center of coordinates considered for the positioning is
2830the one related to the <emphasis>first</emphasis> of the two constituent
2831solids.
2832</para>
2833
2834</sect3>
2835
2836
2837<!-- ******************* Section (Level#3) ****************** -->
2838<sect3 id="sect.Geom.Solids.BREPS">
2839<title>
2840Boundary Represented (BREPS) Solids
2841</title>
2842
2843<para>
2844BREP solids are defined via the description of their boundaries.
2845The boundaries can be made of planar and second order surfaces.
2846Eventually these can be trimmed and have holes. The resulting
2847solids, such as polygonal, polyconical solids are known as
2848Elementary BREPS.
2849</para>
2850
2851<para>
2852In addition, the boundary surfaces can be made of Bezier
2853surfaces and B-Splines, or of NURBS
2854(Non-Uniform-Rational-B-Splines) surfaces. The resulting solids are
2855Advanced BREPS.
2856</para>
2857
2858<para>
2859
2860<note><title></title>
2861<para>
2862Currently, the implementation for surfaces
2863generated by Beziers, B-Splines or NURBS is only at the level of
2864prototype and not fully functional.
2865</para>
2866
2867<para>
2868Extensions in this area are foreseen in future.
2869</para>
2870</note>
2871
2872<para>
2873We have defined a few simple Elementary BREPS, that can be
2874instantiated simply by a user in a manner similar to the
2875construction of Constructed Solids (CSGs). We summarize their
2876capabilities in the following section.
2877</para>
2878
2879<para>
2880Most BREPS Solids are however defined by creating each surface
2881separately and tying them together.
2882</para>
2883
2884<!-- ******* Bridgehead ******* -->
2885<bridgehead renderas='sect4'>
2886Specific BREP Solids:
2887</bridgehead>
2888
2889<para>
2890We have defined one polygonal and one polyconical shape using
2891BREPS. The polycone provides a shape defined by a series of conical
2892sections with the same axis, contiguous along it.
2893</para>
2894
2895<para>
2896The polyconical solid <literal>G4BREPSolidPCone</literal> is a shape
2897defined by a set of inner and outer conical or cylindrical surface
2898sections and two planes perpendicular to the Z axis. Each conical
2899surface is defined by its radius at two different planes
2900perpendicular to the Z-axis. Inner and outer conical surfaces are
2901defined using common Z planes.
2902</para>
2903
2904<informalexample>
2905<programlisting> 
2906  G4BREPSolidPCone( const G4String&amp; pName,
2907                          G4double  start_angle,
2908                          G4double  opening_angle,                   
2909                          G4int     num_z_planes,    // sections,
2910                          G4double  z_start,                   
2911                    const G4double  z_values[],
2912                    const G4double  RMIN[],
2913                    const G4double  RMAX[]  )
2914</programlisting>
2915</informalexample> 
2916
2917<para>
2918The conical sections do not need to fill 360 degrees, but can have
2919a common start and opening angle.
2920</para>
2921
2922<informaltable pgwide="0">
2923<tgroup cols="2">
2924<tbody>
2925<row>
2926  <entry>
2927    <literal>start_angle</literal>
2928  </entry>
2929  <entry>
2930    starting angle
2931  </entry>
2932</row>
2933<row>
2934  <entry>
2935    <literal>opening_angle</literal>
2936  </entry>
2937  <entry>
2938    opening angle
2939  </entry>
2940</row>
2941<row>
2942  <entry>
2943    <literal>num_z_planes</literal>
2944  </entry>
2945  <entry>
2946    number of planes perpendicular to the z-axis used.
2947  </entry>
2948</row>
2949<row>
2950  <entry>
2951    <literal>z_start</literal>
2952  </entry>
2953  <entry>
2954    starting value of z
2955  </entry>
2956</row>
2957<row>
2958  <entry>
2959    <literal>z_values</literal>
2960  </entry>
2961  <entry>
2962    z coordinates of each plane
2963  </entry>
2964</row>
2965<row>
2966  <entry>
2967    <literal>RMIN</literal>
2968  </entry>
2969  <entry>
2970    radius of inner cone at each plane
2971  </entry>
2972</row>
2973<row>
2974  <entry>
2975    <literal>RMAX</literal>
2976  </entry>
2977  <entry>
2978    radius of outer cone at each plane
2979  </entry>
2980</row>
2981</tbody>
2982</tgroup>
2983</informaltable>
2984</para>
2985   
2986<para>
2987The polygonal solid <literal>G4BREPSolidPolyhedra</literal> is a shape
2988defined by an inner and outer polygonal surface and two planes
2989perpendicular to the Z axis. Each polygonal surface is created by
2990linking a series of polygons created at different planes
2991perpendicular to the Z-axis. All these polygons all have the same
2992number of sides (<literal>sides</literal>) and are defined at the same Z
2993planes for both inner and outer polygonal surfaces.
2994</para>
2995
2996<para>
2997The polygons do not need to fill 360 degrees, but have a start
2998and opening angle.
2999</para>
3000
3001<para>
3002The constructor takes the following parameters:
3003
3004<informalexample>
3005<programlisting> 
3006  G4BREPSolidPolyhedra( const G4String&amp; pName,
3007                              G4double  start_angle,
3008                              G4double  opening_angle,
3009                              G4int     sides,
3010                              G4int     num_z_planes,     
3011                              G4double  z_start,
3012                        const G4double  z_values[],
3013                        const G4double  RMIN[],
3014                        const G4double  RMAX[]  )
3015</programlisting>
3016</informalexample> 
3017
3018which in addition to its name have the following meaning:
3019
3020<informaltable pgwide="0">
3021<tgroup cols="2">
3022<tbody>
3023<row>
3024  <entry>
3025    <literal>start_angle</literal>
3026  </entry>
3027  <entry>
3028    starting angle
3029  </entry>
3030</row>
3031<row>
3032  <entry>
3033    <literal>opening_angle</literal>
3034  </entry>
3035  <entry>
3036    opening angle
3037  </entry>
3038</row>
3039<row>
3040  <entry>
3041    <literal>sides</literal>
3042  </entry>
3043  <entry>
3044    number of sides of each polygon in the x-y plane
3045  </entry>
3046</row>
3047<row>
3048  <entry>
3049    <literal>num_z_planes</literal>
3050  </entry>
3051  <entry>
3052    number of planes perpendicular to the z-axis used.
3053  </entry>
3054</row>
3055<row>
3056  <entry>
3057    <literal>z_start</literal>
3058  </entry>
3059  <entry>
3060    starting value of z
3061  </entry>
3062</row>
3063<row>
3064  <entry>
3065    <literal>z_values</literal>
3066  </entry>
3067  <entry>
3068    z coordinates of each plane
3069  </entry>
3070</row>
3071<row>
3072  <entry>
3073    <literal>RMIN</literal>
3074  </entry>
3075  <entry>
3076    radius of inner polygon at each corner
3077  </entry>
3078</row>
3079<row>
3080  <entry>
3081    <literal>RMAX</literal>
3082  </entry>
3083  <entry>
3084    radius of outer polygon at each corner
3085  </entry>
3086</row>
3087</tbody>
3088</tgroup>
3089</informaltable>
3090   
3091the shape is defined by the number of sides <literal>sides</literal> of
3092the polygon in the plane perpendicular to the z-axis.
3093</para>
3094
3095</sect3>
3096
3097
3098<!-- ******************* Section (Level#3) ****************** -->
3099<sect3 id="sect.Geom.Solids.Tessel">
3100<title>
3101Tessellated Solids
3102</title>
3103
3104<para>
3105In Geant4 it is also implemented a class
3106<literal>G4TessellatedSolid</literal> which can be used to generate a generic
3107solid defined by a number of facets (<literal>G4VFacet</literal>). Such
3108constructs are especially important for conversion of complex
3109geometrical shapes imported from CAD systems bounded with generic
3110surfaces into an approximate description with facets of defined
3111dimension (see <xref linkend="fig.Geom.Solid_1" />).
3112
3113<figure id="fig.Geom.Solid_1">
3114<title>
3115  Example of geometries imported from CAD system and converted to
3116  tessellated solids.
3117</title>
3118
3119<mediaobject>
3120  <imageobject role="fo">
3121    <imagedata fileref="./AllResources/Detector/geometry.src/cad-tess-combined.jpg" 
3122               format="JPG" width="12.0cm" align="center" />
3123  </imageobject>
3124  <imageobject role="html">
3125    <imagedata fileref="./AllResources/Detector/geometry.src/cad-tess-combined.jpg" 
3126               format="JPG" align="center" />
3127  </imageobject>
3128</mediaobject>
3129</figure>
3130</para>
3131
3132<para>
3133They can also be used to generate a solid bounded with a generic
3134surface made of planar facets. It is important that the supplied
3135facets shall form a fully enclose space to represent the solid.
3136</para>
3137
3138<para>
3139Two types of facet can be used for the construction of a
3140<literal>G4TessellatedSolid</literal>: a triangular facet
3141(<literal>G4TriangularFacet</literal>) and a quadrangular facet
3142(<literal>G4QuadrangularFacet</literal>).
3143</para>
3144
3145<para>
3146An example on how to generate a simple tessellated shape is
3147given below.
3148
3149<example id="programlist_Geom_1">
3150<title>
3151An example of a simple tessellated solid with
3152<literal>G4TessellatedSolid</literal>.
3153</title>
3154
3155<programlisting>
3156        // First declare a tessellated solid
3157        //
3158        G4TessellatedSolid solidTarget = new G4TessellatedSolid("Solid_name");
3159
3160        // Define the facets which form the solid
3161        //
3162        G4double targetSize = 10*cm ;
3163        G4TriangularFacet *facet1 = new
3164        G4TriangularFacet (G4ThreeVector(-targetSize,-targetSize,        0.0),
3165                           G4ThreeVector(+targetSize,-targetSize,        0.0),
3166                           G4ThreeVector(        0.0,        0.0,+targetSize),
3167                           ABSOLUTE);
3168        G4TriangularFacet *facet2 = new
3169        G4TriangularFacet (G4ThreeVector(+targetSize,-targetSize,        0.0),
3170                           G4ThreeVector(+targetSize,+targetSize,        0.0),
3171                           G4ThreeVector(        0.0,        0.0,+targetSize),
3172                           ABSOLUTE);
3173        G4TriangularFacet *facet3 = new
3174        G4TriangularFacet (G4ThreeVector(+targetSize,+targetSize,        0.0),
3175                           G4ThreeVector(-targetSize,+targetSize,        0.0),
3176                           G4ThreeVector(        0.0,        0.0,+targetSize),
3177                           ABSOLUTE);
3178        G4TriangularFacet *facet4 = new
3179        G4TriangularFacet (G4ThreeVector(-targetSize,+targetSize,        0.0),
3180                           G4ThreeVector(-targetSize,-targetSize,        0.0),
3181                           G4ThreeVector(        0.0,        0.0,+targetSize),
3182                           ABSOLUTE);
3183        G4QuadrangularFacet *facet5 = new
3184        G4QuadrangularFacet (G4ThreeVector(-targetSize,-targetSize,        0.0),
3185                             G4ThreeVector(-targetSize,+targetSize,        0.0),
3186                             G4ThreeVector(+targetSize,+targetSize,        0.0),
3187                             G4ThreeVector(+targetSize,-targetSize,        0.0),
3188                             ABSOLUTE);
3189
3190        // Now add the facets to the solid
3191        //
3192        solidTarget-&gt;AddFacet((G4VFacet*) facet1);
3193        solidTarget-&gt;AddFacet((G4VFacet*) facet2);
3194        solidTarget-&gt;AddFacet((G4VFacet*) facet3);
3195        solidTarget-&gt;AddFacet((G4VFacet*) facet4);
3196        solidTarget-&gt;AddFacet((G4VFacet*) facet5);
3197
3198        Finally declare the solid is complete
3199        //
3200        solidTarget-&gt;SetSolidClosed(true);
3201</programlisting>
3202</example>
3203</para>
3204
3205<para>
3206The <literal>G4TriangularFacet</literal> class is used for the contruction
3207of <literal>G4TessellatedSolid</literal>. It is defined by three vertices,
3208which shall be supplied in <emphasis>anti-clockwise order</emphasis> looking from
3209the outside of the solid where it belongs. Its constructor looks
3210like:
3211
3212<informalexample>
3213<programlisting>
3214        G4TriangularFacet ( const G4ThreeVector     Pt0,
3215                            const G4ThreeVector     vt1,
3216                            const G4ThreeVector     vt2,
3217                                  G4FacetVertexType fType )
3218</programlisting>
3219</informalexample> 
3220
3221i.e., it takes 4 parameters to define the three vertices:
3222
3223<informaltable pgwide="0">
3224<tgroup cols="2">
3225<tbody>
3226<row>
3227  <entry>
3228    <literal>G4FacetVertexType</literal>
3229  </entry>
3230  <entry>
3231    <literal>ABSOLUTE</literal> in which case <literal>Pt0</literal>,
3232    <literal>vt1</literal> and <literal>vt2</literal> 
3233    are the three vertices in anti-clockwise order looking from the outside.
3234  </entry>
3235</row>
3236<row>
3237  <entry>
3238    <literal>G4FacetVertexType</literal>
3239  </entry>
3240  <entry>
3241    <literal>RELATIVE</literal> in which case the first vertex is
3242    <literal>Pt0</literal>, the second vertex is <literal>Pt0+vt1</literal> and
3243    the third vertex is <literal>Pt0+vt2</literal>, all in anti-clockwise order
3244    when looking from the outside.
3245</entry>
3246</row>
3247</tbody>
3248</tgroup>
3249</informaltable>
3250</para>
3251
3252<para>
3253The <literal>G4QuadrangularFacet</literal> class can be used for the
3254contruction of <literal>G4TessellatedSolid</literal> as well. It is defined
3255by four vertices, which shall be in the same plane and be supplied
3256in <emphasis>anti-clockwise order</emphasis> looking from the outside of the
3257solid where it belongs. Its constructor looks like:
3258
3259<informalexample>
3260<programlisting>
3261        G4QuadrangularFacet ( const G4ThreeVector     Pt0,
3262                              const G4ThreeVector     vt1,
3263                              const G4ThreeVector     vt2,
3264                              const G4ThreeVector     vt3,
3265                                    G4FacetVertexType fType )
3266</programlisting>
3267</informalexample>
3268
3269i.e., it takes 5 parameters to define the four vertices:
3270
3271<informaltable pgwide="0">
3272<tgroup cols="2">
3273<tbody>
3274<row>
3275  <entry>
3276    <literal>G4FacetVertexType</literal>
3277  </entry>
3278  <entry>
3279    <literal>ABSOLUTE</literal> in which case <literal>Pt0</literal>,
3280    <literal>vt1</literal>, <literal>vt2</literal> and <literal>vt3</literal> 
3281    are the four vertices required in anti-clockwise order when looking
3282    from the outside.
3283  </entry>
3284</row>
3285<row>
3286  <entry>
3287    <literal>G4FacetVertexType</literal>
3288  </entry>
3289  <entry>
3290    <literal>RELATIVE</literal> in which case the first vertex is
3291    <literal>Pt0</literal>, the second vertex is <literal>Pt0+vt</literal>,
3292    the third vertex is <literal>Pt0+vt2</literal> and the fourth vertex is
3293    <literal>Pt0+vt3</literal>, in anti-clockwise order when looking from the
3294    outside.
3295  </entry>
3296</row>
3297</tbody>
3298</tgroup>
3299</informaltable>
3300</para>
3301
3302<!-- ******* Bridgehead ******* -->
3303<bridgehead renderas='sect4'>
3304Importing CAD models as tessellated shapes
3305</bridgehead>
3306
3307<para>
3308Tessellated solids can also be used to import geometrical models from CAD
3309systems (see <xref linkend="fig.Geom.Solid_1" />). In order to do this, it
3310is required to convert first the CAD shapes into tessellated surfaces. A
3311way to do this is to save the shapes in the geometrical model as STEP files
3312and convert them using a tool like
3313<ulink url="http://www.steptools.com/products/stviewer/">STViewer</ulink> or
3314<ulink url="http://www.trad.fr/en/">FASTRAD</ulink> to
3315tessellated (faceted surfaces) solids. This strategy allows to import any shape
3316with some degree of approximation; the converted CAD models can then be
3317imported through <ulink url="http://cern.ch/gdml/">GDML (Geometry Description
3318Markup Language)</ulink> into Geant4 and be represented as
3319<literal>G4TessellatedSolid</literal> shapes.
3320</para>
3321
3322</sect3>
3323</sect2>
Note: See TracBrowser for help on using the repository browser.