11 #include "KVNucleus.h"
13 #include "KVNDTManager.h"
14 #include "KVLifeTime.h"
15 #include "KVMassExcess.h"
16 #include "KVAbundance.h"
17 #include "KVChargeRadius.h"
18 #include "KVSpinParity.h"
31 std::mutex _kvnucleus_mutex;
40 #define MAXZ_ELEMENT_SYMBOL 118
41 Char_t KVNucleus::fElements[][3] = {
42 "n",
"H",
"He",
"Li",
"Be",
"B",
"C",
"N",
"O",
43 "F",
"Ne",
"Na",
"Mg",
"Al",
"Si",
"P",
"S",
"Cl",
"Ar",
"K",
"Ca",
45 "Ti",
"V",
"Cr",
"Mn",
"Fe",
"Co",
"Ni",
"Cu",
"Zn",
"Ga",
"Ge",
"As",
47 "Kr",
"Rb",
"Sr",
"Y",
"Zr",
"Nb",
"Mo",
"Tc",
"Ru",
"Rh",
"Pd",
"Ag",
49 "In",
"Sn",
"Sb",
"Te",
"I",
"Xe",
"Cs",
"Ba",
"La",
"Ce",
"Pr",
"Nd",
51 "Sm",
"Eu",
"Gd",
"Tb",
"Dy",
"Ho",
"Er",
"Tm",
"Yb",
"Lu",
"Hf",
"Ta",
53 "Re",
"Os",
"Ir",
"Pt",
"Au",
"Hg",
"Tl",
"Pb",
"Bi",
"Po",
"At",
"Rn",
55 "Ra",
"Ac",
"Th",
"Pa",
"U",
"Np",
"Pu",
"Am",
"Cm",
"Bk",
"Cf",
"Es",
57 "No",
"Lr",
"Rf",
"Db",
"Sg",
"Bh",
"Hs",
"Mt",
"Ds",
"Rg",
"Cn",
"Ed",
82 Bool_t Mpfx = strcmp(opt,
"EL");
83 if (0 <= GetZ() && GetZ() <= MAXZ_ELEMENT_SYMBOL) {
84 if (Mpfx) symname.
Form(
"%d%s",
a, fElements[z]);
85 else symname = fElements[z];
90 return symname.
Data();
116 if (0 <= GetZ() && GetZ() <= MAXZ_ELEMENT_SYMBOL) {
117 if (!strcmp(opt,
"ALL")) symname.
Form(
"{}^{%d}_{%d}%s",
a, z, fElements[z]);
118 else if (!strcmp(opt,
"EL")) GetSymbol(opt);
119 else symname.
Form(
"^{%d}%s",
a, fElements[z]);
124 return symname.
Data();
151 if (sscanf(tmp.
Data(),
"%d%s", &A,
name) == 2) {
157 Int_t z = GetZFromSymbol(tmp);
182 if (sscanf(tmp.
Data(),
"%d%s", &A,
name) == 2) {
184 if (SetZFromSymbol(
name) > -1) SetA(A);
187 else if (sscanf(tmp.
Data(),
"%s",
name) == 1) {
189 if (SetZFromSymbol(
name) == -1) MakeZombie();
203 for (
int i = 0; i <= MAXZ_ELEMENT_SYMBOL; i++) {
204 if (!strcmp(
sym, fElements[i])) {
247 std::lock_guard<std::mutex> lk(_kvnucleus_mutex);
250 fMassFormula = kBetaMass;
278 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
322 if (z != 0 &&
a == 0) {
398 KVNucleus::~KVNucleus()
757 cout <<
"Z=" <<
GetZ() <<
" A=" <<
GetA() <<
" ";
808 return ((
Int_t) fA + 255);
826 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
839 ((
KVNucleus&) obj).SetMassFormula(fMassFormula);
851 if (z == -1) z =
GetZ();
1056 return (life < 0. ? 1.e+100 : life);
1233 if (z == -1) z =
GetZ();
1240 if (abund > abmax) {
1285 return gNDTManager->
IsInTable(z,
a,
"MassExcess");
1351 if (
a == 0)
return 0;
1401 if (zz == -1) zz =
GetZ();
1409 while (!nla.
End()) {
1425 if (zz == -1) zz =
GetZ();
1433 while (!nla.
End()) {
1460 for (
Int_t zz = zmin; zz <= zmax; zz += 1) {
1463 while (!nla.
End()) {
1481 if (zz == -1) zz =
GetZ();
1486 while (!nla.
End()) {
1567 if (zres < 0 || ares < 0 || eres < 0) {
1569 "Cannot subtract nuclei, resulting Z=%d A=%d E=%lf", zres, ares, eres);
1640 Double_t AUX = 1. + (9. * XJJ / 4. / QQ / X13);
1641 Double_t EE3 = XJJ * A * SI * SI / AUX;
1643 AVOL * A + ASUR *
TMath::Power(A, 2. / 3.) + AC * X13 + AZER;
1644 Double_t TOTA = EE1 + EE2 + EE3 + EE4;
1645 return (939.55 * XNEU + 938.77 *
Z - TOTA);
1769 if (ChargeState == 0) ChargeState =
GetZ();
1771 Double_t X = Brho * C_mparns * ChargeState;
1789 if (!nuc)
return 0.;
1821 Ztot += nuc->
GetZ();
1822 Atot += nuc->
GetA();
1903 vrel =
sqrt(2 * TKE / mu) *
C();
1918 return 0.755 * z1 * z2 / (
pow(a1, 1 / 3.) +
pow(a2, 1 / 3.)) + 7.3;
1930 return 0.1189 * za + 7.3;
1942 return 0.1071 * za + 22.2;
1961 return 0.104 * za + 24.3;
1975 return 39.43 + .085 *
pow(zp + zt, 2) /
pow(ap + at, 1. / 3.);
2045 while (!isotopes.
End()) {
2047 int A = isotopes.
Next();
2049 if (abundance > 0.) {
2050 Aeff += A * abundance;
2055 if (wtot > 0) Aeff /= wtot;
2089 Double_t vel = GetVelocity().Mag();
2108 return 0.04 *
GetZ();
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Value of the relative abundance of isotopes.
static void InitEnvironment()
Simple class for storing charge radius information of nuclei.
Simple class to store lifetime information of nucleus.
Bool_t IsAResonance() const
Simple class for store life time information of nucleus.
Nuclear Data Table manager.
Bool_t IsInTable(Int_t zz, Int_t aa, const Char_t *name) const
Double_t GetValue(Int_t zz, Int_t aa, const Char_t *name) const
KVNuclData * GetData(Int_t zz, Int_t aa, const Char_t *name) const
Double_t GetValue() const
Description of properties and kinematics of atomic nuclei.
Double_t ShimaChargeStatePrecision() const
static Double_t hbar
hbar*c in MeV.fm
const Char_t * GetSymbol(Option_t *opt="") const
void Copy(TObject &) const override
Copy this KVNucleus into the KVNucleus object referenced by "obj".
void SetExcitEnergy(Double_t e)
Double_t GetExtraChargeRadius(Int_t z=-1, Int_t a=-1, Int_t rct=2) const
static Double_t LiquidDrop_BrackGuet(UInt_t A, UInt_t Z)
void Clear(Option_t *opt="") override
Double_t GetWidth() const
static Double_t TKE_Viola1985(Double_t z, Double_t a)
from: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
void CheckZAndA(Int_t &z, Int_t &a) const
static Int_t GetNFromZ(Double_t, Char_t mt)
Calculate neutron number from the element's atomic number Z.
void Print(Option_t *t="") const override
Display nucleus parameters.
Bool_t IsKnown(int z=-1, int a=-1) const
static Double_t GetRealAFromZ(Double_t, Char_t mt)
Double_t GetSpin(Int_t z=-1, Int_t a=-1) const
Double_t GetExcitEnergy() const
Double_t GetFissionTKE(const KVNucleus *nuc=0, Int_t formula=kDefaultFormula) const
Double_t GetMassExcess(Int_t z=-1, Int_t a=-1) const
KVMassExcess * GetMassExcessPtr(Int_t z=-1, Int_t a=-1) const
KVAbundance * GetAbundancePtr(Int_t z=-1, Int_t a=-1) const
static Double_t GetRealNFromZ(Double_t, Char_t mt)
KVNucleus operator+(const KVNucleus &rhs)
void SetZandN(Int_t z, Int_t n)
Set atomic number and mass number.
static Int_t IsMassGiven(const Char_t *)
KVNucleus & operator=(const KVNucleus &rhs)
KVNucleus assignment operator.
Double_t GetMassGS() const
static Double_t kMe
electron mass in MeV/c2
void SetZ(Int_t z, Char_t mt=-1)
Double_t LiquidDrop_Weizsacker()
Int_t GetMostAbundantA(Int_t z=-1) const
KVNucleus & operator+=(const KVNucleus &rhs)
KVNucleus addition and assignment operator.
Double_t GetNaturalA(Int_t zz=-1) const
Double_t GetFissionVelocity(KVNucleus *nuc=0, Int_t formula=kDefaultFormula)
static Double_t TKE_Itkis1998(Double_t z, Double_t a)
Int_t GetAWithMaxBindingEnergy(Int_t z=-1)
KVNumberList GetKnownARange(Int_t z=-1, Double_t tmin=0) const
Double_t GetExtraMassExcess(Int_t z=-1, Int_t a=-1) const
static Double_t e2
e^2/(4.pi.epsilon_0) in MeV.fm
Double_t GetRelativeVelocity(KVNucleus *nuc)
Return the reltive velocity between nuc and this in cm/ns.
const Char_t * GetIsotopesList(Int_t zmin, Int_t zmax, Double_t tmin=0) const
Double_t GetBindingEnergyPerNucleon(Int_t z=-1, Int_t a=-1) const
Returns binding energy in MeV/A for this nucleus.
Int_t GetN() const
Return the number of neutron.
KVNucleus & operator-=(const KVNucleus &rhs)
KVNucleus subtraction and assignment operator.
KVSpinParity * GetSpinParityPtr(Int_t z=-1, Int_t a=-1) const
Int_t Compare(const TObject *obj) const override
Bool_t IsResonance() const
Double_t DeduceEincFromBrho(Double_t Brho, Int_t ChargeState=0)
TH2F* GetKnownNucleiChart(KVString method="GetBindingEnergyPerNucleon");.
Double_t ShimaChargeState(Int_t) const
static Double_t kAMU
atomic mass unit in MeV
int SetZFromSymbol(const Char_t *)
void SetZandA(Int_t z, Int_t a)
Set atomic number and mass number.
const Char_t * GetLatexSymbol(Option_t *opt="") const
Int_t GetNpairs(Int_t type=kNN) const
KVNumberList GetMeasuredARange(Int_t z=-1) const
returns range of a measured mass for a given element
void SetZAandE(Int_t z, Int_t a, Double_t ekin)
Set atomic number, mass number, and kinetic energy in MeV.
Double_t GetQFasymTKE(KVNucleus *target)
KVChargeRadius * GetChargeRadiusPtr(Int_t z=-1, Int_t a=-1) const
static Double_t TKE_Hinde1987(Double_t z1, Double_t a1, Double_t z2, Double_t a2)
Double_t GetAbundance(Int_t z=-1, Int_t a=-1) const
static Int_t GetZFromSymbol(const Char_t *)
KVLifeTime * GetLifeTimePtr(Int_t z=-1, Int_t a=-1) const
Double_t GetEnergyPerNucleon() const
Double_t GetParity(Int_t z=-1, Int_t a=-1) const
static Int_t GetAFromZ(Double_t, Char_t mt)
Double_t GetAtomicMass(Int_t zz=-1, Int_t aa=-1) const
Bool_t IsStable(Double_t min_lifetime=1.0e+15) const
Double_t GetBindingEnergy(Int_t z=-1, Int_t a=-1) const
Int_t GetZ() const
Return the number of proton / atomic number.
Double_t GetLiquidDropBindingEnergy(Int_t z=-1, Int_t a=-1) const
static Double_t TKE_Viola1966(Double_t z, Double_t a)
from: V. E. Viola, Jr., Nuclear Data Sheets. Section A 1, 391 (1965).
static Double_t TKE_Kozulin2014(Double_t zp, Double_t zt, Double_t ap, Double_t at)
Double_t GetChargeRadius(Int_t z=-1, Int_t a=-1) const
Double_t GetLifeTime(Int_t z=-1, Int_t a=-1) const
Strings used to represent a set of ranges of values.
void SetMinMax(Int_t min, Int_t max, Int_t pas=1)
Set list with all values from 'min' to 'max'.
void Add(Int_t)
Add value 'n' to the list.
Base class for relativistic kinematics of massive particles.
virtual void SetMass(Double_t m)
TVector3 GetMomentum() const
void SetMomentum(const TVector3 &v)
Double_t GetEnergy() const
void SetKE(Double_t ecin)
void Copy(TObject &) const override
void Set4Mom(const TLorentzVector &p)
void Clear(Option_t *opt="") override
Reset particle properties i.e. before creating/reading a new event.
void Print(Option_t *t="") const override
print out characteristics of particle
TVector3 GetVelocity() const
returns velocity vector in cm/ns units
Spin parity assignment of nuclear levels.
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
virtual Version_t ReadVersion(UInt_t *start=nullptr, UInt_t *bcnt=nullptr, const TClass *cl=nullptr)=0
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=nullptr)=0
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
TLorentzVector operator-() const
void Streamer(TBuffer &) override
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
R__ALWAYS_INLINE Bool_t IsZombie() const
const char * Data() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
void Form(const char *fmt,...)
TString & Remove(EStripType s, char c)
Expr< UnaryOp< Sqrt< T >, SMatrix< T, D, D2, R >, T >, T, D, D2, R > sqrt(const SMatrix< T, D, D2, R > &rhs)
RVec< PromoteTypes< T0, T1 > > pow(const T0 &x, const RVec< T1 > &v)
RVec< PromoteType< T > > exp(const RVec< T > &v)
void Error(UserClass p, const char *location, const char *va_(fmt),...)
void Warning(UserClass p, const char *location, const char *va_(fmt),...)
TMatrixT< Double_t > as(SEXP)
constexpr Double_t Ccgs()
Double_t Sign(Double_t a, Double_t b)
constexpr Double_t Hbarcgs()
Double_t Power(Double_t x, Double_t y)
Double_t Sqrt(Double_t x)
Double_t Max(Double_t a, Double_t b)
#define sym(otri1, otri2)