13 #include "Framework/Conventions/GBuild.h" 31 using namespace genie;
58 <<
"Generating kinematics uniformly over the allowed phase space";
75 double hitNucPos = evrec->
HitNucleon()->
X4()->Vect().Mag();
92 LOG(
"QELKinematics",
pWARN) <<
"No available phase space";
95 exception.
SetReason(
"No available phase space");
118 unsigned int iter = 0;
124 <<
"Couldn't select a valid Q^2 after " << iter <<
" iterations";
127 exception.
SetReason(
"Couldn't select kinematics");
142 gQ2 = Q2min + (Q2max-Q2min) * rnd->
RndKine().Rndm();
144 LOG(
"QELKinematics",
pINFO) <<
"Trying: Q^2 = " <<
gQ2;
153 double t = xsec_max * rnd->
RndKine().Rndm();
157 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 159 <<
"xsec= " << xsec <<
", J= " << J <<
", Rnd= " <<
t;
161 accept = (t < J*xsec);
168 LOG(
"QELKinematics",
pINFO) <<
"Selected: Q^2 = " <<
gQ2;
183 LOG(
"QELKinematics",
pNOTICE) <<
"E = " << E <<
", M = "<< M;
198 LOG(
"QELKinematics",
pNOTICE) <<
"Selected: W = "<< gW;
211 double totxsec = evrec->
XSec();
212 double wght = (vol/totxsec)*xsec;
213 LOG(
"QELKinematics",
pNOTICE) <<
"Kinematics wght = "<< wght;
217 LOG(
"QELKinematics",
pNOTICE) <<
"Current event wght = " << wght;
250 double hitNucPos = evrec->
HitNucleon()->
X4()->Vect().Mag();
268 double En0 = TMath::Sqrt(pxn*pxn + pyn*pyn + pzn*pzn + Mn*Mn);
269 double Eb = En0 - En;
277 LOG(
"QELKinematics",
pWARN) <<
"No available phase space";
280 exception.
SetReason(
"No available phase space");
292 double xsec_max = this->
MaxXSec(evrec);
299 LOG(
"QELKinematics",
pNOTICE) <<
"E = " << E <<
", M = "<< Mn;
312 unsigned int iter = 0;
318 <<
"Couldn't select a valid Q^2 after " << iter <<
" iterations";
321 exception.
SetReason(
"Couldn't select kinematics");
327 gQ2 = Q2min + (Q2max-Q2min) * rnd->
RndKine().Rndm();
355 double gvtilde = gv + Mn - Eb - TMath::Sqrt(Mn*Mn+pxn*pxn+pyn*pyn+pzn*pzn);
356 double gvtilde2 = gvtilde*gvtilde;
358 LOG(
"QELKinematics",
pNOTICE) <<
"v~ = "<< gvtilde;
361 double gQ2tilde = gQ2 - gv2 + gvtilde2;
363 LOG(
"QELKinematics",
pNOTICE) <<
"Q~^2 = "<< gQ2tilde;
375 double t = xsec_max * rnd->
RndKine().Rndm();
376 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 378 <<
"xsec= " << xsec <<
", Rnd= " <<
t;
476 double max_xsec = 0.0;
480 if(rQ2.
min <=0 || rQ2.
max <= rQ2.
min)
return 0.;
488 double dlogQ2 = (logQ2max - logQ2min) /(N-1);
489 double xseclast = -1;
492 for(
int i=0; i<
N; i++) {
493 double Q2 = TMath::Exp(logQ2min + i * dlogQ2);
496 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 497 LOG(
"QELKinematics",
pDEBUG) <<
"xsec(Q2= " << Q2 <<
") = " << xsec;
499 max_xsec = TMath::Max(xsec, max_xsec);
500 increasing = xsec-xseclast>=0;
508 for(
int ib=0; ib<Nb; ib++) {
509 Q2 = TMath::Exp(TMath::Log(Q2) - dlogQ2);
510 if(Q2 < rQ2.
min)
continue;
513 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 514 LOG(
"QELKinematics",
pDEBUG) <<
"xsec(Q2= " << Q2 <<
") = " << xsec;
516 max_xsec = TMath::Max(xsec, max_xsec);
526 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 528 SLOG(
"QELKinematics",
pDEBUG) <<
"Max xsec in phase space = " << max_xsec;
virtual double MaxXSec(GHepRecord *evrec) const
void SpectralFuncExperimentalCode(GHepRecord *event_rec) const
const KPhaseSpace & PhaseSpace(void) const
virtual void SetWeight(double wght)
bool fGenerateUniformly
uniform over allowed phase space + event weight?
double J(double q0, double q3, double Enu, double ml)
THE MAIN GENIE PROJECT NAMESPACE
double Q2(const Interaction *const i)
virtual Interaction * Summary(void) const
static RandomGen * Instance()
Access instance.
void SetQ2(double Q2, bool selected=false)
Kinematics * KinePtr(void) const
double fSafetyFactor
maxxsec -> maxxsec * safety_factor
virtual double XSec(const Interaction *i, KinePhaseSpace_t k=kPSfE) const =0
Compute the cross section for the input interaction.
int RecoilNucleonPdg(void) const
recoil nucleon pdg
A simple [min,max] interval for doubles.
virtual void AssertXSecLimits(const Interaction *in, double xsec, double xsec_max) const
double HitNucMass(void) const
int CharmHadronPdg(void) const
bool IsStrangeEvent(void) const
double fMaxXSecDiffTolerance
max{100*(xsec-maxxsec)/.5*(xsec+maxxsec)} if xsec>maxxsec
Defines the EventGeneratorI interface.
virtual double Weight(void) const
void SetHitNucPosition(double r)
Abstract class. Provides a data caching mechanism for for concrete implementations of the EventRecord...
A singleton holding random number generator classes. All random number generation in GENIE should tak...
Range1D_t Limits(KineVar_t kvar) const
Return the kinematical variable limits.
string AsString(void) const
const XSecAlgorithmI * fXSecModel
Contains minimal information for tagging exclusive processes.
double PhaseSpaceVolume(const Interaction *const i, KinePhaseSpace_t ps)
bool IsCharmEvent(void) 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...
int StrangeHadronPdg(void) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
void WQ2toXY(double Ev, double M, double W, double Q2, double &x, double &y)
virtual void Configure(const Registry &config)
void ProcessEventRecord(GHepRecord *event_rec) const
static const double kASmallNum
TRandom3 & RndKine(void) const
rnd number generator used by kinematics generators
Misc GENIE control constants.
const UInt_t kISkipKinematicChk
if set, skip kinematic validity checks
virtual const XSecAlgorithmI * CrossSectionAlg(void) const =0
double ComputeMaxXSec(const Interaction *in) const
void Setx(double x, bool selected=false)
static RunningThreadInfo * Instance(void)
~QELKinematicsGenerator()
void SetW(double W, bool selected=false)
void SwitchOnFastForward(void)
TLorentzVector * HitNucP4Ptr(void) const
static PDGLibrary * Instance(void)
void SetReason(string reason)
virtual TBits * EventFlags(void) const
const TLorentzVector * X4(void) const
A registry. Provides the container for algorithm configuration parameters.
void Sety(double y, bool selected=false)
const UInt_t kIAssumeFreeNucleon
const XclsTag & ExclTag(void) const
void Configure(const Registry &config)
virtual GHepParticle * HitNucleon(void) const
Target * TgtPtr(void) const
double fEMin
min E for which maxxsec is cached - forcing explicit calc.
virtual double XSec(void) const
InitialState * InitStatePtr(void) const
const InitialState & InitState(void) const
TParticlePDG * Find(int pdgc, bool must_exist=true)
void ClearRunningValues(void)
bool GetParamDef(const RgKey &name, T &p, const T &def) const
const Target & Tgt(void) const
static const unsigned int kRjMaxIterations
const EventGeneratorI * RunningThread(void)
#define SLOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a short string (using the FUNCTION and...
double ProbeE(RefFrame_t rf) const
GENIE's GHEP MC event record.
Keep info on the event generation thread currently on charge. This is used so that event generation m...
Root of GENIE utility namespaces.
cet::coded_exception< error, detail::translate > exception
const UInt_t kISkipProcessChk
if set, skip process validity checks
virtual void SetDiffXSec(double xsec, KinePhaseSpace_t ps)
Initial State information.