KaliVeda  1.12/06
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 
1506 
1508 {
1509  // implementation of AddGroup(const Char_t* groupname,KVParticleCondition* pc)
1510  // Can be overriden in child classes [unlike
1511  // KVParticle::AddGroup(const Char_t* groupname,KVParticleCondition* pc), which cannot]
1512 
1513  if (pc) {
1514  //pc->SetParticleClassName(this->IsA()->GetName());
1515  if (pc->Test(this)) AddGroup_Sanscondition(groupname);
1516  }
1517 }
1518 
1519 
1520 
1521 
1524 
1526 {
1527  //KVNucleus assignment operator.
1528 
1529  if (&rhs != this) {
1530  rhs.Copy(*this);
1531  }
1532  return *this;
1533 }
1534 
1535 
1536 
1537 
1542 
1544 {
1545  // KVNucleus addition operator.
1546  // Add two nuclei together to form a compound nucleus whose Z, A, momentum
1547  // and excitation energy are calculated from energy and momentum conservation.
1548 
1549  KVNucleus& lhs = *this;
1550  Int_t ztot = lhs.GetZ() + rhs.GetZ();
1551  Int_t atot = lhs.GetA() + ((KVNucleus&) rhs).GetA();
1552  KVNucleus CN(ztot, atot);
1553 
1554  Double_t etot = lhs.E() + rhs.E();
1555  TVector3 ptot = lhs.GetMomentum() + rhs.GetMomentum();
1556  TLorentzVector q(ptot, etot);
1557  CN.Set4Mom(q);
1558 
1559  return CN;
1560 
1561 }
1562 
1563 
1564 
1565 
1572 
1574 {
1575  // KVNucleus subtraction operator.
1576  // If the LHS is a compound nucleus and the RHS an emitted nucleus
1577  // (which may or may not be excited) then the result of the subtraction
1578  // is the residual nucleus, with recoil and residual excitation calculated
1579  // by conservation laws.
1580 
1581  KVNucleus& lhs = *this;
1582  Int_t zres = lhs.GetZ() - rhs.GetZ();
1583  Int_t ares = lhs.GetA() - ((KVNucleus&) rhs).GetA();
1584  Double_t eres = lhs.E() - rhs.E();
1585  TVector3 pres = lhs.GetMomentum() - rhs.GetMomentum();
1586 
1587  if (zres < 0 || ares < 0 || eres < 0) {
1588  Warning("operator-(const KVNucleus &rhs)",
1589  "Cannot subtract nuclei, resulting Z=%d A=%d E=%lf", zres, ares, eres);
1590  KVNucleus RES;
1591  RES.Clear();
1592  return RES;
1593  }
1594  else {
1595  KVNucleus RES(zres, ares); //mass of nucleus includes mass excess
1596  TLorentzVector q(pres, eres);
1597  RES.Set4Mom(q);
1598  return RES;
1599  }
1600 }
1601 
1602 
1603 
1604 
1607 
1609 {
1610  //KVNucleus addition and assignment operator.
1611 
1612  KVNucleus temp = (*this) + rhs;
1613  (*this) = temp;
1614  return *this;
1615 }
1616 
1617 
1618 
1619 
1622 
1624 {
1625  //KVNucleus subtraction and assignment operator.
1626 
1627  KVNucleus temp = (*this) - rhs;
1628  (*this) = temp;
1629  return *this;
1630 }
1631 
1632 
1633 
1634 
1638 
1640 {
1641  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1642  //Parameters are from Brack and Guet (copied from Simon code)
1643 
1644  Double_t A = (Double_t) aa;
1645  Double_t Z = (Double_t) zz;
1646  Double_t AVOL = 15.776;
1647  Double_t ASUR = -17.22;
1648  Double_t AC = -10.24;
1649  Double_t AZER = 8.;
1650  Double_t XJJ = -30.03;
1651  Double_t QQ = -35.4;
1652  Double_t C1 = -.737;
1653  Double_t C2 = 1.28;
1654 
1655  Double_t XNEU = A - Z;
1656  Double_t SI = (XNEU - Z) / A;
1657  Double_t X13 = TMath::Power(A, 1. / 3.);
1658  Double_t EE1 = C1 * Z * Z / X13;
1659  Double_t EE2 = C2 * Z * Z / A;
1660  Double_t AUX = 1. + (9. * XJJ / 4. / QQ / X13);
1661  Double_t EE3 = XJJ * A * SI * SI / AUX;
1662  Double_t EE4 =
1663  AVOL * A + ASUR * TMath::Power(A, 2. / 3.) + AC * X13 + AZER;
1664  Double_t TOTA = EE1 + EE2 + EE3 + EE4;
1665  return (939.55 * XNEU + 938.77 * Z - TOTA);
1666 }
1667 
1668 
1669 
1670 
1674 
1676 {
1677  //Liquid drop mass formula used for nuclei not in mass table (extrapolation).
1678  //Parameters are from Brack and Guet (copied from Simon code)
1679 
1680  Double_t av = 1.531e+01;
1681  Double_t as = 1.654e+01;
1682  Double_t ac = 6.882e-01;
1683  Double_t aa = 2.225e+01;
1684  Double_t ap = 9.399e+00;
1685  Double_t kap = 6.056e-01;
1686 
1687  Double_t eb = 0;
1688  eb += av * GetA();
1689  eb -= as * TMath::Power(GetA(), 2. / 3.);
1690  eb -= ac * GetZ() * (GetZ() - 1) / TMath::Power(GetA(), 1. / 3.);
1691  eb -= aa * TMath::Power(GetN() - GetZ(), 2.) / GetA();
1692 
1693  if (TMath::Even(GetA()))
1694  eb += ap * (TMath::Power(-1, GetN()) + TMath::Power(-1, GetZ())) / TMath::Power(GetA(), kap);
1695 
1696  return eb;
1697 
1698 }
1699 
1700 
1701 
1702 
1706 
1708 {
1709  //For sorting lists of nuclei according to their Z
1710  //Largest Z appears first in list
1711 
1712  if (GetZ() > ((KVNucleus*) obj)->GetZ()) {
1713  return -1;
1714  }
1715  else if (GetZ() < ((KVNucleus*) obj)->GetZ()) {
1716  return 1;
1717  }
1718  else {
1719  if (GetA() == ((KVNucleus*) obj)->GetA()) return 0;
1720  else if (GetA() > ((KVNucleus*) obj)->GetA()) return -1;
1721  else return 1;
1722  }
1723 }
1724 
1725 
1726 /*
1727 TH2F* KVNucleus::GetKnownNucleiChart(KVString method)
1728 {
1729  //Draw nuclei chart of tabulated nuclei and tagged as known in KaliVeda
1730  //The 2D histogram (AvsZ) has to be deleted by the user
1731  //Each content cell correponds to the method passed in argument of nucleus in MeV
1732  // Method Pattern has to be Double_t Method() or Double_t Method(obs = default value) in KVNucleus.h
1733 TH2F* chart = new TH2F("nuclei_known_charts",method.Data(),
1734  121,-0.5,120.5,
1735  351,-0.5,350.5);
1736 chart->SetXTitle("Atomic Number");
1737 chart->SetYTitle("Mass Number");
1738 
1739 TMethodCall *mt = new TMethodCall();
1740 mt->InitWithPrototype(this->IsA(),Form("%s",method.Data()),"");
1741 if (! mt->IsValid()) { delete mt; return 0; }
1742 delete mt;
1743 KVNucleus* ntemp = new KVNucleus();
1744 for (Int_t zz=0;zz<120;zz+=1){
1745  for (Int_t aa=0;aa<350;aa+=1){
1746  if (this->IsKnown(zz,aa)){
1747  mt = new TMethodCall();
1748  mt->InitWithPrototype(ntemp->IsA(),Form("%s",method.Data()),"");
1749  if (mt->ReturnType()==TMethodCall::kDouble){
1750  ntemp->SetZ(zz); ntemp->SetA(aa);
1751  Double_t ret; mt->Execute(ntemp,"",ret);
1752  chart->Fill(zz,aa,ret);
1753  }
1754  delete mt;
1755  }
1756  }
1757 }
1758 delete ntemp;
1759 return chart;
1760 
1761 }
1762 */
1763 
1764 
1768 
1770 {
1771  //Atomic mass unit in MeV
1772  //Reference: 2002 CODATA recommended values Reviews of Modern Physics 77, 1-107 (2005)
1773  return kAMU;
1774 };
1775 
1776 
1777 
1778 
1782 
1784 {
1785  //Retourne l'energie cintetique totale (MeV) du noyau pour
1786  //une valeur de Brho et d'etat de charge (Si 0-> Etat de charge=Z)
1787  Double_t C_mparns = KVNucleus::C() * 10;
1788 
1789  if (ChargeState == 0) ChargeState = GetZ();
1790 
1791  Double_t X = Brho * C_mparns * ChargeState;
1792 
1793  Double_t MassIon = GetMass() - ChargeState * KVNucleus::kMe;
1794 
1795  Double_t Result = TMath::Sqrt(MassIon * MassIon + X * X) - MassIon;
1796 
1797  return Result;
1798 
1799 }
1800 
1801 
1802 
1805 
1807 {
1808  // Return the reltive velocity between nuc and this in cm/ns.
1809  if (!nuc) return 0.;
1810  return (GetVelocity() - nuc->GetVelocity()).Mag();
1811 }
1812 
1813 
1814 
1825 
1827 {
1828  // Average or most probable Total Kinetic Energy [MeV] expected for fission based on various systematics
1829  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1830  // If nuc=0, this method returns the TKE for symmetric fission of this nucleus.
1831  // Else, it returns the expected TKE considering that nuc and the current nucleus arise
1832  // from the fisson of a compound nucleus.
1833  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1834  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1835  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1836  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1837 
1838  Double_t Ztot = GetZ();
1839  Double_t Atot = GetA();
1840  if (nuc) {
1841  Ztot += nuc->GetZ();
1842  Atot += nuc->GetA();
1843  }
1844  Double_t tke = 0;
1845  switch (formula) {
1846  case kDefaultFormula:
1847  case kHinde1987:
1848  if (nuc) tke = TKE_Hinde1987(GetZ(), GetA(), nuc->GetZ(), nuc->GetA());
1849  else tke = TKE_Hinde1987(GetZ() * 0.5, GetA() * 0.5, GetZ() - (GetZ() * 0.5), GetA() - (GetA() * 0.5));
1850  break;
1851 
1852  case kViola1985:
1853  tke = TKE_Viola1985(Ztot, Atot);
1854  break;
1855 
1856  case kViola1966:
1857  tke = TKE_Viola1966(Ztot, Atot);
1858  break;
1859 
1860  case kItkis1998:
1861  tke = TKE_Itkis1998(Ztot, Atot);
1862  break;
1863  }
1864 
1865  return tke;
1866 }
1867 
1868 
1869 
1875 
1877 {
1878  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1879  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1880  // This depends on the entrance channel: this nucleus is assumed to be the projectile,
1881  // while the target is given as argument.
1882 
1883  return TKE_Kozulin2014(GetZ(), target->GetZ(), GetA(), target->GetA());
1884 }
1885 
1886 
1887 
1898 
1900 {
1901  // Average/most probable relative velocity [cm/ns] expected for fission based on various systematics
1902  // for fission of highly-excited nuclei produced in heavy-ion reactions.
1903  // If nuc=0, this method returns the relative velocity expected for the symmetric fission of this nucleus.
1904  // Else, it returns the expected relative velocity considering that nuc and the current nucleus arise
1905  // from the fisson of a compound nucleus.
1906  // - kItkis1998: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1907  // - kDefaultFormula = kHinde1987: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987).
1908  // - kViola1985: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1909  // - kViola1966: V. E. Viola, Jr. , Nuclear Data Sheets. Section A 1, 391 (1965).
1910 
1911  Double_t vrel = 0;
1912  Double_t mu = 0;
1913  if (nuc) {
1914  mu = nuc->GetMass() * GetMass() / (nuc->GetMass() + GetMass());
1915  }
1916  else {
1917  KVNucleus ff1(0.5 * GetZ(), 0.5 * GetA());
1918  KVNucleus ff2(GetZ() - ff1.GetZ(), GetA() - ff1.GetA());
1919  mu = ff1.GetMass() * ff2.GetMass() / (ff1.GetMass() + ff2.GetMass());
1920  }
1921 
1922  Double_t TKE = GetFissionTKE(nuc, formula);
1923  vrel = sqrt(2 * TKE / mu) * C();
1924 
1925  return vrel;
1926 }
1927 
1928 
1929 
1933 
1935 {
1936  // from: D. Hinde, J. Leigh, J. Bokhorst, J. Newton, R. Walsh, and J. Boldeman, Nuclear Physics A 472, 318 (1987)
1937  // According to the authors, an extension to asymmetric fission based on TKE_Viola1985
1938  return 0.755 * z1 * z2 / (pow(a1, 1 / 3.) + pow(a2, 1 / 3.)) + 7.3;
1939 }
1940 
1941 
1942 
1945 
1947 {
1948  // from: V. E. Viola, K. Kwiatkowski, and M. Walker, Physical Review C 31, 1550 (1985).
1949  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1950  return 0.1189 * za + 7.3;
1951 }
1952 
1953 
1954 
1957 
1959 {
1960  // from: V. E. Viola, Jr., Nuclear Data Sheets. Section A 1, 391 (1965).
1961  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1962  return 0.1071 * za + 22.2;
1963 }
1964 
1965 
1966 
1971 
1973 {
1974  // from: M.G. Itkis & A. Ya. Rusanov, Phys. Part. Nucl. 29, 160 (1998)
1975  // Compared to Viola systematics, only heavy-ion induced fission is considered
1976  // A change of slope is observed for Z**2/A**1/3 > 900
1977 
1978  Double_t za = pow(z, 2) / pow(a, 1. / 3.);
1979  if (za < 900)
1980  return 0.131 * za;
1981  return 0.104 * za + 24.3;
1982 }
1983 
1984 
1985 
1989 
1991 {
1992  // <TKE> of asymmetric QuasiFission fragments (for the fragment mass where the QFasym yield is maximal)
1993  // E.M. Kozulin et al PHYSICAL REVIEW C 90, 054608 (2014)
1994 
1995  return 39.43 + .085 * pow(zp + zt, 2) / pow(ap + at, 1. / 3.);
1996 }
1997 
1998 
1999 
2000 
2007 
2009 {
2010  // Returns kTRUE if this nucleus is stable.
2011  // Definition of stable:
2012  // if the natural abundance is defined (look up in Abundance table)
2013  // OR
2014  // if lifetime is > min_lifetime
2015  if (GetAbundance() > 0.) return kTRUE;
2016  KVLifeTime* ptr = GetLifeTimePtr();
2017  return (ptr && !ptr->IsAResonance() && ptr->GetValue() > min_lifetime);
2018 }
2019 
2020 
2021 
2022 
2026 
2028 {
2029  // Returns kTRUE if this nucleus is a resonance.
2030  // In this case GetWidth() returns the width in MeV.
2031  KVLifeTime* ptr = GetLifeTimePtr();
2032  return (ptr && ptr->IsAResonance());
2033 }
2034 
2035 
2036 
2037 
2041 
2043 {
2044  // Returns width of resonance in MeV, if this nucleus
2045  // is indeed a resonance (IsResonance() returns kTRUE).
2046  KVLifeTime* ptr = GetLifeTimePtr();
2047  return ((ptr && ptr->IsAResonance()) ? ptr->GetValue() : 0.0);
2048 }
2049 
2050 
2051 
2052 
2056 
2058 {
2059  // Calculate and return the effective mass number of element Z
2060  // taking into account the abundance of naturally-occurring isotopes
2061 
2062  KVNumberList isotopes = GetKnownARange(Z);
2063  isotopes.Begin();
2064  Double_t Aeff = 0, wtot = 0;
2065  while (!isotopes.End()) {
2066 
2067  int A = isotopes.Next();
2068  Double_t abundance = GetAbundance(Z, A) / 100.;
2069  if (abundance > 0.) {
2070  Aeff += A * abundance;
2071  wtot += abundance;
2072  }
2073 
2074  }
2075  if (wtot > 0) Aeff /= wtot;
2076  return Aeff;
2077 }
2078 
2079 
2080 //-------------------------
2082 //-------------------------
2083 
2095 
2096 {
2097  //Nuclear Instruments and Methods 200 (1982) 605-608
2098  //Shima et al
2099  // "The present formula is useful for the collision range"
2100  // Zprojectile>=8
2101  // 4<=Ztarget<=79
2102  // Eproj<=6 MeV/A
2103  // Precision DeltaQ/Zproj <0.04.
2104  //
2105 
2106  //v=sqrt((2*E*1.6022)/(A*1.66054))*10.;
2107  //X=v/((3.6)*pow(Z,0.45));
2108 
2109  Double_t vel = GetVelocity().Mag(); // (cm/ns)
2110  vel *= 10; // (mm/ns)
2111  Double_t X = vel / ((3.6) * pow(GetZ(), 0.45));
2112 
2113  Double_t Q = GetZ() * (1 - exp(-1.25 * X + 0.32 * TMath::Power(X, 2.) - 0.11 * TMath::Power(X, 3.)));
2114  Q *= (1 - 0.0019 * (Ztarget - 6) * TMath::Sqrt(X) + 0.00001 * TMath::Power(Ztarget - 6, 2.) * X); //Correction respect to the carbon
2115 
2116  return Q;
2117 
2118 }
2119 
2120 
2121 //-------------------------
2123 //-------------------------
2124 
2126 
2127 {
2128  return 0.04 * GetZ();
2129 }
2130 
2131 
2132 
2137 
2138 void KVNucleus::Streamer(TBuffer& R__b)
2139 {
2140  // Stream an object of class KVNucleus.
2141  //
2142  // Streamer customized to correct masses of nuclei in data written with version <7
2143 
2144  UInt_t R__s, R__c;
2145  if (R__b.IsReading()) {
2146  Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
2147  R__b.ReadClassBuffer(KVNucleus::Class(), this, R__v, R__s, R__c);
2148  if (R__v < 7) {
2149  // Before v7, nuclear masses were actually atomic masses, including the electrons
2150  double m = GetMass();
2151  SetMass(m - GetZ()*kMe);
2152  }
2153  }
2154  else {
2155  R__b.WriteClassBuffer(KVNucleus::Class(), this);
2156  }
2157 }
2158 
2159 
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:2122
static Double_t hbar
hbar*c in MeV.fm
Definition: KVNucleus.h:175
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:1639
void Set(const Char_t *)
Definition: KVNucleus.cpp:177
Double_t GetAMeV() const
Definition: KVNucleus.cpp:1381
Double_t GetWidth() const
Definition: KVNucleus.cpp:2042
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:1946
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:285
Int_t Compare(const TObject *obj) const
Definition: KVNucleus.cpp:1707
Double_t GetFissionTKE(const KVNucleus *nuc=0, Int_t formula=kDefaultFormula) const
Definition: KVNucleus.cpp:1826
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:1769
KVNucleus operator+(const KVNucleus &rhs)
Definition: KVNucleus.cpp:1543
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:1525
void SetN(Int_t n)
Definition: KVNucleus.cpp:685
Double_t GetMassGS() const
Definition: KVNucleus.h:292
static Double_t kMe
electron mass in MeV/c2
Definition: KVNucleus.h:173
void SetZ(Int_t z, Char_t mt=-1)
Definition: KVNucleus.cpp:704
Double_t LiquidDrop_Weizsacker()
Definition: KVNucleus.cpp:1675
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:1608
Double_t GetNaturalA(Int_t zz=-1) const
Definition: KVNucleus.cpp:2057
Double_t GetFissionVelocity(KVNucleus *nuc=0, Int_t formula=kDefaultFormula)
Definition: KVNucleus.cpp:1899
static Double_t TKE_Itkis1998(Double_t z, Double_t a)
Definition: KVNucleus.cpp:1972
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:148
static Double_t e2
e^2/(4.pi.epsilon_0) in MeV.fm
Definition: KVNucleus.h:176
Double_t GetRelativeVelocity(KVNucleus *nuc)
Return the reltive velocity between nuc and this in cm/ns.
Definition: KVNucleus.cpp:1806
const Char_t * GetIsotopesList(Int_t zmin, Int_t zmax, Double_t tmin=0) const
Definition: KVNucleus.cpp:1453
virtual void AddGroup_Withcondition(const Char_t *groupname, KVParticleCondition *)
Definition: KVNucleus.cpp:1507
@ kHinde1987
Definition: KVNucleus.h:160
@ kViola1985
Definition: KVNucleus.h:161
@ kDefaultFormula
Definition: KVNucleus.h:158
@ kViola1966
Definition: KVNucleus.h:162
@ kItkis1998
Definition: KVNucleus.h:159
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:1623
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:2027
Double_t DeduceEincFromBrho(Double_t Brho, Int_t ChargeState=0)
TH2F* GetKnownNucleiChart(KVString method="GetBindingEnergyPerNucleon");.
Definition: KVNucleus.cpp:1783
Double_t ShimaChargeState(Int_t) const
Definition: KVNucleus.cpp:2081
static Double_t kAMU
atomic mass unit in MeV
Definition: KVNucleus.h:172
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:1876
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:1934
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:2008
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:1958
static Double_t TKE_Kozulin2014(Double_t zp, Double_t zt, Double_t ap, Double_t at)
Definition: KVNucleus.cpp:1990
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:196
void Begin(void) const
void Add(Int_t)
Add value 'n' to the list.
Int_t Next(void) const
Handles particle selection criteria for data analysis classes ,.
Bool_t Test(const KVNucleus *nuc) const
Base class for relativistic kinematics of massive particles.
Definition: KVParticle.h:398
virtual void SetMass(Double_t m)
Definition: KVParticle.h:527
TVector3 GetMomentum() const
Definition: KVParticle.h:565
void SetMomentum(const TVector3 &v)
Definition: KVParticle.h:535
Double_t GetEnergy() const
Definition: KVParticle.h:582
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:289
virtual void Copy(TObject &) const
Definition: KVParticle.cpp:266
void Set4Mom(const TLorentzVector &p)
Definition: KVParticle.h:550
virtual void Print(Option_t *t="") const
print out characteristics of particle
Definition: KVParticle.cpp:212
Double_t GetMass() const
Definition: KVParticle.h:531
virtual void AddGroup_Sanscondition(const Char_t *groupname, const Char_t *from="")
Definition: KVParticle.cpp:448
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)