Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4ParticleChangeForMSC.cc
Go to the documentation of this file.
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$
28//
29//
30// --------------------------------------------------------------
31// GEANT 4 class implementation file
32//
33//
34//
35// ------------------------------------------------------------
36// Implemented for the new scheme 23 Mar. 1998 H.Kurahige
37// Update for model variant of msc 16 Jan 2004 V.Ivanchenko
38// --------------------------------------------------------------
39
41#include "G4SystemOfUnits.hh"
42#include "G4Track.hh"
43#include "G4Step.hh"
44#include "G4DynamicParticle.hh"
46
49{
50#ifdef G4VERBOSE
51 if (verboseLevel>2) {
52 G4cout << "G4ParticleChangeForMSC::G4ParticleChangeForMSC() " << G4endl;
53 }
54#endif
55}
56
58{
59#ifdef G4VERBOSE
60 if (verboseLevel>2) {
61 G4cout << "G4ParticleChangeForMSC::~G4ParticleChangeForMSC() " << G4endl;
62 }
63#endif
64}
65
68 : G4VParticleChange(right)
69{
70 if (verboseLevel>1) {
71 G4cout << "G4ParticleChangeForMSC:: copy constructor is called " << G4endl;
72 }
73 theMomentumDirection = right.theMomentumDirection;
74 thePosition = right.thePosition;
75}
76
77// assignment operator
79 const G4ParticleChangeForMSC &right)
80{
81 if (verboseLevel>1) {
82 G4cout << "G4ParticleChangeForMSC:: assignment operator is called " << G4endl;
83 }
84 if (this != &right)
85 {
93
94 theMomentumDirection = right.theMomentumDirection;
95 thePosition = right.thePosition;
96 }
97 return *this;
98}
99
100//----------------------------------------------------------------
101// methods for updating G4Step
102//
103
105{
106 // Update the G4Step specific attributes
109
110 // Multiple scattering calculates the final state of the particle
111 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
112
113 // update momentum direction
114 pPostStepPoint->SetMomentumDirection(theMomentumDirection);
115
116 // update position
117 pPostStepPoint->SetPosition( thePosition );
118 return pStep;
119}
120
122{
123 // Multiple scattering calculates the final state of the particle
124 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
125
126 // update momentum direction
127 pPostStepPoint->SetMomentumDirection(theMomentumDirection);
128
129 // update position
130 pPostStepPoint->SetPosition( thePosition );
131
132 // Update the G4Step specific attributes
133 return pStep;
134}
135
136
137//----------------------------------------------------------------
138// methods for printing messages
139//
140
142{
143// use base-class DumpInfo
145
146 G4int oldprc = G4cout.precision(3);
147 G4cout << " Position - x (mm) : "
148 << std::setw(20) << thePosition.x()/mm
149 << G4endl;
150 G4cout << " Position - y (mm) : "
151 << std::setw(20) << thePosition.y()/mm
152 << G4endl;
153 G4cout << " Position - z (mm) : "
154 << std::setw(20) << thePosition.z()/mm
155 << G4endl;
156 G4cout << " Momentum Direct - x : "
157 << std::setw(20) << theMomentumDirection.x()
158 << G4endl;
159 G4cout << " Momentum Direct - y : "
160 << std::setw(20) << theMomentumDirection.y()
161 << G4endl;
162 G4cout << " Momentum Direct - z : "
163 << std::setw(20) << theMomentumDirection.z()
164 << G4endl;
165 G4cout.precision(oldprc);
166}
167
168
170{
171 G4bool itsOK = true;
172 G4bool exitWithError = false;
173
174 G4double accuracy;
175
176 // check
177
178 // MomentumDirection should be unit vector
179 accuracy = std::fabs(theMomentumDirection.mag2()-1.0);
180 if (accuracy > accuracyForWarning) {
181 itsOK = false;
182 exitWithError = (accuracy > accuracyForException);
183#ifdef G4VERBOSE
184 G4cout << " G4ParticleChangeForMSC::CheckIt : ";
185 G4cout << "the Momentum Change is not unit vector !!"
186 << " Difference: " << accuracy << G4endl;
188 << " E=" << aTrack.GetKineticEnergy()/MeV
189 << " pos=" << aTrack.GetPosition().x()/m
190 << ", " << aTrack.GetPosition().y()/m
191 << ", " << aTrack.GetPosition().z()/m
192 <<G4endl;
193#endif
194 }
195
196 // dump out information of this particle change
197#ifdef G4VERBOSE
198 if (!itsOK) DumpInfo();
199#endif
200
201 // Exit with error
202 if (exitWithError) {
203 G4Exception("G4ParticleChangeForMSC::CheckIt",
204 "300",
206 "momentum direction was illegal");
207 }
208 //correction
209 if (!itsOK) {
210 G4double vmag = theMomentumDirection.mag();
211 theMomentumDirection = (1./vmag)*theMomentumDirection;
212 }
213
214 itsOK = (itsOK) && G4VParticleChange::CheckIt(aTrack);
215 return itsOK;
216}
217
218
219
220
@ EventMustBeAborted
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
double z() const
double x() const
double mag2() const
double y() const
double mag() const
virtual G4Step * UpdateStepForPostStep(G4Step *Step)
virtual G4Step * UpdateStepForAlongStep(G4Step *Step)
G4ParticleChangeForMSC & operator=(const G4ParticleChangeForMSC &right)
virtual void DumpInfo() const
virtual G4bool CheckIt(const G4Track &)
const G4String & GetParticleName() const
void SetPosition(const G4ThreeVector &aValue)
void SetMomentumDirection(const G4ThreeVector &aValue)
Definition: G4Step.hh:78
G4Track * GetTrack() const
void SetStepLength(G4double value)
G4StepPoint * GetPostStepPoint() const
G4TrackStatus GetTrackStatus() const
const G4ThreeVector & GetPosition() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
virtual G4bool CheckIt(const G4Track &)
static const G4double accuracyForException
G4TrackStatus theStatusChange
G4TrackFastVector * theListOfSecondaries
G4SteppingControl theSteppingControlFlag
static const G4double accuracyForWarning
virtual void DumpInfo() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41