Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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 ([email protected])
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(false), startPhi(0.), totalPhi(0.),
85 concave(false)
86{
87}
88
89// Outside
90//
91// Decide very rapidly if the point is outside the cylinder
92//
93// If one is not certain, return false
94//
96{
97 if (p.perp() > radius) return true;
98 if (p.z() < zLo) return true;
99 if (p.z() > zHi) return true;
100
101 if (phiIsOpen)
102 {
103 if (concave)
104 {
105 if ( ((p.x()-dx1)*ry1 - (p.y()-dy1)*rx1) < 0) return false;
106 if ( ((p.x()-dx2)*ry2 - (p.y()-dy2)*rx2) > 0) return false;
107 }
108 else
109 {
110 if ( ((p.x()-dx1)*ry1 - (p.y()-dy1)*rx1) > 0) return true;
111 if ( ((p.x()-dx2)*ry2 - (p.y()-dy2)*rx2) < 0) return true;
112 }
113 }
114
115 return false;
116}
117
118// Misses
119//
120// Decide very rapidly if the trajectory is going to miss the cylinder
121//
122// If one is not sure, return false
123//
125 const G4ThreeVector& v ) const
126{
127 if (!MustBeOutside(p)) return false;
128
129 G4double cross = p.x()*v.y() - p.y()*v.x();
130 if (cross > radius) return true;
131
132 if (p.perp() > radius)
133 {
134 G4double dot = p.x()*v.x() + p.y()*v.y();
135 if (dot > 0) return true;
136 }
137
138 return false;
139}
const G4double kCarTolerance
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