source: trunk/source/track/src/G4ParticleChangeForTransport.cc @ 1187

Last change on this file since 1187 was 1058, checked in by garnier, 15 years ago

file release beta

File size: 9.1 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: G4ParticleChangeForTransport.cc,v 1.19 2006/11/03 17:45:04 japost Exp $
28// GEANT4 tag $Name: geant4-09-02-ref-02 $
29//
30//
31// --------------------------------------------------------------
32//      GEANT 4 class implementation file
33//
34//     
35//
36// ------------------------------------------------------------
37//   Implemented for the new scheme                 10 May. 1998  H.Kurahige
38//   Correct tratment of fpNextTouchable            12 May. 1998  H.Kurashige
39//   Change to the next volume only if energy>0     19 Jan. 2004  V.Ivanchenko
40// --------------------------------------------------------------
41
42#include "G4ParticleChangeForTransport.hh"
43#include "G4TouchableHandle.hh"
44#include "G4Track.hh"
45#include "G4Step.hh"
46#include "G4TrackFastVector.hh"
47#include "G4DynamicParticle.hh"
48
49G4ParticleChangeForTransport::G4ParticleChangeForTransport():G4ParticleChange()
50{
51  if (verboseLevel>2) {
52    G4cout << "G4ParticleChangeForTransport::G4ParticleChangeForTransport() " << G4endl;
53  }
54}
55
56G4ParticleChangeForTransport::~G4ParticleChangeForTransport() 
57{
58  if (verboseLevel>2) {
59    G4cout << "G4ParticleChangeForTransport::~G4ParticleChangeForTransport() " << G4endl;
60  }
61}
62
63
64G4ParticleChangeForTransport::G4ParticleChangeForTransport(const G4ParticleChangeForTransport &right):G4ParticleChange(right)
65{
66  if (verboseLevel>0) {
67    G4cout << "G4ParticleChangeForTransport::  copy constructor is called " << G4endl;
68  }
69  theTouchableHandle = right.theTouchableHandle;
70}
71
72// assignemnt operator
73G4ParticleChangeForTransport & G4ParticleChangeForTransport::operator=(const G4ParticleChangeForTransport &right)
74{
75   if (verboseLevel>1) {
76    G4cout << "G4ParticleChangeForTransport:: assignment operator is called " << G4endl;
77   }
78   if (this != &right)
79   {
80      theListOfSecondaries = right.theListOfSecondaries;
81      theSizeOftheListOfSecondaries = right.theSizeOftheListOfSecondaries;
82      theNumberOfSecondaries = right.theNumberOfSecondaries;
83      theStatusChange = right.theStatusChange;
84      theTouchableHandle = right.theTouchableHandle;
85      theMaterialChange = right.theMaterialChange;
86      theMaterialCutsCoupleChange = right.theMaterialCutsCoupleChange;
87      theSensitiveDetectorChange = right.theSensitiveDetectorChange;
88      theMomentumDirectionChange = right.theMomentumDirectionChange;
89      thePolarizationChange = right.thePolarizationChange;
90      thePositionChange = right.thePositionChange;
91      theTimeChange = right.theTimeChange;
92      theEnergyChange = right.theEnergyChange;
93      theTrueStepLength = right.theTrueStepLength;
94      theLocalEnergyDeposit = right.theLocalEnergyDeposit;
95      theSteppingControlFlag = right.theSteppingControlFlag;
96   }
97   return *this;
98}
99
100//----------------------------------------------------------------
101// methods for updating G4Step
102//
103
104G4Step* G4ParticleChangeForTransport::UpdateStepForAtRest(G4Step* pStep)
105{
106  // Nothing happens for AtRestDoIt
107  if (verboseLevel>0) {
108    G4cout << "G4ParticleChangeForTransport::UpdateStepForAtRest() is called" << G4endl;
109    G4cout << " Nothing happens for this method " << G4endl;
110  }
111  //  Update the G4Step specific attributes
112  return UpdateStepInfo(pStep);
113}
114
115
116G4Step* G4ParticleChangeForTransport::UpdateStepForAlongStep(G4Step* pStep)
117{
118  // Smooth curved tajectory representation: let the Step know about
119  // the auxiliary trajectory points (jacek 30/10/2002)
120  pStep->SetPointerToVectorOfAuxiliaryPoints(fpVectorOfAuxiliaryPointsPointer);
121
122  // copy of G4ParticleChange::UpdateStepForAlongStep
123  //  i.e. no effect for touchable
124
125  // A physics process always calculates the final state of the
126  // particle relative to the initial state at the beginning
127  // of the Step, i.e., based on information of G4Track (or
128  // equivalently the PreStepPoint).
129  // So, the differences (delta) between these two states have to be
130  // calculated and be accumulated in PostStepPoint.
131
132  // Take note that the return type of GetMomentumChange is a
133  // pointer to G4ThreeVector. Also it is a normalized
134  // momentum vector.
135
136  G4StepPoint* pPreStepPoint  = pStep->GetPreStepPoint();
137  G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
138  G4Track*     aTrack  = pStep->GetTrack();
139  G4double     mass = aTrack->GetDynamicParticle()->GetMass();
140
141  // uodate kinetic energy
142  //  now assume that no energy change in transportation
143  //  However it is not true in electric fields
144  //  Case for changing energy will be implemented in future
145
146
147  // update momentum direction and energy
148  if (isMomentumChanged) {
149    G4double energy;
150    energy= pPostStepPoint->GetKineticEnergy()
151                 + (theEnergyChange - pPreStepPoint->GetKineticEnergy());
152
153    // calculate new momentum
154    G4ThreeVector pMomentum =  pPostStepPoint->GetMomentum()
155                     + ( CalcMomentum(theEnergyChange, theMomentumDirectionChange, mass)
156                          - pPreStepPoint->GetMomentum());
157    G4double      tMomentum = pMomentum.mag();
158    G4ThreeVector direction(1.0,0.0,0.0);
159    if( tMomentum > 0. ){
160      G4double  inv_Momentum= 1.0 / tMomentum;
161      direction= pMomentum * inv_Momentum;
162    }
163    pPostStepPoint->SetMomentumDirection(direction);
164    pPostStepPoint->SetKineticEnergy( energy );
165  }
166
167  // stop case should not occur
168  //pPostStepPoint->SetMomentumDirection(G4ThreeVector(1., 0., 0.));
169
170
171  // update polarization
172  pPostStepPoint->AddPolarization( thePolarizationChange
173                                   - pPreStepPoint->GetPolarization());
174
175  // update position and time
176  pPostStepPoint->AddPosition( thePositionChange
177                               - pPreStepPoint->GetPosition() );
178  pPostStepPoint->AddGlobalTime( theTimeChange
179                                 - pPreStepPoint->GetGlobalTime());
180  pPostStepPoint->AddLocalTime( theTimeChange
181                                 - pPreStepPoint->GetGlobalTime());
182  pPostStepPoint->AddProperTime( theProperTimeChange
183                                 - pPreStepPoint->GetProperTime());
184
185#ifdef G4VERBOSE
186  if (debugFlag) CheckIt(*aTrack);
187#endif
188
189  //  Update the G4Step specific attributes
190  //pStep->SetStepLength( theTrueStepLength );
191  //  pStep->AddTotalEnergyDeposit( theLocalEnergyDeposit );
192  pStep->SetControlFlag( theSteppingControlFlag );
193  return pStep;
194  //  return UpdateStepInfo(pStep);
195}
196
197G4Step* G4ParticleChangeForTransport::UpdateStepForPostStep(G4Step* pStep)
198{
199  // A physics process always calculates the final state of the particle
200
201  // Change volume only if some kinetic energy remains
202  G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
203  if(pPostStepPoint->GetKineticEnergy() > 0.0) {
204
205    // update next touchable
206    // (touchable can be changed only at PostStepDoIt)
207    pPostStepPoint->SetTouchableHandle( theTouchableHandle );
208
209    pPostStepPoint->SetMaterial( theMaterialChange );
210    pPostStepPoint->SetMaterialCutsCouple( theMaterialCutsCoupleChange );
211    pPostStepPoint->SetSensitiveDetector( theSensitiveDetectorChange );
212  }
213  if( this->GetLastStepInVolume() ){
214    pStep->SetLastStepFlag();
215  }else{
216    pStep->ClearLastStepFlag(); 
217  }
218  // It used to call base class's method
219  //   - but this would copy uninitialised data members
220  // return G4ParticleChange::UpdateStepForPostStep(pStep);
221
222  // Copying what the base class does would instead
223  //   - also not useful
224  // return G4VParticleChange::UpdateStepInfo(pStep);
225
226  return pStep;
227}
228
229//----------------------------------------------------------------
230// methods for printing messages
231//
232
233void G4ParticleChangeForTransport::DumpInfo() const
234{
235// use base-class DumpInfo
236  G4ParticleChange::DumpInfo();
237
238  G4cout.precision(3);
239  G4cout << "        Touchable (pointer) : " 
240       << std::setw(20) << theTouchableHandle()
241       << G4endl; 
242}
243
244
245
246
247
248
249
250
Note: See TracBrowser for help on using the repository browser.