Geant4  10.02.p03
G4ParticleHPProduct Class Reference

#include <G4ParticleHPProduct.hh>

Collaboration diagram for G4ParticleHPProduct:

Classes

struct  toBeCached
 

Public Member Functions

 G4ParticleHPProduct ()
 
 ~G4ParticleHPProduct ()
 
void Init (std::istream &aDataFile, G4ParticleDefinition *projectile)
 
G4int GetMultiplicity (G4double anEnergy)
 
G4ReactionProductVectorSample (G4double anEnergy, G4int nParticles)
 
G4double GetMeanYield (G4double anEnergy)
 
void SetProjectileRP (G4ReactionProduct *aIncidentPart)
 
void SetTarget (G4ReactionProduct *aTarget)
 
G4ReactionProductGetTarget ()
 
G4ReactionProductGetProjectileRP ()
 
G4double MeanEnergyOfThisInteraction ()
 
G4double GetQValue ()
 
G4double GetMassCode ()
 
G4double GetMass ()
 

Private Attributes

G4double theMassCode
 
G4double theMass
 
G4int theIsomerFlag
 
G4double theGroundStateQValue
 
G4double theActualStateQValue
 
G4int theDistLaw
 
G4ParticleHPVector theYield
 
G4VParticleHPEnergyAngulartheDist
 
G4Cache< toBeCachedfCache
 
G4HPMultiMethod theMultiplicityMethod
 

Detailed Description

Definition at line 52 of file G4ParticleHPProduct.hh.

Constructor & Destructor Documentation

◆ G4ParticleHPProduct()

G4ParticleHPProduct::G4ParticleHPProduct ( )
inline

Definition at line 63 of file G4ParticleHPProduct.hh.

64  {
65  theDist = 0;
66  toBeCached val;
67  fCache.Put( val );
68 
69  char * method = getenv( "G4PHP_MULTIPLICITY_METHOD" );
70  if( method ) {
71  if( G4String(method) == "Poisson" ) {
73  } else if( G4String(method) == "BetweenInts" ) {
75  } else {
76  throw G4HadronicException(__FILE__, __LINE__, ("multiplicity method unknown to G4ParticleHPProduct" + G4String(method)).c_str());
77  }
78  } else {
80  }
81  }
G4VParticleHPEnergyAngular * theDist
G4HPMultiMethod theMultiplicityMethod
G4Cache< toBeCached > fCache

◆ ~G4ParticleHPProduct()

G4ParticleHPProduct::~G4ParticleHPProduct ( )
inline

Definition at line 82 of file G4ParticleHPProduct.hh.

83  {
84  if(theDist != 0) delete theDist;
85  }
G4VParticleHPEnergyAngular * theDist

Member Function Documentation

◆ GetMass()

G4double G4ParticleHPProduct::GetMass ( )
inline

Definition at line 195 of file G4ParticleHPProduct.hh.

195 {return theMass;};

◆ GetMassCode()

G4double G4ParticleHPProduct::GetMassCode ( )
inline

Definition at line 194 of file G4ParticleHPProduct.hh.

194 {return theMassCode;};

◆ GetMeanYield()

G4double G4ParticleHPProduct::GetMeanYield ( G4double  anEnergy)
inline

Definition at line 156 of file G4ParticleHPProduct.hh.

157  {
158  return theYield.GetY(anEnergy);
159  }
G4ParticleHPVector theYield
G4double GetY(G4double x)
Here is the call graph for this function:

◆ GetMultiplicity()

G4int G4ParticleHPProduct::GetMultiplicity ( G4double  anEnergy)

Definition at line 44 of file G4ParticleHPProduct.cc.

