ATLAS Offline Software
Loading...
Searching...
No Matches
TFCSParametrizationEkinSelectChain.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "CLHEP/Random/RandFlat.h"
6
12
13#include <iostream>
14
15//=============================================
16//======= TFCSParametrizationEkinSelectChain =========
17//=============================================
18
20 clear();
21 if (size() == 0)
22 return;
23
27
28 chain().shrink_to_fit();
29}
30
35
37 TFCSSimulationState &simulstate, const TFCSTruthState *truth,
38 const TFCSExtrapolationState *) const {
39 if (!simulstate.randomEngine()) {
40 return -1;
41 }
42
43 float Ekin = truth->Ekin();
44 int bin = val_to_bin(Ekin);
45
47 return bin;
48 float rnd = CLHEP::RandFlat::shoot(simulstate.randomEngine());
49 if (bin < 0)
50 return bin;
51 if (bin >= (int)get_number_of_bins())
52 return bin;
53
54 // if no parametrizations for this bin, return
55 if (m_bin_start[bin + 1] == m_bin_start[bin])
56 return bin;
57
58 TFCSParametrizationBase *first_in_bin = chain()[m_bin_start[bin]];
59 if (!first_in_bin)
60 return bin;
61
62 if (Ekin < first_in_bin->Ekin_nominal()) {
63 if (bin == 0)
64 return bin;
65 int prevbin = bin - 1;
66 // if no parametrizations for previous bin, return
67 if (m_bin_start[prevbin + 1] == m_bin_start[prevbin])
68 return bin;
69
70 TFCSParametrizationBase *first_in_prevbin = chain()[m_bin_start[prevbin]];
71 if (!first_in_prevbin)
72 return bin;
73
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;
79 if (denominator <= 0)
80 return bin;
81
82 if (numerator / denominator < rnd)
83 bin = prevbin;
84 ATH_MSG_DEBUG("logEkin="
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);
90 } else {
91 if (bin == (int)get_number_of_bins() - 1)
92 return bin;
93 int nextbin = bin + 1;
94 // if no parametrizations for previous bin, return
95 if (m_bin_start[nextbin + 1] == m_bin_start[nextbin])
96 return bin;
97
98 TFCSParametrizationBase *first_in_nextbin = chain()[m_bin_start[nextbin]];
99 if (!first_in_nextbin)
100 return bin;
101
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)
108 return bin;
109
110 if (rnd < numerator / denominator)
111 bin = nextbin;
112 ATH_MSG_DEBUG("logEkin="
113 << logEkin << " logEkin_nominal=" << logEkin_nominal
114 << " logEkin_next=" << logEkin_next << " (rnd=" << rnd
115 << " < p(next)=" << numerator / denominator
116 << ")? => orgbin=" << nextbin - 1 << " selbin=" << bin);
117 }
118
119 return bin;
120}
121
123 TFCSSimulationState &, const TFCSTruthState *truth,
124 const TFCSExtrapolationState *) const {
125 return std::string(Form("Ekin=%1.1f", truth->Ekin()));
126}
127
128const std::string
130 if (bin == -1 || bin >= (int)get_number_of_bins()) {
131 return std::string(Form("bin=%d not in [%1.1f<=Ekin<%1.1f)", bin,
134 }
135 if (DoRandomInterpolation()) {
136 return std::string(Form("bin=%d, %1.1f<=Ekin(+random)<%1.1f", bin,
138 }
139 return std::string(Form("bin=%d, %1.1f<=Ekin<%1.1f", bin, m_bin_low_edge[bin],
140 m_bin_low_edge[bin + 1]));
141}
142
144 TFCSSimulationState *simulstate, TFCSTruthState *truth,
145 const TFCSExtrapolationState *extrapol) {
147 if (!simulstate)
148 simulstate = new TFCSSimulationState();
149 if (!truth)
150 truth = new TFCSTruthState();
151 if (!extrapol)
152 extrapol = new TFCSExtrapolationState();
153
155 chain.setLevel(MSG::DEBUG);
156
157 TFCSParametrization *param;
158 param = new TFCSInvisibleParametrization("A begin all", "A begin all");
159 param->setLevel(MSG::DEBUG);
160 param->set_Ekin_nominal(2);
161 param->set_Ekin_min(2);
162 param->set_Ekin_max(5);
163 chain.push_before_first_bin(param);
164 param = new TFCSInvisibleParametrization("A end all", "A end all");
165 param->setLevel(MSG::DEBUG);
166 param->set_Ekin_nominal(2);
167 param->set_Ekin_min(2);
168 param->set_Ekin_max(5);
169 chain.push_back(param);
170
171 const int n_params = 5;
172 for (int i = 2; i < n_params; ++i) {
173 param = new TFCSInvisibleParametrization(Form("A%d", i), Form("A %d", i));
174 param->setLevel(MSG::DEBUG);
175 param->set_Ekin_nominal(TMath::Power(2.0, i));
176 param->set_Ekin_min(TMath::Power(2.0, i - 0.5));
177 param->set_Ekin_max(TMath::Power(2.0, i + 0.5));
178 chain.push_back_in_bin(param);
179 }
180 for (int i = n_params; i >= 1; --i) {
181 param = new TFCSInvisibleParametrization(Form("B%d", i), Form("B %d", i));
182 param->setLevel(MSG::DEBUG);
183 param->set_Ekin_nominal(TMath::Power(2.0, i));
184 param->set_Ekin_min(TMath::Power(2.0, i - 0.5));
185 param->set_Ekin_max(TMath::Power(2.0, i + 0.5));
186 chain.push_back_in_bin(param);
187 }
188
189 ATH_MSG_NOCLASS(logger, "==== Chain setup ====");
190 chain.Print();
191
192 param = new TFCSInvisibleParametrization("B end all", "B end all");
193 param->setLevel(MSG::DEBUG);
194 chain.push_back(param);
195 param = new TFCSInvisibleParametrization("B begin all", "B begin all");
196 param->setLevel(MSG::DEBUG);
197 chain.push_before_first_bin(param);
198
199 ATH_MSG_NOCLASS(logger, "==== Chain setup ====");
200 chain.Print();
201 ATH_MSG_NOCLASS(logger, "==== Simulate with E=0.3 ====");
202 truth->SetPtEtaPhiM(0.3, 0, 0, 0);
203 chain.simulate(*simulstate, truth, extrapol);
204 for (double E = 1; E < 10.1; E += 1) {
205 ATH_MSG_NOCLASS(logger, "==== Simulate with E=" << E << " ====");
206 truth->SetPtEtaPhiM(E, 0, 0, 0);
207 chain.simulate(*simulstate, truth, extrapol);
208 }
209 ATH_MSG_NOCLASS(logger, "==== Simulate with E=100 ====");
210 truth->SetPtEtaPhiM(100, 0, 0, 0);
211 chain.simulate(*simulstate, truth, extrapol);
212 ATH_MSG_NOCLASS(logger, "===================================" << std::endl);
213 ATH_MSG_NOCLASS(logger, "====== now with random bin ========" << std::endl);
214 chain.set_DoRandomInterpolation();
215 for (double E = 15; E < 35.1; E += 4) {
216 ATH_MSG_NOCLASS(logger, "==== Simulate with E=" << E << " ====");
217 truth->SetPtEtaPhiM(E, 0, 0, 0);
218 for (int i = 0; i < 10; ++i)
219 chain.simulate(*simulstate, truth, extrapol);
220 }
221 ATH_MSG_NOCLASS(logger, "===================================" << std::endl);
222}
#define ATH_MSG_DEBUG(x)
static TRandom * rnd
#define ATH_MSG_NOCLASS(logger_name, x)
Definition MLogging.h:52
Cut down AthMessaging.
Definition MLogging.h:176
virtual void setLevel(MSG::Level lvl)
Update outputlevel.
Definition MLogging.cxx:105
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.
const Chain_t & chain() const
virtual unsigned int size() const override
Some derived classes have daughter instances of TFCSParametrizationBase objects The size() and operat...
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()
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()
double Ekin() const
static Root::TMsgLogger logger("iLumiCalc")