32 #include <TLorentzVector.h> 33 #include <TClonesArray.h> 61 using namespace genie;
100 TClonesArray * particle_list = this->
Hadronize(interaction);
102 if(! particle_list ) {
103 LOG(
"KNOHadronization",
pWARN) <<
"Got an empty particle list. Hadronizer failed!";
104 LOG(
"KNOHadronization",
pWARN) <<
"Quitting the current event generation thread";
109 exception.
SetReason(
"Could not simulate the hadronic system");
116 int mom =
event->FinalStateHadronicSystemPosition();
126 const TLorentzVector * had_syst =
event -> Particle(mom) -> P4() ;
127 TVector3
boost = had_syst -> BoostVector() ;
130 const TLorentzVector & vtx = *(neutrino->
X4());
133 TIter particle_iter(particle_list);
134 while ((particle = (
GHepParticle *) particle_iter.Next())) {
136 int pdgc = particle -> Pdg() ;
139 particle -> P4() -> Boost( boost ) ;
152 particle -> SetStatus( ist ) ;
154 int im = mom + 1 + particle -> FirstMother() ;
158 particle -> SetFirstMother( im ) ;
160 particle -> SetPosition( vtx ) ;
162 event->AddParticle(*particle);
165 delete particle_list ;
179 LOG(
"KNOHad",
pWARN) <<
"Returning a null particle list!";
185 LOG(
"KNOHad",
pINFO) <<
"W = " << W <<
" GeV";
192 <<
"Failed selecting particles for " << *
interaction;
210 TClonesArray * particle_list = 0;
214 if(use_isotropic_decay) {
217 particle_list = this->
DecayMethod2(W,*pdgcv,reweight_decays);
220 particle_list = this->
DecayMethod1(W,*pdgcv,reweight_decays);
225 <<
"Failed decaying a hadronic system @ W=" << W
226 <<
"with multiplicity=" << pdgcv->
size();
237 particle_list->SetOwner(
true);
241 return particle_list;
248 LOG(
"KNOHad",
pWARN) <<
"Returning a null particle list!";
252 unsigned int min_mult = 2;
253 unsigned int mult = 0;
261 LOG(
"KNOHad",
pINFO) <<
"Hadron Shower Charge = " << maxQ;
264 LOG(
"KNOHad",
pDEBUG) <<
"Building Multiplicity Probability distribution";
266 Option_t *
opt =
"+LowMultSuppr+Renormalize";
270 LOG(
"KNOHad",
pWARN) <<
"Null multiplicity probability distribution!";
273 if(mprob->Integral(
"width")<=0) {
274 LOG(
"KNOHad",
pWARN) <<
"Empty multiplicity probability distribution!";
281 bool allowed_state=
false;
282 unsigned int itry = 0;
284 while(!allowed_state)
291 <<
"Couldn't select hadronic shower particles after: " 292 << itry <<
" attempts!";
298 mult = TMath::Nint( mprob->GetRandom() );
300 LOG(
"KNOHad",
pINFO) <<
"Hadron multiplicity = " << mult;
304 if(mult < (
unsigned int) TMath::Abs(maxQ)) {
306 <<
"Multiplicity not enough to generate hadronic charge! Retrying.";
307 allowed_state =
false;
314 if(mult < min_mult) {
317 <<
"Low generated multiplicity: " << mult
318 <<
". Forcing to minimum accepted multiplicity: " << min_mult;
322 <<
"Generated multiplicity: " << mult <<
" is too low! Quitting";
332 <<
"Generated multiplicity (@ W = " << W <<
"): " << pdgcv->
size();
336 mult = pdgcv->
size();
341 for(pdg_iter = pdgcv->begin(); pdg_iter != pdgcv->end(); ++pdg_iter) {
342 int pdgc = *pdg_iter;
346 LOG(
"KNOHad",
pDEBUG) <<
"- PDGC=" << pdgc <<
", m=" << m <<
" GeV";
348 bool permitted = (W > msum);
351 LOG(
"KNOHad",
pWARN) <<
"*** Decay forbidden by kinematics! ***";
352 LOG(
"KNOHad",
pWARN) <<
"sum{mass} = " << msum <<
", W = " <<
W;
353 LOG(
"KNOHad",
pWARN) <<
"Discarding hadronic system & re-trying!";
355 allowed_state =
false;
359 allowed_state =
true;
362 <<
"Found an allowed hadronic state @ W=" << W
363 <<
" multiplicity=" << mult;
389 <<
"Returning a null multiplicity probability distribution!";
402 double avn = 1.5*avnch;
405 <<
"Average hadronic multiplicity (W=" << W <<
") = " << avn;
408 double maxmult = this->
MaxMult(interaction);
417 if(maxmult>18) maxmult=18;
419 SLOG(
"KNOHad",
pDEBUG) <<
"Computed maximum multiplicity = " << maxmult;
422 LOG(
"KNOHad",
pWARN) <<
"Low maximum multiplicity! Quiting.";
433 int nbins = mult_prob->FindBin(maxmult);
435 for(
int i = 1; i <=
nbins; i++) {
437 double n = mult_prob->GetBinCenter(i);
439 double avnP = this->
KNO(nu_pdg,nuc_pdg,z);
440 double P = avnP / avn;
443 <<
"n = " << n <<
" (n/<n> = " << z
444 <<
", <n>*P = " << avnP <<
") => P = " <<
P;
446 mult_prob->Fill(n,P);
449 SLOG(
"KNOHad",
pDEBUG) <<
"Fixing multiplicity to 2";
450 mult_prob->Fill(2,1.);
453 double integral = mult_prob->Integral(
"width");
456 mult_prob->Scale(1.0/integral);
458 SLOG(
"KNOHad",
pWARN) <<
"probability distribution integral = 0";
464 bool apply_neugen_Rijk = option.find(
"+LowMultSuppr") != string::npos;
465 bool renormalize = option.find(
"+Renormalize") != string::npos;
468 if(apply_neugen_Rijk) {
469 SLOG(
"KNOHad",
pINFO) <<
"Applying NeuGEN scaling factors";
472 this->
ApplyRijk(interaction, renormalize, mult_prob);
475 <<
"W = " << W <<
" < Wcut = " <<
fWcut 476 <<
" - Will not apply scaling factors";
553 double diff = TMath::Abs(1.-fsum);
555 LOG(
"KNOHad",
pWARN) <<
"KNO Probabilities do not sum to unity! Renormalizing..." ;
571 "0.083*exp(-0.5*pow(x+0.385,2.)/0.131)",-1,0.5);
573 "exp(-0.214-6.625*x)",0,0.6);
646 if ( is_p && (is_nu || is_l ) ) c=
fCvp;
647 else if ( is_n && (is_nu || is_l ) ) c=
fCvn;
648 else if ( is_p && (is_nubar || is_lbar) ) c=
fCvbp;
649 else if ( is_n && (is_nubar || is_lbar) ) c=
fCvbn;
651 else if ( is_p && is_dm ) c=
fCvp;
652 else if ( is_n && is_dm ) c=
fCvn;
655 <<
"Invalid initial state (probe = " << probe_pdg <<
", " 656 <<
"hit nucleon = " << nuc_pdg <<
")";
661 double kno = 2*TMath::Exp(-c)*TMath::Power(c,x)/TMath::Gamma(x);
667 int probe_pdg,
int nuc_pdg,
double W)
const 682 if ( is_p && (is_nu || is_l ) ) { a=
fAvp;
b=
fBvp; }
683 else if ( is_n && (is_nu || is_l ) ) { a=
fAvn;
b=
fBvn; }
684 else if ( is_p && (is_nubar || is_lbar) ) { a=
fAvbp;
b=
fBvbp; }
685 else if ( is_n && (is_nubar || is_lbar) ) { a=
fAvbn;
b=
fBvbn; }
687 else if ( is_p && is_dm ) { a=
fAvp;
b=
fBvp; }
688 else if ( is_n && is_dm ) { a=
fAvn;
b=
fBvn; }
691 <<
"Invalid initial state (probe = " << probe_pdg <<
", " 692 <<
"hit nucleon = " << nuc_pdg <<
")";
696 double av_nch = a +
b * 2*TMath::Log(W);
708 int hadronShowerCharge = 0;
727 hadronShowerCharge = (
int) ( qp + qnuc - ql );
729 return hadronShowerCharge;
733 double W,
const PDGCodeList & pdgv,
bool reweight_decays)
const 738 LOG(
"KNOHad",
pINFO) <<
"** Using Hadronic System Decay method 1";
740 TLorentzVector p4had(0,0,0,W);
741 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.
size());
744 bool ok = this->
PhaseSpaceDecay(*plist, p4had, pdgv, 0, reweight_decays);
756 double W,
const PDGCodeList & pdgv,
bool reweight_decays)
const 762 LOG(
"KNOHad",
pINFO) <<
"** Using Hadronic System Decay method 2";
770 int baryon = pdgv[0];
772 double MN2 = TMath::Power(MN, 2);
778 bool allowdup =
true;
780 for(
unsigned int i=1; i<pdgv.
size(); i++) pdgv_strip[i-1] = pdgv[i];
785 for( ; pdg_iter != pdgv_strip.end(); ++pdg_iter) {
786 int pdgc = *pdg_iter;
791 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.
size());
794 TLorentzVector p4had(0,0,0,W);
795 TLorentzVector p4N (0,0,0,0);
800 bool got_baryon_4p =
false;
801 bool got_hadsyst_4p =
false;
803 while(!got_hadsyst_4p) {
805 LOG(
"KNOHad",
pINFO) <<
"Generating p4 for baryon with pdg = " << baryon;
807 while(!got_baryon_4p) {
814 double pt = TMath::Sqrt(pt2);
815 double phi = (2*
kPi) * rnd->RndHadro().Rndm();
816 double px = pt * TMath::Cos(phi);
817 double py = pt * TMath::Sin(phi);
819 double p2 = TMath::Power(pz,2) + pt2;
820 double E = TMath::Sqrt(p2+MN2);
822 p4N.SetPxPyPzE(px,py,pz,E);
824 LOG(
"KNOHad",
pDEBUG) <<
"Trying nucleon xF= "<< xf<<
", pT2= "<< pt2;
828 double Mav = p4d.Mag();
830 got_baryon_4p = (Mav > mass_sum);
840 p4N.Px(),p4N.Py(),p4N.Pz(),p4N.Energy(), 0,0,0,0
845 <<
"Generating p4 for the remaining hadronic system";
847 <<
"Remaining system: Available mass = " << p4d.Mag()
848 <<
", Particle masses = " << mass_sum;
851 *plist, p4d, pdgv_strip, 1, reweight_decays);
853 got_hadsyst_4p = is_ok;
855 if(!got_hadsyst_4p) {
856 got_baryon_4p =
false;
863 LOG(
"KNOHad",
pERROR) <<
"*** Decay forbidden by kinematics! ***";
877 LOG(
"KNOHad",
pINFO) <<
"Generating two particles back-to-back";
879 assert(pdgv.
size()==2);
884 TClonesArray * plist =
new TClonesArray(
"genie::GHepParticle", pdgv.
size());
890 TLorentzVector p4(0,0,0,W);
893 bool accepted =
false;
902 LOG(
"KNOHad",
pERROR) <<
"*** Decay forbidden by kinematics! ***";
914 double px = baryon->
Px();
915 double py = baryon->
Py();
916 double pz = baryon->
Pz();
918 double pT2 = px*px + py*py;
920 double xF = pL/(W/2);
922 double pT2rnd = pT2o * rnd->RndHadro().Rndm();
923 double xFrnd = xFo * rnd->RndHadro().Rndm();
928 LOG(
"KNOHad",
pINFO) <<
"baryon xF = " << xF <<
", pT2 = " << pT2;
930 accepted = (xFrnd < xFpdf && pT2rnd < pT2pdf);
932 LOG(
"KNOHad",
pINFO) << ((accepted) ?
"Decay accepted":
"Decay rejected");
938 TClonesArray & plist, TLorentzVector & pd,
939 const PDGCodeList & pdgv,
int offset,
bool reweight)
const 945 LOG(
"KNOHad",
pINFO) <<
"*** Performing a Phase Space Decay";
946 LOG(
"KNOHad",
pINFO) <<
"pT reweighting is " << (reweight ?
"on" :
"off");
948 assert ( offset >= 0);
949 assert ( pdgv.
size() > 1);
955 double * mass =
new double[pdgv.
size()];
957 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
958 int pdgc = *pdg_iter;
965 <<
"Decaying N = " << pdgv.
size() <<
" particles / total mass = " << sum;
973 <<
" *** Phase space decay is not permitted \n" 974 <<
" Total particle mass = " << sum <<
"\n" 985 for(
int idec=0; idec<200; idec++) {
988 wmax = TMath::Max(wmax,w);
993 <<
"Max phase space gen. weight @ current hadronic system: " << wmax;
1004 fWeight *= TMath::Max(w/wmax, 1.);
1010 bool accept_decay=
false;
1011 unsigned int itry=0;
1013 while(!accept_decay)
1020 <<
"Couldn't generate an unweighted phase space decay after " 1021 << itry <<
" attempts";
1030 <<
"Decay weight = " << w <<
" > max decay weight = " << wmax;
1032 double gw = wmax * rnd->
RndHadro().Rndm();
1033 accept_decay = (gw<=
w);
1036 <<
"Decay weight = " << w <<
" / R = " << gw
1037 <<
" - accepted: " << accept_decay;
1039 bool return_after_not_accepted_decay =
false;
1040 if(return_after_not_accepted_decay && !accept_decay) {
1042 <<
"Was instructed to return after a not-accepted decay";
1052 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
1055 int pdgc = *pdg_iter;
1094 for(
unsigned int i = 0; i < pdgcv.
size(); i++) {
1100 double pt2 = TMath::Power(p4->Px(),2) + TMath::Power(p4->Py(),2);
1101 double wi = TMath::Exp(-
fPhSpRwA*TMath::Sqrt(pt2));
1110 int multiplicity,
int maxQ,
double W)
const 1122 int hadrons_to_add = multiplicity;
1131 bool baryon_is_strange = (baryon_code ==
kPdgSigmaP ||
1134 bool baryon_chg_is_pos = (baryon_code ==
kPdgProton ||
1136 bool baryon_chg_is_neg = (baryon_code ==
kPdgSigmaM);
1139 if(baryon_chg_is_pos) maxQ -= 1;
1140 if(baryon_chg_is_neg) maxQ += 1;
1142 W -= pdg->
Find( (*pdgc)[0] )->Mass();
1149 if(baryon_is_strange) {
1151 <<
" Remnant baryon is strange. Conserving strangeness...";
1154 if(multiplicity == 2) {
1156 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1164 else if(maxQ == 0) {
1165 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1175 else if(multiplicity == 3 && maxQ == 2) {
1176 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1184 else if(multiplicity == 3 && maxQ == -1) {
1185 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1197 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+";
1206 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0";
1221 LOG(
"KNOHad",
pDEBUG) <<
"Need more negative charge -> Adding a pi-";
1230 }
else if (maxQ > 0) {
1232 LOG(
"KNOHad",
pDEBUG) <<
"Need more positive charge -> Adding a pi+";
1247 <<
"Hadronic charge balanced. Now adding only neutrals or +- pairs";
1253 double M2pi0 = 2 * pdg -> Find (
kPdgPi0) ->
Mass();
1256 double M2Kc = pdg -> Find (
kPdgKP ) ->
Mass() +
1258 double M2K0 = 2 * pdg -> Find (
kPdgK0 ) ->
Mass();
1259 double M2Eta = 2 * pdg -> Find (
kPdgEta) ->
Mass();
1260 double Mpi0eta = pdg -> Find (
kPdgPi0) ->
Mass() +
1267 if( hadrons_to_add > 0 && hadrons_to_add % 2 == 1 ) {
1270 <<
"Odd number of hadrons left to add -> Adding a pi0";
1279 assert( hadrons_to_add % 2 == 0 );
1281 <<
" hadrons_to_add = "<<hadrons_to_add<<
" W= "<<W<<
" M2pi0 = "<<M2pi0<<
" M2pic = "<<M2pic<<
" M2Kc = "<<M2Kc<<
" M2K0= "<<M2K0<<
" M2Eta= "<<M2Eta;
1283 while(hadrons_to_add > 0 && W >= M2pi0) {
1288 if (x >= 0 && x <
fPpi0) {
1289 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a pi0pi0 pair";
1292 hadrons_to_add -= 2;
1299 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a pi+pi- pair";
1302 hadrons_to_add -= 2;
1306 <<
"Not enough mass for a pi+pi-: trying something else";
1313 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K+K- pair";
1316 hadrons_to_add -= 2;
1320 <<
"Not enough mass for a K+K-: trying something else";
1327 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a K0 K0bar pair";
1330 hadrons_to_add -= 2;
1334 <<
"Not enough mass for a K0 K0bar: trying something else";
1340 if( W >= Mpi0eta ) {
1341 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a Pi0-Eta pair";
1344 hadrons_to_add -= 2;
1348 <<
"Not enough mass for a Pi0-Eta pair: trying something else";
1355 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a eta-eta pair";
1358 hadrons_to_add -= 2;
1362 <<
"Not enough mass for a Eta-Eta pair: trying something else";
1367 <<
"Hadron Assignment Probabilities do not add up to 1!!";
1375 if(W < M2pi0) hadrons_to_add = 0;
1384 int multiplicity,
int maxQ,
double W)
const 1400 Pstr = TMath::Min(1.,Pstr);
1401 Pstr = TMath::Max(0.,Pstr);
1413 if(multiplicity == 2) {
1422 if(multiplicity == 2) {
1431 if(multiplicity != 2) {
1439 if(pdgc ==
kPdgProton && y < Pstr && maxQ > 0) {
1442 else if(pdgc ==
kPdgProton && y < Pstr && maxQ <= 0) {
1445 else if(pdgc ==
kPdgNeutron && y < Pstr && maxQ > 0) {
1448 else if(pdgc ==
kPdgNeutron && y < Pstr && maxQ <= 0) {
1453 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a proton";
1455 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a neutron";
1457 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a sigma+";
1459 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a lambda";
1461 LOG(
"KNOHad",
pDEBUG) <<
" -> Adding a sigma-";
1539 LOG(
"KNOHad",
pWARN) <<
"Can't hadronize charm events";
1543 if(W < this->
Wmin()) {
1544 LOG(
"KNOHad",
pWARN) <<
"Low invariant mass, W = " << W <<
" GeV!!";
1552 double W = interaction->
Kine().
W();
1561 int nbins = TMath::Nint(maxmult-minmult+1);
1563 TH1D * mult_prob =
new TH1D(
"mult_prob",
1564 "hadronic multiplicity distribution", nbins, minmult-0.5, maxmult+0.5);
1565 mult_prob->SetDirectory(0);
1571 bool norm, TH1D * mp )
const 1578 int probe_pdg = init_state.
ProbePdg();
1584 bool is_EM = proc_info.
IsEM();
1592 double R2=1., R3=1.;
1596 if(is_CC || is_NC || is_dm) {
1602 if((is_nu && is_p) || (is_dmi && is_p)) {
1606 if((is_nu && is_n) || (is_dmi && is_n)) {
1610 if(is_nubar && is_p) {
1614 if(is_nubar && is_n) {
1619 <<
"Invalid initial state: " << init_state;
1638 if(is_lbar && is_p) {
1642 if(is_lbar && is_n) {
1647 <<
"Invalid initial state: " << init_state;
1655 int nbins = mp->GetNbinsX();
1656 for(
int i = 1; i <=
nbins; i++) {
1657 int n = TMath::Nint( mp->GetBinCenter(i) );
1661 else if (n==3) R=R3;
1664 double P = mp->GetBinContent(i);
1667 <<
"n=" << n <<
"/ Scaling factor R = " 1668 << R <<
"/ P " << P <<
" --> " << Psc;
1669 mp->SetBinContent(i, Psc);
1676 double histo_norm = mp->Integral(
"width");
1677 if(histo_norm>0) mp->Scale(1.0/histo_norm);
double fRvnCCm2
Rijk: vn, CC, multiplicity = 2.
double W(bool selected=false) const
bool IsWeakCC(void) const
double fPpi0eta
{Pi0 eta} production probability
bool IsNeutrino(int pdgc)
THE MAIN GENIE PROJECT NAMESPACE
double ReWeightPt2(const PDGCodeList &pdgcv) const
double fRvbnNCm2
Rijk: vbn, NC, multiplicity = 2.
static const double kNucleonMass
double fRvbnCCm2
Rijk: vbn, CC, multiplicity = 2.
double fWcut
Rijk applied for W<Wcut (see DIS/RES join scheme)
int HadronShowerCharge(const Interaction *) const
static RandomGen * Instance()
Access instance.
int HitNucPdg(void) const
Defines the EventRecordVisitorI interface. Concrete implementations of this interface use the 'Visito...
double fAvn
offset in average charged hadron multiplicity = f(W) relation for vn
enum genie::EGHepStatus GHepStatus_t
bool IsNucleus(void) const
double fPeta
{eta eta} production probability
TClonesArray * Hadronize(const Interaction *) const
double fCvp
Levy function parameter for vp.
double fCvbp
Levy function parameter for vbp.
string P4AsString(const TLorentzVector *p)
double fRvnNCm2
Rijk: vn, NC, multiplicity = 2.
bool fReWeightDecays
Reweight phase space decays?
static const unsigned int kMaxUnweightDecayIterations
virtual ~KNOHadronization()
bool IsDarkMatter(int pdgc)
TF1 * fBaryonPT2pdf
baryon pT^2 PDF
bool IsChargedLepton(int pdgc)
TParticlePDG * Probe(void) const
virtual double Weight(void) const
double Mass(Resonance_t res)
resonance mass (GeV)
TClonesArray * DecayMethod2(double W, const PDGCodeList &pdgv, bool reweight_decays) const
PDGCodeList * SelectParticles(const Interaction *) const
TH1D * CreateMultProbHist(double maxmult) const
double fRvbpCCm3
Rijk: vbp, CC, multiplicity = 3.
double fPpi0
{pi0 pi0 } production probability
A singleton holding random number generator classes. All random number generation in GENIE should tak...
double Pz(void) const
Get Pz.
double fPK0
{K0 K0bar} production probability
double fRvbpNCm2
Rijk: vbp, NC, multiplicity = 2.
void HandleDecays(TClonesArray *particle_list) const
double Px(void) const
Get Px.
bool fForceNeuGenLimit
force upper hadronic multiplicity to NeuGEN limit
bool IsCharmEvent(void) const
double W(const Interaction *const i)
double MaxMult(const Interaction *i) const
double fRvpCCm2
Rijk: vp, CC, multiplicity = 2.
bool PhaseSpaceDecay(TClonesArray &pl, TLorentzVector &pd, const PDGCodeList &pdgv, int offset=0, bool reweight=false) const
double fRvbnCCm3
Rijk: vbn, CC, 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...
int GenerateBaryonPdgCode(int mult, int maxQ, double W) const
bool IsWeakNC(void) const
double fRvbpCCm2
Rijk: vbp, CC, multiplicity = 2.
double fBvbp
slope in average charged hadron multiplicity = f(W) relation for vbp
void ProcessEventRecord(GHepRecord *event) const
PDGCodeList * GenerateHadronCodes(int mult, int maxQ, double W) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
double fAvp
offset in average charged hadron multiplicity = f(W) relation for vp
double fCvbn
Levy function parameter for vbn.
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
double fBhyperon
see above
bool IsAntiNeutrino(int pdgc)
const Kinematics & Kine(void) const
virtual void Configure(const Registry &config)
static const double kNeutronMass
double KNO(int nu, int nuc, double z) const
bool fGenerateWeighted
generate weighted events?
double fAvbn
offset in average charged hadron multiplicity = f(W) relation for vbn
TH1D * MultiplicityProb(const Interaction *, Option_t *opt="") const
bool AssertValidity(const Interaction *i) const
double fPKc
{K+ K- } production probability
double fWeight
weight for generated event
Misc GENIE control constants.
TClonesArray * DecayBackToBack(double W, const PDGCodeList &pdgv) const
double fRvbnNCm3
Rijk: vbn, NC, multiplicity = 3.
void Initialize(void) const
double fRvbpNCm3
Rijk: vbp, NC, multiplicity = 3.
auto norm(Vector const &v)
Return norm of the specified vector.
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
Simple printing utilities.
double fCvn
Levy function parameter for vn.
TGenPhaseSpace fPhaseSpaceGenerator
a phase space generator
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
bool IsNeutralLepton(int pdgc)
double fPhSpRwA
parameter for phase space decay reweighting
bool fUseIsotropic2BDecays
force isotropic, non-reweighted 2-body decays for consistency with neugen/daikon
double fBvn
slope in average charged hadron multiplicity = f(W) relation for vn
double fBvp
slope in average charged hadron multiplicity = f(W) relation for vp
TRandom3 & RndHadro(void) const
rnd number generator used by hadronization models
void SwitchOnFastForward(void)
double fAhyperon
parameter controlling strange baryon production probability via associated production (P=a+b*lnW^2) ...
static PDGLibrary * Instance(void)
void SetReason(string reason)
static const double kPionMass
Singleton class to load & serve a TDatabasePDG.
const TLorentzVector * X4(void) const
double Weight(void) const
bool IsDarkMatter(void) const
A registry. Provides the container for algorithm configuration parameters.
double fRvpNCm3
Rijk: vp, NC, multiplicity = 3.
const XclsTag & ExclTag(void) const
double AverageChMult(int nu, int nuc, double W) const
bool IsNeutronOrProton(int pdgc)
double fBvbn
slope in average charged hadron multiplicity = f(W) relation for vbn
bool fUseBaryonXfPt2Param
Generate baryon xF,pT2 from experimental parameterization?
TParticlePDG * Find(int pdgc)
TClonesArray * DecayMethod1(double W, const PDGCodeList &pdgv, bool reweight_decays) const
double fRvnCCm3
Rijk: vn, CC, multiplicity = 3.
const InitialState & InitState(void) const
double fRvnNCm3
Rijk: vn, NC, multiplicity = 3.
const ProcessInfo & ProcInfo(void) const
bool fForceMinMult
force minimum multiplicity if (at low W) generated less?
static const unsigned int kMaxKNOHadSystIterations
double fRvpCCm3
Rijk: vp, CC, multiplicity = 3.
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 fPpic
{pi+ pi- } production probability
#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.
virtual void Configure(const Registry &config)
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 IsNegChargedLepton(int pdgc)
cet::coded_exception< error, detail::translate > exception
void push_back(int pdg_code)
Event finding and building.
void ApplyRijk(const Interaction *i, bool norm, TH1D *mp) const
TF1 * fBaryonXFpdf
baryon xF PDF
Initial State information.
double fRvpNCm2
Rijk: vp, NC, multiplicity = 2.
double Py(void) const
Get Py.
double fAvbp
offset in average charged hadron multiplicity = f(W) relation for vbp