Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions
G4HadLeadBias Class Reference

#include <G4HadLeadBias.hh>

Inheritance diagram for G4HadLeadBias:
G4VLeadingParticleBiasing

Public Member Functions

virtual G4HadFinalStateBias (G4HadFinalState *result)
 
virtual ~G4HadLeadBias ()
 

Detailed Description

Definition at line 35 of file G4HadLeadBias.hh.

Constructor & Destructor Documentation

virtual G4HadLeadBias::~G4HadLeadBias ( )
inlinevirtual

Definition at line 39 of file G4HadLeadBias.hh.

39 {};

Member Function Documentation

G4HadFinalState * G4HadLeadBias::Bias ( G4HadFinalState result)
virtual

Implements G4VLeadingParticleBiasing.

Definition at line 34 of file G4HadLeadBias.cc.

References G4HadFinalState::AddSecondaries(), buffer, G4HadFinalState::ClearSecondaries(), G4UniformRand, G4Gamma::Gamma(), G4ParticleDefinition::GetBaryonNumber(), G4DynamicParticle::GetDefinition(), G4HadFinalState::GetEnergyChange(), G4DynamicParticle::GetKineticEnergy(), G4ParticleDefinition::GetLeptonNumber(), G4HadFinalState::GetNumberOfSecondaries(), G4HadSecondary::GetParticle(), G4HadFinalState::GetSecondary(), G4HadFinalState::GetStatusChange(), G4HadSecondary::GetWeight(), isAlive, and G4PionZero::PionZero().

35  {
36  // G4cerr << "bias enter"<<G4endl;
37  G4int nMeson(0), nBaryon(0), npi0(0), ngamma(0), nLepton(0);
38  G4int i(0);
39  G4int maxE = -1;
40  G4double emax = 0;
41  if(result->GetStatusChange()==isAlive)
42  {
43  emax = result->GetEnergyChange();
44  }
45  //G4cout << "max energy "<<G4endl;
46  for(i=0;i<result->GetNumberOfSecondaries();i++)
47  {
48  if(result->GetSecondary(i)->GetParticle()->GetKineticEnergy()>emax)
49  {
50  maxE = i;
51  emax = result->GetSecondary(i)->GetParticle()->GetKineticEnergy();
52  }
53  }
54  //G4cout <<"loop1"<<G4endl;
55  for(i=0; i<result->GetNumberOfSecondaries(); i++)
56  {
57  const G4DynamicParticle* aSecTrack = result->GetSecondary(i)->GetParticle();
58  if(i==maxE)
59  {
60  }
61  else if(aSecTrack->GetDefinition()->GetBaryonNumber()!=0)
62  {
63  nBaryon++;
64  }
65  else if(aSecTrack->GetDefinition()->GetLeptonNumber()!=0)
66  {
67  nLepton++;
68  }
69  else if(aSecTrack->GetDefinition()==G4Gamma::Gamma())
70  {
71  ngamma++;
72  }
73  else if(aSecTrack->GetDefinition()==G4PionZero::PionZero())
74  {
75  npi0++;
76  }
77  else
78  {
79  nMeson++;
80  }
81  }
82  //G4cout << "BiasDebug 1 = "<<result->GetNumberOfSecondaries()<<" "
83  // <<nMeson<<" "<< nBaryon<<" "<< npi0<<" "<< ngamma<<" "<< nLepton<<G4endl;
84  G4double mesonWeight = nMeson;
85  G4double baryonWeight = nBaryon;
86  G4double gammaWeight = ngamma;
87  G4double npi0Weight = npi0;
88  G4double leptonWeight = nLepton;
89  G4int randomMeson = static_cast<G4int>((nMeson+1)*G4UniformRand());
90  G4int randomBaryon = static_cast<G4int>((nBaryon+1)*G4UniformRand());
91  G4int randomGamma = static_cast<G4int>((ngamma+1)*G4UniformRand());
92  G4int randomPi0 = static_cast<G4int>((npi0+1)*G4UniformRand());
93  G4int randomLepton = static_cast<G4int>((nLepton+1)*G4UniformRand());
94 
95  std::vector<G4HadSecondary> buffer;
96  G4int cMeson(0), cBaryon(0), cpi0(0), cgamma(0), cLepton(0);
97  for(i=0; i<result->GetNumberOfSecondaries(); i++)
98  {
99  G4bool aCatch = false;
100  G4double weight = 1;
101  const G4HadSecondary* aSecTrack = result->GetSecondary(i);
102  G4ParticleDefinition* aSecDef = aSecTrack->GetParticle()->GetDefinition();
103  if(i==maxE)
104  {
105  aCatch = true;
106  weight = 1;
107  }
108  else if(aSecDef->GetBaryonNumber()!=0)
109  {
110  if(++cBaryon==randomBaryon)
111  {
112  aCatch = true;
113  weight = baryonWeight;
114  }
115  }
116  else if(aSecDef->GetLeptonNumber()!=0)
117  {
118  if(++cLepton==randomLepton)
119  {
120  aCatch = true;
121  weight = leptonWeight;
122  }
123  }
124  else if(aSecDef==G4Gamma::Gamma())
125  {
126  if(++cgamma==randomGamma)
127  {
128  aCatch = true;
129  weight = gammaWeight;
130  }
131  }
132  else if(aSecDef==G4PionZero::PionZero())
133  {
134  if(++cpi0==randomPi0)
135  {
136  aCatch = true;
137  weight = npi0Weight;
138  }
139  }
140  else
141  {
142  if(++cMeson==randomMeson)
143  {
144  aCatch = true;
145  weight = mesonWeight;
146  }
147  }
148  if(aCatch)
149  {
150  buffer.push_back(*aSecTrack);
151  buffer.back().SetWeight(aSecTrack->GetWeight()*weight);
152  }
153  else
154  {
155  delete aSecTrack;
156  }
157  }
158  result->ClearSecondaries();
159  // G4cerr << "pre"<<G4endl;
160  result->AddSecondaries(buffer);
161  // G4cerr << "bias exit"<<G4endl;
162 
163  return result;
164  }
void AddSecondaries(const std::vector< G4HadSecondary > &addSecs)
G4HadSecondary * GetSecondary(size_t i)
G4double GetKineticEnergy() const
#define buffer
Definition: xmlparse.cc:611
G4double GetEnergyChange() const
G4ParticleDefinition * GetDefinition() const
int G4int
Definition: G4Types.hh:78
#define G4UniformRand()
Definition: Randomize.hh:87
bool G4bool
Definition: G4Types.hh:79
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
static G4PionZero * PionZero()
Definition: G4PionZero.cc:104
G4DynamicParticle * GetParticle()
double G4double
Definition: G4Types.hh:76
G4int GetNumberOfSecondaries() const
G4HadFinalStateStatus GetStatusChange() const
G4double GetWeight() const

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