Geant4  10.02.p03
GB04BOptnBremSplitting Class Reference

#include <GB04BOptnBremSplitting.hh>

Inheritance diagram for GB04BOptnBremSplitting:
Collaboration diagram for GB04BOptnBremSplitting:

Public Member Functions

 GB04BOptnBremSplitting (G4String name)
 
virtual ~GB04BOptnBremSplitting ()
 
virtual const G4VBiasingInteractionLawProvideOccurenceBiasingInteractionLaw (const G4BiasingProcessInterface *, G4ForceCondition &)
 
virtual G4VParticleChange * ApplyFinalStateBiasing (const G4BiasingProcessInterface *, const G4Track *, const G4Step *, G4bool &)
 
virtual G4double DistanceToApplyOperation (const G4Track *, G4double, G4ForceCondition *)
 
virtual G4VParticleChange * GenerateBiasingFinalState (const G4Track *, const G4Step *)
 
void SetSplittingFactor (G4int splittingFactor)
 
G4int GetSplittingFactor () const
 
- Public Member Functions inherited from G4VBiasingOperation
 G4VBiasingOperation (G4String name)
 
virtual ~G4VBiasingOperation ()
 
virtual G4double ProposeAlongStepLimit (const G4BiasingProcessInterface *)
 
virtual G4GPILSelection ProposeGPILSelection (const G4GPILSelection wrappedProcessSelection)
 
virtual void AlongMoveBy (const G4BiasingProcessInterface *, const G4Step *, G4double)
 
const G4StringGetName () const
 
std::size_t GetUniqueID () const
 

Private Attributes

G4int fSplittingFactor
 
G4ParticleChange fParticleChange
 

Detailed Description

Definition at line 50 of file GB04BOptnBremSplitting.hh.

Constructor & Destructor Documentation

◆ GB04BOptnBremSplitting()

GB04BOptnBremSplitting::GB04BOptnBremSplitting ( G4String  name)

Definition at line 38 of file GB04BOptnBremSplitting.cc.

39 : G4VBiasingOperation(name),
42 {
43 }
G4VBiasingOperation(G4String name)

◆ ~GB04BOptnBremSplitting()

GB04BOptnBremSplitting::~GB04BOptnBremSplitting ( )
virtual

Definition at line 47 of file GB04BOptnBremSplitting.cc.

48 {
49 }
Here is the call graph for this function:

Member Function Documentation

◆ ApplyFinalStateBiasing()

G4VParticleChange * GB04BOptnBremSplitting::ApplyFinalStateBiasing ( const G4BiasingProcessInterface callingProcess,
const G4Track *  track,
const G4Step *  step,
G4bool  
)
virtual

Implements G4VBiasingOperation.

Definition at line 53 of file GB04BOptnBremSplitting.cc.

