Geant4  10.03.p03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4TripathiLightCrossSection Class Reference

#include <G4TripathiLightCrossSection.hh>

Inheritance diagram for G4TripathiLightCrossSection:
Collaboration diagram for G4TripathiLightCrossSection:

Public Member Functions

 G4TripathiLightCrossSection ()
 
 ~G4TripathiLightCrossSection ()
 
virtual G4bool IsElementApplicable (const G4DynamicParticle *theProjectile, G4int Z, const G4Material *)
 
virtual G4double GetElementCrossSection (const G4DynamicParticle *theProjectile, G4int Z, const G4Material *mat=0)
 
void SetLowEnergyCheck (G4bool)
 
- Public Member Functions inherited from G4VCrossSectionDataSet
 G4VCrossSectionDataSet (const G4String &nam="")
 
virtual ~G4VCrossSectionDataSet ()
 
virtual G4bool IsIsoApplicable (const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm=0, const G4Material *mat=0)
 
G4double GetCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
G4double ComputeCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
virtual G4double GetIsoCrossSection (const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=0, const G4Element *elm=0, const G4Material *mat=0)
 
virtual G4IsotopeSelectIsotope (const G4Element *, G4double kinEnergy)
 
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
 
virtual void DumpPhysicsTable (const G4ParticleDefinition &)
 
virtual void CrossSectionDescription (std::ostream &) const
 
virtual G4int GetVerboseLevel () const
 
virtual void SetVerboseLevel (G4int value)
 
G4double GetMinKinEnergy () const
 
void SetMinKinEnergy (G4double value)
 
G4double GetMaxKinEnergy () const
 
void SetMaxKinEnergy (G4double value)
 
const G4StringGetName () const
 

Additional Inherited Members

- Protected Member Functions inherited from G4VCrossSectionDataSet
void SetName (const G4String &)
 
- Protected Attributes inherited from G4VCrossSectionDataSet
G4int verboseLevel
 

Detailed Description

Definition at line 83 of file G4TripathiLightCrossSection.hh.

Constructor & Destructor Documentation

G4TripathiLightCrossSection::G4TripathiLightCrossSection ( )

Definition at line 77 of file G4TripathiLightCrossSection.cc.

78  : G4VCrossSectionDataSet("TripathiLightIons")
79 {
80  // Constructor only needs to instantiate the object which provides functions
81  // to calculate the nuclear radius, and some other constants used to
82  // calculate cross-sections.
83 
84  theWilsonRadius = new G4WilsonRadius();
85  r_0 = 1.1 * fermi;
86 
87  // The following variable is set to true if
88  // G4TripathiLightCrossSection::GetCrossSection is going to be called from
89  // within G4TripathiLightCrossSection::GetCrossSection to check whether the
90  // cross-section is behaviing anomalously in the low-energy region.
91 
92  lowEnergyCheck = false;
93 }
G4VCrossSectionDataSet(const G4String &nam="")
static constexpr double fermi
Definition: G4SIunits.hh:103
G4TripathiLightCrossSection::~G4TripathiLightCrossSection ( )

Definition at line 96 of file G4TripathiLightCrossSection.cc.

97 {
98  //
99  // Destructor just needs to delete the pointer to the G4WilsonRadius object.
100  //
101  delete theWilsonRadius;
102 }

Member Function Documentation

