KaliVeda
Toolkit for HIC analysis
KVNucleus.cpp
1 /***************************************************************************
2 $Id: KVNucleus.cpp,v 1.48 2009/04/02 09:32:55 ebonnet Exp $
3  * *
4  * This program is free software; you can redistribute it and/or modify *
5  * it under the terms of the GNU General Public License as published by *
6  * the Free Software Foundation; either version 2 of the License, or *
7  * (at your option) any later version. *
8  * *
9  ***************************************************************************/
10 
11 #include "KVNucleus.h"
12 #include "KVString.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"
19 
20 #include <KVBase.h>
21 
22 //Atomic mass unit in MeV
23 //Reference: 2002 CODATA recommended values Reviews of Modern Physics 77, 1-107 (2005)
24 Double_t KVNucleus::kAMU = 9.31494043e02;
25 Double_t KVNucleus::kMe = 0.510998;
26 // hbar*c in MeV.fm = 197.33....
28 // e^2/(4.pi.epsilon_0) in MeV.fm = 1.44... = hbar*alpha (fine structure constant)
29 Double_t KVNucleus::e2 = KVNucleus::hbar / 137.035999074;
30 
31 std::mutex _kvnucleus_mutex;
32 
33 using namespace std;
34 
36 
37 
39 
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",
44  "Sc",
45  "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As",
46  "Se", "Br",
47  "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag",
48  "Cd",
49  "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd",
50  "Pm",
51  "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta",
52  "W",
53  "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn",
54  "Fr",
55  "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es",
56  "Fm", "Md",
57  "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Ed",
58  "Fl", "Ef",
59  "Lv", "Eh", "Ei"
60 };
61 
62 
63 
70 
72 {
73  // Returns symbol of isotope corresponding to this nucleus,
74  // i.e. "238U", "12C", "3He" etc.
75  // Neutrons are represented by "n".
76  // In order to have just the symbol of the chemical element
77  // (e.g. "Pt", "Zn", "Fe"), call with opt="EL".
78 
79  Int_t a = GetA();
80  Int_t z = GetZ();
81  TString& symname = (TString&)fSymbolName;
82  Bool_t Mpfx = strcmp(opt, "EL"); // kTRUE if mass prefix required
83  if (0 <= GetZ() && GetZ() <= MAXZ_ELEMENT_SYMBOL) {
84  if (Mpfx) symname.Form("%d%s", a, fElements[z]);
85  else symname = fElements[z];
86  }
87  else
88  symname = "";
89 
90  return symname.Data();
91 }
92 
93 
102 
104 {
105  // Returns symbol of isotope corresponding to this nucleus,
106  // suitable for latex format in ROOT TLatex type class
107  // i.e. "^{238}U", "^{12}C", "^{3}He" etc.
108  // Neutrons are represented by "^{1}n".
109  // In order to have also the charge printed like this : ^{12}_{6}C
110  // call with opt="ALL".
111  // if you need only the chemical symbol, set opt="EL"
112 
113  Int_t a = GetA();
114  Int_t z = GetZ();
115  TString& symname = (TString&)fSymbolName;
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]);
120  }
121  else {
122  symname = "";
123  }
124  return symname.Data();
125 }
126 
127 
128 
136 
138 {
139  // test if the given string corresponds to the name of an isotope/element,
140  // and whether or not a mass is specified.
141  // isotope = symbol for element isotope, "C", "natSn", "13N", etc.
142  // if the mass of the isotope is given ("13N", "233U") we return the given mass
143  // if this is a valid element but no mass is given we return 0
144  // if this is not a valid isotope/element, we return -1
145 
146  Int_t A;
147  Char_t name[5];
148  TString tmp(isotope);
149  if (tmp.BeginsWith("nat"))
150  tmp.Remove(0, 3);
151  if (sscanf(tmp.Data(), "%d%s", &A, name) == 2) {
152  //name given in form "208Pb"
153  Int_t z = GetZFromSymbol(name);
154  if (z < 0) return z;
155  return A;
156  }
157  Int_t z = GetZFromSymbol(tmp);
158  if (z < 0) return z;
159  return 0;
160 }
161 
162 
163 
169 
170 void KVNucleus::Set(const Char_t* isotope)
171 {
172  // Set nucleus' Z & A using chemical symbol e.g. Set("12C") or Set("233U") etc.
173  //
174  // Any failure to deduce Z from the symbol will result in this object being made
175  // a zombie i.e. IsZombie() will return kTRUE
176 
177  Int_t A;
178  Char_t name[255];
179  TString tmp(isotope);
180  if (tmp.BeginsWith("nat"))
181  tmp.Remove(0, 3);
182  if (sscanf(tmp.Data(), "%d%s", &A, name) == 2) {
183  //name given in form "208Pb"
184  if (SetZFromSymbol(name) > -1) SetA(A);
185  else MakeZombie();
186  }
187  else if (sscanf(tmp.Data(), "%s", name) == 1) {
188  //name given in form "Pb"
189  if (SetZFromSymbol(name) == -1) MakeZombie();
190  }
191 }
192 
193 
194 
198 
200 {
201  //Returns Z of nucleus with given symbol i.e. "C" => Z=6, "U" => Z=92
202  //if unknown, returns -1
203  for (int i = 0; i <= MAXZ_ELEMENT_SYMBOL; i++) {
204  if (!strcmp(sym, fElements[i])) {
205  return i;
206  }
207  }
208  return -1;
209 }
210 
211 
212 
217 
219 {
220  // Set Z of nucleus with given symbol i.e. "C" => Z=6, "U" => Z=92
221  //
222  // Returns Z found, or -1 if symbol is unknown
223 
224  Int_t z = GetZFromSymbol(sym);
225  if (z > -1) SetZ(z);
226  else KVError::Error(this, "SetZFromSymbol", "%s is unknown", sym);
227  return z;
228 }
229 
230 
231 
232 
237 
239 {
240  // Default intialisations
241  // The mass formula is kBetaMass, i.e. the formula for the valley of beta-stability.
242  // Set up nuclear data table manager if not done already
243 
244  fZ = fA = 0;
245  KVBase::InitEnvironment(); // initialise environment i.e. read .kvrootrc
246  {
247  std::lock_guard<std::mutex> lk(_kvnucleus_mutex);
248  if (!gNDTManager) gNDTManager = new KVNDTManager;
249  }
250  fMassFormula = kBetaMass;
251 }
252 
253 
254 
259 
261 {
262  //
263  //Default constructor.
264  //
265 
266  init();
267 }
268 
269 
270 
273 
275 {
276  //copy ctor
277  init();
278 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
279  obj.Copy(*this);
280 #else
281  ((KVNucleus&) obj).Copy(*this);
282 #endif
283 }
284 
285 
286 
290 
292 {
293  // Reset nucleus' properties: set A and Z to zero.
294  // For other properties, see KVParticle::Clear
295 
296  KVParticle::Clear(opt);
297  ResetBit(kIsHeavy);
298  fZ = fA = 0;
299 }
300 
301 
302 
310 
312 {
313  //Create a nucleus with atomic number Z.
314  //
315  //If the mass number A is not given, A is calculated using the
316  //parametrisation determined by the value of fMassFormula (see KVNucleus::GetAFromZ).
317  //
318  //ekin is the kinetic energy in MeV
319 
320  init();
321  fZ = (UChar_t) z;
322  if (z != 0 && a == 0) {
323  SetA(GetAFromZ(z, fMassFormula));
324  }
325  else {
326  SetA(a);
327  }
328  SetKE(ekin);
329 }
330 
331 
332 
339 
340 KVNucleus::KVNucleus(const Char_t* symbol, Double_t EperA)
341 {
342  // Create a nucleus defined by symbol e.g. "12C", "34Mg", "42Si" etc. etc.
343  //
344  // If symbol is not valid, will be made a zombie (IsZombie() returns kTRUE)
345  //
346  // The second argument is the kinetic energy per nucleon (E/A) in MeV/A unit
347 
348  init();
349  Set(symbol);
350  if (!IsZombie()) SetKE(EperA * GetA());
351 }
352 
353 
354 
361 
363 {
364 
365  //Create nucleus with given Z, kinetic energy t and direction p
366  //(p is a unit vector in the desired direction. See KVPosition for methods
367  //for generating such vectors).
368  //The mass number A is calculated from Z. See KVNucleus::GetAFromZ.
369  //
370  init();
371  fZ = (UChar_t) z;
372  SetA(GetAFromZ(z, fMassFormula));
373  SetMomentum(t, p);
374 }
375 
376 
377 
382 
384 {
385  //
386  //Create nucleus with given Z, A, and 3-momentum p
387  //
388  init();
389  fZ = (UChar_t) z;
390  SetA(a);
391  SetMomentum(p);
392 }
393 
394 
395 
397 
398 KVNucleus::~KVNucleus()
399 {
400  fZ = fA = 0;
401 }
402 
403 
404 
405 
439 
441 {
442  //Calculate nuclear mass number from the element's atomic number Z.
443  //This value is not rounded off, we just return the result of one of the following formulae:
444  //
445  //mt = KVNucleus::kVedaMass
446  //__________________________
447  //Veda - A calculated using the formula
448  // fA = (1.867*fZ+.016*fZ*fZ-1.07E-4*fZ*fZ*fZ);
449  // This corresponds to the amass.f subroutine of the old INDRA Veda
450  // calibration programme. This formula was supposed to represent
451  // the Z-dependence of isotope masses in the beta-stability valley,
452  // but is in fact a rather poor approximation, especially for large Z.
453  //
454  //mt = KVNucleus::kBetaMass
455  //_________________________
456  //Beta (default) - An improved parametrisation of the beta-stability valley,
457  // correct even for heavy nuclei up to 238U. The formula is the result
458  // of a fit to 8 stable nuclear masses from Ne20 up to U238.
459  // fA = (.2875 + 1.7622 *Z + .013879 * Z * Z - .000054875 * Z * Z * Z);
460  //
461  //mt = KVNucleus::kEALMass
462  //________________________
463  //EAL - parametrisation of the Evaporation Attractor Line (residue corridor)
464  // due to R.J. Charity (PRC 58(1998)1073) (eq 2)
465  // fA = (2.072*Z + 2.32E-03 * Z*Z) ;
466  //
467  //mt = KVNucleus::kEALResMass
468  //________________________
469  //EALRes - R.J. Charity ---- improvement of EAL parametrisation for
470  // Heavy Residue (QP for instance) (PRC 58(1998)1073) (eq 7)
471  // fA = (2.045*Z + 3.57E-03 * Z*Z) ;
472  //
473  //mt = any other value: A=2*Z
474 
475  Double_t A;
476  switch (mt) {
477 
478  case kVedaMass:
479  A = (1.867 * Z + .016 * TMath::Power(Z, 2.) -
480  1.07E-4 * TMath::Power(Z, 3.));
481  break;
482 
483  case kBetaMass:
484  A = (.2875 + 1.7622 * Z + .013879 * TMath::Power(Z, 2.) -
485  .000054875 * TMath::Power(Z, 3.));
486  break;
487 
488  case kEALMass:
489  A = (2.072 * Z + 2.32E-03 * TMath::Power(Z, 2.));
490  break;
491 
492  case kEALResMass:
493  A = (2.045 * Z + 3.57E-03 * TMath::Power(Z, 2.));
494  break;
495 
496  default:
497  A = 2. * Z;
498  }
499 
500  return A;
501 }
502 
503 
504 
509 
511 {
512  //Calculate neutron number from the element's atomic number Z.
513  //This value is not rounded off, we just return the result
514  //obtain from the chosen mass formula (mt)
515  return GetRealAFromZ(Z, mt) - Z;
516 
517 }
518 
519 
559 
561 {
562  //Calculate nuclear mass number from the element's atomic number Z.
563  //Used by default to set fA and fMass if fA not given.
564  //For light nuclei (Z<6) the values are given (not calculated) and
565  //correspond to: p, alpha, 7Li, 9Be, 11B.
566  //For heavier nuclei, several prescriptions are available
567  //by giving one of the following values to argument mt:
568  //
569  //mt = KVNucleus::kVedaMass
570  //__________________________
571  //Veda - A calculated using the formula
572  // fA = TMath::Nint(1.867*fZ+.016*fZ*fZ-1.07E-4*fZ*fZ*fZ);
573  // This corresponds to the amass.f subroutine of the old INDRA Veda
574  // calibration programme. These are the masses used in the first
575  // INDRA campaigns.
576  // For light nuclei (Z<6) the values are given (not calculated) and
577  // correspond to: p, alpha, 6Li, 8Be, 10B.
578  //
579  //mt = KVNucleus::kBetaMass
580  //_________________________
581  //Beta (default) - An improved parametrisation of the beta-stability valley,
582  // correct even for heavy nuclei up to 238U. The formula is the result
583  // of a fit to 8 stable nuclear masses from Ne20 up to U238. From carbon-12 onwards,
584  // the mass is calculated using
585  // fA = (Int_t) (.2875 + 1.7622 *Z + .013879 * Z * Z - .000054875 * Z * Z * Z) + 1;
586  //
587  //mt = KVNucleus::kEALMass
588  //________________________
589  //EAL - parametrisation of the Evaporation Attractor Line (residue corridor)
590  // due to R.J. Charity (PRC 58(1998)1073).
591  // fA = (Int_t)(2.072*Z + 2.32E-03 * Z*Z) + 1; (eq 2)
592  //
593  //mt = KVNucleus::kEALResMass
594  //________________________
595  //EALRes - R.J. Charity ---- improvement of EAL parametrisation for
596  // Heavy Residues (QP for instance) (PRC 58(1998)1073) (eq 7)
597  // fA = (Int_t)(2.045*Z + 3.57E-03 * Z*Z) + 1 ;
598  //
599  //mt = any other value: A=2*Z
600 
601  Int_t A = 0;
602  Int_t z = (Int_t) Z;
603  switch (z) { // masses for lightest nuclei
604  case 1:
605  A = 1;
606  break;
607  case 2:
608  A = 4;
609  break;
610  case 3:
611  A = (mt == kVedaMass ? 6 : 7);
612  break;
613  case 4:
614  A = (mt == kVedaMass ? 8 : 9);
615  break;
616  case 5:
617  A = (mt == kVedaMass ? 10 : 11);
618  break;
619  default:
620  if (mt == kVedaMass)
622  else
623  A = (Int_t) KVNucleus::GetRealAFromZ(Z, mt) + 1;
624  }
625  return A;
626 }
627 
628 
631 
633 {
634  //Calculate neutron number from the element's atomic number Z.
635  return GetAFromZ(Z, mt) - Int_t(Z);
636 
637 }
638 
639 
640 
650 
652 {
653  //Set mass number
654  //Be careful not to call SetZ() after SetA(), as SetZ() will
655  //reset the mass number according to one of the available
656  //parametrisations of A as a function of Z.
657  //
658  //For A>255 the kIsHeavy flag is set. Then fA will equal A-255,
659  //and GetA will return fA+255.
660  //If A<=255 the flag is reset.
661 
662  if (a > 255) {
663  fA = (UChar_t)(a - 255);
664  SetBit(kIsHeavy);
665  }
666  else {
667  fA = (UChar_t) a;
668  ResetBit(kIsHeavy);
669  }
670  SetMass(GetMassGS());
671 }
672 
673 
680 
682 {
683  //Set mass number
684  //Be careful not to call SetZ() after SetN(), as SetZ() will
685  //reset the neutron number according to one of the available
686  //parametrisations of A (N+Z) as a function of Z.
687  //
688  Int_t z = GetZ();
689  SetA(z + n);
690 }
691 
692 
693 
699 
701 {
702  //Set atomic number
703  //The mass number fA is automatically calculated and set using GetAFromZ().
704  //The optional EMassType argument allows to change the default parametrisation
705  //used for calculating A from Z.
706  fZ = (UChar_t) z;
707  if (mt > -1)
708  fMassFormula = mt;
709  SetA(GetAFromZ(z, fMassFormula));
710 }
711 
712 
713 
716 
718 {
719  //Set atomic number and mass number
720  SetZ(z);
721  SetA(a);
722 }
723 
724 
725 
728 
730 {
731  //Set atomic number, mass number, and kinetic energy in MeV
732  SetZ(z);
733  SetA(a);
734  SetKE(ekin);
735 }
736 
737 
738 
741 
743 {
744  //Set atomic number and mass number
745  SetZ(z);
746  SetN(n);
747 }
748 
749 
750 
753 
755 {
756  // Display nucleus parameters
757  cout << "Z=" << GetZ() << " A=" << GetA() << " ";
758  if (GetExcitEnergy() > 1.e-10) cout << "E*=" << GetExcitEnergy() << " ";
760 }
761 
762 
763 
766 
768 {
769  //Return the number of proton / atomic number
770  return (Int_t) fZ;
771 }
772 
773 
774 
777 
779 {
780  //Return the number of neutron
781  return (Int_t)(GetA() - GetZ());
782 }
783 
784 
785 
795 
797 {
798  //Returns mass number (A) of nucleus.
799  //
800  //The actual member variable (fA) is a UChar_t and so limited to values 0-255.
801  //In case nuclei with larger A are needed (for example in calculations of 2-body
802  //scattering, a temporary nucleus corresponding to the sum of the entrance channel
803  //nuclei is used in order to find the outgoing target-like from the outgoing
804  //projectile-like) the flag "kIsHeavy" is set and GetA returns the value (fA+255).
805  //For this reason you should always use GetA and not fA.
806 
807  if (TestBit(kIsHeavy))
808  return ((Int_t) fA + 255);
809  return (Int_t) fA;
810 }
811 
812 
814 
816 {
817 
818  if (type == kNN) return GetA() * (GetA() - 1) / 2;
819  else if (type == knn) return GetN() * (GetN() - 1) / 2;
820  else if (type == kpp) return GetZ() * (GetZ() - 1) / 2;
821  else if (type == knp) return GetZ() * GetN();
822  else return 0;
823 }
824 
825 
826 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
827 
830 
831 void KVNucleus::Copy(TObject& obj) const
832 #else
833 void KVNucleus::Copy(TObject& obj)
834 #endif
835 {
836  //Copy this KVNucleus into the KVNucleus object referenced by "obj"
837  KVParticle::Copy(obj);
838  ((KVNucleus&) obj).SetZ(GetZ());
839  ((KVNucleus&) obj).SetMassFormula(fMassFormula);
840  ((KVNucleus&) obj).SetA(((KVNucleus*) this)->GetA());
841  ((KVNucleus&) obj).SetExcitEnergy(((KVNucleus*) this)->
842  GetExcitEnergy());
843 }
844 
845 
846 
848 
850 {
851  if (z == -1) z = GetZ();
852  if (a == -1) a = GetA();
853 
854 }
855 
856 
857 
861 
863 {
864  // Define excitation energy of nucleus in MeV.
865  // The rest mass of the nucleus is changed: m0 -> m0 + E*
866 
867  SetMass(GetMassGS() + ex);
868 }
869 
870 
871 
872 
879 
881 {
882  //Returns mass excess value in MeV for this nucleus.
883  //If optional arguments (z,a) are given we return the value for the
884  //required nucleus.
885  //If the nucleus is not included in the mass table, an extrapolated value
886  //using KVNucleus::LiquidDrop_BrackGuet is returned.
887 
888  CheckZAndA(z, a);
889 
890  Double_t val = gNDTManager->GetValue(z, a, "MassExcess");
891  if (val == -555) val = GetExtraMassExcess(z, a);
892  else {
893  // subtract electron mass from experimental atomic mass
894  val -= z * kMe;
895  }
896  return val;
897 }
898 
899 
900 
906 
908 {
909  //Calculate the extrapoled mass excess value
910  // from the LiquidDrop_BrackGuet formula
911  //If optional arguments (z,a) are given we return the value for the
912  //required nucleus.
913 
914  CheckZAndA(z, a);
915  return (LiquidDrop_BrackGuet(a, z) - a * kAMU);
916 
917 }
918 
919 
920 
925 
927 {
928  // Returns the mass of an isotope in unified atomic mass units
929  // (KVNucleus::u() MeV/c**2).
930  // This number is also the mass in grammes of 1 mole of this isotope.
931  CheckZAndA(zz, aa);
932  return aa + GetMassExcess(zz, aa) / u();
933 }
934 
935 
936 
937 
943 
945 {
946  //Returns pointer of corresponding KVMassExcess object
947  //0 if the Z,A couple is not in the table
948  //If optional arguments (z,a) are given we return the value for the
949  //required nucleus.
950  CheckZAndA(z, a);
951  return (KVMassExcess*)gNDTManager->GetData(z, a, "MassExcess");
952 
953 }
954 
955 
956 
957 
963 
965 {
966  //Returns pointer of corresponding KVSpinParity object
967  //0 if the Z,A couple is not in the table
968  //If optional arguments (z,a) are given we return the value for the
969  //required nucleus.
970  CheckZAndA(z, a);
971  return (KVSpinParity*)gNDTManager->GetData(z, a, "SpinParity");
972 
973 }
974 
975 
976 
977 
983 
985 {
986  //Returns spin value for this nucleus.
987  //If optional arguments (z,a) are given we return the value for the
988  //required nucleus.
989  //If the nucleus is not included in the mass table, -1 is returned
990 
991  CheckZAndA(z, a);
992 
993  Double_t val = gNDTManager->GetValue(z, a, "SpinParity");
994  if (val == -555)
995  return -1;
996  return TMath::Abs(val);
997 
998 }
999 
1000 
1001 
1002 
1008 
1010 {
1011  //Returns parity value (-1 or +1) for this nucleus.
1012  //If optional arguments (z,a) are given we return the value for the
1013  //required nucleus.
1014  //If the nucleus is not included in the mass table, O is returned
1015 
1016  CheckZAndA(z, a);
1017  Double_t val = gNDTManager->GetValue(z, a, "SpinParity");
1018  if (val == -555)
1019  return 0;
1020  return TMath::Sign(-1.0, val);
1021 
1022 }
1023 
1024 
1025 
1026 
1036 
1038 {
1039  //Returns life time in seconds (see KVLifeTime class for unit details).
1040  //For 'stable' nuclei (for which the abundance is known),
1041  //if no lifetime exists in the table we return 1.e+100.
1042  //For other "nuclei" with no known lifetime we return -1.
1043  //For resonances (IsResonance() returns kTRUE) we calculate the lifetime
1044  //from the width of the resonance, t = hbar/W.
1045  //If optional arguments (z,a) are given we return the value for the
1046  //required nucleus.
1047 
1048  CheckZAndA(z, a);
1049  KVLifeTime* lf = GetLifeTimePtr(z, a);
1050  if (!lf) {
1051  if (GetAbundance(z, a) > 0) return 1.e+100;
1052  return -1.0;
1053  }
1054  if (!lf->IsAResonance()) {
1055  Double_t life = lf->GetValue();
1056  return (life < 0. ? 1.e+100 : life);
1057  }
1058  Double_t life = ((hbar / TMath::Ccgs()) * 1.e-13) / lf->GetValue();
1059  return life;
1060 }
1061 
1062 
1063 
1064 
1065 
1070 
1072 {
1073  //Returns the pointeur of the life time object associated to this nucleus
1074  //If optional arguments (z,a) are given we return object for the
1075  //required nucleus.
1076 
1077  CheckZAndA(z, a);
1078  return (KVLifeTime*)gNDTManager->GetData(z, a, "LifeTime");
1079 
1080 }
1081 
1082 
1083 
1084 
1091 
1093 {
1094  //Returns charge radius in fm for tabulated nuclei
1095  //if not tabulated returns the extrapolated radius
1096  //calculate in GetExtraChargeRadius
1097  //If optional arguments (z,a) are given we return the value for the
1098  //required nucleus.
1099 
1100  CheckZAndA(z, a);
1102  if (!cr) {
1103  return GetExtraChargeRadius(z, a);
1104  }
1105  return cr->GetValue();
1106 
1107 }
1108 
1109 
1110 
1111 
1129 
1131 {
1132  //Calculate the extrapoled charge radius
1133  // Three formulae taken from Atomic Data and Nuclear Data Tables 87 (2004) 185-201
1134  // are proposed:
1135  // rct=2 (kELTON)take into account the finite surfacethickness
1136  // This rct=2 is set by default because it has the best reproduction of exp data
1137  //
1138  // rct=1 (kEMPFunc) is a purely emperical function re*A**ee
1139  // rct=0 (kLDModel) is the standard Liquid Drop model approximation
1140  //
1141  // Those formulae are valid for nuclei near the stability valley
1142  // other parametrization for xotic nuclei are proposed in the same reference
1143  // but needed extrapolation from given nuclei and I don't have time
1144  // to do it now
1145  //
1146  // If optional arguments (z,a) are given we return the value for the
1147  // required nucleus.
1148 
1149  CheckZAndA(z, a);
1150  Double_t R = 0;
1151  Double_t A = Double_t(a);
1152 
1153  Double_t rLD = 0.9542; //for kLDModel
1154 
1155  Double_t re = 1.153; //for kEMPFunc
1156  Double_t ee = 0.2938; //for kEMPFunc
1157 
1158  Double_t r0 = 0.9071; //for kELTON
1159  Double_t r1 = 1.105;
1160  Double_t r2 = -0.548;
1161 
1162  switch (rct) {
1163 
1164  case kLDModel:
1165  R = rLD * TMath::Power(A, 1. / 3.);
1166  break;
1167 
1168  case kEMPFunc:
1169  R = re * TMath::Power(A, ee);
1170  break;
1171 
1172  case kELTON:
1173  R = (r0 * TMath::Power(A, 1. / 3.) + r1 / TMath::Power(A, 1. / 3.) + r2 / A);
1174  break;
1175 
1176  }
1177 
1178  return R;
1179 
1180 }
1181 
1182 
1183 
1184 
1189 
1191 {
1192  //Returns the pointeur of charge radius object associated to this nucleus
1193  //If optional arguments (z,a) are given we return object for the
1194  //required nucleus.
1195 
1196  CheckZAndA(z, a);
1197  return (KVChargeRadius*)gNDTManager->GetData(z, a, "ChargeRadius");
1198 
1199 }
1200 
1201 
1202 
1203 
1208 
1210 {
1211  //Returns relative abundance value (see KVAbundance class for unit details).
1212  //If optional arguments (z,a) are given we return the value for the
1213  //required nucleus.
1214 
1215  CheckZAndA(z, a);
1216  return TMath::Max(0.0, gNDTManager->GetValue(z, a, "Abundance"));
1217 }
1218 
1219 
1220 
1221 
1226 
1228 {
1229  //Returns for a the Z of the current nucleus (z=-1) or the given z
1230  // most abundant A.
1231  //return -1 if no isotope of the given z have an abundance
1232  Int_t amost = -1;
1233  if (z == -1) z = GetZ();
1234  KVNumberList ll = GetKnownARange(z);
1235  ll.Begin();
1236  Double_t abmax = 0;
1237  while (!ll.End()) {
1238  Int_t a = ll.Next();
1239  Double_t abund = GetAbundance(z, a);
1240  if (abund > abmax) {
1241  abmax = abund;
1242  amost = a;
1243  }
1244  }
1245  return amost;
1246 }
1247 
1248 
1249 
1250 
1255 
1257 {
1258  //Returns the pointeur of the abundance object associated to this nucleus
1259  //If optional arguments (z,a) are given we return the object for the
1260  //required nucleus.
1261 
1262  CheckZAndA(z, a);
1263  return (KVAbundance*)gNDTManager->GetData(z, a, "Abundance");
1264 
1265 }
1266 
1267 
1268 
1269 
1275 
1276 Bool_t KVNucleus::IsKnown(int z, int a) const
1277 {
1278  //Old method, the answer is only valid for the mass excess table
1279  //Returns kTRUE if this nucleus or (z,a) is included in the mass table.
1280  //
1281  //We kept it for backward compatibility :
1282 
1283  CheckZAndA(z, a);
1284  //return fMassTable->IsKnown(z,a);
1285  return gNDTManager->IsInTable(z, a, "MassExcess");
1286 }
1287 
1288 
1289 
1290 
1298 
1300 {
1301  //Returns ground state binding energy in MeV for this nucleus.
1302  //The convention is : binding energy is positive if nucleus is bound.
1303  //If optional arguments (z,a) are given we return the binding energy for the
1304  //required nucleus.
1305  //If the nucleus is not included in the mass table, an extrapolated value
1306  //using KVNucleus::LiquidDrop_BrackGuet is returned.
1307 
1308  CheckZAndA(z, a);
1309 
1310  return a ==
1311  0 ? 0. : (z * GetMassExcess(1, 1) + (a - z) * GetMassExcess(0, 1) -
1312  GetMassExcess(z, a));
1313 }
1314 
1315 
1316 
1323 
1325 {
1326  // Returns ground state binding energy in MeV for this nucleus calculated from Brack & Guet
1327  // liquid drop formula (see KVNucleus::LiquiDrop_BrackGuet).
1328  // The convention is : binding energy is positive if nucleus is bound.
1329  // If optional arguments (z,a) are given we return the binding energy for the
1330  // required nucleus.
1331 
1332  CheckZAndA(z, a);
1333 
1334  return a ==
1335  0 ? 0. : (z * GetMassExcess(1, 1) + (a - z) * GetMassExcess(0, 1) -
1336  GetExtraMassExcess(z, a));
1337 }
1338 
1339 
1340 
1341 
1344 
1346 {
1347  //Returns binding energy in MeV/A for this nucleus.
1348 
1349  CheckZAndA(z, a);
1350 
1351  if (a == 0) return 0;
1352  return GetBindingEnergy(z, a) / a;
1353 }
1354 
1355 
1356 
1361 
1363 {
1364  //
1365  //Returns kinetic energy of nucleus per nucleon (in MeV/nucleon, donc)
1366  //
1367  return GetA() ? GetEnergy() / GetA() : GetEnergy();
1368 }
1369 
1370 
1371 
1372 
1377 
1379 {
1380  //
1381  //Returns kinetic energy of nucleus per nucleon (in MeV/nucleon, donc)
1382  //
1383  return GetEnergyPerNucleon();
1384 }
1385 
1386 
1387 
1388 
1394 
1396 {
1397  //returns range of a known mass for a given element
1398  //according to the lifetime in seconds
1399  //tmin=0 (default) include all nuclei with known lifetime
1400  //tmin=-1 include also nuclei for which lifetime is unknown
1401  if (zz == -1) zz = GetZ();
1402  KVNumberList nla;
1403  if (zz == 0)
1404  nla.Add(1);
1405  else
1406  nla.SetMinMax(TMath::Max(zz, 1), 6 * TMath::Max(zz, 1));
1407  KVNumberList nlb;
1408  nla.Begin();
1409  while (!nla.End()) {
1410  Int_t aa = nla.Next();
1411  if (IsKnown(zz, aa) && (GetLifeTime(zz, aa) >= tmin)) nlb.Add(aa);
1412  }
1413  return nlb;
1414 }
1415 
1416 
1417 
1420 
1422 {
1423  //returns range of a measured mass for a given element
1424 
1425  if (zz == -1) zz = GetZ();
1426  KVNumberList nla;
1427  if (zz == 0)
1428  nla.Add(1);
1429  else
1430  nla.SetMinMax(TMath::Max(zz, 1), 6 * TMath::Max(zz, 1));
1431  KVNumberList nlb;
1432  nla.Begin();
1433  while (!nla.End()) {
1434  Int_t aa = nla.Next();
1435  if (GetMassExcessPtr(zz, aa) && GetMassExcessPtr(zz, aa)->IsMeasured())
1436  nlb.Add(aa);
1437  }
1438  return nlb;
1439 
1440 }
1441 
1442 
1443 
1449 
1450 const Char_t* KVNucleus::GetIsotopesList(Int_t zmin, Int_t zmax, Double_t tmin) const
1451 {
1452  //returns list of isotopes separated by commas
1453  //for exemple 1H,2H,3H
1454  //according to the charge range and the lifetime in seconds
1455  //
1456  static KVString list;
1457  KVNucleus nn;
1458  KVNumberList nla;
1459  list = "";
1460  for (Int_t zz = zmin; zz <= zmax; zz += 1) {
1461  nla = GetKnownARange(zz, tmin);
1462  nla.Begin();
1463  while (!nla.End()) {
1464  Int_t aa = nla.Next();
1465  nn.SetZandA(zz, aa);
1466  list += nn.GetSymbol();
1467  list += ",";
1468  }
1469  }
1470  return list.Data();
1471 }
1472 
1473 
1474 
1475 
1477 
1479 {
1480 
1481  if (zz == -1) zz = GetZ();
1482  KVNumberList nla = GetKnownARange(zz);
1483  nla.Begin();
1484  Double_t emax = 0;
1485  Int_t amax = 0;
1486  while (!nla.End()) {
1487  Int_t aa = nla.Next();
1488  if (GetBindingEnergyPerNucleon(zz, aa) > emax) {
1489  emax = GetBindingEnergyPerNucleon(zz, aa);
1490  amax = aa;
1491  }
1492  }
1493  return amax;
1494 
1495 }
1496 
1497 
1498 
1499 
1502 
1504 {
1505  //KVNucleus assignment operator.
1506 
1507  if (&rhs != this) {
1508  rhs.Copy(*this);
1509  }
1510  return *this;
1511 }
1512 
1513 
1514 
1515 
1521 
1523 {
1524  // KVNucleus addition operator.
1525  //
1526  // Add two nuclei together to form a compound nucleus whose Z, A, momentum
1527  // and excitation energy are calculated from energy and momentum conservation.
1528 
1529  KVNucleus& lhs = *this;
1530  Int_t ztot = lhs.GetZ() + rhs.GetZ();
1531  Int_t atot = lhs.GetA() + ((KVNucleus&) rhs).GetA();
1532  KVNucleus CN(ztot, atot);
1533 
1534  Double_t etot = lhs.E() + rhs.E();
1535  TVector3 ptot = lhs.GetMomentum() + rhs.GetMomentum();
1536  TLorentzVector q(ptot, etot);
1537  CN.Set4Mom(q);
1538 
1539  return CN;
1540 
1541 }
1542 
1543 
1544 
1545 
1552 
1554 {
1555  // KVNucleus subtraction operator.
1556  // If the LHS is a compound nucleus and the RHS an emitted nucleus
1557  // (which may or may not be excited) then the result of the subtraction
1558  // is the residual nucleus, with recoil and residual excitation calculated
1559  // by conservation laws.
1560 
1561  KVNucleus& lhs = *this;
1562  Int_t zres = lhs.GetZ() - rhs.GetZ();
1563  Int_t ares = lhs.GetA() - ((KVNucleus&) rhs).GetA();
1564  Double_t eres = lhs.E() - rhs.E();
1565  TVector3 pres = lhs.GetMomentum() - rhs.GetMomentum();
1566 
1567  if (zres < 0 || ares < 0 || eres < 0) {
1568  KVError::Warning(this, "operator-(const KVNucleus &rhs)",
1569  "Cannot subtract nuclei, resulting Z=%d A=%d E=%lf", zres, ares, eres);
1570  KVNucleus RES;
1571  RES.Clear();
1572  return RES;
1573  }
1574  else {
1575  KVNucleus RES(zres, ares); //mass of nucleus includes mass excess
1576  TLorentzVector q(pres, eres);
1577  RES.Set4Mom(q);
1578  return RES;
1579  }
1580 }
1581 
1582 
1583 
1584 
1587 
1589 {
1590  //KVNucleus addition and assignment operator.
1591 
1592  KVNucleus temp = (*this) + rhs;
1593  (*this) = temp;
1594  return *this;
1595 }
1596 
1597 
1598 
1599 
1602 
1604 {
1605  //KVNucleus subtraction and assignment operator.
1606 
1607  KVNucleus temp = (*this) - rhs;
1608  (*this) = temp;
1609  return *this;
1610 }
1611 
1612 
1613 
1614 
1618 
1620 {
1621  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1622  //Parameters are from Brack and Guet (copied from Simon code)
1623 
1624  Double_t A = (Double_t) aa;
1625  Double_t Z = (Double_t) zz;
1626  Double_t AVOL = 15.776;
1627  Double_t ASUR = -17.22;
1628  Double_t AC = -10.24;
1629  Double_t AZER = 8.;
1630  Double_t XJJ = -30.03;
1631  Double_t QQ = -35.4;
1632  Double_t C1 = -.737;
1633  Double_t C2 = 1.28;
1634 
1635  Double_t XNEU = A - Z;
1636  Double_t SI = (XNEU - Z) / A;
1637  Double_t X13 = TMath::Power(A, 1. / 3.);
1638  Double_t EE1 = C1 * Z * Z / X13;
1639  Double_t EE2 = C2 * Z * Z / A;
1640  Double_t AUX = 1. + (9. * XJJ / 4. / QQ / X13);
1641  Double_t EE3 = XJJ * A * SI * SI / AUX;
1642  Double_t EE4 =
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);
1646 }
1647 
1648 
1649 
1650 
1654 
1656 {
1657  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1658  //Parameters are from Brack and Guet (copied from Simon code)
1659 
1660  Double_t av = 1.531e+01;
1661  Double_t as = 1.654e+01;
1662  Double_t ac = 6.882e-01;
1663  Double_t aa = 2.225e+01;
1664  Double_t ap = 9.399e+00;
1665  Double_t kap = 6.056e-01;
1666 
1667  Double_t eb = 0;
1668  eb += av * GetA();
1669  eb -= as * TMath::Power(GetA(), 2. / 3.);
1670  eb -= ac * GetZ() * (GetZ() - 1) / TMath::Power(GetA(), 1. / 3.);
1671  eb -= aa * TMath::Power(GetN() - GetZ(), 2.) / GetA();
1672 
1673  if (TMath::Even(GetA()))
1674  eb += ap * (TMath::Power(-1, GetN()) + TMath::Power(-1, GetZ())) / TMath::Power(GetA(), kap);
1675 
1676  return eb;
1677 
1678 }
1679 
1680 
1681 
1682 
1686 
1688 {
1689  //For sorting lists of nuclei according to their Z
1690  //Largest Z appears first in list
1691 
1692  if (GetZ() > ((KVNucleus*) obj)->GetZ()) {
1693  return -1;
1694  }
1695  else if (GetZ() < ((KVNucleus*) obj)->GetZ()) {
1696  return 1;
1697  }
1698  else {
1699  if (GetA() == ((KVNucleus*) obj)->GetA()) return 0;
1700  else if (GetA() > ((KVNucleus*) obj)->GetA()) return -1;
1701  else return 1;
1702  }
1703 }
1704 
1705 
1706 /*
1707 TH2F* KVNucleus::GetKnownNucleiChart(KVString method)
1708 {
1709  //Draw nuclei chart of tabulated nuclei and tagged as known in KaliVeda
1710  //The 2D histogram (AvsZ) has to be deleted by the user
1711  //Each content cell correponds to the method passed in argument of nucleus in MeV
1712  // Method Pattern has to be Double_t Method() or Double_t Method(obs = default value) in KVNucleus.h
1713 TH2F* chart = new TH2F("nuclei_known_charts",method.Data(),
1714  121,-0.5,120.5,
1715  351,-0.5,350.5);
1716 chart->SetXTitle("Atomic Number");
1717 chart->SetYTitle("Mass Number");
1718 
1719 TMethodCall *mt = new TMethodCall();
1720 mt->InitWithPrototype(this->IsA(),Form("%s",method.Data()),"");
1721 if (! mt->IsValid()) { delete mt; return 0; }
1722 delete mt;
1723 KVNucleus* ntemp = new KVNucleus();
1724 for (Int_t zz=0;zz<120;zz+=1){
1725  for (Int_t aa=0;aa<350;aa+=1){
1726  if (this->IsKnown(zz,aa)){
1727  mt = new TMethodCall();
1728  mt->InitWithPrototype(ntemp->IsA(),Form("%s",method.Data()),"");
1729  if (mt->ReturnType()==TMethodCall::kDouble){
1730  ntemp->SetZ(zz); ntemp->SetA(aa);
1731  Double_t ret; mt->Execute(ntemp,"",ret);
1732  chart->Fill(zz,aa,ret);
1733  }
1734  delete mt;
1735  }
1736  }
1737 }
1738 delete ntemp;
1739 return chart;
1740 
1741 }
1742 */
1743 
1744 
1748 
1750 {
1751  //Atomic mass unit in MeV
1752  //Reference: 2002 CODATA recommended values Reviews of Modern Physics 77, 1-107 (2005)
1753  return kAMU;
1754 };
1755 
1756 
1757 
1758 
1762 
1764 {
1765  //Retourne l'energie cintetique totale (MeV) du noyau pour
1766  //une valeur de Brho et d'etat de charge (Si 0-> Etat de charge=Z)
1767  Double_t C_mparns = KVNucleus::C() * 10;
1768 
1769  if (ChargeState == 0) ChargeState = GetZ();
1770 
1771  Double_t X = Brho * C_mparns * ChargeState;
1772 
1773  Double_t MassIon = GetMass() - ChargeState * KVNucleus::kMe;
1774 
1775  Double_t Result = TMath::Sqrt(MassIon * MassIon + X * X) - MassIon;
1776 
1777  return Result;
1778 
1779 }
1780 
1781 
1782 
1785 
1787 {
1788  // Return the reltive velocity between nuc and this in cm/ns.
1789  if (!nuc) return 0.;
1790  return (GetVelocity() - nuc->GetVelocity()).Mag();
1791 }
1792 
1793 
1794 
1805 
1807 {
1808  // Average or most probable Total Kinetic Energy [MeV] expected for fission based on various systematics
1809  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1810  // If nuc=0, this method returns the TKE for symmetric fission of this nucleus.
1811  // Else, it returns the expected TKE considering that nuc and the current nucleus arise
1812  // from the fisson of a compound nucleus.
1813  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1814  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1815  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1816  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1817 
1818  Double_t Ztot = GetZ();
1819  Double_t Atot = GetA();
1820  if (nuc) {
1821  Ztot += nuc->GetZ();
1822  Atot += nuc->GetA();
1823  }
1824  Double_t tke = 0;
1825  switch (formula) {
1826  case kDefaultFormula:
1827  case kHinde1987:
1828  if (nuc) tke = TKE_Hinde1987(GetZ(), GetA(), nuc->GetZ(), nuc->GetA());
1829  else tke = TKE_Hinde1987(GetZ() * 0.5, GetA() * 0.5, GetZ() - (GetZ() * 0.5), GetA() - (GetA() * 0.5));
1830  break;
1831 
1832  case kViola1985:
1833  tke = TKE_Viola1985(Ztot, Atot);
1834  break;
1835 
1836  case kViola1966:
1837  tke = TKE_Viola1966(Ztot, Atot);
1838  break;
1839 
1840  case kItkis1998:
1841  tke = TKE_Itkis1998(Ztot, Atot);
1842  break;
1843  }
1844 
1845  return tke;
1846 }
1847 
1848 
1849 
1855 
1857 {
1858  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1859  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1860  // This depends on the entrance channel: this nucleus is assumed to be the projectile,
1861  // while the target is given as argument.
1862 
1863  return TKE_Kozulin2014(GetZ(), target->GetZ(), GetA(), target->GetA());
1864 }
1865 
1866 
1867 
1878 
1880 {
1881  // Average/most probable relative velocity [cm/ns] expected for fission based on various systematics
1882  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1883  // If nuc=0, this method returns the relative velocity expected for the symmetric fission of this nucleus.
1884  // Else, it returns the expected relative velocity considering that nuc and the current nucleus arise
1885  // from the fisson of a compound nucleus.
1886  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1887  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1888  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1889  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1890 
1891  Double_t vrel = 0;
1892  Double_t mu = 0;
1893  if (nuc) {
1894  mu = nuc->GetMass() * GetMass() / (nuc->GetMass() + GetMass());
1895  }
1896  else {
1897  KVNucleus ff1(0.5 * GetZ(), 0.5 * GetA());
1898  KVNucleus ff2(GetZ() - ff1.GetZ(), GetA() - ff1.GetA());
1899  mu = ff1.GetMass() * ff2.GetMass() / (ff1.GetMass() + ff2.GetMass());
1900  }
1901 
1902  Double_t TKE = GetFissionTKE(nuc, formula);
1903  vrel = sqrt(2 * TKE / mu) * C();
1904 
1905  return vrel;
1906 }
1907 
1908 
1909 
1913 
1915 {
1916  // from: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987)
1917  // According to the authors, an extension to asymmetric fission based on TKE_Viola1985
1918  return 0.755 * z1 * z2 / (pow(a1, 1 / 3.) + pow(a2, 1 / 3.)) + 7.3;
1919 }
1920 
1921 
1922 
1925 
1927 {
1928  // from: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1929  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1930  return 0.1189 * za + 7.3;
1931 }
1932 
1933 
1934 
1937 
1939 {
1940  // from: V. E. Viola, Jr., Nuclear Data Sheets. Section A 1, 391 (1965).
1941  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1942  return 0.1071 * za + 22.2;
1943 }
1944 
1945 
1946 
1951 
1953 {
1954  // from: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1955  // Compared to Viola systematics, only heavy-ion induced fission is considered
1956  // A change of slope is observed for Z**2/A**1/3 > 900
1957 
1958  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1959  if (za < 900)
1960  return 0.131 * za;
1961  return 0.104 * za + 24.3;
1962 }
1963 
1964 
1965 
1969 
1971 {
1972  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1973  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1974 
1975  return 39.43 + .085 * pow(zp + zt, 2) / pow(ap + at, 1. / 3.);
1976 }
1977 
1978 
1979 
1980 
1987 
1989 {
1990  // Returns kTRUE if this nucleus is stable.
1991  // Definition of stable:
1992  // if the natural abundance is defined (look up in Abundance table)
1993  // OR
1994  // if lifetime is > min_lifetime
1995  if (GetAbundance() > 0.) return kTRUE;
1996  KVLifeTime* ptr = GetLifeTimePtr();
1997  return (ptr && !ptr->IsAResonance() && ptr->GetValue() > min_lifetime);
1998 }
1999 
2000 
2001 
2002 
2006 
2008 {
2009  // Returns kTRUE if this nucleus is a resonance.
2010  // In this case GetWidth() returns the width in MeV.
2011  KVLifeTime* ptr = GetLifeTimePtr();
2012  return (ptr && ptr->IsAResonance());
2013 }
2014 
2015 
2016 
2017 
2021 
2023 {
2024  // Returns width of resonance in MeV, if this nucleus
2025  // is indeed a resonance (IsResonance() returns kTRUE).
2026  KVLifeTime* ptr = GetLifeTimePtr();
2027  return ((ptr && ptr->IsAResonance()) ? ptr->GetValue() : 0.0);
2028 }
2029 
2030 
2031 
2032 
2036 
2038 {
2039  // Calculate and return the effective mass number of element Z
2040  // taking into account the abundance of naturally-occurring isotopes
2041 
2042  KVNumberList isotopes = GetKnownARange(Z);
2043  isotopes.Begin();
2044  Double_t Aeff = 0, wtot = 0;
2045  while (!isotopes.End()) {
2046 
2047  int A = isotopes.Next();
2048  Double_t abundance = GetAbundance(Z, A) / 100.;
2049  if (abundance > 0.) {
2050  Aeff += A * abundance;
2051  wtot += abundance;
2052  }
2053 
2054  }
2055  if (wtot > 0) Aeff /= wtot;
2056  return Aeff;
2057 }
2058 
2059 
2060 //-------------------------
2062 //-------------------------
2063 
2075 
2076 {
2077  //Nuclear Instruments and Methods 200 (1982) 605-608
2078  //Shima et al
2079  // "The present formula is useful for the collision range"
2080  // Zprojectile>=8
2081  // 4<=Ztarget<=79
2082  // Eproj<=6 MeV/A
2083  // Precision DeltaQ/Zproj <0.04.
2084  //
2085 
2086  //v=sqrt((2*E*1.6022)/(A*1.66054))*10.;
2087  //X=v/((3.6)*pow(Z,0.45));
2088 
2089  Double_t vel = GetVelocity().Mag(); // (cm/ns)
2090  vel *= 10; // (mm/ns)
2091  Double_t X = vel / ((3.6) * pow(GetZ(), 0.45));
2092 
2093  Double_t Q = GetZ() * (1 - exp(-1.25 * X + 0.32 * TMath::Power(X, 2.) - 0.11 * TMath::Power(X, 3.)));
2094  Q *= (1 - 0.0019 * (Ztarget - 6) * TMath::Sqrt(X) + 0.00001 * TMath::Power(Ztarget - 6, 2.) * X); //Correction respect to the carbon
2095 
2096  return Q;
2097 
2098 }
2099 
2100 
2101 //-------------------------
2103 //-------------------------
2104 
2106 
2107 {
2108  return 0.04 * GetZ();
2109 }
2110 
2111 
2112 
2117 
2118 void KVNucleus::Streamer(TBuffer& R__b)
2119 {
2120  // Stream an object of class KVNucleus.
2121  //
2122  // Streamer customized to correct masses of nuclei in data written with version <7
2123 
2124  UInt_t R__s, R__c;
2125  if (R__b.IsReading()) {
2126  Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
2127  R__b.ReadClassBuffer(KVNucleus::Class(), this, R__v, R__s, R__c);
2128  if (R__v < 7) {
2129  // Before v7, nuclear masses were actually atomic masses, including the electrons
2130  double m = GetMass();
2131  SetMass(m - GetZ()*kMe);
2132  }
2133  }
2134  else {
2135  R__b.WriteClassBuffer(KVNucleus::Class(), this);
2136  }
2137 }
2138 
2139 
int Int_t
unsigned int UInt_t
bool Bool_t
short Version_t
unsigned char UChar_t
char Char_t
double Double_t
constexpr Bool_t kTRUE
const char Option_t
#define X(type, name)
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
char name[80]
float * q
Value of the relative abundance of isotopes.
Definition: KVAbundance.h:16
static void InitEnvironment()
Definition: KVBase.cpp:196
Simple class for storing charge radius information of nuclei.
Simple class to store lifetime information of nucleus.
Definition: KVLifeTime.h:16
Bool_t IsAResonance() const
Definition: KVLifeTime.h:45
Simple class for store life time information of nucleus.
Definition: KVMassExcess.h:16
Nuclear Data Table manager.
Definition: KVNDTManager.h:22
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
Definition: KVNuclData.cpp:108
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:123
Double_t ShimaChargeStatePrecision() const
Definition: KVNucleus.cpp:2102
@ kHinde1987
Definition: KVNucleus.h:154
@ kViola1985
Definition: KVNucleus.h:155
@ kDefaultFormula
Definition: KVNucleus.h:152
@ kViola1966
Definition: KVNucleus.h:156
@ kItkis1998
Definition: KVNucleus.h:153
static Double_t hbar
hbar*c in MeV.fm
Definition: KVNucleus.h:169
const Char_t * GetSymbol(Option_t *opt="") const
Definition: KVNucleus.cpp:71
void Copy(TObject &) const override
Copy this KVNucleus into the KVNucleus object referenced by "obj".
Definition: KVNucleus.cpp:831
void SetExcitEnergy(Double_t e)
Definition: KVNucleus.cpp:862
Double_t GetExtraChargeRadius(Int_t z=-1, Int_t a=-1, Int_t rct=2) const
Definition: KVNucleus.cpp:1130
static Double_t LiquidDrop_BrackGuet(UInt_t A, UInt_t Z)
Definition: KVNucleus.cpp:1619
void Clear(Option_t *opt="") override
Definition: KVNucleus.cpp:291
void Set(const Char_t *)
Definition: KVNucleus.cpp:170
Double_t GetAMeV() const
Definition: KVNucleus.cpp:1378
Double_t GetWidth() const
Definition: KVNucleus.cpp:2022
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).
Definition: KVNucleus.cpp:1926
void CheckZAndA(Int_t &z, Int_t &a) const
Definition: KVNucleus.cpp:849
static Int_t GetNFromZ(Double_t, Char_t mt)
Calculate neutron number from the element's atomic number Z.
Definition: KVNucleus.cpp:632
void Print(Option_t *t="") const override
Display nucleus parameters.
Definition: KVNucleus.cpp:754
Bool_t IsKnown(int z=-1, int a=-1) const
Definition: KVNucleus.cpp:1276
static Double_t GetRealAFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:440
Double_t GetSpin(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:984
Double_t GetExcitEnergy() const
Definition: KVNucleus.h:279
Double_t GetFissionTKE(const KVNucleus *nuc=0, Int_t formula=kDefaultFormula) const
Definition: KVNucleus.cpp:1806
void init()
Definition: KVNucleus.cpp:238
Double_t GetMassExcess(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:880
KVMassExcess * GetMassExcessPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:944
KVAbundance * GetAbundancePtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1256
static Double_t GetRealNFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:510
static Double_t u(void)
Definition: KVNucleus.cpp:1749
KVNucleus operator+(const KVNucleus &rhs)
Definition: KVNucleus.cpp:1522
void SetZandN(Int_t z, Int_t n)
Set atomic number and mass number.
Definition: KVNucleus.cpp:742
Int_t GetA() const
Definition: KVNucleus.cpp:796
static Int_t IsMassGiven(const Char_t *)
Definition: KVNucleus.cpp:137
void SetA(Int_t a)
Definition: KVNucleus.cpp:651
KVNucleus & operator=(const KVNucleus &rhs)
KVNucleus assignment operator.
Definition: KVNucleus.cpp:1503
void SetN(Int_t n)
Definition: KVNucleus.cpp:681
Double_t GetMassGS() const
Definition: KVNucleus.h:286
static Double_t kMe
electron mass in MeV/c2
Definition: KVNucleus.h:167
void SetZ(Int_t z, Char_t mt=-1)
Definition: KVNucleus.cpp:700
Double_t LiquidDrop_Weizsacker()
Definition: KVNucleus.cpp:1655
Int_t GetMostAbundantA(Int_t z=-1) const
Definition: KVNucleus.cpp:1227
KVNucleus & operator+=(const KVNucleus &rhs)
KVNucleus addition and assignment operator.
Definition: KVNucleus.cpp:1588
Double_t GetNaturalA(Int_t zz=-1) const
Definition: KVNucleus.cpp:2037
Double_t GetFissionVelocity(KVNucleus *nuc=0, Int_t formula=kDefaultFormula)
Definition: KVNucleus.cpp:1879
static Double_t TKE_Itkis1998(Double_t z, Double_t a)
Definition: KVNucleus.cpp:1952
Int_t GetAWithMaxBindingEnergy(Int_t z=-1)
Definition: KVNucleus.cpp:1478
KVNumberList GetKnownARange(Int_t z=-1, Double_t tmin=0) const
Definition: KVNucleus.cpp:1395
@ kEALResMass
Definition: KVNucleus.h:142
Double_t GetExtraMassExcess(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:907
static Double_t e2
e^2/(4.pi.epsilon_0) in MeV.fm
Definition: KVNucleus.h:170
Double_t GetRelativeVelocity(KVNucleus *nuc)
Return the reltive velocity between nuc and this in cm/ns.
Definition: KVNucleus.cpp:1786
const Char_t * GetIsotopesList(Int_t zmin, Int_t zmax, Double_t tmin=0) const
Definition: KVNucleus.cpp:1450
Double_t GetBindingEnergyPerNucleon(Int_t z=-1, Int_t a=-1) const
Returns binding energy in MeV/A for this nucleus.
Definition: KVNucleus.cpp:1345
Int_t GetN() const
Return the number of neutron.
Definition: KVNucleus.cpp:778
KVNucleus & operator-=(const KVNucleus &rhs)
KVNucleus subtraction and assignment operator.
Definition: KVNucleus.cpp:1603
KVSpinParity * GetSpinParityPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:964
Int_t Compare(const TObject *obj) const override
Definition: KVNucleus.cpp:1687
Bool_t IsResonance() const
Definition: KVNucleus.cpp:2007
Double_t DeduceEincFromBrho(Double_t Brho, Int_t ChargeState=0)
TH2F* GetKnownNucleiChart(KVString method="GetBindingEnergyPerNucleon");.
Definition: KVNucleus.cpp:1763
Double_t ShimaChargeState(Int_t) const
Definition: KVNucleus.cpp:2061
static Double_t kAMU
atomic mass unit in MeV
Definition: KVNucleus.h:166
int SetZFromSymbol(const Char_t *)
Definition: KVNucleus.cpp:218
void SetZandA(Int_t z, Int_t a)
Set atomic number and mass number.
Definition: KVNucleus.cpp:717
const Char_t * GetLatexSymbol(Option_t *opt="") const
Definition: KVNucleus.cpp:103
Int_t GetNpairs(Int_t type=kNN) const
Definition: KVNucleus.cpp:815
KVNumberList GetMeasuredARange(Int_t z=-1) const
returns range of a measured mass for a given element
Definition: KVNucleus.cpp:1421
void SetZAandE(Int_t z, Int_t a, Double_t ekin)
Set atomic number, mass number, and kinetic energy in MeV.
Definition: KVNucleus.cpp:729
Double_t GetQFasymTKE(KVNucleus *target)
Definition: KVNucleus.cpp:1856
KVChargeRadius * GetChargeRadiusPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1190
static Double_t TKE_Hinde1987(Double_t z1, Double_t a1, Double_t z2, Double_t a2)
Definition: KVNucleus.cpp:1914
Double_t GetAbundance(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1209
static Int_t GetZFromSymbol(const Char_t *)
Definition: KVNucleus.cpp:199
KVLifeTime * GetLifeTimePtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1071
Double_t GetEnergyPerNucleon() const
Definition: KVNucleus.cpp:1362
Double_t GetParity(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1009
static Int_t GetAFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:560
Double_t GetAtomicMass(Int_t zz=-1, Int_t aa=-1) const
Definition: KVNucleus.cpp:926
Bool_t IsStable(Double_t min_lifetime=1.0e+15) const
Definition: KVNucleus.cpp:1988
Double_t GetBindingEnergy(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1299
Int_t GetZ() const
Return the number of proton / atomic number.
Definition: KVNucleus.cpp:767
Double_t GetLiquidDropBindingEnergy(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1324
static Double_t TKE_Viola1966(Double_t z, Double_t a)
from: V. E. Viola, Jr., Nuclear Data Sheets. Section A 1, 391 (1965).
Definition: KVNucleus.cpp:1938
static Double_t TKE_Kozulin2014(Double_t zp, Double_t zt, Double_t ap, Double_t at)
Definition: KVNucleus.cpp:1970
Double_t GetChargeRadius(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1092
Double_t GetLifeTime(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1037
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:85
void SetMinMax(Int_t min, Int_t max, Int_t pas=1)
Set list with all values from 'min' to 'max'.
Bool_t End(void) const
Definition: KVNumberList.h:199
void Begin(void) const
void Add(Int_t)
Add value 'n' to the list.
Int_t Next(void) const
Base class for relativistic kinematics of massive particles.
Definition: KVParticle.h:396
virtual void SetMass(Double_t m)
Definition: KVParticle.h:573
TVector3 GetMomentum() const
Definition: KVParticle.h:607
void SetMomentum(const TVector3 &v)
Definition: KVParticle.h:581
Double_t GetEnergy() const
Definition: KVParticle.h:624
static Double_t C()
Definition: KVParticle.cpp:117
void SetKE(Double_t ecin)
Definition: KVParticle.cpp:246
void Copy(TObject &) const override
Definition: KVParticle.cpp:286
void Set4Mom(const TLorentzVector &p)
Definition: KVParticle.h:592
void Clear(Option_t *opt="") override
Reset particle properties i.e. before creating/reading a new event.
Definition: KVParticle.cpp:327
void Print(Option_t *t="") const override
print out characteristics of particle
Definition: KVParticle.cpp:212
Double_t GetMass() const
Definition: KVParticle.h:577
TVector3 GetVelocity() const
returns velocity vector in cm/ns units
Spin parity assignment of nuclear levels.
Definition: KVSpinParity.h:16
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:73
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
Bool_t IsReading() const
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
Double_t X() const
TLorentzVector operator-() const
void Streamer(TBuffer &) override
static TClass * Class()
Double_t E() const
Double_t Z() const
void SetBit(UInt_t f)
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
R__ALWAYS_INLINE Bool_t IsZombie() const
void ResetBit(UInt_t f)
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)
const Int_t n
Double_t ex[n]
void Error(UserClass p, const char *location, const char *va_(fmt),...)
Definition: KVError.h:116
void Warning(UserClass p, const char *location, const char *va_(fmt),...)
Definition: KVError.h:125
TMatrixT< Double_t > as(SEXP)
void init()
constexpr Double_t Ccgs()
Int_t Nint(T x)
Double_t Sign(Double_t a, Double_t b)
constexpr Double_t Hbarcgs()
constexpr Double_t Qe()
Double_t Power(Double_t x, Double_t y)
Double_t Sqrt(Double_t x)
constexpr Double_t R()
Double_t Abs(Double_t d)
Double_t Max(Double_t a, Double_t b)
Bool_t Even(Long_t a)
TMarker m
TArc a
ClassImp(TPyArg)
#define sym(otri1, otri2)