54#include "Framework/Conventions/GBuild.h"
78using std::ostringstream;
111 <<
"************ Running HA MODE INTRANUKE ************";
115 LOG(
"HAIntranuke",
pINFO) <<
"Done with this event";
125 LOG(
"HAIntranuke",
pERROR) <<
"** Null input!";
135 bool is_handled = (is_baryon || is_pion || is_kaon || is_gamma);
137 LOG(
"HAIntranuke",
pERROR) <<
"** Can not handle particle: " << p->
Name();
148 LOG(
"HAIntranuke",
pERROR) <<
"** Couldn't select a fate";
169 <<
"Generating kinematics for " << p->
Name()
197 <<
"Failed attempt to generate kinematics for "
203 <<
"Failed attempt to generate kinematics for "
206 <<
" attempts. Trying a new fate...";
223 <<
"Selecting hA fate for " << p->
Name() <<
" with KE = " << ke <<
" MeV";
226 unsigned int iter = 0;
252 double frac_rescale = 1./(frac_cex + frac_elas + frac_inel + frac_abs + frac_piprod);
253 frac_cex *= frac_rescale;
254 frac_elas *= frac_rescale;
255 frac_inel *= frac_rescale;
256 frac_abs *= frac_rescale;
257 frac_piprod *= frac_rescale;
267 double tf = frac_cex +
273 double r = tf * rnd->
RndFsi().Rndm();
274#ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
275 LOG(
"HAIntranuke",
pDEBUG) <<
"r = " << r <<
" (max = " << tf <<
")";
278 if(r < (cf += frac_cex ))
return kIHAFtCEx;
281 if(r < (cf += frac_abs ))
return kIHAFtAbs;
285 <<
"No selection after going through all fates! "
286 <<
"Total fraction = " << tf <<
" (r = " << r <<
")";
304 double frac_rescale = 1./(frac_cex + frac_elas + frac_inel + frac_abs + frac_pipro);
305 frac_cex *= frac_rescale;
306 frac_elas *= frac_rescale;
307 frac_inel *= frac_rescale;
308 frac_abs *= frac_rescale;
309 frac_pipro *= frac_rescale;
319 double tf = frac_cex +
325 double r = tf * rnd->
RndFsi().Rndm();
326#ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
327 LOG(
"HAIntranuke",
pDEBUG) <<
"r = " << r <<
" (max = " << tf <<
")";
330 if(r < (cf += frac_cex ))
return kIHAFtCEx;
333 if(r < (cf += frac_abs ))
return kIHAFtAbs;
337 <<
"No selection after going through all fates! "
338 <<
"Total fraction = " << tf <<
" (r = " << r <<
")";
348 double tf = frac_inel +
350 double r = tf * rnd->
RndFsi().Rndm();
351#ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
352 LOG(
"HAIntranuke",
pDEBUG) <<
"r = " << r <<
" (max = " << tf <<
")";
356 if(r < (cf += frac_abs ))
return kIHAFtAbs;
372 const int nprob = 25;
373 double dintor = 0.0174533;
374 double denom = 47979.453;
375 double rprob[nprob] = {
376 5000., 4200., 3000., 2600., 2100., 1800., 1200., 750., 500., 230., 120.,
377 35., 9., 3., 11., 18., 29., 27., 20., 14., 10., 6., 2., 0.14, 0.19 };
379 double angles[nprob];
380 for(
int i=0; i<nprob; i++) angles[i] = 2.5*i;
383 double r = rnd->
RndFsi().Rndm();
390 for(
int i=0; i<60; i++) {
392 for(
int j=0; j < nprob-1; j++) {
396 if(binl<=theta && binh>=theta)
break;
400 double tfract = (theta-binl)/2.5;
401 double delp = rprob[itj+1] - rprob[itj];
402 xsum += (rprob[itj] + tfract*delp)/denom;
410 <<
"Generated pi+A elastic scattering angle = " << theta <<
" radians";
425 const int nprob = 20;
426 double dintor = 0.0174533;
427 double denom = 11967.0;
428 double rprob[nprob] = {
429 2400., 2350., 2200., 2000., 1728., 1261., 713., 312., 106., 35.,
430 6., 5., 10., 12., 11., 9., 6., 1., 1., 1. };
432 double angles[nprob];
433 for(
int i=0; i<nprob; i++) angles[i] = 1.0*i;
436 double r = rnd->
RndFsi().Rndm();
443 for(
int i=0; i< nprob; i++) {
445 for(
int j=0; j < nprob-1; j++) {
449 if(binl<=theta && binh>=theta)
break;
453 double tfract = (theta-binl)/2.5;
454 double delp = rprob[itj+1] - rprob[itj];
455 xsum += (rprob[itj] + tfract*delp)/denom;
463 <<
"Generated N+A elastic scattering angle = " << theta <<
" radians";
474#ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
476 <<
"ElasHA() is invoked for a : " << p->
Name()
497 int pcode = p->
Pdg();
498 double Mp = p->
Mass();
506 TLorentzVector t4PpL = *p->
P4();
507 TLorentzVector t4PtL =
fRemnP4;
512 else C3CM = TMath::Cos(this->
PiBounce());
515 TLorentzVector t4P3L, t4P4L;
519 LOG(
"HAIntranuke",
pNOTICE) <<
"ElasHA() failed";
521 exception.
SetReason(
"TwoBodyKinematics failed in ElasHA");
532 <<
"C3cm = " << C3CM;
534 <<
"|p3| = " << t4P3L.Vect().Mag() <<
", E3 = " << t4P3L.E() <<
",Mp = " << Mp;
536 <<
"|p4| = " <<
fRemnP4.Vect().Mag() <<
", E4 = " <<
fRemnP4.E() <<
",Mt = " << Mt;
548#ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
550 <<
"InelasticHA() is invoked for a : " << p->
Name()
567 int pcode = p->
Pdg();
568 int tcode, scode, s2code;
594 {
LOG(
"HAIntranuke",
pWARN) <<
"InelasticHA() cannot handle fate: "
596 <<
" for particle " << p->
Name();
611 LOG(
"HAIntranuke",
pNOTICE) <<
"InelasticHA() stops : not enough nucleons";
620 LOG(
"HAIntranuke",
pWARN) <<
"InelasticHA() failed : too few protons in nucleus";
631 double tM = t.
Mass();
639 double tE = TMath::Sqrt(tP3.Mag2()+ tM*tM);
649 double pM = p->
Mass();
650 double E_p = ((*p->
P4() + *t.
P4()).Mag2() - tM*tM - pM*pM)/(2.0*tM);
651 double P_p = TMath::Sqrt(E_p*E_p - pM*pM);
654 double C3CM =
fHadroData->IntBounce(cl,tcode,scode,h_fate);
658 LOG(
"HAIntranuke",
pWARN) <<
"unphysical angle chosen in InelasicHA - put particle outside nucleus";
663 double KE1L = p->
KinE();
664 double KE2L = t.
KinE();
666 <<
" KE1L = " << KE1L <<
" " << KE1L <<
" KE2L = " << KE2L;
673 double P3L = TMath::Sqrt(cl1.
Px()*cl1.
Px() + cl1.
Py()*cl1.
Py() + cl1.
Pz()*cl1.
Pz());
674 double P4L = TMath::Sqrt(cl2.
Px()*cl2.
Px() + cl2.
Py()*cl2.
Py() + cl2.
Pz()*cl2.
Pz());
675 double E3L = cl1.
KinE();
676 double E4L = cl2.
KinE();
677 LOG (
"HAIntranuke",
pINFO) <<
"Successful quasielastic scattering or charge exchange";
679 <<
"C3CM = " << C3CM <<
"\n P3L, E3L = "
680 << P3L <<
" " << E3L <<
" P4L, E4L = "<< P4L <<
" " << E4L ;
682 <<
"P4L = " << P4L <<
" ;E4L= " << E4L <<
"\n probe KE = " << ev->
Probe()->
KinE() <<
"\n";
686 exception.
SetReason(
"TwoBodyCollison gives KE> probe KE in hA simulation");
698 exception.
SetReason(
"TwoBodyCollison failed in hA simulation");
732#ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
734 <<
"Inelastic() is invoked for a : " << p->
Name()
738 bool allow_dup =
true;
749 ev,p,&s1,&s2,&s3,
fRemnA,
fRemnZ,
fRemnP4,
fDoFermi,
fFermiFac,
fFermiMomentum,
fNuclmodel);
752 LOG (
"HAIntranuke",
pINFO) <<
" successful pion production fate";
767 LOG(
"HAIntranuke",
pNOTICE) <<
"Error: could not create pion production final state";
769 exception.
SetReason(
"PionProduction kinematics failed - retry kinematics");
787 LOG(
"HAIntranuke",
pNOTICE) <<
"stop propagation - could not create absorption final state: too few particles";
794 LOG(
"HAIntranuke",
pNOTICE) <<
"stop propagation - could not create absorption final state: Pi- or K- cannot be absorbed by only neutrons";
801 LOG(
"HAIntranuke",
pINFO) <<
"stop propagation - could not create absorption final state: Pi+ or K+ cannot be absorbed by only protons";
815 int t1code,t2code,scode,s2code;
821 double Prob_pipd_pp=2.*ppcnt*(1.-ppcnt);
822 double Prob_pipnn_pn=.083*(1.-ppcnt)*(1.-ppcnt);
823 if (rnd->
RndFsi().Rndm()*(Prob_pipd_pp+Prob_pipnn_pn)<Prob_pipd_pp){
831 double Prob_pimd_nn=2.*ppcnt*(1.-ppcnt);
832 double Prob_pimpp_pn=.083*ppcnt*ppcnt;
833 if (rnd->
RndFsi().Rndm()*(Prob_pimd_nn+Prob_pimpp_pn)<Prob_pimd_nn){
841 double Prob_pi0d_pn=0.88*ppcnt*(1.-ppcnt);
842 double Prob_pi0pp_pp=.14*ppcnt*ppcnt;
843 double Prob_pi0nn_nn=.14*(1.-ppcnt)*(1.-ppcnt);
844 if (rnd->
RndFsi().Rndm()*(Prob_pi0d_pn+Prob_pi0pp_pp+Prob_pi0nn_nn)<Prob_pi0d_pn){
847 else if (rnd->
RndFsi().Rndm()*(Prob_pi0d_pn+Prob_pi0pp_pp+Prob_pi0nn_nn)<(Prob_pi0d_pn+Prob_pi0pp_pp)){
854 LOG(
"HAIntranuke",
pINFO) <<
"choose 2 body absorption, probe, fs = " << pdgc <<
" "<< scode <<
" "<<s2code;
857 double M2_1 = pLib->
Find(t1code)->Mass();
858 double M2_2 = pLib->
Find(t2code)->Mass();
860 double M3 = pLib->
Find(scode) ->Mass();
861 double M4 = pLib->
Find(s2code)->Mass();
865 TVector3 tP2_1L, tP2_2L;
873 E2_1L = TMath::Sqrt(tP2_1L.Mag2() + M2_1*M2_1);
878 E2_2L = TMath::Sqrt(tP2_2L.Mag2() + M2_2*M2_2);
884 tP2_1L.SetXYZ(0.0, 0.0, 0.0);
887 tP2_2L.SetXYZ(0.0, 0.0, 0.0);
890 TLorentzVector dNucl_P4=TLorentzVector(tP2_1L+tP2_2L,E2_1L+E2_2L);
892 double E2L = E2_1L + E2_2L;
896 double C3CM =
fHadroData->IntBounce(p,t1code,scode,fate_hN);
899 LOG(
"HAIntranuke",
pWARN) <<
"Inelastic() failed: IntBounce returned bad angle - try again";
901 exception.
SetReason(
"unphysical angle for hN scattering");
906 TLorentzVector t4P1L,t4P2L,t4P3L,t4P4L;
908 t4P2L=TLorentzVector(TVector3(tP2_1L+tP2_2L),E2L);
949 LOG(
"HAIntranuke",
pNOTICE) <<
"Inelastic in hA failed calling TwoBodyKineamtics";
951 exception.
SetReason(
"Pion absorption kinematics through TwoBodyKinematics failed");
975 nd0 = -135.227 * TMath::Exp(-7.124*
fRemnZ /
double(
fRemnA)) + 4.914;
977 Sig_nd = 2.034 +
fRemnA * 0.007846;
979 double c1 = 0.041 + ke * 0.0001525;
980 double c2 = -0.003444 - ke * 0.00002324;
983 double c3 = 0.064 - ke * 0.000015;
984 gam_ns = c1 * TMath::Exp(c2*
fRemnA) + c3;
985 if(gam_ns<0.002) gam_ns = 0.002;
987 LOG(
"HAIntranuke",
pINFO) <<
"nucleon absorption";
988 LOG(
"HAIntranuke",
pINFO) <<
"--> mean diff distr = " << nd0 <<
", stand dev = " << Sig_nd;
990 LOG(
"HAIntranuke",
pINFO) <<
"--> gam_ns = " << gam_ns;
994 ns0 = .0001*(1.+ke/250.) * (
fRemnA-10)*(
fRemnA-10) + 3.5;
995 nd0 = (1.+ke/250.) - ((
fRemnA/200.)*(1. + 2.*ke/250.));
996 Sig_ns = (10. + 4. * ke/250.)*TMath::Power(
fRemnA/250.,0.9);
997 Sig_nd = 4*(1 - TMath::Exp(-0.03*ke));
998 LOG(
"HAIntranuke",
pINFO) <<
"pion absorption";
999 LOG(
"HAIntranuke",
pINFO) <<
"--> mean diff distr = " << nd0 <<
", stand dev = " << Sig_nd;
1000 LOG(
"HAIntranuke",
pINFO) <<
"--> mean sum distr = " << ns0 <<
", Stand dev = " << Sig_ns;
1004 ns0 = (rnd->
RndFsi().Rndm()>0.5?3:2);
1008 LOG(
"HAIntranuke",
pINFO) <<
"kaon absorption - set ns, nd later";
1014 LOG(
"HAIntranuke",
pWARN) <<
"Inelastic() cannot handle absorption reaction for " << p->
Name();
1024 double u1 = 0, u2 = 0;
1030 LOG(
"HAIntranuke",
pNOTICE) <<
"Error: could not choose absorption final state";
1031 LOG(
"HAIntranuke",
pNOTICE) <<
"--> mean diff distr = " << nd0 <<
", stand dev = " << Sig_nd;
1032 LOG(
"HAIntranuke",
pNOTICE) <<
"--> mean sum distr = " << ns0 <<
", Stand dev = " << Sig_ns;
1033 LOG(
"HAIntranuke",
pNOTICE) <<
"--> gam_ns = " << gam_ns;
1036 exception.
SetReason(
"Absorption choice of # of p,n failed");
1045 u1 = rnd->
RndFsi().Rndm();
1046 u2 = rnd->
RndFsi().Rndm();
1047 if (u1==0) u1 = rnd->
RndFsi().Rndm();
1048 if (u2==0) u2 = rnd->
RndFsi().Rndm();
1051 double x2 = TMath::Sqrt(-2*TMath::Log(u1))*TMath::Sin(2*
kPi*u2);
1057 ns = -TMath::Log(rnd->
RndFsi().Rndm())/gam_ns;
1061 ns = (rnd->
RndFsi().Rndm()<0.5?2:3);
1072 double max = ns0 + Sig_ns * 10;
1075 bool not_found =
true;
1083 LOG(
"HAIntranuke",
pNOTICE) <<
"Error: stuck in random variable loop for ns";
1084 LOG(
"HAIntranuke",
pNOTICE) <<
"--> mean of sum parent distr = " << ns0 <<
", Stand dev = " << Sig_ns;
1088 exception.
SetReason(
"Random number generator for choice of #p,n final state failed - unusual - redo kinematics");
1093 u1 = rnd->
RndFsi().Rndm();
1094 u2 = rnd->
RndFsi().Rndm();
1095 if (u1==0) u1 = rnd->
RndFsi().Rndm();
1096 if (u2==0) u2 = rnd->
RndFsi().Rndm();
1097 x1 = TMath::Sqrt(-2*TMath::Log(u1))*TMath::Cos(2*
kPi*u2);
1099 ns = ns0 + Sig_ns * x1;
1100 if ( ns>max || ns<0 ) {iter2++;
continue;}
1101 else if ( rnd->
RndFsi().Rndm() > (ns/max) ) {iter2++;
continue;}
1109 double nd = nd0 + Sig_nd * x2;
1114 np = int((ns+nd)/2.+.5);
1115 nn = int((ns-nd)/2.+.5);
1117 LOG(
"HAIntranuke",
pINFO) <<
"ns = "<<ns<<
", nd = "<<nd<<
", np = "<<np<<
", nn = "<<nn;
1123 if (np < 0 || nn < 0 ) {iter++;
continue;}
1124 else if (np + nn < 2. ) {iter++;
continue;}
1127 - ((pdgc==
kPdgPiM || pdgc==
kPdgKM)?1:0)) {iter++;
continue;}
1132 LOG(
"HAIntranuke",
pINFO) <<
"success, iter = " << iter <<
" np, nn = " << np <<
" " << nn;
1135 double frac = 85./double(np+nn);
1143 if (rnd->
RndFsi().Rndm()<np/(
double)(np+nn)) np--;
1147 LOG(
"HAIntranuke",
pNOTICE) <<
"Final state chosen; # protons : "
1148 << np <<
", # neutrons : " << nn;
1176 PDGCodeList* listar[5] = {&list0, &list1, &list2, &list3, &list4};
1181 double probM = pLib->
Find(pdgc) ->Mass();
1182 TVector3 pP3 = p->
P4()->Vect() * (1./5.);
1183 double probKE = p->
P4()->E() -probM;
1184 double clusKE = probKE * (1./5.);
1185 TLorentzVector clusP4(pP3,clusKE);
1187 TLorentzVector X4(*p->
X4());
1202 for (
int i=0;i<(np+nn);i++)
1212 for (
int i=0;i<5;i++)
1214 LOG(
"HAIntranuke",
pINFO) <<
"List" << i <<
" size: " << listar[i]->size();
1215 if (listar[i]->size() <2)
1218 exception.
SetReason(
"too few particles for Phase Space decay - try again");
1258 if(success1 && success2 && success3 && success4 && success5)
1260 LOG(
"HAIntranuke",
pINFO)<<
"Successful many-body absorption - n>=18";
1265 LOG(
"HAIntranuke",
pWARN) <<
"PhaseSpace decay fails for HadrCluster- recovery likely incorrect - rethrow event";
1291 for (
int i=0;i<np;i++)
1297 for (
int i=0;i<nn;i++)
1333 <<
"Remnant nucleus (A,Z) = (" <<
fRemnA <<
", " <<
fRemnZ <<
")";
1334 LOG(
"HAIntranuke",
pINFO) <<
" list size: " << np+nn;
1338 exception.
SetReason(
"too few particles for Phase Space decay - try again");
1346 LOG (
"HAIntranuke",
pINFO) <<
"Successful many-body absorption, n<=18";
1358 exception.
SetReason(
"Phase space generation of absorption final state failed");
1427 LOG(
"HAIntranuke",
pINFO) <<
"R0 = " <<
fR0 <<
" fermi";
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils.
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
virtual void Configure(const Registry &config)
bool GetParamDef(const RgKey &name, T &p, const T &def) const
const Algorithm * SubAlg(const RgKey ®istry_key) const
STDHEP-like event record entry that can fit a particle or a nucleus.
string Name(void) const
Name that corresponds to the PDG code.
int FirstMother(void) const
void SetMomentum(const TLorentzVector &p4)
void SetRescatterCode(int code)
void SetFirstMother(int m)
void SetLastMother(int m)
const TLorentzVector * P4(void) const
double Mass(void) const
Mass that corresponds to the PDG code.
int LastMother(void) const
const TLorentzVector * X4(void) const
void SetStatus(GHepStatus_t s)
double Px(void) const
Get Px.
double E(void) const
Get energy.
double Pz(void) const
Get Pz.
double Py(void) const
Get Py.
int RescatterCode(void) const
double KinE(bool mass_from_pdg=false) const
Get kinetic energy.
GENIE's GHEP MC event record.
virtual GHepParticle * Probe(void) const
virtual GHepParticle * TargetNucleus(void) const
virtual void AddParticle(const GHepParticle &p)
virtual GHepParticle * Particle(int position) const
void ProcessEventRecord(GHepRecord *event_rec) const
void Inelastic(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
bool HandleCompoundNucleus(GHepRecord *ev, GHepParticle *p, int mom) const
unsigned int fNumIterations
void SimulateHadronicFinalState(GHepRecord *ev, GHepParticle *p) const
void SimulateHadronicFinalStateKinematics(GHepRecord *ev, GHepParticle *p) const
INukeFateHA_t HadronFateHA(const GHepParticle *p) const
double PnBounce(void) const
virtual void Configure(string param_set)
void ElasHA(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
double PiBounce(void) const
void InelasticHA(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
static INukeHadroData * Instance(void)
static string AsString(INukeFateHN_t fate)
static string AsString(INukeMode_t mode)
double fR0
effective nuclear size param
bool fDoCompoundNucleus
whether or not to do compound nucleus considerations
double fPionFracPiProdScale
int fRemnZ
remnant nucleus Z
const NuclearModelI * fNuclmodel
nuclear model used to generate fermi momentum
double fHadStep
step size for intranuclear hadron transport
virtual void ProcessEventRecord(GHepRecord *event_rec) const
double fNucleonFracInelScale
double fNucleonFracElasScale
double fNucAbsFac
absorption xsec correction factor (hN Mode)
double fFermiMomentum
whether or not particle collision is pauli blocked
double fPionFracInelScale
double fNucleonFracAbsScale
double fChPionMFPScale
tweaking factors for tuning
double fNucleonFracPiProdScale
bool fDoFermi
whether or not to do fermi mom.
int fRemnA
remnant nucleus A
TLorentzVector fRemnP4
P4 of remnant system.
double fDelRPion
factor by which Pion Compton wavelength gets multiplied to become nuclear size enhancement
double fPionFracElasScale
double fEPreEq
threshold for pre-equilibrium reaction
double fNucleonFracCExScale
double fNR
param multiplying the nuclear radius, determining how far to track hadrons beyond the "nuclear bounda...
double fNeutralPionMFPScale
double fNucRmvE
binding energy to subtract from cascade nucleons
INukeHadroData * fHadroData
a collection of h+N,h+A data & calculations
double fNucCEXFac
charge exchange xsec correction factor (hN Mode)
double fDelRNucleon
factor by which Nucleon Compton wavelength gets multiplied to become nuclear size enhancement
double fFermiFac
testing parameter to modify fermi momentum
Pure abstract base class. Defines the NuclearModelI interface to be implemented by any physics model ...
void push_back(int pdg_code)
Singleton class to load & serve a TDatabasePDG.
static PDGLibrary * Instance(void)
TParticlePDG * Find(int pdgc, bool must_exist=true)
A singleton holding random number generator classes. All random number generation in GENIE should tak...
static RandomGen * Instance()
Access instance.
TRandom3 & RndFsi(void) const
rnd number generator used by intranuclear cascade monte carlos
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
void SetHitNucPdg(int pdgc)
An exception thrown by SimulateHadronState for kinematics problems. TwoBodyCollision/Kinematics used ...
void SetReason(string reason)
Misc GENIE control constants.
static const unsigned int kRjMaxIterations
bool IsNeutronOrProton(int pdgc)
static constexpr double MeV
Simple functions for loading and reading nucleus dependent keys from config files.
bool TwoBodyKinematics(double M3, double M4, TLorentzVector tP1L, TLorentzVector tP2L, TLorentzVector &tP3L, TLorentzVector &tP4L, double C3CM, TLorentzVector &RemnP4, double bindE=0)
bool PhaseSpaceDecay(GHepRecord *ev, GHepParticle *p, const PDGCodeList &pdgv, TLorentzVector &RemnP4, double NucRmvE, EINukeMode mode=kIMdHA)
general phase space decay method
bool PionProduction(GHepRecord *ev, GHepParticle *p, GHepParticle *s1, GHepParticle *s2, GHepParticle *s3, int &RemnA, int &RemnZ, TLorentzVector &RemnP4, bool DoFermi, double FermiFac, double FermiMomentum, const NuclearModelI *Nuclmodel)
bool TwoBodyCollision(GHepRecord *ev, int pcode, int tcode, int scode, int s2code, double C3CM, GHepParticle *p, GHepParticle *t, int &RemnA, int &RemnZ, TLorentzVector &RemnP4, EINukeMode mode=kIMdHA)
Intranuke utility functions.
Root of GENIE utility namespaces.
THE MAIN GENIE PROJECT NAMESPACE
@ kIStNucleonClusterTarget
const int kPdgCompNuclCluster
enum genie::EINukeFateHN_t INukeFateHN_t
enum genie::EGHepStatus GHepStatus_t
enum genie::EINukeFateHA_t INukeFateHA_t