88 if ( p_proton )
return;
104 if ( p_proton )
return;
113 #ifdef G4MULTITHREADED
120 isIsomerCreated(false),
228 G4cout <<
"G4IonTable::CreateIon() : can not create ion of "
229 <<
" Z =" << Z <<
" A = " << A
230 <<
" because GenericIon is not ready !!" <<
G4endl;
235 "Can not create ions because GenericIon is not ready");
255 stable = (life <= 0.) || (decayTable ==0);
262 ed <<
"G4IonTable::CreateIon() : G4IsotopeProperty object was not found for"
263 <<
" Z = " << Z <<
" A = " << A <<
" E = " << E/
keV <<
" (keV).\n"
264 <<
" Physics quantities such as life are not set for this ion.";
299 ion =
new G4Ions( name, mass, 0.0*
MeV, charge,
302 "nucleus", 0, A, encoding,
303 stable, life, decayTable,
false,
317 G4cout <<
"G4IonTable::CreateIon() : create ion of " << name
318 <<
" " << Z <<
", " << A
321 G4cout <<
" IsomerLVL=" << lvl
322 <<
" excited energy=" << Eex/
keV <<
"[keV]";
331 #ifdef G4MULTITHREADED
335 if(!stable && decayTable)
338 for(
G4int iCh=0;iCh<nCh;iCh++)
364 G4cout <<
"G4IonTable::CreateIon() : can not create ion of "
365 <<
" Z =" << Z <<
" A = " << A
366 <<
" because GenericIon is not ready !!" <<
G4endl;
370 "Can not create ions because GenericIon is not ready");
398 ion =
new G4Ions( name, mass, 0.0*
MeV, charge,
401 "nucleus", 0, A, encoding,
402 stable, life, decayTable,
false,
417 G4cout <<
"G4IonTable::CreateIon() : create hyper ion of " << name
418 <<
" " << Z <<
", " << A <<
", " << L
421 G4cout <<
" IsomerLVL=" << lvl
422 <<
" excited energy=" << Eex/
keV <<
"[keV]";
439 "Ion cannot be created by an isomer level. Use excitation energy.");
451 ed <<
"Isomer level " << lvl <<
" is unknown for the isotope (Z="
452 << Z <<
", A=" << A <<
", L=" << L <<
"). Null pointer is returned.";
465 if ( (A<1) || (Z<=0) || (lvl<0) || (A>999) ) {
468 G4cout <<
"G4IonTable::GetIon() : illegal atomic number/mass"
469 <<
" Z =" << Z <<
" A = " << A <<
" Lvl = " << lvl <<
G4endl;
479 #ifdef G4MULTITHREADED
486 if(ion == 0 && lvl == 0) ion =
CreateIon(Z,A,lvl);
491 {
if(lvl == 0) ion =
CreateIon(Z,A,lvl); }
494 if(ion == 0 && lvl == 0) ion =
CreateIon(Z, A, lvl);
511 if (L==0)
return GetIon(Z,A,lvl);
513 if (A < 2 || Z < 0 || Z > A-L || L>A || A>999 ) {
516 G4cout <<
"G4IonTable::GetIon() : illegal atomic number/mass"
517 <<
" Z =" << Z <<
" A = " << A <<
" L = " << L
518 <<
" IsomerLvl = " << lvl <<
G4endl;
525 G4cout <<
"G4IonTable::GetIon() : No boud state for "
526 <<
" Z =" << Z <<
" A = " << A <<
" L = " << L
527 <<
" IsomerLvl = " << lvl <<
G4endl;
539 #ifdef G4MULTITHREADED
544 if(ion == 0) ion =
CreateIon(Z, A, L, lvl);
569 if ( (A<1) || (Z<=0) || (E<0.0) || (A>999) || (J<0) ) {
572 G4cout <<
"G4IonTable::GetIon() : illegal atomic number/mass"
573 <<
" Z =" << Z <<
" A = " << A <<
" E = " << E/
keV <<
G4endl;
583 #ifdef G4MULTITHREADED
607 if (L==0)
return GetIon(Z,A,E,J);
609 if (A < 2 || Z < 0 || Z > A-L || L>A || A>999 ) {
612 G4cout <<
"G4IonTable::GetIon() : illegal atomic number/mass"
613 <<
" Z =" << Z <<
" A = " << A <<
" L = " << L
621 G4cout <<
"G4IonTable::GetIon() : No boud state for "
622 <<
" Z =" << Z <<
" A = " << A <<
" L = " << L
633 #ifdef G4MULTITHREADED
648 if(ion == 0) ion =
CreateIon(Z, A, L, E);
662 G4cout <<
"G4IonTable::GetIon() : illegal encoding"
663 <<
" CODE:" << encoding <<
G4endl;
671 return GetIon( Z, A, L, IsoLvl);
677 if ( (A<1) || (Z<=0) || (J<0) || (E<0.0) || (A>999) ) {
680 G4cout <<
"G4IonTable::FindIon() : illegal atomic number/mass or excitation level "
681 <<
" Z =" << Z <<
" A = " << A <<
" E = " << E/
keV <<
G4endl;
695 if (ion!=0 && E==0.0) {
701 G4IonList::iterator i =
fIonList->find(encoding);
706 G4double anExcitaionEnergy = ((
const G4Ions*)(ion))->GetExcitationEnergy();
707 if ( std::fabs( E - anExcitaionEnergy )<
tolerance) {
725 if (L==0)
return FindIon(Z,A,E,J);
727 if (A < 2 || Z < 0 || Z > A-L || L>A || A>999 ) {
730 G4cout <<
"G4IonTable::FindIon() : illegal atomic number/mass or excitation level "
731 <<
" Z =" << Z <<
" A = " << A <<
" L = " << L
746 G4IonList::iterator i =
fIonList->find(encoding);
752 G4double anExcitaionEnergy = ((
const G4Ions*)(ion))->GetExcitationEnergy();
753 if ( std::fabs( E - anExcitaionEnergy )<
tolerance) {
770 if ( (A<1) || (Z<=0) || (lvl<0) || (A>999) ) {
773 G4cout <<
"G4IonTable::FindIon() : illegal atomic number/mass or excitation level "
774 <<
" Z =" << Z <<
" A = " << A <<
" IsoLvl = " << lvl <<
G4endl;
788 if (ion!=0 && lvl==0) {
794 G4IonList::iterator i =
fIonList->find(encoding);
799 if ( ((
const G4Ions*)(ion))->GetIsomerLevel() == lvl) {
810 "Isomer level 9 may be ambiguous.");
822 if (L==0)
return FindIon(Z,A,lvl);
824 if (A < 2 || Z < 0 || Z > A-L || L>A || A>999 ) {
827 G4cout <<
"G4IonTable::FindIon() : illegal atomic number/mass or excitation level "
828 <<
" Z =" << Z <<
" A = " << A <<
" L = " << L
829 <<
" IsomerLvl = " << lvl <<
G4endl;
842 G4IonList::iterator i =
fIonList->find(encoding);
848 if ( ((
const G4Ions*)(ion))->GetIsomerLevel() == lvl) {
858 "Isomer level 9 may be ambiguous.");
877 if ( Z==1 && A==1 && E==0.0 )
return 2212;
880 encoding += Z * 10000;
882 if (lvl>0&&lvl<10) encoding +=lvl;
883 else if (E>0.0) encoding += 9;
902 encoding += L* 10000000;
903 if ( Z==1 && A==1 && E==0.0 ) encoding = 3122;
913 if (encoding <= 0)
return false;
915 if (encoding == 2212) {
921 encoding -= 1000000000;
935 if (encoding <= 0)
return false;
937 if (encoding == 3122) {
943 if (encoding % 10 != 0) {
947 if (encoding < 1000000000) {
952 encoding -= 1000000000;
953 L = encoding/10000000;
954 encoding -= 10000000*
L;
972 os =
new std::ostringstream();
974 os->setf(std::ios::fixed);
983 std::ostringstream& oo = *os;
985 oo<<
'['<<E/
keV <<
']';
1000 for (
int i =0; i<
L; i++){
1016 os =
new std::ostringstream();
1018 os->setf(std::ios::fixed);
1026 name =
"E" + os->str() +
"-";
1036 std::ostringstream& oo = *os;
1038 oo<<
'['<<lvl <<
']';
1052 for (
int i =0; i<
L; i++){
1065 static const G4String nucleus(
"nucleus");
1090 static const G4String anti_nucleus(
"anti_nucleus");
1091 static const G4String anti_proton(
"anti_proton");
1110 #include <algorithm>
1114 static const std::string names[] = {
"proton",
"alpha",
"deuteron",
1118 return std::find(names, names+5, particle->
GetParticleName())!=names+5;
1123 static const std::string names[] = {
"anti_proton",
"anti_alpha",
"anti_deuteron",
1124 "anti_triton",
"anti_He3"};
1127 return std::find(names, names+5, particle->
GetParticleName())!=names+5;
1136 #ifndef G4MULTITHREADED
1140 if ( (Z==1)&&(A==1) ) {
1142 }
else if ( (Z==1)&&(A==2) ) {
1144 }
else if ( (Z==1)&&(A==3) ) {
1146 }
else if ( (Z==2)&&(A==4) ) {
1148 }
else if ( (Z==2)&&(A==3) ) {
1161 #ifndef G4MULTITHREADED
1165 if ( (Z==1)&&(A==1) ) {
1167 }
else if ( (Z==1)&&(A==2) ) {
1169 }
else if ( (Z==1)&&(A==3) ) {
1171 }
else if ( (Z==2)&&(A==4) ) {
1173 }
else if ( (Z==2)&&(A==3) ) {
1186 if ( (A<1) || (Z<0) || (L<0) || (lvl<0) || (lvl>9) ){
1189 G4cout <<
"G4IonTable::GetNucleusMass() : illegal atomic number/mass "
1190 <<
" Z =" << Z <<
" A = " << A
1191 <<
" L = " << L <<
" lvl = " << lvl <<
G4endl;
1194 G4Exception(
"G4IonTable::GetNucleusMass()",
"PART107",
1215 G4IonList::iterator i =
fIonList->find(encoding);
1217 for( ;i !=
fIonList->end() ; i++) {
1221 if ( ((
const G4Ions*)(ion))->GetIsomerLevel() == lvl) {
1232 if (fProperty !=0 ) mass += fProperty->
GetEnergy();
1264 "No effects because readyToUse is true.");
1270 G4cout <<
"G4IonTable::Clear() : number of Ion regsitered = ";
1279 if (!
IsIon(particle))
return;
1288 fIonListShadow->insert( std::pair<const G4int, const G4ParticleDefinition*>(encoding, particle) );
1294 if(!particle)
return;
1301 if (encoding !=0 ) {
1302 G4IonList::iterator i =
fIonList->find(encoding);
1303 for( ;i !=
fIonList->end() ; i++) {
1304 if (particle == i->second ) {
1313 fIonList->insert( std::pair<const G4int, const G4ParticleDefinition*>(encoding, particle) );
1320 if(!particle)
return;
1321 #ifdef G4MULTITHREADED
1325 <<
" is ignored as it is invoked from a worker thread.";
1334 G4String msg =
"Request of removing ";
1336 msg +=
" has No effects other than Pre_Init";
1344 <<
" will be removed from the IonTable " <<
G4endl;
1350 if (
IsIon(particle)) {
1355 if (encoding !=0 ) {
1358 if (particle == i->second) {
1368 <<
" is not ions" <<
G4endl;
1383 G4IonList::iterator idx;
1386 if (( particle_name ==
"ALL" ) || (particle_name ==
"all")){
1397 "Li",
"Be",
"B",
"C",
"N",
"O",
"F",
"Ne",
1398 "Na",
"Mg",
"Al",
"Si",
"P",
"S",
"Cl",
"Ar",
1399 "K",
"Ca",
"Sc",
"Ti",
"V",
"Cr",
"Mn",
"Fe",
"Co",
"Ni",
"Cu",
"Zn",
"Ga",
"Ge",
"As",
"Se",
"Br",
"Kr",
1400 "Rb",
"Sr",
"Y",
"Zr",
"Nb",
"Mo",
"Tc",
"Ru",
"Rh",
"Pd",
"Ag",
"Cd",
"In",
"Sn",
"Sb",
"Te",
"I",
"Xe",
1402 "La",
"Ce",
"Pr",
"Nd",
"Pm",
"Sm",
"Eu",
"Gd",
"Tb",
"Dy",
"Ho",
"Er",
"Tm",
"Yb",
"Lu",
1403 "Hf",
"Ta",
"W",
"Re",
"Os",
"Ir",
"Pt",
"Au",
"Hg",
"Tl",
"Pb",
"Bi",
"Po",
"At",
"Rn",
1405 "Ac",
"Th",
"Pa",
"U",
"Np",
"Pu",
"Am",
"Cm",
"Bk",
"Cf",
"Es",
"Fm",
"Md",
"No",
"Lr",
1406 "Rf",
"Db",
"Sg",
"Bh",
"Hs",
"Mt",
"Ds",
"Rg",
1407 "Cn",
"Uut",
"Fl",
"Uup",
"Lv",
"Uus",
"Uuo"
1442 G4cout <<
"G4IonTable::AddProcessManager() : can not create ion of "
1444 <<
" because GenericIon is not available!!" <<
G4endl;
1446 "Can not create ions because GenericIon is not available");
1463 if (name == fIsotopeTable->
GetName())
return;
1474 if ( index < fIsotopeTableList->
size() ) {
1475 fIsotopeTable = (*fIsotopeTableList)[index];
1477 return fIsotopeTable;
1510 property = fIsotopeTable->
GetIsotope(Z,A,lvl);
1558 if ( (index >=0) && (index <
Entries()) ) {
1559 G4IonList::iterator idx =
fIonList->begin();
1562 if ( counter == index ) {
1571 G4cout <<
" G4IonTable::GetParticle"
1572 <<
" invalid index (=" << index <<
")"
1582 if (!
IsIon(particle))
return false;
1589 if (encoding !=0 ) {
1592 if (particle == i->second ) {
1629 G4double anExcitaionEnergy = ((
const G4Ions*)(ion))->GetExcitationEnergy();
1630 if ( std::fabs( E - anExcitaionEnergy )<
tolerance) {
1647 if (L==0)
return FindIon(Z,A,E,J);
1662 G4double anExcitaionEnergy = ((
const G4Ions*)(ion))->GetExcitationEnergy();
1663 if ( std::fabs( E - anExcitaionEnergy )<
tolerance) {
1692 if ( ((
const G4Ions*)(ion))->GetIsomerLevel() == lvl) {
1709 if (L==0)
return FindIon(Z,A,lvl);
1723 if ( ((
const G4Ions*)(ion))->GetIsomerLevel() == lvl) {
1750 "Method is invoked before G4IonTable is initialized.");
1754 if(!isoP)
return -1001.0;
G4int GetParticleDefinitionID() const
void InitializeLightIons()
G4double GetMagneticMoment() const
static const G4ParticleDefinition * p_triton
void RegisterIsotopeTable(G4VIsotopeTable *table)
static std::vector< G4VIsotopeTable * > * fIsotopeTableListShadow
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4DecayTable * GetDecayTable() const
void SetParticleDefinitionID(G4int id=-1)
G4double GetExcitationEnergy() const
std::ostringstream G4ExceptionDescription
void SetAntiPDGEncoding(G4int aEncoding)
const G4String & GetName() const
G4int GetAtomicNumber() const
void PrepareNuclideTable()
void DumpTable(const G4String &particle_name="ALL") const
static const G4ParticleDefinition * p_alpha
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
G4ParticleDefinition * GetDaughter(G4int anIndex)
void Remove(const G4ParticleDefinition *particle)
G4double GetIsomerMass(G4int Z, G4int A, G4int lvl=0) const
static G4bool IsIon(const G4ParticleDefinition *)
G4bool IsLightAntiIon(const G4ParticleDefinition *) const
G4VIsotopeTable * GetIsotopeTable(size_t idx=0) const
void InsertWorker(const G4ParticleDefinition *particle)
static G4bool IsAntiIon(const G4ParticleDefinition *)
static G4int GetNucleusEncoding(G4int Z, G4int A, G4double E=0.0, G4int lvl=0)
G4int GetVerboseLevel() const
G4int GetIsomerLevel() const
G4VDecayChannel * GetDecayChannel(G4int index) const
static G4ThreadLocal std::vector< G4VIsotopeTable * > * fIsotopeTableList
static const G4ParticleDefinition * p_proton
G4IsotopeProperty * GetIsotopeByIndex(size_t idx) const
G4ParticleDefinition * GetGenericIon() const
G4ProcessManager * GetProcessManager() const
G4IsotopeProperty * FindIsotope(G4int Z, G4int A, G4double E) const
#define G4MUTEX_INITIALIZER
static G4bool GetNucleusByEncoding(G4int encoding, G4int &Z, G4int &A, G4double &E, G4int &lvl)
const G4String & GetParticleName() const
const G4String & GetIonName(G4int Z, G4int A, G4int lvl=0) const
G4int GetAtomicNumber() const
G4bool IsGeneralIon() const
void Insert(const G4ParticleDefinition *particle)
static G4IonList * fIonListShadow
static G4StateManager * GetStateManager()
G4ParticleDefinition * CreateIon(G4int Z, G4int A, G4double E)
G4GLOB_DLL std::ostream G4cout
virtual G4IsotopeProperty * GetIsotope(G4int Z, G4int A, G4double E)=0
std::multimap< G4int, const G4ParticleDefinition * > G4IonList
G4double GetEnergy() const
static const G4ParticleDefinition * p_He3
G4double GetIonMass(G4int Z, G4int A, G4int L=0, G4int lvl=0) const
G4int GetQuarkContent(G4int flavor) const
const G4String & GetParticleType() const
G4ApplicationState GetCurrentState() const
G4bool IsMultithreadedApplication()
virtual G4IsotopeProperty * GetIsotope(G4int Z, G4int A, G4double E)
static const G4double A[nN]
void AddProcessManager(G4ParticleDefinition *)
static const G4ParticleDefinition * p_triton
G4int GetAtomicMass() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4bool Contains(const G4ParticleDefinition *particle) const
static G4NuclideTable * GetNuclideTable()
G4ParticleDefinition * FindIon(G4int Z, G4int A, G4int lvl=0)
G4NuclideTable * pNuclideTable
G4double GetPDGMass() const
static G4ParticleTable * GetParticleTable()
static const G4ParticleDefinition * p_deuteron
static const G4ParticleDefinition * p_alpha
static const G4ParticleDefinition * p_He3
static const G4double tolerance
static G4ThreadLocal G4IonList * fIonList
G4double GetPDGLifeTime() const
G4double GetLifeTime(const G4ParticleDefinition *) const
G4double GetNucleusMass(G4int Z, G4int A, G4int L=0, G4int lvl=0) const
G4ParticleDefinition * GetLightAntiIon(G4int Z, G4int A) const
static const G4ParticleDefinition * p_proton
static const double eplus
G4ParticleDefinition * GetLightIon(G4int Z, G4int A) const
G4ParticleDefinition * FindIonInMaster(G4int Z, G4int A, G4int lvl=0)
G4bool IsLightIon(const G4ParticleDefinition *) const
static G4double Round(G4double eex)
G4int GetVerboseLevel() const
std::multimap< G4int, const G4ParticleDefinition * >::iterator G4IonListIterator
G4int GetAtomicMass() const
G4double GetLifeTime() const
void SetPDGMagneticMoment(G4double mageticMoment)
G4int GetBaryonNumber() const
static const G4String elementName[numberOfElements]
static G4double GetNuclearMass(G4int A, G4int Z, G4int L)
static const G4ParticleDefinition * p_deuteron
G4ParticleDefinition * GetParticle(G4int index) const