45 {
46  //if(theDist == 0) { return 0; }
47  //151120 TK Modified for solving reproducibility problem
48  if ( theDist == 0 ) {
49  fCache.Get().theCurrentMultiplicity = 0;
50  return 0;
51  }
52 
53  G4double mean = theYield.GetY(anEnergy);
54  //g G4cout << "G4ParticleHPProduct MEAN NUMBER OF PARTICLES " << mean << " for " << theMass << G4endl;
55  //if( mean <= 0. ) return 0;
56  //151120 TK Modified for solving reproducibility problem
57  //This is also a real fix
58  if ( mean <= 0. ) {
59  fCache.Get().theCurrentMultiplicity = 0;
60  return 0;
61  }
62 
63  G4int multi;
64  multi = G4int(mean+0.0001);
65  //if(theMassCode==0) multi = G4Poisson(mean); // @@@@gammas. please X-check this
66  //080718
67 #ifdef PHP_AS_HP
68  if ( theMassCode == 0 ) // DELETE THIS: IT MUST BE DONE FOR ALL PARTICLES
69 #endif
70  {
71  if ( G4int ( mean ) == mean )
72  {
73  multi = (G4int) mean;
74  }
75  else
76  {
77 #ifdef PHP_AS_HP
78  multi = G4Poisson ( mean );
79 #else
81  multi = G4Poisson ( mean );
82  if( getenv("G4PHPTEST") ) G4cout << " MULTIPLICITY MULTIPLIED " << multi << " " << theMassCode << G4endl;
83  } else { // if( theMultiplicityMethod == G4HPMultiBetweenInts ) {
85  G4int imulti = G4int(mean);
86  multi = imulti + G4int(radnf < mean-imulti);
87  // G4cout << theMass << " multi " << multi << " mean " << mean
88  // << " radnf " << radnf << " mean-imulti " << mean-imulti << G4endl;
89  }
90 #endif
91  // multi = int(mean);
92  // if( CLHEP::RandFlat::shoot() > mean-multi ) multi++;
93  }
94 #ifdef G4PHPDEBUG
95  if( getenv("G4ParticleHPDebug") ) G4cout << "G4ParticleHPProduct::GetMultiplicity " << theMassCode << " " << theMass << " multi " << multi << " mean " << mean << G4endl;
96 #endif
97  }
98 
99  fCache.Get().theCurrentMultiplicity = static_cast<G4int>(mean);
100 
101  return multi;
102 }
G4long G4Poisson(G4double mean)
Definition: G4Poisson.hh:51
G4VParticleHPEnergyAngular * theDist
G4HPMultiMethod theMultiplicityMethod
int G4int
Definition: G4Types.hh:78
static double shoot()
Definition: RandFlat.cc:59
G4GLOB_DLL std::ostream G4cout
G4ParticleHPVector theYield
G4double GetY(G4double x)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
G4Cache< toBeCached > fCache
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetProjectileRP()

G4ReactionProduct* G4ParticleHPProduct::GetProjectileRP ( )
inline

Definition at line 173 of file G4ParticleHPProduct.hh.

173 { return fCache.Get().theProjectileRP; }
G4Cache< toBeCached > fCache

◆ GetQValue()

G4double G4ParticleHPProduct::GetQValue ( )
inline

Definition at line 190 of file G4ParticleHPProduct.hh.

190 { return theActualStateQValue; }
Here is the caller graph for this function:

◆ GetTarget()

G4ReactionProduct* G4ParticleHPProduct::GetTarget ( void  )
inline

Definition at line 171 of file G4ParticleHPProduct.hh.

171 { return fCache.Get().theTarget; }
G4Cache< toBeCached > fCache

◆ Init()

void G4ParticleHPProduct::Init ( std::istream &  aDataFile,
G4ParticleDefinition projectile 
)
inline

Definition at line 87 of file G4ParticleHPProduct.hh.

