ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4NucleiModel.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4NucleiModel.hh
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 // 20100319 M. Kelsey -- Remove "using" directory and unnecessary #includes,
28 // move ctor to .cc file
29 // 20100407 M. Kelsey -- Create "partners thePartners" data member to act
30 // as buffer between ::generateInteractionPartners() and
31 // ::generateParticleFate(), and make "outgoing_cparticles" a
32 // data member returned from the latter by const-ref. Replace
33 // return-by-value of initializeCascad() with an input buffer.
34 // 20100409 M. Kelsey -- Add function to sort list of partnerts by pathlen,
35 // move non-inlinable code to .cc.
36 // 20100421 M. Kelsey -- Move getFermiKinetic() to .cc, no hardwired masses.
37 // 20100517 M. Kelsey -- Change cross-section tables to static arrays. Move
38 // absorptionCrossSection() from SpecialFunc.
39 // 20100520 M. Kelsey -- Add function to separate momentum from nucleon
40 // 20100617 M. Kelsey -- Add setVerboseLevel() function, add generateModel()
41 // with particle input, and ctor with A/Z input.
42 // 20100715 M. Kelsey -- Add G4InuclNuclei object for use with balance checks
43 // 20100723 M. Kelsey -- Move G4CollisionOutput buffer, along with all
44 // std::vector<> buffers, here for reuse
45 // 20100914 M. Kelsey -- Migrate to integer A and Z
46 // 20101004 M. Kelsey -- Rename and create functions used to generate model
47 // 20101019 M. Kelsey -- CoVerity report: dtor leak; move dtor to .cc file
48 // 20110223 M. Kelsey -- Add static parameters for radius and cross-section
49 // scaling factors.
50 // 20110303 M. Kelsey -- Add accessors for model parameters and units
51 // 20110304 M. Kelsey -- Extend reset() to fill neutron and proton counts
52 // 20110324 D. Wright -- Add list of nucleon interaction points, and nucleon
53 // effective radius, for trailing effect.
54 // 20110324 M. Kelsey -- Extend reset() to pass list of points; move
55 // implementation to .cc file.
56 // 20110405 M. Kelsey -- Add "passTrailing()" to encapsulate trailing effect
57 // 20110808 M. Kelsey -- Pass buffer into generateParticleFate instead of
58 // returning a vector to be copied.
59 // 20110823 M. Kelsey -- Remove local cross-section tables entirely
60 // 20120125 M. Kelsey -- Add special case for photons to have zero potential.
61 // 20120307 M. Kelsey -- Add zone volume array for use with quasideuteron
62 // density, functions to identify projectile, compute interaction
63 // distance.
64 // 20130129 M. Kelsey -- Add static objects for gamma-quasideuteron scattering
65 // 20130221 M. Kelsey -- Add function to emplant particle along trajectory
66 // 20130226 M. Kelsey -- Allow forcing zone selection in MFP calculation.
67 // 20130302 M. Kelsey -- Add forceFirst() wrapper function (allows configuring)
68 // 20130628 M. Kelsey -- Extend useQuasiDeuteron() to check good absorption,
69 // fix spelling of "Deutron" -> "Deuteron"
70 // 20130808 M. Kelsey -- To avoid thread collisions, move static neutronEP
71 // and protonEP objects to const data members.
72 // 20131001 M. Kelsey -- Move QDinterp object to data member, thread local
73 // 20140116 M. Kelsey -- Move statics to const data members to avoid weird
74 // interactions with MT.
75 
76 #ifndef G4NUCLEI_MODEL_HH
77 #define G4NUCLEI_MODEL_HH
78 
79 #include <algorithm>
80 #include <vector>
81 
83 #include "G4CascadParticle.hh"
84 #include "G4CascadeInterpolator.hh"
85 #include "G4CollisionOutput.hh"
86 #include "G4LorentzConvertor.hh"
87 
88 class G4InuclNuclei;
90 
92 public:
93  G4NucleiModel();
96 
97  virtual ~G4NucleiModel();
98 
99  void setVerboseLevel(G4int verbose) { verboseLevel = verbose; }
100 
101  void generateModel(G4InuclNuclei* nuclei);
102  void generateModel(G4int a, G4int z);
103 
104  // Arguments here are used for rescattering (::Propagate)
105  void reset(G4int nHitNeutrons=0, G4int nHitProtons=0,
106  const std::vector<G4ThreeVector>* hitPoints=0);
107 
108  void printModel() const;
109 
110  G4double getDensity(G4int ip, G4int izone) const {
111  return nucleon_densities[ip - 1][izone];
112  }
113 
115  return fermi_momenta[ip - 1][izone];
116  }
117 
118  G4double getFermiKinetic(G4int ip, G4int izone) const;
119 
120  G4double getPotential(G4int ip, G4int izone) const {
121  if (ip == 9 || ip < 0) return 0.0; // Photons and leptons
122  G4int ip0 = ip < 3 ? ip - 1 : 2;
123  if (ip > 10 && ip < 18) ip0 = 3;
124  if (ip > 20) ip0 = 4;
125  return izone < number_of_zones ? zone_potentials[ip0][izone] : 0.0;
126  }
127 
128  // Factor to convert GEANT4 lengths to internal units
130 
131  G4double getRadius() const { return nuclei_radius; }
132  G4double getRadius(G4int izone) const {
133  return ( (izone<0) ? 0.
134  : (izone<number_of_zones) ? zone_radii[izone] : nuclei_radius);
135  }
136  G4double getVolume(G4int izone) const {
137  return ( (izone<0) ? 0.
138  : (izone<number_of_zones) ? zone_volumes[izone] : nuclei_volume);
139  }
140 
143  for (G4int iz=0; iz<number_of_zones; iz++) if (r<zone_radii[iz]) return iz;
144  return number_of_zones;
145  }
146 
149 
150  G4bool empty() const {
151  return neutronNumberCurrent < 1 && protonNumberCurrent < 1;
152  }
153 
154  G4bool stillInside(const G4CascadParticle& cparticle) {
155  return cparticle.getCurrentZone() < number_of_zones;
156  }
157 
158 
160 
161  typedef std::pair<std::vector<G4CascadParticle>, std::vector<G4InuclElementaryParticle> > modelLists;
162 
164  modelLists& output);
165 
166 
167  std::pair<G4int, G4int> getTypesOfNucleonsInvolved() const {
168  return std::pair<G4int, G4int>(current_nucl1, current_nucl2);
169  }
170 
171  void generateParticleFate(G4CascadParticle& cparticle,
172  G4ElementaryParticleCollider* theEPCollider,
173  std::vector<G4CascadParticle>& cascade);
174 
175  G4bool forceFirst(const G4CascadParticle& cparticle) const;
176  G4bool isProjectile(const G4CascadParticle& cparticle) const;
177  G4bool worthToPropagate(const G4CascadParticle& cparticle) const;
178 
180 
182 
184  G4double totalCrossSection(G4double ke, G4int rtype) const;
185 
186  // Identify whether given particle can interact with dibaryons
187  static G4bool useQuasiDeuteron(G4int ptype, G4int qdtype=0);
188 
189 protected:
190  G4bool passFermi(const std::vector<G4InuclElementaryParticle>& particles,
191  G4int zone);
192 
193  G4bool passTrailing(const G4ThreeVector& hit_position);
194 
195  void boundaryTransition(G4CascadParticle& cparticle);
196 
197  void choosePointAlongTraj(G4CascadParticle& cparticle);
198 
200  G4int type2,
201  G4int zone) const;
202 
203  typedef std::pair<G4InuclElementaryParticle, G4double> partner;
204 
205  std::vector<partner> thePartners; // Buffer for output below
207 
208  // Function for std::sort() to use in organizing partners by path length
209  static G4bool sortPartners(const partner& p1, const partner& p2) {
210  return (p2.second > p1.second);
211  }
212 
213  // Functions used to generate model nuclear structure
214  void fillBindingEnergies();
215 
216  void fillZoneRadii(G4double nuclearRadius);
217 
218  G4double fillZoneVolumes(G4double nuclearRadius);
219 
220  void fillPotentials(G4int type, G4double tot_vol);
221 
223  G4double nuclearRadius) const;
224 
226  G4double nuclearRadius) const;
227 
228  G4double getRatio(G4int ip) const; // Fraction of nucleons still available
229 
230  // Scale nuclear density with interactions so far
231  G4double getCurrentDensity(G4int ip, G4int izone) const;
232 
233  // Average path length for any interaction of projectile and target
234  // = 1. / (density * cross-section)
237  G4int zone = -1); // Override zone value
238  // NOTE: Function is non-const in order to use dummy_converter
239 
240  // Use path-length and MFP (above) to throw random distance to collision
242  G4double path, G4double invmfp) const;
243 
244 private:
246 
247  // Buffers for processing interactions on each cycle
248  G4LorentzConvertor dummy_convertor; // For getting collision frame
249  G4CollisionOutput EPCoutput; // For N-body inelastic collisions
250 
251  std::vector<G4InuclElementaryParticle> qdeutrons; // For h+(NN) trials
252  std::vector<G4double> acsecs;
253 
254  std::vector<G4ThreeVector> coordinates; // for initializeCascad()
255  std::vector<G4LorentzVector> momentums;
256  std::vector<G4InuclElementaryParticle> raw_particles;
257 
258  std::vector<G4ThreeVector> collisionPts;
259 
260  // Temporary buffers for computing nuclear model
261  G4double ur[7]; // Number of skin depths for each zone
262  G4double v[6]; // Density integrals by zone
263  G4double v1[6]; // Pseudo-volume (delta r^3) by zone
264  std::vector<G4double> rod; // Nucleon density
265  std::vector<G4double> pf; // Fermi momentum
266  std::vector<G4double> vz; // Nucleon potential
267 
268  // Nuclear model configuration
269  std::vector<std::vector<G4double> > nucleon_densities;
270  std::vector<std::vector<G4double> > zone_potentials;
271  std::vector<std::vector<G4double> > fermi_momenta;
272  std::vector<G4double> zone_radii;
273  std::vector<G4double> zone_volumes;
274  std::vector<G4double> binding_energies;
278 
282 
285 
288 
291 
292  G4CascadeInterpolator<30> gammaQDinterp; // quasideuteron interpolator
293 
294  // Symbolic names for nuclear potentials
296 
297  // Parameters for nuclear structure
298  const G4double crossSectionUnits; // Scale from internal to natural units
300  const G4double skinDepth; // Fraction of radius for outer skin
301  const G4double radiusScale; // Coefficients for two-parameter fit
302  const G4double radiusScale2; // R = 1.16*cbrt(A) - 1.3456/cbrt(A)
303  const G4double radiusForSmall; // Average radius of light A<5 nuclei
304  const G4double radScaleAlpha; // Scaling factor R_alpha/R_small
307  const G4double gammaQDscale; // Gamma/cluster scattering rescaling
308  const G4double potentialThickness; // Defaulted to 1.0
309 
310  // Cutoffs for extreme values
311  static const G4double small;
312  static const G4double large;
313  static const G4double piTimes4thirds; // FIXME: We should not be using this!
314 
315  static const G4double alfa3[3], alfa6[6]; // Zone boundaries in radii
316  static const G4double pion_vp; // Flat potentials for pi, K, Y
317  static const G4double pion_vp_small;
318  static const G4double kaon_vp;
319  static const G4double hyperon_vp;
320 
321  // Neutrons and protons, for computing trajectory placements
324 };
325 
326 #endif // G4NUCLEI_MODEL_HH