G4double G4TripathiLightCrossSection::GetElementCrossSection ( const G4DynamicParticle theProjectile,
G4int  Z,
const G4Material mat = 0 
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 125 of file G4TripathiLightCrossSection.cc.

127 {
128  // Initialise the result.
129  G4double result = 0.0;
130 
131  // Get details of the projectile and target (nucleon number, atomic number,
132  // kinetic enery and energy/nucleon.
133 
135  G4int AT = G4lrint(xAT);
136  G4double EA = theProjectile->GetKineticEnergy()/MeV;
137  G4int AP = theProjectile->GetDefinition()->GetBaryonNumber();
138  G4double xAP= G4double(AP);
139  G4double ZP = G4lrint(theProjectile->GetDefinition()->GetPDGCharge()/eplus);
140  G4double E = EA / xAP;
141 
142  G4Pow* g4pow = G4Pow::GetInstance();
143 
144  G4double AT13 = g4pow->Z13(AT);
145  G4double AP13 = g4pow->Z13(AP);
146 
147  // Determine target mass and energy within the centre-of-mass frame.
148 
150  G4LorentzVector pT(0.0, 0.0, 0.0, mT);
151  G4LorentzVector pP(theProjectile->Get4Momentum());
152  pT += pP;
153  G4double E_cm = (pT.mag()-mT-pP.m())/MeV;
154 
155  //G4cout << G4endl;
156  //G4cout << "### EA= " << EA << " ZT= " << ZT << " AT= " << AT
157  // << " ZP= " << ZP << " AP= " << AP << " E_cm= " << E_cm
158  // << " Elim= " << (0.8 + 0.04*ZT)*xAP << G4endl;
159 
160  if (E_cm <= 0.0) { return 0.; }
161  if (E_cm <= (0.8 + 0.04*ZT)*xAP && !lowEnergyCheck) { return 0.; }
162 
163  G4double E_cm13 = g4pow->A13(E_cm);
164 
165  // Determine nuclear radii. Note that the r_p and r_T are defined differently
166  // from Wilson et al.
167 
168  G4double r_rms_p = theWilsonRadius->GetWilsonRMSRadius(xAP);
169  G4double r_rms_t = theWilsonRadius->GetWilsonRMSRadius(xAT);
170 
171  G4double r_p = 1.29*r_rms_p;
172  G4double r_t = 1.29*r_rms_t;
173 
174  G4double Radius = (r_p + r_t)/fermi + 1.2*(AT13 + AP13)/E_cm13;
175 
176  G4double B = 1.44 * ZP * ZT / Radius;
177 
178  // Now determine other parameters associated with the parametric
179  // formula, depending upon the projectile and target.
180 
181  G4double T1 = 0.0;
182  G4double D = 0.0;
183  G4double G = 0.0;
184 
185  if ((AT==1 && ZT==1) || (AP==1 && ZP==1)) {
186  T1 = 23.0;
187  D = 1.85 + 0.16/(1+G4Exp((500.0-E)/200.0));
188 
189  } else if ((AT==1 && ZT==0) || (AP==1 && ZP==0)) {
190  T1 = 18.0;
191  D = 1.85 + 0.16/(1+G4Exp((500.0-E)/200.0));
192 
193  } else if ((AT==2 && ZT==1) || (AP==2 && ZP==1)) {
194  T1 = 23.0;
195  D = 1.65 + 0.1/(1+G4Exp((500.0-E)/200.0));
196 
197  } else if ((AT==3 && ZT==2) || (AP==3 && ZP==2)) {
198  T1 = 40.0;
199  D = 1.55;
200 
201  } else if (AP==4 && ZP==2) {
202  if (AT==4 && ZT==2) {T1 = 40.0; G = 300.0;}
203  else if (ZT==4) {T1 = 25.0; G = 300.0;}
204  else if (ZT==7) {T1 = 40.0; G = 500.0;}
205  else if (ZT==13) {T1 = 25.0; G = 300.0;}
206  else if (ZT==26) {T1 = 40.0; G = 300.0;}
207  else {T1 = 40.0; G = 75.0;}
208  D = 2.77 - 8.0E-3*AT + 1.8E-5*AT*AT-0.8/(1.0+G4Exp((250.0-E)/G));
209  }
210  else if (AT==4 && ZT==2) {
211  if (AP==4 && ZP==2) {T1 = 40.0; G = 300.0;}
212  else if (ZP==4) {T1 = 25.0; G = 300.0;}
213  else if (ZP==7) {T1 = 40.0; G = 500.0;}
214  else if (ZP==13) {T1 = 25.0; G = 300.0;}
215  else if (ZP==26) {T1 = 40.0; G = 300.0;}
216  else {T1 = 40.0; G = 75.0;}
217  D = 2.77 - 8.0E-3*AP + 1.8E-5*AP*AP-0.8/(1.0+G4Exp((250.0-E)/G));
218  }
219 
220  // C_E, S, deltaE, X1, S_L and X_m correspond directly with the original
221  // formulae of Tripathi et al in his report.
222  //G4cout << "E= " << E << " T1= " << T1 << " AP= " << AP << " ZP= " << ZP
223  // << " AT= " << AT << " ZT= " << ZT << G4endl;
224  G4double C_E = D*(1.0-G4Exp(-E/T1)) -
225  0.292*G4Exp(-E/792.0)*std::cos(0.229*G4Pow::GetInstance()->powA(E,0.453));
226 
227  G4double S = AP13*AT13/(AP13 + AT13);
228 
229  G4double deltaE = 0.0;
230  G4double X1 = 0.0;
231  if (AT >= AP)
232  {
233  deltaE = 1.85*S + 0.16*S/E_cm13 - C_E + 0.91*(AT-2*ZT)*ZP/(xAT*xAP);
234  X1 = 2.83 - 3.1E-2*AT + 1.7E-4*AT*AT;
235  }
236  else
237  {
238  deltaE = 1.85*S + 0.16*S/E_cm13 - C_E + 0.91*(AP-2*ZP)*ZT/(xAT*xAP);
239  X1 = 2.83 - 3.1E-2*AP + 1.7E-4*AP*AP;
240  }
241  G4double S_L = 1.2 + 1.6*(1.0-G4Exp(-E/15.0));
242  //JMQ 241110 bug fixed
243  G4double X_m = 1.0 - X1*G4Exp(-E/(X1*S_L));
244 
245  //G4cout << "deltaE= " << deltaE << " X1= " << X1 << " S_L= " << S_L << " X_m= " << X_m << G4endl;
246 
247  // R_c is also highly dependent upon the A and Z of the projectile and
248  // target.
249 
250  G4double R_c = 1.0;
251  if (AP==1 && ZP==1)
252  {
253  if (AT==2 && ZT==1) R_c = 13.5;
254  else if (AT==3 && ZT==2) R_c = 21.0;
255  else if (AT==4 && ZT==2) R_c = 27.0;
256  else if (ZT==3) R_c = 2.2;
257  }
258  else if (AT==1 && ZT==1)
259  {
260  if (AP==2 && ZP==1) R_c = 13.5;
261  else if (AP==3 && ZP==2) R_c = 21.0;
262  else if (AP==4 && ZP==2) R_c = 27.0;
263  else if (ZP==3) R_c = 2.2;
264  }
265  else if (AP==2 && ZP==1)
266  {
267  if (AT==2 && ZT==1) R_c = 13.5;
268  else if (AT==4 && ZT==2) R_c = 13.5;
269  else if (AT==12 && ZT==6) R_c = 6.0;
270  }
271  else if (AT==2 && ZT==1)
272  {
273  if (AP==2 && ZP==1) R_c = 13.5;
274  else if (AP==4 && ZP==2) R_c = 13.5;
275  else if (AP==12 && ZP==6) R_c = 6.0;
276  }
277  else if ((AP==4 && ZP==2 && (ZT==73 || ZT==79)) ||
278  (AT==4 && ZT==2 && (ZP==73 || ZP==79))) R_c = 0.6;
279 
280  // Find the total cross-section. Check that it's value is positive, and if
281  // the energy is less that 10 MeV/nuc, find out if the cross-section is
282  // increasing with decreasing energy. If so this is a sign that the function
283  // is behaving badly at low energies, and the cross-section should be
284  // set to zero.
285 
286  G4double xr = r_0*(AT13 + AP13 + deltaE);
287  result = pi * xr * xr * (1.0 - R_c*B/E_cm) * X_m;
288  //G4cout << " result= " << result << " E= " << E << " check= "<< lowEnergyCheck << G4endl;
289  if (result < 0.0) {
290  result = 0.0;
291 
292  } else if (!lowEnergyCheck && E < 6.0) {
293  G4double f = 0.95;
294  G4DynamicParticle slowerProjectile = *theProjectile;
295  slowerProjectile.SetKineticEnergy(f * EA * MeV);
296 
297  G4bool savelowenergy = lowEnergyCheck;
298  SetLowEnergyCheck(true);
299  G4double resultp = GetElementCrossSection(&slowerProjectile, ZT);
300  SetLowEnergyCheck(savelowenergy);
301  //G4cout << " newres= " << resultp << " f*EA= " << f*EA << G4endl;
302  if (resultp > result) { result = 0.0; }
303  }
304 
305  return result;
306 }
G4double G4ParticleHPJENDLHEData::G4double result
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4double GetWilsonRMSRadius(G4double A)
double S(double temp)
G4double GetKineticEnergy() const
Definition: G4Pow.hh:56
G4ParticleDefinition * GetDefinition() const
double B(double temperature)
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
virtual G4double GetElementCrossSection(const G4DynamicParticle *theProjectile, G4int Z, const G4Material *mat=0)
G4double Z13(G4int Z) const
Definition: G4Pow.hh:127
bool G4bool
Definition: G4Types.hh:79
static constexpr double eplus
Definition: G4SIunits.hh:199
void SetKineticEnergy(G4double aEnergy)
G4LorentzVector Get4Momentum() const
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
G4double A13(G4double A) const
Definition: G4Pow.hh:132
int G4lrint(double ad)
Definition: templates.hh:163
G4double GetAtomicMassAmu(const G4String &symb) const
double D(double temp)
static constexpr double MeV
Definition: G4SIunits.hh:214
static constexpr double pi
Definition: G4SIunits.hh:75
double G4double
Definition: G4Types.hh:76
static constexpr double fermi
Definition: G4SIunits.hh:103
G4double GetPDGCharge() const

Here is the call graph for this function:

G4bool G4TripathiLightCrossSection::IsElementApplicable ( const G4DynamicParticle theProjectile,
G4int  Z,
const G4Material  
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 106 of file G4TripathiLightCrossSection.cc.

108 {
109  G4bool result = false;
110  G4int AT = G4lrint(G4NistManager::Instance()->GetAtomicMassAmu(ZT));
111  G4int ZP = G4lrint(theProjectile->GetDefinition()->GetPDGCharge()/eplus);
112  G4int AP = theProjectile->GetDefinition()->GetBaryonNumber();
113  if (theProjectile->GetKineticEnergy()/AP < 10.0*GeV &&
114  ((AT==1 && ZT==1) || (AP==1 && ZP==1) ||
115  (AT==1 && ZT==0) || (AP==1 && ZP==0) ||
116  (AT==2 && ZT==1) || (AP==2 && ZP==1) ||
117  (AT==3 && ZT==2) || (AP==3 && ZP==2) ||
118  (AT==4 && ZT==2) || (AP==4 && ZP==2))) { result = true; }
119  return result;
120 }
G4double G4ParticleHPJENDLHEData::G4double result
G4double GetKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
bool G4bool
Definition: G4Types.hh:79
static constexpr double eplus
Definition: G4SIunits.hh:199
int G4lrint(double ad)
Definition: templates.hh:163
static constexpr double GeV
Definition: G4SIunits.hh:217
G4double GetPDGCharge() const

Here is the call graph for this function:

void G4TripathiLightCrossSection::SetLowEnergyCheck ( G4bool  aLowEnergyCheck)
inline

Definition at line 107 of file G4TripathiLightCrossSection.hh.

108 {
109  lowEnergyCheck = aLowEnergyCheck;
110 }

Here is the caller graph for this function:


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