Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // Author: Mathieu Karamitros (kara (AT) cenbg 27 // Author: Mathieu Karamitros (kara (AT) cenbg . in2p3 . fr) 28 // 28 // 29 // History: 29 // History: 30 // ----------- 30 // ----------- 31 // 10 Oct 2011 M.Karamitros created 31 // 10 Oct 2011 M.Karamitros created 32 // 32 // 33 // ------------------------------------------- 33 // ------------------------------------------------------------------- 34 34 35 #include "G4IT.hh" 35 #include "G4IT.hh" 36 #include "G4KDTree.hh" 36 #include "G4KDTree.hh" 37 #include "G4ITBox.hh" 37 #include "G4ITBox.hh" 38 #include "G4Track.hh" 38 #include "G4Track.hh" 39 #include "G4TrackList.hh" << 40 #include "G4TrackingInformation.hh" << 41 39 42 using namespace std; 40 using namespace std; 43 41 44 //-------------------------------------------- << 42 G4Allocator<G4IT> aITAllocator; 45 // << 43 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 44 /// 46 // Static functions 45 // Static functions 47 // << 46 /// 48 G4IT* GetIT(const G4Track* track) 47 G4IT* GetIT(const G4Track* track) 49 { 48 { 50 return (dynamic_cast<G4IT*>(track->GetUserIn << 49 return (dynamic_cast<G4IT*>(track->GetUserInformation())); 51 } 50 } 52 51 53 G4IT* GetIT(const G4Track& track) 52 G4IT* GetIT(const G4Track& track) 54 { 53 { 55 return (dynamic_cast<G4IT*>(track.GetUserInf << 54 return (dynamic_cast<G4IT*>(track.GetUserInformation())); 56 } 55 } 57 << 56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 58 template<> << 57 /// 59 G4KDNode<G4IT>::~G4KDNode(){ << 60 fPoint->SetNode(nullptr); << 61 } << 62 << 63 //-------------------------------------------- << 64 // << 65 // Constructors / Destructors 58 // Constructors / Destructors 66 // << 59 /// 67 G4IT::G4IT() : << 60 G4IT::G4IT() : G4VUserTrackInformation("G4IT"), 68 G4VUserTrackInformation("G4IT"), << 61 fTrack (0), 69 fpTrack(nullptr), << 62 fPreviousIT(0), fNextIT(0), fTrackingInformation(new G4TrackingInformation()) 70 fpPreviousIT(nullptr), << 63 { 71 fpNextIT(nullptr), << 64 fITBox=0; 72 fpTrackingInformation(new G4TrackingInform << 65 fKDNode = 0 ; 73 { << 66 fTrackNode = 0; 74 fpITBox = nullptr; << 67 fParentID_A = 0; 75 fpKDNode = nullptr; << 68 fParentID_B = 0; 76 fpTrackNode = nullptr; << 77 fParentID_A = 0; << 78 fParentID_B = 0; << 79 } 69 } 80 70 81 // Use only by inheriting classes 71 // Use only by inheriting classes 82 G4IT::G4IT(const G4IT& /*right*/) : << 72 G4IT::G4IT(const G4IT& /*right*/) : G4VUserTrackInformation("G4IT"), 83 G4VUserTrackInformation("G4IT"), << 73 fTrack (0), 84 fpTrack(nullptr), << 74 fPreviousIT(0), fNextIT(0), fTrackingInformation(new G4TrackingInformation()) 85 fpPreviousIT(nullptr), << 75 { 86 fpNextIT(nullptr), << 76 fITBox=0; 87 fpTrackingInformation(new G4TrackingInform << 77 fKDNode = 0 ; 88 { << 78 fTrackNode = 0; 89 fpITBox = nullptr; << 79 fParentID_A = 0; 90 fpKDNode = nullptr; << 80 fParentID_B = 0; 91 fpTrackNode = nullptr; << 92 fParentID_A = 0; << 93 fParentID_B = 0; << 94 } 81 } 95 82 96 // Should not be used 83 // Should not be used 97 G4IT& G4IT::operator=(const G4IT& right) 84 G4IT& G4IT::operator=(const G4IT& right) 98 { 85 { 99 G4ExceptionDescription exceptionDescription; << 86 if(this == &right) return *this; 100 exceptionDescription << 87 101 << "The assignment operator of G4IT shou << 88 fTrack = 0; 102 "this feature is not supported." << 89 fPreviousIT = 0; 103 << "If really needed, please contact the << 90 fNextIT = 0; 104 G4Exception("G4IT::operator=(const G4IT& rig << 91 fTrackingInformation = 0; 105 "G4IT001", << 92 fITBox = 0; 106 FatalException, << 93 fKDNode = 0 ; 107 exceptionDescription); << 94 fTrackNode = 0; 108 << 95 fParentID_A = 0; 109 if (this == &right) return *this; << 96 fParentID_B = 0; 110 << 97 return *this; 111 fpTrack = nullptr; << 98 } 112 fpITBox = nullptr; << 99 113 fpPreviousIT = nullptr; << 100 G4IT::G4IT(G4Track * aTrack) : G4VUserTrackInformation("G4IT"), 114 fpNextIT = nullptr; << 101 fPreviousIT(0), fNextIT(0), fTrackingInformation(new G4TrackingInformation()) 115 fpKDNode = nullptr; << 102 { 116 fParentID_A = 0; << 103 fITBox = 0; 117 fParentID_B = 0; << 104 fTrack = aTrack; 118 fpTrackingInformation = nullptr; << 105 fKDNode = 0 ; 119 fpTrackNode = nullptr; << 106 fTrackNode = 0; 120 << 107 fParentID_A = 0; 121 return *this; << 108 fParentID_B = 0; 122 } << 109 RecordCurrentPositionNTime(); 123 << 124 G4IT::G4IT(G4Track * aTrack) : << 125 G4VUserTrackInformation("G4IT"), << 126 fpPreviousIT(nullptr), << 127 fpNextIT(nullptr), << 128 fpTrackingInformation(new G4TrackingInform << 129 { << 130 fpITBox = nullptr; << 131 fpTrack = aTrack; << 132 fpKDNode = nullptr; << 133 fpTrackNode = nullptr; << 134 fParentID_A = 0; << 135 fParentID_B = 0; << 136 RecordCurrentPositionNTime(); << 137 } 110 } 138 111 139 void G4IT::TakeOutBox() 112 void G4IT::TakeOutBox() 140 { 113 { 141 if(fpITBox != nullptr) << 114 if(fITBox) 142 { << 115 { 143 fpITBox->Extract(this); << 116 fITBox->Extract(this); 144 fpITBox = nullptr; << 117 } 145 } << 118 146 << 119 if(fKDNode) 147 if(fpTrackNode != nullptr) << 120 { 148 { << 121 InactiveNode(fKDNode); 149 delete fpTrackNode; << 122 fKDNode = 0; 150 fpTrackNode = nullptr; << 123 } 151 } << 152 << 153 if(fpKDNode != nullptr) << 154 { << 155 InactiveNode(fpKDNode); << 156 fpKDNode = nullptr; << 157 } << 158 } 124 } 159 125 160 G4IT::~G4IT() 126 G4IT::~G4IT() 161 { 127 { 162 TakeOutBox(); << 128 TakeOutBox(); 163 << 164 if(fpTrackingInformation != nullptr) << 165 { << 166 delete fpTrackingInformation; << 167 fpTrackingInformation = nullptr; << 168 } << 169 129 170 // Note : << 130 if(fTrackingInformation) 171 // G4ITTrackingManager will delete fTrackNode. << 131 { 172 // fKDNode will be deleted when the KDTree is << 132 delete fTrackingInformation; >> 133 fTrackingInformation = 0; >> 134 } >> 135 >> 136 // Note : >> 137 // G4ITTrackingManager will delete fTrackNode. >> 138 // fKDNode will be deleted when the KDTree is rebuilt 173 } 139 } 174 << 140 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 175 //-------------------------------------------- << 176 /// 141 /// 177 // Methods 142 // Methods 178 /// 143 /// 179 << 180 G4bool G4IT::operator<(const G4IT& right) cons << 181 { << 182 if (GetITType() == right.GetITType()) << 183 { << 184 return (this->diff(right)); << 185 } << 186 << 187 return (GetITType() < right.GetITType()); << 188 << 189 } << 190 << 191 G4bool G4IT::operator==(const G4IT& right) con << 192 { << 193 if (GetITType() == right.GetITType()) << 194 { << 195 return this->equal(right); << 196 } << 197 return false; << 198 } << 199 << 200 G4bool G4IT::operator!=(const G4IT& right) con << 201 { << 202 return !(this->operator==(right)); << 203 } << 204 << 205 double G4IT::operator[](int i) const << 206 { << 207 return fpTrack->GetPosition()[i]; << 208 } << 209 << 210 //-------------------------------------------- << 211 << 212 const G4ThreeVector& G4IT::GetPosition() const << 213 { << 214 if (fpTrack != nullptr) return GetTrack()->G << 215 return *(new G4ThreeVector()); << 216 } << 217 << 218 void G4IT::RecordCurrentPositionNTime() 144 void G4IT::RecordCurrentPositionNTime() 219 { 145 { 220 if (fpTrack != nullptr) << 146 if(fTrack) 221 { << 147 { 222 fpTrackingInformation->RecordCurrentPositi << 148 fTrackingInformation->RecordCurrentPositionNTime(fTrack); 223 } << 149 } 224 } 150 } 225 151 226 G4double G4IT::GetPreStepGlobalTime() const << 152 G4bool G4IT::operator<(const G4IT& right) const 227 { 153 { 228 return fpTrackingInformation->GetPreStepGlob << 154 if(GetITType() == right.GetITType() ) >> 155 { >> 156 return (this->diff(right)) ; >> 157 } >> 158 else >> 159 { >> 160 return (GetITType() < right.GetITType()); >> 161 } >> 162 return false; 229 } 163 } 230 164 231 G4double G4IT::GetPreStepLocalTime() const << 165 G4bool G4IT::operator==(const G4IT& right) const 232 { 166 { 233 return fpTrackingInformation->GetPreStepLoca << 167 if(GetITType() == right.GetITType() ) >> 168 { >> 169 return this->equal(right); >> 170 } >> 171 return false; 234 } 172 } 235 173 236 const G4ThreeVector& G4IT::GetPreStepPosition( << 174 G4bool G4IT::operator!=(const G4IT& right) const 237 { 175 { 238 return fpTrackingInformation->GetPreStepPosi << 176 return !(this->operator==(right)); 239 } 177 } 240 << 241 178