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