34#define INCLXX_IN_GEANT4_MODE 1
45#ifdef INCLXX_IN_GEANT4_MODE
49#ifdef INCLXX_IN_GEANT4_MODE
56 namespace ParticleTable {
61 const NaturalIsotopicDistributions *theNaturalIsotopicDistributions = NULL;
63 const G4double theINCLNucleonMass = 938.2796;
64 const G4double theINCLPionMass = 138.0;
65 const G4double theINCLLambdaMass = 1115.683;
68 const G4double theINCLEtaMass = 547.862;
69 const G4double theINCLOmegaMass = 782.65;
70 const G4double theINCLEtaPrimeMass = 957.78;
71 const G4double theINCLPhotonMass = 0.0;
109 const G4double theChargedPiWidth = 2.6033e-08;
110 const G4double thePiZeroWidth = 8.52e-17;
111 const G4double theEtaWidth = 5.025e-19;
112 const G4double theOmegaWidth = 7.7528e-23;
113 const G4double theEtaPrimeWidth = 3.3243e-21;
114 const G4double theChargedKaonWidth = 1.238e-08;
115 const G4double theKShortWidth = 8.954e-11;
116 const G4double theKLongWidth = 5.116e-08;
117 const G4double theLambdaWidth = 2.632e-10;
118 const G4double theSigmaPlusWidth = 8.018e-11;
119 const G4double theSigmaZeroWidth = 7.4e-20;
120 const G4double theSigmaMinusWidth = 1.479e-10;
137 const G4int mediumNucleiTableSize = 30;
139 const G4double mediumDiffuseness[mediumNucleiTableSize] =
140 {0.0,0.0,0.0,0.0,0.0,1.78,1.77,1.77,1.69,1.71,
141 1.69,1.72,1.635,1.730,1.81,1.833,1.798,
142 1.93,0.567,0.571, 0.560,0.549,0.550,0.551,
143 0.580,0.575,0.569,0.537,0.0,0.0};
144 const G4double mediumRadius[mediumNucleiTableSize] =
145 {0.0,0.0,0.0,0.0,0.0,0.334,0.327,0.479,0.631,0.838,
146 0.811,0.84,1.403,1.335,1.25,1.544,1.498,1.57,
147 2.58,2.77, 2.775,2.78,2.88,2.98,3.22,3.03,2.84,
152 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0},
153 {-1.0, -1.0, 2.10, 1.80, 1.70, 1.83, 2.60, 2.50, -1.0, -1.0, -1.0, -1.0, -1.0},
154 {-1.0, -1.0, -1.0, 1.80, 1.68, 1.70, 2.60, 2.50, 2.50, 2.50, 2.50, -1.0, -1.0},
155 {-1.0, -1.0, -1.0, -1.0, 1.70, 1.83, 2.56, 2.40, 2.50, 2.50, 2.50, 2.50, 2.50},
156 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 2.60, 2.50, 2.50, 2.51, 2.50, 2.50, 2.50},
157 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 2.50, 2.50, 2.50, 2.50, 2.45, 2.40, 2.50},
158 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 2.50, 2.50, 2.50, 2.50, 2.47},
159 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 2.50, 2.50, 2.50},
160 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 2.50}
165 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0},
166 {-1.0, -1.0, 77.0, 110., 153., 100., 100., 100., -1.0, -1.0, -1.0, -1.0, -1.0},
167 {-1.0, -1.0, -1.0, 110., 153., 100., 100., 100., 100., 100., 100., -1.0, -1.0},
168 {-1.0, -1.0, -1.0, -1.0, 153., 100., 100., 100., 100., 100., 100., 100., 100.},
169 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 100., 100., 100., 100., 100., 100., 100.},
170 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 100., 100., 100., 100., 100., 100., 100.},
171 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 100., 100., 100., 100., 100.},
172 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 100., 100., 100.},
173 {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 100.}
176 const G4int elementTableSize = 113;
179 const std::string elementTable[elementTableSize] = {
296 const std::string elementIUPACDigits =
"nubtqphsoe";
298#define INCL_DEFAULT_SEPARATION_ENERGY 6.83
305#undef INCL_DEFAULT_SEPARATION_ENERGY
312#ifdef INCLXX_IN_GEANT4_MODE
320 char iupacToInt(
char c) {
321 return (
char)(((
G4int)
'0')+elementIUPACDigits.find(c));
325 char intToIUPAC(
char n) {
return elementIUPACDigits.at(n); }
328 const NaturalIsotopicDistributions *getNaturalIsotopicDistributions() {
329 if(!theNaturalIsotopicDistributions)
330 theNaturalIsotopicDistributions =
new NaturalIsotopicDistributions;
331 return theNaturalIsotopicDistributions;
337 protonMass = theINCLNucleonMass;
338 neutronMass = theINCLNucleonMass;
339 piPlusMass = theINCLPionMass;
340 piMinusMass = theINCLPionMass;
341 piZeroMass = theINCLPionMass;
354 SigmaPlusMass = theRealSigmaPlusMass;
355 SigmaMinusMass = theRealSigmaMinusMass;
356 SigmaZeroMass = theRealSigmaZeroMass;
357 LambdaMass = theINCLLambdaMass;
358 KPlusMass = theRealChargedKaonMass;
359 KZeroMass = theRealNeutralKaonMass;
360 KZeroBarMass = theRealNeutralKaonMass;
361 KShortMass = theRealNeutralKaonMass;
362 KLongMass = theRealNeutralKaonMass;
363 KMinusMass = theRealChargedKaonMass;
365 etaMass = theINCLEtaMass;
366 omegaMass = theINCLOmegaMass;
367 etaPrimeMass = theINCLEtaPrimeMass;
368 photonMass = theINCLPhotonMass;
377#ifndef INCLXX_IN_GEANT4_MODE
378 std::string dataFilePath;
384#ifdef INCLXX_IN_GEANT4_MODE
403 minDeltaMass = theRealNeutronMass + theRealChargedPiMass + 0.5;
407 piPlusWidth = theChargedPiWidth;
408 piMinusWidth = theChargedPiWidth;
409 piZeroWidth = thePiZeroWidth;
410 etaWidth = theEtaWidth;
411 omegaWidth = theOmegaWidth;
412 etaPrimeWidth = theEtaPrimeWidth;
414 SigmaMinusWidth = theSigmaMinusWidth;
415 SigmaPlusWidth = theSigmaPlusWidth;
416 SigmaZeroWidth = theSigmaZeroWidth;
417 LambdaWidth = theLambdaWidth;
418 KPlusWidth = theChargedKaonWidth;
419 KMinusWidth = theChargedKaonWidth;
420 KShortWidth = theKShortWidth;
421 KLongWidth = theKLongWidth;
424#ifdef INCLXX_IN_GEANT4_MODE
447 if(aFermiMomentum>0.)
448 constantFermiMomentum = aFermiMomentum;
464 std::fill(rpCorrelationCoefficient, rpCorrelationCoefficient +
UnknownParticle, 1.);
506 }
else if(t ==
KPlus) {
508 }
else if(t ==
KZero) {
514 }
else if(t ==
KLong) {
518 }
else if(t ==
Eta) {
520 }
else if(t ==
Omega) {
527 INCL_ERROR(
"Requested isospin of an unknown particle!");
546 std::stringstream stream;
552 std::stringstream stream;
561 return std::string(
"proton");
563 return std::string(
"neutron");
565 return std::string(
"delta++");
567 return std::string(
"delta+");
569 return std::string(
"delta0");
571 return std::string(
"delta-");
573 return std::string(
"pi+");
575 return std::string(
"pi0");
577 return std::string(
"pi-");
579 return std::string(
"lambda");
581 return std::string(
"sigma+");
583 return std::string(
"sigma0");
585 return std::string(
"sigma-");
587 return std::string(
"kaon+");
589 return std::string(
"kaon0");
591 return std::string(
"kaon0bar");
593 return std::string(
"kaon-");
595 return std::string(
"kaonshort");
597 return std::string(
"kaonlong");
599 return std::string(
"composite");
601 return std::string(
"eta");
603 return std::string(
"omega");
605 return std::string(
"etaprime");
607 return std::string(
"photon");
609 return std::string(
"unknown");
614 return std::string(
"p");
616 return std::string(
"n");
618 return std::string(
"d++");
620 return std::string(
"d+");
622 return std::string(
"d0");
624 return std::string(
"d-");
626 return std::string(
"pi+");
628 return std::string(
"pi0");
630 return std::string(
"pi-");
632 return std::string(
"l");
634 return std::string(
"s+");
636 return std::string(
"s0");
638 return std::string(
"s-");
640 return std::string(
"k+");
642 return std::string(
"k0");
644 return std::string(
"k0b");
646 return std::string(
"k-");
648 return std::string(
"ks");
650 return std::string(
"kl");
652 return std::string(
"comp");
654 return std::string(
"eta");
656 return std::string(
"omega");
658 return std::string(
"etap");
660 return std::string(
"photon");
662 return std::string(
"unknown");
677 return SigmaPlusMass;
679 return SigmaMinusMass;
681 return SigmaZeroMass;
684 }
else if(pt ==
KPlus) {
686 }
else if(pt ==
KZero) {
694 }
else if(pt ==
KLong) {
696 }
else if(pt ==
Eta) {
698 }
else if(pt ==
Omega) {
705 INCL_ERROR(
"getMass : Unknown particle type." <<
'\n');
713 return theRealProtonMass;
716 return theRealNeutronMass;
720 return theRealChargedPiMass;
723 return theRealPiZeroMass;
726 return theRealSigmaPlusMass;
729 return theRealSigmaZeroMass;
732 return theRealSigmaMinusMass;
735 return theRealLambdaMass;
739 return theRealChargedKaonMass;
745 return theRealNeutralKaonMass;
748 return theRealEtaMass;
751 return theRealOmegaMass;
754 return theRealEtaPrimeMass;
757 return theRealPhotonMass;
760 INCL_ERROR(
"Particle::getRealMass : Unknown particle type." <<
'\n');
777 else if(Z==0 &&
S==0)
778 return A*theRealNeutronMass;
780 return A*theRealProtonMass;
782 return (
A+
S)*theRealNeutronMass-
S*LambdaMass;
784#ifndef INCLXX_IN_GEANT4_MODE
785 return ::G4INCL::NuclearMassTable::getMass(
A,Z,
S);
787 if(
S<0)
return theG4IonTable->GetNucleusMass(Z,
A,std::abs(
S)) / MeV;
788 else return theG4IonTable->GetNucleusMass(Z,
A) / MeV;
807 return Z*(protonMass - protonSeparationEnergy) + (
A+
S-Z)*(neutronMass - neutronSeparationEnergy) + std::abs(
S)*(LambdaMass - lambdaSeparationEnergy);
809 return Z*(protonMass - protonSeparationEnergy) + (
A-Z)*(neutronMass - neutronSeparationEnergy);
810 else if(
A==1 && Z==0 &&
S==0)
812 else if(
A==1 && Z==1 &&
S==0)
814 else if(
A==1 && Z==0 &&
S==-1)
952 if(
A > 19 || (A < 6 && A >= 2)) {
956 }
else if(A < clusterTableASize && Z>=0 && Z < clusterTableZSize && A >= 6) {
957 const G4double thisRMS = positionRMS[Z][
A];
961 INCL_DEBUG(
"getNuclearRadius: Radius for nucleus A = " <<
A <<
" Z = " << Z <<
" is not available" <<
'\n'
962 <<
"returning radius for C12");
963 return positionRMS[6][12];
970 return 1.225*theDiffusenessParameter*
971 std::sqrt((2.+5.*theRadiusParameter)/(2.+3.*theRadiusParameter));
973 INCL_ERROR(
"getNuclearRadius: No radius for nucleus A = " <<
A <<
" Z = " << Z <<
'\n');
987 G4double r0 = (1.128+0.439*std::pow(
A,-2./3.)) * std::pow(
A, 1.0/3.0);
991 G4double r0 = (2.745e-4 *
A + 1.063) * std::pow(
A, 1.0/3.0);
995 if(r0hfb>0.)r0 = r0hfb;
1001 }
else if(A < 6 && A >= 2) {
1002 if(Z<clusterTableZSize && Z>=0) {
1003 const G4double thisRMS = positionRMS[Z][
A];
1007 INCL_DEBUG(
"getRadiusParameter: Radius for nucleus A = " <<
A <<
" Z = " << Z <<
" is not available" <<
'\n'
1008 <<
"returning radius for C12");
1009 return positionRMS[6][12];
1012 INCL_DEBUG(
"getRadiusParameter: Radius for nucleus A = " <<
A <<
" Z = " << Z <<
" is not available" <<
'\n'
1013 <<
"returning radius for C12");
1014 return positionRMS[6][12];
1016 }
else if(A <= 19 && A >= 6) {
1018 G4double r0 = (1.128+0.439*std::pow(
A,-2./3.)) * std::pow(
A, 1.0/3.0);
1024 if(r0hfb>0.)
return r0hfb;
1026 return mediumRadius[
A-1];
1029 INCL_ERROR(
"getRadiusParameter: No radius for nucleus A = " <<
A <<
" Z = " << Z <<
'\n');
1038 }
else if(A <= 19 && A >= 6) {
1039 return 5.5 + 0.3 * (
G4double(
A) - 6.0)/12.0;
1043 INCL_ERROR(
"getMaximumNuclearRadius : No maximum radius for nucleus A = " <<
A <<
" Z = " << Z <<
'\n');
1066 }
else if(A <= 19 && A >= 6) {
1070 if(ahfb>0.)
return ahfb;
1072 return mediumDiffuseness[
A-1];
1073 }
else if(A < 6 && A >= 2) {
1074 INCL_ERROR(
"getSurfaceDiffuseness: was called for A = " <<
A <<
" Z = " << Z <<
'\n');
1077 INCL_ERROR(
"getSurfaceDiffuseness: No diffuseness for nucleus A = " <<
A <<
" Z = " << Z <<
'\n');
1089 return theINCLProtonSeparationEnergy;
1091 return theINCLNeutronSeparationEnergy;
1093 return theINCLLambdaSeparationEnergy;
1095 INCL_ERROR(
"ParticleTable::getSeparationEnergyINCL : Unknown particle type." <<
'\n');
1109 INCL_ERROR(
"ParticleTable::getSeparationEnergyReal : Unknown particle type." <<
'\n');
1136 INCL_WARN(
"getElementName called with Z<1" <<
'\n');
1137 return elementTable[0];
1138 }
else if(Z<elementTableSize)
1139 return elementTable[Z];
1145 std::stringstream elementStream;
1147 std::string elementName = elementStream.str();
1148 std::transform(elementName.begin(), elementName.end(), elementName.begin(), intToIUPAC);
1149 elementName[0] = std::toupper(elementName.at(0));
1155 std::transform(pS.begin(), pS.end(), pS.begin(), ::tolower);
1156 pS[0] = ::toupper(pS[0]);
1158 const std::string *iter = std::find(elementTable, elementTable+elementTableSize, pS);
1159 if(iter != elementTable+elementTableSize)
1160 return iter - elementTable;
1167 std::string elementName(s);
1168 std::transform(elementName.begin(), elementName.end(), elementName.begin(), ::tolower);
1170 if(elementName.find_first_not_of(elementIUPACDigits)!=std::string::npos)
1172 std::transform(elementName.begin(), elementName.end(), elementName.begin(), iupacToInt);
1173 std::stringstream elementStream(elementName);
1180 return getNaturalIsotopicDistributions()->getIsotopicDistribution(Z);
1184 return getNaturalIsotopicDistributions()->drawRandomIsotope(Z);
1188 return constantFermiMomentum;
1202 static const G4double alphaParam = 259.416;
1203 static const G4double betaParam = 152.824;
1204 static const G4double gammaParam = 9.5157E-2;
1205 return alphaParam - betaParam*std::exp(-gammaParam*((
G4double)
A));
1210 return rpCorrelationCoefficient[t];
1230 else if (isosp == 0) {
1253 else if (isosp == -1) {
1256 else if (isosp == 1) {
1270 else if (isosp == 0) {
1303 return piMinusWidth;
1304 }
else if(pt ==
PiZero) {
1306 }
else if(pt ==
Eta) {
1308 }
else if(pt ==
Omega) {
1311 return etaPrimeWidth;
1313 return SigmaPlusWidth;
1315 return SigmaZeroWidth;
1317 return SigmaMinusWidth;
1318 }
else if(pt ==
KPlus) {
1320 }
else if(pt ==
KMinus) {
1322 }
else if(pt ==
KShort) {
1324 }
else if(pt ==
KLong) {
1327 INCL_ERROR(
"getWidth : Unknown particle type." <<
'\n');
double A(double temperature)
Functions that encapsulate a mass table.
#define INCL_DEFAULT_SEPARATION_ENERGY
G4double getNeutronHalo() const
Get the neutron-halo size.
FermiMomentumType getFermiMomentumType() const
Get the Fermi-momentum type.
SeparationEnergyType getSeparationEnergyType() const
Get the separation-energy type.
G4double getRPCorrelationCoefficient(const ParticleType t) const
Get the r-p correlation coefficient.
std::string const & getINCLXXDataFilePath() const
G4double getNeutronSkin() const
Get the neutron-skin thickness.
G4double getFermiMomentum() const
Get the Fermi momentum.
G4bool getUseRealMasses() const
Whether to use real masses.
Class that stores isotopic abundances for a given element.
G4double GetPDGMass() const
G4IonTable * GetIonTable() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4double getSurfaceDiffusenessHFB(const ParticleType t, const G4int A, const G4int Z)
G4double getRadiusParameterHFB(const ParticleType t, const G4int A, const G4int Z)
Get the radius and diffuseness parameters from HFB calculations.
T max(const T t1, const T t2)
brief Return the largest of the two arguments
const G4double sqrtFiveThirds
const G4double sqrtThreeFifths
G4int getMassNumber(const ParticleType t)
Get mass number from particle type.
G4ThreadLocal FermiMomentumFn getFermiMomentum
const G4double effectiveDeltaWidth
G4int parseElement(std::string pS)
Get the name of the element from the atomic number.
G4ThreadLocal G4double minDeltaMass2
G4double(* FermiMomentumFn)(const G4int, const G4int)
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
G4ThreadLocal SeparationEnergyFn getSeparationEnergy
Static pointer to the separation-energy function.
G4double getTableQValue(const G4int A1, const G4int Z1, const G4int S1, const G4int A2, const G4int Z2, const G4int S2)
Get Q-value (in MeV/c^2)
G4ThreadLocal ParticleMassFn getTableParticleMass
Static pointer to the mass function for particles.
void initialize(Config const *const theConfig=0)
Initialize the particle table.
const G4double effectiveDeltaMass
G4double getFermiMomentumMassDependent(const G4int A, const G4int)
Return the value Fermi momentum from a fit.
G4double getTableSpeciesMass(const ParticleSpecies &p)
G4double getLambdaSeparationEnergy()
G4int drawRandomNaturalIsotope(const G4int Z)
G4double getSeparationEnergyReal(const ParticleType t, const G4int A, const G4int Z)
Return the real separation energy.
G4double getNeutronSeparationEnergy()
Getter for neutronSeparationEnergy.
G4ThreadLocal G4double minDeltaMass
const G4int clusterTableZSize
G4double getRadiusParameter(const ParticleType t, const G4int A, const G4int Z)
G4double getLargestNuclearRadius(const G4int A, const G4int Z)
ParticleType getKaonType(const G4int isosp)
Get the type of kaon.
G4double getNeutronHalo()
Get the size of the neutron halo.
G4double getRealMass(const G4INCL::ParticleType t)
Get particle mass (in MeV/c^2)
ParticleType getSigmaType(const G4int isosp)
Get the type of sigma.
G4double getINCLMass(const G4int A, const G4int Z, const G4int S)
Get INCL nuclear mass (in MeV/c^2)
G4double(* ParticleMassFn)(const ParticleType)
G4int getStrangenessNumber(const ParticleType t)
Get strangeness number from particle type.
G4double getMaximumNuclearRadius(const ParticleType t, const G4int A, const G4int Z)
void setLambdaSeparationEnergy(const G4double s)
G4double getRPCorrelationCoefficient(const ParticleType t)
Get the value of the r-p correlation coefficient.
G4int parseIUPACElement(std::string const &pS)
Parse a IUPAC element name.
G4double getSeparationEnergyINCL(const ParticleType t, const G4int, const G4int)
Return INCL's default separation energy.
void setNeutronSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
G4double getFermiMomentumConstant(const G4int, const G4int)
Return the constant value of the Fermi momentum.
std::string getName(const ParticleType t)
Get the native INCL name of the particle.
G4ThreadLocal G4double minDeltaMassRndm
G4double(* SeparationEnergyFn)(const ParticleType, const G4int, const G4int)
G4double getNeutronSkin()
Get the thickness of the neutron skin.
std::string getIUPACElementName(const G4int Z)
Get the name of an unnamed element from the IUPAC convention.
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
ParticleType getNucleonType(const G4int isosp)
Get the type of nucleon.
G4double getSurfaceDiffuseness(const ParticleType t, const G4int A, const G4int Z)
const G4int clusterTableASize
G4double getFermiMomentumConstantLight(const G4int A, const G4int Z)
Return the constant value of the Fermi momentum - special for light.
void setProtonSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
ParticleType getPionType(const G4int isosp)
Get the type of pion.
ParticleType getDeltaType(const G4int isosp)
Get the type of delta.
G4double(* NuclearMassFn)(const G4int, const G4int, const G4int)
G4int getChargeNumber(const ParticleType t)
Get charge number from particle type.
G4double getProtonSeparationEnergy()
Getter for protonSeparationEnergy.
IsotopicDistribution const & getNaturalIsotopicDistribution(const G4int Z)
G4double getMomentumRMS(const G4int A, const G4int Z)
Return the RMS of the momentum distribution (light clusters)
ParticleType getAntiKaonType(const G4int isosp)
Get the type of antikaon.
G4double getSeparationEnergyRealForLight(const ParticleType t, const G4int A, const G4int Z)
Return the real separation energy only for light nuclei.
G4double getNuclearRadius(const ParticleType t, const G4int A, const G4int Z)
G4double getWidth(const ParticleType t)
Get particle width (in s)
std::string getShortName(const ParticleType t)
Get the short INCL name of the particle.
std::string getElementName(const G4int Z)
Get the name of the element from the atomic number.
const G4double Pf
Fermi momentum [MeV/c].
@ MassDependentFermiMomentum
@ ConstantLightFermiMomentum
@ RealForLightSeparationEnergy