Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4INCLINuclearPotential.hh
Go to the documentation of this file.
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// INCL++ intra-nuclear cascade model
27// Alain Boudard, CEA-Saclay, France
28// Joseph Cugnon, University of Liege, Belgium
29// Jean-Christophe David, CEA-Saclay, France
30// Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
31// Sylvie Leray, CEA-Saclay, France
32// Davide Mancusi, CEA-Saclay, France
33//
34#define INCLXX_IN_GEANT4_MODE 1
35
36#include "globals.hh"
37
38/** \file G4INCLINuclearPotential.hh
39 * \brief Abstract interface to the nuclear potential.
40 *
41 * NuclearPotential-like classes should provide access to the value of the
42 * potential of a particle in a particular context. For example, an instance of
43 * a NuclearPotential class should be associated to every nucleus.
44 *
45 * \date 17 January 2011
46 * \author Davide Mancusi
47 */
48
49#ifndef G4INCLINUCLEARPOTENTIAL_HH
50#define G4INCLINUCLEARPOTENTIAL_HH 1
51
52#include "G4INCLParticle.hh"
53#include "G4INCLRandom.hh"
55#include <map>
56// #include <cassert>
57
58namespace G4INCL {
59
60 namespace NuclearPotential {
62 public:
63 INuclearPotential(const G4int A, const G4int Z, const G4bool pionPot) :
64 theA(A),
65 theZ(Z),
66 pionPotential(pionPot)
67 {
68 if(pionPotential) {
69 const G4double ZOverA = ((G4double) theZ) / ((G4double) theA);
70 // As in INCL4.6, use the r0*A^(1/3) formula to estimate vc
71 const G4double r = 1.12*Math::pow13((G4double)theA);
72
73 const G4double xsi = 1. - 2.*ZOverA;
75 vPiPlus = vPionDefault + 71.*xsi - vc;
76 vPiZero = vPionDefault;
77 vPiMinus = vPionDefault - 71.*xsi + vc;
78 vKPlus = vKPlusDefault;
79 vKZero = vKPlusDefault + 10.; // Hypothesis to be check
80 vKMinus = vKMinusDefault;
81 vKZeroBar = vKMinusDefault - 10.; // Hypothesis to be check
82 } else {
83 vPiPlus = 0.0;
84 vPiZero = 0.0;
85 vPiMinus = 0.0;
86 vKPlus = 0.0;
87 vKZero = 0.0;
88 vKMinus = 0.0;
89 vKZeroBar = 0.0;
90 }
91 }
92
93 virtual ~INuclearPotential() {}
94
95 /// \brief Do we have a pion potential?
96 G4bool hasPionPotential() const { return pionPotential; }
97
98 virtual G4double computePotentialEnergy(const Particle * const p) const = 0;
99
100 /** \brief Return the Fermi energy for a particle.
101 *
102 * \param p pointer to a Particle
103 * \return Fermi energy for that particle type
104 **/
105 inline G4double getFermiEnergy(const Particle * const p) const {
106 std::map<ParticleType, G4double>::const_iterator i = fermiEnergy.find(p->getType());
107// assert(i!=fermiEnergy.end());
108 return i->second;
109 }
110
111 /** \brief Return the Fermi energy for a particle type.
112 *
113 * \param t particle type
114 * \return Fermi energy for that particle type
115 **/
116 inline G4double getFermiEnergy(const ParticleType t) const {
117 std::map<ParticleType, G4double>::const_iterator i = fermiEnergy.find(t);
118// assert(i!=fermiEnergy.end());
119 return i->second;
120 }
121
122 /** \brief Return the separation energy for a particle.
123 *
124 * \param p pointer to a Particle
125 * \return separation energy for that particle type
126 **/
127 inline G4double getSeparationEnergy(const Particle * const p) const {
128 std::map<ParticleType, G4double>::const_iterator i = separationEnergy.find(p->getType());
129// assert(i!=separationEnergy.end());
130 return i->second;
131 }
132
133 /** \brief Return the separation energy for a particle type.
134 *
135 * \param t particle type
136 * \return separation energy for that particle type
137 **/
139 std::map<ParticleType, G4double>::const_iterator i = separationEnergy.find(t);
140// assert(i!=separationEnergy.end());
141 return i->second;
142 }
143
144 /** \brief Return the Fermi momentum for a particle.
145 *
146 * \param p pointer to a Particle
147 * \return Fermi momentum for that particle type
148 **/
149 inline G4double getFermiMomentum(const Particle * const p) const {
150 if(p->isDelta()) {
151 const G4double Tf = getFermiEnergy(p), mass = p->getMass();
152 return std::sqrt(Tf*(Tf+2.*mass));
153 } else {
154 std::map<ParticleType, G4double>::const_iterator i = fermiMomentum.find(p->getType());
155// assert(i!=fermiMomentum.end());
156 return i->second;
157 }
158 }
159
160 /** \brief Return the Fermi momentum for a particle type.
161 *
162 * \param t particle type
163 * \return Fermi momentum for that particle type
164 **/
165 inline G4double getFermiMomentum(const ParticleType t) const {
166// assert(t!=DeltaPlusPlus && t!=DeltaPlus && t!=DeltaZero && t!=DeltaMinus);
167 std::map<ParticleType, G4double>::const_iterator i = fermiMomentum.find(t);
168 return i->second;
169 }
170
171 protected:
172 /// \brief Compute the potential energy for the given pion.
174// assert(p->getType()==PiPlus || p->getType()==PiZero || p->getType()==PiMinus);
175 if(pionPotential && !p->isOutOfWell()) {
176 switch( p->getType() ) {
177 case PiPlus:
178 return vPiPlus;
179 break;
180 case PiZero:
181 return vPiZero;
182 break;
183 case PiMinus:
184 return vPiMinus;
185 break;
186 default: // Pion potential is defined and non-zero only for pions
187 return 0.0;
188 break;
189 }
190 }
191 else
192 return 0.0;
193 }
194
195 protected:
196 /// \brief Compute the potential energy for the given kaon.
198// assert(p->getType()==KPlus || p->getType()==KZero || p->getType()==KZeroBar || p->getType()==KMinus|| p->getType()==KShort|| p->getType()==KLong);
199 if(pionPotential && !p->isOutOfWell()) { // if pionPotental false -> kaonPotential false
200 switch( p->getType() ) {
201 case KPlus:
202 return vKPlus;
203 break;
204 case KZero:
205 return vKZero;
206 break;
207 case KZeroBar:
208 return vKZeroBar;
209 break;
210 case KShort:
211 case KLong:
212 return 0.0; // Should never be in the nucleus
213 break;
214 case KMinus:
215 return vKMinus;
216 break;
217 default:
218 return 0.0;
219 break;
220 }
221 }
222 else
223 return 0.0;
224 }
225
226 protected:
227 /// \brief Compute the potential energy for the given pion resonances (Eta, Omega and EtaPrime and Gamma also).
229// assert(p->getType()==Eta || p->getType()==Omega || p->getType()==EtaPrime || p->getType()==Photon);
230 if(pionPotential && !p->isOutOfWell()) {
231 switch( p->getType() ) {
232 case Eta:
233//jcd return vPiZero;
234//jcd return vPiZero*1.5;
235 return 0.0; // (JCD: seems to give better results)
236 break;
237 case Omega:
238 return 15.0; // S.Friedrich et al., Physics Letters B736(2014)26-32. (V. Metag in Hyperfine Interact (2015) 234:25-31 gives 29 MeV)
239 break;
240 case EtaPrime:
241 return 37.0; // V. Metag in Hyperfine Interact (2015) 234:25-31
242 break;
243 case Photon:
244 return 0.0;
245 break;
246 default:
247 return 0.0;
248 break;
249 }
250 }
251 else
252 return 0.0;
253 }
254
255 protected:
256 /// \brief The mass number of the nucleus
257 const G4int theA;
258 /// \brief The charge number of the nucleus
259 const G4int theZ;
260 private:
261 const G4bool pionPotential;
262 G4double vPiPlus, vPiZero, vPiMinus;
263 static const G4double vPionDefault;
264 G4double vKPlus, vKZero, vKZeroBar, vKMinus;
265 static const G4double vKPlusDefault;
266 static const G4double vKMinusDefault;
267 protected:
268 /* \brief map of Fermi energies per particle type */
269 std::map<ParticleType,G4double> fermiEnergy;
270 /* \brief map of Fermi momenta per particle type */
271 std::map<ParticleType,G4double> fermiMomentum;
272 /* \brief map of separation energies per particle type */
273 std::map<ParticleType,G4double> separationEnergy;
274
275 };
276
277
278
279 /** \brief Create an INuclearPotential object
280 *
281 * This is the method that should be used to instantiate objects derived
282 * from INuclearPotential. It uses a caching mechanism to minimise
283 * thrashing and speed up the code.
284 *
285 * \param type the type of the potential to be created
286 * \param theA mass number of the nucleus
287 * \param theZ charge number of the nucleus
288 * \param pionPotential whether pions should also feel the potential
289 * \return a pointer to the nuclear potential
290 */
291 INuclearPotential const *createPotential(const PotentialType type, const G4int theA, const G4int theZ, const G4bool pionPotential);
292
293 /// \brief Clear the INuclearPotential cache
294 void clearCache();
295
296 }
297
298}
299
300#endif /* G4INCLINUCLEARPOTENTIAL_HH_ */
Deuteron density in r and p according to the Paris potential.
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
G4double computePionPotentialEnergy(const Particle *const p) const
Compute the potential energy for the given pion.
std::map< ParticleType, G4double > fermiMomentum
G4double getFermiMomentum(const Particle *const p) const
Return the Fermi momentum for a particle.
G4double getSeparationEnergy(const Particle *const p) const
Return the separation energy for a particle.
const G4int theA
The mass number of the nucleus.
G4bool hasPionPotential() const
Do we have a pion potential?
std::map< ParticleType, G4double > separationEnergy
virtual G4double computePotentialEnergy(const Particle *const p) const =0
G4double getSeparationEnergy(const ParticleType t) const
Return the separation energy for a particle type.
G4double computePionResonancePotentialEnergy(const Particle *const p) const
Compute the potential energy for the given pion resonances (Eta, Omega and EtaPrime and Gamma also).
G4double getFermiMomentum(const ParticleType t) const
Return the Fermi momentum for a particle type.
G4double getFermiEnergy(const ParticleType t) const
Return the Fermi energy for a particle type.
G4double computeKaonPotentialEnergy(const Particle *const p) const
Compute the potential energy for the given kaon.
INuclearPotential(const G4int A, const G4int Z, const G4bool pionPot)
std::map< ParticleType, G4double > fermiEnergy
G4double getFermiEnergy(const Particle *const p) const
Return the Fermi energy for a particle.
const G4int theZ
The charge number of the nucleus.
G4bool isOutOfWell() const
Check if the particle is out of its potential well.
G4INCL::ParticleType getType() const
G4double getMass() const
Get the cached particle mass.
G4bool isDelta() const
Is it a Delta?
G4double pow13(G4double x)
void clearCache()
Clear the INuclearPotential cache.
INuclearPotential const * createPotential(const PotentialType type, const G4int theA, const G4int theZ, const G4bool pionPotential)
Create an INuclearPotential object.
const G4double eSquared
Coulomb conversion factor [MeV*fm].