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
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 Error("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);
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) {
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;
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;
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;
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 
1520 
1522 {
1523  // KVNucleus addition operator.
1524  // Add two nuclei together to form a compound nucleus whose Z, A, momentum
1525  // and excitation energy are calculated from energy and momentum conservation.
1526 
1527  KVNucleus& lhs = *this;
1528  Int_t ztot = lhs.GetZ() + rhs.GetZ();
1529  Int_t atot = lhs.GetA() + ((KVNucleus&) rhs).GetA();
1530  KVNucleus CN(ztot, atot);
1531 
1532  Double_t etot = lhs.E() + rhs.E();
1533  TVector3 ptot = lhs.GetMomentum() + rhs.GetMomentum();
1534  TLorentzVector q(ptot, etot);
1535  CN.Set4Mom(q);
1536 
1537  return CN;
1538 
1539 }
1540 
1541 
1542 
1543 
1550 
1552 {
1553  // KVNucleus subtraction operator.
1554  // If the LHS is a compound nucleus and the RHS an emitted nucleus
1555  // (which may or may not be excited) then the result of the subtraction
1556  // is the residual nucleus, with recoil and residual excitation calculated
1557  // by conservation laws.
1558 
1559  KVNucleus& lhs = *this;
1560  Int_t zres = lhs.GetZ() - rhs.GetZ();
1561  Int_t ares = lhs.GetA() - ((KVNucleus&) rhs).GetA();
1562  Double_t eres = lhs.E() - rhs.E();
1563  TVector3 pres = lhs.GetMomentum() - rhs.GetMomentum();
1564 
1565  if (zres < 0 || ares < 0 || eres < 0) {
1566  Warning("operator-(const KVNucleus &rhs)",
1567  "Cannot subtract nuclei, resulting Z=%d A=%d E=%lf", zres, ares, eres);
1568  KVNucleus RES;
1569  RES.Clear();
1570  return RES;
1571  }
1572  else {
1573  KVNucleus RES(zres, ares); //mass of nucleus includes mass excess
1574  TLorentzVector q(pres, eres);
1575  RES.Set4Mom(q);
1576  return RES;
1577  }
1578 }
1579 
1580 
1581 
1582 
1585 
1587 {
1588  //KVNucleus addition and assignment operator.
1589 
1590  KVNucleus temp = (*this) + rhs;
1591  (*this) = temp;
1592  return *this;
1593 }
1594 
1595 
1596 
1597 
1600 
1602 {
1603  //KVNucleus subtraction and assignment operator.
1604 
1605  KVNucleus temp = (*this) - rhs;
1606  (*this) = temp;
1607  return *this;
1608 }
1609 
1610 
1611 
1612 
1616 
1618 {
1619  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1620  //Parameters are from Brack and Guet (copied from Simon code)
1621 
1622  Double_t A = (Double_t) aa;
1623  Double_t Z = (Double_t) zz;
1624  Double_t AVOL = 15.776;
1625  Double_t ASUR = -17.22;
1626  Double_t AC = -10.24;
1627  Double_t AZER = 8.;
1628  Double_t XJJ = -30.03;
1629  Double_t QQ = -35.4;
1630  Double_t C1 = -.737;
1631  Double_t C2 = 1.28;
1632 
1633  Double_t XNEU = A - Z;
1634  Double_t SI = (XNEU - Z) / A;
1635  Double_t X13 = TMath::Power(A, 1. / 3.);
1636  Double_t EE1 = C1 * Z * Z / X13;
1637  Double_t EE2 = C2 * Z * Z / A;
1638  Double_t AUX = 1. + (9. * XJJ / 4. / QQ / X13);
1639  Double_t EE3 = XJJ * A * SI * SI / AUX;
1640  Double_t EE4 =
1641  AVOL * A + ASUR * TMath::Power(A, 2. / 3.) + AC * X13 + AZER;
1642  Double_t TOTA = EE1 + EE2 + EE3 + EE4;
1643  return (939.55 * XNEU + 938.77 * Z - TOTA);
1644 }
1645 
1646 
1647 
1648 
1652 
1654 {
1655  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1656  //Parameters are from Brack and Guet (copied from Simon code)
1657 
1658  Double_t av = 1.531e+01;
1659  Double_t as = 1.654e+01;
1660  Double_t ac = 6.882e-01;
1661  Double_t aa = 2.225e+01;
1662  Double_t ap = 9.399e+00;
1663  Double_t kap = 6.056e-01;
1664 
1665  Double_t eb = 0;
1666  eb += av * GetA();
1667  eb -= as * TMath::Power(GetA(), 2. / 3.);
1668  eb -= ac * GetZ() * (GetZ() - 1) / TMath::Power(GetA(), 1. / 3.);
1669  eb -= aa * TMath::Power(GetN() - GetZ(), 2.) / GetA();
1670 
1671  if (TMath::Even(GetA()))
1672  eb += ap * (TMath::Power(-1, GetN()) + TMath::Power(-1, GetZ())) / TMath::Power(GetA(), kap);
1673 
1674  return eb;
1675 
1676 }
1677 
1678 
1679 
1680 
1684 
1686 {
1687  //For sorting lists of nuclei according to their Z
1688  //Largest Z appears first in list
1689 
1690  if (GetZ() > ((KVNucleus*) obj)->GetZ()) {
1691  return -1;
1692  }
1693  else if (GetZ() < ((KVNucleus*) obj)->GetZ()) {
1694  return 1;
1695  }
1696  else {
1697  if (GetA() == ((KVNucleus*) obj)->GetA()) return 0;
1698  else if (GetA() > ((KVNucleus*) obj)->GetA()) return -1;
1699  else return 1;
1700  }
1701 }
1702 
1703 
1704 /*
1705 TH2F* KVNucleus::GetKnownNucleiChart(KVString method)
1706 {
1707  //Draw nuclei chart of tabulated nuclei and tagged as known in KaliVeda
1708  //The 2D histogram (AvsZ) has to be deleted by the user
1709  //Each content cell correponds to the method passed in argument of nucleus in MeV
1710  // Method Pattern has to be Double_t Method() or Double_t Method(obs = default value) in KVNucleus.h
1711 TH2F* chart = new TH2F("nuclei_known_charts",method.Data(),
1712  121,-0.5,120.5,
1713  351,-0.5,350.5);
1714 chart->SetXTitle("Atomic Number");
1715 chart->SetYTitle("Mass Number");
1716 
1717 TMethodCall *mt = new TMethodCall();
1718 mt->InitWithPrototype(this->IsA(),Form("%s",method.Data()),"");
1719 if (! mt->IsValid()) { delete mt; return 0; }
1720 delete mt;
1721 KVNucleus* ntemp = new KVNucleus();
1722 for (Int_t zz=0;zz<120;zz+=1){
1723  for (Int_t aa=0;aa<350;aa+=1){
1724  if (this->IsKnown(zz,aa)){
1725  mt = new TMethodCall();
1726  mt->InitWithPrototype(ntemp->IsA(),Form("%s",method.Data()),"");
1727  if (mt->ReturnType()==TMethodCall::kDouble){
1728  ntemp->SetZ(zz); ntemp->SetA(aa);
1729  Double_t ret; mt->Execute(ntemp,"",ret);
1730  chart->Fill(zz,aa,ret);
1731  }
1732  delete mt;
1733  }
1734  }
1735 }
1736 delete ntemp;
1737 return chart;
1738 
1739 }
1740 */
1741 
1742 
1746 
1748 {
1749  //Atomic mass unit in MeV
1750  //Reference: 2002 CODATA recommended values Reviews of Modern Physics 77, 1-107 (2005)
1751  return kAMU;
1752 };
1753 
1754 
1755 
1756 
1760 
1762 {
1763  //Retourne l'energie cintetique totale (MeV) du noyau pour
1764  //une valeur de Brho et d'etat de charge (Si 0-> Etat de charge=Z)
1765  Double_t C_mparns = KVNucleus::C() * 10;
1766 
1767  if (ChargeState == 0) ChargeState = GetZ();
1768 
1769  Double_t X = Brho * C_mparns * ChargeState;
1770 
1771  Double_t MassIon = GetMass() - ChargeState * KVNucleus::kMe;
1772 
1773  Double_t Result = TMath::Sqrt(MassIon * MassIon + X * X) - MassIon;
1774 
1775  return Result;
1776 
1777 }
1778 
1779 
1780 
1783 
1785 {
1786  // Return the reltive velocity between nuc and this in cm/ns.
1787  if (!nuc) return 0.;
1788  return (GetVelocity() - nuc->GetVelocity()).Mag();
1789 }
1790 
1791 
1792 
1803 
1805 {
1806  // Average or most probable Total Kinetic Energy [MeV] expected for fission based on various systematics
1807  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1808  // If nuc=0, this method returns the TKE for symmetric fission of this nucleus.
1809  // Else, it returns the expected TKE considering that nuc and the current nucleus arise
1810  // from the fisson of a compound nucleus.
1811  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1812  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1813  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1814  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1815 
1816  Double_t Ztot = GetZ();
1817  Double_t Atot = GetA();
1818  if (nuc) {
1819  Ztot += nuc->GetZ();
1820  Atot += nuc->GetA();
1821  }
1822  Double_t tke = 0;
1823  switch (formula) {
1824  case kDefaultFormula:
1825  case kHinde1987:
1826  if (nuc) tke = TKE_Hinde1987(GetZ(), GetA(), nuc->GetZ(), nuc->GetA());
1827  else tke = TKE_Hinde1987(GetZ() * 0.5, GetA() * 0.5, GetZ() - (GetZ() * 0.5), GetA() - (GetA() * 0.5));
1828  break;
1829 
1830  case kViola1985:
1831  tke = TKE_Viola1985(Ztot, Atot);
1832  break;
1833 
1834  case kViola1966:
1835  tke = TKE_Viola1966(Ztot, Atot);
1836  break;
1837 
1838  case kItkis1998:
1839  tke = TKE_Itkis1998(Ztot, Atot);
1840  break;
1841  }
1842 
1843  return tke;
1844 }
1845 
1846 
1847 
1853 
1855 {
1856  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1857  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1858  // This depends on the entrance channel: this nucleus is assumed to be the projectile,
1859  // while the target is given as argument.
1860 
1861  return TKE_Kozulin2014(GetZ(), target->GetZ(), GetA(), target->GetA());
1862 }
1863 
1864 
1865 
1876 
1878 {
1879  // Average/most probable relative velocity [cm/ns] expected for fission based on various systematics
1880  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1881  // If nuc=0, this method returns the relative velocity expected for the symmetric fission of this nucleus.
1882  // Else, it returns the expected relative velocity considering that nuc and the current nucleus arise
1883  // from the fisson of a compound nucleus.
1884  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1885  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1886  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1887  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1888 
1889  Double_t vrel = 0;
1890  Double_t mu = 0;
1891  if (nuc) {
1892  mu = nuc->GetMass() * GetMass() / (nuc->GetMass() + GetMass());
1893  }
1894  else {
1895  KVNucleus ff1(0.5 * GetZ(), 0.5 * GetA());
1896  KVNucleus ff2(GetZ() - ff1.GetZ(), GetA() - ff1.GetA());
1897  mu = ff1.GetMass() * ff2.GetMass() / (ff1.GetMass() + ff2.GetMass());
1898  }
1899 
1900  Double_t TKE = GetFissionTKE(nuc, formula);
1901  vrel = sqrt(2 * TKE / mu) * C();
1902 
1903  return vrel;
1904 }
1905 
1906 
1907 
1911 
1913 {
1914  // from: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987)
1915  // According to the authors, an extension to asymmetric fission based on TKE_Viola1985
1916  return 0.755 * z1 * z2 / (pow(a1, 1 / 3.) + pow(a2, 1 / 3.)) + 7.3;
1917 }
1918 
1919 
1920 
1923 
1925 {
1926  // from: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1927  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1928  return 0.1189 * za + 7.3;
1929 }
1930 
1931 
1932 
1935 
1937 {
1938  // from: V. E. Viola, Jr., Nuclear Data Sheets. Section A 1, 391 (1965).
1939  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1940  return 0.1071 * za + 22.2;
1941 }
1942 
1943 
1944 
1949 
1951 {
1952  // from: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1953  // Compared to Viola systematics, only heavy-ion induced fission is considered
1954  // A change of slope is observed for Z**2/A**1/3 > 900
1955 
1956  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1957  if (za < 900)
1958  return 0.131 * za;
1959  return 0.104 * za + 24.3;
1960 }
1961 
1962 
1963 
1967 
1969 {
1970  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1971  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1972 
1973  return 39.43 + .085 * pow(zp + zt, 2) / pow(ap + at, 1. / 3.);
1974 }
1975 
1976 
1977 
1978 
1985 
1987 {
1988  // Returns kTRUE if this nucleus is stable.
1989  // Definition of stable:
1990  // if the natural abundance is defined (look up in Abundance table)
1991  // OR
1992  // if lifetime is > min_lifetime
1993  if (GetAbundance() > 0.) return kTRUE;
1994  KVLifeTime* ptr = GetLifeTimePtr();
1995  return (ptr && !ptr->IsAResonance() && ptr->GetValue() > min_lifetime);
1996 }
1997 
1998 
1999 
2000 
2004 
2006 {
2007  // Returns kTRUE if this nucleus is a resonance.
2008  // In this case GetWidth() returns the width in MeV.
2009  KVLifeTime* ptr = GetLifeTimePtr();
2010  return (ptr && ptr->IsAResonance());
2011 }
2012 
2013 
2014 
2015 
2019 
2021 {
2022  // Returns width of resonance in MeV, if this nucleus
2023  // is indeed a resonance (IsResonance() returns kTRUE).
2024  KVLifeTime* ptr = GetLifeTimePtr();
2025  return ((ptr && ptr->IsAResonance()) ? ptr->GetValue() : 0.0);
2026 }
2027 
2028 
2029 
2030 
2034 
2036 {
2037  // Calculate and return the effective mass number of element Z
2038  // taking into account the abundance of naturally-occurring isotopes
2039 
2040  KVNumberList isotopes = GetKnownARange(Z);
2041  isotopes.Begin();
2042  Double_t Aeff = 0, wtot = 0;
2043  while (!isotopes.End()) {
2044 
2045  int A = isotopes.Next();
2046  Double_t abundance = GetAbundance(Z, A) / 100.;
2047  if (abundance > 0.) {
2048  Aeff += A * abundance;
2049  wtot += abundance;
2050  }
2051 
2052  }
2053  if (wtot > 0) Aeff /= wtot;
2054  return Aeff;
2055 }
2056 
2057 
2058 //-------------------------
2060 //-------------------------
2061 
2073 
2074 {
2075  //Nuclear Instruments and Methods 200 (1982) 605-608
2076  //Shima et al
2077  // "The present formula is useful for the collision range"
2078  // Zprojectile>=8
2079  // 4<=Ztarget<=79
2080  // Eproj<=6 MeV/A
2081  // Precision DeltaQ/Zproj <0.04.
2082  //
2083 
2084  //v=sqrt((2*E*1.6022)/(A*1.66054))*10.;
2085  //X=v/((3.6)*pow(Z,0.45));
2086 
2087  Double_t vel = GetVelocity().Mag(); // (cm/ns)
2088  vel *= 10; // (mm/ns)
2089  Double_t X = vel / ((3.6) * pow(GetZ(), 0.45));
2090 
2091  Double_t Q = GetZ() * (1 - exp(-1.25 * X + 0.32 * TMath::Power(X, 2.) - 0.11 * TMath::Power(X, 3.)));
2092  Q *= (1 - 0.0019 * (Ztarget - 6) * TMath::Sqrt(X) + 0.00001 * TMath::Power(Ztarget - 6, 2.) * X); //Correction respect to the carbon
2093 
2094  return Q;
2095 
2096 }
2097 
2098 
2099 //-------------------------
2101 //-------------------------
2102 
2104 
2105 {
2106  return 0.04 * GetZ();
2107 }
2108 
2109 
2110 
2115 
2116 void KVNucleus::Streamer(TBuffer& R__b)
2117 {
2118  // Stream an object of class KVNucleus.
2119  //
2120  // Streamer customized to correct masses of nuclei in data written with version <7
2121 
2122  UInt_t R__s, R__c;
2123  if (R__b.IsReading()) {
2124  Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
2125  R__b.ReadClassBuffer(KVNucleus::Class(), this, R__v, R__s, R__c);
2126  if (R__v < 7) {
2127  // Before v7, nuclear masses were actually atomic masses, including the electrons
2128  double m = GetMass();
2129  SetMass(m - GetZ()*kMe);
2130  }
2131  }
2132  else {
2133  R__b.WriteClassBuffer(KVNucleus::Class(), this);
2134  }
2135 }
2136 
2137 
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:197
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
UChar_t fZ
nuclear charge number (atomic number)
Definition: KVNucleus.h:128
Double_t ShimaChargeStatePrecision() const
Definition: KVNucleus.cpp:2100
@ 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:1617
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:2020
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:1924
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
UChar_t fA
nuclear mass number
Definition: KVNucleus.h:127
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:1804
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:1747
KVNucleus operator+(const KVNucleus &rhs)
Definition: KVNucleus.cpp:1521
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:1653
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:1586
Double_t GetNaturalA(Int_t zz=-1) const
Definition: KVNucleus.cpp:2035
Double_t GetFissionVelocity(KVNucleus *nuc=0, Int_t formula=kDefaultFormula)
Definition: KVNucleus.cpp:1877
static Double_t TKE_Itkis1998(Double_t z, Double_t a)
Definition: KVNucleus.cpp:1950
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:1784
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:1601
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:1685
Bool_t IsResonance() const
Definition: KVNucleus.cpp:2005
Double_t DeduceEincFromBrho(Double_t Brho, Int_t ChargeState=0)
TH2F* GetKnownNucleiChart(KVString method="GetBindingEnergyPerNucleon");.
Definition: KVNucleus.cpp:1761
Double_t ShimaChargeState(Int_t) const
Definition: KVNucleus.cpp:2059
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:1854
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:1912
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
static Char_t fElements[][3]
symbols of chemical elements
Definition: KVNucleus.h:130
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:1986
UChar_t fMassFormula
mass formula for calculating A from Z
Definition: KVNucleus.h:129
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:1936
static Double_t TKE_Kozulin2014(Double_t zp, Double_t zt, Double_t ap, Double_t at)
Definition: KVNucleus.cpp:1968
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
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 SetMomentum(const TVector3 *v)
Definition: KVParticle.h:545
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
virtual void Warning(const char *method, const char *msgfmt,...) 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(const char *location, const char *fmt,...)
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)