15 #include "Math/Minimizer.h" 16 #include "Math/Factory.h" 45 using namespace genie;
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;
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;
629 TMax = Enu - LepMass;
639 TMin = TMath::Sqrt(TMath::Power(LepMass, 2) + TMath::Power((Enu -
fQ3Max), 2)) - LepMass;
640 CosthMin = TMath::Sqrt(1 - TMath::Power((
fQ3Max / Enu ), 2));
645 Range1D_t ctl_range ( CosthMin, CosthMax ) ;
646 double XSecMax =
GetXSecMaxTlctl( *interaction, Tl_range, ctl_range ) ;
652 unsigned int iter = 0;
660 <<
"Couldn't select a valid Tmu, CosTheta pair after " 661 << iter <<
" iterations";
662 event->EventFlags()->SetBitNumber(
kKineGenErr,
true);
664 exception.
SetReason(
"Couldn't select lepton kinematics");
670 T = TMin + (TMax-TMin)*rnd->
RndKine().Rndm();
671 Costh = CosthMin + (CosthMax-CosthMin)*rnd->
RndKine().Rndm();
677 if (Q3 >
fQ3Max) continue ;
679 Plep = TMath::Sqrt( T * (T + (2.0 * LepMass)));
688 if (FullDeltaNodelta == 1){
712 if (XSec > XSecMax) {
713 LOG(
"MEC",
pERROR) <<
"XSec is > XSecMax for nucleus " << TgtPDG <<
" " 714 << XSec <<
" > " << XSecMax
715 <<
" don't let this happen.";
717 assert(XSec <= XSecMax);
718 accept = XSec > XSecMax*rnd->
RndKine().Rndm();
719 LOG(
"MEC",
pINFO) <<
"Xsec, Max, Accept: " << XSec <<
", " 720 << XSecMax <<
", " << accept;
733 double myrand = rnd->
RndKine().Rndm();
734 double pnFraction = XSecPN / XSec;
735 LOG(
"MEC",
pDEBUG) <<
"Test for pn: xsec_pn = " << XSecPN
736 <<
"; xsec = " << XSec
737 <<
"; pn_fraction = " << pnFraction
738 <<
"; random number val = " << myrand;
740 if (myrand <= pnFraction) {
743 1, -1, -1, -1, tempp4, v4);
747 if (rnd->
RndKine().Rndm() <= XSecDeltaPN / XSecPN) {
755 1, -1, -1, -1, tempp4, v4);
760 1, -1, -1, -1, tempp4, v4);
766 (XSecDelta - XSecDeltaPN) / (XSec - XSecPN)) {
798 double PlepZ = Plep * Costh;
799 double PlepXY = Plep * TMath::Sqrt(1. - TMath::Power(Costh,2));
802 double phi= 2 *
kPi * rnd->
RndLep().Rndm();
804 double PlepX = PlepXY * TMath::Cos(phi);
805 double PlepY = PlepXY * TMath::Sin(phi);
809 TVector3 unit_nudir =
event->Probe()->P4()->Vect().Unit();
810 TVector3 p3l(PlepX, PlepY, PlepZ);
811 p3l.RotateUz(unit_nudir);
814 Elep = TMath::Sqrt(LepMass*LepMass + PlepX*PlepX + PlepY*PlepY + PlepZ*PlepZ);
815 TLorentzVector p4l(p3l,Elep);
819 int momidx =
event->ProbePosition();
824 double gy = Q0 / Enu;
842 LOG(
"MEC",
pDEBUG) <<
"~~~ LEPTON DONE ~~~";
858 LOG(
"MEC",
pDEBUG) <<
"Q2min = " << Q2min;
866 TLorentzVector v4( *event->
Probe()->
X4() );
867 TLorentzVector tempp4( 0., 0., 0., 0. );
871 double CosthMax = 1.0;
872 double CosthMin = -1.0;
889 TMax = Enu - LepMass;
901 TMin = TMath::Sqrt( TMath::Power(LepMass, 2) + TMath::Power(Enu -
fQ3Max, 2) ) - LepMass;
902 CosthMin = TMath::Sqrt( 1. - TMath::Power(
fQ3Max / Enu, 2) );
909 unsigned int iter = 0;
914 if ( NuPDG == 11 ) maxIter *= 100000;
923 if ( iter > maxIter ) {
926 <<
"Couldn't select a valid Tmu, CosTheta pair after " 927 << iter <<
" iterations";
928 event->EventFlags()->SetBitNumber(
kKineGenErr,
true );
930 exception.
SetReason(
"Couldn't select lepton kinematics" );
936 T = TMin + (TMax-TMin)*rnd->
RndKine().Rndm();
937 Costh = CosthMin + (CosthMax-CosthMin)*rnd->
RndKine().Rndm();
940 Plep = TMath::Sqrt( T * (T + (2.0 * LepMass)));
941 Q3 = TMath::Sqrt(Plep*Plep + Enu*Enu - 2.0 * Plep * Enu * Costh);
944 Q0 = Enu - (T + LepMass);
947 LOG(
"MEC",
pDEBUG) <<
"T = " << T <<
", Costh = " << Costh
952 if ( Q3 < fQ3Max && Q2 >= Q2min ) {
960 LOG(
"MEC",
pDEBUG) <<
" T, Costh: " << T <<
", " << Costh ;
965 if ( XSec > XSecMax ) {
966 LOG(
"MEC",
pERROR) <<
"XSec is > XSecMax for nucleus " << TgtPDG <<
" " 967 << XSec <<
" > " << XSecMax <<
" don't let this happen.";
969 double percent_deviation = 200. * ( XSec - XSecMax ) / ( XSecMax + XSec );
972 LOG(
"Kinematics",
pFATAL ) <<
"xsec: (curr) = " << XSec
973 <<
" > (max) = " << XSecMax <<
"\n for " << *
interaction;
975 <<
"*** Exceeding estimated maximum differential cross section";
979 LOG(
"Kinematics",
pWARN ) <<
"xsec: (curr) = " << XSec
980 <<
" > (max) = " << XSecMax <<
"\n for " << *
interaction;
981 LOG(
"Kinematics",
pWARN) <<
"*** The fractional deviation of " 982 << percent_deviation <<
" % was allowed";
986 accept = XSec > XSecMax*rnd->
RndKine().Rndm();
987 LOG(
"MEC",
pINFO) <<
"Xsec, Max, Accept: " << XSec <<
", " 988 << XSecMax <<
", " << accept;
995 double myrand = rnd->
RndKine().Rndm();
997 ->PairRatio( interaction );
999 LOG(
"MEC",
pINFO) <<
"Test for pn: " 1000 <<
"; xsec = " << XSec <<
"; pn_fraction = " << pnFraction
1001 <<
"; random number val = " << myrand;
1003 if ( myrand <= pnFraction ) {
1006 1, -1, -1, -1, tempp4, v4);
1013 1, -1, -1, -1, tempp4, v4);
1018 1, -1, -1, -1, tempp4, v4);
1033 double PlepZ = Plep * Costh;
1034 double PlepXY = Plep * TMath::Sqrt( 1. - TMath::Power(Costh,2) );
1037 double phi = 2. *
kPi * rnd->
RndLep().Rndm();
1039 double PlepX = PlepXY * TMath::Cos(phi);
1040 double PlepY = PlepXY * TMath::Sin(phi);
1044 TVector3 unit_nudir =
event->Probe()->P4()->Vect().Unit();
1045 TVector3 p3l( PlepX, PlepY, PlepZ );
1046 p3l.RotateUz( unit_nudir );
1049 Elep = TMath::Sqrt( LepMass*LepMass + PlepX*PlepX + PlepY*PlepY + PlepZ*PlepZ );
1050 TLorentzVector p4l( p3l, Elep );
1054 int momidx =
event->ProbePosition();
1060 double gy = Q0 / Enu;
1075 LOG(
"MEC",
pDEBUG) <<
"~~~ LEPTON DONE ~~~";
1083 LOG(
"MEC",
pDEBUG) <<
"Generate Initial Hadrons - Start";
1088 TLorentzVector p4nu(*neutrino->
P4());
1093 TLorentzVector p4l(*fsl->P4());
1096 TLorentzVector Q4 = p4nu - p4l;
1100 GHepParticle * target_nucleus =
event->TargetNucleus();
1101 assert(target_nucleus);
1102 GHepParticle * initial_nucleon_cluster =
event->HitNucleon();
1103 assert(initial_nucleon_cluster);
1104 GHepParticle * remnant_nucleus =
event->RemnantNucleus();
1105 assert(remnant_nucleus);
1118 assert(pdgv.size()==2);
1121 bool accept =
false;
1124 unsigned int iter = 0;
1126 int initial_nucleon_cluster_pdg = initial_nucleon_cluster->
Pdg();
1127 int final_nucleon_cluster_pdg = 0;
1130 if (neutrino->
Pdg() == 11) {
1131 final_nucleon_cluster_pdg = initial_nucleon_cluster->
Pdg();
1134 else if (neutrino->
Pdg() > 0) {
1142 LOG(
"MEC",
pERROR) <<
"Wrong pdg for a CC neutrino MEC interaction" 1143 << initial_nucleon_cluster->
Pdg();
1146 else if (neutrino->
Pdg() < 0) {
1154 LOG(
"MEC",
pERROR) <<
"Wrong pdg for a CC anti-neutrino MEC interaction" 1155 << initial_nucleon_cluster->
Pdg();
1159 TLorentzVector p4initial_cluster;
1160 TLorentzVector p4final_cluster;
1161 TLorentzVector p4remnant_nucleus;
1162 double removalenergy1;
1163 double removalenergy2;
1175 <<
"Couldn't select a valid W, Q^2 pair after " 1176 << iter <<
" iterations";
1177 event->EventFlags()->SetBitNumber(
kKineGenErr,
true);
1179 exception.
SetReason(
"Couldn't select initial hadron kinematics");
1190 tgt.SetHitNucPdg(pdgv[0]);
1194 tgt.SetHitNucPdg(pdgv[1]);
1202 TVector3 p3i = p31i + p32i;
1205 double energy = TMath::Sqrt(p3i.Mag2() + mass2);
1206 p4initial_cluster.SetPxPyPzE(p3i.Px(),p3i.Py(),p3i.Pz(),
energy);
1209 TLorentzVector tLVebind(0., 0., 0., -1.0 * (removalenergy1 + removalenergy2));
1224 p4final_cluster = p4initial_cluster + Q4 + tLVebind;
1228 if (p4final_cluster.M() <
1241 initial_nucleon_cluster->
SetMomentum(p4initial_cluster);
1245 remnant_nucleus->
SetMomentum(-1.0*p4initial_cluster.Px(),
1246 -1.0*p4initial_cluster.Py(),
1247 -1.0*p4initial_cluster.Pz(),
1248 Mi - p4initial_cluster.E() + removalenergy1 + removalenergy2);
1255 TLorentzVector v4(*neutrino->
X4());
1259 2, -1, -1, -1, p4final_cluster, v4);
1268 event->AddParticle(p1);
1288 RgKey nuclkey =
"NuclearModel";
1310 ROOT::Math::Minimizer *
min = ROOT::Math::Factory::CreateMinimizer(
"Minuit2");
1317 std::array<string,2>
names = {
"Tl",
"CosThetal" } ;
1318 std::array<Range1D_t,2>
ranges = { Tl_range, ctl_range } ;
1320 std::array<double,2> start, steps, temp_point ;
1328 temp_point[0] = ranges[0].min + steps[0]*i ;
1331 temp_point[1] = ranges[1].min + steps[1]*j ;
1333 double temp_xsec = -
f( temp_point.data() ) ;
1334 if ( temp_xsec > xsec ) {
1335 start = temp_point ;
1342 min->SetFunction( f );
1346 for (
unsigned int i = 0 ; i < ranges.size() ; ++i ) {
1347 min -> SetLimitedVariable( i, names[i], start[i], steps[i], ranges[i].min, ranges[i].
max ) ;
1352 double max_xsec = -min->MinValue();
void ProcessEventRecord(GHepRecord *event) const
TLorentzVector * GetX4(void) const
double beta(double KE, const simb::MCParticle *part)
void SelectNSVLeptonKinematics(GHepRecord *event) const
double RemovalEnergy(void) const
const NuclearModelI * fNuclModel
double J(double q0, double q3, double Enu, double ml)
THE MAIN GENIE PROJECT NAMESPACE
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...
virtual double XSec(const Interaction *i, KinePhaseSpace_t k=kPSfE) const =0
Compute the cross section for the input interaction.
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)
Cluster finding and building.
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
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)
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)
static int max(int a, int b)
TRandom3 & RndKine(void) const
rnd number generator used by kinematics generators
void SelectSuSALeptonKinematics(GHepRecord *event) const
Misc GENIE control constants.
PDGCodeList NucleonClusterConstituents(int pdgc) const
void SelectEmpiricalKinematics(GHepRecord *event) const
virtual const XSecAlgorithmI * CrossSectionAlg(void) const =0
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)
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
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
void SwitchOnStepBack(void)
void SetHadSystP4(const TLorentzVector &p4)
InitialState * InitStatePtr(void) const
virtual bool GenerateNucleon(const Target &) const =0
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 std::vector< std::string > const names
static const unsigned int kRjMaxIterations
const EventGeneratorI * RunningThread(void)
void SetPrimaryLeptonPolarization(GHepRecord *ev)
double ProbeE(RefFrame_t rf) const
GENIE's GHEP MC event record.
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
Root of GENIE utility namespaces.
cet::coded_exception< error, detail::translate > exception
void push_back(int pdg_code)
Event finding and building.
TGenPhaseSpace fPhaseSpaceGenerator
enum genie::EGHepStatus GHepStatus_t
double fSuSAMaxXSecDiffTolerance
Initial State information.
const Algorithm * SubAlg(const RgKey ®istry_key) const