57 {
58 
59  // -- Collect brem. process (wrapped process) final state:
60  G4VParticleChange* processFinalState =
61  callingProcess->GetWrappedProcess()->PostStepDoIt(*track, *step);
62 
63  // -- if no splitting requested, let the brem. process to return directly its
64  // -- generated final state:
65  if ( fSplittingFactor == 1 ) return processFinalState;
66 
67  // -- a special case here: the brem. process corrects for cross-section change
68  // -- over the step due to energy loss by sometimes "abandoning" the interaction,
69  // -- returning an unchanged incoming electron/positron.
70  // -- We respect this correction, and if no secondary is produced, its means this
71  // -- case is happening:
72  if ( processFinalState->GetNumberOfSecondaries() == 0 ) return processFinalState;
73 
74  // -- Now start the biasing:
75  // -- - the electron state will be taken as the first one produced by the brem.
76  // -- process, hence the one stored in above processFinalState particle change.
77  // -- This state will be stored in our fParticleChange object.
78  // -- - the photon accompagnying the electron will be stored also this way.
79  // -- - we will then do fSplittingFactor - 1 call to the brem. process to collect
80  // -- fSplittingFactor - 1 additionnal gammas. All these will be stored in our
81  // -- fParticleChange object.
82 
83  // -- We called the brem. process above. Its concrete particle change is indeed
84  // -- a "G4ParticleChangeForLoss" object. We cast this particle change to access
85  // -- methods of the concrete G4ParticleChangeForLoss type:
86  G4ParticleChangeForLoss* actualParticleChange =
87  ( G4ParticleChangeForLoss* ) processFinalState ;
88 
89  fParticleChange.Initialize(*track);
90 
91  // -- Store electron final state:
93  ProposeTrackStatus ( actualParticleChange->GetTrackStatus() );
95  ProposeEnergy ( actualParticleChange->GetProposedKineticEnergy() );
97  ProposeMomentumDirection( actualParticleChange->GetProposedMomentumDirection() );
98 
99  // -- Now deal with the gamma's:
100  // -- their common weight:
101  G4double gammaWeight = track->GetWeight() / fSplittingFactor;
102 
103  // -- inform we will have fSplittingFactor gamma's:
104  fParticleChange.SetNumberOfSecondaries( fSplittingFactor );
105 
106  // -- inform we take care of secondaries weight (otherwise these
107  // -- secondaries are by default given the primary weight).
108  fParticleChange.SetSecondaryWeightByProcess(true);
109 
110  // -- Store first gamma:
111  G4Track* gammaTrack = actualParticleChange->GetSecondary(0);
112  gammaTrack->SetWeight( gammaWeight );
113  fParticleChange.AddSecondary( gammaTrack );
114  // -- and clean-up the brem. process particle change:
115  actualParticleChange->Clear();
116 
117  // -- now start the fSplittingFactor-1 calls to the brem. process to store each
118  // -- related gamma:
119  G4int nCalls = 1;
120  while ( nCalls < fSplittingFactor )
121  {
122  // ( note: we don't need to cast to actual type here, as methods for accessing
123  // secondary particles are from base class G4VParticleChange )
124  processFinalState = callingProcess->GetWrappedProcess()->PostStepDoIt(*track, *step);
125  if ( processFinalState->GetNumberOfSecondaries() == 1 )
126  {
127  gammaTrack = processFinalState->GetSecondary(0);
128  gammaTrack->SetWeight( gammaWeight );
129  fParticleChange.AddSecondary( gammaTrack );
130  nCalls++;
131  }
132  // -- very rare special case: we ignore for now.
133  else if ( processFinalState->GetNumberOfSecondaries() > 1 )
134  {
135  for ( G4int i = 0 ; i < processFinalState->GetNumberOfSecondaries() ; i++)
136  delete processFinalState->GetSecondary(i);
137  }
138  processFinalState->Clear();
139  }
140 
141  // -- we are done:
142  return &fParticleChange;
143 }
int G4int
Definition: G4Types.hh:78
G4VProcess * GetWrappedProcess() const
double G4double
Definition: G4Types.hh:76
virtual G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &stepData)=0
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DistanceToApplyOperation()

virtual G4double GB04BOptnBremSplitting::DistanceToApplyOperation ( const G4Track *  ,
G4double  ,
G4ForceCondition *   
)
inlinevirtual

Implements G4VBiasingOperation.

Definition at line 74 of file GB04BOptnBremSplitting.hh.

77  {return DBL_MAX;}
#define DBL_MAX
Definition: templates.hh:83

◆ GenerateBiasingFinalState()

virtual G4VParticleChange* GB04BOptnBremSplitting::GenerateBiasingFinalState ( const G4Track *  ,
const G4Step *   
)
inlinevirtual

Implements G4VBiasingOperation.

Definition at line 78 of file GB04BOptnBremSplitting.hh.

80  {return 0;}

◆ GetSplittingFactor()

G4int GB04BOptnBremSplitting::GetSplittingFactor ( ) const
inline

Definition at line 90 of file GB04BOptnBremSplitting.hh.

◆ ProvideOccurenceBiasingInteractionLaw()

virtual const G4VBiasingInteractionLaw* GB04BOptnBremSplitting::ProvideOccurenceBiasingInteractionLaw ( const G4BiasingProcessInterface ,
G4ForceCondition &   
)
inlinevirtual

Implements G4VBiasingOperation.

Definition at line 63 of file GB04BOptnBremSplitting.hh.

65  { return 0; }
Here is the call graph for this function:

◆ SetSplittingFactor()

void GB04BOptnBremSplitting::SetSplittingFactor ( G4int  splittingFactor)
inline

Definition at line 88 of file GB04BOptnBremSplitting.hh.

89  { fSplittingFactor = splittingFactor; }
Here is the caller graph for this function:

Member Data Documentation

◆ fParticleChange

G4ParticleChange GB04BOptnBremSplitting::fParticleChange
private

Definition at line 94 of file GB04BOptnBremSplitting.hh.

◆ fSplittingFactor

G4int GB04BOptnBremSplitting::fSplittingFactor
private

Definition at line 93 of file GB04BOptnBremSplitting.hh.


The documentation for this class was generated from the following files: