Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // 26 // G4TrackStack class implementation << 27 // 23 // 28 // Author: Makoto Asai (SLAC) << 24 // $Id: G4TrackStack.cc,v 1.4 2001/07/13 15:01:55 gcosmo Exp $ 29 // ------------------------------------------- << 25 // GEANT4 tag $Name: geant4-04-00 $ >> 26 // >> 27 // >> 28 // Last Modification : 09/Dec/96 M.Asai >> 29 // 30 30 31 #include "G4TrackStack.hh" 31 #include "G4TrackStack.hh" 32 #include "G4SmartTrackStack.hh" << 32 33 #include "G4VTrajectory.hh" << 33 G4TrackStack::G4TrackStack() 34 #include "G4Track.hh" << 34 :n_stackedTrack(0),firstStackedTrack(0),lastStackedTrack(0) >> 35 {;} 35 36 36 G4TrackStack::~G4TrackStack() 37 G4TrackStack::~G4TrackStack() >> 38 {;} >> 39 >> 40 const G4TrackStack & G4TrackStack::operator=(const G4TrackStack &right) 37 { 41 { 38 clearAndDestroy(); << 42 n_stackedTrack = right.n_stackedTrack; >> 43 firstStackedTrack = right.firstStackedTrack; >> 44 lastStackedTrack = right.lastStackedTrack; >> 45 return *this; 39 } 46 } 40 47 41 void G4TrackStack::clearAndDestroy() << 48 int G4TrackStack::operator==(const G4TrackStack &right) const >> 49 { return (firstStackedTrack==right.firstStackedTrack); } >> 50 int G4TrackStack::operator!=(const G4TrackStack &right) const >> 51 { return (firstStackedTrack!=right.firstStackedTrack); } >> 52 >> 53 void G4TrackStack::TransferTo(G4TrackStack * aStack) 42 { 54 { 43 for(auto & i : *this) << 55 if(n_stackedTrack==0) return; >> 56 >> 57 if(aStack->n_stackedTrack == 0) >> 58 { >> 59 *aStack = *this; >> 60 } >> 61 else 44 { 62 { 45 delete i.GetTrack(); << 63 aStack->lastStackedTrack->SetNext( firstStackedTrack ); 46 delete i.GetTrajectory(); << 64 firstStackedTrack->SetPrevious( aStack->lastStackedTrack ); >> 65 aStack->lastStackedTrack = lastStackedTrack; >> 66 aStack->n_stackedTrack += n_stackedTrack; 47 } 67 } 48 clear(); << 68 >> 69 n_stackedTrack = 0; >> 70 firstStackedTrack = 0; >> 71 lastStackedTrack = 0; 49 } 72 } 50 73 51 void G4TrackStack::TransferTo(G4TrackStack* aS << 74 G4StackedTrack * G4TrackStack::PopFromStack() 52 { 75 { 53 for(auto & i : *this) << 76 if( n_stackedTrack == 0 ) return 0; >> 77 G4StackedTrack * aStackedTrack = lastStackedTrack; >> 78 GrabFromStack( aStackedTrack ); >> 79 return aStackedTrack; >> 80 } >> 81 >> 82 void G4TrackStack::PushToStack( G4StackedTrack * aStackedTrack ) >> 83 { >> 84 if( n_stackedTrack == 0 ) 54 { 85 { 55 aStack->push_back(i); << 86 aStackedTrack->SetPrevious( 0 ); >> 87 firstStackedTrack = aStackedTrack; 56 } 88 } 57 clear(); << 89 else >> 90 { >> 91 lastStackedTrack->SetNext( aStackedTrack ); >> 92 aStackedTrack->SetPrevious( lastStackedTrack ); >> 93 } >> 94 lastStackedTrack = aStackedTrack; >> 95 n_stackedTrack++; 58 } 96 } 59 97 60 void G4TrackStack::TransferTo(G4SmartTrackStac << 98 void G4TrackStack::GrabFromStack( G4StackedTrack * aStackedTrack ) 61 { 99 { 62 while (!this->empty()) << 100 if( n_stackedTrack == 1 ) >> 101 { >> 102 firstStackedTrack = 0; >> 103 lastStackedTrack = 0; >> 104 } >> 105 else 63 { 106 { 64 aStack->PushToStack(PopFromStack()); << 107 if( aStackedTrack == firstStackedTrack ) >> 108 { >> 109 firstStackedTrack = aStackedTrack->GetNext(); >> 110 firstStackedTrack->SetPrevious( 0 ); >> 111 } >> 112 else >> 113 { >> 114 if( aStackedTrack == lastStackedTrack ) >> 115 { >> 116 lastStackedTrack = aStackedTrack->GetPrevious(); >> 117 lastStackedTrack->SetNext( 0 ); >> 118 } >> 119 else >> 120 { >> 121 aStackedTrack->GetPrevious() >> 122 ->SetNext( aStackedTrack->GetNext() ); >> 123 aStackedTrack->GetNext() >> 124 ->SetPrevious( aStackedTrack->GetPrevious() ); >> 125 } >> 126 } 65 } 127 } >> 128 n_stackedTrack--; 66 } 129 } 67 130 68 G4double G4TrackStack::getTotalEnergy() const << 131 void G4TrackStack::clear() 69 { 132 { 70 G4double totalEnergy = 0.0; << 133 G4StackedTrack * aStackedTrack = firstStackedTrack; 71 for (const auto & i : *this) << 134 G4StackedTrack * nextStackedTrack; >> 135 >> 136 if ( n_stackedTrack == 0 ) return; >> 137 >> 138 // delete tracks in the stack >> 139 while( aStackedTrack != 0 ) 72 { 140 { 73 totalEnergy += i.GetTrack()->GetDynamicPar << 141 nextStackedTrack = aStackedTrack->GetNext(); >> 142 delete aStackedTrack->GetTrack(); >> 143 delete aStackedTrack; >> 144 aStackedTrack = nextStackedTrack; 74 } 145 } 75 return totalEnergy; << 146 n_stackedTrack = 0; >> 147 firstStackedTrack = 0; >> 148 lastStackedTrack = 0; 76 } 149 } >> 150 >> 151 77 152