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 "TObjArray.h"
14 #include "TObjString.h"
15 #include "Riostream.h"
16 #include "TSystem.h"
17 #include "TEnv.h"
18 #include "KVParticleCondition.h"
19 #include "Riostream.h"
20 #include "TMethodCall.h"
21 #include "TPluginManager.h"
22 #include "KVNDTManager.h"
23 
24 #include "KVLifeTime.h"
25 #include "KVMassExcess.h"
26 #include "KVAbundance.h"
27 #include "KVChargeRadius.h"
28 #include "KVSpinParity.h"
29 
30 //Atomic mass unit in MeV
31 //Reference: 2002 CODATA recommended values Reviews of Modern Physics 77, 1-107 (2005)
32 Double_t KVNucleus::kAMU = 9.31494043e02;
33 Double_t KVNucleus::kMe = 0.510998;
34 // hbar*c in MeV.fm = 197.33....
36 // e^2/(4.pi.epsilon_0) in MeV.fm = 1.44... = hbar*alpha (fine structure constant)
37 Double_t KVNucleus::e2 = KVNucleus::hbar / 137.035999074;
38 
39 using namespace std;
40 
42 
43 
44 
46 
47 
49 
50 #define MAXZ_ELEMENT_SYMBOL 118
52  "n", "H", "He", "Li", "Be", "B", "C", "N", "O",
53  "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca",
54  "Sc",
55  "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As",
56  "Se", "Br",
57  "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag",
58  "Cd",
59  "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd",
60  "Pm",
61  "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta",
62  "W",
63  "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn",
64  "Fr",
65  "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es",
66  "Fm", "Md",
67  "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Ed",
68  "Fl", "Ef",
69  "Lv", "Eh", "Ei"
70 };
71 
72 
73 
80 
82 {
83  // Returns symbol of isotope corresponding to this nucleus,
84  // i.e. "238U", "12C", "3He" etc.
85  // Neutrons are represented by "n".
86  // In order to have just the symbol of the chemical element
87  // (e.g. "Pt", "Zn", "Fe"), call with opt="EL".
88 
89  Int_t a = GetA();
90  Int_t z = GetZ();
91  TString& symname = (TString&)fSymbolName;
92  Bool_t Mpfx = strcmp(opt, "EL"); // kTRUE if mass prefix required
93  if (0 <= GetZ() && GetZ() <= MAXZ_ELEMENT_SYMBOL) {
94  if (Mpfx) symname.Form("%d%s", a, fElements[z]);
95  else symname = fElements[z];
96  }
97  else
98  symname = "";
99 
100  return symname.Data();
101 }
102 
103 
112 
114 {
115  // Returns symbol of isotope corresponding to this nucleus,
116  // suitable for latex format in ROOT TLatex type class
117  // i.e. "^{238}U", "^{12}C", "^{3}He" etc.
118  // Neutrons are represented by "^{1}n".
119  // In order to have also the charge printed like this : ^{12}_{6}C
120  // call with opt="ALL".
121  // if you need only the chemical symbol, set opt="EL"
122 
123  Int_t a = GetA();
124  Int_t z = GetZ();
125  TString& symname = (TString&)fSymbolName;
126  if (0 <= GetZ() && GetZ() <= MAXZ_ELEMENT_SYMBOL) {
127  if (!strcmp(opt, "ALL")) symname.Form("{}^{%d}_{%d}%s", a, z, fElements[z]);
128  else if (!strcmp(opt, "EL")) GetSymbol(opt);
129  else symname.Form("^{%d}%s", a, fElements[z]);
130  }
131  else {
132  symname = "";
133  }
134  return symname.Data();
135 }
136 
137 
138 
146 
148 {
149  // test if the given string corresponds to the name of an isotope/element,
150  // and whether or not a mass is specified.
151  // isotope = symbol for element isotope, "C", "natSn", "13N", etc.
152  // if the mass of the isotope is given ("13N", "233U") we return the given mass
153  // if this is a valid element but no mass is given we return 0
154  // if this is not a valid isotope/element, we return -1
155 
156  Int_t A;
157  Char_t name[5];
158  TString tmp(isotope);
159  if (tmp.BeginsWith("nat"))
160  tmp.Remove(0, 3);
161  if (sscanf(tmp.Data(), "%d%s", &A, name) == 2) {
162  //name given in form "208Pb"
163  Int_t z = GetZFromSymbol(name);
164  if (z < 0) return z;
165  return A;
166  }
167  Int_t z = GetZFromSymbol(tmp);
168  if (z < 0) return z;
169  return 0;
170 }
171 
172 
173 
179 
180 void KVNucleus::Set(const Char_t* isotope)
181 {
182  // Set nucleus' Z & A using chemical symbol e.g. Set("12C") or Set("233U") etc.
183  //
184  // Any failure to deduce Z from the symbol will result in this object being made
185  // a zombie i.e. IsZombie() will return kTRUE
186 
187  Int_t A;
188  Char_t name[255];
189  TString tmp(isotope);
190  if (tmp.BeginsWith("nat"))
191  tmp.Remove(0, 3);
192  if (sscanf(tmp.Data(), "%d%s", &A, name) == 2) {
193  //name given in form "208Pb"
194  if (SetZFromSymbol(name) > -1) SetA(A);
195  else MakeZombie();
196  }
197  else if (sscanf(tmp.Data(), "%s", name) == 1) {
198  //name given in form "Pb"
199  if (SetZFromSymbol(name) == -1) MakeZombie();
200  }
201 }
202 
203 
204 
208 
210 {
211  //Returns Z of nucleus with given symbol i.e. "C" => Z=6, "U" => Z=92
212  //if unknown, returns -1
213  for (int i = 0; i <= MAXZ_ELEMENT_SYMBOL; i++) {
214  if (!strcmp(sym, fElements[i])) {
215  return i;
216  }
217  }
218  return -1;
219 }
220 
221 
222 
227 
229 {
230  // Set Z of nucleus with given symbol i.e. "C" => Z=6, "U" => Z=92
231  //
232  // Returns Z found, or -1 if symbol is unknown
233 
234  Int_t z = GetZFromSymbol(sym);
235  if (z > -1) SetZ(z);
236  else Error("SetZFromSymbol", "%s is unknown", sym);
237  return z;
238 }
239 
240 
241 
242 
247 
249 {
250  // Default intialisations
251  // The mass formula is kBetaMass, i.e. the formula for the valley of beta-stability.
252  // Set up nuclear data table manager if not done already
253 
254  fZ = fA = 0;
255  if (!fNb_nuc) {
256  KVBase::InitEnvironment(); // initialise environment i.e. read .kvrootrc
257  if (!gNDTManager) gNDTManager = new KVNDTManager;
258  }
259  fMassFormula = kBetaMass;
260  fNb_nuc++;
261 }
262 
263 
264 
269 
271 {
272  //
273  //Default constructor.
274  //
275 
276  init();
277 }
278 
279 
280 
283 
285 {
286  //copy ctor
287  init();
288 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
289  obj.Copy(*this);
290 #else
291  ((KVNucleus&) obj).Copy(*this);
292 #endif
293 }
294 
295 
296 
300 
302 {
303  // Reset nucleus' properties: set A and Z to zero.
304  // For other properties, see KVParticle::Clear
305 
306  KVParticle::Clear(opt);
308  fZ = fA = 0;
309 }
310 
311 
312 
318 
320 {
321  //Create a nucleus with atomic number Z.
322  //If the mass number A is not given, A is calculated using the
323  //parametrisation determined by the value of fMassFormula (see KVNucleus::GetAFromZ).
324  //ekin is the kinetic energy in MeV
325 
326  init();
327  fZ = (UChar_t) z;
328  if (z != 0 && a == 0) {
330  }
331  else {
332  SetA(a);
333  }
334  SetKE(ekin);
335 }
336 
337 
338 
345 
346 KVNucleus::KVNucleus(const Char_t* symbol, Double_t EperA)
347 {
348  // Create a nucleus defined by symbol e.g. "12C", "34Mg", "42Si" etc. etc.
349  //
350  // If symbol is not valid, will be made a zombie (IsZombie() returns kTRUE)
351  //
352  // The second argument is the kinetic energy per nucleon (E/A) in MeV/A unit
353 
354  init();
355  Set(symbol);
356  if (!IsZombie()) SetKE(EperA * GetA());
357 }
358 
359 
360 
367 
369 {
370 
371  //Create nucleus with given Z, kinetic energy t and direction p
372  //(p is a unit vector in the desired direction. See KVPosition for methods
373  //for generating such vectors).
374  //The mass number A is calculated from Z. See KVNucleus::GetAFromZ.
375  //
376  init();
377  fZ = (UChar_t) z;
379  SetMomentum(t, p);
380 }
381 
382 
383 
388 
390 {
391  //
392  //Create nucleus with given Z, A, and 3-momentum p
393  //
394  init();
395  fZ = (UChar_t) z;
396  SetA(a);
397  SetMomentum(p);
398 }
399 
400 
401 
403 
404 KVNucleus::~KVNucleus()
405 {
406  fNb_nuc--;
407  fZ = fA = 0;
408 }
409 
410 
411 
412 
446 
448 {
449  //Calculate nuclear mass number from the element's atomic number Z.
450  //This value is not rounded off, we just return the result of one of the following formulae:
451  //
452  //mt = KVNucleus::kVedaMass
453  //__________________________
454  //Veda - A calculated using the formula
455  // fA = (1.867*fZ+.016*fZ*fZ-1.07E-4*fZ*fZ*fZ);
456  // This corresponds to the amass.f subroutine of the old INDRA Veda
457  // calibration programme. This formula was supposed to represent
458  // the Z-dependence of isotope masses in the beta-stability valley,
459  // but is in fact a rather poor approximation, especially for large Z.
460  //
461  //mt = KVNucleus::kBetaMass
462  //_________________________
463  //Beta (default) - An improved parametrisation of the beta-stability valley,
464  // correct even for heavy nuclei up to 238U. The formula is the result
465  // of a fit to 8 stable nuclear masses from Ne20 up to U238.
466  // fA = (.2875 + 1.7622 *Z + .013879 * Z * Z - .000054875 * Z * Z * Z);
467  //
468  //mt = KVNucleus::kEALMass
469  //________________________
470  //EAL - parametrisation of the Evaporation Attractor Line (residue corridor)
471  // due to R.J. Charity (PRC 58(1998)1073) (eq 2)
472  // fA = (2.072*Z + 2.32E-03 * Z*Z) ;
473  //
474  //mt = KVNucleus::kEALResMass
475  //________________________
476  //EALRes - R.J. Charity ---- improvement of EAL parametrisation for
477  // Heavy Residue (QP for instance) (PRC 58(1998)1073) (eq 7)
478  // fA = (2.045*Z + 3.57E-03 * Z*Z) ;
479  //
480  //mt = any other value: A=2*Z
481 
482  Double_t A;
483  switch (mt) {
484 
485  case kVedaMass:
486  A = (1.867 * Z + .016 * TMath::Power(Z, 2.) -
487  1.07E-4 * TMath::Power(Z, 3.));
488  break;
489 
490  case kBetaMass:
491  A = (.2875 + 1.7622 * Z + .013879 * TMath::Power(Z, 2.) -
492  .000054875 * TMath::Power(Z, 3.));
493  break;
494 
495  case kEALMass:
496  A = (2.072 * Z + 2.32E-03 * TMath::Power(Z, 2.));
497  break;
498 
499  case kEALResMass:
500  A = (2.045 * Z + 3.57E-03 * TMath::Power(Z, 2.));
501  break;
502 
503  default:
504  A = 2. * Z;
505  }
506 
507  return A;
508 }
509 
510 
511 
516 
518 {
519  //Calculate neutron number from the element's atomic number Z.
520  //This value is not rounded off, we just return the result
521  //obtain from the chosen mass formula (mt)
522  return GetRealAFromZ(Z, mt) - Z;
523 
524 }
525 
526 
566 
568 {
569  //Calculate nuclear mass number from the element's atomic number Z.
570  //Used by default to set fA and fMass if fA not given.
571  //For light nuclei (Z<6) the values are given (not calculated) and
572  //correspond to: p, alpha, 7Li, 9Be, 11B.
573  //For heavier nuclei, several prescriptions are available
574  //by giving one of the following values to argument mt:
575  //
576  //mt = KVNucleus::kVedaMass
577  //__________________________
578  //Veda - A calculated using the formula
579  // fA = TMath::Nint(1.867*fZ+.016*fZ*fZ-1.07E-4*fZ*fZ*fZ);
580  // This corresponds to the amass.f subroutine of the old INDRA Veda
581  // calibration programme. These are the masses used in the first
582  // INDRA campaigns.
583  // For light nuclei (Z<6) the values are given (not calculated) and
584  // correspond to: p, alpha, 6Li, 8Be, 10B.
585  //
586  //mt = KVNucleus::kBetaMass
587  //_________________________
588  //Beta (default) - An improved parametrisation of the beta-stability valley,
589  // correct even for heavy nuclei up to 238U. The formula is the result
590  // of a fit to 8 stable nuclear masses from Ne20 up to U238. From carbon-12 onwards,
591  // the mass is calculated using
592  // fA = (Int_t) (.2875 + 1.7622 *Z + .013879 * Z * Z - .000054875 * Z * Z * Z) + 1;
593  //
594  //mt = KVNucleus::kEALMass
595  //________________________
596  //EAL - parametrisation of the Evaporation Attractor Line (residue corridor)
597  // due to R.J. Charity (PRC 58(1998)1073).
598  // fA = (Int_t)(2.072*Z + 2.32E-03 * Z*Z) + 1; (eq 2)
599  //
600  //mt = KVNucleus::kEALResMass
601  //________________________
602  //EALRes - R.J. Charity ---- improvement of EAL parametrisation for
603  // Heavy Residues (QP for instance) (PRC 58(1998)1073) (eq 7)
604  // fA = (Int_t)(2.045*Z + 3.57E-03 * Z*Z) + 1 ;
605  //
606  //mt = any other value: A=2*Z
607 
608  Int_t A = 0;
609  Int_t z = (Int_t) Z;
610  switch (z) { // masses for lightest nuclei
611  case 1:
612  A = 1;
613  break;
614  case 2:
615  A = 4;
616  break;
617  case 3:
618  A = (mt == kVedaMass ? 6 : 7);
619  break;
620  case 4:
621  A = (mt == kVedaMass ? 8 : 9);
622  break;
623  case 5:
624  A = (mt == kVedaMass ? 10 : 11);
625  break;
626  default:
627  if (mt == kVedaMass)
629  else
630  A = (Int_t) KVNucleus::GetRealAFromZ(Z, mt) + 1;
631  }
632  return A;
633 }
634 
635 
638 
640 {
641  //Calculate neutron number from the element's atomic number Z.
642  return GetAFromZ(Z, mt) - Int_t(Z);
643 
644 }
645 
646 
647 
657 
659 {
660  //Set mass number
661  //Be careful not to call SetZ() after SetA(), as SetZ() will
662  //reset the mass number according to one of the available
663  //parametrisations of A as a function of Z.
664  //
665  //For A>255 the kIsHeavy flag is set. Then fA will equal A-255,
666  //and GetA will return fA+255.
667  //If A<=255 the flag is reset.
668 
669  if (a > 255) {
670  fA = (UChar_t)(a - 255);
671  SetBit(kIsHeavy);
672  }
673  else {
674  fA = (UChar_t) a;
676  }
677  SetMass(GetMassGS());
678 }
679 
680 
687 
689 {
690  //Set mass number
691  //Be careful not to call SetZ() after SetN(), as SetZ() will
692  //reset the neutron number according to one of the available
693  //parametrisations of A (N+Z) as a function of Z.
694  //
695  Int_t z = GetZ();
696  SetA(z + n);
697 }
698 
699 
700 
706 
708 {
709  //Set atomic number
710  //The mass number fA is automatically calculated and set using GetAFromZ().
711  //The optional EMassType argument allows to change the default parametrisation
712  //used for calculating A from Z.
713  fZ = (UChar_t) z;
714  if (mt > -1)
715  fMassFormula = mt;
717 }
718 
719 
720 
723 
725 {
726  //Set atomic number and mass number
727  SetZ(z);
728  SetA(a);
729 }
730 
731 
732 
735 
737 {
738  //Set atomic number, mass number, and kinetic energy in MeV
739  SetZ(z);
740  SetA(a);
741  SetKE(ekin);
742 }
743 
744 
745 
748 
750 {
751  //Set atomic number and mass number
752  SetZ(z);
753  SetN(n);
754 }
755 
756 
757 
760 
762 {
763  // Display nucleus parameters
764  cout << "KVNucleus Z=" << GetZ() << " A=" << GetA() << " E*=" << GetExcitEnergy() << endl;
766 }
767 
768 
769 
772 
774 {
775  //Return the number of proton / atomic number
776  return (Int_t) fZ;
777 }
778 
779 
780 
783 
785 {
786  //Return the number of neutron
787  return (Int_t)(GetA() - GetZ());
788 }
789 
790 
791 
801 
803 {
804  //Returns mass number (A) of nucleus.
805  //
806  //The actual member variable (fA) is a UChar_t and so limited to values 0-255.
807  //In case nuclei with larger A are needed (for example in calculations of 2-body
808  //scattering, a temporary nucleus corresponding to the sum of the entrance channel
809  //nuclei is used in order to find the outgoing target-like from the outgoing
810  //projectile-like) the flag "kIsHeavy" is set and GetA returns the value (fA+255).
811  //For this reason you should always use GetA and not fA.
812 
813  if (TestBit(kIsHeavy))
814  return ((Int_t) fA + 255);
815  return (Int_t) fA;
816 }
817 
818 
820 
822 {
823 
824  if (type == kNN) return GetA() * (GetA() - 1) / 2;
825  else if (type == knn) return GetN() * (GetN() - 1) / 2;
826  else if (type == kpp) return GetZ() * (GetZ() - 1) / 2;
827  else if (type == knp) return GetZ() * GetN();
828  else return 0;
829 }
830 
831 
832 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
833 
836 
837 void KVNucleus::Copy(TObject& obj) const
838 #else
839 void KVNucleus::Copy(TObject& obj)
840 #endif
841 {
842  //Copy this KVNucleus into the KVNucleus object referenced by "obj"
843  KVParticle::Copy(obj);
844  ((KVNucleus&) obj).SetZ(GetZ());
845  ((KVNucleus&) obj).SetMassFormula(fMassFormula);
846  ((KVNucleus&) obj).SetA(((KVNucleus*) this)->GetA());
847  ((KVNucleus&) obj).SetExcitEnergy(((KVNucleus*) this)->
848  GetExcitEnergy());
849 }
850 
851 
852 
854 
856 {
857  if (z == -1) z = GetZ();
858  if (a == -1) a = GetA();
859 
860 }
861 
862 
863 
867 
869 {
870  // Define excitation energy of nucleus in MeV.
871  // The rest mass of the nucleus is changed: m0 -> m0 + E*
872 
873  SetMass(GetMassGS() + ex);
874 }
875 
876 
877 
878 
885 
887 {
888  //Returns mass excess value in MeV for this nucleus.
889  //If optional arguments (z,a) are given we return the value for the
890  //required nucleus.
891  //If the nucleus is not included in the mass table, an extrapolated value
892  //using KVNucleus::LiquidDrop_BrackGuet is returned.
893 
894  CheckZAndA(z, a);
895 
896  Double_t val = gNDTManager->GetValue(z, a, "MassExcess");
897  if (val == -555) val = GetExtraMassExcess(z, a);
898  else {
899  // subtract electron mass from experimental atomic mass
900  val -= z * kMe;
901  }
902  return val;
903 }
904 
905 
906 
912 
914 {
915  //Calculate the extrapoled mass excess value
916  // from the LiquidDrop_BrackGuet formula
917  //If optional arguments (z,a) are given we return the value for the
918  //required nucleus.
919 
920  CheckZAndA(z, a);
921  return (LiquidDrop_BrackGuet(a, z) - a * kAMU);
922 
923 }
924 
925 
926 
931 
933 {
934  // Returns the mass of an isotope in unified atomic mass units
935  // (KVNucleus::u() MeV/c**2).
936  // This number is also the mass in grammes of 1 mole of this isotope.
937  CheckZAndA(zz, aa);
938  return aa + GetMassExcess(zz, aa) / u();
939 }
940 
941 
942 
943 
949 
951 {
952  //Returns pointer of corresponding KVMassExcess object
953  //0 if the Z,A couple is not in the table
954  //If optional arguments (z,a) are given we return the value for the
955  //required nucleus.
956  CheckZAndA(z, a);
957  return (KVMassExcess*)gNDTManager->GetData(z, a, "MassExcess");
958 
959 }
960 
961 
962 
963 
969 
971 {
972  //Returns pointer of corresponding KVSpinParity object
973  //0 if the Z,A couple is not in the table
974  //If optional arguments (z,a) are given we return the value for the
975  //required nucleus.
976  CheckZAndA(z, a);
977  return (KVSpinParity*)gNDTManager->GetData(z, a, "SpinParity");
978 
979 }
980 
981 
982 
983 
989 
991 {
992  //Returns spin value for this nucleus.
993  //If optional arguments (z,a) are given we return the value for the
994  //required nucleus.
995  //If the nucleus is not included in the mass table, -1 is returned
996 
997  CheckZAndA(z, a);
998 
999  Double_t val = gNDTManager->GetValue(z, a, "SpinParity");
1000  if (val == -555)
1001  return -1;
1002  return TMath::Abs(val);
1003 
1004 }
1005 
1006 
1007 
1008 
1014 
1016 {
1017  //Returns parity value (-1 or +1) for this nucleus.
1018  //If optional arguments (z,a) are given we return the value for the
1019  //required nucleus.
1020  //If the nucleus is not included in the mass table, O is returned
1021 
1022  CheckZAndA(z, a);
1023  Double_t val = gNDTManager->GetValue(z, a, "SpinParity");
1024  if (val == -555)
1025  return 0;
1026  return TMath::Sign(-1.0, val);
1027 
1028 }
1029 
1030 
1031 
1032 
1042 
1044 {
1045  //Returns life time in seconds (see KVLifeTime class for unit details).
1046  //For 'stable' nuclei (for which the abundance is known),
1047  //if no lifetime exists in the table we return 1.e+100.
1048  //For other "nuclei" with no known lifetime we return -1.
1049  //For resonances (IsResonance() returns kTRUE) we calculate the lifetime
1050  //from the width of the resonance, t = hbar/W.
1051  //If optional arguments (z,a) are given we return the value for the
1052  //required nucleus.
1053 
1054  CheckZAndA(z, a);
1055  KVLifeTime* lf = GetLifeTimePtr(z, a);
1056  if (!lf) {
1057  if (GetAbundance(z, a) > 0) return 1.e+100;
1058  return -1.0;
1059  }
1060  if (!lf->IsAResonance()) {
1061  Double_t life = lf->GetValue();
1062  return (life < 0. ? 1.e+100 : life);
1063  }
1064  Double_t life = ((hbar / TMath::Ccgs()) * 1.e-13) / lf->GetValue();
1065  return life;
1066 }
1067 
1068 
1069 
1070 
1071 
1076 
1078 {
1079  //Returns the pointeur of the life time object associated to this nucleus
1080  //If optional arguments (z,a) are given we return object for the
1081  //required nucleus.
1082 
1083  CheckZAndA(z, a);
1084  return (KVLifeTime*)gNDTManager->GetData(z, a, "LifeTime");
1085 
1086 }
1087 
1088 
1089 
1090 
1097 
1099 {
1100  //Returns charge radius in fm for tabulated nuclei
1101  //if not tabulated returns the extrapolated radius
1102  //calculate in GetExtraChargeRadius
1103  //If optional arguments (z,a) are given we return the value for the
1104  //required nucleus.
1105 
1106  CheckZAndA(z, a);
1108  if (!cr) {
1109  return GetExtraChargeRadius(z, a);
1110  }
1111  return cr->GetValue();
1112 
1113 }
1114 
1115 
1116 
1117 
1135 
1137 {
1138  //Calculate the extrapoled charge radius
1139  // Three formulae taken from Atomic Data and Nuclear Data Tables 87 (2004) 185-201
1140  // are proposed:
1141  // rct=2 (kELTON)take into account the finite surfacethickness
1142  // This rct=2 is set by default because it has the best reproduction of exp data
1143  //
1144  // rct=1 (kEMPFunc) is a purely emperical function re*A**ee
1145  // rct=0 (kLDModel) is the standard Liquid Drop model approximation
1146  //
1147  // Those formulae are valid for nuclei near the stability valley
1148  // other parametrization for xotic nuclei are proposed in the same reference
1149  // but needed extrapolation from given nuclei and I don't have time
1150  // to do it now
1151  //
1152  // If optional arguments (z,a) are given we return the value for the
1153  // required nucleus.
1154 
1155  CheckZAndA(z, a);
1156  Double_t R = 0;
1157  Double_t A = Double_t(a);
1158 
1159  Double_t rLD = 0.9542; //for kLDModel
1160 
1161  Double_t re = 1.153; //for kEMPFunc
1162  Double_t ee = 0.2938; //for kEMPFunc
1163 
1164  Double_t r0 = 0.9071; //for kELTON
1165  Double_t r1 = 1.105;
1166  Double_t r2 = -0.548;
1167 
1168  switch (rct) {
1169 
1170  case kLDModel:
1171  R = rLD * TMath::Power(A, 1. / 3.);
1172  break;
1173 
1174  case kEMPFunc:
1175  R = re * TMath::Power(A, ee);
1176  break;
1177 
1178  case kELTON:
1179  R = (r0 * TMath::Power(A, 1. / 3.) + r1 / TMath::Power(A, 1. / 3.) + r2 / A);
1180  break;
1181 
1182  }
1183 
1184  return R;
1185 
1186 }
1187 
1188 
1189 
1190 
1195 
1197 {
1198  //Returns the pointeur of charge radius object associated to this nucleus
1199  //If optional arguments (z,a) are given we return object for the
1200  //required nucleus.
1201 
1202  CheckZAndA(z, a);
1203  return (KVChargeRadius*)gNDTManager->GetData(z, a, "ChargeRadius");
1204 
1205 }
1206 
1207 
1208 
1209 
1214 
1216 {
1217  //Returns relative abundance value (see KVAbundance class for unit details).
1218  //If optional arguments (z,a) are given we return the value for the
1219  //required nucleus.
1220 
1221  CheckZAndA(z, a);
1222  return TMath::Max(0.0, gNDTManager->GetValue(z, a, "Abundance"));
1223 }
1224 
1225 
1226 
1227 
1232 
1234 {
1235  //Returns for a the Z of the current nucleus (z=-1) or the given z
1236  // most abundant A.
1237  //return -1 if no isotope of the given z have an abundance
1238  Int_t amost = -1;
1239  if (z == -1) z = GetZ();
1240  KVNumberList ll = GetKnownARange(z);
1241  ll.Begin();
1242  Double_t abmax = 0;
1243  while (!ll.End()) {
1244  Int_t a = ll.Next();
1245  Double_t abund = GetAbundance(z, a);
1246  if (abund > abmax) {
1247  abmax = abund;
1248  amost = a;
1249  }
1250  }
1251  return amost;
1252 }
1253 
1254 
1255 
1256 
1261 
1263 {
1264  //Returns the pointeur of the abundance object associated to this nucleus
1265  //If optional arguments (z,a) are given we return the object for the
1266  //required nucleus.
1267 
1268  CheckZAndA(z, a);
1269  return (KVAbundance*)gNDTManager->GetData(z, a, "Abundance");
1270 
1271 }
1272 
1273 
1274 
1275 
1281 
1282 Bool_t KVNucleus::IsKnown(int z, int a) const
1283 {
1284  //Old method, the answer is only valid for the mass excess table
1285  //Returns kTRUE if this nucleus or (z,a) is included in the mass table.
1286  //
1287  //We kept it for backward compatibility :
1288 
1289  CheckZAndA(z, a);
1290  //return fMassTable->IsKnown(z,a);
1291  return gNDTManager->IsInTable(z, a, "MassExcess");
1292 }
1293 
1294 
1295 
1296 
1304 
1306 {
1307  //Returns ground state binding energy in MeV for this nucleus.
1308  //The convention is : binding energy is positive if nucleus is bound.
1309  //If optional arguments (z,a) are given we return the binding energy for the
1310  //required nucleus.
1311  //If the nucleus is not included in the mass table, an extrapolated value
1312  //using KVNucleus::LiquidDrop_BrackGuet is returned.
1313 
1314  CheckZAndA(z, a);
1315 
1316  return a ==
1317  0 ? 0. : (z * GetMassExcess(1, 1) + (a - z) * GetMassExcess(0, 1) -
1318  GetMassExcess(z, a));
1319 }
1320 
1321 
1322 
1329 
1331 {
1332  // Returns ground state binding energy in MeV for this nucleus calculated from Brack & Guet
1333  // liquid drop formula (see KVNucleus::LiquiDrop_BrackGuet).
1334  // The convention is : binding energy is positive if nucleus is bound.
1335  // If optional arguments (z,a) are given we return the binding energy for the
1336  // required nucleus.
1337 
1338  CheckZAndA(z, a);
1339 
1340  return a ==
1341  0 ? 0. : (z * GetMassExcess(1, 1) + (a - z) * GetMassExcess(0, 1) -
1342  GetExtraMassExcess(z, a));
1343 }
1344 
1345 
1346 
1347 
1350 
1352 {
1353  //Returns binding energy in MeV/A for this nucleus.
1354 
1355  CheckZAndA(z, a);
1356 
1357  if (a == 0) return 0;
1358  return GetBindingEnergy(z, a) / a;
1359 }
1360 
1361 
1362 
1367 
1369 {
1370  //
1371  //Returns kinetic energy of nucleus per nucleon (in MeV/nucleon, donc)
1372  //
1373  return GetA() ? GetEnergy() / GetA() : GetEnergy();
1374 }
1375 
1376 
1377 
1378 
1383 
1385 {
1386  //
1387  //Returns kinetic energy of nucleus per nucleon (in MeV/nucleon, donc)
1388  //
1389  return GetEnergyPerNucleon();
1390 }
1391 
1392 
1393 
1394 
1400 
1402 {
1403  //returns range of a known mass for a given element
1404  //according to the lifetime in seconds
1405  //tmin=0 (default) include all nuclei with known lifetime
1406  //tmin=-1 include also nuclei for which lifetime is unknown
1407  if (zz == -1) zz = GetZ();
1408  KVNumberList nla;
1409  if (zz == 0)
1410  nla.Add(1);
1411  else
1412  nla.SetMinMax(TMath::Max(zz, 1), 6 * TMath::Max(zz, 1));
1413  KVNumberList nlb;
1414  nla.Begin();
1415  while (!nla.End()) {
1416  Int_t aa = nla.Next();
1417  if (IsKnown(zz, aa) && (GetLifeTime(zz, aa) >= tmin)) nlb.Add(aa);
1418  }
1419  return nlb;
1420 }
1421 
1422 
1423 
1426 
1428 {
1429  //returns range of a measured mass for a given element
1430 
1431  if (zz == -1) zz = GetZ();
1432  KVNumberList nla;
1433  if (zz == 0)
1434  nla.Add(1);
1435  else
1436  nla.SetMinMax(TMath::Max(zz, 1), 6 * TMath::Max(zz, 1));
1437  KVNumberList nlb;
1438  nla.Begin();
1439  while (!nla.End()) {
1440  Int_t aa = nla.Next();
1441  if (GetMassExcessPtr(zz, aa) && GetMassExcessPtr(zz, aa)->IsMeasured())
1442  nlb.Add(aa);
1443  }
1444  return nlb;
1445 
1446 }
1447 
1448 
1449 
1455 
1456 const Char_t* KVNucleus::GetIsotopesList(Int_t zmin, Int_t zmax, Double_t tmin) const
1457 {
1458  //returns list of isotopes separated by commas
1459  //for exemple 1H,2H,3H
1460  //according to the charge range and the lifetime in seconds
1461  //
1462  static KVString list;
1463  KVNucleus nn;
1464  KVNumberList nla;
1465  list = "";
1466  for (Int_t zz = zmin; zz <= zmax; zz += 1) {
1467  nla = GetKnownARange(zz, tmin);
1468  nla.Begin();
1469  while (!nla.End()) {
1470  Int_t aa = nla.Next();
1471  nn.SetZandA(zz, aa);
1472  list += nn.GetSymbol();
1473  list += ",";
1474  }
1475  }
1476  return list.Data();
1477 }
1478 
1479 
1480 
1481 
1483 
1485 {
1486 
1487  if (zz == -1) zz = GetZ();
1488  KVNumberList nla = GetKnownARange(zz);
1489  nla.Begin();
1490  Double_t emax = 0;
1491  Int_t amax = 0;
1492  while (!nla.End()) {
1493  Int_t aa = nla.Next();
1494  if (GetBindingEnergyPerNucleon(zz, aa) > emax) {
1495  emax = GetBindingEnergyPerNucleon(zz, aa);
1496  amax = aa;
1497  }
1498  }
1499  return amax;
1500 
1501 }
1502 
1503 
1504 
1505 
1508 
1510 {
1511  //KVNucleus assignment operator.
1512 
1513  if (&rhs != this) {
1514  rhs.Copy(*this);
1515  }
1516  return *this;
1517 }
1518 
1519 
1520 
1521 
1526 
1528 {
1529  // KVNucleus addition operator.
1530  // Add two nuclei together to form a compound nucleus whose Z, A, momentum
1531  // and excitation energy are calculated from energy and momentum conservation.
1532 
1533  KVNucleus& lhs = *this;
1534  Int_t ztot = lhs.GetZ() + rhs.GetZ();
1535  Int_t atot = lhs.GetA() + ((KVNucleus&) rhs).GetA();
1536  KVNucleus CN(ztot, atot);
1537 
1538  Double_t etot = lhs.E() + rhs.E();
1539  TVector3 ptot = lhs.GetMomentum() + rhs.GetMomentum();
1540  TLorentzVector q(ptot, etot);
1541  CN.Set4Mom(q);
1542 
1543  return CN;
1544 
1545 }
1546 
1547 
1548 
1549 
1556 
1558 {
1559  // KVNucleus subtraction operator.
1560  // If the LHS is a compound nucleus and the RHS an emitted nucleus
1561  // (which may or may not be excited) then the result of the subtraction
1562  // is the residual nucleus, with recoil and residual excitation calculated
1563  // by conservation laws.
1564 
1565  KVNucleus& lhs = *this;
1566  Int_t zres = lhs.GetZ() - rhs.GetZ();
1567  Int_t ares = lhs.GetA() - ((KVNucleus&) rhs).GetA();
1568  Double_t eres = lhs.E() - rhs.E();
1569  TVector3 pres = lhs.GetMomentum() - rhs.GetMomentum();
1570 
1571  if (zres < 0 || ares < 0 || eres < 0) {
1572  Warning("operator-(const KVNucleus &rhs)",
1573  "Cannot subtract nuclei, resulting Z=%d A=%d E=%lf", zres, ares, eres);
1574  KVNucleus RES;
1575  RES.Clear();
1576  return RES;
1577  }
1578  else {
1579  KVNucleus RES(zres, ares); //mass of nucleus includes mass excess
1580  TLorentzVector q(pres, eres);
1581  RES.Set4Mom(q);
1582  return RES;
1583  }
1584 }
1585 
1586 
1587 
1588 
1591 
1593 {
1594  //KVNucleus addition and assignment operator.
1595 
1596  KVNucleus temp = (*this) + rhs;
1597  (*this) = temp;
1598  return *this;
1599 }
1600 
1601 
1602 
1603 
1606 
1608 {
1609  //KVNucleus subtraction and assignment operator.
1610 
1611  KVNucleus temp = (*this) - rhs;
1612  (*this) = temp;
1613  return *this;
1614 }
1615 
1616 
1617 
1618 
1622 
1624 {
1625  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1626  //Parameters are from Brack and Guet (copied from Simon code)
1627 
1628  Double_t A = (Double_t) aa;
1629  Double_t Z = (Double_t) zz;
1630  Double_t AVOL = 15.776;
1631  Double_t ASUR = -17.22;
1632  Double_t AC = -10.24;
1633  Double_t AZER = 8.;
1634  Double_t XJJ = -30.03;
1635  Double_t QQ = -35.4;
1636  Double_t C1 = -.737;
1637  Double_t C2 = 1.28;
1638 
1639  Double_t XNEU = A - Z;
1640  Double_t SI = (XNEU - Z) / A;
1641  Double_t X13 = TMath::Power(A, 1. / 3.);
1642  Double_t EE1 = C1 * Z * Z / X13;
1643  Double_t EE2 = C2 * Z * Z / A;
1644  Double_t AUX = 1. + (9. * XJJ / 4. / QQ / X13);
1645  Double_t EE3 = XJJ * A * SI * SI / AUX;
1646  Double_t EE4 =
1647  AVOL * A + ASUR * TMath::Power(A, 2. / 3.) + AC * X13 + AZER;
1648  Double_t TOTA = EE1 + EE2 + EE3 + EE4;
1649  return (939.55 * XNEU + 938.77 * Z - TOTA);
1650 }
1651 
1652 
1653 
1654 
1658 
1660 {
1661  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1662  //Parameters are from Brack and Guet (copied from Simon code)
1663 
1664  Double_t av = 1.531e+01;
1665  Double_t as = 1.654e+01;
1666  Double_t ac = 6.882e-01;
1667  Double_t aa = 2.225e+01;
1668  Double_t ap = 9.399e+00;
1669  Double_t kap = 6.056e-01;
1670 
1671  Double_t eb = 0;
1672  eb += av * GetA();
1673  eb -= as * TMath::Power(GetA(), 2. / 3.);
1674  eb -= ac * GetZ() * (GetZ() - 1) / TMath::Power(GetA(), 1. / 3.);
1675  eb -= aa * TMath::Power(GetN() - GetZ(), 2.) / GetA();
1676 
1677  if (TMath::Even(GetA()))
1678  eb += ap * (TMath::Power(-1, GetN()) + TMath::Power(-1, GetZ())) / TMath::Power(GetA(), kap);
1679 
1680  return eb;
1681 
1682 }
1683 
1684 
1685 
1686 
1690 
1692 {
1693  //For sorting lists of nuclei according to their Z
1694  //Largest Z appears first in list
1695 
1696  if (GetZ() > ((KVNucleus*) obj)->GetZ()) {
1697  return -1;
1698  }
1699  else if (GetZ() < ((KVNucleus*) obj)->GetZ()) {
1700  return 1;
1701  }
1702  else {
1703  if (GetA() == ((KVNucleus*) obj)->GetA()) return 0;
1704  else if (GetA() > ((KVNucleus*) obj)->GetA()) return -1;
1705  else return 1;
1706  }
1707 }
1708 
1709 
1710 /*
1711 TH2F* KVNucleus::GetKnownNucleiChart(KVString method)
1712 {
1713  //Draw nuclei chart of tabulated nuclei and tagged as known in KaliVeda
1714  //The 2D histogram (AvsZ) has to be deleted by the user
1715  //Each content cell correponds to the method passed in argument of nucleus in MeV
1716  // Method Pattern has to be Double_t Method() or Double_t Method(obs = default value) in KVNucleus.h
1717 TH2F* chart = new TH2F("nuclei_known_charts",method.Data(),
1718  121,-0.5,120.5,
1719  351,-0.5,350.5);
1720 chart->SetXTitle("Atomic Number");
1721 chart->SetYTitle("Mass Number");
1722 
1723 TMethodCall *mt = new TMethodCall();
1724 mt->InitWithPrototype(this->IsA(),Form("%s",method.Data()),"");
1725 if (! mt->IsValid()) { delete mt; return 0; }
1726 delete mt;
1727 KVNucleus* ntemp = new KVNucleus();
1728 for (Int_t zz=0;zz<120;zz+=1){
1729  for (Int_t aa=0;aa<350;aa+=1){
1730  if (this->IsKnown(zz,aa)){
1731  mt = new TMethodCall();
1732  mt->InitWithPrototype(ntemp->IsA(),Form("%s",method.Data()),"");
1733  if (mt->ReturnType()==TMethodCall::kDouble){
1734  ntemp->SetZ(zz); ntemp->SetA(aa);
1735  Double_t ret; mt->Execute(ntemp,"",ret);
1736  chart->Fill(zz,aa,ret);
1737  }
1738  delete mt;
1739  }
1740  }
1741 }
1742 delete ntemp;
1743 return chart;
1744 
1745 }
1746 */
1747 
1748 
1752 
1754 {
1755  //Atomic mass unit in MeV
1756  //Reference: 2002 CODATA recommended values Reviews of Modern Physics 77, 1-107 (2005)
1757  return kAMU;
1758 };
1759 
1760 
1761 
1762 
1766 
1768 {
1769  //Retourne l'energie cintetique totale (MeV) du noyau pour
1770  //une valeur de Brho et d'etat de charge (Si 0-> Etat de charge=Z)
1771  Double_t C_mparns = KVNucleus::C() * 10;
1772 
1773  if (ChargeState == 0) ChargeState = GetZ();
1774 
1775  Double_t X = Brho * C_mparns * ChargeState;
1776 
1777  Double_t MassIon = GetMass() - ChargeState * KVNucleus::kMe;
1778 
1779  Double_t Result = TMath::Sqrt(MassIon * MassIon + X * X) - MassIon;
1780 
1781  return Result;
1782 
1783 }
1784 
1785 
1786 
1789 
1791 {
1792  // Return the reltive velocity between nuc and this in cm/ns.
1793  if (!nuc) return 0.;
1794  return (GetVelocity() - nuc->GetVelocity()).Mag();
1795 }
1796 
1797 
1798 
1809 
1811 {
1812  // Average or most probable Total Kinetic Energy [MeV] expected for fission based on various systematics
1813  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1814  // If nuc=0, this method returns the TKE for symmetric fission of this nucleus.
1815  // Else, it returns the expected TKE considering that nuc and the current nucleus arise
1816  // from the fisson of a compound nucleus.
1817  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1818  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1819  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1820  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1821 
1822  Double_t Ztot = GetZ();
1823  Double_t Atot = GetA();
1824  if (nuc) {
1825  Ztot += nuc->GetZ();
1826  Atot += nuc->GetA();
1827  }
1828  Double_t tke = 0;
1829  switch (formula) {
1830  case kDefaultFormula:
1831  case kHinde1987:
1832  if (nuc) tke = TKE_Hinde1987(GetZ(), GetA(), nuc->GetZ(), nuc->GetA());
1833  else tke = TKE_Hinde1987(GetZ() * 0.5, GetA() * 0.5, GetZ() - (GetZ() * 0.5), GetA() - (GetA() * 0.5));
1834  break;
1835 
1836  case kViola1985:
1837  tke = TKE_Viola1985(Ztot, Atot);
1838  break;
1839 
1840  case kViola1966:
1841  tke = TKE_Viola1966(Ztot, Atot);
1842  break;
1843 
1844  case kItkis1998:
1845  tke = TKE_Itkis1998(Ztot, Atot);
1846  break;
1847  }
1848 
1849  return tke;
1850 }
1851 
1852 
1853 
1859 
1861 {
1862  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1863  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1864  // This depends on the entrance channel: this nucleus is assumed to be the projectile,
1865  // while the target is given as argument.
1866 
1867  return TKE_Kozulin2014(GetZ(), target->GetZ(), GetA(), target->GetA());
1868 }
1869 
1870 
1871 
1882 
1884 {
1885  // Average/most probable relative velocity [cm/ns] expected for fission based on various systematics
1886  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1887  // If nuc=0, this method returns the relative velocity expected for the symmetric fission of this nucleus.
1888  // Else, it returns the expected relative velocity considering that nuc and the current nucleus arise
1889  // from the fisson of a compound nucleus.
1890  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1891  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1892  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1893  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1894 
1895  Double_t vrel = 0;
1896  Double_t mu = 0;
1897  if (nuc) {
1898  mu = nuc->GetMass() * GetMass() / (nuc->GetMass() + GetMass());
1899  }
1900  else {
1901  KVNucleus ff1(0.5 * GetZ(), 0.5 * GetA());
1902  KVNucleus ff2(GetZ() - ff1.GetZ(), GetA() - ff1.GetA());
1903  mu = ff1.GetMass() * ff2.GetMass() / (ff1.GetMass() + ff2.GetMass());
1904  }
1905 
1906  Double_t TKE = GetFissionTKE(nuc, formula);
1907  vrel = sqrt(2 * TKE / mu) * C();
1908 
1909  return vrel;
1910 }
1911 
1912 
1913 
1917 
1919 {
1920  // from: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987)
1921  // According to the authors, an extension to asymmetric fission based on TKE_Viola1985
1922  return 0.755 * z1 * z2 / (pow(a1, 1 / 3.) + pow(a2, 1 / 3.)) + 7.3;
1923 }
1924 
1925 
1926 
1929 
1931 {
1932  // from: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1933  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1934  return 0.1189 * za + 7.3;
1935 }
1936 
1937 
1938 
1941 
1943 {
1944  // from: V. E. Viola, Jr., Nuclear Data Sheets. Section A 1, 391 (1965).
1945  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1946  return 0.1071 * za + 22.2;
1947 }
1948 
1949 
1950 
1955 
1957 {
1958  // from: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1959  // Compared to Viola systematics, only heavy-ion induced fission is considered
1960  // A change of slope is observed for Z**2/A**1/3 > 900
1961 
1962  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1963  if (za < 900)
1964  return 0.131 * za;
1965  return 0.104 * za + 24.3;
1966 }
1967 
1968 
1969 
1973 
1975 {
1976  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1977  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1978 
1979  return 39.43 + .085 * pow(zp + zt, 2) / pow(ap + at, 1. / 3.);
1980 }
1981 
1982 
1983 
1984 
1991 
1993 {
1994  // Returns kTRUE if this nucleus is stable.
1995  // Definition of stable:
1996  // if the natural abundance is defined (look up in Abundance table)
1997  // OR
1998  // if lifetime is > min_lifetime
1999  if (GetAbundance() > 0.) return kTRUE;
2000  KVLifeTime* ptr = GetLifeTimePtr();
2001  return (ptr && !ptr->IsAResonance() && ptr->GetValue() > min_lifetime);
2002 }
2003 
2004 
2005 
2006 
2010 
2012 {
2013  // Returns kTRUE if this nucleus is a resonance.
2014  // In this case GetWidth() returns the width in MeV.
2015  KVLifeTime* ptr = GetLifeTimePtr();
2016  return (ptr && ptr->IsAResonance());
2017 }
2018 
2019 
2020 
2021 
2025 
2027 {
2028  // Returns width of resonance in MeV, if this nucleus
2029  // is indeed a resonance (IsResonance() returns kTRUE).
2030  KVLifeTime* ptr = GetLifeTimePtr();
2031  return ((ptr && ptr->IsAResonance()) ? ptr->GetValue() : 0.0);
2032 }
2033 
2034 
2035 
2036 
2040 
2042 {
2043  // Calculate and return the effective mass number of element Z
2044  // taking into account the abundance of naturally-occurring isotopes
2045 
2046  KVNumberList isotopes = GetKnownARange(Z);
2047  isotopes.Begin();
2048  Double_t Aeff = 0, wtot = 0;
2049  while (!isotopes.End()) {
2050 
2051  int A = isotopes.Next();
2052  Double_t abundance = GetAbundance(Z, A) / 100.;
2053  if (abundance > 0.) {
2054  Aeff += A * abundance;
2055  wtot += abundance;
2056  }
2057 
2058  }
2059  if (wtot > 0) Aeff /= wtot;
2060  return Aeff;
2061 }
2062 
2063 
2064 //-------------------------
2066 //-------------------------
2067 
2079 
2080 {
2081  //Nuclear Instruments and Methods 200 (1982) 605-608
2082  //Shima et al
2083  // "The present formula is useful for the collision range"
2084  // Zprojectile>=8
2085  // 4<=Ztarget<=79
2086  // Eproj<=6 MeV/A
2087  // Precision DeltaQ/Zproj <0.04.
2088  //
2089 
2090  //v=sqrt((2*E*1.6022)/(A*1.66054))*10.;
2091  //X=v/((3.6)*pow(Z,0.45));
2092 
2093  Double_t vel = GetVelocity().Mag(); // (cm/ns)
2094  vel *= 10; // (mm/ns)
2095  Double_t X = vel / ((3.6) * pow(GetZ(), 0.45));
2096 
2097  Double_t Q = GetZ() * (1 - exp(-1.25 * X + 0.32 * TMath::Power(X, 2.) - 0.11 * TMath::Power(X, 3.)));
2098  Q *= (1 - 0.0019 * (Ztarget - 6) * TMath::Sqrt(X) + 0.00001 * TMath::Power(Ztarget - 6, 2.) * X); //Correction respect to the carbon
2099 
2100  return Q;
2101 
2102 }
2103 
2104 
2105 //-------------------------
2107 //-------------------------
2108 
2110 
2111 {
2112  return 0.04 * GetZ();
2113 }
2114 
2115 
2116 
2121 
2122 void KVNucleus::Streamer(TBuffer& R__b)
2123 {
2124  // Stream an object of class KVNucleus.
2125  //
2126  // Streamer customized to correct masses of nuclei in data written with version <7
2127 
2128  UInt_t R__s, R__c;
2129  if (R__b.IsReading()) {
2130  Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
2131  R__b.ReadClassBuffer(KVNucleus::Class(), this, R__v, R__s, R__c);
2132  if (R__v < 7) {
2133  // Before v7, nuclear masses were actually atomic masses, including the electrons
2134  double m = GetMass();
2135  SetMass(m - GetZ()*kMe);
2136  }
2137  }
2138  else {
2139  R__b.WriteClassBuffer(KVNucleus::Class(), this);
2140  }
2141 }
2142 
2143 
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:181
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:126
UChar_t fZ
nuclear charge number (atomic number)
Definition: KVNucleus.h:131
Double_t ShimaChargeStatePrecision() const
Definition: KVNucleus.cpp:2106
static Double_t hbar
hbar*c in MeV.fm
Definition: KVNucleus.h:173
virtual void Clear(Option_t *opt="")
Definition: KVNucleus.cpp:301
const Char_t * GetSymbol(Option_t *opt="") const
Definition: KVNucleus.cpp:81
void SetExcitEnergy(Double_t e)
Definition: KVNucleus.cpp:868
Double_t GetExtraChargeRadius(Int_t z=-1, Int_t a=-1, Int_t rct=2) const
Definition: KVNucleus.cpp:1136
static Double_t LiquidDrop_BrackGuet(UInt_t A, UInt_t Z)
Definition: KVNucleus.cpp:1623
void Set(const Char_t *)
Definition: KVNucleus.cpp:180
Double_t GetAMeV() const
Definition: KVNucleus.cpp:1384
Double_t GetWidth() const
Definition: KVNucleus.cpp:2026
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:1930
void CheckZAndA(Int_t &z, Int_t &a) const
Definition: KVNucleus.cpp:855
static Int_t GetNFromZ(Double_t, Char_t mt)
Calculate neutron number from the element's atomic number Z.
Definition: KVNucleus.cpp:639
UChar_t fA
nuclear mass number
Definition: KVNucleus.h:130
Bool_t IsKnown(int z=-1, int a=-1) const
Definition: KVNucleus.cpp:1282
static Double_t GetRealAFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:447
Double_t GetSpin(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:990
Double_t GetExcitEnergy() const
Definition: KVNucleus.h:283
Int_t Compare(const TObject *obj) const
Definition: KVNucleus.cpp:1691
Double_t GetFissionTKE(const KVNucleus *nuc=0, Int_t formula=kDefaultFormula) const
Definition: KVNucleus.cpp:1810
void init()
Definition: KVNucleus.cpp:248
Double_t GetMassExcess(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:886
KVMassExcess * GetMassExcessPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:950
KVAbundance * GetAbundancePtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1262
static Double_t GetRealNFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:517
static Double_t u(void)
Definition: KVNucleus.cpp:1753
KVNucleus operator+(const KVNucleus &rhs)
Definition: KVNucleus.cpp:1527
virtual void Print(Option_t *t="") const
Display nucleus parameters.
Definition: KVNucleus.cpp:761
void SetZandN(Int_t z, Int_t n)
Set atomic number and mass number.
Definition: KVNucleus.cpp:749
Int_t GetA() const
Definition: KVNucleus.cpp:802
static Int_t IsMassGiven(const Char_t *)
Definition: KVNucleus.cpp:147
void SetA(Int_t a)
Definition: KVNucleus.cpp:658
KVNucleus & operator=(const KVNucleus &rhs)
KVNucleus assignment operator.
Definition: KVNucleus.cpp:1509
void SetN(Int_t n)
Definition: KVNucleus.cpp:688
Double_t GetMassGS() const
Definition: KVNucleus.h:290
static Double_t kMe
electron mass in MeV/c2
Definition: KVNucleus.h:171
void SetZ(Int_t z, Char_t mt=-1)
Definition: KVNucleus.cpp:707
Double_t LiquidDrop_Weizsacker()
Definition: KVNucleus.cpp:1659
Int_t GetMostAbundantA(Int_t z=-1) const
Definition: KVNucleus.cpp:1233
KVNucleus & operator+=(const KVNucleus &rhs)
KVNucleus addition and assignment operator.
Definition: KVNucleus.cpp:1592
Double_t GetNaturalA(Int_t zz=-1) const
Definition: KVNucleus.cpp:2041
Double_t GetFissionVelocity(KVNucleus *nuc=0, Int_t formula=kDefaultFormula)
Definition: KVNucleus.cpp:1883
static Double_t TKE_Itkis1998(Double_t z, Double_t a)
Definition: KVNucleus.cpp:1956
Int_t GetAWithMaxBindingEnergy(Int_t z=-1)
Definition: KVNucleus.cpp:1484
KVNumberList GetKnownARange(Int_t z=-1, Double_t tmin=0) const
Definition: KVNucleus.cpp:1401
Double_t GetExtraMassExcess(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:913
@ kEALResMass
Definition: KVNucleus.h:146
static Double_t e2
e^2/(4.pi.epsilon_0) in MeV.fm
Definition: KVNucleus.h:174
Double_t GetRelativeVelocity(KVNucleus *nuc)
Return the reltive velocity between nuc and this in cm/ns.
Definition: KVNucleus.cpp:1790
const Char_t * GetIsotopesList(Int_t zmin, Int_t zmax, Double_t tmin=0) const
Definition: KVNucleus.cpp:1456
@ kHinde1987
Definition: KVNucleus.h:158
@ kViola1985
Definition: KVNucleus.h:159
@ kDefaultFormula
Definition: KVNucleus.h:156
@ kViola1966
Definition: KVNucleus.h:160
@ kItkis1998
Definition: KVNucleus.h:157
Double_t GetBindingEnergyPerNucleon(Int_t z=-1, Int_t a=-1) const
Returns binding energy in MeV/A for this nucleus.
Definition: KVNucleus.cpp:1351
virtual void Copy(TObject &) const
Copy this KVNucleus into the KVNucleus object referenced by "obj".
Definition: KVNucleus.cpp:837
Int_t GetN() const
Return the number of neutron.
Definition: KVNucleus.cpp:784
KVNucleus & operator-=(const KVNucleus &rhs)
KVNucleus subtraction and assignment operator.
Definition: KVNucleus.cpp:1607
KVSpinParity * GetSpinParityPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:970
static UInt_t fNb_nuc
counts number of existing KVNucleus objects
Definition: KVNucleus.h:133
Bool_t IsResonance() const
Definition: KVNucleus.cpp:2011
Double_t DeduceEincFromBrho(Double_t Brho, Int_t ChargeState=0)
TH2F* GetKnownNucleiChart(KVString method="GetBindingEnergyPerNucleon");.
Definition: KVNucleus.cpp:1767
Double_t ShimaChargeState(Int_t) const
Definition: KVNucleus.cpp:2065
static Double_t kAMU
atomic mass unit in MeV
Definition: KVNucleus.h:170
int SetZFromSymbol(const Char_t *)
Definition: KVNucleus.cpp:228
void SetZandA(Int_t z, Int_t a)
Set atomic number and mass number.
Definition: KVNucleus.cpp:724
const Char_t * GetLatexSymbol(Option_t *opt="") const
Definition: KVNucleus.cpp:113
Int_t GetNpairs(Int_t type=kNN) const
Definition: KVNucleus.cpp:821
KVNumberList GetMeasuredARange(Int_t z=-1) const
returns range of a measured mass for a given element
Definition: KVNucleus.cpp:1427
void SetZAandE(Int_t z, Int_t a, Double_t ekin)
Set atomic number, mass number, and kinetic energy in MeV.
Definition: KVNucleus.cpp:736
Double_t GetQFasymTKE(KVNucleus *target)
Definition: KVNucleus.cpp:1860
KVChargeRadius * GetChargeRadiusPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1196
static Double_t TKE_Hinde1987(Double_t z1, Double_t a1, Double_t z2, Double_t a2)
Definition: KVNucleus.cpp:1918
Double_t GetAbundance(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1215
static Int_t GetZFromSymbol(const Char_t *)
Definition: KVNucleus.cpp:209
KVLifeTime * GetLifeTimePtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1077
Double_t GetEnergyPerNucleon() const
Definition: KVNucleus.cpp:1368
static Char_t fElements[][3]
symbols of chemical elements
Definition: KVNucleus.h:134
Double_t GetParity(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1015
static Int_t GetAFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:567
Double_t GetAtomicMass(Int_t zz=-1, Int_t aa=-1) const
Definition: KVNucleus.cpp:932
Bool_t IsStable(Double_t min_lifetime=1.0e+15) const
Definition: KVNucleus.cpp:1992
UChar_t fMassFormula
mass formula for calculating A from Z
Definition: KVNucleus.h:132
Double_t GetBindingEnergy(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1305
Int_t GetZ() const
Return the number of proton / atomic number.
Definition: KVNucleus.cpp:773
Double_t GetLiquidDropBindingEnergy(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1330
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:1942
static Double_t TKE_Kozulin2014(Double_t zp, Double_t zt, Double_t ap, Double_t at)
Definition: KVNucleus.cpp:1974
Double_t GetChargeRadius(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1098
Double_t GetLifeTime(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1043
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:570
TVector3 GetMomentum() const
Definition: KVParticle.h:604
Double_t GetEnergy() const
Definition: KVParticle.h:621
static Double_t C()
Definition: KVParticle.cpp:117
void SetKE(Double_t ecin)
Definition: KVParticle.cpp:230
virtual void Clear(Option_t *opt="")
Reset particle properties i.e. before creating/reading a new event.
Definition: KVParticle.cpp:295
void SetMomentum(const TVector3 *v)
Definition: KVParticle.h:542
virtual void Copy(TObject &) const
Definition: KVParticle.cpp:269
void Set4Mom(const TLorentzVector &p)
Definition: KVParticle.h:589
virtual void Print(Option_t *t="") const
print out characteristics of particle
Definition: KVParticle.cpp:212
Double_t GetMass() const
Definition: KVParticle.h:574
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)