13#include "Framework/Conventions/GBuild.h"
58 <<
"Generating kinematics uniformly over the allowed phase space";
75 double hitNucPos = evrec->
HitNucleon()->
X4()->Vect().Mag();
91 if(Q2.max <=0 || Q2.min>=Q2.max) {
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;
276 if(Q2.max <=0 || Q2.min>=Q2.max) {
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;
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
#define SLOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a short string (using the FUNCTION and...
virtual void Configure(const Registry &config)
bool GetParamDef(const RgKey &name, T &p, const T &def) const
Defines the EventGeneratorI interface.
virtual const XSecAlgorithmI * CrossSectionAlg(void) const =0
const TLorentzVector * X4(void) const
GENIE's GHEP MC event record.
virtual double Weight(void) const
virtual void SetDiffXSec(double xsec, KinePhaseSpace_t ps)
virtual double XSec(void) const
virtual Interaction * Summary(void) const
virtual TBits * EventFlags(void) const
virtual void SetWeight(double wght)
virtual GHepParticle * HitNucleon(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.
string AsString(void) const
const XclsTag & ExclTag(void) const
InitialState * InitStatePtr(void) const
int RecoilNucleonPdg(void) const
recoil nucleon pdg
const KPhaseSpace & PhaseSpace(void) const
const InitialState & InitState(void) const
Kinematics * KinePtr(void) const
Range1D_t Limits(KineVar_t kvar) const
Return the kinematical variable limits.
virtual void AssertXSecLimits(const Interaction *in, double xsec, double xsec_max) const
bool fGenerateUniformly
uniform over allowed phase space + event weight?
double fMaxXSecDiffTolerance
max{100*(xsec-maxxsec)/.5*(xsec+maxxsec)} if xsec>maxxsec
double fEMin
min E for which maxxsec is cached - forcing explicit calc.
double fSafetyFactor
ComputeMaxXSec -> ComputeMaxXSec * fSafetyFactor.
virtual double MaxXSec(GHepRecord *evrec, const int nkey=0) const
const XSecAlgorithmI * fXSecModel
void Setx(double x, bool selected=false)
void SetQ2(double Q2, bool selected=false)
void ClearRunningValues(void)
void Sety(double y, bool selected=false)
void SetW(double W, bool selected=false)
static PDGLibrary * Instance(void)
TParticlePDG * Find(int pdgc, bool must_exist=true)
void SpectralFuncExperimentalCode(GHepRecord *event_rec) const
double ComputeMaxXSec(const Interaction *in) const
~QELKinematicsGenerator()
void Configure(const Registry &config)
void ProcessEventRecord(GHepRecord *event_rec) const
A singleton holding random number generator classes. All random number generation in GENIE should tak...
static RandomGen * Instance()
Access instance.
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)
void SetHitNucPosition(double r)
const TLorentzVector & HitNucP4(void) const
TLorentzVector * HitNucP4Ptr(void) const
double HitNucMass(void) const
Contains minimal information for tagging exclusive processes.
bool IsStrangeEvent(void) const
bool IsCharmEvent(void) const
int StrangeHadronPdg(void) const
int CharmHadronPdg(void) const
An exception thrown by EventRecordVisitorI when the normal processing sequence has to be disrupted (f...
void SwitchOnFastForward(void)
void SetReason(string reason)
Misc GENIE control constants.
static const unsigned int kRjMaxIterations
static const double kASmallNum
Simple functions for loading and reading nucleus dependent keys from config files.
void WQ2toXY(double Ev, double M, double W, double Q2, double &x, double &y)
double PhaseSpaceVolume(const Interaction *const i, KinePhaseSpace_t ps)
Root of GENIE utility namespaces.
THE MAIN GENIE PROJECT NAMESPACE
const UInt_t kISkipKinematicChk
if set, skip kinematic validity checks
const UInt_t kISkipProcessChk
if set, skip process validity checks
const UInt_t kIAssumeFreeNucleon