ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4INCLNuclearPotentialIsospin.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4INCLNuclearPotentialIsospin.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 // 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 
49 #include "G4INCLParticleTable.hh"
50 #include "G4INCLGlobals.hh"
51 
52 namespace G4INCL {
53 
54  namespace NuclearPotential {
55 
56  // Constructors
58  : INuclearPotential(A, Z, aPionPotential)
59  {
60  initialize();
61  }
62 
63  // Destructor
65 
67  const G4double ZOverA = ((G4double) theZ) / ((G4double) theA);
68 
72 
73  const G4double theFermiMomentum = ParticleTable::getFermiMomentum(theA,theZ);
74 
75  fermiMomentum[Proton] = theFermiMomentum * Math::pow13(2.*ZOverA);
76  const G4double theProtonFermiEnergy = std::sqrt(fermiMomentum[Proton]*fermiMomentum[Proton] + mp*mp) - mp;
77  fermiEnergy[Proton] = theProtonFermiEnergy;
78  // Use separation energies from the ParticleTable
79  const G4double theProtonSeparationEnergy = ParticleTable::getSeparationEnergy(Proton,theA,theZ);
80  separationEnergy[Proton] = theProtonSeparationEnergy;
81  vProton = theProtonFermiEnergy + theProtonSeparationEnergy;
82 
83  fermiMomentum[Neutron] = theFermiMomentum * Math::pow13(2.*(1.-ZOverA));
84  const G4double theNeutronFermiEnergy = std::sqrt(fermiMomentum[Neutron]*fermiMomentum[Neutron] + mn*mn) - mn;
85  fermiEnergy[Neutron] = theNeutronFermiEnergy;
86  // Use separation energies from the ParticleTable
87  const G4double theNeutronSeparationEnergy = ParticleTable::getSeparationEnergy(Neutron,theA,theZ);
88  separationEnergy[Neutron] = theNeutronSeparationEnergy;
89  vNeutron = theNeutronFermiEnergy + theNeutronSeparationEnergy;
90 
91  const G4double separationEnergyDeltaPlusPlus = 2.*theProtonSeparationEnergy - theNeutronSeparationEnergy;
92  separationEnergy[DeltaPlusPlus] = separationEnergyDeltaPlusPlus;
93  separationEnergy[DeltaPlus] = theProtonSeparationEnergy;
94  separationEnergy[DeltaZero] = theNeutronSeparationEnergy;
95  const G4double separationEnergyDeltaMinus = 2.*theNeutronSeparationEnergy - theProtonSeparationEnergy;
96  separationEnergy[DeltaMinus] = separationEnergyDeltaMinus;
97 
98  const G4double tinyMargin = 1E-7;
101  vDeltaPlusPlus = std::max(separationEnergyDeltaPlusPlus + tinyMargin, 2.*vDeltaPlus - vDeltaZero);
102  vDeltaMinus = std::max(separationEnergyDeltaMinus + tinyMargin, 2.*vDeltaZero - vDeltaPlus);
103 
104  vSigmaMinus = -16.; // Repulsive potential, from Eur. Phys.J.A. (2016) 52:21
105  vSigmaZero = -16.; // hypothesis: same potential for each sigma
106  vSigmaPlus = -16.;
107 
108  vLambda = 28.;
109  const G4double asy = (theA - 2.*theZ)/theA;
110  if(asy>0.11)vLambda = 56.549-678.73*asy+4905.35*std::pow(asy,2.)-9789.1*std::pow(asy,3.); // Jose Luis Rodriguez-Sanchez et al., Rapid Communication PRC
111 
112  const G4double theLambdaSeparationEnergy = ParticleTable::getSeparationEnergy(Lambda,theA,theZ);
113 
114  separationEnergy[PiPlus] = theProtonSeparationEnergy - theNeutronSeparationEnergy;
115  separationEnergy[PiZero] = 0.;
116  separationEnergy[PiMinus] = theNeutronSeparationEnergy - theProtonSeparationEnergy;
117 
118  separationEnergy[Eta] = 0.;
119  separationEnergy[Omega] = 0.;
121  separationEnergy[Photon] = 0.;
122 
123  separationEnergy[Lambda] = theLambdaSeparationEnergy;
124  separationEnergy[SigmaPlus] = theProtonSeparationEnergy + theLambdaSeparationEnergy - theNeutronSeparationEnergy;
125  separationEnergy[SigmaZero] = theLambdaSeparationEnergy;
126  separationEnergy[SigmaMinus] = theNeutronSeparationEnergy + theLambdaSeparationEnergy - theProtonSeparationEnergy;
127 
128  separationEnergy[KPlus] = theProtonSeparationEnergy - theLambdaSeparationEnergy;
129  separationEnergy[KZero] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
130  separationEnergy[KZeroBar] = (theLambdaSeparationEnergy - theNeutronSeparationEnergy);
131  separationEnergy[KMinus] = 2.*theNeutronSeparationEnergy - theProtonSeparationEnergy-theLambdaSeparationEnergy;
132 
133  separationEnergy[KShort] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
134  separationEnergy[KLong] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
135 
137  fermiEnergy[DeltaPlus] = vDeltaPlus - separationEnergy[DeltaPlus];
138  fermiEnergy[DeltaZero] = vDeltaZero - separationEnergy[DeltaZero];
139  fermiEnergy[DeltaMinus] = vDeltaMinus - separationEnergy[DeltaMinus];
140 
141  fermiEnergy[Lambda] = vLambda - separationEnergy[Lambda];
142  if (fermiEnergy[Lambda] <= 0.)
143  fermiMomentum[Lambda]=0.;
144  else
145  fermiMomentum[Lambda]=std::sqrt(std::pow(fermiEnergy[Lambda]+ml,2.0)-ml*ml);
146 
147  fermiEnergy[SigmaPlus] = vSigmaPlus - separationEnergy[SigmaPlus];
148  fermiEnergy[SigmaZero] = vSigmaZero - separationEnergy[SigmaZero];
149  fermiEnergy[SigmaMinus] = vSigmaMinus - separationEnergy[SigmaMinus];
150 
151  INCL_DEBUG("Table of separation energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << '\n'
152  << " proton: " << separationEnergy[Proton] << '\n'
153  << " neutron: " << separationEnergy[Neutron] << '\n'
154  << " delta++: " << separationEnergy[DeltaPlusPlus] << '\n'
155  << " delta+: " << separationEnergy[DeltaPlus] << '\n'
156  << " delta0: " << separationEnergy[DeltaZero] << '\n'
157  << " delta-: " << separationEnergy[DeltaMinus] << '\n'
158  << " pi+: " << separationEnergy[PiPlus] << '\n'
159  << " pi0: " << separationEnergy[PiZero] << '\n'
160  << " pi-: " << separationEnergy[PiMinus] << '\n'
161  << " eta: " << separationEnergy[Eta] << '\n'
162  << " omega: " << separationEnergy[Omega] << '\n'
163  << " etaprime:" << separationEnergy[EtaPrime] << '\n'
164  << " photon: " << separationEnergy[Photon] << '\n'
165  << " lambda: " << separationEnergy[Lambda] << '\n'
166  << " sigmaplus: " << separationEnergy[SigmaPlus] << '\n'
167  << " sigmazero: " << separationEnergy[SigmaZero] << '\n'
168  << " sigmaminus: " << separationEnergy[SigmaMinus] << '\n'
169  << " kplus: " << separationEnergy[KPlus] << '\n'
170  << " kzero: " << separationEnergy[KZero] << '\n'
171  << " kzerobar: " << separationEnergy[KZeroBar] << '\n'
172  << " kminus: " << separationEnergy[KMinus] << '\n'
173  << " kshort: " << separationEnergy[KShort] << '\n'
174  << " klong: " << separationEnergy[KLong] << '\n'
175  );
176 
177  INCL_DEBUG("Table of Fermi energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << '\n'
178  << " proton: " << fermiEnergy[Proton] << '\n'
179  << " neutron: " << fermiEnergy[Neutron] << '\n'
180  << " delta++: " << fermiEnergy[DeltaPlusPlus] << '\n'
181  << " delta+: " << fermiEnergy[DeltaPlus] << '\n'
182  << " delta0: " << fermiEnergy[DeltaZero] << '\n'
183  << " delta-: " << fermiEnergy[DeltaMinus] << '\n'
184  << " lambda: " << fermiEnergy[Lambda] << '\n'
185  << " sigma+: " << fermiEnergy[SigmaPlus] << '\n'
186  << " sigma0: " << fermiEnergy[SigmaZero] << '\n'
187  << " sigma-: " << fermiEnergy[SigmaMinus] << '\n'
188  );
189 
190  INCL_DEBUG("Table of Fermi momenta [MeV/c] for A=" << theA << ", Z=" << theZ << ":" << '\n'
191  << " proton: " << fermiMomentum[Proton] << '\n'
192  << " neutron: " << fermiMomentum[Neutron] << '\n'
193  );
194  }
195 
197 
198  switch( particle->getType() )
199  {
200  case Proton:
201  return vProton;
202  break;
203  case Neutron:
204  return vNeutron;
205  break;
206 
207  case PiPlus:
208  case PiZero:
209  case PiMinus:
210  return computePionPotentialEnergy(particle);
211  break;
212 
213  case SigmaPlus:
214  return vSigmaPlus;
215  break;
216  case SigmaZero:
217  return vSigmaZero;
218  break;
219  case Lambda:
220  return vLambda;
221  break;
222  case SigmaMinus:
223  return vSigmaMinus;
224  break;
225 
226  case Eta:
227  case Omega:
228  case EtaPrime:
229  return computePionResonancePotentialEnergy(particle);
230  break;
231 
232  case KPlus:
233  case KZero:
234  case KZeroBar:
235  case KMinus:
236  case KShort:
237  case KLong:
238  return computeKaonPotentialEnergy(particle);
239  break;
240 
241  case Photon:
242  return 0.0;
243  break;
244 
245  case DeltaPlusPlus:
246  return vDeltaPlusPlus;
247  break;
248  case DeltaPlus:
249  return vDeltaPlus;
250  break;
251  case DeltaZero:
252  return vDeltaZero;
253  break;
254  case DeltaMinus:
255  return vDeltaMinus;
256  break;
257  case Composite:
258  INCL_ERROR("No potential computed for particle of type Cluster.");
259  return 0.0;
260  break;
261  case UnknownParticle:
262  INCL_ERROR("Trying to compute potential energy for an unknown particle.");
263  return 0.0;
264  break;
265  }
266 
267  INCL_ERROR("There is no potential for this type of particle.");
268  return 0.0;
269  }
270 
271  }
272 }
273