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