188 #include <functional>
191 using namespace G4InuclParticleNames;
192 using namespace G4InuclSpecialFunctions;
215 { 0.0, 0.01, 0.013, 0.018, 0.024, 0.032, 0.042, 0.056, 0.075, 0.1,
216 0.13, 0.18, 0.24, 0.32, 0.42, 0.56, 0.75, 1.0, 1.3, 1.8,
217 2.4, 3.2, 4.2, 5.6, 7.5, 10.0, 13.0, 18.0, 24.0, 32.0 };
220 { 2.8, 1.3, 0.89, 0.56, 0.38, 0.27, 0.19, 0.14, 0.098,
221 0.071, 0.054, 0.0003, 0.0007, 0.0027, 0.0014, 0.001, 0.0012, 0.0005,
222 0.0003, 0.0002,0.0002, 0.0002, 0.0002, 0.0002, 0.0001, 0.0001, 0.0001,
223 0.0001, 0.0001, 0.0001 };
229 : verboseLevel(0), nuclei_radius(0.), nuclei_volume(0.), number_of_zones(0),
230 A(0),
Z(0), theNucleus(0), neutronNumber(0), protonNumber(0),
231 neutronNumberCurrent(0), protonNumberCurrent(0), current_nucl1(0),
232 current_nucl2(0), gammaQDinterp(kebins),
235 skinDepth(0.611207*radiusUnits),
246 : verboseLevel(0), nuclei_radius(0.), nuclei_volume(0.), number_of_zones(0),
247 A(0),
Z(0), theNucleus(0), neutronNumber(0), protonNumber(0),
248 neutronNumberCurrent(0), protonNumberCurrent(0), current_nucl1(0),
249 current_nucl2(0), gammaQDinterp(kebins),
252 skinDepth(0.611207*radiusUnits),
265 : verboseLevel(0), nuclei_radius(0.), nuclei_volume(0.), number_of_zones(0),
266 A(0),
Z(0), theNucleus(0), neutronNumber(0), protonNumber(0),
267 neutronNumberCurrent(0), protonNumberCurrent(0), current_nucl1(0),
268 current_nucl2(0), gammaQDinterp(kebins),
271 skinDepth(0.611207*radiusUnits),
292 const std::vector<G4ThreeVector>* hitPoints) {
297 if (!hitPoints || !hitPoints->empty())
collisionPts.clear();
310 G4cout <<
" >>> G4NucleiModel::generateModel A " << a <<
" Z " << z
315 if (a ==
A && z ==
Z) {
385 G4cout <<
" >>> G4NucleiModel::fillBindingEnergies" <<
G4endl;
399 G4cout <<
" >>> G4NucleiModel::fillZoneRadii" <<
G4endl;
409 G4double rSq = nuclearRadius * nuclearRadius;
410 G4double gaussRadius = std::sqrt(rSq * (1.0 - 1.0/
A) + 6.4);
418 }
else if (
A < 100) {
439 G4cout <<
" >>> G4NucleiModel::fillZoneVolumes" <<
G4endl;
463 if (i > 0)
v1[i] -= zone_radii[i-1]*zone_radii[i-1]*zone_radii[i-1];
474 G4cout <<
" >>> G4NucleiModel::fillZoneVolumes(" << type <<
")" <<
G4endl;
495 vz.push_back(0.5 * pff * pff / mass + dm);
507 G4cout <<
" >>> G4NucleiModel::zoneIntegralWoodsSaxon" <<
G4endl;
511 const G4int itry_max = 1000;
526 while (itry < itry_max) {
533 for (
G4int i = 0; i < jc; i++) {
535 fi += r * (r +
d2) / (1.0 +
G4Exp(r));
538 fun = 0.5 * fun1 + fi * dr;
540 if (std::fabs((fun - fun1) / fun) <= epsilon)
break;
548 G4cout <<
" zoneIntegralWoodsSaxon-> n iter " << itry_max <<
G4endl;
552 return skinDepth3 * (fun + skinRatio*skinRatio*
G4Log((1.0 +
G4Exp(-r1)) / (1.0 +
G4Exp(-r2))));
560 G4cout <<
" >>> G4NucleiModel::zoneIntegralGaussian" <<
G4endl;
563 G4double gaussRadius = std::sqrt(nucRad*nucRad * (1.0 - 1.0/
A) + 6.4);
566 const G4int itry_max = 1000;
578 while (itry < itry_max) {
584 for (
G4int i = 0; i < jc; i++) {
586 fi += r * r *
G4Exp(-r * r);
589 fun = 0.5 * fun1 + fi * dr;
591 if (std::fabs((fun - fun1) / fun) <= epsilon)
break;
599 G4cerr <<
" zoneIntegralGaussian-> n iter " << itry_max <<
G4endl;
601 return gaussRadius*gaussRadius*gaussRadius * fun;
619 <<
" protons: density " <<
getDensity(1,i) <<
" PF " <<
621 <<
" neutrons: density " <<
getDensity(2,i) <<
" PF " <<
634 ekin = std::sqrt(pfermi*pfermi + mass*mass) - mass;
652 G4cout <<
" >>> G4NucleiModel::generateNucleon" <<
G4endl;
664 G4cout <<
" >>> G4NucleiModel::generateQuasiDeuteron" <<
G4endl;
678 if (type1*type2 ==
pro*
pro) dtype = 111;
679 else if (type1*type2 == pro*
neu) dtype = 112;
680 else if (type1*type2 == neu*neu) dtype = 122;
689 G4cout <<
" >>> G4NucleiModel::generateInteractionPartners" <<
G4endl;
703 }
else if (zone == 0) {
715 G4cout <<
" r_in " << r_in <<
" r_out " << r_out <<
" path " << path
721 G4cerr <<
" generateInteractionPartners-> negative path length" <<
G4endl;
725 if (std::fabs(path) <
small) {
728 G4cout <<
" generateInteractionPartners-> zero path" <<
G4endl;
740 for (
G4int ip = 1; ip < 3; ip++) {
751 if (path<
small || spath < path) {
767 G4cout <<
" trying quasi-deuterons with bullet: "
781 G4cout <<
" ptype=" << ptype <<
" using pp target\n" << ppd <<
G4endl;
784 tot_invmfp += invmfp;
793 G4cout <<
" ptype=" << ptype <<
" using np target\n" << npd <<
G4endl;
796 tot_invmfp += invmfp;
805 G4cout <<
" ptype=" << ptype <<
" using nn target\n" << nnd <<
G4endl;
808 tot_invmfp += invmfp;
815 for (
size_t i=0; i<
qdeutrons.size(); i++) {
816 G4cout <<
" acsecs[" <<
qdeutrons[i].getDefinition()->GetParticleName()
822 if (tot_invmfp >
small) {
825 if (path<
small || apath < path) {
829 for (
size_t i = 0; i <
qdeutrons.size(); i++) {
860 std::vector<G4CascadParticle>& outgoing_cparticles) {
862 G4cout <<
" >>> G4NucleiModel::generateParticleFate" <<
G4endl;
867 #ifdef G4CASCADE_CHECK_ECONS
872 outgoing_cparticles.clear();
877 G4cerr <<
" generateParticleFate-> got empty interaction-partners list "
886 G4cout <<
" no interactions; moving to next zone" <<
G4endl;
891 outgoing_cparticles.push_back(cparticle);
903 G4cout <<
" processing " << npart-1 <<
" possible interactions" <<
G4endl;
907 G4bool no_interaction =
true;
910 for (
G4int i=0; i<npart-1; i++) {
917 G4cout <<
" target " << target.
type() <<
" bullet " << bullet.
type()
932 #ifdef G4CASCADE_CHECK_ECONS
939 std::vector<G4InuclElementaryParticle>& outgoing_particles =
942 if (!
passFermi(outgoing_particles, zone))
continue;
952 std::sort(outgoing_particles.begin(), outgoing_particles.end(),
956 G4cout <<
" adding " << outgoing_particles.size()
957 <<
" output particles" <<
G4endl;
961 for (
G4int ip = 0; ip <
G4int(outgoing_particles.size()); ip++) {
967 no_interaction =
false;
971 #ifdef G4CASCADE_DEBUG_CHARGE
975 for (
G4int ip = 0; ip <
G4int(outgoing_particles.size()); ip++)
976 out_charge += outgoing_particles[ip].getCharge();
978 G4cout <<
" multiplicity " << outgoing_particles.size()
979 <<
" bul type " << bullet.
type()
980 <<
" targ type " << target.
type()
981 <<
"\n initial charge "
983 <<
" out charge " << out_charge <<
G4endl;
1003 neutronNumberCurrent--;
1011 neutronNumberCurrent--;
1017 if (no_interaction) {
1022 if (!prescatCP_G4MT_TLS_) {
1034 outgoing_cparticles.push_back(cparticle);
1037 #ifdef G4CASCADE_CHECK_ECONS
1039 balance.
collide(&prescatCP, 0, outgoing_cparticles);
1051 if (qdtype==
pn || qdtype==0)
1052 return (ptype==
pi0 || ptype==
pip || ptype==
pim || ptype==
gam || ptype==
mum);
1053 else if (qdtype==
pp)
1054 return (ptype==
pi0 || ptype==
pim || ptype==
gam || ptype==
mum);
1055 else if (qdtype==
nn)
1056 return (ptype==
pi0 || ptype==
pip || ptype==
gam);
1069 for (
G4int i = 0; i <
G4int(particles.size()); i++) {
1070 if (!particles[i].
nucleon())
continue;
1072 G4int type = particles[i].type();
1073 G4double mom = particles[i].getMomModule();
1077 G4cout <<
" type " << type <<
" p " << mom <<
" pf " << pfermi <<
G4endl;
1093 G4cout <<
" >>> G4NucleiModel::passTrailing " << hit_position <<
G4endl;
1110 G4cout <<
" >>> G4NucleiModel::boundaryTransition" <<
G4endl;
1133 G4cout <<
"Potentials for type " << type <<
" = "
1138 G4double qv = dv * dv + 2.0 * dv * mom.
e() + pr * pr;
1143 G4cout <<
" type " << type <<
" zone " << zone <<
" next " << next_zone
1144 <<
" qv " << qv <<
" dv " << dv <<
G4endl;
1153 p1r = std::sqrt(qv);
1154 if (pr < 0.0) p1r = -p1r;
1163 G4cout <<
" prr " << prr <<
" delta px " << prr*pos.
x() <<
" py "
1164 << prr*pos.
y() <<
" pz " << prr*pos.
z() <<
" mag "
1165 << std::fabs(prr*r) <<
G4endl;
1178 G4cout <<
" >>> G4NucleiModel::choosePointAlongTraj" <<
G4endl;
1191 G4cout <<
" pos " << pos <<
" phat " << phat <<
" rhat " << rhat <<
G4endl;
1196 if (prang < 1
e-6) posout = -
pos;
1217 G4cout <<
" posmid " << posmid <<
" lenmid " << lenmid
1218 <<
" zoneout " << zoneout <<
" zonemid " << zonemid
1219 <<
" ncross " << ncross <<
G4endl;
1223 std::vector<G4double> wtlen(ncross,0.);
1224 std::vector<G4double>
len(ncross,0.);
1228 for (i=0; i<ncross/2; i++) {
1229 G4int iz = zoneout-i;
1232 len[i] = lenmid - ds;
1233 len[ncross-1-i] = lenmid + ds;
1236 G4cout <<
" i " << i <<
" iz " << iz <<
" ds " << ds
1237 <<
" len " << len[i] <<
G4endl;
1242 for (i=1; i<ncross; i++) {
1243 G4int iz = (i<ncross/2) ? zoneout-i+1 : zoneout-ncross+i+1;
1257 wtlen[i] = wtlen[i-1] + wt;
1260 G4cout <<
" i " << i <<
" iz " << iz <<
" avg.mfp " << 1./invmfp
1261 <<
" dlen " << dlen <<
" wt " << wt <<
" wtlen " << wtlen[i]
1267 std::transform(wtlen.begin(), wtlen.end(), wtlen.begin(),
1268 std::bind(std::divides<G4double>(), std::placeholders::_1, wtlen.back()));
1272 for (i=0; i<ncross; i++)
G4cout <<
" " << wtlen[i];
1278 G4int ir = std::upper_bound(wtlen.begin(),wtlen.end(),rand) - wtlen.begin();
1280 G4double frac = (rand-wtlen[ir-1]) / (wtlen[ir]-wtlen[ir-1]);
1281 G4double drand = (1.-frac)*len[ir-1] + frac*len[ir];
1284 G4cout <<
" rand " << rand <<
" ir " << ir <<
" frac " << frac
1285 <<
" drand " << drand <<
G4endl;
1288 pos += drand * phat;
1296 <<
" @ " << pos <<
G4endl;
1315 G4cout <<
" >>> G4NucleiModel::worthToPropagate" <<
G4endl;
1335 <<
" potential=" << ekin_cut
1336 <<
" : worth? " << worth <<
G4endl;
1346 G4cout <<
" >>> G4NucleiModel::getRatio " << ip <<
G4endl;
1391 G4cout <<
" >>> G4NucleiModel::initializeCascad(particle)" <<
G4endl;
1418 G4cout <<
" >>> G4NucleiModel::initializeCascad(bullet,target,output)"
1422 const G4double max_a_for_cascad = 5.0;
1424 const G4double small_ekin = 1.0e-6;
1425 const G4double r_large2for3 = 62.0;
1428 const G4double r_large2for4 = 69.14;
1431 const G4int itry_max = 100;
1434 std::vector<G4CascadParticle>& casparticles = output.first;
1435 std::vector<G4InuclElementaryParticle>& particles = output.second;
1437 casparticles.clear();
1448 if (ab < max_a_for_cascad) {
1452 G4double ben = benb < bent ? bent : benb;
1458 while (casparticles.size() == 0 && itryg < itry_max) {
1476 while (bad && itry < itry_max) {
1480 if (p * p / (p * p + 2079.36) / (p * p + 2079.36) > 1.2023
e-4 *
inuclRndm() &&
1481 p * r > 312.0) bad =
false;
1484 if (itry == itry_max)
1486 G4cout <<
" deutron bullet generation-> itry = " << itry_max <<
G4endl;
1508 while (badco && itry < itry_max) {
1513 for (i = 0; i < 2; i++) {
1518 while (itry1 < itry_max) {
1522 rho = std::sqrt(ss) *
G4Exp(-ss);
1524 if (rho > u && ss < s3max) {
1525 ss = r0forAeq3 * std::sqrt(ss);
1536 if (itry1 == itry_max) {
1537 coord1.
set(10000.,10000.,10000.);
1548 coordinates.push_back(coord1);
1550 G4bool large_dist =
false;
1552 for (i = 0; i < 2; i++) {
1553 for (
G4int j = i+1; j < 3; j++) {
1554 G4double r2 = (coordinates[i]-coordinates[j]).mag2();
1557 G4cout <<
" i " << i <<
" j " << j <<
" r2 " << r2 <<
G4endl;
1560 if (r2 > r_large2for3) {
1567 if (large_dist)
break;
1570 if(!large_dist) badco =
false;
1577 G4double u = b1 + std::sqrt(b1 * b1 + b);
1580 while (badco && itry < itry_max) {
1586 for (i = 0; i < ab-1; i++) {
1590 while (itry1 < itry_max) {
1595 if (std::sqrt(ss) *
G4Exp(-ss) * (1.0 + ss/b) > u
1597 ss = r0forAeq4 * std::sqrt(ss);
1609 if (itry1 == itry_max) {
1610 coord1.
set(10000.,10000.,10000.);
1625 G4bool large_dist =
false;
1627 for (i = 0; i < ab-1; i++) {
1628 for (
G4int j = i+1; j <
ab; j++) {
1633 G4cout <<
" i " << i <<
" j " << j <<
" r2 " << r2 <<
G4endl;
1636 if (r2 > r_large2for4) {
1643 if (large_dist)
break;
1646 if (!large_dist) badco =
false;
1651 G4cout <<
" can not generate the nucleons coordinates for a "
1654 casparticles.clear();
1663 for (
G4int i = 0; i < ab - 1; i++) {
1666 while(itry2 < itry_max) {
1672 p = std::sqrt(0.01953 * u);
1680 if(itry2 == itry_max) {
1681 G4cout <<
" can not generate proper momentum for a "
1684 casparticles.clear();
1707 if(rp > rb) rb = rp;
1714 G4ThreeVector global_pos(rz*std::cos(phi), rz*std::sin(phi),
1724 for (
G4int ipa = 0; ipa <
ab; ipa++) {
1725 G4int knd = ipa < zb ? 1 : 2;
1736 ipart->setMomentum(toTheBulletRestFrame.
backToTheLab(ipart->getMomentum()));
1753 if(std::fabs(t1) <= std::fabs(t2)) {
1758 if(tr < 0.0 && t2 > 0.0) {
1769 if(tr < 0.0 && t1 > 0.0) {
1788 if(casparticles.size() == 0) {
1791 G4cout <<
" can not generate proper distribution for " << itry_max
1800 G4cout <<
" cascad particles: " << casparticles.size() <<
G4endl;
1801 for(ip = 0; ip <
G4int(casparticles.size()); ip++)
1804 G4cout <<
" outgoing particles: " << particles.size() <<
G4endl;
1805 for(ip = 0; ip <
G4int(particles.size()); ip++)
1840 G4cout <<
" ip " << ip <<
" zone " << zone <<
" ekin " << ekin
1842 <<
" csec " << csec <<
G4endl;
1845 if (csec <= 0.)
return 0.;
1857 const G4double young_cut = std::sqrt(10.0) * 0.25;
1862 if (invmfp <
small)
return spath;
1865 if (pw < -huge_num) pw = -huge_num;
1866 pw = 1.0 -
G4Exp(pw);
1869 G4cout <<
" mfp " << 1./invmfp <<
" pw " << pw <<
G4endl;
1874 if (cparticle.
young(young_cut, spath)) spath =
large;
1877 G4cout <<
" spath " << spath <<
" path " << path <<
G4endl;
1888 G4cerr <<
" absorptionCrossSection only valid for incident pions" <<
G4endl;
1898 if (ke < 0.3) csec = (0.1106 / std::sqrt(ke) - 0.8
1899 + 0.08 / ((ke-0.123)*(ke-0.123) + 0.0056) );
1900 else if (ke < 1.0) csec = 3.6735 * (1.0-ke)*(1.0-ke);
1909 if (csec < 0.0) csec = 0.0;
1912 G4cout <<
" ekin " << ke <<
" abs. csec " << csec <<
" mb" <<
G4endl;
1924 G4cerr <<
" unknown collison type = " << rtype <<
G4endl;
std::vector< G4ThreeVector > collisionPts
void set(double x, double y, double z)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
std::vector< G4double > acsecs
G4InuclElementaryParticle generateNucleon(G4int type, G4int zone) const
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
const G4InuclElementaryParticle & getParticle() const
const G4InuclElementaryParticle protonEP
static const G4double pion_vp_small
std::vector< ExP01TrackerHit * > a
static G4double getParticleMass(G4int type)
static const G4double pos
void fillZoneRadii(G4double nuclearRadius)
const G4double fermiMomentum
const std::vector< G4InuclElementaryParticle > & getOutgoingParticles() const
std::vector< G4double > vz
static const G4double large
std::vector< std::vector< G4double > > fermi_momenta
const G4double radiusForSmall
static const G4double hyperon_vp
void setBullet(const G4InuclParticle *bullet)
G4bool quasi_deutron() const
G4double getRatio(G4int ip) const
G4bool isProjectile(const G4CascadParticle &cparticle) const
G4CascadeInterpolator< 30 > gammaQDinterp
void updateZone(G4int izone)
void fillPotentials(G4int type, G4double tot_vol)
std::vector< std::vector< G4double > > nucleon_densities
void incrementReflectionCounter()
G4bool nucleon(G4int ityp)
G4bool worthToPropagate(const G4CascadParticle &cparticle) const
G4bool reflectedNow() const
std::vector< G4double > binding_energies
G4LorentzVector generateWithRandomAngles(G4double p, G4double mass=0.)
double dot(const Hep3Vector &) const
void setVect(const Hep3Vector &)
void updateParticleMomentum(const G4LorentzVector &mom)
G4bool passTrailing(const G4ThreeVector &hit_position)
static constexpr double second
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
std::vector< G4double > zone_volumes
G4LorentzVector generateWithFixedTheta(G4double ct, G4double p, G4double mass=0.)
void updatePosition(const G4ThreeVector &pos)
std::vector< std::vector< G4double > > zone_potentials
const G4ThreeVector & getPosition() const
G4double G4Log(G4double x)
double angle(const Hep3Vector &) const
std::pair< std::vector< G4CascadParticle >, std::vector< G4InuclElementaryParticle > > modelLists
G4double fillZoneVolumes(G4double nuclearRadius)
G4double totalCrossSection(G4double ke, G4int rtype) const
G4LorentzVector backToTheLab(const G4LorentzVector &mom) const
G4double generateInteractionLength(const G4CascadParticle &cparticle, G4double path, G4double invmfp) const
static const G4CascadeChannel * GetTable(G4int initialState)
G4double getKineticEnergy() const
void setNucleusState(G4int a, G4int z)
G4bool young(G4double young_path_cut, G4double cpath) const
void reset(G4int nHitNeutrons=0, G4int nHitProtons=0, const std::vector< G4ThreeVector > *hitPoints=0)
G4bool isNeutrino() const
void propagateAlongThePath(G4double path)
G4double getFermiMomentum(G4int ip, G4int izone) const
static constexpr double deg
std::vector< G4double > pf
void boundaryTransition(G4CascadParticle &cparticle)
G4double G4cbrt(G4double x)
G4double getPotential(G4int ip, G4int izone) const
static const G4double pion_vp
std::vector< G4double > zone_radii
G4CollisionOutput EPCoutput
void incrementCurrentPath(G4double npath)
G4double getDensity(G4int ip, G4int izone) const
double A(double temperature)
G4int getZone(G4double r) const
const G4InuclElementaryParticle neutronEP
G4LorentzVector generateNucleonMomentum(G4int type, G4int zone) const
static G4bool useQuasiDeuteron(G4int ptype, G4int qdtype=0)
G4bool movingInsideNuclei() const
static G4bool sortPartners(const partner &p1, const partner &p2)
const G4double crossSectionUnits
G4GLOB_DLL std::ostream G4cerr
Hep3Vector & rotate(double, const Hep3Vector &)
G4int numberOfOutgoingParticles() const
Hep3Vector cross(const Hep3Vector &) const
G4bool passFermi(const std::vector< G4InuclElementaryParticle > &particles, G4int zone)
G4double getVolume(G4int izone) const
static const G4double alfa6[6]
double epsilon(double density, double temperature)
G4int getCurrentZone() const
void toTheTargetRestFrame()
std::vector< partner > thePartners
void setTarget(const G4InuclParticle *target)
static const G4double alfa3[3]
const G4double radiusScale2
std::pair< G4InuclElementaryParticle, G4double > partner
void generateInteractionPartners(G4CascadParticle &cparticle)
G4double zoneIntegralWoodsSaxon(G4double ur1, G4double ur2, G4double nuclearRadius) const
const G4double radiusScale
std::vector< G4InuclElementaryParticle > raw_particles
G4double getCurrentDensity(G4int ip, G4int izone) const
virtual G4double getCrossSection(double ke) const =0
G4InuclNuclei * theNucleus
G4bool forceFirst(const G4CascadParticle &cparticle) const
G4double getCharge() const
G4InuclElementaryParticle generateQuasiDeuteron(G4int type1, G4int type2, G4int zone) const
const G4double radiusUnits
std::vector< G4InuclElementaryParticle >::iterator particleIterator
G4double getKinEnergyInTheTRS() const
G4GLOB_DLL std::ostream G4cout
G4CascadParticle initializeCascad(G4InuclElementaryParticle *particle)
virtual void setVerboseLevel(G4int verbose=0)
static const G4double piTimes4thirds
static const G4double kaon_vp
const G4double radScaleAlpha
G4double getFermiKinetic(G4int ip, G4int izone) const
std::vector< G4double > rod
std::vector< G4InuclElementaryParticle > qdeutrons
static constexpr double pi
G4double getPathToTheNextZone(G4double rz_in, G4double rz_out)
G4double zoneIntegralGaussian(G4double ur1, G4double ur2, G4double nuclearRadius) const
G4LorentzConvertor dummy_convertor
void printCollisionOutput(std::ostream &os=G4cout) const
G4LorentzVector getMomentum() const
G4double bindingEnergy(G4int A, G4int Z)
static const G4double small
void choosePointAlongTraj(G4CascadParticle &cparticle)
G4double inverseMeanFreePath(const G4CascadParticle &cparticle, const G4InuclElementaryParticle &target, G4int zone=-1)
G4int neutronNumberCurrent
G4double getEnergy() const
std::vector< G4ThreeVector > coordinates
std::vector< G4LorentzVector > momentums
static constexpr double GeV
const G4double gammaQDscale
G4int protonNumberCurrent
void generateModel(G4InuclNuclei *nuclei)
G4int getGeneration() const
void fillBindingEnergies()
G4double interpolate(const G4double x, const G4double(&yb)[nBins]) const
G4double absorptionCrossSection(G4double e, G4int type) const
void generateParticleFate(G4CascadParticle &cparticle, G4ElementaryParticleCollider *theEPCollider, std::vector< G4CascadParticle > &cascade)