ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4NucleiProperties.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4NucleiProperties.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 //
28 //
29 // ------------------------------------------------------------
30 // GEANT 4 class header file
31 //
32 // ------------------------------------------------------------
33 //
34 // Hadronic Process: Nuclear De-excitations
35 // by V. Lara (Oct 1998)
36 // Migrate into particles category by H.Kurashige (17 Nov. 98)
37 // Added Shell-Pairing corrections to the Cameron mass
38 // excess formula by V.Lara (9 May 99)
39 // 090331 Migrate to AME03 by Koi, Tatsumi
40 
41 #include "G4NucleiProperties.hh"
42 
45 #include "G4ParticleTable.hh"
46 
47 #include "G4PhysicalConstants.hh"
48 #include "G4SystemOfUnits.hh"
49 
56 
58 {
59  G4double mass =0.0;
60 
61  if (std::fabs(A - G4int(A)) > 1.e-10) {
62  mass = NuclearMass(A,Z);
63 
64  } else {
65  // use mass table
66  G4int iZ = G4int(Z);
67  G4int iA = G4int(A);
68  mass =GetNuclearMass(iA,iZ);
69  }
70  return mass;
71 }
72 
73 
75 {
76  if (mass_proton <= 0.0 ) {
77  const G4ParticleDefinition * nucleus = nullptr;
78  nucleus = G4ParticleTable::GetParticleTable()->FindParticle("neutron"); // neutron
79  if (nucleus!=nullptr) mass_neutron = nucleus->GetPDGMass();
80 
81  nucleus = G4ParticleTable::GetParticleTable()->FindParticle("deuteron"); // deuteron
82  if (nucleus!=nullptr) mass_deuteron = nucleus->GetPDGMass();
83 
84  nucleus = G4ParticleTable::GetParticleTable()->FindParticle("triton"); // triton
85  if (nucleus!=nullptr) mass_triton = nucleus->GetPDGMass();
86 
87  nucleus = G4ParticleTable::GetParticleTable()->FindParticle("alpha"); // alpha
88  if (nucleus!=nullptr) mass_alpha = nucleus->GetPDGMass();
89 
90  nucleus = G4ParticleTable::GetParticleTable()->FindParticle("He3"); // He3
91  if (nucleus!=nullptr) mass_He3 = nucleus->GetPDGMass();
92 
93  nucleus = G4ParticleTable::GetParticleTable()->FindParticle("proton"); // proton
94  if (nucleus!=nullptr) mass_proton = nucleus->GetPDGMass();
95  }
96 
97  if (A < 1 || Z < 0 || Z > A) {
98 #ifdef G4VERBOSE
99  if (G4ParticleTable::GetParticleTable()->GetVerboseLevel()>0) {
100  G4cout << "G4NucleiProperties::GetNuclearMass: Wrong values for A = " << A
101  << " and Z = " << Z << G4endl;
102  }
103 #endif
104  return 0.0;
105  }
106 
107  G4double mass= -1.;
108  if ( (Z<=2) ) {
109  // light nuclei
110  if ( (Z==1)&&(A==1) ) {
111  mass = mass_proton;
112  } else if ( (Z==0)&&(A==1) ) {
113  mass = mass_neutron;
114  } else if ( (Z==1)&&(A==2) ) {
115  mass = mass_deuteron;
116  } else if ( (Z==1)&&(A==3) ) {
117  mass = mass_triton;
118  } else if ( (Z==2)&&(A==4) ) {
119  mass = mass_alpha;
120  } else if ( (Z==2)&&(A==3) ) {
121  mass = mass_He3;
122  }
123  }
124 
125  if (mass < 0.) {
127  // AME table
130  // Theoretical table
132  } else if ( Z == A ) {
133  mass = A*mass_proton;
134  } else if( 0 == Z ) {
135  mass = A*mass_neutron;
136  } else {
137  mass = NuclearMass(G4double(A),G4double(Z));
138  }
139  }
140 
141  if (mass < 0.) mass = 0.0;
142  return mass;
143 }
144 
146 {
147  G4int iA = G4int(A);
148  G4int iZ = G4int(Z);
149  return IsInStableTable(iA, iZ);
150 }
151 
153 {
154  if (A < 1 || Z < 0 || Z > A) {
155 #ifdef G4VERBOSE
156  if (G4ParticleTable::GetParticleTable()->GetVerboseLevel()>0) {
157  G4cout << "G4NucleiProperties::IsInStableTable: Wrong values for A = "
158  << A << " and Z = " << Z << G4endl;
159  }
160 #endif
161  return false;
162  }
163 
165 }
166 
168 {
169  G4int iA = G4int(A);
170  G4int iZ = G4int(Z);
171  return GetMassExcess(iA,iZ);
172 }
173 
175 {
176  if (A < 1 || Z < 0 || Z > A) {
177 #ifdef G4VERBOSE
178  if (G4ParticleTable::GetParticleTable()->GetVerboseLevel()>0) {
179  G4cout << "G4NucleiProperties::GetMassExccess: Wrong values for A = "
180  << A << " and Z = " << Z << G4endl;
181  }
182 #endif
183  return 0.0;
184 
185  } else {
186 
188  // AME table
192  } else {
193  return MassExcess(A,Z);
194  }
195  }
196 
197 }
198 
199 
201 {
202  if (A < 1 || Z < 0 || Z > A) {
203 #ifdef G4VERBOSE
204  if (G4ParticleTable::GetParticleTable()->GetVerboseLevel()>0) {
205  G4cout << "G4NucleiProperties::GetAtomicMass: Wrong values for A = "
206  << A << " and Z = " << Z << G4endl;
207  }
208 #endif
209  return 0.0;
210 
211  } else if (std::fabs(A - G4int(A)) > 1.e-10) {
212  return AtomicMass(A,Z);
213 
214  } else {
215  G4int iA = G4int(A);
216  G4int iZ = G4int(Z);
221  } else {
222  return AtomicMass(A,Z);
223  }
224  }
225 }
226 
228 {
229  G4int iA = G4int(A);
230  G4int iZ = G4int(Z);
231  return GetBindingEnergy(iA,iZ);
232 }
233 
235 {
236  if (A < 1 || Z < 0 || Z > A) {
237 #ifdef G4VERBOSE
238  if (G4ParticleTable::GetParticleTable()->GetVerboseLevel()>0) {
239  G4cout << "G4NucleiProperties::GetMassExccess: Wrong values for A = "
240  << A << " and Z = " << Z << G4endl;
241  }
242 #endif
243  return 0.0;
244 
245  } else {
250  }else {
251  return BindingEnergy(A,Z);
252  }
253  }
254 }
255 
256 
258 {
259  return GetAtomicMass(A,Z) - A*amu_c2;
260 }
261 
263 {
264  G4double hydrogen_mass_excess;
265  G4double neutron_mass_excess;
266  hydrogen_mass_excess = G4NucleiPropertiesTableAME12::GetMassExcess(1,1);
267  neutron_mass_excess = G4NucleiPropertiesTableAME12::GetMassExcess(0,1);
268  G4double mass =
269  (A-Z)*neutron_mass_excess + Z*hydrogen_mass_excess - BindingEnergy(A,Z) + A*amu_c2;
270 
271  return mass;
272 }
273 
275 {
276  if (A < 1 || Z < 0 || Z > A) {
277 #ifdef G4VERBOSE
278  if (G4ParticleTable::GetParticleTable()->GetVerboseLevel()>0) {
279  G4cout << "G4NucleiProperties::NuclearMass: Wrong values for A = "
280  << A << " and Z = " << Z << G4endl;
281  }
282 #endif
283  return 0.0;
284  }
285 
286  G4double mass = AtomicMass(A,Z);
287  // atomic mass is converted to nuclear mass according formula in AME03 and 12
288  mass -= Z*electron_mass_c2;
289  mass += ( 14.4381*std::pow ( Z , 2.39 ) + 1.55468*1e-6*std::pow ( Z , 5.35 ) )*eV;
290 
291  return mass;
292 }
293 
295 {
296  //
297  // Weitzsaecker's Mass formula
298  //
299  G4int Npairing = G4int(A-Z)%2; // pairing
300  G4int Zpairing = G4int(Z)%2;
301  G4double binding =
302  - 15.67*A // nuclear volume
303  + 17.23*std::pow(A,2./3.) // surface energy
304  + 93.15*((A/2.-Z)*(A/2.-Z))/A // asymmetry
305  + 0.6984523*Z*Z*std::pow(A,-1./3.); // coulomb
306  if( Npairing == Zpairing ) binding += (Npairing+Zpairing-1) * 12.0 / std::sqrt(A); // pairing
307 
308  return -binding*MeV;
309 }
310