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;
870 target.SetHitNucPdg(t1code);
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");
double fFermiMomentum
whether or not particle collision is pauli blocked
An exception thrown by SimulateHadronState for kinematics problems. TwoBodyCollision/Kinematics used ...
void SetFirstMother(int m)
TRandom3 & RndFsi(void) const
rnd number generator used by intranuclear cascade monte carlos
INukeHadroData * fHadroData
a collection of h+N,h+A data & calculations
TLorentzVector fRemnP4
P4 of remnant system.
static RandomGen * Instance()
Access instance.
const TLorentzVector * P4(void) const
void SetMomentum(const TLorentzVector &p4)
static constexpr double MeV
A singleton holding random number generator classes. All random number generation in GENIE should tak...
const TVector3 & Momentum3(void) const
int LastMother(void) const
int FirstMother(void) const
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
string Name(void) const
Name that corresponds to the PDG code.
const int kPdgCompNuclCluster
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
enum genie::EINukeFateHN_t INukeFateHN_t
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)
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
bool TwoBodyKinematics(double M3, double M4, TLorentzVector tP1L, TLorentzVector tP2L, TLorentzVector &tP3L, TLorentzVector &tP4L, double C3CM, TLorentzVector &RemnP4, double bindE=0)
virtual GHepParticle * TargetNucleus(void) const
int fRemnA
remnant nucleus A
static int max(int a, int b)
double fNucRmvE
binding energy to subtract from cascade nucleons
double IntBounce(const GHepParticle *p, int target, int s1, INukeFateHN_t fate)
double KinE(bool mass_from_pdg=false) const
Get kinetic energy.
static PDGLibrary * Instance(void)
void SetLastMother(int m)
Singleton class to load & serve a TDatabasePDG.
const TLorentzVector * X4(void) const
void SetStatus(GHepStatus_t s)
static string AsString(INukeFateHN_t fate)
bool IsNeutronOrProton(int pdgc)
int fRemnZ
remnant nucleus Z
bool fDoFermi
whether or not to do fermi mom.
virtual bool GenerateNucleon(const Target &) const =0
virtual void AddParticle(const GHepParticle &p)
double fFermiFac
testing parameter to modify fermi momentum
TParticlePDG * Find(int pdgc, bool must_exist=true)
STDHEP-like event record entry that can fit a particle or a nucleus.
cet::coded_exception< error, detail::translate > exception
const NuclearModelI * fNuclmodel
nuclear model used to generate fermi momentum
void push_back(int pdg_code)
enum genie::EGHepStatus GHepStatus_t