source: trunk/source/event/src/G4TrackStack.cc

Last change on this file was 1337, checked in by garnier, 14 years ago

tag geant4.9.4 beta 1 + modifs locales

File size: 5.2 KB
Line 
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// $Id: G4TrackStack.cc,v 1.8 2009/09/10 21:31:41 asaim Exp $
28// GEANT4 tag $Name: geant4-09-04-beta-01 $
29//
30
31#include "G4TrackStack.hh"
32#include "G4SmartTrackStack.hh"
33#include "G4VTrajectory.hh"
34
35G4TrackStack::G4TrackStack()
36:n_stackedTrack(0),firstStackedTrack(0),lastStackedTrack(0)
37{
38  maxNTracks = 0;
39}
40
41G4TrackStack::~G4TrackStack()
42{
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
60const G4TrackStack & G4TrackStack::operator=(const G4TrackStack &right) 
61{
62  n_stackedTrack = right.n_stackedTrack;
63  firstStackedTrack = right.firstStackedTrack;
64  lastStackedTrack = right.lastStackedTrack;
65  return *this; 
66}
67
68int G4TrackStack::operator==(const G4TrackStack &right) const
69{ return (firstStackedTrack==right.firstStackedTrack); }
70int G4TrackStack::operator!=(const G4TrackStack &right) const
71{ return (firstStackedTrack!=right.firstStackedTrack); }
72
73void G4TrackStack::TransferTo(G4TrackStack * aStack)
74{
75  if(n_stackedTrack==0) return;
76
77  if(aStack->n_stackedTrack == 0)
78  {
79    *aStack = *this;
80  }
81  else
82  {
83    aStack->lastStackedTrack->SetNext( firstStackedTrack );
84    firstStackedTrack->SetPrevious( aStack->lastStackedTrack );
85    aStack->lastStackedTrack = lastStackedTrack;
86    aStack->n_stackedTrack += n_stackedTrack;
87  }
88
89  n_stackedTrack = 0;
90  firstStackedTrack = 0;
91  lastStackedTrack = 0;
92}
93
94void G4TrackStack::TransferTo(G4SmartTrackStack * aStack)
95{
96  while(n_stackedTrack)
97  { aStack->PushToStack(PopFromStack()); }
98}
99
100G4StackedTrack * G4TrackStack::PopFromStack()
101{
102  if( n_stackedTrack == 0 ) return 0;
103  G4StackedTrack * aStackedTrack = lastStackedTrack;
104  GrabFromStack( aStackedTrack );
105  return aStackedTrack;
106}
107
108void G4TrackStack::PushToStack( G4StackedTrack * aStackedTrack )
109{
110  if( n_stackedTrack == 0 )
111  {
112    aStackedTrack->SetPrevious( 0 );
113    firstStackedTrack = aStackedTrack;
114  }
115  else
116  {
117    lastStackedTrack->SetNext( aStackedTrack );
118    aStackedTrack->SetPrevious( lastStackedTrack );
119  }
120  lastStackedTrack = aStackedTrack;
121  n_stackedTrack++;
122  if(n_stackedTrack>maxNTracks) maxNTracks = n_stackedTrack;
123}
124
125void G4TrackStack::GrabFromStack( G4StackedTrack * aStackedTrack )
126{
127  if( n_stackedTrack == 1 )
128  {
129    firstStackedTrack = 0;
130    lastStackedTrack = 0;
131  }
132  else
133  {
134    if( aStackedTrack == firstStackedTrack )
135    {
136      firstStackedTrack = aStackedTrack->GetNext();
137      firstStackedTrack->SetPrevious( 0 );
138    }
139    else
140    {
141      if( aStackedTrack == lastStackedTrack )
142      {
143        lastStackedTrack = aStackedTrack->GetPrevious();
144        lastStackedTrack->SetNext( 0 );
145      }
146      else
147      {
148        aStackedTrack->GetPrevious()
149          ->SetNext( aStackedTrack->GetNext() );
150        aStackedTrack->GetNext()
151          ->SetPrevious( aStackedTrack->GetPrevious() );
152      }
153    }
154  }
155  n_stackedTrack--;
156}
157
158void G4TrackStack::clear()
159{
160  G4StackedTrack * aStackedTrack = firstStackedTrack;
161  G4StackedTrack * nextStackedTrack;
162
163  if ( n_stackedTrack == 0 ) return;
164
165  // delete tracks in the stack
166  while( aStackedTrack != 0 )
167  {
168    nextStackedTrack = aStackedTrack->GetNext();
169    delete aStackedTrack->GetTrack();
170    delete aStackedTrack->GetTrajectory();
171    delete aStackedTrack;
172    aStackedTrack = nextStackedTrack;
173  }
174  n_stackedTrack = 0;
175  firstStackedTrack = 0;
176  lastStackedTrack = 0;
177}
178
179
Note: See TracBrowser for help on using the repository browser.