88  {
91  if( getenv("G4PHPTEST") ) G4cout << " G4ParticleHPProduct :: Init MassCode " << theMassCode << " " << theMass << " theActualStateQValue " << theActualStateQValue << G4endl;// GDEB
92  if( getenv("G4PHPTEST") ) G4cout << " G4ParticleHPProduct :: Init theActualStateQValue " << theActualStateQValue << G4endl;// GDEB
94  theActualStateQValue*= CLHEP::eV;
95  theYield.Init(aDataFile, CLHEP::eV);
96  theYield.Hash();
97  if(theDistLaw==0)
98  {
99  // distribution not known, use E-independent, isotropic angular distribution
101  }
102  else if(theDistLaw == 1)
103  {
104  // Continuum energy-angular distribution
105  theDist = new G4ParticleHPContEnergyAngular(projectile);
106  }
107  else if(theDistLaw == 2)
108  {
109  // Discrete 2-body scattering
110  theDist = new G4ParticleHPDiscreteTwoBody;
111  }
112  else if(theDistLaw == 3)
113  {
114  // Isotropic emission
116  }
117  else if(theDistLaw == 4)
118  {
119  // Discrete 2-body recoil modification
120  // not used for now. @@@@
121  theDist = new G4ParticleHPDiscreteTwoBody;
122  // the above is only temporary;
123  // recoils need to be addressed
124  // properly
125  delete theDist;
126  theDist = 0;
127  }
128  // else if(theDistLaw == 5)
129  // {
130  // charged particles only, to be used in a later stage. @@@@
131  // }
132  else if(theDistLaw == 6)
133  {
134  // N-Body phase space
135  theDist = new G4ParticleHPNBodyPhaseSpace;
136  }
137  else if(theDistLaw == 7)
138  {
139  // Laboratory angular energy paraetrisation
141  }
142  else
143  {
144  throw G4HadronicException(__FILE__, __LINE__, "distribution law unknown to G4ParticleHPProduct");
145  }
146  if(theDist!=0)
147  {
148  theDist->SetQValue(theActualStateQValue);
149  theDist->Init(aDataFile);
150  }
151  }
virtual void Init(std::istream &aDataFile)=0
G4VParticleHPEnergyAngular * theDist
void Init(std::istream &aDataFile, G4int total, G4double ux=1., G4double uy=1.)
G4GLOB_DLL std::ostream G4cout
G4ParticleHPVector theYield
#define G4endl
Definition: G4ios.hh:61
static const double eV
Here is the call graph for this function:
Here is the caller graph for this function:

◆ MeanEnergyOfThisInteraction()

G4double G4ParticleHPProduct::MeanEnergyOfThisInteraction ( )
inline

Definition at line 175 of file G4ParticleHPProduct.hh.

176  {
177  G4double result;
178  if(theDist == 0)
179  {
180  result = 0;
181  }
182  else
183  {
185  result *= fCache.Get().theCurrentMultiplicity;
186  }
187  return result;
188  }
G4VParticleHPEnergyAngular * theDist
virtual G4double MeanEnergyOfThisInteraction()=0
double G4double
Definition: G4Types.hh:76
G4Cache< toBeCached > fCache
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Sample()

G4ReactionProductVector * G4ParticleHPProduct::Sample ( G4double  anEnergy,
G4int  nParticles 
)

Definition at line 105 of file G4ParticleHPProduct.cc.

