File indexing completed on 2025-01-18 09:58:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef G4OctreeFinder_hh
0029 #define G4OctreeFinder_hh 1
0030
0031 #include "globals.hh"
0032 #include "G4Octree.hh"
0033 #include "G4Track.hh"
0034 #include "G4ITType.hh"
0035 #include "G4memory.hh"
0036 #include "G4TrackList.hh"
0037
0038 #include <map>
0039 #include <functional>
0040
0041 #undef DEBUG
0042
0043 class G4VFinder
0044 {
0045 public:
0046 G4VFinder() = default;
0047 virtual ~G4VFinder() = default;
0048 virtual void Clear() = 0;
0049 virtual void SetVerboseLevel(G4int level) = 0;
0050 virtual G4int GetVerboseLevel() = 0;
0051 virtual G4ITType GetITType() = 0;
0052 };
0053
0054
0055 #ifndef _Extractor_
0056 #define _Extractor_
0057 template<typename CONTAINER>
0058 class Extractor
0059 {
0060 public:
0061 const G4ThreeVector operator () (typename CONTAINER::iterator it)
0062 {
0063 return (*it)->GetPosition();
0064 }
0065 std::function<G4bool(const std::pair<typename CONTAINER::iterator,G4double>,
0066 const std::pair<typename CONTAINER::iterator,G4double>)>
0067 compareInterval = [](const std::pair<typename CONTAINER::iterator,G4double>& iter1,
0068 const std::pair<typename CONTAINER::iterator,G4double>& iter2)
0069 -> G4bool
0070 {
0071 return (std::get<1>(iter1) < std::get<1>(iter2));
0072 };
0073
0074 };
0075 #endif
0076 template<class T,typename CONTAINER>
0077 class G4OctreeFinder: public G4VFinder
0078 {
0079 using Octree = G4Octree<typename CONTAINER::iterator,
0080 Extractor<CONTAINER> >;
0081 using OctreeHandle = G4shared_ptr<Octree>;
0082 using TreeMap = std::map<int, OctreeHandle>;
0083
0084 private:
0085 static G4ThreadLocal G4OctreeFinder* fInstance;
0086 G4OctreeFinder();
0087 int fVerbose{0};
0088 G4bool fIsOctreeUsed{false};
0089 G4bool fIsOctreeBuit{false};
0090 Extractor<CONTAINER> fExtractor;
0091 TreeMap fTreeMap;
0092 OctreeHandle fTree;
0093 public:
0094 static G4OctreeFinder * Instance();
0095
0096 void SetOctreeUsed(G4bool used);
0097 G4bool IsOctreeUsed() const;
0098
0099 void SetOctreeBuilt(G4bool used);
0100 G4bool IsOctreeBuilt() const;
0101
0102 ~G4OctreeFinder() override;
0103 void Clear() override;
0104
0105 void SetVerboseLevel(G4int level) override
0106 {
0107 fVerbose = level;
0108 }
0109
0110 G4int GetVerboseLevel() override
0111 {
0112 return fVerbose;
0113 }
0114
0115 G4ITType GetITType() override
0116 {
0117 return T::ITType();
0118 }
0119 void BuildTreeMap(const std::map<G4int,CONTAINER*>& listMap);
0120 void FindNearestInRange(const G4Track& track,
0121 const int& key,
0122 G4double R,
0123 std::vector<std::pair<typename
0124 CONTAINER::iterator,G4double>>& result,
0125 G4bool isSort = false) const;
0126
0127 void FindNearest(const G4Track& track,
0128 const int& key,
0129 G4double R,
0130 std::vector<std::pair<typename
0131 CONTAINER::iterator,G4double>>& result,
0132 G4bool isSort = false) const;
0133
0134 void FindNearestInRange(const G4ThreeVector& position,
0135 const G4int& key,
0136 G4double R,
0137 std::vector<std::pair<typename
0138 CONTAINER::iterator,G4double>>& result,
0139 G4bool isSort = false) const;
0140
0141 void FindNearestInRange(const G4ThreeVector& ,
0142 G4double R,
0143 std::vector<std::pair<
0144 typename CONTAINER::iterator,G4double> >&
0145 result,
0146 G4bool isSorted) const;
0147 };
0148
0149 #include "G4OctreeFinder.icc"
0150 #endif