30 #include <TLorentzVector.h>
31 #include <TClonesArray.h>
58 using namespace genie;
59 using namespace genie::constants;
60 using namespace genie::controls;
61 using namespace genie::utils::print;
97 TClonesArray * particle_list = this->
Hadronize(interaction);
99 if(! particle_list ) {
100 LOG(
"AGKYLowW2019",
pWARN) <<
"Got an empty particle list. Hadronizer failed!";
101 LOG(
"AGKYLowW2019",
pWARN) <<
"Quitting the current event generation thread";
106 exception.
SetReason(
"Could not simulate the hadronic system");
113 int mom =
event->FinalStateHadronicSystemPosition();
123 const TLorentzVector * had_syst =
event -> Particle(mom) -> P4() ;
124 TVector3 beta = TVector3(0,0,had_syst->P()/had_syst->E());
125 TVector3 unitvq = had_syst->Vect().Unit();
128 const TLorentzVector & vtx = *(neutrino->
X4());
131 TIter particle_iter(particle_list);
132 while ((particle = (
GHepParticle *) particle_iter.Next())) {
134 int pdgc = particle -> Pdg() ;
137 particle -> P4() -> Boost (beta);
138 particle -> P4() -> RotateUz(unitvq);
150 particle -> SetStatus( ist ) ;
152 int im = mom + 1 + particle -> FirstMother() ;
156 particle -> SetFirstMother( im ) ;
158 particle -> SetPosition( vtx ) ;
160 event->AddParticle(*particle);
163 delete particle_list ;
177 LOG(
"KNOHad",
pWARN) <<
"Returning a null particle list!";
183 LOG(
"KNOHad",
pINFO) <<
"W = " << W <<
" GeV";
190 <<
"Failed selecting particles for " << *interaction;
208 TClonesArray * particle_list = 0;
212 if(use_isotropic_decay) {
215 particle_list = this->
DecayMethod2(W,*pdgcv,reweight_decays);
218 particle_list = this->
DecayMethod1(W,*pdgcv,reweight_decays);
223 <<
"Failed decaying a hadronic system @ W=" << W
224 <<
"with multiplicity=" << pdgcv->size();
235 particle_list->SetOwner(
true);
239 return particle_list;
246 LOG(
"KNOHad",
pWARN) <<
"Returning a null particle list!";
250 unsigned int min_mult = 2;
251 unsigned int mult = 0;
259 LOG(
"KNOHad",
pINFO) <<
"Hadron Shower Charge = " << maxQ;
262 LOG(
"KNOHad",
pDEBUG) <<
"Building Multiplicity Probability distribution";
264 Option_t * opt =
"+LowMultSuppr+Renormalize";
268 LOG(
"KNOHad",
pWARN) <<
"Null multiplicity probability distribution!";
271 if(mprob->Integral(
"width")<=0) {
272 LOG(
"KNOHad",
pWARN) <<
"Empty multiplicity probability distribution!";
279 bool allowed_state=
false;
280 unsigned int itry = 0;
282 while(!allowed_state)
289 <<
"Couldn't select hadronic shower particles after: "
290 << itry <<
" attempts!";
296 mult = TMath::Nint( mprob->GetRandom() );
298 LOG(
"KNOHad",
pINFO) <<
"Hadron multiplicity = " << mult;
302 if(mult < (
unsigned int) TMath::Abs(maxQ)) {
304 <<
"Multiplicity not enough to generate hadronic charge! Retrying.";
305 allowed_state =
false;
312 if(mult < min_mult) {
315 <<
"Low generated multiplicity: " << mult
316 <<
". Forcing to minimum accepted multiplicity: " << min_mult;
320 <<
"Generated multiplicity: " << mult <<
" is too low! Quitting";
330 <<
"Generated multiplicity (@ W = " << W <<
"): " << pdgcv->size();
334 mult = pdgcv->size();
338 vector<int>::const_iterator pdg_iter;
339 for(pdg_iter = pdgcv->begin(); pdg_iter != pdgcv->end(); ++pdg_iter) {
340 int pdgc = *pdg_iter;
344 LOG(
"KNOHad",
pDEBUG) <<
"- PDGC=" << pdgc <<
", m=" << m <<
" GeV";
346 bool permitted = (W > msum);
349 LOG(
"KNOHad",
pWARN) <<
"*** Decay forbidden by kinematics! ***";
350 LOG(
"KNOHad",
pWARN) <<
"sum{mass} = " << msum <<
", W = " <<
W;
351 LOG(
"KNOHad",
pWARN) <<
"Discarding hadronic system & re-trying!";
353 allowed_state =
false;
357 allowed_state =
true;
360 <<
"Found an allowed hadronic state @ W=" << W
361 <<
" multiplicity=" << mult;
371 const Interaction * interaction, Option_t * opt)
const
387 <<
"Returning a null multiplicity probability distribution!";
400 double avn = 1.5*avnch;
403 <<
"Average hadronic multiplicity (W=" << W <<
") = " << avn;
406 double maxmult = this->
MaxMult(interaction);
415 if(maxmult>18) maxmult=18;
417 SLOG(
"KNOHad",
pDEBUG) <<
"Computed maximum multiplicity = " << maxmult;
420 LOG(
"KNOHad",
pWARN) <<
"Low maximum multiplicity! Quiting.";
431 int nbins = mult_prob->FindBin(maxmult);
433 for(
int i = 1; i <= nbins; i++) {
435 double n = mult_prob->GetBinCenter(i);
437 double avnP = this->
KNO(nu_pdg,nuc_pdg,z);
438 double P = avnP / avn;
441 <<
"n = " << n <<
" (n/<n> = " << z
442 <<
", <n>*P = " << avnP <<
") => P = " << P;
444 mult_prob->Fill(n,P);
447 SLOG(
"KNOHad",
pDEBUG) <<
"Fixing multiplicity to 2";
448 mult_prob->Fill(2,1.);
451 double integral = mult_prob->Integral(
"width");
454 mult_prob->Scale(1.0/integral);
456 SLOG(
"KNOHad",
pWARN) <<
"probability distribution integral = 0";
462 bool apply_neugen_Rijk = option.find(
"+LowMultSuppr") != string::npos;
463 bool renormalize = option.find(
"+Renormalize") != string::npos;
466 if(apply_neugen_Rijk) {
467 SLOG(
"KNOHad",
pINFO) <<
"Applying NeuGEN scaling factors";
470 this->
ApplyRijk(interaction, renormalize, mult_prob);
473 <<
"W = " << W <<
" < Wcut = " <<
fWcut
474 <<
" - Will not apply scaling factors";
551 double diff = TMath::Abs(1.-fsum);
553 LOG(
"KNOHad",
pWARN) <<
"KNO Probabilities do not sum to unity! Renormalizing..." ;
569 "0.083*exp(-0.5*pow(x+0.385,2.)/0.131)",-1,0.5);
571 "exp(-0.214-6.625*x)",0,0.6);
654 if ( is_p && (is_nu || is_l ) ) c=
fCvp;
655 else if ( is_n && (is_nu || is_l ) ) c=
fCvn;
656 else if ( is_p && (is_nubar || is_lbar) ) c=
fCvbp;
657 else if ( is_n && (is_nubar || is_lbar) ) c=
fCvbn;
659 else if ( is_p && is_dm ) c=
fCvp;
660 else if ( is_n && is_dm ) c=
fCvn;
663 <<
"Invalid initial state (probe = " << probe_pdg <<
", "
664 <<
"hit nucleon = " << nuc_pdg <<
")";
669 double kno = 2*TMath::Exp(-c)*TMath::Power(c,x)/TMath::Gamma(x);
675 int probe_pdg,
int nuc_pdg,
double W)
const
690 if ( is_p && (is_nu || is_l ) ) { a=
fAvp;
b=
fBvp; }
691 else if ( is_n && (is_nu || is_l ) ) { a=
fAvn;
b=
fBvn; }
692 else if ( is_p && (is_nubar || is_lbar) ) { a=
fAvbp;
b=
fBvbp; }
693 else if ( is_n && (is_nubar || is_lbar) ) { a=
fAvbn;
b=
fBvbn; }
695 else if ( is_p && is_dm ) { a=
fAvp;
b=
fBvp; }
696 else if ( is_n && is_dm ) { a=
fAvn;
b=
fBvn; }
699 <<
"Invalid initial state (probe = " << probe_pdg <<
", "
700 <<
"hit nucleon = " << nuc_pdg <<
")";
704 double av_nch = a +
b * 2*TMath::Log(W);
716 int hadronShowerCharge = 0;
735 hadronShowerCharge = (int) ( qp + qnuc - ql );
737 return hadronShowerCharge;
741 double W,
const PDGCodeList & pdgv,
bool reweight_decays)
const
746 LOG(
"KNOHad",
pINFO) <<
"** Using Hadronic System Decay method 1";
748 TLorentzVector p4had(0,0,0,W);
749 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.size());
752 bool ok = this->
PhaseSpaceDecay(*plist, p4had, pdgv, 0, reweight_decays);
764 double W,
const PDGCodeList & pdgv,
bool reweight_decays)
const
770 LOG(
"KNOHad",
pINFO) <<
"** Using Hadronic System Decay method 2";
778 int baryon = pdgv[0];
780 double MN2 = TMath::Power(MN, 2);
786 bool allowdup =
true;
788 for(
unsigned int i=1; i<pdgv.size(); i++) pdgv_strip[i-1] = pdgv[i];
792 vector<int>::const_iterator pdg_iter = pdgv_strip.begin();
793 for( ; pdg_iter != pdgv_strip.end(); ++pdg_iter) {
794 int pdgc = *pdg_iter;
799 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.size());
802 TLorentzVector p4had(0,0,0,W);
803 TLorentzVector p4N (0,0,0,0);
808 bool got_baryon_4p =
false;
809 bool got_hadsyst_4p =
false;
811 while(!got_hadsyst_4p) {
813 LOG(
"KNOHad",
pINFO) <<
"Generating p4 for baryon with pdg = " << baryon;
815 while(!got_baryon_4p) {
822 double pt = TMath::Sqrt(pt2);
823 double phi = (2*
kPi) * rnd->RndHadro().Rndm();
824 double px = pt * TMath::Cos(phi);
825 double py = pt * TMath::Sin(phi);
827 double p2 = TMath::Power(pz,2) + pt2;
828 double E = TMath::Sqrt(p2+MN2);
830 p4N.SetPxPyPzE(px,py,pz,E);
832 LOG(
"KNOHad",
pDEBUG) <<
"Trying nucleon xF= "<< xf<<
", pT2= "<< pt2;
836 double Mav = p4d.Mag();
838 got_baryon_4p = (Mav > mass_sum);
848 p4N.Px(),p4N.Py(),p4N.Pz(),p4N.Energy(), 0,0,0,0
853 <<
"Generating p4 for the remaining hadronic system";
855 <<
"Remaining system: Available mass = " << p4d.Mag()
856 <<
", Particle masses = " << mass_sum;
859 *plist, p4d, pdgv_strip, 1, reweight_decays);
861 got_hadsyst_4p = is_ok;
863 if(!got_hadsyst_4p) {
864 got_baryon_4p =
false;
871 LOG(
"KNOHad",
pERROR) <<
"*** Decay forbidden by kinematics! ***";
885 LOG(
"KNOHad",
pINFO) <<
"Generating two particles back-to-back";
887 assert(pdgv.size()==2);
892 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.size());
898 TLorentzVector p4(0,0,0,W);
901 bool accepted =
false;
910 LOG(
"KNOHad",
pERROR) <<
"*** Decay forbidden by kinematics! ***";
922 double px = baryon->
Px();
923 double py = baryon->
Py();
924 double pz = baryon->
Pz();
926 double pT2 = px*px + py*py;
928 double xF = pL/(W/2);
930 double pT2rnd = pT2o * rnd->RndHadro().Rndm();
931 double xFrnd = xFo * rnd->RndHadro().Rndm();
936 LOG(
"KNOHad",
pINFO) <<
"baryon xF = " << xF <<
", pT2 = " << pT2;
938 accepted = (xFrnd < xFpdf && pT2rnd < pT2pdf);
940 LOG(
"KNOHad",
pINFO) << ((accepted) ?
"Decay accepted":
"Decay rejected");
946 TClonesArray & plist, TLorentzVector & pd,
947 const PDGCodeList & pdgv,
int offset,
bool reweight)
const
953 LOG(
"KNOHad",
pINFO) <<
"*** Performing a Phase Space Decay";
954 LOG(
"KNOHad",
pINFO) <<
"pT reweighting is " << (reweight ?
"on" :
"off");
956 assert ( offset >= 0);
957 assert ( pdgv.size() > 1);
961 vector<int>::const_iterator pdg_iter;
963 double * mass =
new double[pdgv.size()];
965 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
966 int pdgc = *pdg_iter;
973 <<
"Decaying N = " << pdgv.size() <<
" particles / total mass = " << sum;
981 <<
" *** Phase space decay is not permitted \n"
982 <<
" Total particle mass = " << sum <<
"\n"
993 for(
int idec=0; idec<200; idec++) {
996 wmax = TMath::Max(wmax,w);
1001 <<
"Max phase space gen. weight @ current hadronic system: " << wmax;
1012 fWeight *= TMath::Max(w/wmax, 1.);
1018 bool accept_decay=
false;
1019 unsigned int itry=0;
1021 while(!accept_decay)
1028 <<
"Couldn't generate an unweighted phase space decay after "
1029 << itry <<
" attempts";
1038 <<
"Decay weight = " << w <<
" > max decay weight = " << wmax;
1040 double gw = wmax * rnd->
RndHadro().Rndm();
1041 accept_decay = (gw<=w);
1044 <<
"Decay weight = " << w <<
" / R = " << gw
1045 <<
" - accepted: " << accept_decay;
1047 bool return_after_not_accepted_decay =
false;
1048 if(return_after_not_accepted_decay && !accept_decay) {
1050 <<
"Was instructed to return after a not-accepted decay";
1060 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
1063 int pdgc = *pdg_iter;
1102 for(
unsigned int i = 0; i < pdgcv.size(); i++) {
1108 double pt2 = TMath::Power(p4->Px(),2) + TMath::Power(p4->Py(),2);
1109 double wi = TMath::Exp(-
fPhSpRwA*TMath::Sqrt(pt2));
1118 int multiplicity,
int maxQ,
double W)
const
1130 int hadrons_to_add = multiplicity;
1139 bool baryon_is_strange = (baryon_code ==
kPdgSigmaP ||
1142 bool baryon_chg_is_pos = (baryon_code ==
kPdgProton ||
1144 bool baryon_chg_is_neg = (baryon_code ==
kPdgSigmaM);
1147 if(baryon_chg_is_pos) maxQ -= 1;
1148 if(baryon_chg_is_neg) maxQ += 1;
1150 W -= pdg->
Find( (*pdgc)[0] )->Mass();
1157 if(baryon_is_strange) {
1159 <<
" Remnant baryon is strange. Conserving strangeness...";
1162 if(multiplicity == 2) {
1164 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1172 else if(maxQ == 0) {
1173 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1183 else if(multiplicity == 3 && maxQ == 2) {
1184 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1192 else if(multiplicity == 3 && maxQ == -1) {
1193 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1205 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1214 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1229 LOG(
"KNOHad",
pDEBUG) <<
"Need more negative charge -> Adding a pi-";
1238 }
else if (maxQ > 0) {
1240 LOG(
"KNOHad",
pDEBUG) <<
"Need more positive charge -> Adding a pi+";
1255 <<
"Hadronic charge balanced. Now adding only neutrals or +- pairs";
1261 double M2pi0 = 2 * pdg -> Find (
kPdgPi0) ->
Mass();
1264 double M2Kc = pdg -> Find (
kPdgKP ) ->
Mass() +
1266 double M2K0 = 2 * pdg -> Find (
kPdgK0 ) ->
Mass();
1267 double M2Eta = 2 * pdg -> Find (
kPdgEta) ->
Mass();
1268 double Mpi0eta = pdg -> Find (
kPdgPi0) ->
Mass() +
1275 if( hadrons_to_add > 0 && hadrons_to_add % 2 == 1 ) {
1278 <<
"Odd number of hadrons left to add -> Adding a pi0";
1287 assert( hadrons_to_add % 2 == 0 );
1289 <<
" hadrons_to_add = "<<hadrons_to_add<<
" W= "<<W<<
" M2pi0 = "<<M2pi0<<
" M2pic = "<<M2pic<<
" M2Kc = "<<M2Kc<<
" M2K0= "<<M2K0<<
" M2Eta= "<<M2Eta;
1291 while(hadrons_to_add > 0 && W >= M2pi0) {
1294 LOG(
"KNOHad",
pDEBUG) <<
"rndm = " << x;
1296 if (x >= 0 && x <
fPpi0) {
1297 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a pi0pi0 pair";
1300 hadrons_to_add -= 2;
1307 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a pi+pi- pair";
1310 hadrons_to_add -= 2;
1314 <<
"Not enough mass for a pi+pi-: trying something else";
1321 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+K- pair";
1324 hadrons_to_add -= 2;
1328 <<
"Not enough mass for a K+K-: trying something else";
1335 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0 K0bar pair";
1338 hadrons_to_add -= 2;
1342 <<
"Not enough mass for a K0 K0bar: trying something else";
1348 if( W >= Mpi0eta ) {
1349 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a Pi0-Eta pair";
1352 hadrons_to_add -= 2;
1356 <<
"Not enough mass for a Pi0-Eta pair: trying something else";
1363 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a eta-eta pair";
1366 hadrons_to_add -= 2;
1370 <<
"Not enough mass for a Eta-Eta pair: trying something else";
1375 <<
"Hadron Assignment Probabilities do not add up to 1!!";
1383 if(W < M2pi0) hadrons_to_add = 0;
1392 int multiplicity,
int maxQ,
double W)
const
1408 Pstr = TMath::Min(1.,Pstr);
1409 Pstr = TMath::Max(0.,Pstr);
1421 if(multiplicity == 2) {
1430 if(multiplicity == 2) {
1439 if(multiplicity != 2) {
1447 if(pdgc ==
kPdgProton && y < Pstr && maxQ > 0) {
1450 else if(pdgc ==
kPdgProton && y < Pstr && maxQ <= 0) {
1453 else if(pdgc ==
kPdgNeutron && y < Pstr && maxQ > 0) {
1456 else if(pdgc ==
kPdgNeutron && y < Pstr && maxQ <= 0) {
1461 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a proton";
1463 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a neutron";
1465 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a sigma+";
1467 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a lambda";
1469 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a sigma-";
1547 LOG(
"KNOHad",
pWARN) <<
"Can't hadronize charm events";
1551 if(W < this->
Wmin()) {
1552 LOG(
"KNOHad",
pWARN) <<
"Low invariant mass, W = " << W <<
" GeV!!";
1560 double W = interaction->
Kine().
W();
1569 int nbins = TMath::Nint(maxmult-minmult+1);
1571 TH1D * mult_prob =
new TH1D(
"mult_prob",
1572 "hadronic multiplicity distribution", nbins, minmult-0.5, maxmult+0.5);
1573 mult_prob->SetDirectory(0);
1579 bool norm, TH1D * mp )
const
1586 int probe_pdg = init_state.
ProbePdg();
1592 bool is_EM = proc_info.
IsEM();
1600 double R2=1., R3=1.;
1604 if(is_CC || is_NC || is_dm) {
1610 if((is_nu && is_p) || (is_dmi && is_p)) {
1614 if((is_nu && is_n) || (is_dmi && is_n)) {
1618 if(is_nubar && is_p) {
1622 if(is_nubar && is_n) {
1627 <<
"Invalid initial state: " << init_state;
1646 if(is_lbar && is_p) {
1650 if(is_lbar && is_n) {
1655 <<
"Invalid initial state: " << init_state;
1663 int nbins = mp->GetNbinsX();
1664 for(
int i = 1; i <= nbins; i++) {
1665 int n = TMath::Nint( mp->GetBinCenter(i) );
1669 else if (n==3) R=R3;
1672 double P = mp->GetBinContent(i);
1675 <<
"n=" << n <<
"/ Scaling factor R = "
1676 << R <<
"/ P " << P <<
" --> " << Psc;
1677 mp->SetBinContent(i, Psc);
1684 double histo_norm = mp->Integral(
"width");
1685 if(histo_norm>0) mp->Scale(1.0/histo_norm);
void ApplyRijk(const Interaction *i, bool norm, TH1D *mp) const
double fRvnEMm3
Rijk: vn, EM, multiplicity = 3.
double W(bool selected=false) const
bool IsWeakCC(void) const
double KNO(int nu, int nuc, double z) const
TH1D * MultiplicityProb(const Interaction *, Option_t *opt="") const
double Weight(void) const
bool IsNeutrino(int pdgc)
double fWeight
weight for generated event
static const double kNucleonMass
static RandomGen * Instance()
Access instance.
int HitNucPdg(void) const
double fPpi0eta
{Pi0 eta} production probability
Defines the EventRecordVisitorI interface. Concrete implementations of this interface use the 'Visito...
double fRvbpCCm3
Rijk: vbp, CC, multiplicity = 3.
TF1 * fBaryonXFpdf
baryon xF PDF
double fRvbnEMm2
Rijk: vbn, EM, multiplicity = 2.
PDGCodeList * SelectParticles(const Interaction *) const
double fRvnCCm2
Rijk: vn, CC, multiplicity = 2.
double fRvpCCm2
Rijk: vp, CC, multiplicity = 2.
bool IsNucleus(void) const
double fRvbpNCm2
Rijk: vbp, NC, multiplicity = 2.
string P4AsString(const TLorentzVector *p)
static const unsigned int kMaxUnweightDecayIterations
int GenerateBaryonPdgCode(int mult, int maxQ, double W) const
bool IsDarkMatter(int pdgc)
double fPeta
{eta eta} production probability
bool IsChargedLepton(int pdgc)
TParticlePDG * Probe(void) const
virtual double Weight(void) const
double Mass(Resonance_t res)
resonance mass (GeV)
TClonesArray * DecayMethod1(double W, const PDGCodeList &pdgv, bool reweight_decays) const
TGenPhaseSpace fPhaseSpaceGenerator
a phase space generator
TClonesArray * DecayBackToBack(double W, const PDGCodeList &pdgv) const
double fRvpNCm2
Rijk: vp, NC, multiplicity = 2.
double fCvbp
Levy function parameter for vbp.
double fRvbnCCm3
Rijk: vbn, CC, multiplicity = 3.
double fPhSpRwA
parameter for phase space decay reweighting
A singleton holding random number generator classes. All random number generation in GENIE should tak...
double Pz(void) const
Get Pz.
bool fForceMinMult
force minimum multiplicity if (at low W) generated less?
void HandleDecays(TClonesArray *particle_list) const
bool fReWeightDecays
Reweight phase space decays?
double Px(void) const
Get Px.
static constexpr double b
double fRvnNCm3
Rijk: vn, NC, multiplicity = 3.
bool IsCharmEvent(void) const
double W(const Interaction *const i)
bool fGenerateWeighted
generate weighted events?
double fPK0
{K0 K0bar} production probability
virtual void Configure(const Registry &config)
double fRvbpNCm3
Rijk: vbp, NC, multiplicity = 3.
bool IsPosChargedLepton(int pdgc)
Summary information for an interaction.
double fRvbpEMm2
Rijk: vbp, EM, multiplicity = 2.
An exception thrown by EventRecordVisitorI when the normal processing sequence has to be disrupted (f...
TF1 * fBaryonPT2pdf
baryon pT^2 PDF
bool IsWeakNC(void) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
double fRvbpCCm2
Rijk: vbp, CC, multiplicity = 2.
double fRvbpEMm3
Rijk: vbp, EM, multiplicity = 3.
double fCvbn
Levy function parameter for vbn.
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
double fRvpCCm3
Rijk: vp, CC, multiplicity = 3.
bool IsAntiNeutrino(int pdgc)
double fRvbnCCm2
Rijk: vbn, CC, multiplicity = 2.
PDGCodeList * GenerateHadronCodes(int mult, int maxQ, double W) const
const Kinematics & Kine(void) const
virtual void Configure(const Registry &config)
static const double kNeutronMass
TH1D * CreateMultProbHist(double maxmult) const
double fBhyperon
see above
double MaxMult(const Interaction *i) const
double fRvpNCm3
Rijk: vp, NC, multiplicity = 3.
double AverageChMult(int nu, int nuc, double W) const
double fAhyperon
parameter controlling strange baryon production probability via associated production (P=a+b*lnW^2) ...
int HadronShowerCharge(const Interaction *) const
double fRvnNCm2
Rijk: vn, NC, multiplicity = 2.
double fRvpEMm3
Rijk: vp, EM, multiplicity = 3.
bool fUseBaryonXfPt2Param
Generate baryon xF,pT2 from experimental parameterization?
double fWcut
Rijk applied for W<Wcut (see DIS/RES join scheme)
double fRvbnEMm3
Rijk: vbn, EM, multiplicity = 3.
double fRvbnNCm2
Rijk: vbn, NC, multiplicity = 2.
double fRvnEMm2
Rijk: vn, EM, multiplicity = 2.
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
TClonesArray * DecayMethod2(double W, const PDGCodeList &pdgv, bool reweight_decays) const
bool IsNeutralLepton(int pdgc)
double fRvpEMm2
Rijk: vp, EM, multiplicity = 2.
double fAvn
offset in average charged hadron multiplicity = f(W) relation for vn
TRandom3 & RndHadro(void) const
rnd number generator used by hadronization models
void SwitchOnFastForward(void)
static PDGLibrary * Instance(void)
void SetReason(string reason)
static const double kPionMass
double fRvbnNCm3
Rijk: vbn, NC, multiplicity = 3.
Singleton class to load & serve a TDatabasePDG.
const TLorentzVector * X4(void) const
bool IsDarkMatter(void) const
bool PhaseSpaceDecay(TClonesArray &pl, TLorentzVector &pd, const PDGCodeList &pdgv, int offset=0, bool reweight=false) const
A registry. Provides the container for algorithm configuration parameters.
const XclsTag & ExclTag(void) const
double fAvbp
offset in average charged hadron multiplicity = f(W) relation for vbp
double fPpi0
{pi0 pi0 } production probability
bool IsNeutronOrProton(int pdgc)
double ReWeightPt2(const PDGCodeList &pdgcv) const
void Initialize(void) const
const InitialState & InitState(void) const
double fCvp
Levy function parameter for vp.
bool fUseIsotropic2BDecays
force isotropic, non-reweighted 2-body decays for consistency with neugen/daikon
double fBvp
slope in average charged hadron multiplicity = f(W) relation for vp
const ProcessInfo & ProcInfo(void) const
bool AssertValidity(const Interaction *i) const
static const unsigned int kMaxKNOHadSystIterations
TParticlePDG * Find(int pdgc, bool must_exist=true)
double fBvbp
slope in average charged hadron multiplicity = f(W) relation for vbp
bool GetParamDef(const RgKey &name, T &p, const T &def) const
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
const Target & Tgt(void) const
double fBvbn
slope in average charged hadron multiplicity = f(W) relation for vbn
TClonesArray * Hadronize(const Interaction *) const
double fAvbn
offset in average charged hadron multiplicity = f(W) relation for vbn
double fPKc
{K+ K- } production probability
double fRvnCCm3
Rijk: vn, CC, multiplicity = 3.
double fBvn
slope in average charged hadron multiplicity = f(W) relation for vn
#define SLOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a short string (using the FUNCTION and...
GENIE's GHEP MC event record.
static constexpr double m
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.
void ProcessEventRecord(GHepRecord *event) const
double fPpic
{pi+ pi- } production probability
bool IsNegChargedLepton(int pdgc)
void push_back(int pdg_code)
double fCvn
Levy function parameter for vn.
double fAvp
offset in average charged hadron multiplicity = f(W) relation for vp
enum genie::EGHepStatus GHepStatus_t
Initial State information.
double Py(void) const
Get Py.
bool fForceNeuGenLimit
force upper hadronic multiplicity to NeuGEN limit