Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4AdjointSteppingAction.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// G4AdjointSteppingAction class implementation
27//
28// Author: L. Desorgher, SpaceIT GmbH
29// Contract: ESA contract 21435/08/NL/AT
30// Customer: ESA/ESTEC
31// --------------------------------------------------------------------
32
34#include "G4Track.hh"
36#include "G4AffineTransform.hh"
38
39//////////////////////////////////////////////////////////////////////////////
40//
42{
43 theG4AdjointCrossSurfChecker = G4AdjointCrossSurfChecker::GetInstance();
44}
45
46//////////////////////////////////////////////////////////////////////////////
47//
49{
50}
51
52//////////////////////////////////////////////////////////////////////////////
53//
55{
56 G4Track* aTrack = aStep->GetTrack();
57 if(!is_adjoint_tracking_mode) // forward tracking mode
58 {
59 if (!did_one_adj_part_reach_ext_source_during_event)
60 {
62 return;
63 }
64 if(theUserFwdSteppingAction)
65 {
66 theUserFwdSteppingAction->UserSteppingAction(aStep);
67 }
68 return;
69 }
70
71 // Apply first the user adjoint stepping action
72 // --------------------------------------------
73
74 did_adj_part_reach_ext_source = false;
75 if (theUserAdjointSteppingAction)
76 {
77 theUserAdjointSteppingAction->UserSteppingAction(aStep);
78 }
79
80 G4double nb_nuc = 1.;
81 G4ParticleDefinition* thePartDef = aTrack->GetDefinition();
82
83 if (thePartDef->GetParticleType() == "adjoint_nucleus")
84 {
85 nb_nuc = G4double(thePartDef->GetBaryonNumber());
86 }
87
88 // Kill conditions for adjoint particles reaching the maximum energy
89 // -----------------------------------------------------------------
90
91 if(aTrack->GetKineticEnergy() >= ext_sourceEMax*nb_nuc)
92 {
94 did_adj_part_reach_ext_source = false;
95 return;
96 }
97
98 // Kill conditions for surface crossing
99 // --------------------------------------
100
101 G4String surface_name;
102 G4double cos_to_surface;
103 G4bool GoingIn;
104 G4ThreeVector crossing_pos;
105 if (theG4AdjointCrossSurfChecker
106 ->CrossingOneOfTheRegisteredSurface(aStep, surface_name,
107 crossing_pos, cos_to_surface, GoingIn))
108 {
109 if (surface_name == "ExternalSource")
110 {
111 // Registering still needed
112 did_adj_part_reach_ext_source = true;
113 did_one_adj_part_reach_ext_source_during_event = true;
115
116 // now register the adjoint particles reaching the external surface
117 last_momentum = aTrack->GetMomentum();
118 last_ekin = aTrack->GetKineticEnergy();
119 last_weight = aTrack->GetWeight();
120 last_part_def = aTrack->GetDefinition();
121 last_pos = crossing_pos;
122 return;
123 }
124 else if (surface_name == "AdjointSource" && GoingIn)
125 {
126 did_adj_part_reach_ext_source = false;
128 return;
129 }
130 }
131
132 // Check for reaching out of world
133 //
135 {
136 did_adj_part_reach_ext_source = true;
137 did_one_adj_part_reach_ext_source_during_event = true;
138 last_momentum =aTrack->GetMomentum();
139 last_ekin=aTrack->GetKineticEnergy();
140 last_weight = aTrack->GetWeight();
141 last_part_def = aTrack->GetDefinition();
142 last_pos = crossing_pos;
143 return;
144 }
145}
@ fWorldBoundary
Definition: G4StepStatus.hh:41
@ fStopAndKill
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
static G4AdjointCrossSurfChecker * GetInstance()
void UserSteppingAction(const G4Step *)
const G4String & GetParticleType() const
G4StepStatus GetStepStatus() const
Definition: G4Step.hh:62
G4Track * GetTrack() const
G4StepPoint * GetPostStepPoint() const
void SetTrackStatus(const G4TrackStatus aTrackStatus)
G4double GetWeight() const
G4ThreeVector GetMomentum() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
virtual void UserSteppingAction(const G4Step *)