Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4FastStep.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//
28//---------------------------------------------------------------
29//
30// G4FastStep.cc
31//
32// Description:
33// Encapsulates a G4ParticleChange and insure friendly interface
34// methods to manage the primary/secondaries final state for
35// Fast Simulation Models.
36//
37// History:
38// Oct 97: Verderi && MoraDeFreitas - First Implementation.
39// Apr 98: MoraDeFreitas - G4FastStep becomes the G4ParticleChange
40// for the Fast Simulation Process.
41//
42//---------------------------------------------------------------
43
44#include "G4FastStep.hh"
45
46#include "G4SystemOfUnits.hh"
47#include "G4UnitsTable.hh"
48#include "G4Track.hh"
49#include "G4Step.hh"
50#include "G4TrackFastVector.hh"
51#include "G4DynamicParticle.hh"
52
53void G4FastStep::Initialize(const G4FastTrack& fastTrack)
54{
55 // keeps the fastTrack reference
56 fFastTrack=&fastTrack;
57
58 // currentTrack will be used to Initialize the other data members
59 const G4Track& currentTrack = *(fFastTrack->GetPrimaryTrack());
60
61 // use base class's method at first
63
64 // set Energy/Momentum etc. equal to those of the parent particle
65 const G4DynamicParticle* pParticle = currentTrack.GetDynamicParticle();
66 theEnergyChange = pParticle->GetKineticEnergy();
67 theMomentumChange = pParticle->GetMomentumDirection();
68 thePolarizationChange = pParticle->GetPolarization();
69 theProperTimeChange = pParticle->GetProperTime();
70
71 // set Position/Time etc. equal to those of the parent track
72 thePositionChange = currentTrack.GetPosition();
73 theTimeChange = currentTrack.GetGlobalTime();
74
75 // switch off stepping hit invokation by default:
77
78 // event biasing weigth:
79 theWeightChange = currentTrack.GetWeight();
80}
81
82//----------------------------------------
83// -- Set the StopAndKilled signal
84// -- and put kinetic energy to 0.0. in the
85// -- G4ParticleChange.
86//----------------------------------------
88{
91}
92
93//--------------------
94//
95//--------------------
96void
99 G4bool localCoordinates)
100{
101 // Compute the position coordinate in global
102 // reference system if needed ...
103 G4ThreeVector globalPosition = position;
104 if (localCoordinates)
105 globalPosition = fFastTrack->GetInverseAffineTransformation()->
106 TransformPoint(position);
107 // ...and feed the globalPosition:
108 thePositionChange = globalPosition;
109}
110
111void
114 G4bool localCoordinates)
115{
117}
118
119//--------------------
120//
121//--------------------
122void
125 G4bool localCoordinates)
126{
127 // Compute the momentum in global reference
128 // system if needed ...
129 G4ThreeVector globalMomentum = momentum;
130 if (localCoordinates)
131 globalMomentum = fFastTrack->GetInverseAffineTransformation()->
132 TransformAxis(momentum);
133 // ...and feed the globalMomentum (ensuring unitarity)
134 SetMomentumChange(globalMomentum.unit());
135}
136
137void
140 G4bool localCoordinates)
141{
142 ProposePrimaryTrackFinalMomentumDirection(momentum, localCoordinates);
143}
144
145//--------------------
146//
147//--------------------
148void
151 const G4ThreeVector &direction,
152 G4bool localCoordinates)
153{
154 // Compute global direction if needed...
155 G4ThreeVector globalDirection = direction;
156 if (localCoordinates)
157 globalDirection =fFastTrack->GetInverseAffineTransformation()->
158 TransformAxis(direction);
159 // ...and feed the globalMomentum (ensuring unitarity)
160 SetMomentumChange(globalDirection.unit());
162}
163
164void
167 const G4ThreeVector &direction,
168 G4bool localCoordinates)
169{
170 ProposePrimaryTrackFinalKineticEnergyAndDirection(kineticEnergy, direction, localCoordinates);
171}
172
173//--------------------
174//
175//--------------------
176void
179 G4bool localCoordinates)
180{
181 // Compute polarization in global system if needed:
182 G4ThreeVector globalPolarization(polarization);
183 if (localCoordinates)
184 globalPolarization = fFastTrack->GetInverseAffineTransformation()->
185 TransformAxis(globalPolarization);
186 // Feed the particle globalPolarization:
187 thePolarizationChange = globalPolarization;
188}
189
190void
193 G4bool localCoordinates)
194{
195 ProposePrimaryTrackFinalPolarization(polarization, localCoordinates);
196}
197
198//--------------------
199//
200//--------------------
203 G4ThreeVector polarization,
205 G4double time,
206 G4bool localCoordinates )
207{
208 G4DynamicParticle dummyDynamics(dynamics);
209
210 // ------------------------------------------
211 // Add the polarization to the dummyDynamics:
212 // ------------------------------------------
213 dummyDynamics.SetPolarization(polarization.x(),
214 polarization.y(),
215 polarization.z());
216
217 return CreateSecondaryTrack(dummyDynamics, position, time, localCoordinates);
218}
219
220//--------------------
221//
222//--------------------
226 G4double time,
227 G4bool localCoordinates )
228{
229 // ----------------------------------------
230 // Quantities in global coordinates system.
231 //
232 // The allocated globalDynamics is deleted
233 // by the destructor of the G4Track.
234 // ----------------------------------------
235 G4DynamicParticle* globalDynamics =
236 new G4DynamicParticle(dynamics);
237 G4ThreeVector globalPosition(position);
238
239 // -----------------------------------
240 // Convert to global system if needed:
241 // -----------------------------------
242 if (localCoordinates)
243 {
244 // -- Momentum Direction:
245 globalDynamics->SetMomentumDirection(fFastTrack->
246 GetInverseAffineTransformation()->
247 TransformAxis(globalDynamics->
248 GetMomentumDirection()));
249 // -- Polarization:
250 G4ThreeVector globalPolarization;
251 globalPolarization = fFastTrack->GetInverseAffineTransformation()->
252 TransformAxis(globalDynamics->GetPolarization());
253 globalDynamics->SetPolarization(
254 globalPolarization.x(),
255 globalPolarization.y(),
256 globalPolarization.z()
257 );
258
259 // -- Position:
260 globalPosition = fFastTrack->GetInverseAffineTransformation()->
261 TransformPoint(globalPosition);
262 }
263
264 //-------------------------------------
265 // Create the G4Track of the secondary:
266 //-------------------------------------
267 G4Track* secondary = new G4Track(
268 globalDynamics,
269 time,
270 globalPosition
271 );
272
273 //-------------------------------
274 // and feed the changes:
275 //-------------------------------
276 AddSecondary(secondary);
277
278 //--------------------------------------
279 // returns the pointer on the secondary:
280 //--------------------------------------
281 return secondary;
282}
283
284// G4FastStep should never be Initialized in this way
285// but we must define it to avoid warnings.
287{
288 G4ExceptionDescription tellWhatIsWrong;
289 tellWhatIsWrong << "G4FastStep can be initialised only through G4FastTrack."
290 << G4endl;
291 G4Exception("G4FastStep::Initialize(const G4Track&)",
292 "FastSim005",
294 tellWhatIsWrong);
295}
296
299{
300 if (verboseLevel>2)
301 {
302 G4cerr << "G4FastStep::G4FastStep()" << G4endl;
303 }
304}
305
307{
308 if (verboseLevel>2)
309 {
310 G4cerr << "G4FastStep::~G4FastStep()" << G4endl;
311 }
312}
313
314//----------------------------------------------------------------
315// methods for updating G4Step
316//
317
319{
320 // A physics process always calculates the final state of the particle
321
322 // Take note that the return type of GetMomentumChange is a
323 // pointer to G4ParticleMometum. Also it is a normalized
324 // momentum vector.
325
326 // G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint();
327 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
328 G4Track* aTrack = pStep->GetTrack();
329 // G4double mass = aTrack->GetDynamicParticle()->GetMass();
330
331 // update kinetic energy and momentum direction
332 pPostStepPoint->SetMomentumDirection(theMomentumChange);
333 pPostStepPoint->SetKineticEnergy( theEnergyChange );
334
335 // update polarization
336 pPostStepPoint->SetPolarization( thePolarizationChange );
337
338 // update position and time
339 pPostStepPoint->SetPosition( thePositionChange );
340 pPostStepPoint->SetGlobalTime( theTimeChange );
341 pPostStepPoint->AddLocalTime( theTimeChange
342 - aTrack->GetGlobalTime());
343 pPostStepPoint->SetProperTime( theProperTimeChange );
344
345 // update weight
346 pPostStepPoint->SetWeight( theWeightChange );
347
348 if (debugFlag) CheckIt(*aTrack);
349
350
351 // Update the G4Step specific attributes
352 return UpdateStepInfo(pStep);
353}
354
356{
357 // A physics process always calculates the final state of the particle
358
359 // G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint();
360 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
361 G4Track* aTrack = pStep->GetTrack();
362 // G4double mass = aTrack->GetDynamicParticle()->GetMass();
363
364 // update kinetic energy and momentum direction
365 pPostStepPoint->SetMomentumDirection(theMomentumChange);
366 pPostStepPoint->SetKineticEnergy( theEnergyChange );
367
368 // update polarization
369 pPostStepPoint->SetPolarization( thePolarizationChange );
370
371 // update position and time
372 pPostStepPoint->SetPosition( thePositionChange );
373 pPostStepPoint->SetGlobalTime( theTimeChange );
374 pPostStepPoint->AddLocalTime( theTimeChange
375 - aTrack->GetGlobalTime());
376 pPostStepPoint->SetProperTime( theProperTimeChange );
377
378 // update weight
379 pPostStepPoint->SetWeight( theWeightChange );
380
381 if (debugFlag) CheckIt(*aTrack);
382
383 // Update the G4Step specific attributes
384 return UpdateStepInfo(pStep);
385}
386
387//----------------------------------------------------------------
388// methods for printing messages
389//
390
392{
393// use base-class DumpInfo
395
396 G4cout << " Position - x (mm) : " << G4BestUnit( thePositionChange.x(), "Length" ) << G4endl;
397 G4cout << " Position - y (mm) : " << G4BestUnit( thePositionChange.y(), "Length" ) << G4endl;
398 G4cout << " Position - z (mm) : " << G4BestUnit( thePositionChange.z(), "Length" ) << G4endl;
399 G4cout << " Time (ns) : " << G4BestUnit( theTimeChange, "Time" ) << G4endl;
400 G4cout << " Proper Time (ns) : " << G4BestUnit( theProperTimeChange, "Time" ) << G4endl;
401 G4long olprc = G4cout.precision(3);
402 G4cout << " Momentum Direct - x : " << std::setw(20) << theMomentumChange.x() << G4endl;
403 G4cout << " Momentum Direct - y : " << std::setw(20) << theMomentumChange.y() << G4endl;
404 G4cout << " Momentum Direct - z : " << std::setw(20) << theMomentumChange.z() << G4endl;
405 G4cout.precision(olprc);
406 G4cout << " Kinetic Energy (MeV): " << G4BestUnit( theEnergyChange, "Energy" ) << G4endl;
407 G4cout.precision(3);
408 G4cout << " Polarization - x : " << std::setw(20) << thePolarizationChange.x() << G4endl;
409 G4cout << " Polarization - y : " << std::setw(20) << thePolarizationChange.y() << G4endl;
410 G4cout << " Polarization - z : " << std::setw(20) << thePolarizationChange.z() << G4endl;
411 G4cout.precision(olprc);
412}
413
415{
416 //
417 // In the G4FastStep::CheckIt
418 // We only check a bit
419 //
420 // If the user violates the energy,
421 // We don't care, we agree.
422 //
423 // But for theMomentumDirectionChange,
424 // We do pay attention.
425 // And if too large is its range,
426 // We issue an Exception.
427 //
428 //
429 // It means, the G4FastStep::CheckIt issues an exception only for the
430 // theMomentumDirectionChange which should be an unit vector
431 // and it corrects it because it could cause problems for the ulterior
432 // tracking.For the rest, only warning are issued.
433
434 G4bool itsOK = true;
435 G4bool exitWithError = false;
436 G4double accuracy;
437
438 // Energy should not be larger than the initial value
439 accuracy = ( theEnergyChange - aTrack.GetKineticEnergy())/MeV;
440 if (accuracy > GetAccuracyForWarning())
441 {
443 ed << "The energy becomes larger than the initial value, difference = " << accuracy << " MeV" << G4endl;
444 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
445 "FastSim006",
446 JustWarning, ed);
447 itsOK = false;
448 if (accuracy > GetAccuracyForException()) {exitWithError = true;}
449 }
450
451 G4bool itsOKforMomentum = true;
452 if ( theEnergyChange >0.)
453 {
454 accuracy = std::abs(theMomentumChange.mag2()-1.0);
455 if (accuracy > GetAccuracyForWarning())
456 {
458 ed << "The Momentum Change is not a unit vector, difference = " << accuracy << G4endl;
459 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
460 "FastSim007",
461 JustWarning, ed);
462 itsOK = itsOKforMomentum = false;
463 if (accuracy > GetAccuracyForException()) {exitWithError = true;}
464 }
465 }
466
467 accuracy = (aTrack.GetGlobalTime()- theTimeChange)/ns;
468 if (accuracy > GetAccuracyForWarning())
469 {
471 ed << "The global time is getting backward, difference = " << accuracy << " ns" << G4endl;
472 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
473 "FastSim008",
474 JustWarning, ed);
475 itsOK = false;
476 }
477
478 accuracy = (aTrack.GetProperTime() - theProperTimeChange )/ns;
479 if (accuracy > GetAccuracyForWarning())
480 {
482 ed << "The proper time is getting backward, difference = " << accuracy << " ns" << G4endl;
483 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
484 "FastSim009",
485 JustWarning, ed);
486 itsOK = false;
487 }
488
489 if (!itsOK)
490 {
491 G4cout << "ERROR - G4FastStep::CheckIt() " << G4endl;
492 G4cout << " Pointer : " << this << G4endl ;
493 DumpInfo();
494 }
495
496 // Exit with error
497 if (exitWithError)
498 {
500 ed << "An inaccuracy in G4FastStep is beyond tolerance." << G4endl;
501 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
502 "FastSim010",
503 FatalException, ed);
504 }
505
506 //correction for Momentum only.
507 if (!itsOKforMomentum) {
508 G4double vmag = theMomentumChange.mag();
509 theMomentumChange = (1./vmag)*theMomentumChange;
510 }
511
512 itsOK = (itsOK) && G4VParticleChange::CheckIt(aTrack);
513 return itsOK;
514}
@ JustWarning
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
@ AvoidHitInvocation
#define G4BestUnit(a, b)
@ fStopAndKill
double G4double
Definition: G4Types.hh:83
long G4long
Definition: G4Types.hh:87
bool G4bool
Definition: G4Types.hh:86
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
double z() const
Hep3Vector unit() const
double x() const
double mag2() const
double y() const
double mag() const
void SetPolarization(const G4ThreeVector &)
void SetMomentumDirection(const G4ThreeVector &aDirection)
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4double GetProperTime() const
const G4ThreeVector & GetPolarization() const
void SetPrimaryTrackFinalKineticEnergyAndDirection(G4double, const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:166
G4Step * UpdateStepForPostStep(G4Step *Step)
Definition: G4FastStep.cc:318
virtual ~G4FastStep()
Definition: G4FastStep.cc:306
void KillPrimaryTrack()
Definition: G4FastStep.cc:87
void SetPrimaryTrackFinalPosition(const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:113
void SetPrimaryTrackFinalPolarization(const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:192
void DumpInfo() const
Definition: G4FastStep.cc:391
void ProposePrimaryTrackFinalKineticEnergyAndDirection(G4double, const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:150
void SetPrimaryTrackFinalMomentum(const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:139
G4bool CheckIt(const G4Track &)
Definition: G4FastStep.cc:414
void ProposePrimaryTrackFinalPosition(const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:98
void SetPrimaryTrackFinalKineticEnergy(G4double)
void ProposePrimaryTrackFinalPolarization(const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:178
void ProposePrimaryTrackFinalMomentumDirection(const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:124
G4Step * UpdateStepForAtRest(G4Step *Step)
Definition: G4FastStep.cc:355
G4Track * CreateSecondaryTrack(const G4DynamicParticle &, G4ThreeVector, G4ThreeVector, G4double, G4bool localCoordinates=true)
Definition: G4FastStep.cc:202
void Initialize(const G4FastTrack &)
Definition: G4FastStep.cc:53
const G4Track * GetPrimaryTrack() const
Definition: G4FastTrack.hh:206
const G4AffineTransform * GetInverseAffineTransformation() const
Definition: G4FastTrack.hh:236
void SetKineticEnergy(const G4double aValue)
void SetWeight(G4double aValue)
void SetProperTime(const G4double aValue)
void SetGlobalTime(const G4double aValue)
void SetPosition(const G4ThreeVector &aValue)
void AddLocalTime(const G4double aValue)
void SetMomentumDirection(const G4ThreeVector &aValue)
void SetPolarization(const G4ThreeVector &aValue)
Definition: G4Step.hh:62
G4Track * GetTrack() const
G4StepPoint * GetPostStepPoint() const
G4double GetWeight() const
const G4ThreeVector & GetPosition() const
G4double GetGlobalTime() const
G4double GetProperTime() const
const G4DynamicParticle * GetDynamicParticle() const
G4double GetKineticEnergy() const
virtual G4bool CheckIt(const G4Track &)
void ProposeTrackStatus(G4TrackStatus status)
G4SteppingControl theSteppingControlFlag
virtual void Initialize(const G4Track &)
G4double GetAccuracyForException() const
void AddSecondary(G4Track *aSecondary)
G4double GetAccuracyForWarning() const
virtual void DumpInfo() const
G4Step * UpdateStepInfo(G4Step *Step)
#define ns(x)
Definition: xmltok.c:1649