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 // G4TrackStack class implementation << 27 // 26 // 28 // Author: Makoto Asai (SLAC) << 27 // $Id: G4TrackStack.cc,v 1.9 2010-11-24 22:56:57 asaim Exp $ 29 // ------------------------------------------- << 28 // GEANT4 tag $Name: not supported by cvs2svn $ >> 29 // 30 30 31 #include "G4TrackStack.hh" 31 #include "G4TrackStack.hh" 32 #include "G4SmartTrackStack.hh" 32 #include "G4SmartTrackStack.hh" 33 #include "G4VTrajectory.hh" 33 #include "G4VTrajectory.hh" 34 #include "G4Track.hh" << 34 >> 35 G4TrackStack::G4TrackStack() >> 36 :n_stackedTrack(0),firstStackedTrack(0),lastStackedTrack(0) >> 37 { >> 38 maxNTracks = 0; >> 39 } 35 40 36 G4TrackStack::~G4TrackStack() 41 G4TrackStack::~G4TrackStack() 37 { 42 { 38 clearAndDestroy(); << 43 if( n_stackedTrack != 0 ) >> 44 { >> 45 G4StackedTrack * aStackedTrack = firstStackedTrack; >> 46 G4StackedTrack * nextStackedTrack; >> 47 >> 48 // delete tracks in the stack >> 49 while( aStackedTrack != 0 ) >> 50 { >> 51 nextStackedTrack = aStackedTrack->GetNext(); >> 52 delete aStackedTrack->GetTrack(); >> 53 delete aStackedTrack->GetTrajectory(); >> 54 delete aStackedTrack; >> 55 aStackedTrack = nextStackedTrack; >> 56 } >> 57 } >> 58 } >> 59 >> 60 const G4TrackStack & G4TrackStack::operator=(const G4TrackStack &right) >> 61 { >> 62 n_stackedTrack = right.n_stackedTrack; >> 63 firstStackedTrack = right.firstStackedTrack; >> 64 lastStackedTrack = right.lastStackedTrack; >> 65 return *this; 39 } 66 } 40 67 41 void G4TrackStack::clearAndDestroy() << 68 int G4TrackStack::operator==(const G4TrackStack &right) const >> 69 { return (firstStackedTrack==right.firstStackedTrack); } >> 70 int G4TrackStack::operator!=(const G4TrackStack &right) const >> 71 { return (firstStackedTrack!=right.firstStackedTrack); } >> 72 >> 73 void G4TrackStack::TransferTo(G4TrackStack * aStack) 42 { 74 { 43 for(auto & i : *this) << 75 if(n_stackedTrack==0) return; >> 76 >> 77 if(aStack->n_stackedTrack == 0) >> 78 { >> 79 *aStack = *this; >> 80 } >> 81 else 44 { 82 { 45 delete i.GetTrack(); << 83 aStack->lastStackedTrack->SetNext( firstStackedTrack ); 46 delete i.GetTrajectory(); << 84 firstStackedTrack->SetPrevious( aStack->lastStackedTrack ); >> 85 aStack->lastStackedTrack = lastStackedTrack; >> 86 aStack->n_stackedTrack += n_stackedTrack; 47 } 87 } 48 clear(); << 88 >> 89 n_stackedTrack = 0; >> 90 firstStackedTrack = 0; >> 91 lastStackedTrack = 0; >> 92 } >> 93 >> 94 void G4TrackStack::TransferTo(G4SmartTrackStack * aStack) >> 95 { >> 96 while(n_stackedTrack) >> 97 { aStack->PushToStack(PopFromStack()); } >> 98 } >> 99 >> 100 G4StackedTrack * G4TrackStack::PopFromStack() >> 101 { >> 102 if( n_stackedTrack == 0 ) return 0; >> 103 G4StackedTrack * aStackedTrack = lastStackedTrack; >> 104 GrabFromStack( aStackedTrack ); >> 105 return aStackedTrack; 49 } 106 } 50 107 51 void G4TrackStack::TransferTo(G4TrackStack* aS << 108 void G4TrackStack::PushToStack( G4StackedTrack * aStackedTrack ) 52 { 109 { 53 for(auto & i : *this) << 110 if(aStackedTrack) 54 { 111 { 55 aStack->push_back(i); << 112 if( n_stackedTrack == 0 ) >> 113 { >> 114 aStackedTrack->SetPrevious( 0 ); >> 115 firstStackedTrack = aStackedTrack; >> 116 } >> 117 else >> 118 { >> 119 lastStackedTrack->SetNext( aStackedTrack ); >> 120 aStackedTrack->SetPrevious( lastStackedTrack ); >> 121 } >> 122 lastStackedTrack = aStackedTrack; >> 123 n_stackedTrack++; >> 124 if(n_stackedTrack>maxNTracks) maxNTracks = n_stackedTrack; 56 } 125 } 57 clear(); << 58 } 126 } 59 127 60 void G4TrackStack::TransferTo(G4SmartTrackStac << 128 void G4TrackStack::GrabFromStack( G4StackedTrack * aStackedTrack ) 61 { 129 { 62 while (!this->empty()) << 130 if( n_stackedTrack == 1 ) 63 { 131 { 64 aStack->PushToStack(PopFromStack()); << 132 firstStackedTrack = 0; >> 133 lastStackedTrack = 0; 65 } 134 } >> 135 else >> 136 { >> 137 if( aStackedTrack == firstStackedTrack ) >> 138 { >> 139 firstStackedTrack = aStackedTrack->GetNext(); >> 140 firstStackedTrack->SetPrevious( 0 ); >> 141 } >> 142 else >> 143 { >> 144 if( aStackedTrack == lastStackedTrack ) >> 145 { >> 146 lastStackedTrack = aStackedTrack->GetPrevious(); >> 147 lastStackedTrack->SetNext( 0 ); >> 148 } >> 149 else >> 150 { >> 151 aStackedTrack->GetPrevious() >> 152 ->SetNext( aStackedTrack->GetNext() ); >> 153 aStackedTrack->GetNext() >> 154 ->SetPrevious( aStackedTrack->GetPrevious() ); >> 155 } >> 156 } >> 157 } >> 158 n_stackedTrack--; 66 } 159 } 67 160 68 G4double G4TrackStack::getTotalEnergy() const << 161 void G4TrackStack::clear() 69 { 162 { 70 G4double totalEnergy = 0.0; << 163 G4StackedTrack * aStackedTrack = firstStackedTrack; 71 for (const auto & i : *this) << 164 G4StackedTrack * nextStackedTrack; >> 165 >> 166 if ( n_stackedTrack == 0 ) return; >> 167 >> 168 // delete tracks in the stack >> 169 while( aStackedTrack != 0 ) 72 { 170 { 73 totalEnergy += i.GetTrack()->GetDynamicPar << 171 nextStackedTrack = aStackedTrack->GetNext(); >> 172 delete aStackedTrack->GetTrack(); >> 173 delete aStackedTrack->GetTrajectory(); >> 174 delete aStackedTrack; >> 175 aStackedTrack = nextStackedTrack; 74 } 176 } 75 return totalEnergy; << 177 n_stackedTrack = 0; >> 178 firstStackedTrack = 0; >> 179 lastStackedTrack = 0; 76 } 180 } >> 181 >> 182 77 183