KaliVeda  1.13/01
Heavy-Ion Analysis Toolkit
KVNucleus.cpp
Go to the documentation of this file.
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 
111 
113 {
114  // Returns symbol of isotope corresponding to this nucleus,
115  // suitable for latex format in ROOT TLatex type class
116  // i.e. "^{238}U", "^{12}C", "^{3}He" etc.
117  // Neutrons are represented by "^{1}n".
118  // In order to have also the charge printed like this : ^{12}_{6}C
119  // call with opt="ALL".
120 
121  Int_t a = GetA();
122  Int_t z = GetZ();
123  TString& symname = (TString&)fSymbolName;
124  if (0 <= GetZ() && GetZ() <= MAXZ_ELEMENT_SYMBOL) {
125  if (!strcmp(opt, "ALL")) symname.Form("{}^{%d}_{%d}%s", a, z, fElements[z]);
126  else symname.Form("^{%d}%s", a, fElements[z]);
127  }
128  else {
129  symname = "";
130  }
131  return symname.Data();
132 }
133 
134 
135 
143 
145 {
146  // test if the given string corresponds to the name of an isotope/element,
147  // and whether or not a mass is specified.
148  // isotope = symbol for element isotope, "C", "natSn", "13N", etc.
149  // if the mass of the isotope is given ("13N", "233U") we return the given mass
150  // if this is a valid element but no mass is given we return 0
151  // if this is not a valid isotope/element, we return -1
152 
153  Int_t A;
154  Char_t name[5];
155  TString tmp(isotope);
156  if (tmp.BeginsWith("nat"))
157  tmp.Remove(0, 3);
158  if (sscanf(tmp.Data(), "%d%s", &A, name) == 2) {
159  //name given in form "208Pb"
160  Int_t z = GetZFromSymbol(name);
161  if (z < 0) return z;
162  return A;
163  }
164  Int_t z = GetZFromSymbol(tmp);
165  if (z < 0) return z;
166  return 0;
167 }
168 
169 
170 
176 
177 void KVNucleus::Set(const Char_t* isotope)
178 {
179  // Set nucleus' Z & A using chemical symbol e.g. Set("12C") or Set("233U") etc.
180  //
181  // Any failure to deduce Z from the symbol will result in this object being made
182  // a zombie i.e. IsZombie() will return kTRUE
183 
184  Int_t A;
185  Char_t name[255];
186  TString tmp(isotope);
187  if (tmp.BeginsWith("nat"))
188  tmp.Remove(0, 3);
189  if (sscanf(tmp.Data(), "%d%s", &A, name) == 2) {
190  //name given in form "208Pb"
191  if (SetZFromSymbol(name) > -1) SetA(A);
192  else MakeZombie();
193  }
194  else if (sscanf(tmp.Data(), "%s", name) == 1) {
195  //name given in form "Pb"
196  if (SetZFromSymbol(name) == -1) MakeZombie();
197  }
198 }
199 
200 
201 
205 
207 {
208  //Returns Z of nucleus with given symbol i.e. "C" => Z=6, "U" => Z=92
209  //if unknown, returns -1
210  for (int i = 0; i <= MAXZ_ELEMENT_SYMBOL; i++) {
211  if (!strcmp(sym, fElements[i])) {
212  return i;
213  }
214  }
215  return -1;
216 }
217 
218 
219 
224 
226 {
227  // Set Z of nucleus with given symbol i.e. "C" => Z=6, "U" => Z=92
228  //
229  // Returns Z found, or -1 if symbol is unknown
230 
231  Int_t z = GetZFromSymbol(sym);
232  if (z > -1) SetZ(z);
233  else Error("SetZFromSymbol", "%s is unknown", sym);
234  return z;
235 }
236 
237 
238 
239 
244 
246 {
247  // Default intialisations
248  // The mass formula is kBetaMass, i.e. the formula for the valley of beta-stability.
249  // Set up nuclear data table manager if not done already
250 
251  fZ = fA = 0;
252  if (!fNb_nuc) {
253  KVBase::InitEnvironment(); // initialise environment i.e. read .kvrootrc
255  }
256  fMassFormula = kBetaMass;
257  fNb_nuc++;
258 }
259 
260 
261 
266 
268 {
269  //
270  //Default constructor.
271  //
272 
273  init();
274 }
275 
276 
277 
280 
282 {
283  //copy ctor
284  init();
285 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
286  obj.Copy(*this);
287 #else
288  ((KVNucleus&) obj).Copy(*this);
289 #endif
290 }
291 
292 
293 
297 
299 {
300  // Reset nucleus' properties: set A and Z to zero.
301  // For other properties, see KVParticle::Clear
302 
303  KVParticle::Clear(opt);
305  fZ = fA = 0;
306 }
307 
308 
309 
315 
317 {
318  //Create a nucleus with atomic number Z.
319  //If the mass number A is not given, A is calculated using the
320  //parametrisation determined by the value of fMassFormula (see KVNucleus::GetAFromZ).
321  //ekin is the kinetic energy in MeV
322 
323  init();
324  fZ = (UChar_t) z;
325  if (z != 0 && a == 0) {
327  }
328  else {
329  SetA(a);
330  }
331  SetKE(ekin);
332 }
333 
334 
335 
342 
343 KVNucleus::KVNucleus(const Char_t* symbol, Double_t EperA)
344 {
345  // Create a nucleus defined by symbol e.g. "12C", "34Mg", "42Si" etc. etc.
346  //
347  // If symbol is not valid, will be made a zombie (IsZombie() returns kTRUE)
348  //
349  // The second argument is the kinetic energy per nucleon (E/A) in MeV/A unit
350 
351  init();
352  Set(symbol);
353  if (!IsZombie()) SetKE(EperA * GetA());
354 }
355 
356 
357 
364 
366 {
367 
368  //Create nucleus with given Z, kinetic energy t and direction p
369  //(p is a unit vector in the desired direction. See KVPosition for methods
370  //for generating such vectors).
371  //The mass number A is calculated from Z. See KVNucleus::GetAFromZ.
372  //
373  init();
374  fZ = (UChar_t) z;
376  SetMomentum(t, p);
377 }
378 
379 
380 
385 
387 {
388  //
389  //Create nucleus with given Z, A, and 3-momentum p
390  //
391  init();
392  fZ = (UChar_t) z;
393  SetA(a);
394  SetMomentum(&p);
395 }
396 
397 
398 
400 
401 KVNucleus::~KVNucleus()
402 {
403  fNb_nuc--;
404  fZ = fA = 0;
405 }
406 
407 
408 
409 
443 
445 {
446  //Calculate nuclear mass number from the element's atomic number Z.
447  //This value is not rounded off, we just return the result of one of the following formulae:
448  //
449  //mt = KVNucleus::kVedaMass
450  //__________________________
451  //Veda - A calculated using the formula
452  // fA = (1.867*fZ+.016*fZ*fZ-1.07E-4*fZ*fZ*fZ);
453  // This corresponds to the amass.f subroutine of the old INDRA Veda
454  // calibration programme. This formula was supposed to represent
455  // the Z-dependence of isotope masses in the beta-stability valley,
456  // but is in fact a rather poor approximation, especially for large Z.
457  //
458  //mt = KVNucleus::kBetaMass
459  //_________________________
460  //Beta (default) - An improved parametrisation of the beta-stability valley,
461  // correct even for heavy nuclei up to 238U. The formula is the result
462  // of a fit to 8 stable nuclear masses from Ne20 up to U238.
463  // fA = (.2875 + 1.7622 *Z + .013879 * Z * Z - .000054875 * Z * Z * Z);
464  //
465  //mt = KVNucleus::kEALMass
466  //________________________
467  //EAL - parametrisation of the Evaporation Attractor Line (residue corridor)
468  // due to R.J. Charity (PRC 58(1998)1073) (eq 2)
469  // fA = (2.072*Z + 2.32E-03 * Z*Z) ;
470  //
471  //mt = KVNucleus::kEALResMass
472  //________________________
473  //EALRes - R.J. Charity ---- improvement of EAL parametrisation for
474  // Heavy Residue (QP for instance) (PRC 58(1998)1073) (eq 7)
475  // fA = (2.045*Z + 3.57E-03 * Z*Z) ;
476  //
477  //mt = any other value: A=2*Z
478 
479  Double_t A;
480  switch (mt) {
481 
482  case kVedaMass:
483  A = (1.867 * Z + .016 * TMath::Power(Z, 2.) -
484  1.07E-4 * TMath::Power(Z, 3.));
485  break;
486 
487  case kBetaMass:
488  A = (.2875 + 1.7622 * Z + .013879 * TMath::Power(Z, 2.) -
489  .000054875 * TMath::Power(Z, 3.));
490  break;
491 
492  case kEALMass:
493  A = (2.072 * Z + 2.32E-03 * TMath::Power(Z, 2.));
494  break;
495 
496  case kEALResMass:
497  A = (2.045 * Z + 3.57E-03 * TMath::Power(Z, 2.));
498  break;
499 
500  default:
501  A = 2. * Z;
502  }
503 
504  return A;
505 }
506 
507 
508 
513 
515 {
516  //Calculate neutron number from the element's atomic number Z.
517  //This value is not rounded off, we just return the result
518  //obtain from the chosen mass formula (mt)
519  return GetRealAFromZ(Z, mt) - Z;
520 
521 }
522 
523 
563 
565 {
566  //Calculate nuclear mass number from the element's atomic number Z.
567  //Used by default to set fA and fMass if fA not given.
568  //For light nuclei (Z<6) the values are given (not calculated) and
569  //correspond to: p, alpha, 7Li, 9Be, 11B.
570  //For heavier nuclei, several prescriptions are available
571  //by giving one of the following values to argument mt:
572  //
573  //mt = KVNucleus::kVedaMass
574  //__________________________
575  //Veda - A calculated using the formula
576  // fA = TMath::Nint(1.867*fZ+.016*fZ*fZ-1.07E-4*fZ*fZ*fZ);
577  // This corresponds to the amass.f subroutine of the old INDRA Veda
578  // calibration programme. These are the masses used in the first
579  // INDRA campaigns.
580  // For light nuclei (Z<6) the values are given (not calculated) and
581  // correspond to: p, alpha, 6Li, 8Be, 10B.
582  //
583  //mt = KVNucleus::kBetaMass
584  //_________________________
585  //Beta (default) - An improved parametrisation of the beta-stability valley,
586  // correct even for heavy nuclei up to 238U. The formula is the result
587  // of a fit to 8 stable nuclear masses from Ne20 up to U238. From carbon-12 onwards,
588  // the mass is calculated using
589  // fA = (Int_t) (.2875 + 1.7622 *Z + .013879 * Z * Z - .000054875 * Z * Z * Z) + 1;
590  //
591  //mt = KVNucleus::kEALMass
592  //________________________
593  //EAL - parametrisation of the Evaporation Attractor Line (residue corridor)
594  // due to R.J. Charity (PRC 58(1998)1073).
595  // fA = (Int_t)(2.072*Z + 2.32E-03 * Z*Z) + 1; (eq 2)
596  //
597  //mt = KVNucleus::kEALResMass
598  //________________________
599  //EALRes - R.J. Charity ---- improvement of EAL parametrisation for
600  // Heavy Residues (QP for instance) (PRC 58(1998)1073) (eq 7)
601  // fA = (Int_t)(2.045*Z + 3.57E-03 * Z*Z) + 1 ;
602  //
603  //mt = any other value: A=2*Z
604 
605  Int_t A = 0;
606  Int_t z = (Int_t) Z;
607  switch (z) { // masses for lightest nuclei
608  case 1:
609  A = 1;
610  break;
611  case 2:
612  A = 4;
613  break;
614  case 3:
615  A = (mt == kVedaMass ? 6 : 7);
616  break;
617  case 4:
618  A = (mt == kVedaMass ? 8 : 9);
619  break;
620  case 5:
621  A = (mt == kVedaMass ? 10 : 11);
622  break;
623  default:
624  if (mt == kVedaMass)
626  else
627  A = (Int_t) KVNucleus::GetRealAFromZ(Z, mt) + 1;
628  }
629  return A;
630 }
631 
632 
635 
637 {
638  //Calculate neutron number from the element's atomic number Z.
639  return GetAFromZ(Z, mt) - Int_t(Z);
640 
641 }
642 
643 
644 
654 
656 {
657  //Set mass number
658  //Be careful not to call SetZ() after SetA(), as SetZ() will
659  //reset the mass number according to one of the available
660  //parametrisations of A as a function of Z.
661  //
662  //For A>255 the kIsHeavy flag is set. Then fA will equal A-255,
663  //and GetA will return fA+255.
664  //If A<=255 the flag is reset.
665 
666  if (a > 255) {
667  fA = (UChar_t)(a - 255);
668  SetBit(kIsHeavy);
669  }
670  else {
671  fA = (UChar_t) a;
673  }
674  SetMass(GetMassGS());
675 }
676 
677 
684 
686 {
687  //Set mass number
688  //Be careful not to call SetZ() after SetN(), as SetZ() will
689  //reset the neutron number according to one of the available
690  //parametrisations of A (N+Z) as a function of Z.
691  //
692  Int_t z = GetZ();
693  SetA(z + n);
694 }
695 
696 
697 
703 
705 {
706  //Set atomic number
707  //The mass number fA is automatically calculated and set using GetAFromZ().
708  //The optional EMassType argument allows to change the default parametrisation
709  //used for calculating A from Z.
710  fZ = (UChar_t) z;
711  if (mt > -1)
712  fMassFormula = mt;
714 }
715 
716 
717 
720 
722 {
723  //Set atomic number and mass number
724  SetZ(z);
725  SetA(a);
726 }
727 
728 
729 
732 
734 {
735  //Set atomic number, mass number, and kinetic energy in MeV
736  SetZ(z);
737  SetA(a);
738  SetKE(ekin);
739 }
740 
741 
742 
745 
747 {
748  //Set atomic number and mass number
749  SetZ(z);
750  SetN(n);
751 }
752 
753 
754 
757 
759 {
760  // Display nucleus parameters
761  cout << "KVNucleus Z=" << GetZ() << " A=" << GetA() << " E*=" << GetExcitEnergy() << endl;
763 }
764 
765 
766 
769 
771 {
772  //Return the number of proton / atomic number
773  return (Int_t) fZ;
774 }
775 
776 
777 
780 
782 {
783  //Return the number of neutron
784  return (Int_t)(GetA() - GetZ());
785 }
786 
787 
788 
798 
800 {
801  //Returns mass number (A) of nucleus.
802  //
803  //The actual member variable (fA) is a UChar_t and so limited to values 0-255.
804  //In case nuclei with larger A are needed (for example in calculations of 2-body
805  //scattering, a temporary nucleus corresponding to the sum of the entrance channel
806  //nuclei is used in order to find the outgoing target-like from the outgoing
807  //projectile-like) the flag "kIsHeavy" is set and GetA returns the value (fA+255).
808  //For this reason you should always use GetA and not fA.
809 
810  if (TestBit(kIsHeavy))
811  return ((Int_t) fA + 255);
812  return (Int_t) fA;
813 }
814 
815 
817 
819 {
820 
821  if (type == kNN) return GetA() * (GetA() - 1) / 2;
822  else if (type == knn) return GetN() * (GetN() - 1) / 2;
823  else if (type == kpp) return GetZ() * (GetZ() - 1) / 2;
824  else if (type == knp) return GetZ() * GetN();
825  else return 0;
826 }
827 
828 
829 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
830 
833 
834 void KVNucleus::Copy(TObject& obj) const
835 #else
836 void KVNucleus::Copy(TObject& obj)
837 #endif
838 {
839  //Copy this KVNucleus into the KVNucleus object referenced by "obj"
840  KVParticle::Copy(obj);
841  ((KVNucleus&) obj).SetZ(GetZ());
842  ((KVNucleus&) obj).SetMassFormula(fMassFormula);
843  ((KVNucleus&) obj).SetA(((KVNucleus*) this)->GetA());
844  ((KVNucleus&) obj).SetExcitEnergy(((KVNucleus*) this)->
845  GetExcitEnergy());
846 }
847 
848 
849 
851 
853 {
854  if (z == -1) z = GetZ();
855  if (a == -1) a = GetA();
856 
857 }
858 
859 
860 
864 
866 {
867  // Define excitation energy of nucleus in MeV.
868  // The rest mass of the nucleus is changed: m0 -> m0 + E*
869 
870  SetMass(GetMassGS() + ex);
871 }
872 
873 
874 
875 
882 
884 {
885  //Returns mass excess value in MeV for this nucleus.
886  //If optional arguments (z,a) are given we return the value for the
887  //required nucleus.
888  //If the nucleus is not included in the mass table, an extrapolated value
889  //using KVNucleus::LiquidDrop_BrackGuet is returned.
890 
891  CheckZAndA(z, a);
892 
893  Double_t val = gNDTManager->GetValue(z, a, "MassExcess");
894  if (val == -555) val = GetExtraMassExcess(z, a);
895  else {
896  // subtract electron mass from experimental atomic mass
897  val -= z * kMe;
898  }
899  return val;
900 }
901 
902 
903 
909 
911 {
912  //Calculate the extrapoled mass excess value
913  // from the LiquidDrop_BrackGuet formula
914  //If optional arguments (z,a) are given we return the value for the
915  //required nucleus.
916 
917  CheckZAndA(z, a);
918  return (LiquidDrop_BrackGuet(a, z) - a * kAMU);
919 
920 }
921 
922 
923 
928 
930 {
931  // Returns the mass of an isotope in unified atomic mass units
932  // (KVNucleus::u() MeV/c**2).
933  // This number is also the mass in grammes of 1 mole of this isotope.
934  CheckZAndA(zz, aa);
935  return aa + GetMassExcess(zz, aa) / u();
936 }
937 
938 
939 
940 
946 
948 {
949  //Returns pointer of corresponding KVMassExcess object
950  //0 if the Z,A couple is not in the table
951  //If optional arguments (z,a) are given we return the value for the
952  //required nucleus.
953  CheckZAndA(z, a);
954  return (KVMassExcess*)gNDTManager->GetData(z, a, "MassExcess");
955 
956 }
957 
958 
959 
960 
966 
968 {
969  //Returns pointer of corresponding KVSpinParity object
970  //0 if the Z,A couple is not in the table
971  //If optional arguments (z,a) are given we return the value for the
972  //required nucleus.
973  CheckZAndA(z, a);
974  return (KVSpinParity*)gNDTManager->GetData(z, a, "SpinParity");
975 
976 }
977 
978 
979 
980 
986 
988 {
989  //Returns spin value for this nucleus.
990  //If optional arguments (z,a) are given we return the value for the
991  //required nucleus.
992  //If the nucleus is not included in the mass table, -1 is returned
993 
994  CheckZAndA(z, a);
995 
996  Double_t val = gNDTManager->GetValue(z, a, "SpinParity");
997  if (val == -555)
998  return -1;
999  return TMath::Abs(val);
1000 
1001 }
1002 
1003 
1004 
1005 
1011 
1013 {
1014  //Returns parity value (-1 or +1) for this nucleus.
1015  //If optional arguments (z,a) are given we return the value for the
1016  //required nucleus.
1017  //If the nucleus is not included in the mass table, O is returned
1018 
1019  CheckZAndA(z, a);
1020  Double_t val = gNDTManager->GetValue(z, a, "SpinParity");
1021  if (val == -555)
1022  return 0;
1023  return TMath::Sign(-1.0, val);
1024 
1025 }
1026 
1027 
1028 
1029 
1039 
1041 {
1042  //Returns life time in seconds (see KVLifeTime class for unit details).
1043  //For 'stable' nuclei (for which the abundance is known),
1044  //if no lifetime exists in the table we return 1.e+100.
1045  //For other "nuclei" with no known lifetime we return -1.
1046  //For resonances (IsResonance() returns kTRUE) we calculate the lifetime
1047  //from the width of the resonance, t = hbar/W.
1048  //If optional arguments (z,a) are given we return the value for the
1049  //required nucleus.
1050 
1051  CheckZAndA(z, a);
1052  KVLifeTime* lf = GetLifeTimePtr(z, a);
1053  if (!lf) {
1054  if (GetAbundance(z, a) > 0) return 1.e+100;
1055  return -1.0;
1056  }
1057  if (!lf->IsAResonance()) {
1058  Double_t life = lf->GetValue();
1059  return (life < 0. ? 1.e+100 : life);
1060  }
1061  Double_t life = ((hbar / TMath::Ccgs()) * 1.e-13) / lf->GetValue();
1062  return life;
1063 }
1064 
1065 
1066 
1067 
1068 
1073 
1075 {
1076  //Returns the pointeur of the life time object associated to this nucleus
1077  //If optional arguments (z,a) are given we return object for the
1078  //required nucleus.
1079 
1080  CheckZAndA(z, a);
1081  return (KVLifeTime*)gNDTManager->GetData(z, a, "LifeTime");
1082 
1083 }
1084 
1085 
1086 
1087 
1094 
1096 {
1097  //Returns charge radius in fm for tabulated nuclei
1098  //if not tabulated returns the extrapolated radius
1099  //calculate in GetExtraChargeRadius
1100  //If optional arguments (z,a) are given we return the value for the
1101  //required nucleus.
1102 
1103  CheckZAndA(z, a);
1105  if (!cr) {
1106  return GetExtraChargeRadius(z, a);
1107  }
1108  return cr->GetValue();
1109 
1110 }
1111 
1112 
1113 
1114 
1132 
1134 {
1135  //Calculate the extrapoled charge radius
1136  // Three formulae taken from Atomic Data and Nuclear Data Tables 87 (2004) 185-201
1137  // are proposed:
1138  // rct=2 (kELTON)take into account the finite surfacethickness
1139  // This rct=2 is set by default because it has the best reproduction of exp data
1140  //
1141  // rct=1 (kEMPFunc) is a purely emperical function re*A**ee
1142  // rct=0 (kLDModel) is the standard Liquid Drop model approximation
1143  //
1144  // Those formulae are valid for nuclei near the stability valley
1145  // other parametrization for xotic nuclei are proposed in the same reference
1146  // but needed extrapolation from given nuclei and I don't have time
1147  // to do it now
1148  //
1149  // If optional arguments (z,a) are given we return the value for the
1150  // required nucleus.
1151 
1152  CheckZAndA(z, a);
1153  Double_t R = 0;
1154  Double_t A = Double_t(a);
1155 
1156  Double_t rLD = 0.9542; //for kLDModel
1157 
1158  Double_t re = 1.153; //for kEMPFunc
1159  Double_t ee = 0.2938; //for kEMPFunc
1160 
1161  Double_t r0 = 0.9071; //for kELTON
1162  Double_t r1 = 1.105;
1163  Double_t r2 = -0.548;
1164 
1165  switch (rct) {
1166 
1167  case kLDModel:
1168  R = rLD * TMath::Power(A, 1. / 3.);
1169  break;
1170 
1171  case kEMPFunc:
1172  R = re * TMath::Power(A, ee);
1173  break;
1174 
1175  case kELTON:
1176  R = (r0 * TMath::Power(A, 1. / 3.) + r1 / TMath::Power(A, 1. / 3.) + r2 / A);
1177  break;
1178 
1179  }
1180 
1181  return R;
1182 
1183 }
1184 
1185 
1186 
1187 
1192 
1194 {
1195  //Returns the pointeur of charge radius object associated to this nucleus
1196  //If optional arguments (z,a) are given we return object for the
1197  //required nucleus.
1198 
1199  CheckZAndA(z, a);
1200  return (KVChargeRadius*)gNDTManager->GetData(z, a, "ChargeRadius");
1201 
1202 }
1203 
1204 
1205 
1206 
1211 
1213 {
1214  //Returns relative abundance value (see KVAbundance class for unit details).
1215  //If optional arguments (z,a) are given we return the value for the
1216  //required nucleus.
1217 
1218  CheckZAndA(z, a);
1219  return TMath::Max(0.0, gNDTManager->GetValue(z, a, "Abundance"));
1220 }
1221 
1222 
1223 
1224 
1229 
1231 {
1232  //Returns for a the Z of the current nucleus (z=-1) or the given z
1233  // most abundant A.
1234  //return -1 if no isotope of the given z have an abundance
1235  Int_t amost = -1;
1236  if (z == -1) z = GetZ();
1237  KVNumberList ll = GetKnownARange(z);
1238  ll.Begin();
1239  Double_t abmax = 0;
1240  while (!ll.End()) {
1241  Int_t a = ll.Next();
1242  Double_t abund = GetAbundance(z, a);
1243  if (abund > abmax) {
1244  abmax = abund;
1245  amost = a;
1246  }
1247  }
1248  return amost;
1249 }
1250 
1251 
1252 
1253 
1258 
1260 {
1261  //Returns the pointeur of the abundance object associated to this nucleus
1262  //If optional arguments (z,a) are given we return the object for the
1263  //required nucleus.
1264 
1265  CheckZAndA(z, a);
1266  return (KVAbundance*)gNDTManager->GetData(z, a, "Abundance");
1267 
1268 }
1269 
1270 
1271 
1272 
1278 
1279 Bool_t KVNucleus::IsKnown(int z, int a) const
1280 {
1281  //Old method, the answer is only valid for the mass excess table
1282  //Returns kTRUE if this nucleus or (z,a) is included in the mass table.
1283  //
1284  //We kept it for backward compatibility :
1285 
1286  CheckZAndA(z, a);
1287  //return fMassTable->IsKnown(z,a);
1288  return gNDTManager->IsInTable(z, a, "MassExcess");
1289 }
1290 
1291 
1292 
1293 
1301 
1303 {
1304  //Returns ground state binding energy in MeV for this nucleus.
1305  //The convention is : binding energy is positive if nucleus is bound.
1306  //If optional arguments (z,a) are given we return the binding energy for the
1307  //required nucleus.
1308  //If the nucleus is not included in the mass table, an extrapolated value
1309  //using KVNucleus::LiquidDrop_BrackGuet is returned.
1310 
1311  CheckZAndA(z, a);
1312 
1313  return a ==
1314  0 ? 0. : (z * GetMassExcess(1, 1) + (a - z) * GetMassExcess(0, 1) -
1315  GetMassExcess(z, a));
1316 }
1317 
1318 
1319 
1326 
1328 {
1329  // Returns ground state binding energy in MeV for this nucleus calculated from Brack & Guet
1330  // liquid drop formula (see KVNucleus::LiquiDrop_BrackGuet).
1331  // The convention is : binding energy is positive if nucleus is bound.
1332  // If optional arguments (z,a) are given we return the binding energy for the
1333  // required nucleus.
1334 
1335  CheckZAndA(z, a);
1336 
1337  return a ==
1338  0 ? 0. : (z * GetMassExcess(1, 1) + (a - z) * GetMassExcess(0, 1) -
1339  GetExtraMassExcess(z, a));
1340 }
1341 
1342 
1343 
1344 
1347 
1349 {
1350  //Returns binding energy in MeV/A for this nucleus.
1351 
1352  CheckZAndA(z, a);
1353 
1354  if (a == 0) return 0;
1355  return GetBindingEnergy(z, a) / a;
1356 }
1357 
1358 
1359 
1364 
1366 {
1367  //
1368  //Returns kinetic energy of nucleus per nucleon (in MeV/nucleon, donc)
1369  //
1370  return GetA() ? GetEnergy() / GetA() : GetEnergy();
1371 }
1372 
1373 
1374 
1375 
1380 
1382 {
1383  //
1384  //Returns kinetic energy of nucleus per nucleon (in MeV/nucleon, donc)
1385  //
1386  return GetEnergyPerNucleon();
1387 }
1388 
1389 
1390 
1391 
1397 
1399 {
1400  //returns range of a known mass for a given element
1401  //according to the lifetime in seconds
1402  //tmin=0 (default) include all nuclei with known lifetime
1403  //tmin=-1 include also nuclei for which lifetime is unknown
1404  if (zz == -1) zz = GetZ();
1405  KVNumberList nla;
1406  if (zz == 0)
1407  nla.Add(1);
1408  else
1409  nla.SetMinMax(TMath::Max(zz, 1), 6 * TMath::Max(zz, 1));
1410  KVNumberList nlb;
1411  nla.Begin();
1412  while (!nla.End()) {
1413  Int_t aa = nla.Next();
1414  if (IsKnown(zz, aa) && (GetLifeTime(zz, aa) >= tmin)) nlb.Add(aa);
1415  }
1416  return nlb;
1417 }
1418 
1419 
1420 
1423 
1425 {
1426  //returns range of a measured mass for a given element
1427 
1428  if (zz == -1) zz = GetZ();
1429  KVNumberList nla;
1430  if (zz == 0)
1431  nla.Add(1);
1432  else
1433  nla.SetMinMax(TMath::Max(zz, 1), 6 * TMath::Max(zz, 1));
1434  KVNumberList nlb;
1435  nla.Begin();
1436  while (!nla.End()) {
1437  Int_t aa = nla.Next();
1438  if (GetMassExcessPtr(zz, aa) && GetMassExcessPtr(zz, aa)->IsMeasured())
1439  nlb.Add(aa);
1440  }
1441  return nlb;
1442 
1443 }
1444 
1445 
1446 
1452 
1453 const Char_t* KVNucleus::GetIsotopesList(Int_t zmin, Int_t zmax, Double_t tmin) const
1454 {
1455  //returns list of isotopes separated by commas
1456  //for exemple 1H,2H,3H
1457  //according to the charge range and the lifetime in seconds
1458  //
1459  static KVString list;
1460  KVNucleus nn;
1461  KVNumberList nla;
1462  list = "";
1463  for (Int_t zz = zmin; zz <= zmax; zz += 1) {
1464  nla = GetKnownARange(zz, tmin);
1465  nla.Begin();
1466  while (!nla.End()) {
1467  Int_t aa = nla.Next();
1468  nn.SetZandA(zz, aa);
1469  list += nn.GetSymbol();
1470  list += ",";
1471  }
1472  }
1473  return list.Data();
1474 }
1475 
1476 
1477 
1478 
1480 
1482 {
1483 
1484  if (zz == -1) zz = GetZ();
1485  KVNumberList nla = GetKnownARange(zz);
1486  nla.Begin();
1487  Double_t emax = 0;
1488  Int_t amax = 0;
1489  while (!nla.End()) {
1490  Int_t aa = nla.Next();
1491  if (GetBindingEnergyPerNucleon(zz, aa) > emax) {
1492  emax = GetBindingEnergyPerNucleon(zz, aa);
1493  amax = aa;
1494  }
1495  }
1496  return amax;
1497 
1498 }
1499 
1500 
1501 
1502 
1505 
1507 {
1508  //KVNucleus assignment operator.
1509 
1510  if (&rhs != this) {
1511  rhs.Copy(*this);
1512  }
1513  return *this;
1514 }
1515 
1516 
1517 
1518 
1523 
1525 {
1526  // KVNucleus addition operator.
1527  // Add two nuclei together to form a compound nucleus whose Z, A, momentum
1528  // and excitation energy are calculated from energy and momentum conservation.
1529 
1530  KVNucleus& lhs = *this;
1531  Int_t ztot = lhs.GetZ() + rhs.GetZ();
1532  Int_t atot = lhs.GetA() + ((KVNucleus&) rhs).GetA();
1533  KVNucleus CN(ztot, atot);
1534 
1535  Double_t etot = lhs.E() + rhs.E();
1536  TVector3 ptot = lhs.GetMomentum() + rhs.GetMomentum();
1537  TLorentzVector q(ptot, etot);
1538  CN.Set4Mom(q);
1539 
1540  return CN;
1541 
1542 }
1543 
1544 
1545 
1546 
1553 
1555 {
1556  // KVNucleus subtraction operator.
1557  // If the LHS is a compound nucleus and the RHS an emitted nucleus
1558  // (which may or may not be excited) then the result of the subtraction
1559  // is the residual nucleus, with recoil and residual excitation calculated
1560  // by conservation laws.
1561 
1562  KVNucleus& lhs = *this;
1563  Int_t zres = lhs.GetZ() - rhs.GetZ();
1564  Int_t ares = lhs.GetA() - ((KVNucleus&) rhs).GetA();
1565  Double_t eres = lhs.E() - rhs.E();
1566  TVector3 pres = lhs.GetMomentum() - rhs.GetMomentum();
1567 
1568  if (zres < 0 || ares < 0 || eres < 0) {
1569  Warning("operator-(const KVNucleus &rhs)",
1570  "Cannot subtract nuclei, resulting Z=%d A=%d E=%lf", zres, ares, eres);
1571  KVNucleus RES;
1572  RES.Clear();
1573  return RES;
1574  }
1575  else {
1576  KVNucleus RES(zres, ares); //mass of nucleus includes mass excess
1577  TLorentzVector q(pres, eres);
1578  RES.Set4Mom(q);
1579  return RES;
1580  }
1581 }
1582 
1583 
1584 
1585 
1588 
1590 {
1591  //KVNucleus addition and assignment operator.
1592 
1593  KVNucleus temp = (*this) + rhs;
1594  (*this) = temp;
1595  return *this;
1596 }
1597 
1598 
1599 
1600 
1603 
1605 {
1606  //KVNucleus subtraction and assignment operator.
1607 
1608  KVNucleus temp = (*this) - rhs;
1609  (*this) = temp;
1610  return *this;
1611 }
1612 
1613 
1614 
1615 
1619 
1621 {
1622  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1623  //Parameters are from Brack and Guet (copied from Simon code)
1624 
1625  Double_t A = (Double_t) aa;
1626  Double_t Z = (Double_t) zz;
1627  Double_t AVOL = 15.776;
1628  Double_t ASUR = -17.22;
1629  Double_t AC = -10.24;
1630  Double_t AZER = 8.;
1631  Double_t XJJ = -30.03;
1632  Double_t QQ = -35.4;
1633  Double_t C1 = -.737;
1634  Double_t C2 = 1.28;
1635 
1636  Double_t XNEU = A - Z;
1637  Double_t SI = (XNEU - Z) / A;
1638  Double_t X13 = TMath::Power(A, 1. / 3.);
1639  Double_t EE1 = C1 * Z * Z / X13;
1640  Double_t EE2 = C2 * Z * Z / A;
1641  Double_t AUX = 1. + (9. * XJJ / 4. / QQ / X13);
1642  Double_t EE3 = XJJ * A * SI * SI / AUX;
1643  Double_t EE4 =
1644  AVOL * A + ASUR * TMath::Power(A, 2. / 3.) + AC * X13 + AZER;
1645  Double_t TOTA = EE1 + EE2 + EE3 + EE4;
1646  return (939.55 * XNEU + 938.77 * Z - TOTA);
1647 }
1648 
1649 
1650 
1651 
1655 
1657 {
1658  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1659  //Parameters are from Brack and Guet (copied from Simon code)
1660 
1661  Double_t av = 1.531e+01;
1662  Double_t as = 1.654e+01;
1663  Double_t ac = 6.882e-01;
1664  Double_t aa = 2.225e+01;
1665  Double_t ap = 9.399e+00;
1666  Double_t kap = 6.056e-01;
1667 
1668  Double_t eb = 0;
1669  eb += av * GetA();
1670  eb -= as * TMath::Power(GetA(), 2. / 3.);
1671  eb -= ac * GetZ() * (GetZ() - 1) / TMath::Power(GetA(), 1. / 3.);
1672  eb -= aa * TMath::Power(GetN() - GetZ(), 2.) / GetA();
1673 
1674  if (TMath::Even(GetA()))
1675  eb += ap * (TMath::Power(-1, GetN()) + TMath::Power(-1, GetZ())) / TMath::Power(GetA(), kap);
1676 
1677  return eb;
1678 
1679 }
1680 
1681 
1682 
1683 
1687 
1689 {
1690  //For sorting lists of nuclei according to their Z
1691  //Largest Z appears first in list
1692 
1693  if (GetZ() > ((KVNucleus*) obj)->GetZ()) {
1694  return -1;
1695  }
1696  else if (GetZ() < ((KVNucleus*) obj)->GetZ()) {
1697  return 1;
1698  }
1699  else {
1700  if (GetA() == ((KVNucleus*) obj)->GetA()) return 0;
1701  else if (GetA() > ((KVNucleus*) obj)->GetA()) return -1;
1702  else return 1;
1703  }
1704 }
1705 
1706 
1707 /*
1708 TH2F* KVNucleus::GetKnownNucleiChart(KVString method)
1709 {
1710  //Draw nuclei chart of tabulated nuclei and tagged as known in KaliVeda
1711  //The 2D histogram (AvsZ) has to be deleted by the user
1712  //Each content cell correponds to the method passed in argument of nucleus in MeV
1713  // Method Pattern has to be Double_t Method() or Double_t Method(obs = default value) in KVNucleus.h
1714 TH2F* chart = new TH2F("nuclei_known_charts",method.Data(),
1715  121,-0.5,120.5,
1716  351,-0.5,350.5);
1717 chart->SetXTitle("Atomic Number");
1718 chart->SetYTitle("Mass Number");
1719 
1720 TMethodCall *mt = new TMethodCall();
1721 mt->InitWithPrototype(this->IsA(),Form("%s",method.Data()),"");
1722 if (! mt->IsValid()) { delete mt; return 0; }
1723 delete mt;
1724 KVNucleus* ntemp = new KVNucleus();
1725 for (Int_t zz=0;zz<120;zz+=1){
1726  for (Int_t aa=0;aa<350;aa+=1){
1727  if (this->IsKnown(zz,aa)){
1728  mt = new TMethodCall();
1729  mt->InitWithPrototype(ntemp->IsA(),Form("%s",method.Data()),"");
1730  if (mt->ReturnType()==TMethodCall::kDouble){
1731  ntemp->SetZ(zz); ntemp->SetA(aa);
1732  Double_t ret; mt->Execute(ntemp,"",ret);
1733  chart->Fill(zz,aa,ret);
1734  }
1735  delete mt;
1736  }
1737  }
1738 }
1739 delete ntemp;
1740 return chart;
1741 
1742 }
1743 */
1744 
1745 
1749 
1751 {
1752  //Atomic mass unit in MeV
1753  //Reference: 2002 CODATA recommended values Reviews of Modern Physics 77, 1-107 (2005)
1754  return kAMU;
1755 };
1756 
1757 
1758 
1759 
1763 
1765 {
1766  //Retourne l'energie cintetique totale (MeV) du noyau pour
1767  //une valeur de Brho et d'etat de charge (Si 0-> Etat de charge=Z)
1768  Double_t C_mparns = KVNucleus::C() * 10;
1769 
1770  if (ChargeState == 0) ChargeState = GetZ();
1771 
1772  Double_t X = Brho * C_mparns * ChargeState;
1773 
1774  Double_t MassIon = GetMass() - ChargeState * KVNucleus::kMe;
1775 
1776  Double_t Result = TMath::Sqrt(MassIon * MassIon + X * X) - MassIon;
1777 
1778  return Result;
1779 
1780 }
1781 
1782 
1783 
1786 
1788 {
1789  // Return the reltive velocity between nuc and this in cm/ns.
1790  if (!nuc) return 0.;
1791  return (GetVelocity() - nuc->GetVelocity()).Mag();
1792 }
1793 
1794 
1795 
1806 
1808 {
1809  // Average or most probable Total Kinetic Energy [MeV] expected for fission based on various systematics
1810  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1811  // If nuc=0, this method returns the TKE for symmetric fission of this nucleus.
1812  // Else, it returns the expected TKE considering that nuc and the current nucleus arise
1813  // from the fisson of a compound nucleus.
1814  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1815  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1816  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1817  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1818 
1819  Double_t Ztot = GetZ();
1820  Double_t Atot = GetA();
1821  if (nuc) {
1822  Ztot += nuc->GetZ();
1823  Atot += nuc->GetA();
1824  }
1825  Double_t tke = 0;
1826  switch (formula) {
1827  case kDefaultFormula:
1828  case kHinde1987:
1829  if (nuc) tke = TKE_Hinde1987(GetZ(), GetA(), nuc->GetZ(), nuc->GetA());
1830  else tke = TKE_Hinde1987(GetZ() * 0.5, GetA() * 0.5, GetZ() - (GetZ() * 0.5), GetA() - (GetA() * 0.5));
1831  break;
1832 
1833  case kViola1985:
1834  tke = TKE_Viola1985(Ztot, Atot);
1835  break;
1836 
1837  case kViola1966:
1838  tke = TKE_Viola1966(Ztot, Atot);
1839  break;
1840 
1841  case kItkis1998:
1842  tke = TKE_Itkis1998(Ztot, Atot);
1843  break;
1844  }
1845 
1846  return tke;
1847 }
1848 
1849 
1850 
1856 
1858 {
1859  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1860  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1861  // This depends on the entrance channel: this nucleus is assumed to be the projectile,
1862  // while the target is given as argument.
1863 
1864  return TKE_Kozulin2014(GetZ(), target->GetZ(), GetA(), target->GetA());
1865 }
1866 
1867 
1868 
1879 
1881 {
1882  // Average/most probable relative velocity [cm/ns] expected for fission based on various systematics
1883  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1884  // If nuc=0, this method returns the relative velocity expected for the symmetric fission of this nucleus.
1885  // Else, it returns the expected relative velocity considering that nuc and the current nucleus arise
1886  // from the fisson of a compound nucleus.
1887  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1888  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1889  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1890  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1891 
1892  Double_t vrel = 0;
1893  Double_t mu = 0;
1894  if (nuc) {
1895  mu = nuc->GetMass() * GetMass() / (nuc->GetMass() + GetMass());
1896  }
1897  else {
1898  KVNucleus ff1(0.5 * GetZ(), 0.5 * GetA());
1899  KVNucleus ff2(GetZ() - ff1.GetZ(), GetA() - ff1.GetA());
1900  mu = ff1.GetMass() * ff2.GetMass() / (ff1.GetMass() + ff2.GetMass());
1901  }
1902 
1903  Double_t TKE = GetFissionTKE(nuc, formula);
1904  vrel = sqrt(2 * TKE / mu) * C();
1905 
1906  return vrel;
1907 }
1908 
1909 
1910 
1914 
1916 {
1917  // from: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987)
1918  // According to the authors, an extension to asymmetric fission based on TKE_Viola1985
1919  return 0.755 * z1 * z2 / (pow(a1, 1 / 3.) + pow(a2, 1 / 3.)) + 7.3;
1920 }
1921 
1922 
1923 
1926 
1928 {
1929  // from: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1930  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1931  return 0.1189 * za + 7.3;
1932 }
1933 
1934 
1935 
1938 
1940 {
1941  // from: V. E. Viola, Jr., Nuclear Data Sheets. Section A 1, 391 (1965).
1942  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1943  return 0.1071 * za + 22.2;
1944 }
1945 
1946 
1947 
1952 
1954 {
1955  // from: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1956  // Compared to Viola systematics, only heavy-ion induced fission is considered
1957  // A change of slope is observed for Z**2/A**1/3 > 900
1958 
1959  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1960  if (za < 900)
1961  return 0.131 * za;
1962  return 0.104 * za + 24.3;
1963 }
1964 
1965 
1966 
1970 
1972 {
1973  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1974  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1975 
1976  return 39.43 + .085 * pow(zp + zt, 2) / pow(ap + at, 1. / 3.);
1977 }
1978 
1979 
1980 
1981 
1988 
1990 {
1991  // Returns kTRUE if this nucleus is stable.
1992  // Definition of stable:
1993  // if the natural abundance is defined (look up in Abundance table)
1994  // OR
1995  // if lifetime is > min_lifetime
1996  if (GetAbundance() > 0.) return kTRUE;
1997  KVLifeTime* ptr = GetLifeTimePtr();
1998  return (ptr && !ptr->IsAResonance() && ptr->GetValue() > min_lifetime);
1999 }
2000 
2001 
2002 
2003 
2007 
2009 {
2010  // Returns kTRUE if this nucleus is a resonance.
2011  // In this case GetWidth() returns the width in MeV.
2012  KVLifeTime* ptr = GetLifeTimePtr();
2013  return (ptr && ptr->IsAResonance());
2014 }
2015 
2016 
2017 
2018 
2022 
2024 {
2025  // Returns width of resonance in MeV, if this nucleus
2026  // is indeed a resonance (IsResonance() returns kTRUE).
2027  KVLifeTime* ptr = GetLifeTimePtr();
2028  return ((ptr && ptr->IsAResonance()) ? ptr->GetValue() : 0.0);
2029 }
2030 
2031 
2032 
2033 
2037 
2039 {
2040  // Calculate and return the effective mass number of element Z
2041  // taking into account the abundance of naturally-occurring isotopes
2042 
2043  KVNumberList isotopes = GetKnownARange(Z);
2044  isotopes.Begin();
2045  Double_t Aeff = 0, wtot = 0;
2046  while (!isotopes.End()) {
2047 
2048  int A = isotopes.Next();
2049  Double_t abundance = GetAbundance(Z, A) / 100.;
2050  if (abundance > 0.) {
2051  Aeff += A * abundance;
2052  wtot += abundance;
2053  }
2054 
2055  }
2056  if (wtot > 0) Aeff /= wtot;
2057  return Aeff;
2058 }
2059 
2060 
2061 //-------------------------
2063 //-------------------------
2064 
2076 
2077 {
2078  //Nuclear Instruments and Methods 200 (1982) 605-608
2079  //Shima et al
2080  // "The present formula is useful for the collision range"
2081  // Zprojectile>=8
2082  // 4<=Ztarget<=79
2083  // Eproj<=6 MeV/A
2084  // Precision DeltaQ/Zproj <0.04.
2085  //
2086 
2087  //v=sqrt((2*E*1.6022)/(A*1.66054))*10.;
2088  //X=v/((3.6)*pow(Z,0.45));
2089 
2090  Double_t vel = GetVelocity().Mag(); // (cm/ns)
2091  vel *= 10; // (mm/ns)
2092  Double_t X = vel / ((3.6) * pow(GetZ(), 0.45));
2093 
2094  Double_t Q = GetZ() * (1 - exp(-1.25 * X + 0.32 * TMath::Power(X, 2.) - 0.11 * TMath::Power(X, 3.)));
2095  Q *= (1 - 0.0019 * (Ztarget - 6) * TMath::Sqrt(X) + 0.00001 * TMath::Power(Ztarget - 6, 2.) * X); //Correction respect to the carbon
2096 
2097  return Q;
2098 
2099 }
2100 
2101 
2102 //-------------------------
2104 //-------------------------
2105 
2107 
2108 {
2109  return 0.04 * GetZ();
2110 }
2111 
2112 
2113 
2118 
2119 void KVNucleus::Streamer(TBuffer& R__b)
2120 {
2121  // Stream an object of class KVNucleus.
2122  //
2123  // Streamer customized to correct masses of nuclei in data written with version <7
2124 
2125  UInt_t R__s, R__c;
2126  if (R__b.IsReading()) {
2127  Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
2128  R__b.ReadClassBuffer(KVNucleus::Class(), this, R__v, R__s, R__c);
2129  if (R__v < 7) {
2130  // Before v7, nuclear masses were actually atomic masses, including the electrons
2131  double m = GetMass();
2132  SetMass(m - GetZ()*kMe);
2133  }
2134  }
2135  else {
2136  R__b.WriteClassBuffer(KVNucleus::Class(), this);
2137  }
2138 }
2139 
2140 
int Int_t
unsigned int UInt_t
KVNDTManager * gNDTManager
#define MAXZ_ELEMENT_SYMBOL
Definition: KVNucleus.cpp:50
ClassImp(KVPartitionList) void KVPartitionList
Initialisation.
short Version_t
unsigned char UChar_t
char Char_t
bool Bool_t
double Double_t
const Bool_t kTRUE
const char Option_t
int type
float * q
double pow(double, double)
double exp(double)
Value of the relative abundance of isotopes.
Definition: KVAbundance.h:15
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:15
Bool_t IsAResonance() const
Definition: KVLifeTime.h:44
Simple class for store life time information of nucleus.
Definition: KVMassExcess.h:15
Nuclear Data Table manager.
Definition: KVNDTManager.h:21
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:125
UChar_t fZ
nuclear charge number (atomic number)
Definition: KVNucleus.h:130
Double_t ShimaChargeStatePrecision() const
Definition: KVNucleus.cpp:2103
static Double_t hbar
hbar*c in MeV.fm
Definition: KVNucleus.h:172
virtual void Clear(Option_t *opt="")
Definition: KVNucleus.cpp:298
const Char_t * GetSymbol(Option_t *opt="") const
Definition: KVNucleus.cpp:81
void SetExcitEnergy(Double_t e)
Definition: KVNucleus.cpp:865
Double_t GetExtraChargeRadius(Int_t z=-1, Int_t a=-1, Int_t rct=2) const
Definition: KVNucleus.cpp:1133
static Double_t LiquidDrop_BrackGuet(UInt_t A, UInt_t Z)
Definition: KVNucleus.cpp:1620
void Set(const Char_t *)
Definition: KVNucleus.cpp:177
Double_t GetAMeV() const
Definition: KVNucleus.cpp:1381
Double_t GetWidth() const
Definition: KVNucleus.cpp:2023
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:1927
void CheckZAndA(Int_t &z, Int_t &a) const
Definition: KVNucleus.cpp:852
static Int_t GetNFromZ(Double_t, Char_t mt)
Calculate neutron number from the element's atomic number Z.
Definition: KVNucleus.cpp:636
UChar_t fA
nuclear mass number
Definition: KVNucleus.h:129
Bool_t IsKnown(int z=-1, int a=-1) const
Definition: KVNucleus.cpp:1279
static Double_t GetRealAFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:444
Double_t GetSpin(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:987
Double_t GetExcitEnergy() const
Definition: KVNucleus.h:282
Int_t Compare(const TObject *obj) const
Definition: KVNucleus.cpp:1688
Double_t GetFissionTKE(const KVNucleus *nuc=0, Int_t formula=kDefaultFormula) const
Definition: KVNucleus.cpp:1807
void init()
Definition: KVNucleus.cpp:245
Double_t GetMassExcess(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:883
KVMassExcess * GetMassExcessPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:947
KVAbundance * GetAbundancePtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1259
static Double_t GetRealNFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:514
static Double_t u(void)
Definition: KVNucleus.cpp:1750
KVNucleus operator+(const KVNucleus &rhs)
Definition: KVNucleus.cpp:1524
virtual void Print(Option_t *t="") const
Display nucleus parameters.
Definition: KVNucleus.cpp:758
void SetZandN(Int_t z, Int_t n)
Set atomic number and mass number.
Definition: KVNucleus.cpp:746
Int_t GetA() const
Definition: KVNucleus.cpp:799
static Int_t IsMassGiven(const Char_t *)
Definition: KVNucleus.cpp:144
void SetA(Int_t a)
Definition: KVNucleus.cpp:655
KVNucleus & operator=(const KVNucleus &rhs)
KVNucleus assignment operator.
Definition: KVNucleus.cpp:1506
void SetN(Int_t n)
Definition: KVNucleus.cpp:685
Double_t GetMassGS() const
Definition: KVNucleus.h:289
static Double_t kMe
electron mass in MeV/c2
Definition: KVNucleus.h:170
void SetZ(Int_t z, Char_t mt=-1)
Definition: KVNucleus.cpp:704
Double_t LiquidDrop_Weizsacker()
Definition: KVNucleus.cpp:1656
Int_t GetMostAbundantA(Int_t z=-1) const
Definition: KVNucleus.cpp:1230
KVNucleus & operator+=(const KVNucleus &rhs)
KVNucleus addition and assignment operator.
Definition: KVNucleus.cpp:1589
Double_t GetNaturalA(Int_t zz=-1) const
Definition: KVNucleus.cpp:2038
Double_t GetFissionVelocity(KVNucleus *nuc=0, Int_t formula=kDefaultFormula)
Definition: KVNucleus.cpp:1880
static Double_t TKE_Itkis1998(Double_t z, Double_t a)
Definition: KVNucleus.cpp:1953
Int_t GetAWithMaxBindingEnergy(Int_t z=-1)
Definition: KVNucleus.cpp:1481
KVNumberList GetKnownARange(Int_t z=-1, Double_t tmin=0) const
Definition: KVNucleus.cpp:1398
Double_t GetExtraMassExcess(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:910
@ kEALResMass
Definition: KVNucleus.h:145
static Double_t e2
e^2/(4.pi.epsilon_0) in MeV.fm
Definition: KVNucleus.h:173
Double_t GetRelativeVelocity(KVNucleus *nuc)
Return the reltive velocity between nuc and this in cm/ns.
Definition: KVNucleus.cpp:1787
const Char_t * GetIsotopesList(Int_t zmin, Int_t zmax, Double_t tmin=0) const
Definition: KVNucleus.cpp:1453
@ kHinde1987
Definition: KVNucleus.h:157
@ kViola1985
Definition: KVNucleus.h:158
@ kDefaultFormula
Definition: KVNucleus.h:155
@ kViola1966
Definition: KVNucleus.h:159
@ kItkis1998
Definition: KVNucleus.h:156
Double_t GetBindingEnergyPerNucleon(Int_t z=-1, Int_t a=-1) const
Returns binding energy in MeV/A for this nucleus.
Definition: KVNucleus.cpp:1348
virtual void Copy(TObject &) const
Copy this KVNucleus into the KVNucleus object referenced by "obj".
Definition: KVNucleus.cpp:834
Int_t GetN() const
Return the number of neutron.
Definition: KVNucleus.cpp:781
KVNucleus & operator-=(const KVNucleus &rhs)
KVNucleus subtraction and assignment operator.
Definition: KVNucleus.cpp:1604
KVSpinParity * GetSpinParityPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:967
static UInt_t fNb_nuc
counts number of existing KVNucleus objects
Definition: KVNucleus.h:132
Bool_t IsResonance() const
Definition: KVNucleus.cpp:2008
Double_t DeduceEincFromBrho(Double_t Brho, Int_t ChargeState=0)
TH2F* GetKnownNucleiChart(KVString method="GetBindingEnergyPerNucleon");.
Definition: KVNucleus.cpp:1764
Double_t ShimaChargeState(Int_t) const
Definition: KVNucleus.cpp:2062
static Double_t kAMU
atomic mass unit in MeV
Definition: KVNucleus.h:169
int SetZFromSymbol(const Char_t *)
Definition: KVNucleus.cpp:225
void SetZandA(Int_t z, Int_t a)
Set atomic number and mass number.
Definition: KVNucleus.cpp:721
const Char_t * GetLatexSymbol(Option_t *opt="") const
Definition: KVNucleus.cpp:112
Int_t GetNpairs(Int_t type=kNN) const
Definition: KVNucleus.cpp:818
KVNumberList GetMeasuredARange(Int_t z=-1) const
returns range of a measured mass for a given element
Definition: KVNucleus.cpp:1424
void SetZAandE(Int_t z, Int_t a, Double_t ekin)
Set atomic number, mass number, and kinetic energy in MeV.
Definition: KVNucleus.cpp:733
Double_t GetQFasymTKE(KVNucleus *target)
Definition: KVNucleus.cpp:1857
KVChargeRadius * GetChargeRadiusPtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1193
static Double_t TKE_Hinde1987(Double_t z1, Double_t a1, Double_t z2, Double_t a2)
Definition: KVNucleus.cpp:1915
Double_t GetAbundance(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1212
static Int_t GetZFromSymbol(const Char_t *)
Definition: KVNucleus.cpp:206
KVLifeTime * GetLifeTimePtr(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1074
Double_t GetEnergyPerNucleon() const
Definition: KVNucleus.cpp:1365
static Char_t fElements[][3]
symbols of chemical elements
Definition: KVNucleus.h:133
Double_t GetParity(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1012
static Int_t GetAFromZ(Double_t, Char_t mt)
Definition: KVNucleus.cpp:564
Double_t GetAtomicMass(Int_t zz=-1, Int_t aa=-1) const
Definition: KVNucleus.cpp:929
Bool_t IsStable(Double_t min_lifetime=1.0e+15) const
Definition: KVNucleus.cpp:1989
UChar_t fMassFormula
mass formula for calculating A from Z
Definition: KVNucleus.h:131
Double_t GetBindingEnergy(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1302
Int_t GetZ() const
Return the number of proton / atomic number.
Definition: KVNucleus.cpp:770
Double_t GetLiquidDropBindingEnergy(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1327
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:1939
static Double_t TKE_Kozulin2014(Double_t zp, Double_t zt, Double_t ap, Double_t at)
Definition: KVNucleus.cpp:1971
Double_t GetChargeRadius(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1095
Double_t GetLifeTime(Int_t z=-1, Int_t a=-1) const
Definition: KVNucleus.cpp:1040
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:83
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:197
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:398
virtual void SetMass(Double_t m)
Definition: KVParticle.h:568
TVector3 GetMomentum() const
Definition: KVParticle.h:606
void SetMomentum(const TVector3 &v)
Definition: KVParticle.h:576
Double_t GetEnergy() const
Definition: KVParticle.h:623
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
virtual void Copy(TObject &) const
Definition: KVParticle.cpp:269
void Set4Mom(const TLorentzVector &p)
Definition: KVParticle.h:591
virtual void Print(Option_t *t="") const
print out characteristics of particle
Definition: KVParticle.cpp:212
Double_t GetMass() const
Definition: KVParticle.h:572
TVector3 GetVelocity() const
returns velocity vector in cm/ns units
Spin parity assignment of nuclear levels.
Definition: KVSpinParity.h:15
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:72
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
virtual Version_t ReadVersion(UInt_t *start=0, UInt_t *bcnt=0, const TClass *cl=0)=0
Bool_t IsReading() const
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
Double_t X() const
TLorentzVector operator-() const
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)
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
const char * Data() const
void Form(const char *fmt,...)
TString & Remove(EStripType s, char c)
VecExpr< UnaryOp< Sqrt< T >, SVector< T, D >, T >, T, D > sqrt(const SVector< T, D > &rhs)
const Int_t n
Double_t ex[n]
const long double m
Definition: KVUnits.h:70
void Error(const char *location, const char *va_(fmt),...)
std::array< T, i > as(SEXP &obj)
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)
auto * a
#define sym(otri1, otri2)