Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/solids/CSG/src/G4UTrap.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /geometry/solids/CSG/src/G4UTrap.cc (Version 11.3.0) and /geometry/solids/CSG/src/G4UTrap.cc (Version 10.1.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // Implementation for G4UTrap wrapper class    << 
 27 //                                                 26 //
 28 // 13.09.13 G.Cosmo, CERN                      <<  27 // $Id:$
                                                   >>  28 //
                                                   >>  29 // 
                                                   >>  30 // Implementation for G4UTrap wrapper class
 29 // -------------------------------------------     31 // --------------------------------------------------------------------
 30                                                    32 
 31 #include "G4Trap.hh"                               33 #include "G4Trap.hh"
 32 #include "G4UTrap.hh"                              34 #include "G4UTrap.hh"
 33                                                << 
 34 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G << 
 35                                                << 
 36 #include "G4AffineTransform.hh"                << 
 37 #include "G4VPVParameterisation.hh"                35 #include "G4VPVParameterisation.hh"
 38 #include "G4BoundingEnvelope.hh"               <<  36 #include "G4Polyhedron.hh"
 39                                                << 
 40 using namespace CLHEP;                         << 
 41                                                    37 
 42 //////////////////////////////////////////////     38 /////////////////////////////////////////////////////////////////////////
 43 //                                                 39 //
 44 // Constructors                                    40 // Constructors
 45 //                                                 41 //
 46 G4UTrap::G4UTrap( const G4String& pName,           42 G4UTrap::G4UTrap( const G4String& pName,
 47                         G4double pdz,              43                         G4double pdz,
 48                         G4double pTheta, G4dou     44                         G4double pTheta, G4double pPhi,
 49                         G4double pdy1, G4doubl     45                         G4double pdy1, G4double pdx1, G4double pdx2,
 50                         G4double pAlp1,            46                         G4double pAlp1,
 51                         G4double pdy2, G4doubl     47                         G4double pdy2, G4double pdx3, G4double pdx4,
 52                         G4double pAlp2 )           48                         G4double pAlp2 )
 53   : Base_t(pName, pdz, pTheta, pPhi, pdy1, pdx <<  49   : G4USolid(pName, new UTrap(pName, pdz, pTheta, pPhi,
 54            pAlp1, pdy2, pdx3, pdx4, pAlp2)     <<  50                               pdy1, pdx1, pdx2, pAlp1, pdy2, pdx3, pdx4, pAlp2))
 55 {                                                  51 {
 56   G4ThreeVector pt[8];                         << 
 57   CheckParameters();                           << 
 58   GetVertices(pt);                             << 
 59   CheckPlanarity(pt);                          << 
 60 }                                                  52 }
 61                                                    53 
 62 G4UTrap::G4UTrap( const G4String& pName,           54 G4UTrap::G4UTrap( const G4String& pName,
 63                   const G4ThreeVector pt[8] )      55                   const G4ThreeVector pt[8] )
 64   : Base_t(pName)                              <<  56   : G4USolid(pName, new UTrap(pName))
 65 {                                                  57 {
 66   // Start with check of centering - the cente << 
 67   // should cross the origin of frame          << 
 68   if (  pt[0].z() >= 0                         << 
 69         || pt[0].z() != pt[1].z()              << 
 70         || pt[0].z() != pt[2].z()              << 
 71         || pt[0].z() != pt[3].z()              << 
 72                                                << 
 73         || pt[4].z() <= 0                      << 
 74         || pt[4].z() != pt[5].z()              << 
 75         || pt[4].z() != pt[6].z()              << 
 76         || pt[4].z() != pt[7].z()              << 
 77                                                << 
 78         || std::abs( pt[0].z() + pt[4].z() ) > << 
 79                                                << 
 80         || pt[0].y() != pt[1].y()              << 
 81         || pt[2].y() != pt[3].y()              << 
 82         || pt[4].y() != pt[5].y()              << 
 83         || pt[6].y() != pt[7].y()              << 
 84                                                << 
 85         || std::abs(pt[0].y()+pt[2].y()+pt[4]. << 
 86         || std::abs(pt[0].x()+pt[1].x()+pt[4]. << 
 87                     pt[2].x()+pt[3].x()+pt[6]. << 
 88   {                                            << 
 89     std::ostringstream message;                << 
 90     message << "Invalid vertice coordinates fo << 
 91     G4Exception("G4UTrap::G4UTrap()", "GeomSol << 
 92                 FatalException, message);      << 
 93   }                                            << 
 94                                                << 
 95   SetPlanes(pt);                                   58   SetPlanes(pt);
 96   CheckParameters();                           << 
 97   CheckPlanarity(pt);                          << 
 98 }                                                  59 }
 99                                                    60 
100 // Constructor for Right Angular Wedge from ST << 
101 // the UnplacedTrapezoid constructor taking fo << 
102 // a Trd1.                                     << 
103 G4UTrap::G4UTrap( const G4String& pName,           61 G4UTrap::G4UTrap( const G4String& pName,
104                         G4double pZ,               62                         G4double pZ,
105                         G4double pY,               63                         G4double pY,
106                         G4double pX, G4double      64                         G4double pX, G4double pLTX )
107   : Base_t(pName, 0.5*pZ, /*theta=*/0, /*phi=* <<  65   : G4USolid(pName, new UTrap(pName, pZ, pY, pX, pLTX))
108            /*dx1=*/0.5*pX, /*dx2=*/0.5*pLTX, / << 
109            /*dy2=*/0.5*pY, /*dx3=*/0.5*pX, /*d << 
110            /*Alpha2=*/0.5*(pLTX - pX)/pY)      << 
111 {                                                  66 {
112   CheckParameters();                           << 
113 }                                                  67 }
114                                                    68 
115 G4UTrap::G4UTrap( const G4String& pName,           69 G4UTrap::G4UTrap( const G4String& pName,
116                         G4double pdx1,  G4doub     70                         G4double pdx1,  G4double pdx2,
117                         G4double pdy1,  G4doub     71                         G4double pdy1,  G4double pdy2,
118                         G4double pdz )             72                         G4double pdz )
119   : Base_t(pName, pdx1, pdx2, pdy1, pdy2, pdz) <<  73   : G4USolid(pName, new UTrap(pName, pdx1, pdx2, pdy1, pdy2, pdz))
120 {                                                  74 {
121   CheckParameters();                           << 
122 }                                                  75 }
123                                                    76 
124 G4UTrap::G4UTrap(const G4String& pName,            77 G4UTrap::G4UTrap(const G4String& pName,
125                        G4double pdx, G4double      78                        G4double pdx, G4double pdy, G4double pdz,
126                        G4double pAlpha, G4doub     79                        G4double pAlpha, G4double pTheta, G4double pPhi )
127   : Base_t(pName, pdx, pdy, pdz, pAlpha, pThet <<  80   : G4USolid(pName, new UTrap(pName, pdx, pdy, pdz, pAlpha, pTheta, pPhi))
128 {                                                  81 {
129   CheckParameters();                           << 
130 }                                                  82 }
131                                                    83 
132 G4UTrap::G4UTrap( const G4String& pName )          84 G4UTrap::G4UTrap( const G4String& pName )
133   : Base_t(pName)                              <<  85   : G4USolid(pName, new UTrap(pName))
134 {                                                  86 {
135 }                                                  87 }
136                                                    88 
137 //////////////////////////////////////////////     89 ///////////////////////////////////////////////////////////////////////
138 //                                                 90 //
139 // Fake default constructor - sets only member     91 // Fake default constructor - sets only member data and allocates memory
140 //                            for usage restri     92 //                            for usage restricted to object persistency.
141 //                                                 93 //
142 G4UTrap::G4UTrap( __void__& a )                    94 G4UTrap::G4UTrap( __void__& a )
143   : Base_t(a)                                  <<  95   : G4USolid(a)
144 {                                                  96 {
145 }                                                  97 }
146                                                    98 
147 //////////////////////////////////////////////     99 //////////////////////////////////////////////////////////////////////////
148 //                                                100 //
149 // Destructor                                     101 // Destructor
150 //                                                102 //
151 G4UTrap::~G4UTrap() = default;                 << 103 G4UTrap::~G4UTrap()
                                                   >> 104 {
                                                   >> 105 }
152                                                   106 
153 //////////////////////////////////////////////    107 //////////////////////////////////////////////////////////////////////////
154 //                                                108 //
155 // Copy constructor                               109 // Copy constructor
156 //                                                110 //
157 G4UTrap::G4UTrap(const G4UTrap& rhs)              111 G4UTrap::G4UTrap(const G4UTrap& rhs)
158   : Base_t(rhs)                                << 112   : G4USolid(rhs)
159 {                                                 113 {
160 }                                                 114 }
161                                                   115 
162 //////////////////////////////////////////////    116 //////////////////////////////////////////////////////////////////////////
163 //                                                117 //
164 // Assignment operator                            118 // Assignment operator
165 //                                                119 //
166 G4UTrap& G4UTrap::operator = (const G4UTrap& r    120 G4UTrap& G4UTrap::operator = (const G4UTrap& rhs) 
167 {                                                 121 {
168    // Check assignment to self                    122    // Check assignment to self
169    //                                             123    //
170    if (this == &rhs)  { return *this; }           124    if (this == &rhs)  { return *this; }
171                                                   125 
172    // Copy base class data                        126    // Copy base class data
173    //                                             127    //
174    Base_t::operator=(rhs);                     << 128    G4USolid::operator=(rhs);
175                                                   129 
176    return *this;                                  130    return *this;
177 }                                                 131 }
178                                                   132 
179 ////////////////////////////////////////////// << 
180 //                                             << 
181 // Accessors                                   << 
182 //                                             << 
183 G4double G4UTrap::GetZHalfLength() const       << 
184 {                                              << 
185   return GetDz();                              << 
186 }                                              << 
187 G4double G4UTrap::GetYHalfLength1() const      << 
188 {                                              << 
189   return GetDy1();                             << 
190 }                                              << 
191 G4double G4UTrap::GetXHalfLength1() const      << 
192 {                                              << 
193   return GetDx1();                             << 
194 }                                              << 
195 G4double G4UTrap::GetXHalfLength2() const      << 
196 {                                              << 
197   return GetDx2();                             << 
198 }                                              << 
199 G4double G4UTrap::GetTanAlpha1() const         << 
200 {                                              << 
201   return Base_t::GetTanAlpha1();               << 
202 }                                              << 
203 G4double G4UTrap::GetYHalfLength2() const      << 
204 {                                              << 
205   return GetDy2();                             << 
206 }                                              << 
207 G4double G4UTrap::GetXHalfLength3() const      << 
208 {                                              << 
209   return GetDx3();                             << 
210 }                                              << 
211 G4double G4UTrap::GetXHalfLength4() const      << 
212 {                                              << 
213   return GetDx4();                             << 
214 }                                              << 
215 G4double G4UTrap::GetTanAlpha2() const         << 
216 {                                              << 
217   return Base_t::GetTanAlpha2();               << 
218 }                                              << 
219 G4double G4UTrap::GetPhi() const               << 
220 {                                              << 
221   return Base_t::GetPhi();                     << 
222 }                                              << 
223 G4double G4UTrap::GetTheta() const             << 
224 {                                              << 
225   return Base_t::GetTheta();                   << 
226 }                                              << 
227 G4double G4UTrap::GetAlpha1() const            << 
228 {                                              << 
229   return Base_t::GetAlpha1();                  << 
230 }                                              << 
231 G4double G4UTrap::GetAlpha2() const            << 
232 {                                              << 
233   return Base_t::GetAlpha2();                  << 
234 }                                              << 
235 TrapSidePlane G4UTrap::GetSidePlane(G4int n) c << 
236 {                                              << 
237   TrapSidePlane plane;                         << 
238   plane.a = GetStruct().GetPlane(n).fA;        << 
239   plane.b = GetStruct().GetPlane(n).fB;        << 
240   plane.c = GetStruct().GetPlane(n).fC;        << 
241   plane.d = GetStruct().GetPlane(n).fD;        << 
242   return plane;                                << 
243 }                                              << 
244 G4ThreeVector G4UTrap::GetSymAxis() const      << 
245 {                                              << 
246   G4double tanThetaSphi = GetTanThetaSinPhi(); << 
247   G4double tanThetaCphi = GetTanThetaCosPhi(); << 
248   G4double tan2Theta = tanThetaSphi*tanThetaSp << 
249   G4double cosTheta = 1.0 / std::sqrt(1 + tan2 << 
250   return {tanThetaCphi*cosTheta, tanThetaSphi* << 
251 }                                              << 
252                                                << 
253 ////////////////////////////////////////////// << 
254 //                                             << 
255 // Modifier                                    << 
256 //                                             << 
257 void G4UTrap::SetAllParameters(G4double pDz, G << 
258                                G4double pDy1,  << 
259                                G4double pAlp1, << 
260                                G4double pDy2,  << 
261                                G4double pAlp2) << 
262 {                                              << 
263   SetDz(pDz);                                  << 
264   SetDy1(pDy1);                                << 
265   SetDy2(pDy2);                                << 
266   SetDx1(pDx1);                                << 
267   SetDx2(pDx2);                                << 
268   SetDx3(pDx3);                                << 
269   SetDx4(pDx4);                                << 
270   SetTanAlpha1(std::tan(pAlp1));               << 
271   SetTanAlpha2(std::tan(pAlp2));               << 
272   // last two will also reset cached variables << 
273   SetTheta(pTheta);                            << 
274   SetPhi(pPhi);                                << 
275   fRebuildPolyhedron = true;                   << 
276                                                << 
277   G4ThreeVector pt[8];                         << 
278   CheckParameters();                           << 
279   GetVertices(pt);                             << 
280   CheckPlanarity(pt);                          << 
281 }                                              << 
282                                                << 
283 ////////////////////////////////////////////// << 
284 //                                             << 
285 // Set parameters using eight vertices         << 
286 //                                             << 
287 void G4UTrap::SetPlanes(const G4ThreeVector pt << 
288 {                                              << 
289   U3Vector upt[8];                             << 
290   for (unsigned int i=0; i<8; ++i)             << 
291   {                                            << 
292     upt[i] = U3Vector(pt[i].x(), pt[i].y(), pt << 
293   }                                            << 
294   fromCornersToParameters(upt);                << 
295   fRebuildPolyhedron = true;                   << 
296 }                                              << 
297                                                << 
298 ////////////////////////////////////////////// << 
299 //                                             << 
300 // Check dimensions                            << 
301 //                                             << 
302 void G4UTrap::CheckParameters() const          << 
303 {                                              << 
304   G4double fDz  = GetZHalfLength();            << 
305   G4double fDy1 = GetYHalfLength1();           << 
306   G4double fDx1 = GetXHalfLength1();           << 
307   G4double fDx2 = GetXHalfLength2();           << 
308   G4double fDy2 = GetYHalfLength2();           << 
309   G4double fDx3 = GetXHalfLength3();           << 
310   G4double fDx4 = GetXHalfLength4();           << 
311                                                << 
312   if (fDz<=0 ||                                << 
313       fDy1<=0 || fDx1<=0 || fDx2<=0 ||         << 
314       fDy2<=0 || fDx3<=0 || fDx4<=0)           << 
315   {                                            << 
316     std::ostringstream message;                << 
317     message << "Invalid Length Parameters for  << 
318             << "\n  X - " <<fDx1<<", "<<fDx2<< << 
319             << "\n  Y - " <<fDy1<<", "<<fDy2   << 
320             << "\n  Z - " <<fDz;               << 
321     G4Exception("G4UTrap::CheckParameters()",  << 
322                 FatalException, message);      << 
323   }                                            << 
324 }                                              << 
325                                                << 
326 ////////////////////////////////////////////// << 
327 //                                             << 
328 // Compute coordinates of vertices             << 
329 //                                             << 
330 void G4UTrap::GetVertices(G4ThreeVector pt[8]) << 
331 {                                              << 
332   G4double fDz      = GetZHalfLength();        << 
333   G4double fDy1     = GetYHalfLength1();       << 
334   G4double fDx1     = GetXHalfLength1();       << 
335   G4double fDx2     = GetXHalfLength2();       << 
336   G4double fDy2     = GetYHalfLength2();       << 
337   G4double fDx3     = GetXHalfLength3();       << 
338   G4double fDx4     = GetXHalfLength4();       << 
339   G4double fTalpha1 = GetTanAlpha1();          << 
340   G4double fTalpha2 = GetTanAlpha2();          << 
341                                                << 
342   G4double DzTthetaCphi = fDz*GetTanThetaCosPh << 
343   G4double DzTthetaSphi = fDz*GetTanThetaSinPh << 
344   G4double Dy1Talpha1   = fDy1*fTalpha1;       << 
345   G4double Dy2Talpha2   = fDy2*fTalpha2;       << 
346                                                << 
347   pt[0].set(-DzTthetaCphi-Dy1Talpha1-fDx1,-DzT << 
348   pt[1].set(-DzTthetaCphi-Dy1Talpha1+fDx1,-DzT << 
349   pt[2].set(-DzTthetaCphi+Dy1Talpha1-fDx2,-DzT << 
350   pt[3].set(-DzTthetaCphi+Dy1Talpha1+fDx2,-DzT << 
351   pt[4].set( DzTthetaCphi-Dy2Talpha2-fDx3, DzT << 
352   pt[5].set( DzTthetaCphi-Dy2Talpha2+fDx3, DzT << 
353   pt[6].set( DzTthetaCphi+Dy2Talpha2-fDx4, DzT << 
354   pt[7].set( DzTthetaCphi+Dy2Talpha2+fDx4, DzT << 
355 }                                              << 
356                                                << 
357 ////////////////////////////////////////////// << 
358 //                                             << 
359 // Check planarity of lateral planes           << 
360 //                                             << 
361 void G4UTrap::CheckPlanarity(const G4ThreeVect << 
362 {                                              << 
363   constexpr G4int iface[4][4] = { {0,4,5,1}, { << 
364   const static G4String side[4] = { "~-Y", "~+ << 
365                                                << 
366   for (G4int i=0; i<4; ++i)                    << 
367   {                                            << 
368     TrapSidePlane plane = GetSidePlane(i);     << 
369     G4double dmax = 0;                         << 
370     for (G4int k=0; k<4; ++k)                  << 
371     {                                          << 
372       const G4ThreeVector p = pt[iface[i][k]]; << 
373       G4double dist = plane.a*p.x() + plane.b* << 
374       if (std::abs(dist) > std::abs(dmax)) dma << 
375     }                                          << 
376     if (std::abs(dmax) > 1000 * kCarTolerance) << 
377     {                                          << 
378       std::ostringstream message;              << 
379       message << "Side face " << side[i] << "  << 
380               << GetName() << "\nDiscrepancy:  << 
381       StreamInfo(message);                     << 
382       G4Exception("G4UTrap::CheckPlanarity()", << 
383                   FatalException, message);    << 
384     }                                          << 
385   }                                            << 
386 }                                              << 
387                                                << 
388 //////////////////////////////////////////////    133 /////////////////////////////////////////////////////////////////////////
389 //                                                134 //
390 // Dispatch to parameterisation for replicatio    135 // Dispatch to parameterisation for replication mechanism dimension
391 // computation & modification.                    136 // computation & modification.
392 //                                                137 //
393 void G4UTrap::ComputeDimensions(      G4VPVPar    138 void G4UTrap::ComputeDimensions(      G4VPVParameterisation* p,
394                                 const G4int n,    139                                 const G4int n,
395                                 const G4VPhysi    140                                 const G4VPhysicalVolume* pRep)
396 {                                                 141 {
397   p->ComputeDimensions(*(G4Trap*)this,n,pRep);    142   p->ComputeDimensions(*(G4Trap*)this,n,pRep);
398 }                                                 143 }
399                                                   144 
400 //////////////////////////////////////////////    145 //////////////////////////////////////////////////////////////////////////
401 //                                                146 //
402 // Make a clone of the object                     147 // Make a clone of the object
403 //                                                148 //
404 G4VSolid* G4UTrap::Clone() const                  149 G4VSolid* G4UTrap::Clone() const
405 {                                                 150 {
406   return new G4UTrap(*this);                      151   return new G4UTrap(*this);
407 }                                                 152 }
408                                                   153 
409 //////////////////////////////////////////////    154 //////////////////////////////////////////////////////////////////////////
410 //                                                155 //
411 // Get bounding box                            << 156 // CreatePolyhedron()
412                                                << 
413 void G4UTrap::BoundingLimits(G4ThreeVector& pM << 
414 {                                              << 
415   static G4bool checkBBox = true;              << 
416                                                << 
417   TrapSidePlane planes[4];                     << 
418   for (G4int i=0; i<4; ++i) { planes[i] = GetS << 
419                                                << 
420   G4double xmin = kInfinity, xmax = -kInfinity << 
421   G4double ymin = kInfinity, ymax = -kInfinity << 
422   G4double dz   = GetZHalfLength();            << 
423   for (G4int i=0; i<8; ++i)                    << 
424   {                                            << 
425     G4int iy = (i==0 || i==1 || i==4 || i==5)  << 
426     G4int ix = (i==0 || i==2 || i==4 || i==6)  << 
427     G4double z = (i < 4) ? -dz : dz;           << 
428     G4double y = -(planes[iy].c*z + planes[iy] << 
429     G4double x = -(planes[ix].b*y + planes[ix] << 
430     if (x < xmin) xmin = x;                    << 
431     if (x > xmax) xmax = x;                    << 
432     if (y < ymin) ymin = y;                    << 
433     if (y > ymax) ymax = y;                    << 
434   }                                            << 
435                                                << 
436   pMin.set(xmin,ymin,-dz);                     << 
437   pMax.set(xmax,ymax, dz);                     << 
438                                                << 
439   // Check correctness of the bounding box     << 
440   //                                           << 
441   if (pMin.x() >= pMax.x() || pMin.y() >= pMax << 
442   {                                            << 
443     std::ostringstream message;                << 
444     message << "Bad bounding box (min >= max)  << 
445             << GetName() << " !"               << 
446             << "\npMin = " << pMin             << 
447             << "\npMax = " << pMax;            << 
448     G4Exception("G4UTrap::BoundingLimits()", " << 
449                 JustWarning, message);         << 
450     StreamInfo(G4cout);                        << 
451   }                                            << 
452                                                << 
453   // Check consistency of bounding boxes       << 
454   //                                           << 
455   if (checkBBox)                               << 
456   {                                            << 
457     G4double tolerance = kCarTolerance;        << 
458     U3Vector vmin, vmax;                       << 
459     Extent(vmin,vmax);                         << 
460     if (std::abs(pMin.x()-vmin.x()) > toleranc << 
461         std::abs(pMin.y()-vmin.y()) > toleranc << 
462         std::abs(pMin.z()-vmin.z()) > toleranc << 
463         std::abs(pMax.x()-vmax.x()) > toleranc << 
464         std::abs(pMax.y()-vmax.y()) > toleranc << 
465         std::abs(pMax.z()-vmax.z()) > toleranc << 
466     {                                          << 
467       std::ostringstream message;              << 
468       message << "Inconsistency in bounding bo << 
469               << GetName() << " !"             << 
470               << "\nBBox min: wrapper = " << p << 
471               << "\nBBox max: wrapper = " << p << 
472       G4Exception("G4UTrap::BoundingLimits()", << 
473                   JustWarning, message);       << 
474       checkBBox = false;                       << 
475     }                                          << 
476   }                                            << 
477 }                                              << 
478                                                << 
479 ////////////////////////////////////////////// << 
480 //                                             << 
481 // Calculate extent under transform and specif << 
482                                                << 
483 G4bool                                         << 
484 G4UTrap::CalculateExtent(const EAxis pAxis,    << 
485                          const G4VoxelLimits&  << 
486                          const G4AffineTransfo << 
487                                G4double& pMin, << 
488 {                                              << 
489   G4ThreeVector bmin, bmax;                    << 
490   G4bool exist;                                << 
491                                                << 
492   // Check bounding box (bbox)                 << 
493   //                                           << 
494   BoundingLimits(bmin,bmax);                   << 
495   G4BoundingEnvelope bbox(bmin,bmax);          << 
496 #ifdef G4BBOX_EXTENT                           << 
497   if (true) return bbox.CalculateExtent(pAxis, << 
498 #endif                                         << 
499   if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVox << 
500   {                                            << 
501     return exist = pMin < pMax;                << 
502   }                                            << 
503                                                << 
504   // Set bounding envelope (benv) and calculat << 
505   //                                           << 
506   TrapSidePlane planes[4];                     << 
507   for (G4int i=0; i<4; ++i) { planes[i] = GetS << 
508                                                << 
509   G4ThreeVector pt[8];                         << 
510   G4double dz = GetZHalfLength();              << 
511   for (G4int i=0; i<8; ++i)                    << 
512   {                                            << 
513     G4int iy = (i==0 || i==1 || i==4 || i==5)  << 
514     G4int ix = (i==0 || i==2 || i==4 || i==6)  << 
515     G4double z = (i < 4) ? -dz : dz;           << 
516     G4double y = -(planes[iy].c*z + planes[iy] << 
517     G4double x = -(planes[ix].b*y + planes[ix] << 
518     pt[i].set(x,y,z);                          << 
519   }                                            << 
520                                                << 
521   G4ThreeVectorList baseA(4), baseB(4);        << 
522   baseA[0] = pt[0];                            << 
523   baseA[1] = pt[1];                            << 
524   baseA[2] = pt[3];                            << 
525   baseA[3] = pt[2];                            << 
526                                                << 
527   baseB[0] = pt[4];                            << 
528   baseB[1] = pt[5];                            << 
529   baseB[2] = pt[7];                            << 
530   baseB[3] = pt[6];                            << 
531                                                << 
532   std::vector<const G4ThreeVectorList *> polyg << 
533   polygons[0] = &baseA;                        << 
534   polygons[1] = &baseB;                        << 
535                                                << 
536   G4BoundingEnvelope benv(bmin,bmax,polygons); << 
537   exist = benv.CalculateExtent(pAxis,pVoxelLim << 
538   return exist;                                << 
539 }                                              << 
540                                                << 
541 ////////////////////////////////////////////// << 
542 //                                             << 
543 // Create polyhedron for visualization         << 
544 //                                                157 //
545 G4Polyhedron* G4UTrap::CreatePolyhedron() cons    158 G4Polyhedron* G4UTrap::CreatePolyhedron() const
546 {                                                 159 {
547   return new G4PolyhedronTrap(GetZHalfLength() << 160   G4double fTthetaSphi = GetShape()->GetThetaSphi();
                                                   >> 161   G4double fTthetaCphi = GetShape()->GetThetaCphi();
                                                   >> 162   G4double phi = std::atan2(fTthetaSphi, fTthetaCphi);
                                                   >> 163   G4double alpha1 = std::atan(GetTanAlpha1());
                                                   >> 164   G4double alpha2 = std::atan(GetTanAlpha2());
                                                   >> 165   G4double theta = std::atan(std::sqrt(fTthetaCphi*fTthetaCphi+fTthetaSphi*fTthetaSphi));
                                                   >> 166 
                                                   >> 167   return new G4PolyhedronTrap(GetZHalfLength(), theta, phi,
548                               GetYHalfLength1(    168                               GetYHalfLength1(),
549                               GetXHalfLength1( << 169                               GetXHalfLength1(), GetXHalfLength2(), alpha1,
550                               GetYHalfLength2(    170                               GetYHalfLength2(),
551                               GetXHalfLength3( << 171                               GetXHalfLength3(), GetXHalfLength4(), alpha2);
552 }                                                 172 }
553                                                << 
554 #endif  // G4GEOM_USE_USOLIDS                  << 
555                                                   173