15 #include "Math/Minimizer.h"
16 #include "Math/Factory.h"
45 using namespace genie;
46 using namespace genie::utils;
47 using namespace genie::constants;
48 using namespace genie::controls;
87 }
else if (
fXSecModel->
Id().
Name() ==
"genie::NievesSimoVacasMECPXSec2016") {
110 "ProcessEventRecord >> Cannot calculate kinematics for " <<
134 const TLorentzVector & p4cluster = *(cluster->
P4());
135 const TLorentzVector & p4tgt = *(target ->
P4());
137 const TLorentzVector p4 = p4tgt - p4cluster;
138 const TLorentzVector v4(0.,0.,0., 0.);
140 int momidx =
event->TargetNucleusPosition();
173 assert(target_nucleus);
175 assert(nucleon_cluster);
176 GHepParticle * remnant_nucleus =
event->RemnantNucleus();
177 assert(remnant_nucleus);
183 assert(pdgv.size()==2);
184 tgt.SetHitNucPdg(pdgv[0]);
187 tgt.SetHitNucPdg(pdgv[1]);
192 <<
"1st nucleon (code = " << pdgv[0] <<
") generated momentum: ("
193 << p3a.Px() <<
", " << p3a.Py() <<
", " << p3a.Pz() <<
"), "
194 <<
"|p| = " << p3a.Mag();
196 <<
"2nd nucleon (code = " << pdgv[1] <<
") generated momentum: ("
197 << p3b.Px() <<
", " << p3b.Py() <<
", " << p3b.Pz() <<
"), "
198 <<
"|p| = " << p3b.Mag();
202 TVector3 p3 = p3a + p3b;
205 <<
"di-nucleon cluster momentum: ("
206 << p3.Px() <<
", " << p3.Py() <<
", " << p3.Pz() <<
"), "
207 <<
"|p| = " << p3.Mag();
216 double EN = TMath::Sqrt(p3.Mag2() + M2n*M2n);
220 TLorentzVector p4nclust ( p3.Px(), p3.Py(), p3.Pz(), EN );
221 TLorentzVector p4remnant (-1*p3.Px(), -1*p3.Py(), -1*p3.Pz(), Mi-EN);
228 event->Summary()->InitStatePtr()->TgtPtr()->SetHitNucP4(p4nclust);
256 double dQ2 = (Q2max-Q2min) / (nq-1);
257 double dW = (Wmax-Wmin ) / (nw-1);
259 for(
int iw=0; iw<nw; iw++) {
260 for(
int iq=0; iq<nq; iq++) {
261 double Q2 = Q2min + iq*dQ2;
262 double W = Wmin + iw*dW;
266 xsec_max = TMath::Max(xsec, xsec_max);
269 LOG(
"MEC",
pNOTICE) <<
"xsec_max (E = " << Ev <<
" GeV) = " << xsec_max;
273 unsigned int iter = 0;
279 <<
"Couldn't select a valid W, Q^2 pair after "
280 << iter <<
" iterations";
281 event->EventFlags()->SetBitNumber(
kKineGenErr,
true);
283 exception.
SetReason(
"Couldn't select kinematics");
289 double gQ2 = Q2min + (Q2max-Q2min) * rnd->
RndKine().Rndm();
290 double gW = Wmin + (Wmax -Wmin ) * rnd->
RndKine().Rndm();
298 double t = xsec_max * rnd->
RndKine().Rndm();
300 accept = (t < J*xsec);
304 LOG(
"MEC",
pINFO) <<
"Selected: Q^2 = " << gQ2 <<
", W = " << gW;
313 LOG(
"MEC",
pINFO) <<
"x = " << gx <<
", y = " << gy;
335 const TLorentzVector & pnuc4 = init_state.
Tgt().
HitNucP4();
336 TVector3 beta = pnuc4.BoostVector();
340 TLorentzVector * p4v =
event->Probe()->GetP4();
341 p4v->Boost(-1.*beta);
344 double Q2 = interaction->
Kine().
Q2(
true);
345 double y = interaction->
Kine().
y(
true);
349 LOG(
"MEC",
pNOTICE) <<
"neutrino energy = " << Ev;
351 double ml2 = TMath::Power(ml,2);
355 double El = (1-y)*Ev;
356 double plp = El - 0.5*(Q2+ml2)/Ev;
357 double plt = TMath::Sqrt(TMath::Max(0.,El*El-plp*plp-ml2));
360 <<
"fsl: E = " << El <<
", |p//| = " << plp <<
", |pT| = " << plt;
364 double phi = 2*
kPi * rnd->
RndLep().Rndm();
365 double pltx = plt * TMath::Cos(phi);
366 double plty = plt * TMath::Sin(phi);
370 TVector3 unit_nudir = p4v->Vect().Unit();
373 TVector3 p3l(pltx,plty,plp);
374 p3l.RotateUz(unit_nudir);
377 TLorentzVector p4l(p3l,El);
386 TLorentzVector v4(*event->
Probe()->
X4());
389 int momidx =
event->ProbePosition();
401 assert(nucleon_cluster);
402 TLorentzVector * tmp=nucleon_cluster->
GetP4();
403 TLorentzVector p4cluster(*tmp);
409 TLorentzVector p4v(*neutrino->
P4());
414 TLorentzVector p4l(*fsl->P4());
417 TLorentzVector q = p4v - p4l;
420 TLorentzVector p4cluster_recoil = p4cluster + q;
423 LOG(
"MEC",
pINFO) <<
"Interaction summary";
424 LOG(
"MEC",
pINFO) << *
event->Summary();
425 int recoil_nucleon_cluster_pdg =
event->Summary()->RecoilNucleonPdg();
428 TLorentzVector v4(*neutrino->
X4());
433 2, -1, -1, -1, p4cluster_recoil, v4);
441 LOG(
"MEC",
pINFO) <<
"Decaying nucleon cluster...";
444 int nucleon_cluster_id = 5;
445 GHepParticle * nucleon_cluster =
event->Particle(nucleon_cluster_id);
446 assert(nucleon_cluster);
450 LOG(
"MEC",
pINFO) <<
"Decay product IDs: " << pdgv;
453 vector<int>::const_iterator pdg_iter;
455 double * mass =
new double[pdgv.size()];
457 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
458 int pdgc = *pdg_iter;
465 <<
"Performing a phase space decay to "
466 << pdgv.size() <<
" particles / total mass = " << sum;
468 TLorentzVector * p4d = nucleon_cluster->
GetP4();
469 TLorentzVector * v4d = nucleon_cluster->
GetX4();
478 <<
" *** Phase space decay is not permitted \n"
479 <<
" Total particle mass = " << sum <<
"\n"
488 exception.
SetReason(
"Decay not permitted kinematically");
496 for(
int idec=0; idec<200; idec++) {
498 wmax = TMath::Max(wmax,w);
504 <<
"Max phase space gen. weight = " << wmax;
507 bool accept_decay=
false;
516 <<
"Couldn't generate an unweighted phase space decay after "
517 << itry <<
" attempts";
525 exception.
SetReason(
"Couldn't select decay after N attempts");
533 <<
"Decay weight = " << w <<
" > max decay weight = " << wmax;
535 double gw = wmax * rnd->
RndDec().Rndm();
536 accept_decay = (gw<=w);
539 <<
"Decay weight = " << w <<
" / R = " << gw
540 <<
" - accepted: " << accept_decay;
545 TLorentzVector v4(*v4d);
548 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
549 int pdgc = *pdg_iter;
551 event->AddParticle(pdgc, ist, nucleon_cluster_id,-1,-1,-1, *p4fin, v4);
563 bool allowdup =
true;
583 <<
"Unknown di-nucleon cluster PDG code (" << pdgc <<
")";
595 int FullDeltaNodelta = 1;
606 TLorentzVector v4(*event->
Probe()->
X4());
607 TLorentzVector tempp4(0.,0.,0.,0.);
611 double CosthMax = 1.0;
612 double CosthMin = -1.0;
615 double TMax = std::numeric_limits<double>::max();
629 TMax = Enu - LepMass;
637 <<
"fQ3 max is larger than expected for Valencia MEC: "
638 <<
fQ3Max <<
". Are you sure this is correct?";
649 TMin = TMath::Sqrt(TMath::Power(LepMass, 2) + TMath::Power((Enu -
fQ3Max), 2)) - LepMass;
650 CosthMin = TMath::Sqrt(1 - TMath::Power((
fQ3Max / Enu ), 2));
655 Range1D_t ctl_range ( CosthMin, CosthMax ) ;
656 double XSecMax =
GetXSecMaxTlctl( *interaction, Tl_range, ctl_range ) ;
662 unsigned int iter = 0;
670 <<
"Couldn't select a valid Tmu, CosTheta pair after "
671 << iter <<
" iterations";
672 event->EventFlags()->SetBitNumber(
kKineGenErr,
true);
674 exception.
SetReason(
"Couldn't select lepton kinematics");
680 T = TMin + (TMax-TMin)*rnd->
RndKine().Rndm();
681 Costh = CosthMin + (CosthMax-CosthMin)*rnd->
RndKine().Rndm();
687 if (Q3 >
fQ3Max) continue ;
689 Plep = TMath::Sqrt( T * (T + (2.0 * LepMass)));
698 if (FullDeltaNodelta == 1){
722 if (XSec > XSecMax) {
723 LOG(
"MEC",
pERROR) <<
"XSec is > XSecMax for nucleus " << TgtPDG <<
" "
724 << XSec <<
" > " << XSecMax
725 <<
" don't let this happen.";
727 assert(XSec <= XSecMax);
728 accept = XSec > XSecMax*rnd->
RndKine().Rndm();
729 LOG(
"MEC",
pINFO) <<
"Xsec, Max, Accept: " << XSec <<
", "
730 << XSecMax <<
", " << accept;
743 double myrand = rnd->
RndKine().Rndm();
744 double pnFraction = XSecPN / XSec;
745 LOG(
"MEC",
pDEBUG) <<
"Test for pn: xsec_pn = " << XSecPN
746 <<
"; xsec = " << XSec
747 <<
"; pn_fraction = " << pnFraction
748 <<
"; random number val = " << myrand;
750 if (myrand <= pnFraction) {
753 1, -1, -1, -1, tempp4, v4);
757 if (rnd->
RndKine().Rndm() <= XSecDeltaPN / XSecPN) {
765 1, -1, -1, -1, tempp4, v4);
770 1, -1, -1, -1, tempp4, v4);
776 (XSecDelta - XSecDeltaPN) / (XSec - XSecPN)) {
808 double PlepZ = Plep * Costh;
809 double PlepXY = Plep * TMath::Sqrt(1. - TMath::Power(Costh,2));
812 double phi= 2 *
kPi * rnd->
RndLep().Rndm();
814 double PlepX = PlepXY * TMath::Cos(phi);
815 double PlepY = PlepXY * TMath::Sin(phi);
819 TVector3 unit_nudir =
event->Probe()->P4()->Vect().Unit();
820 TVector3 p3l(PlepX, PlepY, PlepZ);
821 p3l.RotateUz(unit_nudir);
824 Elep = TMath::Sqrt(LepMass*LepMass + PlepX*PlepX + PlepY*PlepY + PlepZ*PlepZ);
825 TLorentzVector p4l(p3l,Elep);
829 int momidx =
event->ProbePosition();
834 double gy = Q0 / Enu;
852 LOG(
"MEC",
pDEBUG) <<
"~~~ LEPTON DONE ~~~";
865 if ( interaction->
ProcInfo().
IsEM() ) Q2min = genie::utils::kinematics
868 LOG(
"MEC",
pDEBUG) <<
"Q2min = " << Q2min;
876 TLorentzVector v4( *event->
Probe()->
X4() );
877 TLorentzVector tempp4( 0., 0., 0., 0. );
881 double CosthMax = 1.0;
882 double CosthMin = -1.0;
885 double TMax = std::numeric_limits<double>::max();
899 TMax = Enu - LepMass;
907 <<
"fQ3 max is smaller than expected for SuSAv2 MEC: "
908 <<
fQ3Max <<
". Are you sure this is correct?";
921 TMin = TMath::Sqrt( TMath::Power(LepMass, 2) + TMath::Power(Enu -
fQ3Max, 2) ) - LepMass;
922 CosthMin = TMath::Sqrt( 1. - TMath::Power(
fQ3Max / Enu, 2) );
929 unsigned int iter = 0;
934 if ( NuPDG == 11 ) maxIter *= 100000;
943 if ( iter > maxIter ) {
946 <<
"Couldn't select a valid Tmu, CosTheta pair after "
947 << iter <<
" iterations";
948 event->EventFlags()->SetBitNumber(
kKineGenErr,
true );
950 exception.
SetReason(
"Couldn't select lepton kinematics" );
956 T = TMin + (TMax-TMin)*rnd->
RndKine().Rndm();
957 Costh = CosthMin + (CosthMax-CosthMin)*rnd->
RndKine().Rndm();
960 Plep = TMath::Sqrt( T * (T + (2.0 * LepMass)));
961 Q3 = TMath::Sqrt(Plep*Plep + Enu*Enu - 2.0 * Plep * Enu * Costh);
964 Q0 = Enu - (T + LepMass);
967 LOG(
"MEC",
pDEBUG) <<
"T = " << T <<
", Costh = " << Costh
972 if ( Q3 < fQ3Max && Q2 >= Q2min ) {
980 LOG(
"MEC",
pDEBUG) <<
" T, Costh: " << T <<
", " << Costh ;
985 if ( XSec > XSecMax ) {
986 LOG(
"MEC",
pERROR) <<
"XSec is > XSecMax for nucleus " << TgtPDG <<
" "
987 << XSec <<
" > " << XSecMax <<
" don't let this happen.";
989 double percent_deviation = 200. * ( XSec - XSecMax ) / ( XSecMax + XSec );
992 LOG(
"Kinematics",
pFATAL ) <<
"xsec: (curr) = " << XSec
993 <<
" > (max) = " << XSecMax <<
"\n for " << *interaction;
995 <<
"*** Exceeding estimated maximum differential cross section";
999 LOG(
"Kinematics",
pWARN ) <<
"xsec: (curr) = " << XSec
1000 <<
" > (max) = " << XSecMax <<
"\n for " << *interaction;
1001 LOG(
"Kinematics",
pWARN) <<
"*** The fractional deviation of "
1002 << percent_deviation <<
" % was allowed";
1006 accept = XSec > XSecMax*rnd->
RndKine().Rndm();
1007 LOG(
"MEC",
pINFO) <<
"Xsec, Max, Accept: " << XSec <<
", "
1008 << XSecMax <<
", " << accept;
1015 double myrand_pn = rnd->
RndKine().Rndm();
1017 ->PairRatio( interaction );
1019 LOG(
"MEC",
pINFO) <<
"Test for pn: "
1020 <<
"; xsec = " << XSec <<
"; pn_fraction = " << pnFraction
1021 <<
"; random number val = " << myrand_pn;
1023 double myrand_pp = rnd->
RndKine().Rndm();
1024 double ppFraction = 0 ;
1029 ->PairRatio( interaction ,
"ppFraction");
1031 LOG(
"MEC",
pINFO) <<
"Test for pp: "
1032 <<
"; xsec = " << XSec <<
"; pp_fraction = " << ppFraction
1033 <<
"; random number val = " << myrand_pp;
1036 if ( myrand_pn <= pnFraction ) {
1039 1, -1, -1, -1, tempp4, v4);
1045 if ( myrand_pp <= ppFraction/(1. - pnFraction) ) {
1048 1, -1, -1, -1, tempp4, v4);
1053 1, -1, -1, -1, tempp4, v4);
1060 1, -1, -1, -1, tempp4, v4);
1065 1, -1, -1, -1, tempp4, v4);
1081 double PlepZ = Plep * Costh;
1082 double PlepXY = Plep * TMath::Sqrt( 1. - TMath::Power(Costh,2) );
1085 double phi = 2. *
kPi * rnd->
RndLep().Rndm();
1087 double PlepX = PlepXY * TMath::Cos(phi);
1088 double PlepY = PlepXY * TMath::Sin(phi);
1092 TVector3 unit_nudir =
event->Probe()->P4()->Vect().Unit();
1093 TVector3 p3l( PlepX, PlepY, PlepZ );
1094 p3l.RotateUz( unit_nudir );
1097 Elep = TMath::Sqrt( LepMass*LepMass + PlepX*PlepX + PlepY*PlepY + PlepZ*PlepZ );
1098 TLorentzVector p4l( p3l, Elep );
1102 int momidx =
event->ProbePosition();
1108 double gy = Q0 / Enu;
1123 LOG(
"MEC",
pDEBUG) <<
"~~~ LEPTON DONE ~~~";
1131 LOG(
"MEC",
pDEBUG) <<
"Generate Initial Hadrons - Start";
1136 TLorentzVector p4nu(*neutrino->
P4());
1141 TLorentzVector p4l(*fsl->P4());
1144 TLorentzVector Q4 = p4nu - p4l;
1148 GHepParticle * target_nucleus =
event->TargetNucleus();
1149 assert(target_nucleus);
1150 GHepParticle * initial_nucleon_cluster =
event->HitNucleon();
1151 assert(initial_nucleon_cluster);
1152 GHepParticle * remnant_nucleus =
event->RemnantNucleus();
1153 assert(remnant_nucleus);
1166 assert(pdgv.size()==2);
1169 bool accept =
false;
1172 unsigned int iter = 0;
1174 int initial_nucleon_cluster_pdg = initial_nucleon_cluster->
Pdg();
1175 int final_nucleon_cluster_pdg = 0;
1178 if (neutrino->
Pdg() == 11) {
1179 final_nucleon_cluster_pdg = initial_nucleon_cluster->
Pdg();
1182 else if (neutrino->
Pdg() > 0) {
1190 LOG(
"MEC",
pERROR) <<
"Wrong pdg for a CC neutrino MEC interaction"
1191 << initial_nucleon_cluster->
Pdg();
1194 else if (neutrino->
Pdg() < 0) {
1202 LOG(
"MEC",
pERROR) <<
"Wrong pdg for a CC anti-neutrino MEC interaction"
1203 << initial_nucleon_cluster->
Pdg();
1207 TLorentzVector p4initial_cluster;
1208 TLorentzVector p4final_cluster;
1209 TLorentzVector p4remnant_nucleus;
1210 double removalenergy1;
1211 double removalenergy2;
1223 <<
"Couldn't select a valid W, Q^2 pair after "
1224 << iter <<
" iterations";
1225 event->EventFlags()->SetBitNumber(
kKineGenErr,
true);
1227 exception.
SetReason(
"Couldn't select initial hadron kinematics");
1238 tgt.SetHitNucPdg(pdgv[0]);
1242 tgt.SetHitNucPdg(pdgv[1]);
1250 TVector3 p3i = p31i + p32i;
1253 double energy = TMath::Sqrt(p3i.Mag2() + mass2);
1254 p4initial_cluster.SetPxPyPzE(p3i.Px(),p3i.Py(),p3i.Pz(),energy);
1257 TLorentzVector tLVebind(0., 0., 0., -1.0 * (removalenergy1 + removalenergy2));
1272 p4final_cluster = p4initial_cluster + Q4 + tLVebind;
1276 if (p4final_cluster.M() <
1289 initial_nucleon_cluster->
SetMomentum(p4initial_cluster);
1293 remnant_nucleus->
SetMomentum(-1.0*p4initial_cluster.Px(),
1294 -1.0*p4initial_cluster.Py(),
1295 -1.0*p4initial_cluster.Pz(),
1296 Mi - p4initial_cluster.E() + removalenergy1 + removalenergy2);
1303 TLorentzVector v4(*neutrino->
X4());
1307 2, -1, -1, -1, p4final_cluster, v4);
1316 event->AddParticle(p1);
1336 RgKey nuclkey =
"NuclearModel";
1358 ROOT::Math::Minimizer * min = ROOT::Math::Factory::CreateMinimizer(
"Minuit2");
1365 std::array<string,2> names = {
"Tl",
"CosThetal" } ;
1366 std::array<Range1D_t,2> ranges = { Tl_range, ctl_range } ;
1368 std::array<double,2> start, steps, temp_point ;
1376 temp_point[0] = ranges[0].
min + steps[0]*i ;
1379 temp_point[1] = ranges[1].min + steps[1]*j ;
1381 double temp_xsec = - f( temp_point.data() ) ;
1382 if ( temp_xsec > xsec ) {
1383 start = temp_point ;
1390 min->SetFunction( f );
1394 for (
unsigned int i = 0 ; i < ranges.size() ; ++i ) {
1395 min -> SetLimitedVariable( i, names[i], start[i], steps[i], ranges[i].min, ranges[i].max ) ;
1400 double max_xsec = -min->MinValue();
void ProcessEventRecord(GHepRecord *event) const
TLorentzVector * GetX4(void) const
void SelectNSVLeptonKinematics(GHepRecord *event) const
double RemovalEnergy(void) const
const NuclearModelI * fNuclModel
double J(double q0, double q3, double Enu, double ml)
TRandom3 & RndLep(void) const
rnd number generator used by final state primary lepton generators
static const double kNucleonMass
double Q2(const Interaction *const i)
static RandomGen * Instance()
Access instance.
int HitNucPdg(void) const
void SetQ2(double Q2, bool selected=false)
const TLorentzVector * P4(void) const
Kinematics * KinePtr(void) const
Defines the EventRecordVisitorI interface. Concrete implementations of this interface use the 'Visito...
A simple [min,max] interval for doubles.
void Configure(const Registry &config)
double GetMaxXSecTlctl(const XSecAlgorithmI &xsec_model, const Interaction &inter, const double tolerance=0.01, const double safety_factor=1.2, const int max_n_layers=100)
Defines the EventGeneratorI interface.
Generated/set kinematical variables for an event.
double GetXSecMaxTlctl(const Interaction &inter, const Range1D_t &Tl_range, const Range1D_t &ctl_range) const
string P4AsString(const TLorentzVector *p)
static const unsigned int kMaxUnweightDecayIterations
Pure abstract base class. Defines the NuclearModelI interface to be implemented by any physics model ...
double Mass(Resonance_t res)
resonance mass (GeV)
void SetMomentum(const TLorentzVector &p4)
A singleton holding random number generator classes. All random number generation in GENIE should tak...
void SetResonance(Resonance_t res)
double XYtoW(double Ev, double M, double x, double y)
Computes the SuSAv2-MEC model differential cross section. Uses precomputed hadron tensor tables...
const TVector3 & Momentum3(void) const
static const double kMinQ2Limit
virtual GHepParticle * Probe(void) const
double y(bool selected=false) const
double W(const Interaction *const i)
void GenerateNSVInitialHadrons(GHepRecord *event) const
Summary information for an interaction.
const TLorentzVector & HitNucP4(void) const
An exception thrown by EventRecordVisitorI when the normal processing sequence has to be disrupted (f...
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
void SetFSLeptonP4(const TLorentzVector &p4)
static constexpr double A
void RecoilNucleonCluster(GHepRecord *event) const
void DecayNucleonCluster(GHepRecord *event) const
TLorentzVector * GetP4(void) const
void WQ2toXY(double Ev, double M, double W, double Q2, double &x, double &y)
const Kinematics & Kine(void) const
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
virtual void Configure(const Registry &config)
bool Getq0q3FromTlCostl(double Tl, double costl, double Enu, double ml, double &q0, double &q3)
TRandom3 & RndKine(void) const
rnd number generator used by kinematics generators
void SelectSuSALeptonKinematics(GHepRecord *event) const
PDGCodeList NucleonClusterConstituents(int pdgc) const
void SelectEmpiricalKinematics(GHepRecord *event) const
virtual double XSec(const Interaction *i, KinePhaseSpace_t k=kPSfE) const =0
Compute the cross section for the input interaction.
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
void Setx(double x, bool selected=false)
void SetReturnStep(int s)
XclsTag * ExclTagPtr(void) const
void SetKV(KineVar_t kv, double value)
static RunningThreadInfo * Instance(void)
virtual const AlgId & Id(void) const
Get algorithm ID.
void SetW(double W, bool selected=false)
void SwitchOnFastForward(void)
static PDGLibrary * Instance(void)
void SetReason(string reason)
double Q2YtoX(double Ev, double M, double Q2, double y)
const TLorentzVector * X4(void) const
A registry. Provides the container for algorithm configuration parameters.
void SetHitNucPdg(int pdgc)
void Sety(double y, bool selected=false)
Target * TgtPtr(void) const
int IonPdgCode(int A, int Z)
const XSecAlgorithmI * fXSecModel
virtual const XSecAlgorithmI * CrossSectionAlg(void) const =0
void SwitchOnStepBack(void)
void SetHadSystP4(const TLorentzVector &p4)
InitialState * InitStatePtr(void) const
const InitialState & InitState(void) const
void AddTargetRemnant(GHepRecord *event) const
const ProcessInfo & ProcInfo(void) const
void GenerateFermiMomentum(GHepRecord *event) const
TParticlePDG * Find(int pdgc, bool must_exist=true)
double Q2(bool selected=false) const
void ClearRunningValues(void)
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
static const unsigned int kRjMaxIterations
const EventGeneratorI * RunningThread(void)
virtual bool GenerateNucleon(const Target &) const =0
void SetPrimaryLeptonPolarization(GHepRecord *ev)
double ProbeE(RefFrame_t rf) const
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...
TRandom3 & RndDec(void) const
rnd number generator used by decay models
STDHEP-like event record entry that can fit a particle or a nucleus.
Keep info on the event generation thread currently on charge. This is used so that event generation m...
void AddFinalStateLepton(GHepRecord *event) const
void push_back(int pdg_code)
TGenPhaseSpace fPhaseSpaceGenerator
enum genie::EGHepStatus GHepStatus_t
double fSuSAMaxXSecDiffTolerance
Initial State information.
const Algorithm * SubAlg(const RgKey ®istry_key) const