Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Octree.hh
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//
27/*
28 * G4Octree.cc
29 *
30 * Created on: Feb 15, 2019
31 * Author: HoangTran
32 */
33
34#ifndef G4Octree_hh
35#define G4Octree_hh 1
36#include <array>
37#include <vector>
38#include <algorithm>
39#include <type_traits>
40#include <utility>
41#include <iterator>
42#include <iostream>
43#include <typeinfo>
44#include <list>
45#include "G4ThreeVector.hh"
46#include "G4DNABoundingBox.hh"
47#include "G4Allocator.hh"
48
49//using std::vector;
50//using std::array;
51//using namespace std;
52
53const size_t max_per_node = 2;
54const size_t max_depth = 100;
55
56template <typename Iterator, class Extractor,typename Point = G4ThreeVector>
57class G4Octree {
58public:
60 G4Octree(Iterator,Iterator);
61 G4Octree(Iterator,Iterator, Extractor);
62
64
65 //G4Octree(const tree_type& rhs);
67 void swap(tree_type& rhs);
68
71
73
74 size_t size() const;
75
76 template <typename OutPutContainer>
77 void radiusNeighbors(const Point& query, const G4double& radius, OutPutContainer& resultIndices) const;
78
79 void *operator new(size_t);
80 void operator delete(void *);
81
82private:
83 enum NodeTypes
84 {
85 DEFAULT,
86 LEAF,
87 MAX_DEPTH_LEAF,
88 INTERNAL
89 };
90
91 class Node;
92
93 using NodeVector = std::vector<std::pair<Iterator,Point>>;
94 using childNodeArray = std::array<Node*,8>;
95 struct LeafValues
96 {
97 std::array<std::pair<Iterator,Point>,
98 max_per_node> values_;
99 size_t size_;
100 };
101
102 class Node
103 {
104 public:
105 Node(const NodeVector& input_values);
106 Node(const NodeVector& input_values,
107 const G4DNABoundingBox& box,
108 size_t current_depth);
109 Node() = default;
110 Node(const Node&) = delete;
111 ~Node();
112 template <typename OutPutContainer>
113 G4bool radiusNeighbors(const Point& query, G4double radius,
114 OutPutContainer& resultIndices) const;
115 private:
116 void* fpValue;
117 G4DNABoundingBox fBigVolume;
118 NodeTypes fNodeType;
119
120 void init_max_depth_leaf(const NodeVector& input_values);
121 void init_leaf(const NodeVector& input_values);
122 void init_internal(
123 const NodeVector& input_values,
124 size_t current_depth);
125 struct InnerIterator
126 {
127 using wrapped_type = typename NodeVector::const_iterator;
128 wrapped_type it__;
129 InnerIterator(wrapped_type it):it__(it)
130 {}
131 Point operator*() const
132 {
133 return ((*it__).second);
134 }
135 InnerIterator& operator++()
136 {
137 ++it__;
138 return *this;
139 }
140 InnerIterator operator++(G4int)
141 {
142 InnerIterator other = *this;
143 ++it__;
144 return other;
145 }
146
147 G4bool operator==(const InnerIterator& rhs) const
148 {
149 return this->it__ == rhs.it__;
150 }
151
152 G4bool operator!=(const InnerIterator& rhs) const
153 {
154 return !operator==(rhs);
155 }
156 };
157 };
158 private:
159 Extractor functor_;
160 Node* head_;
161 size_t size_;
163
164};
165//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
166#include "G4Octree.icc"
167#endif
G4ErrorMatrix operator*(const G4ErrorMatrix &m1, const G4ErrorMatrix &m2)
const size_t max_per_node
Definition: G4Octree.hh:53
const size_t max_depth
Definition: G4Octree.hh:54
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4Octree(tree_type &&rhs)
void swap(tree_type &rhs)
size_t size() const
tree_type & operator=(tree_type rhs)
G4Octree(Iterator, Iterator, Extractor)
G4Octree(Iterator, Iterator)
void radiusNeighbors(const Point &query, const G4double &radius, OutPutContainer &resultIndices) const
bool operator!=(const HepRotation &r, const HepLorentzRotation &lt)
bool operator==(const HepRotation &r, const HepLorentzRotation &lt)
#define G4ThreadLocalStatic
Definition: tls.hh:76