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
G4Nucleus.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//
27//
28// original by H.P. Wellisch
29// modified by J.L. Chuma, TRIUMF, 19-Nov-1996
30// last modified: 27-Mar-1997
31// J.P.Wellisch: 23-Apr-97: minor simplifications
32// modified by J.L.Chuma 24-Jul-97 to set the total momentum in Cinema and
33// EvaporationEffects
34// modified by J.L.Chuma 21-Oct-97 put std::abs() around the totalE^2-mass^2
35// in calculation of total momentum in
36// Cinema and EvaporationEffects
37// Chr. Volcker, 10-Nov-1997: new methods and class variables.
38// HPW added utilities for low energy neutron transport. (12.04.1998)
39// M.G. Pia, 2 Oct 1998: modified GetFermiMomentum to avoid memory leaks
40// G.Folger, spring 2010: add integer A/Z interface
41// A. Ribon, summer 2015: migrated to G4Exp and G4Log
42// A. Ribon, autumn 2021: extended to hypernuclei
43
44#include "G4Nucleus.hh"
45#include "G4NucleiProperties.hh"
47#include "G4SystemOfUnits.hh"
48#include "Randomize.hh"
50#include "G4Exp.hh"
51#include "G4Log.hh"
53
54
56 : theA(0), theZ(0), theL(0), aEff(0.0), zEff(0)
57{
58 pnBlackTrackEnergy = 0.0;
59 dtaBlackTrackEnergy = 0.0;
60 pnBlackTrackEnergyfromAnnihilation = 0.0;
61 dtaBlackTrackEnergyfromAnnihilation = 0.0;
62 excitationEnergy = 0.0;
63 momentum = G4ThreeVector(0.,0.,0.);
64 fermiMomentum = 1.52*hbarc/fermi;
65 theTemp = 293.16*kelvin;
66 fIsotope = 0;
67}
68
69G4Nucleus::G4Nucleus( const G4double A, const G4double Z, const G4int numberOfLambdas )
70{
71 SetParameters( A, Z, std::max(numberOfLambdas, 0) );
72 pnBlackTrackEnergy = 0.0;
73 dtaBlackTrackEnergy = 0.0;
74 pnBlackTrackEnergyfromAnnihilation = 0.0;
75 dtaBlackTrackEnergyfromAnnihilation = 0.0;
76 excitationEnergy = 0.0;
77 momentum = G4ThreeVector(0.,0.,0.);
78 fermiMomentum = 1.52*hbarc/fermi;
79 theTemp = 293.16*kelvin;
80 fIsotope = 0;
81}
82
83G4Nucleus::G4Nucleus( const G4int A, const G4int Z, const G4int numberOfLambdas )
84{
85 SetParameters( A, Z, std::max(numberOfLambdas, 0) );
86 pnBlackTrackEnergy = 0.0;
87 dtaBlackTrackEnergy = 0.0;
88 pnBlackTrackEnergyfromAnnihilation = 0.0;
89 dtaBlackTrackEnergyfromAnnihilation = 0.0;
90 excitationEnergy = 0.0;
91 momentum = G4ThreeVector(0.,0.,0.);
92 fermiMomentum = 1.52*hbarc/fermi;
93 theTemp = 293.16*kelvin;
94 fIsotope = 0;
95}
96
98{
99 ChooseParameters( aMaterial );
100 pnBlackTrackEnergy = 0.0;
101 dtaBlackTrackEnergy = 0.0;
102 pnBlackTrackEnergyfromAnnihilation = 0.0;
103 dtaBlackTrackEnergyfromAnnihilation = 0.0;
104 excitationEnergy = 0.0;
105 momentum = G4ThreeVector(0.,0.,0.);
106 fermiMomentum = 1.52*hbarc/fermi;
107 theTemp = aMaterial->GetTemperature();
108 fIsotope = 0;
109}
110
112
113
114//-------------------------------------------------------------------------------------------------
115// SVT (Sampling of the Velocity of the Target nucleus) method, L. Thulliez (CEA-Saclay) 2021/05/04
116//-------------------------------------------------------------------------------------------------
119{
120 // If E_neutron <= 400*kB*T (400 is a common value encounter in MC neutron transport code)
121 // Then apply the Sampling ot the Velocity of the Target (SVT) method
122 // Else consider the target nucleus being without motion
123 G4double E_threshold = 400.0*8.617333262E-11*temp; // 400*kBoltzman*T
124 G4double E_neutron = 0.5*aVelocity.mag2()*G4Neutron::Neutron()->GetPDGMass(); // E=0.5*m*v2
125
126 G4ReactionProduct result;
127 result.SetMass(aMass*G4Neutron::Neutron()->GetPDGMass());
128
129 if ( E_neutron <= E_threshold ) {
130
131 // Beta = sqrt(m/2kT)
132 G4double beta = std::sqrt(result.GetMass()/(2.*8.617333262E-11*temp)); // kT E-5[eV] mass E-11[MeV] => beta in [m/s]-1
133
134 // Neutron speed vn
135 G4double vN_norm = aVelocity.mag();
136 G4double vN_norm2 = vN_norm*vN_norm;
137 G4double y = beta*vN_norm;
138
139 // Normalize neutron velocity
140 aVelocity = (1./vN_norm)*aVelocity;
141
142 // Sample target speed
143 G4double x2;
144 G4double randThreshold;
145 G4double vT_norm, vT_norm2, mu; //theta, val1, val2,
146 G4double acceptThreshold;
147 G4double vRelativeSpeed;
148 G4double cdf0 = 2./(2.+std::sqrt(CLHEP::pi)*y);
149
150 do {
151 // Sample the target velocity vT in the laboratory frame
152 if ( G4UniformRand() < cdf0 ) {
153 // Sample in C45 from https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-9721.pdf
154 x2 = -std::log(G4UniformRand()*G4UniformRand());
155 } else {
156 // Sample in C61 from https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-9721.pdf
157 G4double ampl = std::cos(CLHEP::pi/2.0 * G4UniformRand());
158 x2 = -std::log(G4UniformRand()) - std::log(G4UniformRand())*ampl*ampl;
159 }
160
161 vT_norm = std::sqrt(x2)/beta;
162 vT_norm2 = vT_norm*vT_norm;
163
164 // Sample cosine between the incident neutron and the target in the laboratory frame
165 mu = 2*G4UniformRand() - 1;
166
167 // Define acceptance threshold
168 vRelativeSpeed = std::sqrt(vN_norm2 + vT_norm2 - 2*vN_norm*vT_norm*mu);
169 acceptThreshold = vRelativeSpeed/(vN_norm + vT_norm);
170 randThreshold = G4UniformRand();
171 } while ( randThreshold >= acceptThreshold );
172
173 // Get target nucleus direction from the neutron direction and the relative angle between target nucleus and neutron (mu)
174 G4double cosTh = mu;
175 G4ThreeVector uNorm = aVelocity;
176
177 G4double sinTh = std::sqrt(1. - cosTh*cosTh);
178
179 // Sample randomly the phi angle between the neutron veloicty and the target velocity
180 G4double phi = CLHEP::twopi*G4UniformRand();
181 G4double sinPhi = std::sin(phi);
182 G4double cosPhi = std::cos(phi);
183
184 // Find orthogonal vector to aVelocity - solve equation xx' + yy' + zz' = 0
185 G4ThreeVector ortho(1,1,1);
186 if ( uNorm[0] ) ortho[0] = -(uNorm[1]+uNorm[2])/uNorm[0];
187 else if ( uNorm[1] ) ortho[1] = -(uNorm[0]+uNorm[2])/uNorm[1];
188 else if ( uNorm[2] ) ortho[2] = -(uNorm[0]+uNorm[1])/uNorm[2];
189
190 // Normalize the vector
191 ortho = (1/ortho.mag())*ortho;
192
193 // Find vector to draw a plan perpendicular to uNorm (i.e neutron velocity) with vectors ortho & orthoComp
194 G4ThreeVector orthoComp( uNorm[1]*ortho[2] - ortho[1]*uNorm[2],
195 uNorm[2]*ortho[0] - ortho[2]*uNorm[0],
196 uNorm[0]*ortho[1] - ortho[0]*uNorm[1] );
197
198 // Find the direction of the target velocity in the laboratory frame
199 G4ThreeVector directionTarget( cosTh*uNorm[0] + sinTh*(cosPhi*orthoComp[0] + sinPhi*ortho[0]),
200 cosTh*uNorm[1] + sinTh*(cosPhi*orthoComp[1] + sinPhi*ortho[1]),
201 cosTh*uNorm[2] + sinTh*(cosPhi*orthoComp[2] + sinPhi*ortho[2]) );
202
203 // Normalize directionTarget
204 directionTarget = (1/directionTarget.mag())*directionTarget;
205
206 // Set momentum
207 G4double px = result.GetMass()*vT_norm*directionTarget[0];
208 G4double py = result.GetMass()*vT_norm*directionTarget[1];
209 G4double pz = result.GetMass()*vT_norm*directionTarget[2];
210 result.SetMomentum(px, py, pz);
211
212 G4double tMom = std::sqrt(px*px+py*py+pz*pz);
213 G4double tEtot = std::sqrt((tMom+result.GetMass())*(tMom+result.GetMass())
214 - 2.*tMom*result.GetMass());
215
216 if ( tEtot/result.GetMass() - 1. > 0.001 ) {
217 // use relativistic energy for higher energies
218 result.SetTotalEnergy(tEtot);
219 } else {
220 // use p**2/2M for lower energies (to preserve precision?)
221 result.SetKineticEnergy(tMom*tMom/(2.*result.GetMass()));
222 }
223
224 } else { // target nucleus considered as being without motion
225
226 result.SetMomentum(0., 0., 0.);
227 result.SetKineticEnergy(0.);
228
229 }
230
231 return result;
232}
233
234
237{
238 G4double currentTemp = temp;
239 if (currentTemp < 0) currentTemp = theTemp;
240 G4ReactionProduct theTarget;
241 theTarget.SetMass(targetMass*G4Neutron::Neutron()->GetPDGMass());
242 G4double px, py, pz;
243 px = GetThermalPz(theTarget.GetMass(), currentTemp);
244 py = GetThermalPz(theTarget.GetMass(), currentTemp);
245 pz = GetThermalPz(theTarget.GetMass(), currentTemp);
246 theTarget.SetMomentum(px, py, pz);
247 G4double tMom = std::sqrt(px*px+py*py+pz*pz);
248 G4double tEtot = std::sqrt((tMom+theTarget.GetMass())*
249 (tMom+theTarget.GetMass())-
250 2.*tMom*theTarget.GetMass());
251 // if(1-tEtot/theTarget.GetMass()>0.001) this line incorrect (Bug report 1911)
252 if (tEtot/theTarget.GetMass() - 1. > 0.001) {
253 // use relativistic energy for higher energies
254 theTarget.SetTotalEnergy(tEtot);
255
256 } else {
257 // use p**2/2M for lower energies (to preserve precision?)
258 theTarget.SetKineticEnergy(tMom*tMom/(2.*theTarget.GetMass()));
259 }
260 return theTarget;
261}
262
263
264void
266{
267 G4double random = G4UniformRand();
268 G4double sum = aMaterial->GetTotNbOfAtomsPerVolume();
269 const G4ElementVector* theElementVector = aMaterial->GetElementVector();
270 G4double running(0);
271 // G4Element* element(0);
272 const G4Element* element = (*theElementVector)[aMaterial->GetNumberOfElements()-1];
273
274 for (unsigned int i = 0; i < aMaterial->GetNumberOfElements(); ++i) {
275 running += aMaterial->GetVecNbOfAtomsPerVolume()[i];
276 if (running > random*sum) {
277 element = (*theElementVector)[i];
278 break;
279 }
280 }
281
282 if (element->GetNumberOfIsotopes() > 0) {
283 G4double randomAbundance = G4UniformRand();
284 G4double sumAbundance = element->GetRelativeAbundanceVector()[0];
285 unsigned int iso=0;
286 while (iso < element->GetNumberOfIsotopes() && /* Loop checking, 02.11.2015, A.Ribon */
287 sumAbundance < randomAbundance) {
288 ++iso;
289 sumAbundance += element->GetRelativeAbundanceVector()[iso];
290 }
291 theA=element->GetIsotope(iso)->GetN();
292 theZ=element->GetIsotope(iso)->GetZ();
293 theL=0;
294 aEff=theA;
295 zEff=theZ;
296 } else {
297 aEff = element->GetN();
298 zEff = element->GetZ();
299 theZ = G4int(zEff + 0.5);
300 theA = G4int(aEff + 0.5);
301 theL=0;
302 }
303}
304
305
306void
307G4Nucleus::SetParameters( const G4double A, const G4double Z, const G4int numberOfLambdas )
308{
309 theZ = G4lrint(Z);
310 theA = G4lrint(A);
311 theL = std::max(numberOfLambdas, 0);
312 if (theA<1 || theZ<0 || theZ>theA) {
313 throw G4HadronicException(__FILE__, __LINE__,
314 "G4Nucleus::SetParameters called with non-physical parameters");
315 }
316 aEff = A; // atomic weight
317 zEff = Z; // atomic number
318 fIsotope = 0;
319}
320
321
322void
323G4Nucleus::SetParameters( const G4int A, const G4int Z, const G4int numberOfLambdas )
324{
325 theZ = Z;
326 theA = A;
327 theL = std::max(numberOfLambdas, 0);
328 if( theA<1 || theZ<0 || theZ>theA )
329 {
330 throw G4HadronicException(__FILE__, __LINE__,
331 "G4Nucleus::SetParameters called with non-physical parameters");
332 }
333 aEff = A; // atomic weight
334 zEff = Z; // atomic number
335 fIsotope = 0;
336}
337
338
341{
342 // choose a proton or a neutron (or a lamba if a hypernucleus) as the target particle
343 G4DynamicParticle *targetParticle = new G4DynamicParticle;
344 const G4double rnd = G4UniformRand();
345 if ( rnd < zEff/aEff ) {
346 targetParticle->SetDefinition( G4Proton::Proton() );
347 } else if ( rnd < (zEff + theL*1.0)/aEff ) {
348 targetParticle->SetDefinition( G4Lambda::Lambda() );
349 } else {
350 targetParticle->SetDefinition( G4Neutron::Neutron() );
351 }
352 return targetParticle;
353}
354
355
357G4Nucleus::AtomicMass( const G4double A, const G4double Z, const G4int numberOfLambdas ) const
358{
359 // Now returns (atomic mass - electron masses)
360 if ( numberOfLambdas > 0 ) {
361 return G4HyperNucleiProperties::GetNuclearMass(G4int(A), G4int(Z), numberOfLambdas);
362 } else {
364 }
365}
366
367
369G4Nucleus::AtomicMass( const G4int A, const G4int Z, const G4int numberOfLambdas ) const
370{
371 // Now returns (atomic mass - electron masses)
372 if ( numberOfLambdas > 0 ) {
373 return G4HyperNucleiProperties::GetNuclearMass(A, Z, numberOfLambdas);
374 } else {
376 }
377}
378
379
381G4Nucleus::GetThermalPz( const G4double mass, const G4double temp ) const
382{
383 G4double result = G4RandGauss::shoot();
384 result *= std::sqrt(k_Boltzmann*temp*mass); // Das ist impuls (Pz),
385 // nichtrelativistische rechnung
386 // Maxwell verteilung angenommen
387 return result;
388}
389
390
393{
394 // derived from original FORTRAN code EXNU by H. Fesefeldt (10-Dec-1986)
395 //
396 // Nuclear evaporation as function of atomic number
397 // and kinetic energy (MeV) of primary particle
398 //
399 // returns kinetic energy (MeV)
400 //
401 if( aEff < 1.5 )
402 {
403 pnBlackTrackEnergy = dtaBlackTrackEnergy = 0.0;
404 return 0.0;
405 }
406 G4double ek = kineticEnergy/GeV;
407 G4float ekin = std::min( 4.0, std::max( 0.1, ek ) );
408 const G4float atno = std::min( 120., aEff );
409 const G4float gfa = 2.0*((aEff-1.0)/70.)*G4Exp(-(aEff-1.0)/70.);
410 //
411 // 0.35 value at 1 GeV
412 // 0.05 value at 0.1 GeV
413 //
414 G4float cfa = std::max( 0.15, 0.35 + ((0.35-0.05)/2.3)*G4Log(ekin) );
415 G4float exnu = 7.716 * cfa * G4Exp(-cfa)
416 * ((atno-1.0)/120.)*G4Exp(-(atno-1.0)/120.);
417 G4float fpdiv = std::max( 0.5, 1.0-0.25*ekin*ekin );
418 //
419 // pnBlackTrackEnergy is the kinetic energy (in GeV) available for
420 // proton/neutron black track particles
421 // dtaBlackTrackEnergy is the kinetic energy (in GeV) available for
422 // deuteron/triton/alpha black track particles
423 //
424 pnBlackTrackEnergy = exnu*fpdiv;
425 dtaBlackTrackEnergy = exnu*(1.0-fpdiv);
426
427 if( G4int(zEff+0.1) != 82 )
428 {
429 G4double ran1 = -6.0;
430 G4double ran2 = -6.0;
431 for( G4int i=0; i<12; ++i )
432 {
433 ran1 += G4UniformRand();
434 ran2 += G4UniformRand();
435 }
436 pnBlackTrackEnergy *= 1.0 + ran1*gfa;
437 dtaBlackTrackEnergy *= 1.0 + ran2*gfa;
438 }
439 pnBlackTrackEnergy = std::max( 0.0, pnBlackTrackEnergy );
440 dtaBlackTrackEnergy = std::max( 0.0, dtaBlackTrackEnergy );
441 while( pnBlackTrackEnergy+dtaBlackTrackEnergy >= ek ) /* Loop checking, 02.11.2015, A.Ribon */
442 {
443 pnBlackTrackEnergy *= 1.0 - 0.5*G4UniformRand();
444 dtaBlackTrackEnergy *= 1.0 - 0.5*G4UniformRand();
445 }
446 //G4cout << "EvaporationEffects "<<kineticEnergy<<" "
447 // <<pnBlackTrackEnergy+dtaBlackTrackEnergy<< G4endl;
448 return (pnBlackTrackEnergy+dtaBlackTrackEnergy)*GeV;
449}
450
451
454{
455 // Nuclear evaporation as a function of atomic number and kinetic
456 // energy (MeV) of primary particle. Modified for annihilation effects.
457 //
458 if( aEff < 1.5 || ekOrg < 0.)
459 {
460 pnBlackTrackEnergyfromAnnihilation = 0.0;
461 dtaBlackTrackEnergyfromAnnihilation = 0.0;
462 return 0.0;
463 }
464 G4double ek = kineticEnergy/GeV;
465 G4float ekin = std::min( 4.0, std::max( 0.1, ek ) );
466 const G4float atno = std::min( 120., aEff );
467 const G4float gfa = 2.0*((aEff-1.0)/70.)*G4Exp(-(aEff-1.0)/70.);
468
469 G4float cfa = std::max( 0.15, 0.35 + ((0.35-0.05)/2.3)*G4Log(ekin) );
470 G4float exnu = 7.716 * cfa * G4Exp(-cfa)
471 * ((atno-1.0)/120.)*G4Exp(-(atno-1.0)/120.);
472 G4float fpdiv = std::max( 0.5, 1.0-0.25*ekin*ekin );
473
474 pnBlackTrackEnergyfromAnnihilation = exnu*fpdiv;
475 dtaBlackTrackEnergyfromAnnihilation = exnu*(1.0-fpdiv);
476
477 G4double ran1 = -6.0;
478 G4double ran2 = -6.0;
479 for( G4int i=0; i<12; ++i ) {
480 ran1 += G4UniformRand();
481 ran2 += G4UniformRand();
482 }
483 pnBlackTrackEnergyfromAnnihilation *= 1.0 + ran1*gfa;
484 dtaBlackTrackEnergyfromAnnihilation *= 1.0 + ran2*gfa;
485
486 pnBlackTrackEnergyfromAnnihilation = std::max( 0.0, pnBlackTrackEnergyfromAnnihilation);
487 dtaBlackTrackEnergyfromAnnihilation = std::max( 0.0, dtaBlackTrackEnergyfromAnnihilation);
488 G4double blackSum = pnBlackTrackEnergyfromAnnihilation+dtaBlackTrackEnergyfromAnnihilation;
489 if (blackSum >= ekOrg/GeV) {
490 pnBlackTrackEnergyfromAnnihilation *= ekOrg/GeV/blackSum;
491 dtaBlackTrackEnergyfromAnnihilation *= ekOrg/GeV/blackSum;
492 }
493
494 return (pnBlackTrackEnergyfromAnnihilation+dtaBlackTrackEnergyfromAnnihilation)*GeV;
495}
496
497
500{
501 // derived from original FORTRAN code CINEMA by H. Fesefeldt (14-Oct-1987)
502 //
503 // input: kineticEnergy (MeV)
504 // returns modified kinetic energy (MeV)
505 //
506 static const G4double expxu = 82.; // upper bound for arg. of exp
507 static const G4double expxl = -expxu; // lower bound for arg. of exp
508
509 G4double ek = kineticEnergy/GeV;
510 G4double ekLog = G4Log( ek );
511 G4double aLog = G4Log( aEff );
512 G4double em = std::min( 1.0, 0.2390 + 0.0408*aLog*aLog );
513 G4double temp1 = -ek * std::min( 0.15, 0.0019*aLog*aLog*aLog );
514 G4double temp2 = G4Exp( std::max( expxl, std::min( expxu, -(ekLog-em)*(ekLog-em)*2.0 ) ) );
515 G4double result = 0.0;
516 if( std::abs( temp1 ) < 1.0 )
517 {
518 if( temp2 > 1.0e-10 )result = temp1*temp2;
519 }
520 else result = temp1*temp2;
521 if( result < -ek )result = -ek;
522 return result*GeV;
523}
524
525
527{
528 // chv: .. we assume zero temperature!
529
530 // momentum is equally distributed in each phasespace volume dpx, dpy, dpz.
531 G4double ranflat1=
532 G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum);
533 G4double ranflat2=
534 G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum);
535 G4double ranflat3=
536 G4RandFlat::shoot((G4double)0.,(G4double)fermiMomentum);
537 G4double ranmax = (ranflat1>ranflat2? ranflat1: ranflat2);
538 ranmax = (ranmax>ranflat3? ranmax : ranflat3);
539
540 // Isotropic momentum distribution
541 G4double costheta = 2.*G4UniformRand() - 1.0;
542 G4double sintheta = std::sqrt(1.0 - costheta*costheta);
543 G4double phi = 2.0*pi*G4UniformRand();
544
545 G4double pz=costheta*ranmax;
546 G4double px=sintheta*std::cos(phi)*ranmax;
547 G4double py=sintheta*std::sin(phi)*ranmax;
548 G4ThreeVector p(px,py,pz);
549 return p;
550}
551
552
554{
555 // needs implementation!
556 return nullptr;
557}
558
559
561{
562 momentum+=(aMomentum);
563}
564
565
567{
568 excitationEnergy+=anEnergy;
569}
570
571 /* end of file */
572
std::vector< const G4Element * > G4ElementVector
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:180
G4double G4Log(G4double x)
Definition: G4Log.hh:227
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
float G4float
Definition: G4Types.hh:84
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4UniformRand()
Definition: Randomize.hh:52
double mag2() const
double mag() const
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
G4double * GetRelativeAbundanceVector() const
Definition: G4Element.hh:167
G4double GetZ() const
Definition: G4Element.hh:131
const G4Isotope * GetIsotope(G4int iso) const
Definition: G4Element.hh:170
size_t GetNumberOfIsotopes() const
Definition: G4Element.hh:159
G4double GetN() const
Definition: G4Element.hh:135
static G4double GetNuclearMass(G4int A, G4int Z, G4int L)
G4int GetZ() const
Definition: G4Isotope.hh:90
G4int GetN() const
Definition: G4Isotope.hh:93
static G4Lambda * Lambda()
Definition: G4Lambda.cc:107
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:185
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:204
G4double GetTemperature() const
Definition: G4Material.hh:177
size_t GetNumberOfElements() const
Definition: G4Material.hh:181
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:201
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
static G4double GetNuclearMass(const G4double A, const G4double Z)
void AddExcitationEnergy(G4double anEnergy)
Definition: G4Nucleus.cc:566
G4double GetThermalPz(const G4double mass, const G4double temp) const
Definition: G4Nucleus.cc:381
G4double EvaporationEffects(G4double kineticEnergy)
Definition: G4Nucleus.cc:392
void ChooseParameters(const G4Material *aMaterial)
Definition: G4Nucleus.cc:265
G4double AtomicMass(const G4double A, const G4double Z, const G4int numberOfLambdas=0) const
Definition: G4Nucleus.cc:357
G4double AnnihilationEvaporationEffects(G4double kineticEnergy, G4double ekOrg)
Definition: G4Nucleus.cc:453
void SetParameters(const G4double A, const G4double Z, const G4int numberOfLambdas=0)
Definition: G4Nucleus.cc:307
G4double Cinema(G4double kineticEnergy)
Definition: G4Nucleus.cc:499
G4DynamicParticle * ReturnTargetParticle() const
Definition: G4Nucleus.cc:340
G4ReactionProductVector * Fragmentate()
Definition: G4Nucleus.cc:553
G4ReactionProduct GetBiasedThermalNucleus(G4double aMass, G4ThreeVector aVelocity, G4double temp=-1) const
Definition: G4Nucleus.cc:118
void AddMomentum(const G4ThreeVector aMomentum)
Definition: G4Nucleus.cc:560
G4ReactionProduct GetThermalNucleus(G4double aMass, G4double temp=-1) const
Definition: G4Nucleus.cc:236
G4ThreeVector GetFermiMomentum()
Definition: G4Nucleus.cc:526
static G4Proton * Proton()
Definition: G4Proton.cc:92
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetTotalEnergy(const G4double en)
void SetKineticEnergy(const G4double en)
G4double GetMass() const
void SetMass(const G4double mas)
int G4lrint(double ad)
Definition: templates.hh:134