Geant4 9.6.0
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// $Id$
28//
29//---------------------------------------------------------------
30//
31// G4FastStep.cc
32//
33// Description:
34// Encapsulates a G4ParticleChange and insure friendly interface
35// methods to manage the primary/secondaries final state for
36// Fast Simulation Models.
37//
38// History:
39// Oct 97: Verderi && MoraDeFreitas - First Implementation.
40// Apr 98: MoraDeFreitas - G4FastStep becomes the G4ParticleChange
41// for the Fast Simulation Process.
42//
43//---------------------------------------------------------------
44
45#include "G4FastStep.hh"
46
47#include "G4SystemOfUnits.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// copy and assignment operators are implemented as "shallow copy"
317{
318 *this = right;
319}
320
321
323{
324 if (this != &right)
325 {
331 theMomentumChange = right.theMomentumChange;
332 thePolarizationChange = right.thePolarizationChange;
333 thePositionChange = right.thePositionChange;
334 theTimeChange = right.theTimeChange;
335 theEnergyChange = right.theEnergyChange;
339 theWeightChange = right.theWeightChange;
340 }
341 return *this;
342}
343
344
345
346
347
349{
350 return ((G4VParticleChange *)this == (G4VParticleChange *) &right);
351}
352
354{
355 return ((G4VParticleChange *)this != (G4VParticleChange *) &right);
356}
357
358//----------------------------------------------------------------
359// methods for updating G4Step
360//
361
363{
364 // A physics process always calculates the final state of the particle
365
366 // Take note that the return type of GetMomentumChange is a
367 // pointer to G4ParticleMometum. Also it is a normalized
368 // momentum vector.
369
370 // G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint();
371 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
372 G4Track* aTrack = pStep->GetTrack();
373 // G4double mass = aTrack->GetDynamicParticle()->GetMass();
374
375 // update kinetic energy and momentum direction
376 pPostStepPoint->SetMomentumDirection(theMomentumChange);
377 pPostStepPoint->SetKineticEnergy( theEnergyChange );
378
379 // update polarization
380 pPostStepPoint->SetPolarization( thePolarizationChange );
381
382 // update position and time
383 pPostStepPoint->SetPosition( thePositionChange );
384 pPostStepPoint->SetGlobalTime( theTimeChange );
385 pPostStepPoint->AddLocalTime( theTimeChange
386 - aTrack->GetGlobalTime());
387 pPostStepPoint->SetProperTime( theProperTimeChange );
388
389 // update weight
390 pPostStepPoint->SetWeight( theWeightChange );
391
392 if (debugFlag) CheckIt(*aTrack);
393
394
395 // Update the G4Step specific attributes
396 return UpdateStepInfo(pStep);
397}
398
400{
401 // A physics process always calculates the final state of the particle
402
403 // G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint();
404 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
405 G4Track* aTrack = pStep->GetTrack();
406 // G4double mass = aTrack->GetDynamicParticle()->GetMass();
407
408 // update kinetic energy and momentum direction
409 pPostStepPoint->SetMomentumDirection(theMomentumChange);
410 pPostStepPoint->SetKineticEnergy( theEnergyChange );
411
412 // update polarization
413 pPostStepPoint->SetPolarization( thePolarizationChange );
414
415 // update position and time
416 pPostStepPoint->SetPosition( thePositionChange );
417 pPostStepPoint->SetGlobalTime( theTimeChange );
418 pPostStepPoint->AddLocalTime( theTimeChange
419 - aTrack->GetGlobalTime());
420 pPostStepPoint->SetProperTime( theProperTimeChange );
421
422 // update weight
423 pPostStepPoint->SetWeight( theWeightChange );
424
425 if (debugFlag) CheckIt(*aTrack);
426
427 // Update the G4Step specific attributes
428 return UpdateStepInfo(pStep);
429}
430
431//----------------------------------------------------------------
432// methods for printing messages
433//
434
436{
437// use base-class DumpInfo
439
440 G4cout.precision(3);
441 G4cout << " Position - x (mm) : "
442 << std::setw(20) << thePositionChange.x()/mm
443 << G4endl;
444 G4cout << " Position - y (mm) : "
445 << std::setw(20) << thePositionChange.y()/mm
446 << G4endl;
447 G4cout << " Position - z (mm) : "
448 << std::setw(20) << thePositionChange.z()/mm
449 << G4endl;
450 G4cout << " Time (ns) : "
451 << std::setw(20) << theTimeChange/ns
452 << G4endl;
453 G4cout << " Proper Time (ns) : "
454 << std::setw(20) << theProperTimeChange/ns
455 << G4endl;
456 G4cout << " Momentum Direct - x : "
457 << std::setw(20) << theMomentumChange.x()
458 << G4endl;
459 G4cout << " Momentum Direct - y : "
460 << std::setw(20) << theMomentumChange.y()
461 << G4endl;
462 G4cout << " Momentum Direct - z : "
463 << std::setw(20) << theMomentumChange.z()
464 << G4endl;
465 G4cout << " Kinetic Energy (MeV): "
466 << std::setw(20) << theEnergyChange/MeV
467 << G4endl;
468 G4cout << " Polarization - x : "
469 << std::setw(20) << thePolarizationChange.x()
470 << G4endl;
471 G4cout << " Polarization - y : "
472 << std::setw(20) << thePolarizationChange.y()
473 << G4endl;
474 G4cout << " Polarization - z : "
475 << std::setw(20) << thePolarizationChange.z()
476 << G4endl;
477}
478
480{
481 //
482 // In the G4FastStep::CheckIt
483 // We only check a bit
484 //
485 // If the user violates the energy,
486 // We don't care, we agree.
487 //
488 // But for theMomentumDirectionChange,
489 // We do pay attention.
490 // And if too large is its range,
491 // We issue an Exception.
492 //
493 //
494 // It means, the G4FastStep::CheckIt issues an exception only for the
495 // theMomentumDirectionChange which should be an unit vector
496 // and it corrects it because it could cause problems for the ulterior
497 // tracking.For the rest, only warning are issued.
498
499 G4bool itsOK = true;
500 G4bool exitWithError = false;
501 G4double accuracy;
502
503 // Energy should not be larger than the initial value
504 accuracy = ( theEnergyChange - aTrack.GetKineticEnergy())/MeV;
505 if (accuracy > GetAccuracyForWarning())
506 {
508 ed << "The energy becomes larger than the initial value, difference = " << accuracy << " MeV" << G4endl;
509 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
510 "FastSim006",
511 JustWarning, ed);
512 itsOK = false;
513 if (accuracy > GetAccuracyForException()) {exitWithError = true;}
514 }
515
516 G4bool itsOKforMomentum = true;
517 if ( theEnergyChange >0.)
518 {
519 accuracy = std::abs(theMomentumChange.mag2()-1.0);
520 if (accuracy > GetAccuracyForWarning())
521 {
523 ed << "The Momentum Change is not a unit vector, difference = " << accuracy << G4endl;
524 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
525 "FastSim007",
526 JustWarning, ed);
527 itsOK = itsOKforMomentum = false;
528 if (accuracy > GetAccuracyForException()) {exitWithError = true;}
529 }
530 }
531
532 accuracy = (aTrack.GetGlobalTime()- theTimeChange)/ns;
533 if (accuracy > GetAccuracyForWarning())
534 {
536 ed << "The global time is getting backward, difference = " << accuracy << " ns" << G4endl;
537 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
538 "FastSim008",
539 JustWarning, ed);
540 itsOK = false;
541 }
542
543 accuracy = (aTrack.GetProperTime() - theProperTimeChange )/ns;
544 if (accuracy > GetAccuracyForWarning())
545 {
547 ed << "The proper time is getting backward, difference = " << accuracy << " ns" << G4endl;
548 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
549 "FastSim009",
550 JustWarning, ed);
551 itsOK = false;
552 }
553
554 if (!itsOK)
555 {
556 G4cout << "ERROR - G4FastStep::CheckIt() " << G4endl;
557 G4cout << " Pointer : " << this << G4endl ;
558 DumpInfo();
559 }
560
561 // Exit with error
562 if (exitWithError)
563 {
565 ed << "An inaccuracy in G4FastStep is beyond tolerance." << G4endl;
566 G4Exception("G4FastStep::CheckIt(const G4Track& aTrack)",
567 "FastSim010",
568 FatalException, ed);
569 }
570
571 //correction for Momentum only.
572 if (!itsOKforMomentum) {
573 G4double vmag = theMomentumChange.mag();
574 theMomentumChange = (1./vmag)*theMomentumChange;
575 }
576
577 itsOK = (itsOK) && G4VParticleChange::CheckIt(aTrack);
578 return itsOK;
579}
@ JustWarning
@ FatalException
@ AvoidHitInvocation
@ fStopAndKill
double G4double
Definition: G4Types.hh:64
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
double z() const
Hep3Vector unit() const
double x() const
double mag2() const
double y() const
double mag() const
void SetMomentumDirection(const G4ThreeVector &aDirection)
const G4ThreeVector & GetMomentumDirection() const
void SetPolarization(G4double polX, G4double polY, G4double polZ)
G4double GetKineticEnergy() const
G4double GetProperTime() const
const G4ThreeVector & GetPolarization() const
G4FastStep & operator=(const G4FastStep &right)
Definition: G4FastStep.cc:322
void SetPrimaryTrackFinalKineticEnergyAndDirection(G4double, const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:166
G4Step * UpdateStepForPostStep(G4Step *Step)
Definition: G4FastStep.cc:362
virtual ~G4FastStep()
Definition: G4FastStep.cc:306
void KillPrimaryTrack()
Definition: G4FastStep.cc:87
void SetPrimaryTrackFinalPosition(const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:113
G4bool operator==(const G4FastStep &right) const
Definition: G4FastStep.cc:348
G4bool operator!=(const G4FastStep &right) const
Definition: G4FastStep.cc:353
void SetPrimaryTrackFinalPolarization(const G4ThreeVector &, G4bool localCoordinates=true)
Definition: G4FastStep.cc:192
void DumpInfo() const
Definition: G4FastStep.cc:435
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:479
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:399
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:208
const G4AffineTransform * GetInverseAffineTransformation() const
Definition: G4FastTrack.hh:238
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:78
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)
G4TrackStatus theStatusChange
G4TrackFastVector * theListOfSecondaries
G4SteppingControl theSteppingControlFlag
virtual void Initialize(const G4Track &)
G4double GetAccuracyForException() const
void AddSecondary(G4Track *aSecondary)
G4double GetAccuracyForWarning() const
virtual void DumpInfo() const
G4VParticleChange & operator=(const G4VParticleChange &right)
G4Step * UpdateStepInfo(G4Step *Step)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76
#define position
Definition: xmlparse.cc:605
#define ns
Definition: xmlparse.cc:597