16#include "Math/Minimizer.h"
17#include "Math/Factory.h"
75 if (
fXSecModel->Id().Name() ==
"genie::EmpiricalMECPXSec2015") {
88 }
else if (
fXSecModel->Id().Name() ==
"genie::NievesSimoVacasMECPXSec2016") {
96 }
else if (
fXSecModel->Id().Name() ==
"genie::SuSAv2MECPXSec") {
111 "ProcessEventRecord >> Cannot calculate kinematics for " <<
135 const TLorentzVector & p4cluster = *(cluster->
P4());
136 const TLorentzVector & p4tgt = *(target ->
P4());
138 const TLorentzVector p4 = p4tgt - p4cluster;
139 const TLorentzVector v4(0.,0.,0., 0.);
141 int momidx =
event->TargetNucleusPosition();
174 assert(target_nucleus);
176 assert(nucleon_cluster);
177 GHepParticle * remnant_nucleus =
event->RemnantNucleus();
178 assert(remnant_nucleus);
184 assert(pdgv.size()==2);
193 <<
"1st nucleon (code = " << pdgv[0] <<
") generated momentum: ("
194 << p3a.Px() <<
", " << p3a.Py() <<
", " << p3a.Pz() <<
"), "
195 <<
"|p| = " << p3a.Mag();
197 <<
"2nd nucleon (code = " << pdgv[1] <<
") generated momentum: ("
198 << p3b.Px() <<
", " << p3b.Py() <<
", " << p3b.Pz() <<
"), "
199 <<
"|p| = " << p3b.Mag();
203 TVector3 p3 = p3a + p3b;
206 <<
"di-nucleon cluster momentum: ("
207 << p3.Px() <<
", " << p3.Py() <<
", " << p3.Pz() <<
"), "
208 <<
"|p| = " << p3.Mag();
217 double EN = TMath::Sqrt(p3.Mag2() + M2n*M2n);
221 TLorentzVector p4nclust ( p3.Px(), p3.Py(), p3.Pz(), EN );
222 TLorentzVector p4remnant (-1*p3.Px(), -1*p3.Py(), -1*p3.Pz(), Mi-EN);
229 event->Summary()->InitStatePtr()->TgtPtr()->SetHitNucP4(p4nclust);
257 double dQ2 = (Q2max-Q2min) / (nq-1);
258 double dW = (Wmax-Wmin ) / (nw-1);
260 for(
int iw=0; iw<nw; iw++) {
261 for(
int iq=0; iq<nq; iq++) {
262 double Q2 = Q2min + iq*dQ2;
263 double W = Wmin + iw*dW;
267 xsec_max = TMath::Max(xsec, xsec_max);
270 LOG(
"MEC",
pNOTICE) <<
"xsec_max (E = " << Ev <<
" GeV) = " << xsec_max;
274 unsigned int iter = 0;
280 <<
"Couldn't select a valid W, Q^2 pair after "
281 << iter <<
" iterations";
282 event->EventFlags()->SetBitNumber(
kKineGenErr,
true);
284 exception.
SetReason(
"Couldn't select kinematics");
290 double gQ2 = Q2min + (Q2max-Q2min) * rnd->
RndKine().Rndm();
291 double gW = Wmin + (Wmax -Wmin ) * rnd->
RndKine().Rndm();
299 double t = xsec_max * rnd->
RndKine().Rndm();
301 accept = (t < J*xsec);
305 LOG(
"MEC",
pINFO) <<
"Selected: Q^2 = " <<
gQ2 <<
", W = " << gW;
314 LOG(
"MEC",
pINFO) <<
"x = " << gx <<
", y = " << gy;
336 const TLorentzVector & pnuc4 = init_state.
Tgt().
HitNucP4();
337 TVector3 beta = pnuc4.BoostVector();
342 auto p4v = std::unique_ptr<TLorentzVector>(event->
Probe()->
GetP4());
343 p4v->Boost(-1.*beta);
346 double Q2 = interaction->
Kine().
Q2(
true);
347 double y = interaction->
Kine().
y(
true);
351 LOG(
"MEC",
pNOTICE) <<
"neutrino energy = " << Ev;
353 double ml2 = TMath::Power(ml,2);
357 double El = (1-y)*Ev;
358 double plp = El - 0.5*(Q2+ml2)/Ev;
359 double plt = TMath::Sqrt(TMath::Max(0.,El*El-plp*plp-ml2));
362 <<
"fsl: E = " << El <<
", |p//| = " << plp <<
", |pT| = " << plt;
366 double phi = 2*
kPi * rnd->
RndLep().Rndm();
367 double pltx = plt * TMath::Cos(phi);
368 double plty = plt * TMath::Sin(phi);
372 TVector3 unit_nudir = p4v->Vect().Unit();
375 TVector3 p3l(pltx,plty,plp);
376 p3l.RotateUz(unit_nudir);
379 TLorentzVector p4l(p3l,El);
388 TLorentzVector v4(*event->
Probe()->
X4());
391 int momidx =
event->ProbePosition();
403 assert(nucleon_cluster);
404 TLorentzVector * tmp=nucleon_cluster->
GetP4();
405 TLorentzVector p4cluster(*tmp);
411 TLorentzVector p4v(*neutrino->
P4());
416 TLorentzVector p4l(*fsl->
P4());
419 TLorentzVector q = p4v - p4l;
422 TLorentzVector p4cluster_recoil = p4cluster + q;
425 LOG(
"MEC",
pINFO) <<
"Interaction summary";
426 LOG(
"MEC",
pINFO) << *
event->Summary();
427 int recoil_nucleon_cluster_pdg =
event->Summary()->RecoilNucleonPdg();
430 TLorentzVector v4(*neutrino->
X4());
435 2, -1, -1, -1, p4cluster_recoil, v4);
443 LOG(
"MEC",
pINFO) <<
"Decaying nucleon cluster...";
446 int nucleon_cluster_id = 5;
447 GHepParticle * nucleon_cluster =
event->Particle(nucleon_cluster_id);
448 assert(nucleon_cluster);
452 LOG(
"MEC",
pINFO) <<
"Decay product IDs: " << pdgv;
455 vector<int>::const_iterator pdg_iter;
457 double * mass =
new double[pdgv.size()];
459 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
460 int pdgc = *pdg_iter;
467 <<
"Performing a phase space decay to "
468 << pdgv.size() <<
" particles / total mass = " << sum;
470 TLorentzVector * p4d = nucleon_cluster->
GetP4();
471 TLorentzVector * v4d = nucleon_cluster->
GetX4();
480 <<
" *** Phase space decay is not permitted \n"
481 <<
" Total particle mass = " << sum <<
"\n"
490 exception.
SetReason(
"Decay not permitted kinematically");
498 for(
int idec=0; idec<200; idec++) {
500 wmax = TMath::Max(wmax,w);
506 <<
"Max phase space gen. weight = " << wmax;
509 bool accept_decay=
false;
518 <<
"Couldn't generate an unweighted phase space decay after "
519 << itry <<
" attempts";
527 exception.
SetReason(
"Couldn't select decay after N attempts");
535 <<
"Decay weight = " << w <<
" > max decay weight = " << wmax;
537 double gw = wmax * rnd->
RndDec().Rndm();
538 accept_decay = (gw<=w);
541 <<
"Decay weight = " << w <<
" / R = " << gw
542 <<
" - accepted: " << accept_decay;
547 TLorentzVector v4(*v4d);
550 for(pdg_iter = pdgv.begin(); pdg_iter != pdgv.end(); ++pdg_iter) {
551 int pdgc = *pdg_iter;
553 event->AddParticle(pdgc, ist, nucleon_cluster_id,-1,-1,-1, *p4fin, v4);
565 bool allowdup =
true;
585 <<
"Unknown di-nucleon cluster PDG code (" << pdgc <<
")";
597 int FullDeltaNodelta = 1;
608 TLorentzVector v4(*event->
Probe()->
X4());
609 TLorentzVector tempp4(0.,0.,0.,0.);
613 double CosthMax = 1.0;
614 double CosthMin = -1.0;
617 double TMax = std::numeric_limits<double>::max();
631 TMax = Enu - LepMass;
639 <<
"fQ3 max is larger than expected for Valencia MEC: "
640 <<
fQ3Max <<
". Are you sure this is correct?";
651 TMin = TMath::Sqrt(TMath::Power(LepMass, 2) + TMath::Power((Enu -
fQ3Max), 2)) - LepMass;
652 CosthMin = TMath::Sqrt(1 - TMath::Power((
fQ3Max / Enu ), 2));
657 Range1D_t ctl_range ( CosthMin, CosthMax ) ;
658 double XSecMax =
GetXSecMaxTlctl( *interaction, Tl_range, ctl_range ) ;
664 unsigned int iter = 0;
672 <<
"Couldn't select a valid Tmu, CosTheta pair after "
673 << iter <<
" iterations";
674 event->EventFlags()->SetBitNumber(
kKineGenErr,
true);
676 exception.
SetReason(
"Couldn't select lepton kinematics");
682 T = TMin + (TMax-TMin)*rnd->
RndKine().Rndm();
683 Costh = CosthMin + (CosthMax-CosthMin)*rnd->
RndKine().Rndm();
689 if (Q3 >
fQ3Max) continue ;
691 Plep = TMath::Sqrt( T * (T + (2.0 * LepMass)));
700 if (FullDeltaNodelta == 1){
724 if (XSec > XSecMax) {
725 LOG(
"MEC",
pERROR) <<
"XSec is > XSecMax for nucleus " << TgtPDG <<
" "
726 << XSec <<
" > " << XSecMax
727 <<
" don't let this happen.";
729 assert(XSec <= XSecMax);
730 accept = XSec > XSecMax*rnd->
RndKine().Rndm();
731 LOG(
"MEC",
pINFO) <<
"Xsec, Max, Accept: " << XSec <<
", "
732 << XSecMax <<
", " << accept;
745 double myrand = rnd->
RndKine().Rndm();
746 double pnFraction = XSecPN / XSec;
747 LOG(
"MEC",
pDEBUG) <<
"Test for pn: xsec_pn = " << XSecPN
748 <<
"; xsec = " << XSec
749 <<
"; pn_fraction = " << pnFraction
750 <<
"; random number val = " << myrand;
752 if (myrand <= pnFraction) {
755 1, -1, -1, -1, tempp4, v4);
759 if (rnd->
RndKine().Rndm() <= XSecDeltaPN / XSecPN) {
767 1, -1, -1, -1, tempp4, v4);
772 1, -1, -1, -1, tempp4, v4);
778 (XSecDelta - XSecDeltaPN) / (XSec - XSecPN)) {
810 double PlepZ = Plep * Costh;
811 double PlepXY = Plep * TMath::Sqrt(1. - TMath::Power(Costh,2));
814 double phi= 2 *
kPi * rnd->
RndLep().Rndm();
816 double PlepX = PlepXY * TMath::Cos(phi);
817 double PlepY = PlepXY * TMath::Sin(phi);
821 TVector3 unit_nudir =
event->Probe()->P4()->Vect().Unit();
822 TVector3 p3l(PlepX, PlepY, PlepZ);
823 p3l.RotateUz(unit_nudir);
826 Elep = TMath::Sqrt(LepMass*LepMass + PlepX*PlepX + PlepY*PlepY + PlepZ*PlepZ);
827 TLorentzVector p4l(p3l,Elep);
831 int momidx =
event->ProbePosition();
836 double gy = Q0 / Enu;
854 LOG(
"MEC",
pDEBUG) <<
"~~~ LEPTON DONE ~~~";
867 if ( interaction->
ProcInfo().
IsEM() ) Q2min = genie::utils::kinematics
868 ::electromagnetic::kMinQ2Limit;
870 LOG(
"MEC",
pDEBUG) <<
"Q2min = " << Q2min;
878 TLorentzVector v4( *event->
Probe()->
X4() );
879 TLorentzVector tempp4( 0., 0., 0., 0. );
883 double CosthMax = 1.0;
884 double CosthMin = -1.0;
887 double TMax = std::numeric_limits<double>::max();
901 TMax = Enu - LepMass;
909 <<
"fQ3 max is smaller than expected for SuSAv2 MEC: "
910 <<
fQ3Max <<
". Are you sure this is correct?";
923 TMin = TMath::Sqrt( TMath::Power(LepMass, 2) + TMath::Power(Enu -
fQ3Max, 2) ) - LepMass;
924 CosthMin = TMath::Sqrt( 1. - TMath::Power(
fQ3Max / Enu, 2) );
931 unsigned int iter = 0;
936 if ( NuPDG == 11 ) maxIter *= 100000;
945 if ( iter > maxIter ) {
948 <<
"Couldn't select a valid Tmu, CosTheta pair after "
949 << iter <<
" iterations";
950 event->EventFlags()->SetBitNumber(
kKineGenErr,
true );
952 exception.
SetReason(
"Couldn't select lepton kinematics" );
958 T = TMin + (TMax-TMin)*rnd->
RndKine().Rndm();
959 Costh = CosthMin + (CosthMax-CosthMin)*rnd->
RndKine().Rndm();
962 Plep = TMath::Sqrt( T * (T + (2.0 * LepMass)));
963 Q3 = TMath::Sqrt(Plep*Plep + Enu*Enu - 2.0 * Plep * Enu * Costh);
966 Q0 = Enu - (T + LepMass);
969 LOG(
"MEC",
pDEBUG) <<
"T = " << T <<
", Costh = " << Costh
974 if ( Q3 < fQ3Max && Q2 >= Q2min ) {
982 LOG(
"MEC",
pDEBUG) <<
" T, Costh: " << T <<
", " << Costh ;
987 if ( XSec > XSecMax ) {
988 LOG(
"MEC",
pERROR) <<
"XSec is > XSecMax for nucleus " << TgtPDG <<
" "
989 << XSec <<
" > " << XSecMax <<
" don't let this happen.";
991 double percent_deviation = 200. * ( XSec - XSecMax ) / ( XSecMax + XSec );
994 LOG(
"Kinematics",
pFATAL ) <<
"xsec: (curr) = " << XSec
995 <<
" > (max) = " << XSecMax <<
"\n for " << *interaction;
997 <<
"*** Exceeding estimated maximum differential cross section";
1001 LOG(
"Kinematics",
pWARN ) <<
"xsec: (curr) = " << XSec
1002 <<
" > (max) = " << XSecMax <<
"\n for " << *interaction;
1003 LOG(
"Kinematics",
pWARN) <<
"*** The fractional deviation of "
1004 << percent_deviation <<
" % was allowed";
1008 accept = XSec > XSecMax*rnd->
RndKine().Rndm();
1009 LOG(
"MEC",
pINFO) <<
"Xsec, Max, Accept: " << XSec <<
", "
1010 << XSecMax <<
", " << accept;
1017 double myrand_pn = rnd->
RndKine().Rndm();
1019 ->PairRatio( interaction );
1021 LOG(
"MEC",
pINFO) <<
"Test for pn: "
1022 <<
"; xsec = " << XSec <<
"; pn_fraction = " << pnFraction
1023 <<
"; random number val = " << myrand_pn;
1025 double myrand_pp = rnd->
RndKine().Rndm();
1026 double ppFraction = 0 ;
1031 ->PairRatio( interaction ,
"ppFraction");
1033 LOG(
"MEC",
pINFO) <<
"Test for pp: "
1034 <<
"; xsec = " << XSec <<
"; pp_fraction = " << ppFraction
1035 <<
"; random number val = " << myrand_pp;
1038 if ( myrand_pn <= pnFraction ) {
1041 1, -1, -1, -1, tempp4, v4);
1047 if ( myrand_pp <= ppFraction/(1. - pnFraction) ) {
1050 1, -1, -1, -1, tempp4, v4);
1055 1, -1, -1, -1, tempp4, v4);
1062 1, -1, -1, -1, tempp4, v4);
1067 1, -1, -1, -1, tempp4, v4);
1083 double PlepZ = Plep * Costh;
1084 double PlepXY = Plep * TMath::Sqrt( 1. - TMath::Power(Costh,2) );
1087 double phi = 2. *
kPi * rnd->
RndLep().Rndm();
1089 double PlepX = PlepXY * TMath::Cos(phi);
1090 double PlepY = PlepXY * TMath::Sin(phi);
1094 TVector3 unit_nudir =
event->Probe()->P4()->Vect().Unit();
1095 TVector3 p3l( PlepX, PlepY, PlepZ );
1096 p3l.RotateUz( unit_nudir );
1099 Elep = TMath::Sqrt( LepMass*LepMass + PlepX*PlepX + PlepY*PlepY + PlepZ*PlepZ );
1100 TLorentzVector p4l( p3l, Elep );
1104 int momidx =
event->ProbePosition();
1110 double gy = Q0 / Enu;
1125 LOG(
"MEC",
pDEBUG) <<
"~~~ LEPTON DONE ~~~";
1133 LOG(
"MEC",
pDEBUG) <<
"Generate Initial Hadrons - Start";
1138 TLorentzVector p4nu(*neutrino->
P4());
1143 TLorentzVector p4l(*fsl->
P4());
1146 TLorentzVector Q4 = p4nu - p4l;
1150 GHepParticle * target_nucleus =
event->TargetNucleus();
1151 assert(target_nucleus);
1152 GHepParticle * initial_nucleon_cluster =
event->HitNucleon();
1153 assert(initial_nucleon_cluster);
1154 GHepParticle * remnant_nucleus =
event->RemnantNucleus();
1155 assert(remnant_nucleus);
1168 assert(pdgv.size()==2);
1171 bool accept =
false;
1174 unsigned int iter = 0;
1176 int initial_nucleon_cluster_pdg = initial_nucleon_cluster->
Pdg();
1177 int final_nucleon_cluster_pdg = 0;
1180 if (neutrino->
Pdg() == 11) {
1181 final_nucleon_cluster_pdg = initial_nucleon_cluster->
Pdg();
1184 else if (neutrino->
Pdg() > 0) {
1192 LOG(
"MEC",
pERROR) <<
"Wrong pdg for a CC neutrino MEC interaction"
1193 << initial_nucleon_cluster->
Pdg();
1196 else if (neutrino->
Pdg() < 0) {
1204 LOG(
"MEC",
pERROR) <<
"Wrong pdg for a CC anti-neutrino MEC interaction"
1205 << initial_nucleon_cluster->
Pdg();
1209 TLorentzVector p4initial_cluster;
1210 TLorentzVector p4final_cluster;
1211 TLorentzVector p4remnant_nucleus;
1212 double removalenergy1;
1213 double removalenergy2;
1225 <<
"Couldn't select a valid W, Q^2 pair after "
1226 << iter <<
" iterations";
1227 event->EventFlags()->SetBitNumber(
kKineGenErr,
true);
1229 exception.
SetReason(
"Couldn't select initial hadron kinematics");
1243 removalenergy1 =
fNuclModel->RemovalEnergy();
1247 removalenergy2 =
fNuclModel->RemovalEnergy();
1252 TVector3 p3i = p31i + p32i;
1255 double energy = TMath::Sqrt(p3i.Mag2() + mass2);
1256 p4initial_cluster.SetPxPyPzE(p3i.Px(),p3i.Py(),p3i.Pz(),energy);
1259 TLorentzVector tLVebind(0., 0., 0., -1.0 * (removalenergy1 + removalenergy2));
1274 p4final_cluster = p4initial_cluster + Q4 + tLVebind;
1278 if (p4final_cluster.M() <
1291 initial_nucleon_cluster->
SetMomentum(p4initial_cluster);
1295 remnant_nucleus->
SetMomentum(-1.0*p4initial_cluster.Px(),
1296 -1.0*p4initial_cluster.Py(),
1297 -1.0*p4initial_cluster.Pz(),
1298 Mi - p4initial_cluster.E() + removalenergy1 + removalenergy2);
1305 TLorentzVector v4(*neutrino->
X4());
1309 2, -1, -1, -1, p4final_cluster, v4);
1318 event->AddParticle(p1);
1338 RgKey nuclkey =
"NuclearModel";
1360 auto min = std::unique_ptr<ROOT::Math::Minimizer>{
1361 ROOT::Math::Factory::CreateMinimizer(
"Minuit2")};
1368 std::array<string,2> names = {
"Tl",
"CosThetal" } ;
1369 std::array<Range1D_t,2> ranges = { Tl_range, ctl_range } ;
1371 std::array<double,2> start, steps, temp_point ;
1379 temp_point[0] = ranges[0].min + steps[0]*i ;
1382 temp_point[1] = ranges[1].min + steps[1]*j ;
1384 double temp_xsec = - f( temp_point.data() ) ;
1385 if ( temp_xsec > xsec ) {
1386 start = temp_point ;
1393 min->SetFunction( f );
1397 for (
unsigned int i = 0 ; i < ranges.size() ; ++i ) {
1398 min -> SetLimitedVariable( i, names[i], start[i], steps[i], ranges[i].min, ranges[i].max ) ;
1403 double max_xsec = -min->MinValue();
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils.
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
virtual void Configure(const Registry &config)
bool GetParamDef(const RgKey &name, T &p, const T &def) const
const Algorithm * SubAlg(const RgKey ®istry_key) const
Defines the EventGeneratorI interface.
virtual const XSecAlgorithmI * CrossSectionAlg(void) const =0
STDHEP-like event record entry that can fit a particle or a nucleus.
void SetMomentum(const TLorentzVector &p4)
TLorentzVector * GetP4(void) const
const TLorentzVector * P4(void) const
const TLorentzVector * X4(void) const
TLorentzVector * GetX4(void) const
GENIE's GHEP MC event record.
virtual GHepParticle * Probe(void) const
Initial State information.
const Target & Tgt(void) const
double ProbeE(RefFrame_t rf) const
Target * TgtPtr(void) const
Summary information for an interaction.
InitialState * InitStatePtr(void) const
const Kinematics & Kine(void) const
XclsTag * ExclTagPtr(void) const
const ProcessInfo & ProcInfo(void) const
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
const InitialState & InitState(void) const
Kinematics * KinePtr(void) const
Generated/set kinematical variables for an event.
void SetHadSystP4(const TLorentzVector &p4)
void Setx(double x, bool selected=false)
void SetQ2(double Q2, bool selected=false)
double Q2(bool selected=false) const
double y(bool selected=false) const
void ClearRunningValues(void)
void Sety(double y, bool selected=false)
void SetW(double W, bool selected=false)
void SetFSLeptonP4(const TLorentzVector &p4)
void AddFinalStateLepton(GHepRecord *event) const
void SelectEmpiricalKinematics(GHepRecord *event) const
PDGCodeList NucleonClusterConstituents(int pdgc) const
void SelectSuSALeptonKinematics(GHepRecord *event) const
const XSecAlgorithmI * fXSecModel
void SelectNSVLeptonKinematics(GHepRecord *event) const
void ProcessEventRecord(GHepRecord *event) const
double GetXSecMaxTlctl(const Interaction &inter, const Range1D_t &Tl_range, const Range1D_t &ctl_range) const
void DecayNucleonCluster(GHepRecord *event) const
const NuclearModelI * fNuclModel
double fSuSAMaxXSecDiffTolerance
TGenPhaseSpace fPhaseSpaceGenerator
void Configure(const Registry &config)
void GenerateFermiMomentum(GHepRecord *event) const
void AddTargetRemnant(GHepRecord *event) const
void GenerateNSVInitialHadrons(GHepRecord *event) const
void RecoilNucleonCluster(GHepRecord *event) const
Pure abstract base class. Defines the NuclearModelI interface to be implemented by any physics model ...
void push_back(int pdg_code)
static PDGLibrary * Instance(void)
TParticlePDG * Find(int pdgc, bool must_exist=true)
A singleton holding random number generator classes. All random number generation in GENIE should tak...
static RandomGen * Instance()
Access instance.
TRandom3 & RndLep(void) const
rnd number generator used by final state primary lepton generators
TRandom3 & RndDec(void) const
rnd number generator used by decay models
TRandom3 & RndKine(void) const
rnd number generator used by kinematics generators
A simple [min,max] interval for doubles.
A registry. Provides the container for algorithm configuration parameters.
Keep info on the event generation thread currently on charge. This is used so that event generation m...
static RunningThreadInfo * Instance(void)
const EventGeneratorI * RunningThread(void)
Computes the SuSAv2-MEC model differential cross section. Uses precomputed hadron tensor tables....
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
int HitNucPdg(void) const
void SetHitNucPdg(int pdgc)
const TLorentzVector & HitNucP4(void) const
void SetResonance(Resonance_t res)
An exception thrown by EventRecordVisitorI when the normal processing sequence has to be disrupted (f...
void SwitchOnFastForward(void)
void SetReason(string reason)
void SwitchOnStepBack(void)
void SetReturnStep(int s)
static const double kNucleonMass
Misc GENIE control constants.
static const double kMinQ2Limit
static const unsigned int kMaxUnweightDecayIterations
static const unsigned int kRjMaxIterations
int IonPdgCode(int A, int Z)
Simple functions for loading and reading nucleus dependent keys from config files.
double Q2YtoX(double Ev, double M, double Q2, double y)
void WQ2toXY(double Ev, double M, double W, double Q2, double &x, double &y)
double XYtoW(double Ev, double M, double x, double y)
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)
bool Getq0q3FromTlCostl(double Tl, double costl, double Enu, double ml, double &q0, double &q3)
string P4AsString(const TLorentzVector *p)
Root of GENIE utility namespaces.
void SetPrimaryLeptonPolarization(GHepRecord *ev)
THE MAIN GENIE PROJECT NAMESPACE
enum genie::EGHepStatus GHepStatus_t