GLRESKinematicsGenerator.cxx
Go to the documentation of this file.
1 //____________________________________________________________________________
2 /*
3  Copyright (c) 2003-2019, The GENIE Collaboration
4  For the full text of the license visit http://copyright.genie-mc.org
5  or see $GENIE/LICENSE
6 
7  Author: Alfonso Garcia <alfonsog \at nikhef.nl>
8  NIKHEF (Amsterdam)
9 
10  For the class documentation see the corresponding header file.
11 
12  Important revisions after version 2.0.0 :
13 
14 */
15 //____________________________________________________________________________
16 
28 #include "Framework/Utils/Range1.h"
29 
30 using namespace genie;
31 using namespace genie::controls;
32 using namespace genie::utils;
33 
34 //___________________________________________________________________________
36 KineGeneratorWithCache("genie::GLRESKinematicsGenerator")
37 {
38 
39 }
40 //___________________________________________________________________________
42 KineGeneratorWithCache("genie::GLRESKinematicsGenerator", config)
43 {
44 
45 }
46 //___________________________________________________________________________
48 {
49 
50 }
51 //___________________________________________________________________________
53 {
54  if(fGenerateUniformly) {
55  LOG("GLRESKinematics", pNOTICE)
56  << "Generating kinematics uniformly over the allowed phase space";
57  }
58 
59  //-- Get the random number generators
61 
62  //-- Access cross section algorithm for running thread
64  const EventGeneratorI * evg = rtinfo->RunningThread();
65  fXSecModel = evg->CrossSectionAlg();
66 
67  //-- For the subsequent kinematic selection with the rejection method:
68  // Calculate the max differential cross section or retrieve it from the
69  // cache. Throw an exception and quit the evg thread if a non-positive
70  // value is found.
71  // If the kinematics are generated uniformly over the allowed phase
72  // space the max xsec is irrelevant
73  double xsec_max = this->MaxXSec(evrec);
74 
75  //-- y range
76  const KPhaseSpace & kps = evrec->Summary()->PhaseSpace();
77  Range1D_t yl = kps.Limits(kKVy);
78  double ymin = yl.min;
79  double ymax = yl.max;
80  double dy = ymax-ymin;
81 
82  double xsec = -1;
83  Interaction * interaction = evrec->Summary();
84 
85  //-- Try to select a valid inelastisity y
86  unsigned int iter = 0;
87  bool accept = false;
88  while(1) {
89  iter++;
90  if(iter > kRjMaxIterations) {
91  LOG("GLRESKinematics", pWARN)
92  << "*** Could not select a valid y after "
93  << iter << " iterations";
94  evrec->EventFlags()->SetBitNumber(kKineGenErr, true);
96  exception.SetReason("Couldn't select kinematics");
97  exception.SwitchOnFastForward();
98  throw exception;
99  }
100 
101  double y = ymin + dy * rnd->RndKine().Rndm();
102  interaction->KinePtr()->Sety(y);
103 
104  LOG("GLRESKinematics", pINFO) << "Trying: y = " << y;
105 
106  //-- computing cross section for the current kinematics
107  xsec = fXSecModel->XSec(interaction, kPSyfE);
108 
109  this->AssertXSecLimits(interaction, xsec, xsec_max);
110 
111  double t = xsec_max * rnd->RndKine().Rndm();
112  LOG("GLRESKinematics", pDEBUG) << "xsec= "<< xsec<< ", J= 1, Rnd= "<< t;
113 
114  accept = (t<xsec);
115 
116  //-- If the generated kinematics are accepted, finish-up module's job
117  if(accept) {
118  LOG("GLRESKinematics", pINFO) << "Selected: y = " << y;
119 
120  // set the cross section for the selected kinematics
121  evrec->SetDiffXSec(xsec,kPSyfE);
122 
123  // lock selected kinematics & clear running values
124  interaction->KinePtr()->Sety(y, true);
125  interaction->KinePtr()->ClearRunningValues();
126 
127  return;
128  }
129  }// iterations
130 }
131 //___________________________________________________________________________
133  const Interaction * interaction) const
134 {
135 // Computes the maximum differential cross section in the requested phase
136 // space. This method overloads KineGeneratorWithCache::ComputeMaxXSec
137 // method and the value is cached at a circular cache branch for retrieval
138 // during subsequent event generation.
139 // The computed max differential cross section does not need to be the exact
140 // maximum. The number used in the rejection method will be scaled up by a
141 // safety factor. But it needs to be fast - do not use a very small y step.
142 
143  const int N = 100;
144 
145  const KPhaseSpace & kps = interaction->PhaseSpace();
146  Range1D_t yl = kps.Limits(kKVy);
147  const double ymin = yl.min;
148  const double ymax = yl.max;
149 
150  double max_xsec = -1.0;
151 
152  double dy = (ymax-ymin)/(N-1);
153 
154  for(int i=0; i<N; i++) {
155  double y = ymin + i * dy;
156  interaction->KinePtr()->Sety(y);
157  double xsec = fXSecModel->XSec(interaction, kPSyfE);
158 
159  SLOG("GLRESKinematics", pDEBUG) << "xsec(y = " << y << ") = " << xsec;
160  max_xsec = TMath::Max(xsec, max_xsec);
161 
162  }//y
163 
164  // Apply safety factor, since value retrieved from the cache might
165  // correspond to a slightly different energy.
166  max_xsec *= fSafetyFactor;
167 
168  SLOG("GLRESKinematics", pDEBUG) << interaction->AsString();
169  SLOG("GLRESKinematics", pDEBUG) << "Max xsec in phase space = " << max_xsec;
170  SLOG("GLRESKinematics", pDEBUG) << "Computed using alg = " << *fXSecModel;
171 
172  return max_xsec;
173 }
174 //___________________________________________________________________________
176 {
177 // Override the base class Energy() method to cache the max xsec for the
178 // neutrino energy in the LAB rather than in the hit nucleon rest frame.
179 
180  const InitialState & init_state = interaction->InitState();
181  double E = init_state.ProbeE(kRfLab);
182  return E;
183 }
184 //___________________________________________________________________________
186 {
187  Algorithm::Configure(config);
188  this->LoadConfig();
189 }
190 //____________________________________________________________________________
192 {
193  Algorithm::Configure(config);
194  this->LoadConfig();
195 }
196 //____________________________________________________________________________
198 {
199 // Reads its configuration data from its configuration Registry and loads them
200 // in private data members to avoid looking up at the Registry all the time.
201 
202  //-- Safety factor for the maximum differential cross section
203  GetParamDef( "MaxXSec-SafetyFactor", fSafetyFactor, 2. ) ;
204 
205  //-- Maximum allowed fractional cross section deviation from maxim cross
206  // section used in rejection method
207  GetParamDef( "MaxXSec-DiffTolerance", fMaxXSecDiffTolerance, 999999. ) ;
208  assert(fMaxXSecDiffTolerance>=0);
209 
210 }
211 //____________________________________________________________________________
virtual double MaxXSec(GHepRecord *evrec) const
const KPhaseSpace & PhaseSpace(void) const
Definition: Interaction.h:73
bool fGenerateUniformly
uniform over allowed phase space + event weight?
THE MAIN GENIE PROJECT NAMESPACE
Definition: AlgCmp.h:25
virtual Interaction * Summary(void) const
Definition: GHepRecord.cxx:91
static RandomGen * Instance()
Access instance.
Definition: RandomGen.cxx:71
Kinematics * KinePtr(void) const
Definition: Interaction.h:76
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.
A simple [min,max] interval for doubles.
Definition: Range1.h:42
virtual void AssertXSecLimits(const Interaction *in, double xsec, double xsec_max) const
double Energy(const Interaction *in) const
double fMaxXSecDiffTolerance
max{100*(xsec-maxxsec)/.5*(xsec+maxxsec)} if xsec>maxxsec
void Configure(const Registry &config)
Defines the EventGeneratorI interface.
double ComputeMaxXSec(const Interaction *in) const
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...
Definition: RandomGen.h:29
Range1D_t Limits(KineVar_t kvar) const
Return the kinematical variable limits.
string AsString(void) const
Summary information for an interaction.
Definition: Interaction.h:56
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...
Definition: Messenger.h:96
static Config * config
Definition: config.cpp:1054
virtual void Configure(const Registry &config)
Definition: Algorithm.cxx:62
Kinematical phase space.
Definition: KPhaseSpace.h:33
#define pINFO
Definition: Messenger.h:62
TRandom3 & RndKine(void) const
rnd number generator used by kinematics generators
Definition: RandomGen.h:50
Misc GENIE control constants.
#define pWARN
Definition: Messenger.h:60
virtual const XSecAlgorithmI * CrossSectionAlg(void) const =0
static RunningThreadInfo * Instance(void)
double max
Definition: Range1.h:53
virtual TBits * EventFlags(void) const
Definition: GHepRecord.h:117
A registry. Provides the container for algorithm configuration parameters.
Definition: Registry.h:65
void Sety(double y, bool selected=false)
Definition: Kinematics.cxx:243
E
Definition: 018_def.c:13
const InitialState & InitState(void) const
Definition: Interaction.h:69
double min
Definition: Range1.h:52
void ProcessEventRecord(GHepRecord *event_rec) const
#define pNOTICE
Definition: Messenger.h:61
void ClearRunningValues(void)
Definition: Kinematics.cxx:347
bool GetParamDef(const RgKey &name, T &p, const T &def) const
static const unsigned int kRjMaxIterations
Definition: Controls.h:26
const EventGeneratorI * RunningThread(void)
#define SLOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a short string (using the FUNCTION and...
Definition: Messenger.h:84
double ProbeE(RefFrame_t rf) const
GENIE&#39;s GHEP MC event record.
Definition: GHepRecord.h:45
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
Definition: exception.h:33
virtual void SetDiffXSec(double xsec, KinePhaseSpace_t ps)
Definition: GHepRecord.h:133
Initial State information.
Definition: InitialState.h:48
#define pDEBUG
Definition: Messenger.h:63