67#ifndef G4NUCLEI_MODEL_HH
68#define G4NUCLEI_MODEL_HH
97 const std::vector<G4ThreeVector>* hitPoints=0);
102 return nucleon_densities[ip - 1][izone];
106 return fermi_momenta[ip - 1][izone];
112 if (ip == 9)
return 0.0;
113 G4int ip0 = ip < 3 ? ip - 1 : 2;
114 if (ip > 10 && ip < 18) ip0 = 3;
115 if (ip > 20) ip0 = 4;
116 return izone < number_of_zones ? zone_potentials[ip0][izone] : 0.0;
124 return ( (izone<0) ? 0.
125 : (izone<number_of_zones) ? zone_radii[izone] : nuclei_radius);
128 return ( (izone<0) ? 0.
129 : (izone<number_of_zones) ? zone_volumes[izone] : nuclei_volume);
134 for (
G4int iz=0; iz<number_of_zones; iz++)
if (r<zone_radii[iz])
return iz;
135 return number_of_zones;
142 return neutronNumberCurrent < 1 && protonNumberCurrent < 1;
152 typedef std::pair<std::vector<G4CascadParticle>, std::vector<G4InuclElementaryParticle> >
modelLists;
159 return std::pair<G4int, G4int>(current_nucl1, current_nucl2);
164 std::vector<G4CascadParticle>& cascade);
179 G4bool passFermi(
const std::vector<G4InuclElementaryParticle>& particles,
190 typedef std::pair<G4InuclElementaryParticle, G4double> partner;
192 std::vector<partner> thePartners;
196 static G4bool sortPartners(
const partner& p1,
const partner& p2) {
197 return (p2.second > p1.second);
201 void fillBindingEnergies();
203 void fillZoneRadii(
G4double nuclearRadius);
234 std::vector<G4InuclElementaryParticle> qdeutrons;
235 std::vector<G4double> acsecs;
237 std::vector<G4ThreeVector> coordinates;
238 std::vector<G4LorentzVector> momentums;
239 std::vector<G4InuclElementaryParticle> raw_particles;
241 std::vector<G4ThreeVector> collisionPts;
247 std::vector<G4double> rod;
248 std::vector<G4double> pf;
249 std::vector<G4double> vz;
252 std::vector<std::vector<G4double> > nucleon_densities;
253 std::vector<std::vector<G4double> > zone_potentials;
254 std::vector<std::vector<G4double> > fermi_momenta;
255 std::vector<G4double> zone_radii;
256 std::vector<G4double> zone_volumes;
257 std::vector<G4double> binding_energies;
260 G4int number_of_zones;
269 G4int neutronNumberCurrent;
270 G4int protonNumberCurrent;
276 enum PotentialType { WoodsSaxon=0, Gaussian=1 };
282 static const G4double radiusForSmall;
283 static const G4double radScaleAlpha;
284 static const G4double fermiMomentum;
286 static const G4double alfa3[3], alfa6[6];
288 static const G4double pion_vp_small;
293 static const G4double piTimes4thirds;
294 static const G4double crossSectionUnits;
G4int getCurrentZone() const
G4int getZone(G4double r) const
G4int getNumberOfNeutrons() const
G4double getDensity(G4int ip, G4int izone) const
G4CascadParticle initializeCascad(G4InuclElementaryParticle *particle)
G4bool worthToPropagate(const G4CascadParticle &cparticle) const
G4int getNumberOfProtons() const
void generateParticleFate(G4CascadParticle &cparticle, G4ElementaryParticleCollider *theEPCollider, std::vector< G4CascadParticle > &cascade)
G4double getRadius(G4int izone) const
G4InuclElementaryParticle generateNucleon(G4int type, G4int zone) const
G4double getVolume(G4int izone) const
G4double totalCrossSection(G4double ke, G4int rtype) const
G4double getPotential(G4int ip, G4int izone) const
G4double getFermiMomentum(G4int ip, G4int izone) const
void reset(G4int nHitNeutrons=0, G4int nHitProtons=0, const std::vector< G4ThreeVector > *hitPoints=0)
G4double absorptionCrossSection(G4double e, G4int type) const
G4bool stillInside(const G4CascadParticle &cparticle)
void generateModel(G4InuclNuclei *nuclei)
std::pair< std::vector< G4CascadParticle >, std::vector< G4InuclElementaryParticle > > modelLists
G4double getFermiKinetic(G4int ip, G4int izone) const
std::pair< G4int, G4int > getTypesOfNucleonsInvolved() const
G4LorentzVector generateNucleonMomentum(G4int type, G4int zone) const
G4double getRadiusUnits() const
G4bool isProjectile(const G4CascadParticle &cparticle) const
G4double getRadius() const
G4int getNumberOfZones() const
void setVerboseLevel(G4int verbose)