106 {
107  if(theDist == 0) { return 0; }
109 
110  theDist->SetTarget(fCache.Get().theTarget);
111  theDist->SetProjectileRP(fCache.Get().theProjectileRP);
112  G4int i;
113 // G4double eMax = GetTarget()->GetMass()+GetNeutron()->GetMass()
114 // - theActualStateQValue;
117 
118  for(i=0;i<multi;i++)
119  {
120 #ifdef G4PHPDEBUG
121  if( getenv("G4PHPTEST") )
122  if( getenv("G4ParticleHPDebug") && tmp != 0 ) G4cout << multi << " " << i << " @@@ G4ParticleHPProduct::Sample " << anEnergy << " Mass " << theMassCode << " " << theMass << G4endl;
123 #endif
124  tmp = theDist->Sample(anEnergy, theMassCode, theMass);
125  if(tmp != 0) { result->push_back(tmp); }
126 #ifndef G4PHPDEBUG //GDEB
127  if( getenv("G4ParticleHPDebug") && tmp != 0 ) G4cout << multi << " " << i << " @@@ G4ParticleHPProduct::Sample " << tmp->GetDefinition()->GetParticleName() << " E= " << tmp->GetKineticEnergy() << G4endl;
128 #endif
129  }
130  if(multi == 0)
131  {
132  tmp = theDist->Sample(anEnergy, theMassCode, theMass);
133  delete tmp;
134  }
135  /*
136  //080901 TK Comment out, too many secondaries are produced in deuteron reactions
137  if(theTarget->GetMass()<2*GeV) // @@@ take care of residuals in all cases
138  {
139  tmp = theDist->Sample(anEnergy, theMassCode, theMass);
140  tmp->SetDefinition(G4Proton::Proton());
141  if(tmp != 0) { result->push_back(tmp); }
142  }
143  */
144 
145  return result;
146 }
Float_t tmp
G4VParticleHPEnergyAngular * theDist
int G4int
Definition: G4Types.hh:78
std::vector< G4ReactionProduct * > G4ReactionProductVector
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
void SetProjectileRP(G4ReactionProduct *aIncidentParticleRP)
void SetTarget(G4ReactionProduct *aTarget)
virtual G4ReactionProduct * Sample(G4double anEnergy, G4double massCode, G4double mass)=0
const G4ParticleDefinition * GetDefinition() const
#define G4endl
Definition: G4ios.hh:61
G4double GetKineticEnergy() const
G4Cache< toBeCached > fCache
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetProjectileRP()

void G4ParticleHPProduct::SetProjectileRP ( G4ReactionProduct aIncidentPart)
inline

Definition at line 161 of file G4ParticleHPProduct.hh.

162  {
163  fCache.Get().theProjectileRP = aIncidentPart;
164  }
G4Cache< toBeCached > fCache

◆ SetTarget()

void G4ParticleHPProduct::SetTarget ( G4ReactionProduct aTarget)
inline

Definition at line 166 of file G4ParticleHPProduct.hh.

167  {
168  fCache.Get().theTarget = aTarget;
169  }
G4Cache< toBeCached > fCache

Member Data Documentation

◆ fCache

G4Cache<toBeCached> G4ParticleHPProduct::fCache
private

Definition at line 218 of file G4ParticleHPProduct.hh.

◆ theActualStateQValue

G4double G4ParticleHPProduct::theActualStateQValue
private

Definition at line 205 of file G4ParticleHPProduct.hh.

◆ theDist

G4VParticleHPEnergyAngular* G4ParticleHPProduct::theDist
private

Definition at line 208 of file G4ParticleHPProduct.hh.

◆ theDistLaw

G4int G4ParticleHPProduct::theDistLaw
private

Definition at line 206 of file G4ParticleHPProduct.hh.

◆ theGroundStateQValue

G4double G4ParticleHPProduct::theGroundStateQValue
private

Definition at line 204 of file G4ParticleHPProduct.hh.

◆ theIsomerFlag

G4int G4ParticleHPProduct::theIsomerFlag
private

Definition at line 203 of file G4ParticleHPProduct.hh.

◆ theMass

G4double G4ParticleHPProduct::theMass
private

Definition at line 202 of file G4ParticleHPProduct.hh.

◆ theMassCode

G4double G4ParticleHPProduct::theMassCode
private

Definition at line 195 of file G4ParticleHPProduct.hh.

◆ theMultiplicityMethod

G4HPMultiMethod G4ParticleHPProduct::theMultiplicityMethod
private

Definition at line 220 of file G4ParticleHPProduct.hh.

◆ theYield

G4ParticleHPVector G4ParticleHPProduct::theYield
private

Definition at line 207 of file G4ParticleHPProduct.hh.


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