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) {
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) {
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));
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');