Geant4-11
G4EnclosingCylinder.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// Implementation of G4EnclosingCylinder, a utility class
27// for a quick check of geometry.
28//
29// Author: David C. Williams (davidw@scipp.ucsc.edu)
30// --------------------------------------------------------------------
31
34#include "G4ReduciblePolygon.hh"
36
37// Constructor
38//
40 G4bool thePhiIsOpen,
41 G4double theStartPhi,
42 G4double theTotalPhi )
43 : startPhi(theStartPhi), totalPhi(theTotalPhi),
44 concave(theTotalPhi > pi)
45{
46 //
47 // Obtain largest r and smallest and largest z
48 //
49 radius = rz->Amax();
50 zHi = rz->Bmax();
51 zLo = rz->Bmin();
52
55 //
56 // Save phi info
57 //
58 phiIsOpen = thePhiIsOpen;
59 if ( phiIsOpen )
60 {
61 rx1 = std::cos(startPhi);
62 ry1 = std::sin(startPhi);
63 dx1 = +ry1*10*kCarTolerance;
64 dy1 = -rx1*10*kCarTolerance;
65
66 rx2 = std::cos(startPhi+totalPhi);
67 ry2 = std::sin(startPhi+totalPhi);
68 dx2 = -ry2*10*kCarTolerance;
69 dy2 = +rx2*10*kCarTolerance;
70 }
71
72 //
73 // Add safety
74 //
76 zLo -= 10*kCarTolerance;
77 zHi += 10*kCarTolerance;
78}
79
80// Fake default constructor - sets only member data and allocates memory
81// for usage restricted to object persistency.
82//
84: radius(0.), zLo(0.), zHi(0.), phiIsOpen(0.), startPhi(0.), totalPhi(0.),
85 concave(false)
86{
87}
88
89// Destructor
90//
92{
93}
94
95// Outside
96//
97// Decide very rapidly if the point is outside the cylinder
98//
99// If one is not certain, return false
100//
102{
103 if (p.perp() > radius) return true;
104 if (p.z() < zLo) return true;
105 if (p.z() > zHi) return true;
106
107 if (phiIsOpen)
108 {
109 if (concave)
110 {
111 if ( ((p.x()-dx1)*ry1 - (p.y()-dy1)*rx1) < 0) return false;
112 if ( ((p.x()-dx2)*ry2 - (p.y()-dy2)*rx2) > 0) return false;
113 }
114 else
115 {
116 if ( ((p.x()-dx1)*ry1 - (p.y()-dy1)*rx1) > 0) return true;
117 if ( ((p.x()-dx2)*ry2 - (p.y()-dy2)*rx2) < 0) return true;
118 }
119 }
120
121 return false;
122}
123
124// Misses
125//
126// Decide very rapidly if the trajectory is going to miss the cylinder
127//
128// If one is not sure, return false
129//
131 const G4ThreeVector& v ) const
132{
133 if (!MustBeOutside(p)) return false;
134
135 G4double cross = p.x()*v.y() - p.y()*v.x();
136 if (cross > radius) return true;
137
138 if (p.perp() > radius)
139 {
140 G4double dot = p.x()*v.x() + p.y()*v.y();
141 if (dot > 0) return true;
142 }
143
144 return false;
145}
const G4double kCarTolerance
static constexpr double pi
Definition: G4SIunits.hh:55
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
double z() const
double x() const
double y() const
double perp() const
G4bool ShouldMiss(const G4ThreeVector &p, const G4ThreeVector &v) const
G4EnclosingCylinder(const G4ReduciblePolygon *rz, G4bool phiIsOpen, G4double startPhi, G4double totalPhi)
G4bool MustBeOutside(const G4ThreeVector &p) const
G4double GetSurfaceTolerance() const
static G4GeometryTolerance * GetInstance()
G4double Bmin() const
G4double Bmax() const
G4double Amax() const