54 #include "Framework/Conventions/GBuild.h"
78 using std::ostringstream;
80 using namespace genie;
81 using namespace genie::utils;
82 using namespace genie::utils::intranuke;
83 using namespace genie::constants;
84 using namespace genie::controls;
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();
636 target.SetHitNucPdg(tcode);
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);
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);
875 target.SetHitNucPdg(t2code);
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;
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";
1355 if ( pdgc==
kPdgPiM ) fRemnZ++;
1358 exception.
SetReason(
"Phase space generation of absorption final state failed");
1427 LOG(
"HAIntranuke",
pINFO) <<
"R0 = " <<
fR0 <<
" fermi";
double fFermiMomentum
whether or not particle collision is pauli blocked
static string AsString(INukeMode_t mode)
An exception thrown by SimulateHadronState for kinematics problems. TwoBodyCollision/Kinematics used ...
void SetFirstMother(int m)
virtual GHepParticle * Particle(int position) const
TRandom3 & RndFsi(void) const
rnd number generator used by intranuclear cascade monte carlos
double fNucleonFracInelScale
INukeHadroData * fHadroData
a collection of h+N,h+A data & calculations
double E(void) const
Get energy.
TLorentzVector fRemnP4
P4 of remnant system.
static RandomGen * Instance()
Access instance.
const TLorentzVector * P4(void) const
double PnBounce(void) const
The INTRANUKE intranuclear hadron transport MC. Is a concrete implementation of the EventRecordVisito...
double PiBounce(void) const
double fHadStep
step size for intranuclear hadron transport
double fNucleonFracCExScale
Pure abstract base class. Defines the NuclearModelI interface to be implemented by any physics model ...
double Mass(Resonance_t res)
resonance mass (GeV)
virtual void ProcessEventRecord(GHepRecord *event_rec) const
void SetMomentum(const TLorentzVector &p4)
static constexpr double ns
double Mass(void) const
Mass that corresponds to the PDG code.
double fNucleonFracAbsScale
static constexpr double MeV
A singleton holding random number generator classes. All random number generation in GENIE should tak...
double Pz(void) const
Get Pz.
double Frac(int hpdgc, INukeFateHA_t fate, double ke) const
unsigned int fNumIterations
const TVector3 & Momentum3(void) const
bool HandleCompoundNucleus(GHepRecord *ev, GHepParticle *p, int mom) const
void InelasticHA(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
double Px(void) const
Get Px.
virtual GHepParticle * Probe(void) const
int LastMother(void) const
double fDelRNucleon
factor by which Nucleon Compton wavelength gets multiplied to become nuclear size enhancement ...
int FirstMother(void) const
string Name(void) const
Name that corresponds to the PDG code.
void SimulateHadronicFinalStateKinematics(GHepRecord *ev, GHepParticle *p) const
const int kPdgCompNuclCluster
double fDelRPion
factor by which Pion Compton wavelength gets multiplied to become nuclear size enhancement ...
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
enum genie::EINukeFateHN_t INukeFateHN_t
double fPionFracPiProdScale
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)
void SetReason(string reason)
double fPionFracInelScale
static INukeHadroData * Instance(void)
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
virtual void Configure(const Registry &config)
bool TwoBodyKinematics(double M3, double M4, TLorentzVector tP1L, TLorentzVector tP2L, TLorentzVector &tP3L, TLorentzVector &tP4L, double C3CM, TLorentzVector &RemnP4, double bindE=0)
bool fDoCompoundNucleus
whether or not to do compound nucleus considerations
double fR0
effective nuclear size param
virtual GHepParticle * TargetNucleus(void) const
void Inelastic(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
int fRemnA
remnant nucleus A
INukeFateHA_t HadronFateHA(const GHepParticle *p) const
double fNucRmvE
binding energy to subtract from cascade nucleons
double IntBounce(const GHepParticle *p, int target, int s1, INukeFateHN_t fate)
double fNucAbsFac
absorption xsec correction factor (hN Mode)
double KinE(bool mass_from_pdg=false) const
Get kinetic energy.
static PDGLibrary * Instance(void)
void SetLastMother(int m)
double fEPreEq
threshold for pre-equilibrium reaction
Singleton class to load & serve a TDatabasePDG.
const TLorentzVector * X4(void) const
void SetStatus(GHepStatus_t s)
static string AsString(INukeFateHN_t fate)
void SetHitNucPdg(int pdgc)
bool IsNeutronOrProton(int pdgc)
double fPionFracElasScale
double fNucCEXFac
charge exchange xsec correction factor (hN Mode)
double fChPionMFPScale
tweaking factors for tuning
int fRemnZ
remnant nucleus Z
void ElasHA(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
bool fDoFermi
whether or not to do fermi mom.
virtual void AddParticle(const GHepParticle &p)
double fFermiFac
testing parameter to modify fermi momentum
TParticlePDG * Find(int pdgc, bool must_exist=true)
bool GetParamDef(const RgKey &name, T &p, const T &def) const
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
double fNucleonFracPiProdScale
static const unsigned int kRjMaxIterations
double fNeutralPionMFPScale
virtual bool GenerateNucleon(const Target &) const =0
GENIE's GHEP MC event record.
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils...
STDHEP-like event record entry that can fit a particle or a nucleus.
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.
void ProcessEventRecord(GHepRecord *event_rec) const
enum genie::EINukeFateHA_t INukeFateHA_t
double fNucleonFracElasScale
const NuclearModelI * fNuclmodel
nuclear model used to generate fermi momentum
void push_back(int pdg_code)
virtual void Configure(string param_set)
enum genie::EGHepStatus GHepStatus_t
double fNR
param multiplying the nuclear radius, determining how far to track hadrons beyond the "nuclear bounda...
void SimulateHadronicFinalState(GHepRecord *ev, GHepParticle *p) const
double Py(void) const
Get Py.
const Algorithm * SubAlg(const RgKey ®istry_key) const