Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4DNABoundingBox.cc
Go to the documentation of this file.
1// ********************************************************************
2// * License and Disclaimer *
3// * *
4// * The Geant4 software is copyright of the Copyright Holders of *
5// * the Geant4 Collaboration. It is provided under the terms and *
6// * conditions of the Geant4 Software License, included in the file *
7// * LICENSE and available at http://cern.ch/geant4/license . These *
8// * include a list of copyright holders. *
9// * *
10// * Neither the authors of this software system, nor their employing *
11// * institutes,nor the agencies providing financial support for this *
12// * work make any representation or warranty, express or implied, *
13// * regarding this software system or assume any liability for its *
14// * use. Please see the license in the file LICENSE and URL above *
15// * for the full disclaimer and the limitation of liability. *
16// * *
17// * This code implementation is the result of the scientific and *
18// * technical work of the GEANT4 collaboration. *
19// * By using, copying, modifying or distributing the software (or *
20// * any work based on the software) you agree to acknowledge its *
21// * use in resulting scientific publications, and indicate your *
22// * acceptance of all terms of the Geant4 Software license. *
23// ********************************************************************
24//
25//
26// Author: HoangTRAN, 20/2/2019
27#include "G4DNABoundingBox.hh"
28#include <array>
29#include "G4UnitsTable.hh"
30using std::array;
31using std::initializer_list;
32//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
33
35{
36 fxhi = rhs.fxhi;
37 fxlo = rhs.fxlo;
38 fyhi = rhs.fyhi;
39 fylo = rhs.fylo;
40 fzhi = rhs.fzhi;
41 fzlo = rhs.fzlo;
42}
43////....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
44
45G4DNABoundingBox::G4DNABoundingBox(const initializer_list<G4double>& l)
46{
47 fxhi = 0.;
48 fxlo = 0.;
49 fyhi = 0.;
50 fylo = 0.;
51 fzhi = 0.;
52 fzlo = 0.;
53 std::copy(l.begin(), l.end(), &fxhi);
54}
55
56//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
57
59{
60 fxhi = rhs.fxhi;
61 fxlo = rhs.fxlo;
62 fyhi = rhs.fyhi;
63 fylo = rhs.fylo;
64 fzhi = rhs.fzhi;
65 fzlo = rhs.fzlo;
66 return *this;
67}
68
70{
71 auto LengthY = this->Getyhi() - this->Getylo();
72 auto LengthX = this->Getxhi() - this->Getxlo();
73 auto LengthZ = this->Getzhi() - this->Getzlo();
74 G4double V = LengthY * LengthX * LengthZ;
75 return V;
76}
77
78//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
79
81{
82 for(size_t i = 0; i < 8; i++)
83 {
84 const G4ThreeVector& point = pics[i];
85 if(point.x() < fxlo)
86 {
87 fxlo = point.x();
88 }
89 if(point.x() > fxhi)
90 {
91 fxhi = point.x();
92 }
93
94 if(point.y() < fylo)
95 {
96 fylo = point.y();
97 }
98 if(point.y() > fyhi)
99 {
100 fyhi = point.y();
101 }
102
103 if(point.z() < fzlo)
104 {
105 fzlo = point.z();
106 }
107 if(point.z() > fzhi)
108 {
109 fzhi = point.z();
110 }
111 }
112}
113
114//------------------------------------------------------------------------------
115
117{
118 G4DNABoundingBox output;
119
120 output.fxhi = fxhi + trans.x();
121 output.fxlo = fxlo + trans.x();
122
123 output.fyhi = fyhi + trans.y();
124 output.fylo = fylo + trans.x();
125
126 output.fzhi = fzhi + trans.z();
127 output.fzlo = fzlo + trans.z();
128
129 return output;
130}
131//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
132
134{
135 return fxlo <= other.fxlo && fxhi >= other.fxhi && fylo <= other.fylo &&
136 fyhi >= other.fyhi && fzlo <= other.fzlo && fzhi >= other.fzhi;
137}
138
139//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
140
142{
143 return fxlo <= point.x() && fxhi >= point.x() && fylo <= point.y() &&
144 fyhi >= point.y() && fzlo <= point.z() && fzhi >= point.z();
145}
146
147//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
148
150 G4DNABoundingBox* out) const
151{
152 if(contains(other))
153 {
154 *out = other;
155 return true;
156 }
157 else if(other.contains(*this))
158 {
159 *out = *this;
160 return true;
161 }
162
163 // Check if there is no intersection
164 if(fxhi < other.fxlo || fxlo > other.fxhi || fyhi < other.fylo ||
165 fylo > other.fyhi || fzhi < other.fzlo || fzlo > other.fzhi)
166 {
167 *out = invalid;
168 return false;
169 }
170
171 G4double upperX = std::min(fxhi, other.fxhi);
172 G4double upperY = std::min(fyhi, other.fyhi);
173 G4double upperZ = std::min(fzhi, other.fzhi);
174
175 G4double lowerX = std::max(fxlo, other.fxlo);
176 G4double lowerY = std::max(fylo, other.fylo);
177 G4double lowerZ = std::max(fzlo, other.fzlo);
178
179 *out = G4DNABoundingBox{ upperX, lowerX, upperY, lowerY, upperZ, lowerZ };
180 return true;
181}
182
183//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
184
186 const G4double& Radius) const
187{
188 G4double x = query.x() - this->middlePoint().x();
189 G4double y = query.y() - this->middlePoint().y();
190 G4double z = query.z() - this->middlePoint().z();
191
192 x = std::abs(x);
193 y = std::abs(y);
194 z = std::abs(z);
195
196 if((x > (Radius + this->halfSideLengthInX())) ||
197 (y > (Radius + this->halfSideLengthInY())) ||
198 (z > (Radius + this->halfSideLengthInZ())))
199 {
200 return false; //
201 }
202 G4int num_less_extent = (x < this->halfSideLengthInX()) +
203 (y < this->halfSideLengthInY()) +
204 (z < this->halfSideLengthInZ());
205
206 if(num_less_extent > 1)
207 {
208 return true;
209 }
210
211 x = std::max(x - this->halfSideLengthInX(), 0.0);
212 y = std::max(y - this->halfSideLengthInY(), 0.0);
213 z = std::max(z - this->halfSideLengthInZ(), 0.0);
214
215 G4double norm = std::sqrt(x * x + y * y + z * z);
216
217 return (norm < Radius);
218}
219//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
220
222 const G4double& Radius) const
223{
224 G4ThreeVector temp = query - this->middlePoint();
225 G4double x = std::abs(temp.x()) + this->halfSideLengthInX();
226 G4double y = std::abs(temp.y()) + this->halfSideLengthInY();
227 G4double z = std::abs(temp.z()) + this->halfSideLengthInZ();
228 G4double norm = std::sqrt(x * x + y * y + z * z);
229 return (norm < Radius);
230}
231//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
232
234 const G4ThreeVector& Point,
235 const G4double& Radius) const
236{
237 return (((query - Point).mag()) < Radius);
238}
239
240//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
241
242array<G4DNABoundingBox, 8> G4DNABoundingBox::partition() const
243{
244 G4double xmid = (fxhi + fxlo) / 2.;
245 G4double ymid = (fyhi + fylo) / 2.;
246 G4double zmid = (fzhi + fzlo) / 2.;
247
248 std::array<G4DNABoundingBox, 8> ret{ {
249 G4DNABoundingBox{ xmid, fxlo, ymid, fylo, zmid,
250 fzlo }, // bottom left front
251 G4DNABoundingBox{ fxhi, xmid, ymid, fylo, zmid,
252 fzlo }, // bottom right front
253 G4DNABoundingBox{ xmid, fxlo, fyhi, ymid, zmid, fzlo }, // bottom left back
254 G4DNABoundingBox{ fxhi, xmid, fyhi, ymid, zmid,
255 fzlo }, // bottom right back
256 G4DNABoundingBox{ xmid, fxlo, ymid, fylo, fzhi, zmid }, // top left front
257 G4DNABoundingBox{ fxhi, xmid, ymid, fylo, fzhi, zmid }, // top right front
258 G4DNABoundingBox{ xmid, fxlo, fyhi, ymid, fzhi, zmid }, // top left back
259 G4DNABoundingBox{ fxhi, xmid, fyhi, ymid, fzhi, zmid } // top right back
260 } };
261 return ret;
262}
263//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
264
266{
267 return (fxhi == rhs.fxhi && fxlo == rhs.fxlo && fyhi == rhs.fyhi &&
268 fylo == rhs.fylo && fzhi == rhs.fzhi && fzlo == rhs.fzlo) ||
269 (std::isnan(fxhi) && std::isnan(rhs.fxhi) && std::isnan(fxlo) &&
270 std::isnan(rhs.fxlo) && std::isnan(fyhi) && std::isnan(rhs.fyhi) &&
271 std::isnan(fylo) && std::isnan(rhs.fylo) && std::isnan(fzhi) &&
272 std::isnan(rhs.fzhi) && std::isnan(fzlo) && std::isnan(rhs.fzlo));
273}
274
276{
277 return !operator==(rhs);
278}
279//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
280
281std::ostream& operator<<(std::ostream& stream, const G4DNABoundingBox& rhs)
282{
283 stream << "{" << G4BestUnit(rhs.fxhi, "Length") << ", "
284 << G4BestUnit(rhs.fxlo, "Length") << ", "
285 << G4BestUnit(rhs.fyhi, "Length") << ", "
286 << G4BestUnit(rhs.fylo, "Length") << ", "
287 << G4BestUnit(rhs.fzhi, "Length") << ", "
288 << G4BestUnit(rhs.fzlo, "Length") << ", "
289 << "}";
290 return stream;
291}
std::ostream & operator<<(std::ostream &stream, const G4DNABoundingBox &rhs)
const G4DNABoundingBox invalid
#define G4BestUnit(a, b)
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
double z() const
double x() const
double y() const
void resize(G4ThreeVector pics[8])
G4bool operator!=(const G4DNABoundingBox &rhs) const
G4double Getxlo() const
G4double Volume() const
G4double Getyhi() const
G4double Getylo() const
G4double Getxhi() const
G4ThreeVector middlePoint() const
G4double halfSideLengthInY() const
G4DNABoundingBox translate(const G4ThreeVector &trans) const
G4DNABoundingBox()=default
G4bool operator==(const G4DNABoundingBox &rhs) const
std::array< G4DNABoundingBox, 8 > partition() const
G4bool overlap(const G4DNABoundingBox &other, G4DNABoundingBox *out) const
G4DNABoundingBox & operator=(const G4DNABoundingBox &)=default
G4bool contains(const G4DNABoundingBox &other) const
G4double halfSideLengthInZ() const
G4double halfSideLengthInX() const
G4double Getzlo() const
G4double Getzhi() const