Geant4 Cross Reference |
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 // Author: Mathieu Karamitros (kara (AT) cenbg . in2p3 . fr) 28 // 29 // History: 30 // ----------- 31 // 10 Oct 2011 M.Karamitros created 32 // 33 // ------------------------------------------------------------------- 34 35 #include "G4IT.hh" 36 #include "G4KDTree.hh" 37 #include "G4ITBox.hh" 38 #include "G4Track.hh" 39 #include "G4TrackList.hh" 40 #include "G4TrackingInformation.hh" 41 42 using namespace std; 43 44 //------------------------------------------------------------------------------ 45 // 46 // Static functions 47 // 48 G4IT* GetIT(const G4Track* track) 49 { 50 return (dynamic_cast<G4IT*>(track->GetUserInformation())); 51 } 52 53 G4IT* GetIT(const G4Track& track) 54 { 55 return (dynamic_cast<G4IT*>(track.GetUserInformation())); 56 } 57 58 template<> 59 G4KDNode<G4IT>::~G4KDNode(){ 60 fPoint->SetNode(nullptr); 61 } 62 63 //------------------------------------------------------------------------------ 64 // 65 // Constructors / Destructors 66 // 67 G4IT::G4IT() : 68 G4VUserTrackInformation("G4IT"), 69 fpTrack(nullptr), 70 fpPreviousIT(nullptr), 71 fpNextIT(nullptr), 72 fpTrackingInformation(new G4TrackingInformation()) 73 { 74 fpITBox = nullptr; 75 fpKDNode = nullptr; 76 fpTrackNode = nullptr; 77 fParentID_A = 0; 78 fParentID_B = 0; 79 } 80 81 // Use only by inheriting classes 82 G4IT::G4IT(const G4IT& /*right*/) : 83 G4VUserTrackInformation("G4IT"), 84 fpTrack(nullptr), 85 fpPreviousIT(nullptr), 86 fpNextIT(nullptr), 87 fpTrackingInformation(new G4TrackingInformation()) 88 { 89 fpITBox = nullptr; 90 fpKDNode = nullptr; 91 fpTrackNode = nullptr; 92 fParentID_A = 0; 93 fParentID_B = 0; 94 } 95 96 // Should not be used 97 G4IT& G4IT::operator=(const G4IT& right) 98 { 99 G4ExceptionDescription exceptionDescription; 100 exceptionDescription 101 << "The assignment operator of G4IT should not be used, " 102 "this feature is not supported." 103 << "If really needed, please contact the developers."; 104 G4Exception("G4IT::operator=(const G4IT& right)", 105 "G4IT001", 106 FatalException, 107 exceptionDescription); 108 109 if (this == &right) return *this; 110 111 fpTrack = nullptr; 112 fpITBox = nullptr; 113 fpPreviousIT = nullptr; 114 fpNextIT = nullptr; 115 fpKDNode = nullptr; 116 fParentID_A = 0; 117 fParentID_B = 0; 118 fpTrackingInformation = nullptr; 119 fpTrackNode = nullptr; 120 121 return *this; 122 } 123 124 G4IT::G4IT(G4Track * aTrack) : 125 G4VUserTrackInformation("G4IT"), 126 fpPreviousIT(nullptr), 127 fpNextIT(nullptr), 128 fpTrackingInformation(new G4TrackingInformation()) 129 { 130 fpITBox = nullptr; 131 fpTrack = aTrack; 132 fpKDNode = nullptr; 133 fpTrackNode = nullptr; 134 fParentID_A = 0; 135 fParentID_B = 0; 136 RecordCurrentPositionNTime(); 137 } 138 139 void G4IT::TakeOutBox() 140 { 141 if(fpITBox != nullptr) 142 { 143 fpITBox->Extract(this); 144 fpITBox = nullptr; 145 } 146 147 if(fpTrackNode != nullptr) 148 { 149 delete fpTrackNode; 150 fpTrackNode = nullptr; 151 } 152 153 if(fpKDNode != nullptr) 154 { 155 InactiveNode(fpKDNode); 156 fpKDNode = nullptr; 157 } 158 } 159 160 G4IT::~G4IT() 161 { 162 TakeOutBox(); 163 164 if(fpTrackingInformation != nullptr) 165 { 166 delete fpTrackingInformation; 167 fpTrackingInformation = nullptr; 168 } 169 170 // Note : 171 // G4ITTrackingManager will delete fTrackNode. 172 // fKDNode will be deleted when the KDTree is rebuilt 173 } 174 175 //------------------------------------------------------------------------------ 176 /// 177 // Methods 178 /// 179 180 G4bool G4IT::operator<(const G4IT& right) const 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) const 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) const 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()->GetPosition(); 215 return *(new G4ThreeVector()); 216 } 217 218 void G4IT::RecordCurrentPositionNTime() 219 { 220 if (fpTrack != nullptr) 221 { 222 fpTrackingInformation->RecordCurrentPositionNTime(fpTrack); 223 } 224 } 225 226 G4double G4IT::GetPreStepGlobalTime() const 227 { 228 return fpTrackingInformation->GetPreStepGlobalTime(); 229 } 230 231 G4double G4IT::GetPreStepLocalTime() const 232 { 233 return fpTrackingInformation->GetPreStepLocalTime(); 234 } 235 236 const G4ThreeVector& G4IT::GetPreStepPosition() const 237 { 238 return fpTrackingInformation->GetPreStepPosition(); 239 } 240 241