5#include "CLHEP/Random/RandFlat.h"
28 chain().shrink_to_fit();
43 float Ekin = truth->
Ekin();
65 int prevbin =
bin - 1;
71 if (!first_in_prevbin)
74 float logEkin = TMath::Log(Ekin);
75 float logEkin_nominal = TMath::Log(first_in_bin->
Ekin_nominal());
76 float logEkin_previous = TMath::Log(first_in_prevbin->
Ekin_nominal());
77 float numerator = logEkin - logEkin_previous;
78 float denominator = logEkin_nominal - logEkin_previous;
82 if (numerator / denominator <
rnd)
85 << logEkin <<
" logEkin_previous=" << logEkin_previous
86 <<
" logEkin_nominal=" << logEkin_nominal
87 <<
" (rnd=" << 1 -
rnd
88 <<
" < p(previous)=" << (1 - numerator / denominator)
89 <<
")? => orgbin=" << prevbin + 1 <<
" selbin=" <<
bin);
93 int nextbin =
bin + 1;
99 if (!first_in_nextbin)
102 float logEkin = TMath::Log(Ekin);
103 float logEkin_nominal = TMath::Log(first_in_bin->
Ekin_nominal());
104 float logEkin_next = TMath::Log(first_in_nextbin->
Ekin_nominal());
105 float numerator = logEkin - logEkin_nominal;
106 float denominator = logEkin_next - logEkin_nominal;
107 if (denominator <= 0)
110 if (
rnd < numerator / denominator)
113 << logEkin <<
" logEkin_nominal=" << logEkin_nominal
114 <<
" logEkin_next=" << logEkin_next <<
" (rnd=" <<
rnd
115 <<
" < p(next)=" << numerator / denominator
116 <<
")? => orgbin=" << nextbin - 1 <<
" selbin=" <<
bin);
125 return std::string(Form(
"Ekin=%1.1f", truth->
Ekin()));
131 return std::string(Form(
"bin=%d not in [%1.1f<=Ekin<%1.1f)",
bin,
136 return std::string(Form(
"bin=%d, %1.1f<=Ekin(+random)<%1.1f",
bin,
155 chain.setLevel(MSG::DEBUG);
163 chain.push_before_first_bin(param);
169 chain.push_back(param);
171 const int n_params = 5;
172 for (
int i = 2; i < n_params; ++i) {
178 chain.push_back_in_bin(param);
180 for (
int i = n_params; i >= 1; --i) {
186 chain.push_back_in_bin(param);
194 chain.push_back(param);
197 chain.push_before_first_bin(param);
202 truth->SetPtEtaPhiM(0.3, 0, 0, 0);
203 chain.simulate(*simulstate, truth, extrapol);
204 for (
double E = 1; E < 10.1; E += 1) {
206 truth->SetPtEtaPhiM(E, 0, 0, 0);
207 chain.simulate(*simulstate, truth, extrapol);
210 truth->SetPtEtaPhiM(100, 0, 0, 0);
211 chain.simulate(*simulstate, truth, extrapol);
214 chain.set_DoRandomInterpolation();
215 for (
double E = 15; E < 35.1; E += 4) {
217 truth->SetPtEtaPhiM(E, 0, 0, 0);
218 for (
int i = 0; i < 10; ++i)
219 chain.simulate(*simulstate, truth, extrapol);
#define ATH_MSG_NOCLASS(logger_name, x)
virtual void setLevel(MSG::Level lvl)
Update outputlevel.
virtual double Ekin_min() const
virtual double Ekin_max() const
virtual double Ekin_nominal() const
virtual unsigned int get_number_of_bins() const
std::vector< unsigned int > m_bin_start
Contains the index where the TFCSParametrizationBase* instances to run for a given bin start.
void recalc_pdgid_intersect()
const Chain_t & chain() const
void recalc_eta_intersect()
virtual unsigned int size() const override
Some derived classes have daughter instances of TFCSParametrizationBase objects The size() and operat...
bool DoRandomInterpolation() const
virtual const std::string get_variable_text(TFCSSimulationState &simulstate, const TFCSTruthState *, const TFCSExtrapolationState *) const override
static void unit_test(TFCSSimulationState *simulstate=nullptr, TFCSTruthState *truth=nullptr, const TFCSExtrapolationState *extrapol=nullptr)
virtual const std::string get_bin_text(int bin) const override
print the range of a bin; for bin -1, print the allowed range
TFCSParametrizationEkinSelectChain(const char *name=nullptr, const char *title=nullptr)
virtual int get_bin(TFCSSimulationState &, const TFCSTruthState *truth, const TFCSExtrapolationState *) const override
this method should determine in derived classes which bin to simulate, so that the simulate method ca...
virtual void push_back_in_bin(TFCSParametrizationBase *param)
virtual void recalc() override
Default is to call recalc_pdgid_intersect() and recalc_Ekin_eta_intersect()
std::vector< float > m_bin_low_edge
int val_to_bin(float val) const
double Ekin_nominal() const override
virtual void set_Ekin_max(double max)
virtual void set_Ekin_min(double min)
virtual void set_Ekin_nominal(double min)
CLHEP::HepRandomEngine * randomEngine()
static Root::TMsgLogger logger("iLumiCalc")