Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4Orb.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id$
27//
28// class G4Orb
29//
30// Implementation for G4Orb class
31//
32// History:
33//
34// 05.04.12 M.Kelsey - GetPointOnSurface() throw flat in cos(theta)
35// 30.06.04 V.Grichine - bug fixed in DistanceToIn(p,v) on Rmax surface
36// 20.08.03 V.Grichine - created
37//
38//////////////////////////////////////////////////////////////
39
40#include <assert.h>
41
42#include "G4Orb.hh"
43
44#include "G4VoxelLimits.hh"
45#include "G4AffineTransform.hh"
47
49
50#include "Randomize.hh"
51
52#include "meshdefs.hh"
53
54#include "G4VGraphicsScene.hh"
55#include "G4Polyhedron.hh"
56#include "G4NURBS.hh"
57#include "G4NURBSbox.hh"
58
59using namespace CLHEP;
60
61// Private enum: Not for external use - used by distanceToOut
62
64
65// used by normal
66
68
69
70////////////////////////////////////////////////////////////////////////
71//
72// constructor - check positive radius
73//
74
75G4Orb::G4Orb( const G4String& pName, G4double pRmax )
76: G4CSGSolid(pName), fRmax(pRmax)
77{
78
79 const G4double fEpsilon = 2.e-11; // relative tolerance of fRmax
80
81 G4double kRadTolerance
83
84 // Check radius
85 //
86 if ( pRmax < 10*kCarTolerance )
87 {
88 G4Exception("G4Orb::G4Orb()", "GeomSolids0002", FatalException,
89 "Invalid radius > 10*kCarTolerance.");
90 }
91 fRmaxTolerance = std::max( kRadTolerance, fEpsilon*fRmax);
92
93}
94
95///////////////////////////////////////////////////////////////////////
96//
97// Fake default constructor - sets only member data and allocates memory
98// for usage restricted to object persistency.
99//
100G4Orb::G4Orb( __void__& a )
101 : G4CSGSolid(a), fRmax(0.), fRmaxTolerance(0.)
102{
103}
104
105/////////////////////////////////////////////////////////////////////
106//
107// Destructor
108
110{
111}
112
113//////////////////////////////////////////////////////////////////////////
114//
115// Copy constructor
116
118 : G4CSGSolid(rhs), fRmax(rhs.fRmax), fRmaxTolerance(rhs.fRmaxTolerance)
119{
120}
121
122//////////////////////////////////////////////////////////////////////////
123//
124// Assignment operator
125
127{
128 // Check assignment to self
129 //
130 if (this == &rhs) { return *this; }
131
132 // Copy base class data
133 //
135
136 // Copy data
137 //
138 fRmax = rhs.fRmax;
139 fRmaxTolerance = rhs.fRmaxTolerance;
140
141 return *this;
142}
143
144//////////////////////////////////////////////////////////////////////////
145//
146// Dispatch to parameterisation for replication mechanism dimension
147// computation & modification.
148
150 const G4int n,
151 const G4VPhysicalVolume* pRep )
152{
153 p->ComputeDimensions(*this,n,pRep);
154}
155
156////////////////////////////////////////////////////////////////////////////
157//
158// Calculate extent under transform and specified limit
159
161 const G4VoxelLimits& pVoxelLimit,
162 const G4AffineTransform& pTransform,
163 G4double& pMin, G4double& pMax ) const
164{
165 // Compute x/y/z mins and maxs for bounding box respecting limits,
166 // with early returns if outside limits. Then switch() on pAxis,
167 // and compute exact x and y limit for x/y case
168
169 G4double xoffset,xMin,xMax;
170 G4double yoffset,yMin,yMax;
171 G4double zoffset,zMin,zMax;
172
173 G4double diff1,diff2,delta,maxDiff,newMin,newMax;
174 G4double xoff1,xoff2,yoff1,yoff2;
175
176 xoffset=pTransform.NetTranslation().x();
177 xMin=xoffset-fRmax;
178 xMax=xoffset+fRmax;
179
180 if (pVoxelLimit.IsXLimited())
181 {
182 if ( (xMin>pVoxelLimit.GetMaxXExtent()+kCarTolerance)
183 || (xMax<pVoxelLimit.GetMinXExtent()-kCarTolerance) )
184 {
185 return false;
186 }
187 else
188 {
189 if (xMin<pVoxelLimit.GetMinXExtent())
190 {
191 xMin=pVoxelLimit.GetMinXExtent();
192 }
193 if (xMax>pVoxelLimit.GetMaxXExtent())
194 {
195 xMax=pVoxelLimit.GetMaxXExtent();
196 }
197 }
198 }
199 yoffset=pTransform.NetTranslation().y();
200 yMin=yoffset-fRmax;
201 yMax=yoffset+fRmax;
202
203 if (pVoxelLimit.IsYLimited())
204 {
205 if ( (yMin>pVoxelLimit.GetMaxYExtent()+kCarTolerance)
206 || (yMax<pVoxelLimit.GetMinYExtent()-kCarTolerance) )
207 {
208 return false;
209 }
210 else
211 {
212 if (yMin<pVoxelLimit.GetMinYExtent())
213 {
214 yMin=pVoxelLimit.GetMinYExtent();
215 }
216 if (yMax>pVoxelLimit.GetMaxYExtent())
217 {
218 yMax=pVoxelLimit.GetMaxYExtent();
219 }
220 }
221 }
222 zoffset=pTransform.NetTranslation().z();
223 zMin=zoffset-fRmax;
224 zMax=zoffset+fRmax;
225
226 if (pVoxelLimit.IsZLimited())
227 {
228 if ( (zMin>pVoxelLimit.GetMaxZExtent()+kCarTolerance)
229 || (zMax<pVoxelLimit.GetMinZExtent()-kCarTolerance) )
230 {
231 return false;
232 }
233 else
234 {
235 if (zMin<pVoxelLimit.GetMinZExtent())
236 {
237 zMin=pVoxelLimit.GetMinZExtent();
238 }
239 if (zMax>pVoxelLimit.GetMaxZExtent())
240 {
241 zMax=pVoxelLimit.GetMaxZExtent();
242 }
243 }
244 }
245
246 // Known to cut sphere
247
248 switch (pAxis)
249 {
250 case kXAxis:
251 yoff1=yoffset-yMin;
252 yoff2=yMax-yoffset;
253
254 if ( yoff1 >= 0 && yoff2 >= 0 )
255 {
256 // Y limits cross max/min x => no change
257 //
258 pMin=xMin;
259 pMax=xMax;
260 }
261 else
262 {
263 // Y limits don't cross max/min x => compute max delta x,
264 // hence new mins/maxs
265 //
266 delta=fRmax*fRmax-yoff1*yoff1;
267 diff1=(delta>0.) ? std::sqrt(delta) : 0.;
268 delta=fRmax*fRmax-yoff2*yoff2;
269 diff2=(delta>0.) ? std::sqrt(delta) : 0.;
270 maxDiff=(diff1>diff2) ? diff1:diff2;
271 newMin=xoffset-maxDiff;
272 newMax=xoffset+maxDiff;
273 pMin=(newMin<xMin) ? xMin : newMin;
274 pMax=(newMax>xMax) ? xMax : newMax;
275 }
276 break;
277 case kYAxis:
278 xoff1=xoffset-xMin;
279 xoff2=xMax-xoffset;
280 if (xoff1>=0&&xoff2>=0)
281 {
282 // X limits cross max/min y => no change
283 //
284 pMin=yMin;
285 pMax=yMax;
286 }
287 else
288 {
289 // X limits don't cross max/min y => compute max delta y,
290 // hence new mins/maxs
291 //
292 delta=fRmax*fRmax-xoff1*xoff1;
293 diff1=(delta>0.) ? std::sqrt(delta) : 0.;
294 delta=fRmax*fRmax-xoff2*xoff2;
295 diff2=(delta>0.) ? std::sqrt(delta) : 0.;
296 maxDiff=(diff1>diff2) ? diff1:diff2;
297 newMin=yoffset-maxDiff;
298 newMax=yoffset+maxDiff;
299 pMin=(newMin<yMin) ? yMin : newMin;
300 pMax=(newMax>yMax) ? yMax : newMax;
301 }
302 break;
303 case kZAxis:
304 pMin=zMin;
305 pMax=zMax;
306 break;
307 default:
308 break;
309 }
310 pMin -= fRmaxTolerance;
311 pMax += fRmaxTolerance;
312
313 return true;
314
315}
316
317///////////////////////////////////////////////////////////////////////////
318//
319// Return whether point inside/outside/on surface
320// Split into radius checks
321//
322
324{
325 G4double rad2,tolRMax;
326 EInside in;
327
328
329 rad2 = p.x()*p.x()+p.y()*p.y()+p.z()*p.z();
330
331 G4double radius = std::sqrt(rad2);
332
333 // G4double radius = std::sqrt(rad2);
334 // Check radial surface
335 // sets `in'
336
337 tolRMax = fRmax - fRmaxTolerance*0.5;
338
339 if ( radius <= tolRMax ) { in = kInside; }
340 else
341 {
342 tolRMax = fRmax + fRmaxTolerance*0.5;
343 if ( radius <= tolRMax ) { in = kSurface; }
344 else { in = kOutside; }
345 }
346 return in;
347}
348
349/////////////////////////////////////////////////////////////////////
350//
351// Return unit normal of surface closest to p
352// - note if point on z axis, ignore phi divided sides
353// - unsafe if point close to z axis a rmin=0 - no explicit checks
354
356{
357 ENorm side = kNRMax;
358 G4ThreeVector norm;
359 G4double radius = std::sqrt(p.x()*p.x()+p.y()*p.y()+p.z()*p.z());
360
361 switch (side)
362 {
363 case kNRMax:
364 norm = G4ThreeVector(p.x()/radius,p.y()/radius,p.z()/radius);
365 break;
366 default: // Should never reach this case ...
367 DumpInfo();
368 G4Exception("G4Orb::SurfaceNormal()", "GeomSolids1002", JustWarning,
369 "Undefined side for valid surface normal to solid.");
370 break;
371 }
372
373 return norm;
374}
375
376///////////////////////////////////////////////////////////////////////////////
377//
378// Calculate distance to shape from outside, along normalised vector
379// - return kInfinity if no intersection, or intersection distance <= tolerance
380//
381// -> If point is outside outer radius, compute intersection with rmax
382// - if no intersection return
383// - if valid phi,theta return intersection Dist
384
386 const G4ThreeVector& v ) const
387{
388 G4double snxt = kInfinity; // snxt = default return value
389
390 G4double radius, pDotV3d; // , tolORMax2, tolIRMax2;
391 G4double c, d2, sd = kInfinity;
392
393 const G4double dRmax = 100.*fRmax;
394
395 // General Precalcs
396
397 radius = std::sqrt(p.x()*p.x() + p.y()*p.y() + p.z()*p.z());
398 pDotV3d = p.x()*v.x() + p.y()*v.y() + p.z()*v.z();
399
400 // Radial Precalcs
401
402 // tolORMax2 = (fRmax+fRmaxTolerance*0.5)*(fRmax+fRmaxTolerance*0.5);
403 // tolIRMax2 = (fRmax-fRmaxTolerance*0.5)*(fRmax-fRmaxTolerance*0.5);
404
405 // Outer spherical shell intersection
406 // - Only if outside tolerant fRmax
407 // - Check for if inside and outer G4Orb heading through solid (-> 0)
408 // - No intersect -> no intersection with G4Orb
409 //
410 // Shell eqn: x^2+y^2+z^2 = RSPH^2
411 //
412 // => (px+svx)^2+(py+svy)^2+(pz+svz)^2=R^2
413 //
414 // => (px^2+py^2+pz^2) +2sd(pxvx+pyvy+pzvz)+sd^2(vx^2+vy^2+vz^2)=R^2
415 // => rad2 +2sd(pDotV3d) +sd^2 =R^2
416 //
417 // => sd=-pDotV3d+-std::sqrt(pDotV3d^2-(rad2-R^2))
418
419 c = (radius - fRmax)*(radius + fRmax);
420
421 if( radius > fRmax-fRmaxTolerance*0.5 ) // not inside in terms of Inside(p)
422 {
423 if ( c > fRmaxTolerance*fRmax )
424 {
425 // If outside tolerant boundary of outer G4Orb in terms of c
426 // [ should be std::sqrt(rad2) - fRmax > fRmaxTolerance*0.5 ]
427
428 d2 = pDotV3d*pDotV3d - c;
429
430 if ( d2 >= 0 )
431 {
432 sd = -pDotV3d - std::sqrt(d2);
433 if ( sd >= 0 )
434 {
435 if ( sd > dRmax ) // Avoid rounding errors due to precision issues seen on
436 { // 64 bits systems. Split long distances and recompute
437 G4double fTerm = sd - std::fmod(sd,dRmax);
438 sd = fTerm + DistanceToIn(p+fTerm*v,v);
439 }
440 return snxt = sd;
441 }
442 }
443 else // No intersection with G4Orb
444 {
445 return snxt = kInfinity;
446 }
447 }
448 else // not outside in terms of c
449 {
450 if ( c > -fRmaxTolerance*fRmax ) // on surface
451 {
452 d2 = pDotV3d*pDotV3d - c;
453 if ( (d2 < fRmaxTolerance*fRmax) || (pDotV3d >= 0) )
454 {
455 return snxt = kInfinity;
456 }
457 else
458 {
459 return snxt = 0.;
460 }
461 }
462 }
463 }
464#ifdef G4CSGDEBUG
465 else // inside ???
466 {
467 G4Exception("G4Orb::DistanceToIn(p,v)", "GeomSolids1002",
468 JustWarning, "Point p is inside !?");
469 }
470#endif
471
472 return snxt;
473}
474
475//////////////////////////////////////////////////////////////////////
476//
477// Calculate distance (<= actual) to closest surface of shape from outside
478// - Calculate distance to radial plane
479// - Return 0 if point inside
480
482{
483 G4double safe = 0.0,
484 radius = std::sqrt(p.x()*p.x()+p.y()*p.y()+p.z()*p.z());
485 safe = radius - fRmax;
486 if( safe < 0 ) { safe = 0.; }
487 return safe;
488}
489
490/////////////////////////////////////////////////////////////////////
491//
492// Calculate distance to surface of shape from `inside', allowing for tolerance
493//
494
496 const G4ThreeVector& v,
497 const G4bool calcNorm,
498 G4bool *validNorm,
499 G4ThreeVector *n ) const
500{
501 G4double snxt = kInfinity; // ??? snxt is default return value
502 ESide side = kNull;
503
504 G4double rad2,pDotV3d;
505 G4double xi,yi,zi; // Intersection point
506 G4double c,d2;
507
508 rad2 = p.x()*p.x() + p.y()*p.y() + p.z()*p.z();
509 pDotV3d = p.x()*v.x() + p.y()*v.y() + p.z()*v.z();
510
511 // Radial Intersection from G4Orb::DistanceToIn
512 //
513 // Outer spherical shell intersection
514 // - Only if outside tolerant fRmax
515 // - Check for if inside and outer G4Orb heading through solid (-> 0)
516 // - No intersect -> no intersection with G4Orb
517 //
518 // Shell eqn: x^2+y^2+z^2=RSPH^2
519 //
520 // => (px+svx)^2+(py+svy)^2+(pz+svz)^2=R^2
521 //
522 // => (px^2+py^2+pz^2) +2s(pxvx+pyvy+pzvz)+s^2(vx^2+vy^2+vz^2)=R^2
523 // => rad2 +2s(pDotV3d) +s^2 =R^2
524 //
525 // => s=-pDotV3d+-std::sqrt(pDotV3d^2-(rad2-R^2))
526
527 const G4double Rmax_plus = fRmax + fRmaxTolerance*0.5;
528 G4double radius = std::sqrt(rad2);
529
530 if ( radius <= Rmax_plus )
531 {
532 c = (radius - fRmax)*(radius + fRmax);
533
534 if ( c < fRmaxTolerance*fRmax )
535 {
536 // Within tolerant Outer radius
537 //
538 // The test is
539 // radius - fRmax < 0.5*fRmaxTolerance
540 // => radius < fRmax + 0.5*kRadTol
541 // => rad2 < (fRmax + 0.5*kRadTol)^2
542 // => rad2 < fRmax^2 + 2.*0.5*fRmax*kRadTol + 0.25*kRadTol*kRadTol
543 // => rad2 - fRmax^2 <~ fRmax*kRadTol
544
545 d2 = pDotV3d*pDotV3d - c;
546
547 if( ( c > -fRmaxTolerance*fRmax) && // on tolerant surface
548 ( ( pDotV3d >= 0 ) || ( d2 < 0 )) ) // leaving outside from Rmax
549 // not re-entering
550 {
551 if(calcNorm)
552 {
553 *validNorm = true;
554 *n = G4ThreeVector(p.x()/fRmax,p.y()/fRmax,p.z()/fRmax);
555 }
556 return snxt = 0;
557 }
558 else
559 {
560 snxt = -pDotV3d + std::sqrt(d2); // second root since inside Rmax
561 side = kRMax;
562 }
563 }
564 }
565 else // p is outside ???
566 {
567 G4cout << G4endl;
568 DumpInfo();
569 std::ostringstream message;
570 G4int oldprc = message.precision(16);
571 message << "Logic error: snxt = kInfinity ???" << G4endl
572 << "Position:" << G4endl << G4endl
573 << "p.x() = " << p.x()/mm << " mm" << G4endl
574 << "p.y() = " << p.y()/mm << " mm" << G4endl
575 << "p.z() = " << p.z()/mm << " mm" << G4endl << G4endl
576 << "Rp = "<< std::sqrt( p.x()*p.x()+p.y()*p.y()+p.z()*p.z() )/mm
577 << " mm" << G4endl << G4endl
578 << "Direction:" << G4endl << G4endl
579 << "v.x() = " << v.x() << G4endl
580 << "v.y() = " << v.y() << G4endl
581 << "v.z() = " << v.z() << G4endl << G4endl
582 << "Proposed distance :" << G4endl << G4endl
583 << "snxt = " << snxt/mm << " mm" << G4endl;
584 message.precision(oldprc);
585 G4Exception("G4Orb::DistanceToOut(p,v,..)", "GeomSolids1002",
586 JustWarning, message);
587 }
588 if (calcNorm) // Output switch operator
589 {
590 switch( side )
591 {
592 case kRMax:
593 xi=p.x()+snxt*v.x();
594 yi=p.y()+snxt*v.y();
595 zi=p.z()+snxt*v.z();
596 *n=G4ThreeVector(xi/fRmax,yi/fRmax,zi/fRmax);
597 *validNorm=true;
598 break;
599 default:
600 G4cout << G4endl;
601 DumpInfo();
602 std::ostringstream message;
603 G4int oldprc = message.precision(16);
604 message << "Undefined side for valid surface normal to solid."
605 << G4endl
606 << "Position:" << G4endl << G4endl
607 << "p.x() = " << p.x()/mm << " mm" << G4endl
608 << "p.y() = " << p.y()/mm << " mm" << G4endl
609 << "p.z() = " << p.z()/mm << " mm" << G4endl << G4endl
610 << "Direction:" << G4endl << G4endl
611 << "v.x() = " << v.x() << G4endl
612 << "v.y() = " << v.y() << G4endl
613 << "v.z() = " << v.z() << G4endl << G4endl
614 << "Proposed distance :" << G4endl << G4endl
615 << "snxt = " << snxt/mm << " mm" << G4endl;
616 message.precision(oldprc);
617 G4Exception("G4Orb::DistanceToOut(p,v,..)","GeomSolids1002",
618 JustWarning, message);
619 break;
620 }
621 }
622 return snxt;
623}
624
625/////////////////////////////////////////////////////////////////////////
626//
627// Calculate distance (<=actual) to closest surface of shape from inside
628
630{
631 G4double safe=0.0,radius = std::sqrt(p.x()*p.x()+p.y()*p.y()+p.z()*p.z());
632
633#ifdef G4CSGDEBUG
634 if( Inside(p) == kOutside )
635 {
636 G4int oldprc = G4cout.precision(16);
637 G4cout << G4endl;
638 DumpInfo();
639 G4cout << "Position:" << G4endl << G4endl;
640 G4cout << "p.x() = " << p.x()/mm << " mm" << G4endl;
641 G4cout << "p.y() = " << p.y()/mm << " mm" << G4endl;
642 G4cout << "p.z() = " << p.z()/mm << " mm" << G4endl << G4endl;
643 G4cout.precision(oldprc);
644 G4Exception("G4Orb::DistanceToOut(p)", "GeomSolids1002",
645 JustWarning, "Point p is outside !?" );
646 }
647#endif
648
649 safe = fRmax - radius;
650 if ( safe < 0. ) safe = 0.;
651 return safe;
652}
653
654//////////////////////////////////////////////////////////////////////////
655//
656// G4EntityType
657
659{
660 return G4String("G4Orb");
661}
662
663//////////////////////////////////////////////////////////////////////////
664//
665// Make a clone of the object
666//
668{
669 return new G4Orb(*this);
670}
671
672//////////////////////////////////////////////////////////////////////////
673//
674// Stream object contents to an output stream
675
676std::ostream& G4Orb::StreamInfo( std::ostream& os ) const
677{
678 G4int oldprc = os.precision(16);
679 os << "-----------------------------------------------------------\n"
680 << " *** Dump for solid - " << GetName() << " ***\n"
681 << " ===================================================\n"
682 << " Solid type: G4Orb\n"
683 << " Parameters: \n"
684
685 << " outer radius: " << fRmax/mm << " mm \n"
686 << "-----------------------------------------------------------\n";
687 os.precision(oldprc);
688
689 return os;
690}
691
692/////////////////////////////////////////////////////////////////////////
693//
694// GetPointOnSurface
695
697{
698 // generate a random number from zero to 2pi...
699 //
700 G4double phi = RandFlat::shoot(0.,2.*pi);
701 G4double cosphi = std::cos(phi);
702 G4double sinphi = std::sin(phi);
703
704 // generate a random point uniform in area
705 G4double costheta = RandFlat::shoot(-1.,1.);
706 G4double sintheta = std::sqrt(1.-sqr(costheta));
707
708 return G4ThreeVector (fRmax*sintheta*cosphi,
709 fRmax*sintheta*sinphi, fRmax*costheta);
710}
711
712////////////////////////////////////////////////////////////////////////
713//
714// Methods for visualisation
715
717{
718 scene.AddSolid (*this);
719}
720
722{
723 return new G4PolyhedronSphere (0., fRmax, 0., 2*pi, 0., pi);
724}
725
727{
728 return new G4NURBSbox (fRmax, fRmax, fRmax); // Box for now!!!
729}
ESide
Definition: G4Cons.cc:68
ENorm
Definition: G4Cons.cc:72
@ JustWarning
@ FatalException
@ kRMax
Definition: G4Orb.cc:63
@ kNull
Definition: G4Orb.cc:63
@ kNRMax
Definition: G4Orb.cc:67
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
double z() const
double x() const
double y() const
static double shoot()
Definition: RandFlat.cc:59
G4ThreeVector NetTranslation() const
G4CSGSolid & operator=(const G4CSGSolid &rhs)
Definition: G4CSGSolid.cc:82
G4double GetRadialTolerance() const
static G4GeometryTolerance * GetInstance()
Definition: G4Orb.hh:52
G4ThreeVector GetPointOnSurface() const
Definition: G4Orb.cc:696
ESide
Definition: G4Orb.hh:127
@ kNull
Definition: G4Orb.hh:127
@ kRMax
Definition: G4Orb.hh:127
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
Definition: G4Orb.cc:355
void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
Definition: G4Orb.cc:149
G4VSolid * Clone() const
Definition: G4Orb.cc:667
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=G4bool(false), G4bool *validNorm=0, G4ThreeVector *n=0) const
Definition: G4Orb.cc:495
G4NURBS * CreateNURBS() const
Definition: G4Orb.cc:726
EInside Inside(const G4ThreeVector &p) const
Definition: G4Orb.cc:323
G4Orb(const G4String &pName, G4double pRmax)
Definition: G4Orb.cc:75
G4GeometryType GetEntityType() const
Definition: G4Orb.cc:658
virtual ~G4Orb()
Definition: G4Orb.cc:109
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
Definition: G4Orb.cc:385
G4Polyhedron * CreatePolyhedron() const
Definition: G4Orb.cc:721
ENorm
Definition: G4Orb.hh:131
@ kNRMax
Definition: G4Orb.hh:131
void DescribeYourselfTo(G4VGraphicsScene &scene) const
Definition: G4Orb.cc:716
std::ostream & StreamInfo(std::ostream &os) const
Definition: G4Orb.cc:676
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
Definition: G4Orb.cc:160
G4Orb & operator=(const G4Orb &rhs)
Definition: G4Orb.cc:126
virtual void AddSolid(const G4Box &)=0
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const
G4String GetName() const
void DumpInfo() const
G4double kCarTolerance
Definition: G4VSolid.hh:307
G4bool IsYLimited() const
G4double GetMinZExtent() const
G4bool IsXLimited() const
G4double GetMaxYExtent() const
G4double GetMaxZExtent() const
G4double GetMinYExtent() const
G4double GetMinXExtent() const
G4bool IsZLimited() const
G4double GetMaxXExtent() const
EAxis
Definition: geomdefs.hh:54
@ kYAxis
Definition: geomdefs.hh:54
@ kXAxis
Definition: geomdefs.hh:54
@ kZAxis
Definition: geomdefs.hh:54
EInside
Definition: geomdefs.hh:58
@ kInside
Definition: geomdefs.hh:58
@ kOutside
Definition: geomdefs.hh:58
@ kSurface
Definition: geomdefs.hh:58
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
Definition: DoubConv.h:17
T sqr(const T &x)
Definition: templates.hh:145