30 #include <TLorentzVector.h> 31 #include <TClonesArray.h> 58 using namespace genie;
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
boost = had_syst -> BoostVector() ;
127 const TLorentzVector & vtx = *(neutrino->
X4());
130 TIter particle_iter(particle_list);
131 while ((particle = (
GHepParticle *) particle_iter.Next())) {
133 int pdgc = particle -> Pdg() ;
136 particle -> P4() -> Boost( boost ) ;
149 particle -> SetStatus( ist ) ;
151 int im = mom + 1 + particle -> FirstMother() ;
155 particle -> SetFirstMother( im ) ;
157 particle -> SetPosition( vtx ) ;
159 event->AddParticle(*particle);
162 delete particle_list ;
176 LOG(
"KNOHad",
pWARN) <<
"Returning a null particle list!";
182 LOG(
"KNOHad",
pINFO) <<
"W = " << W <<
" GeV";
189 <<
"Failed selecting particles for " << *
interaction;
207 TClonesArray * particle_list = 0;
211 if(use_isotropic_decay) {
214 particle_list = this->
DecayMethod2(W,*pdgcv,reweight_decays);
217 particle_list = this->
DecayMethod1(W,*pdgcv,reweight_decays);
222 <<
"Failed decaying a hadronic system @ W=" << W
223 <<
"with multiplicity=" << pdgcv->
size();
234 particle_list->SetOwner(
true);
238 return particle_list;
245 LOG(
"KNOHad",
pWARN) <<
"Returning a null particle list!";
249 unsigned int min_mult = 2;
250 unsigned int mult = 0;
258 LOG(
"KNOHad",
pINFO) <<
"Hadron Shower Charge = " << maxQ;
261 LOG(
"KNOHad",
pDEBUG) <<
"Building Multiplicity Probability distribution";
263 Option_t *
opt =
"+LowMultSuppr+Renormalize";
267 LOG(
"KNOHad",
pWARN) <<
"Null multiplicity probability distribution!";
270 if(mprob->Integral(
"width")<=0) {
271 LOG(
"KNOHad",
pWARN) <<
"Empty multiplicity probability distribution!";
278 bool allowed_state=
false;
279 unsigned int itry = 0;
281 while(!allowed_state)
288 <<
"Couldn't select hadronic shower particles after: " 289 << itry <<
" attempts!";
295 mult = TMath::Nint( mprob->GetRandom() );
297 LOG(
"KNOHad",
pINFO) <<
"Hadron multiplicity = " << mult;
301 if(mult < (
unsigned int) TMath::Abs(maxQ)) {
303 <<
"Multiplicity not enough to generate hadronic charge! Retrying.";
304 allowed_state =
false;
311 if(mult < min_mult) {
314 <<
"Low generated multiplicity: " << mult
315 <<
". Forcing to minimum accepted multiplicity: " << min_mult;
319 <<
"Generated multiplicity: " << mult <<
" is too low! Quitting";
329 <<
"Generated multiplicity (@ W = " << W <<
"): " << pdgcv->
size();
333 mult = pdgcv->
size();
338 for(pdg_iter = pdgcv->begin(); pdg_iter != pdgcv->end(); ++pdg_iter) {
339 int pdgc = *pdg_iter;
343 LOG(
"KNOHad",
pDEBUG) <<
"- PDGC=" << pdgc <<
", m=" << m <<
" GeV";
345 bool permitted = (W > msum);
348 LOG(
"KNOHad",
pWARN) <<
"*** Decay forbidden by kinematics! ***";
349 LOG(
"KNOHad",
pWARN) <<
"sum{mass} = " << msum <<
", W = " <<
W;
350 LOG(
"KNOHad",
pWARN) <<
"Discarding hadronic system & re-trying!";
352 allowed_state =
false;
356 allowed_state =
true;
359 <<
"Found an allowed hadronic state @ W=" << W
360 <<
" multiplicity=" << mult;
386 <<
"Returning a null multiplicity probability distribution!";
399 double avn = 1.5*avnch;
402 <<
"Average hadronic multiplicity (W=" << W <<
") = " << avn;
405 double maxmult = this->
MaxMult(interaction);
414 if(maxmult>18) maxmult=18;
416 SLOG(
"KNOHad",
pDEBUG) <<
"Computed maximum multiplicity = " << maxmult;
419 LOG(
"KNOHad",
pWARN) <<
"Low maximum multiplicity! Quiting.";
430 int nbins = mult_prob->FindBin(maxmult);
432 for(
int i = 1; i <=
nbins; i++) {
434 double n = mult_prob->GetBinCenter(i);
436 double avnP = this->
KNO(nu_pdg,nuc_pdg,z);
437 double P = avnP / avn;
440 <<
"n = " << n <<
" (n/<n> = " << z
441 <<
", <n>*P = " << avnP <<
") => P = " <<
P;
443 mult_prob->Fill(n,P);
446 SLOG(
"KNOHad",
pDEBUG) <<
"Fixing multiplicity to 2";
447 mult_prob->Fill(2,1.);
450 double integral = mult_prob->Integral(
"width");
453 mult_prob->Scale(1.0/integral);
455 SLOG(
"KNOHad",
pWARN) <<
"probability distribution integral = 0";
461 bool apply_neugen_Rijk = option.find(
"+LowMultSuppr") != string::npos;
462 bool renormalize = option.find(
"+Renormalize") != string::npos;
465 if(apply_neugen_Rijk) {
466 SLOG(
"KNOHad",
pINFO) <<
"Applying NeuGEN scaling factors";
469 this->
ApplyRijk(interaction, renormalize, mult_prob);
472 <<
"W = " << W <<
" < Wcut = " <<
fWcut 473 <<
" - Will not apply scaling factors";
550 double diff = TMath::Abs(1.-fsum);
552 LOG(
"KNOHad",
pWARN) <<
"KNO Probabilities do not sum to unity! Renormalizing..." ;
568 "0.083*exp(-0.5*pow(x+0.385,2.)/0.131)",-1,0.5);
570 "exp(-0.214-6.625*x)",0,0.6);
643 if ( is_p && (is_nu || is_l ) ) c=
fCvp;
644 else if ( is_n && (is_nu || is_l ) ) c=
fCvn;
645 else if ( is_p && (is_nubar || is_lbar) ) c=
fCvbp;
646 else if ( is_n && (is_nubar || is_lbar) ) c=
fCvbn;
648 else if ( is_p && is_dm ) c=
fCvp;
649 else if ( is_n && is_dm ) c=
fCvn;
652 <<
"Invalid initial state (probe = " << probe_pdg <<
", " 653 <<
"hit nucleon = " << nuc_pdg <<
")";
658 double kno = 2*TMath::Exp(-c)*TMath::Power(c,x)/TMath::Gamma(x);
664 int probe_pdg,
int nuc_pdg,
double W)
const 679 if ( is_p && (is_nu || is_l ) ) { a=
fAvp;
b=
fBvp; }
680 else if ( is_n && (is_nu || is_l ) ) { a=
fAvn;
b=
fBvn; }
681 else if ( is_p && (is_nubar || is_lbar) ) { a=
fAvbp;
b=
fBvbp; }
682 else if ( is_n && (is_nubar || is_lbar) ) { a=
fAvbn;
b=
fBvbn; }
684 else if ( is_p && is_dm ) { a=
fAvp;
b=
fBvp; }
685 else if ( is_n && is_dm ) { a=
fAvn;
b=
fBvn; }
688 <<
"Invalid initial state (probe = " << probe_pdg <<
", " 689 <<
"hit nucleon = " << nuc_pdg <<
")";
693 double av_nch = a +
b * 2*TMath::Log(W);
705 int hadronShowerCharge = 0;
724 hadronShowerCharge = (
int) ( qp + qnuc - ql );
726 return hadronShowerCharge;
730 double W,
const PDGCodeList & pdgv,
bool reweight_decays)
const 735 LOG(
"KNOHad",
pINFO) <<
"** Using Hadronic System Decay method 1";
737 TLorentzVector p4had(0,0,0,W);
738 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.
size());
741 bool ok = this->
PhaseSpaceDecay(*plist, p4had, pdgv, 0, reweight_decays);
753 double W,
const PDGCodeList & pdgv,
bool reweight_decays)
const 759 LOG(
"KNOHad",
pINFO) <<
"** Using Hadronic System Decay method 2";
767 int baryon = pdgv[0];
769 double MN2 = TMath::Power(MN, 2);
775 bool allowdup =
true;
777 for(
unsigned int i=1; i<pdgv.
size(); i++) pdgv_strip[i-1] = pdgv[i];
782 for( ; pdg_iter != pdgv_strip.end(); ++pdg_iter) {
783 int pdgc = *pdg_iter;
788 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.
size());
791 TLorentzVector p4had(0,0,0,W);
792 TLorentzVector p4N (0,0,0,0);
797 bool got_baryon_4p =
false;
798 bool got_hadsyst_4p =
false;
800 while(!got_hadsyst_4p) {
802 LOG(
"KNOHad",
pINFO) <<
"Generating p4 for baryon with pdg = " << baryon;
804 while(!got_baryon_4p) {
811 double pt = TMath::Sqrt(pt2);
812 double phi = (2*
kPi) * rnd->RndHadro().Rndm();
813 double px = pt * TMath::Cos(phi);
814 double py = pt * TMath::Sin(phi);
816 double p2 = TMath::Power(pz,2) + pt2;
817 double E = TMath::Sqrt(p2+MN2);
819 p4N.SetPxPyPzE(px,py,pz,E);
821 LOG(
"KNOHad",
pDEBUG) <<
"Trying nucleon xF= "<< xf<<
", pT2= "<< pt2;
825 double Mav = p4d.Mag();
827 got_baryon_4p = (Mav > mass_sum);
837 p4N.Px(),p4N.Py(),p4N.Pz(),p4N.Energy(), 0,0,0,0
842 <<
"Generating p4 for the remaining hadronic system";
844 <<
"Remaining system: Available mass = " << p4d.Mag()
845 <<
", Particle masses = " << mass_sum;
848 *plist, p4d, pdgv_strip, 1, reweight_decays);
850 got_hadsyst_4p = is_ok;
852 if(!got_hadsyst_4p) {
853 got_baryon_4p =
false;
860 LOG(
"KNOHad",
pERROR) <<
"*** Decay forbidden by kinematics! ***";
874 LOG(
"KNOHad",
pINFO) <<
"Generating two particles back-to-back";
876 assert(pdgv.
size()==2);
881 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.
size());
887 TLorentzVector p4(0,0,0,W);
890 bool accepted =
false;
899 LOG(
"KNOHad",
pERROR) <<
"*** Decay forbidden by kinematics! ***";
911 double px = baryon->
Px();
912 double py = baryon->
Py();
913 double pz = baryon->
Pz();
915 double pT2 = px*px + py*
py;
917 double xF = pL/(W/2);
919 double pT2rnd = pT2o * rnd->RndHadro().Rndm();
920 double xFrnd = xFo * rnd->RndHadro().Rndm();
925 LOG(
"KNOHad",
pINFO) <<
"baryon xF = " << xF <<
", pT2 = " << pT2;
927 accepted = (xFrnd < xFpdf && pT2rnd < pT2pdf);
929 LOG(
"KNOHad",
pINFO) << ((accepted) ?
"Decay accepted":
"Decay rejected");
935 TClonesArray & plist, TLorentzVector & pd,
936 const PDGCodeList & pdgv,
int offset,
bool reweight)
const 942 LOG(
"KNOHad",
pINFO) <<
"*** Performing a Phase Space Decay";
943 LOG(
"KNOHad",
pINFO) <<
"pT reweighting is " << (reweight ?
"on" :
"off");
945 assert ( offset >= 0);
946 assert ( pdgv.
size() > 1);
952 double * mass =
new double[pdgv.
size()];
954 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
955 int pdgc = *pdg_iter;
962 <<
"Decaying N = " << pdgv.
size() <<
" particles / total mass = " << sum;
970 <<
" *** Phase space decay is not permitted \n" 971 <<
" Total particle mass = " << sum <<
"\n" 982 for(
int idec=0; idec<200; idec++) {
985 wmax = TMath::Max(wmax,w);
990 <<
"Max phase space gen. weight @ current hadronic system: " << wmax;
1001 fWeight *= TMath::Max(w/wmax, 1.);
1007 bool accept_decay=
false;
1008 unsigned int itry=0;
1010 while(!accept_decay)
1017 <<
"Couldn't generate an unweighted phase space decay after " 1018 << itry <<
" attempts";
1027 <<
"Decay weight = " << w <<
" > max decay weight = " << wmax;
1029 double gw = wmax * rnd->
RndHadro().Rndm();
1030 accept_decay = (gw<=
w);
1033 <<
"Decay weight = " << w <<
" / R = " << gw
1034 <<
" - accepted: " << accept_decay;
1036 bool return_after_not_accepted_decay =
false;
1037 if(return_after_not_accepted_decay && !accept_decay) {
1039 <<
"Was instructed to return after a not-accepted decay";
1049 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
1052 int pdgc = *pdg_iter;
1091 for(
unsigned int i = 0; i < pdgcv.
size(); i++) {
1097 double pt2 = TMath::Power(p4->Px(),2) + TMath::Power(p4->Py(),2);
1098 double wi = TMath::Exp(-
fPhSpRwA*TMath::Sqrt(pt2));
1107 int multiplicity,
int maxQ,
double W)
const 1119 int hadrons_to_add = multiplicity;
1128 bool baryon_is_strange = (baryon_code ==
kPdgSigmaP ||
1131 bool baryon_chg_is_pos = (baryon_code ==
kPdgProton ||
1133 bool baryon_chg_is_neg = (baryon_code ==
kPdgSigmaM);
1136 if(baryon_chg_is_pos) maxQ -= 1;
1137 if(baryon_chg_is_neg) maxQ += 1;
1139 W -= pdg->
Find( (*pdgc)[0] )->Mass();
1146 if(baryon_is_strange) {
1148 <<
" Remnant baryon is strange. Conserving strangeness...";
1151 if(multiplicity == 2) {
1153 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1161 else if(maxQ == 0) {
1162 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1172 else if(multiplicity == 3 && maxQ == 2) {
1173 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1181 else if(multiplicity == 3 && maxQ == -1) {
1182 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1194 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1203 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1218 LOG(
"KNOHad",
pDEBUG) <<
"Need more negative charge -> Adding a pi-";
1227 }
else if (maxQ > 0) {
1229 LOG(
"KNOHad",
pDEBUG) <<
"Need more positive charge -> Adding a pi+";
1244 <<
"Hadronic charge balanced. Now adding only neutrals or +- pairs";
1250 double M2pi0 = 2 * pdg -> Find (
kPdgPi0) ->
Mass();
1253 double M2Kc = pdg -> Find (
kPdgKP ) ->
Mass() +
1255 double M2K0 = 2 * pdg -> Find (
kPdgK0 ) ->
Mass();
1256 double M2Eta = 2 * pdg -> Find (
kPdgEta) ->
Mass();
1257 double Mpi0eta = pdg -> Find (
kPdgPi0) ->
Mass() +
1264 if( hadrons_to_add > 0 && hadrons_to_add % 2 == 1 ) {
1267 <<
"Odd number of hadrons left to add -> Adding a pi0";
1276 assert( hadrons_to_add % 2 == 0 );
1278 <<
" hadrons_to_add = "<<hadrons_to_add<<
" W= "<<W<<
" M2pi0 = "<<M2pi0<<
" M2pic = "<<M2pic<<
" M2Kc = "<<M2Kc<<
" M2K0= "<<M2K0<<
" M2Eta= "<<M2Eta;
1280 while(hadrons_to_add > 0 && W >= M2pi0) {
1285 if (x >= 0 && x <
fPpi0) {
1286 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a pi0pi0 pair";
1289 hadrons_to_add -= 2;
1296 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a pi+pi- pair";
1299 hadrons_to_add -= 2;
1303 <<
"Not enough mass for a pi+pi-: trying something else";
1310 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+K- pair";
1313 hadrons_to_add -= 2;
1317 <<
"Not enough mass for a K+K-: trying something else";
1324 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0 K0bar pair";
1327 hadrons_to_add -= 2;
1331 <<
"Not enough mass for a K0 K0bar: trying something else";
1337 if( W >= Mpi0eta ) {
1338 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a Pi0-Eta pair";
1341 hadrons_to_add -= 2;
1345 <<
"Not enough mass for a Pi0-Eta pair: trying something else";
1352 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a eta-eta pair";
1355 hadrons_to_add -= 2;
1359 <<
"Not enough mass for a Eta-Eta pair: trying something else";
1364 <<
"Hadron Assignment Probabilities do not add up to 1!!";
1372 if(W < M2pi0) hadrons_to_add = 0;
1381 int multiplicity,
int maxQ,
double W)
const 1397 Pstr = TMath::Min(1.,Pstr);
1398 Pstr = TMath::Max(0.,Pstr);
1410 if(multiplicity == 2) {
1419 if(multiplicity == 2) {
1428 if(multiplicity != 2) {
1436 if(pdgc ==
kPdgProton && y < Pstr && maxQ > 0) {
1439 else if(pdgc ==
kPdgProton && y < Pstr && maxQ <= 0) {
1442 else if(pdgc ==
kPdgNeutron && y < Pstr && maxQ > 0) {
1445 else if(pdgc ==
kPdgNeutron && y < Pstr && maxQ <= 0) {
1450 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a proton";
1452 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a neutron";
1454 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a sigma+";
1456 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a lambda";
1458 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a sigma-";
1536 LOG(
"KNOHad",
pWARN) <<
"Can't hadronize charm events";
1540 if(W < this->
Wmin()) {
1541 LOG(
"KNOHad",
pWARN) <<
"Low invariant mass, W = " << W <<
" GeV!!";
1549 double W = interaction->
Kine().
W();
1558 int nbins = TMath::Nint(maxmult-minmult+1);
1560 TH1D * mult_prob =
new TH1D(
"mult_prob",
1561 "hadronic multiplicity distribution", nbins, minmult-0.5, maxmult+0.5);
1562 mult_prob->SetDirectory(0);
1568 bool norm, TH1D * mp )
const 1575 int probe_pdg = init_state.
ProbePdg();
1581 bool is_EM = proc_info.
IsEM();
1589 double R2=1., R3=1.;
1593 if(is_CC || is_NC || is_dm) {
1599 if((is_nu && is_p) || (is_dmi && is_p)) {
1603 if((is_nu && is_n) || (is_dmi && is_n)) {
1607 if(is_nubar && is_p) {
1611 if(is_nubar && is_n) {
1616 <<
"Invalid initial state: " << init_state;
1635 if(is_lbar && is_p) {
1639 if(is_lbar && is_n) {
1644 <<
"Invalid initial state: " << init_state;
1652 int nbins = mp->GetNbinsX();
1653 for(
int i = 1; i <=
nbins; i++) {
1654 int n = TMath::Nint( mp->GetBinCenter(i) );
1658 else if (n==3) R=R3;
1661 double P = mp->GetBinContent(i);
1664 <<
"n=" << n <<
"/ Scaling factor R = " 1665 << R <<
"/ P " << P <<
" --> " << Psc;
1666 mp->SetBinContent(i, Psc);
1673 double histo_norm = mp->Integral(
"width");
1674 if(histo_norm>0) mp->Scale(1.0/histo_norm);
void ApplyRijk(const Interaction *i, bool norm, TH1D *mp) const
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)
THE MAIN GENIE PROJECT NAMESPACE
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
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
std::pair< float, std::string > P
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.
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.
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 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.
bool fUseBaryonXfPt2Param
Generate baryon xF,pT2 from experimental parameterization?
double fWcut
Rijk applied for W<Wcut (see DIS/RES join scheme)
Misc GENIE control constants.
auto norm(Vector const &v)
Return norm of the specified vector.
double fRvbnNCm2
Rijk: vbn, NC, multiplicity = 2.
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
TClonesArray * DecayMethod2(double W, const PDGCodeList &pdgv, bool reweight_decays) const
Simple printing utilities.
bool IsNeutralLepton(int pdgc)
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.
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)
cet::coded_exception< error, detail::translate > exception
void push_back(int pdg_code)
Event finding and building.
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