60 #include "Conventions/GBuild.h" 85 using std::ostringstream;
87 using namespace genie;
118 <<
"************ Running hA2015 MODE INTRANUKE ************";
119 GHepParticle * nuclearTarget = evrec -> TargetNucleus();
120 nuclA = nuclearTarget ->
A();
124 LOG(
"HAIntranuke2015",
pINFO) <<
"Done with this event";
134 LOG(
"HAIntranuke2015",
pERROR) <<
"** Null input!";
144 bool is_handled = (is_baryon || is_pion || is_kaon || is_gamma);
146 LOG(
"HAIntranuke2015",
pERROR) <<
"** Can not handle particle: " << p->
Name();
157 LOG(
"HAIntranuke2015",
pERROR) <<
"** Couldn't select a fate";
178 <<
"Generating kinematics for " << p->
Name()
201 LOG(
"HAIntranuke2015",
pWARN) <<
"Running PreEquilibrium for kIHAFtCmp";
211 <<
"Failed attempt to generate kinematics for " 217 <<
"Failed attempt to generate kinematics for " 220 <<
" attempts. Trying a new fate...";
240 <<
"Selecting hA fate for " << p->
Name() <<
" with KE = " << ke <<
" MeV";
243 unsigned int iter = 0;
263 double tf = frac_cex +
269 double r = tf * rnd->
RndFsi().Rndm();
270 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 271 LOG(
"HAIntranuke2015",
pDEBUG) <<
"r = " << r <<
" (max = " << tf <<
")";
274 if(r < (cf += frac_cex ))
return kIHAFtCEx;
277 if(r < (cf += frac_abs ))
return kIHAFtAbs;
281 <<
"No selection after going through all fates! " 282 <<
"Total fraction = " << tf <<
" (r = " << r <<
")";
303 double tf = frac_cex +
310 double r = tf * rnd->
RndFsi().Rndm();
311 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 312 LOG(
"HAIntranuke2015",
pDEBUG) <<
"r = " << r <<
" (max = " << tf <<
")";
315 if(r < (cf += frac_cex ))
return kIHAFtCEx;
318 if(r < (cf += frac_abs ))
return kIHAFtAbs;
320 if(r < (cf += frac_cmp ))
return kIHAFtCmp;
323 <<
"No selection after going through all fates! " 324 <<
"Total fraction = " << tf <<
" (r = " << r <<
")";
335 double tf = frac_inel +
337 double r = tf * rnd->
RndFsi().Rndm();
338 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 339 LOG(
"HAIntranuke2015",
pDEBUG) <<
"r = " << r <<
" (max = " << tf <<
")";
343 if(r < (cf += frac_abs ))
return kIHAFtAbs;
359 const int nprob = 25;
360 double dintor = 0.0174533;
361 double denom = 47979.453;
362 double rprob[nprob] = {
363 5000., 4200., 3000., 2600., 2100., 1800., 1200., 750., 500., 230., 120.,
364 35., 9., 3., 11., 18., 29., 27., 20., 14., 10., 6., 2., 0.14, 0.19 };
366 double angles[nprob];
367 for(
int i=0;
i<nprob;
i++) angles[
i] = 2.5*
i;
370 double r = rnd->
RndFsi().Rndm();
377 for(
int i=0;
i<60;
i++) {
379 for(
int j=0; j < nprob-1; j++) {
383 if(binl<=theta && binh>=theta)
break;
387 double tfract = (theta-binl)/2.5;
388 double delp = rprob[itj+1] - rprob[itj];
389 xsum += (rprob[itj] + tfract*delp)/denom;
397 <<
"Generated pi+A elastic scattering angle = " << theta <<
" radians";
412 const int nprob = 20;
413 double dintor = 0.0174533;
414 double denom = 11967.0;
415 double rprob[nprob] = {
416 2400., 2350., 2200., 2000., 1728., 1261., 713., 312., 106., 35.,
417 6., 5., 10., 12., 11., 9., 6., 1., 1., 1. };
419 double angles[nprob];
420 for(
int i=0;
i<nprob;
i++) angles[
i] = 1.0*
i;
423 double r = rnd->
RndFsi().Rndm();
430 for(
int i=0;
i< nprob;
i++) {
432 for(
int j=0; j < nprob-1; j++) {
436 if(binl<=theta && binh>=theta)
break;
440 double tfract = (theta-binl)/2.5;
441 double delp = rprob[itj+1] - rprob[itj];
442 xsum += (rprob[itj] + tfract*delp)/denom;
450 <<
"Generated N+A elastic scattering angle = " << theta <<
" radians";
461 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 463 <<
"ElasHA() is invoked for a : " << p->
Name()
484 int pcode = p->
Pdg();
485 double Mp = p->
Mass();
493 TLorentzVector t4PpL = *p->
P4();
494 TLorentzVector t4PtL =
fRemnP4;
499 else C3CM = TMath::Cos(this->
PiBounce());
502 TLorentzVector t4P3L, t4P4L;
506 LOG(
"HAIntranuke2015",
pNOTICE) <<
"ElasHA() failed";
508 exception.
SetReason(
"TwoBodyKinematics failed in ElasHA");
519 <<
"C3cm = " << C3CM;
521 <<
"|p3| = " << t4P3L.Vect().Mag() <<
", E3 = " << t4P3L.E() <<
",Mp = " << Mp;
523 <<
"|p4| = " <<
fRemnP4.Vect().Mag() <<
", E4 = " <<
fRemnP4.E() <<
",Mt = " << Mt;
535 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 537 <<
"InelasticHA() is invoked for a : " << p->
Name()
554 int pcode = p->
Pdg();
555 int tcode, scode, s2code;
581 {
LOG(
"HAIntranuke2015",
pWARN) <<
"InelasticHA() cannot handle fate: " 583 <<
" for particle " << p->
Name();
598 LOG(
"HAIntranuke2015",
pNOTICE) <<
"InelasticHA() stops : not enough nucleons";
607 LOG(
"HAIntranuke2015",
pWARN) <<
"InelasticHA() failed : too few protons in nucleus";
618 double tM = t.
Mass();
623 target.SetHitNucPdg(tcode);
626 double tE = TMath::Sqrt(tP3.Mag2()+ tM*tM);
636 double pM = p->
Mass();
637 double E_p = ((*p->
P4() + *t.
P4()).Mag2() - tM*tM - pM*pM)/(2.0*tM);
638 double P_p = TMath::Sqrt(E_p*E_p - pM*pM);
645 LOG(
"HAIntranuke2015",
pWARN) <<
"unphysical angle chosen in InelasicHA - put particle outside nucleus";
650 double KE1L = p->
KinE();
651 double KE2L = t.
KinE();
653 <<
" KE1L = " << KE1L <<
" " << KE1L <<
" KE2L = " << KE2L;
660 double P3L = TMath::Sqrt(cl1.
Px()*cl1.
Px() + cl1.
Py()*cl1.
Py() + cl1.
Pz()*cl1.
Pz());
661 double P4L = TMath::Sqrt(cl2.
Px()*cl2.
Px() + cl2.
Py()*cl2.
Py() + cl2.
Pz()*cl2.
Pz());
662 double E3L = cl1.
KinE();
663 double E4L = cl2.
KinE();
664 LOG (
"HAIntranuke2015",
pINFO) <<
"Successful quasielastic scattering or charge exchange";
666 <<
"C3CM = " << C3CM <<
"\n P3L, E3L = " 667 << P3L <<
" " << E3L <<
" P4L, E4L = "<< P4L <<
" " << E4L ;
669 <<
"P4L = " << P4L <<
" ;E4L= " << E4L <<
"\n probe KE = " << ev->
Probe()->
KinE() <<
"\n";
671 TParticlePDG * remn = 0;
678 <<
"NO Particle with [A = " <<
fRemnA <<
", Z = " << fRemnZ
679 <<
", pdgc = " << ipdgc <<
"] in PDGLibrary!";
683 MassRem = remn->Mass();
685 <<
"Particle with [A = " <<
fRemnA <<
", Z = " << fRemnZ
686 <<
", pdgc = " << ipdgc <<
"] in PDGLibrary!";
690 double MRemn = TMath::Sqrt(ERemn*ERemn - PRemn*PRemn);
691 LOG(
"HAIntranuke2015",
pINFO) <<
"PRemn = " << PRemn <<
" ;ERemn= " << ERemn;
692 LOG(
"HAIntranuke2015",
pINFO) <<
"MRemn= " << MRemn <<
" ;true Mass= " << MassRem <<
" ; excitation energy= " << (MRemn-MassRem)*1000. <<
" MeV";
699 exception.
SetReason(
"TwoBodyCollison gives KE> probe KE in hA simulation");
709 exception.
SetReason(
"TwoBodyCollison failed in hA simulation");
743 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 745 <<
"Inelastic() is invoked for a : " << p->
Name()
749 bool allow_dup =
true;
760 ev,p,&s1,&s2,&s3,
fRemnA,
fRemnZ,
fRemnP4,
fDoFermi,
fFermiFac,
fFermiMomentum,
fNuclmodel);
763 LOG (
"HAIntranuke2015",
pINFO) <<
" successful pion production fate";
778 LOG(
"HAIntranuke2015",
pNOTICE) <<
"Error: could not create pion production final state";
780 exception.
SetReason(
"PionProduction kinematics failed - retry kinematics");
798 LOG(
"HAIntranuke2015",
pNOTICE) <<
"stop propagation - could not create absorption final state: too few particles";
805 LOG(
"HAIntranuke2015",
pNOTICE) <<
"stop propagation - could not create absorption final state: Pi- or K- cannot be absorbed by only neutrons";
812 LOG(
"HAIntranuke2015",
pINFO) <<
"stop propagation - could not create absorption final state: Pi+ or K+ cannot be absorbed by only protons";
826 int t1code,t2code,scode,s2code;
832 double Prob_pipd_pp=2.*ppcnt*(1.-ppcnt);
833 double Prob_pipnn_pn=.083*(1.-ppcnt)*(1.-ppcnt);
834 if (rnd->
RndFsi().Rndm()*(Prob_pipd_pp+Prob_pipnn_pn)<Prob_pipd_pp){
842 double Prob_pimd_nn=2.*ppcnt*(1.-ppcnt);
843 double Prob_pimpp_pn=.083*ppcnt*ppcnt;
844 if (rnd->
RndFsi().Rndm()*(Prob_pimd_nn+Prob_pimpp_pn)<Prob_pimd_nn){
852 double Prob_pi0d_pn=0.88*ppcnt*(1.-ppcnt);
853 double Prob_pi0pp_pp=.14*ppcnt*ppcnt;
854 double Prob_pi0nn_nn=.14*(1.-ppcnt)*(1.-ppcnt);
855 if (rnd->
RndFsi().Rndm()*(Prob_pi0d_pn+Prob_pi0pp_pp+Prob_pi0nn_nn)<Prob_pi0d_pn){
858 else if (rnd->
RndFsi().Rndm()*(Prob_pi0d_pn+Prob_pi0pp_pp+Prob_pi0nn_nn)<(Prob_pi0d_pn+Prob_pi0pp_pp)){
865 LOG(
"HAIntranuke2015",
pINFO) <<
"choose 2 body absorption, probe, fs = " << pdgc <<
" "<< scode <<
" "<<s2code;
868 double M2_1 = pLib->
Find(t1code)->Mass();
869 double M2_2 = pLib->
Find(t2code)->Mass();
871 double M3 = pLib->
Find(scode) ->Mass();
872 double M4 = pLib->
Find(s2code)->Mass();
876 TVector3 tP2_1L, tP2_2L;
881 target.SetHitNucPdg(t1code);
884 E2_1L = TMath::Sqrt(tP2_1L.Mag2() + M2_1*M2_1);
886 target.SetHitNucPdg(t2code);
889 E2_2L = TMath::Sqrt(tP2_2L.Mag2() + M2_2*M2_2);
895 tP2_1L.SetXYZ(0.0, 0.0, 0.0);
898 tP2_2L.SetXYZ(0.0, 0.0, 0.0);
901 TLorentzVector dNucl_P4=TLorentzVector(tP2_1L+tP2_2L,E2_1L+E2_2L);
903 double E2L = E2_1L + E2_2L;
910 LOG(
"HAIntranuke2015",
pWARN) <<
"Inelastic() failed: IntBounce returned bad angle - try again";
912 exception.
SetReason(
"unphysical angle for hN scattering");
917 TLorentzVector t4P1L,t4P2L,t4P3L,t4P4L;
919 t4P2L=TLorentzVector(TVector3(tP2_1L+tP2_2L),E2L);
958 LOG(
"HAIntranuke2015",
pNOTICE) <<
"Inelastic in hA failed calling TwoBodyKineamtics";
960 exception.
SetReason(
"Pion absorption kinematics through TwoBodyKinematics failed");
984 nd0 = -135.227 * TMath::Exp(-7.124*
fRemnZ /
double(
fRemnA)) + 4.914;
986 Sig_nd = 2.034 +
fRemnA * 0.007846;
988 double c1 = 0.041 + ke * 0.0001525;
989 double c2 = -0.003444 - ke * 0.00002324;
992 double c3 = 0.064 - ke * 0.000015;
993 gam_ns = c1 * TMath::Exp(c2*
fRemnA) + c3;
994 if(gam_ns<0.002) gam_ns = 0.002;
996 LOG(
"HAIntranuke2015",
pINFO) <<
"nucleon absorption";
997 LOG(
"HAIntranuke2015",
pINFO) <<
"--> mean diff distr = " << nd0 <<
", stand dev = " << Sig_nd;
999 LOG(
"HAIntranuke2015",
pINFO) <<
"--> gam_ns = " << gam_ns;
1003 ns0 = .0001*(1.+ke/250.) * (
fRemnA-10)*(
fRemnA-10) + 3.5;
1004 nd0 = (1.+ke/250.) - ((
fRemnA/200.)*(1. + 2.*ke/250.));
1005 Sig_ns = (10. + 4. * ke/250.)*TMath::Power(
fRemnA/250.,0.9);
1006 Sig_nd = 4*(1 - TMath::Exp(-0.03*ke));
1007 LOG(
"HAIntranuke2015",
pINFO) <<
"pion absorption";
1008 LOG(
"HAIntranuke2015",
pINFO) <<
"--> mean diff distr = " << nd0 <<
", stand dev = " << Sig_nd;
1009 LOG(
"HAIntranuke2015",
pINFO) <<
"--> mean sum distr = " << ns0 <<
", Stand dev = " << Sig_ns;
1013 ns0 = (rnd->
RndFsi().Rndm()>0.5?3:2);
1017 LOG(
"HAIntranuke2015",
pINFO) <<
"kaon absorption - set ns, nd later";
1023 LOG(
"HAIntranuke2015",
pWARN) <<
"Inelastic() cannot handle absorption reaction for " << p->
Name();
1033 double u1 = 0, u2 = 0;
1039 LOG(
"HAIntranuke2015",
pNOTICE) <<
"Error: could not choose absorption final state";
1040 LOG(
"HAIntranuke2015",
pNOTICE) <<
"--> mean diff distr = " << nd0 <<
", stand dev = " << Sig_nd;
1041 LOG(
"HAIntranuke2015",
pNOTICE) <<
"--> mean sum distr = " << ns0 <<
", Stand dev = " << Sig_ns;
1042 LOG(
"HAIntranuke2015",
pNOTICE) <<
"--> gam_ns = " << gam_ns;
1045 exception.
SetReason(
"Absorption choice of # of p,n failed");
1054 u1 = rnd->
RndFsi().Rndm();
1055 u2 = rnd->
RndFsi().Rndm();
1056 if (u1==0) u1 = rnd->
RndFsi().Rndm();
1057 if (u2==0) u2 = rnd->
RndFsi().Rndm();
1060 double x2 = TMath::Sqrt(-2*TMath::Log(u1))*TMath::Sin(2*
kPi*u2);
1066 ns = -TMath::Log(rnd->
RndFsi().Rndm())/gam_ns;
1070 ns = (rnd->
RndFsi().Rndm()<0.5?2:3);
1081 double max = ns0 + Sig_ns * 10;
1084 bool not_found =
true;
1092 LOG(
"HAIntranuke2015",
pNOTICE) <<
"Error: stuck in random variable loop for ns";
1093 LOG(
"HAIntranuke2015",
pNOTICE) <<
"--> mean of sum parent distr = " << ns0 <<
", Stand dev = " << Sig_ns;
1097 exception.
SetReason(
"Random number generator for choice of #p,n final state failed - unusual - redo kinematics");
1102 u1 = rnd->
RndFsi().Rndm();
1103 u2 = rnd->
RndFsi().Rndm();
1104 if (u1==0) u1 = rnd->
RndFsi().Rndm();
1105 if (u2==0) u2 = rnd->
RndFsi().Rndm();
1106 x1 = TMath::Sqrt(-2*TMath::Log(u1))*TMath::Cos(2*
kPi*u2);
1108 ns = ns0 + Sig_ns * x1;
1109 if ( ns>max || ns<0 ) {iter2++;
continue;}
1110 else if ( rnd->
RndFsi().Rndm() > (ns/
max) ) {iter2++;
continue;}
1118 double nd = nd0 + Sig_nd * x2;
1123 np =
int((ns+nd)/2.+.5);
1124 nn =
int((ns-nd)/2.+.5);
1126 LOG(
"HAIntranuke2015",
pINFO) <<
"ns = "<<ns<<
", nd = "<<nd<<
", np = "<<np<<
", nn = "<<nn;
1132 if (np < 0 || nn < 0 ) {iter++;
continue;}
1133 else if (np + nn < 2. ) {iter++;
continue;}
1136 - ((pdgc==
kPdgPiM || pdgc==
kPdgKM)?1:0)) {iter++;
continue;}
1141 LOG(
"HAIntranuke2015",
pINFO) <<
"success, iter = " << iter <<
" np, nn = " << np <<
" " << nn;
1144 double frac = 85./double(np+nn);
1152 if (rnd->
RndFsi().Rndm()<np/(double)(np+nn)) np--;
1156 LOG(
"HAIntranuke2015",
pNOTICE) <<
"Final state chosen; # protons : " 1157 << np <<
", # neutrons : " << nn;
1185 PDGCodeList* listar[5] = {&list0, &list1, &list2, &list3, &list4};
1190 double probM = pLib->
Find(pdgc) ->Mass();
1191 TVector3 pP3 = p->
P4()->Vect() * (1./5.);
1192 double probKE = p->
P4()->E() -probM;
1193 double clusKE = probKE * (1./5.);
1194 TLorentzVector clusP4(pP3,clusKE);
1196 TLorentzVector X4(*p->
X4());
1211 for (
int i=0;
i<(np+nn);
i++)
1221 for (
int i=0;
i<5;
i++)
1223 LOG(
"HAIntranuke2015",
pINFO) <<
"List" <<
i <<
" size: " << listar[
i]->size();
1224 if (listar[
i]->size() <2)
1227 exception.
SetReason(
"too few particles for Phase Space decay - try again");
1267 if(success1 && success2 && success3 && success4 && success5)
1269 LOG(
"HAIntranuke2015",
pINFO)<<
"Successful many-body absorption - n>=18";
1271 TParticlePDG * remn = 0;
1272 double MassRem = 0.;
1278 <<
"NO Particle with [A = " <<
fRemnA <<
", Z = " << fRemnZ
1279 <<
", pdgc = " << ipdgc <<
"] in PDGLibrary!";
1283 MassRem = remn->Mass();
1285 <<
"Particle with [A = " <<
fRemnA <<
", Z = " << fRemnZ
1286 <<
", pdgc = " << ipdgc <<
"] in PDGLibrary!";
1290 double MRemn = TMath::Sqrt(ERemn*ERemn - PRemn*PRemn);
1291 LOG(
"HAIntranuke2015",
pINFO) <<
"PRemn = " << PRemn <<
" ;ERemn= " << ERemn;
1292 LOG(
"HAIntranuke2015",
pINFO) <<
"MRemn= " << MRemn <<
" ;true Mass= " << MassRem <<
" ; excitation energy= " << (MRemn-MassRem)*1000. <<
" MeV";
1298 LOG(
"HAIntranuke2015",
pWARN) <<
"PhaseSpace decay fails for HadrCluster- recovery likely incorrect - rethrow event";
1324 for (
int i=0;
i<np;
i++)
1330 for (
int i=0;
i<nn;
i++)
1366 <<
"Remnant nucleus (A,Z) = (" <<
fRemnA <<
", " <<
fRemnZ <<
")";
1367 LOG(
"HAIntranuke2015",
pINFO) <<
" list size: " << np+nn;
1371 exception.
SetReason(
"too few particles for Phase Space decay - try again");
1379 LOG (
"HAIntranuke2015",
pINFO) <<
"Successful many-body absorption, n<=18";
1380 LOG(
"HAIntranuke2015",
pDEBUG) <<
"Nucleus : (A,Z) = ("<<
fRemnA<<
','<<fRemnZ<<
')';
1381 TParticlePDG * remn = 0;
1382 double MassRem = 0.;
1388 <<
"NO Particle with [A = " <<
fRemnA <<
", Z = " << fRemnZ
1389 <<
", pdgc = " << ipdgc <<
"] in PDGLibrary!";
1393 MassRem = remn->Mass();
1395 <<
"Particle with [A = " <<
fRemnA <<
", Z = " << fRemnZ
1396 <<
", pdgc = " << ipdgc <<
"] in PDGLibrary!";
1400 double MRemn = TMath::Sqrt(ERemn*ERemn - PRemn*PRemn);
1401 LOG(
"HAIntranuke2015",
pINFO) <<
"PRemn = " << PRemn <<
" ;ERemn= " << ERemn;
1402 LOG(
"HAIntranuke2015",
pINFO) <<
"MRemn= " << MRemn <<
" ;true Mass= " << MassRem <<
" ; excitation energy= " << (MRemn-MassRem)*1000. <<
" MeV";
1411 if ( pdgc==
kPdgPiM ) fRemnZ++;
1414 exception.
SetReason(
"Phase space generation of absorption final state failed");
1471 LOG(
"HAIntranuke2015",
pINFO) <<
"R0 = " <<
fR0 <<
" fermi";
1482 LOG(
"HAIntranuke2015",
pINFO) <<
"DoFermi? = " << ((
fDoFermi)?(
true):(
false));
enum genie::EINukeFateHA_t INukeFateHA_t
void InelasticHA(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
static string AsString(INukeMode_t mode)
RgDbl GetDoubleDef(RgKey key, RgDbl def_opt, bool set_def=true)
An exception thrown by SimulateHadronState for kinematics problems. TwoBodyCollision/Kinematics used ...
void SetFirstMother(int m)
virtual GHepParticle * Particle(int position) const
INukeFateHA_t HadronFateHA(const GHepParticle *p) const
TRandom3 & RndFsi(void) const
rnd number generator used by intranuclear cascade monte carlos
void SimulateHadronicFinalStateKinematics(GHepRecord *ev, GHepParticle *p) const
void ElasHA(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
#include "Numerical/GSFunc.h"
bool fUseOset
Oset model for low energy pion in hN.
static INukeHadroData2015 * Instance(void)
double fR0
effective nuclear size param
double IntBounce(const GHepParticle *p, int target, int s1, INukeFateHN_t fate)
int HandleCompoundNucleus(GHepRecord *ev, GHepParticle *p, int mom) const
static RandomGen * Instance()
Access instance.
double fNucRmvE
binding energy to subtract from cascade nucleons
enum genie::EGHepStatus GHepStatus_t
A singleton class holding all configuration registries built while parsing all loaded XML configurati...
bool fXsecNNCorr
use nuclear medium correction for NN cross section
bool TwoBodyKinematics(double M3, double M4, TLorentzVector tP1L, TLorentzVector tP2L, TLorentzVector &tP3L, TLorentzVector &tP4L, double C3CM, TLorentzVector &RemnP4, double bindE=0)
double fFreeStep
produced particle free stem, in fm
void SimulateHadronicFinalState(GHepRecord *ev, GHepParticle *p) const
Pure abstract base class. Defines the NuclearModelI interface to be implemented by any physics model ...
double Mass(Resonance_t res)
resonance mass (GeV)
double fEPreEq
threshold for pre-equilibrium reaction
void SetMomentum(const TLorentzVector &p4)
double FracAIndep(int hpdgc, INukeFateHA_t fate, double ke) const
double Mass(void) const
Mass that corresponds to the PDG code.
RgDbl GetDouble(RgKey key) const
void Inelastic(GHepRecord *ev, GHepParticle *p, INukeFateHA_t fate) const
double fFermiMomentum
whether or not particle collision is pauli blocked
A singleton holding random number generator classes. All random number generation in GENIE should tak...
double Pz(void) const
Get Pz.
void ProcessEventRecord(GHepRecord *event_rec) const
bool PhaseSpaceDecay(GHepRecord *ev, GHepParticle *p, const PDGCodeList &pdgv, TLorentzVector &RemnP4, double NucRmvE, EINukeMode mode=kIMdHA)
general phase space decay method
double fNR
param multiplying the nuclear radius, determining how far to track hadrons beyond the "nuclear bounda...
double Px(void) const
Get Px.
virtual GHepParticle * Probe(void) const
int LastMother(void) const
int FirstMother(void) const
string Name(void) const
Name that corresponds to the PDG code.
void PreEquilibrium(GHepRecord *ev, GHepParticle *p, int &RemnA, int &RemnZ, TLorentzVector &RemnP4, bool DoFermi, double FermiFac, const NuclearModelI *Nuclmodel, double NucRmvE, EINukeMode mode=kIMdHN)
INukeHadroData2015 * fHadroData2015
a collection of h+N,h+A data & calculations
const int kPdgCompNuclCluster
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
bool fDoCompoundNucleus
whether or not to do compound nucleus considerations
double PiBounce(void) const
const NuclearModelI * fNuclmodel
nuclear model used to generate fermi momentum
void SetReason(string reason)
bool fDoFermi
whether or not to do fermi mom.
AlgFactory * fAlgf
algorithm factory instance
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
const Algorithm * GetAlgorithm(const AlgId &algid)
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)
double fFermiFac
testing parameter to modify fermi momentum
virtual GHepParticle * TargetNucleus(void) const
unsigned int fNumIterations
Misc GENIE control constants.
enum genie::EINukeFateHN_t INukeFateHN_t
Registry * GlobalParameterList(void) const
double KinE(bool mass_from_pdg=false) const
Get kinetic energy.
static PDGLibrary * Instance(void)
static AlgFactory * Instance()
void SetLastMother(int m)
Singleton class to load & serve a TDatabasePDG.
TLorentzVector * X4(void) const
void SetStatus(GHepStatus_t s)
virtual TVector3 Momentum3(void) const
static string AsString(INukeFateHN_t fate)
A registry. Provides the container for algorithm configuration parameters.
virtual void ProcessEventRecord(GHepRecord *event_rec) const
int nuclA
value of A for the target nucleus in hA mode
bool IsNeutronOrProton(int pdgc)
TParticlePDG * Find(int pdgc)
RgBool GetBool(RgKey key) const
int IonPdgCode(int A, int Z)
bool fAltOset
NuWro's table-based implementation (not recommended)
int fRemnZ
remnant nucleus Z
TLorentzVector fRemnP4
P4 of remnant system.
virtual bool GenerateNucleon(const Target &) const =0
Registry * fConfig
config. (either owned or pointing to config pool)
virtual void AddParticle(const GHepParticle &p)
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.
static const unsigned int kRjMaxIterations
TLorentzVector * P4(void) const
double PnBounce(void) const
double fDelRNucleon
factor by which Nucleon Compton wavelength gets multiplied to become nuclear size enhancement ...
int fRemnA
remnant nucleus A
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.
RgBool GetBoolDef(RgKey key, RgBool def_opt, bool set_def=true)
double fHadStep
step size for intranuclear hadron transport
double FracADep(int hpdgc, INukeFateHA_t fate, double ke, int targA) const
Root of GENIE utility namespaces.
cet::coded_exception< error, detail::translate > exception
double fNucAbsFac
absorption xsec correction factor (hN Mode)
void push_back(int pdg_code)
static AlgConfigPool * Instance()
double fDelRPion
factor by which Pion Compton wavelength gets multiplied to become nuclear size enhancement ...
double fNucCEXFac
charge exchange xsec correction factor (hN Mode)
double Py(void) const
Get Py.