ATLAS Offline Software
Loading...
Searching...
No Matches
TFCSParametrizationChain.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
11#include <algorithm>
12#include <iterator>
13#include "TBuffer.h"
14#include "TDirectory.h"
15
16//=============================================
17//======= TFCSParametrizationChain =========
18//=============================================
19
21 set_pdgid(m_chain[0]->pdgid());
22
23 for (const auto &param : m_chain) {
24 std::set<int> tmp;
25
26 std::set_intersection(pdgid().begin(), pdgid().end(),
27 param->pdgid().begin(), param->pdgid().end(),
28 std::inserter(tmp, tmp.begin()));
29 set_pdgid(tmp);
30 }
31}
32
34 set_pdgid(chain()[0]->pdgid());
35
36 for (const auto &param : chain()) {
37 std::set<int> tmp;
38
39 std::set_union(pdgid().begin(), pdgid().end(), param->pdgid().begin(),
40 param->pdgid().end(), std::inserter(tmp, tmp.begin()));
41 set_pdgid(tmp);
42 }
43}
44
46 set_Ekin(*m_chain[0]);
47
48 for (const auto &param : m_chain) {
49 if (param->Ekin_min() > Ekin_min())
50 set_Ekin_min(param->Ekin_min());
51 if (param->Ekin_max() < Ekin_max())
52 set_Ekin_max(param->Ekin_max());
53 if (Ekin_nominal() < Ekin_min() || Ekin_nominal() > Ekin_max())
54 set_Ekin_nominal(param->Ekin_nominal());
55 }
56
57 if (Ekin_nominal() < Ekin_min() || Ekin_nominal() > Ekin_max())
58 set_Ekin_nominal(0.5 * (Ekin_min() + Ekin_max()));
59}
60
62 set_eta(*m_chain[0]);
63
64 for (const auto &param : m_chain) {
65 if (param->eta_min() > eta_min())
66 set_eta_min(param->eta_min());
67 if (param->eta_max() < eta_max())
68 set_eta_max(param->eta_max());
69 if (eta_nominal() < eta_min() || eta_nominal() > eta_max())
70 set_eta_nominal(param->eta_nominal());
71 }
72
73 if (eta_nominal() < eta_min() || eta_nominal() > eta_max())
74 set_eta_nominal(0.5 * (eta_min() + eta_max()));
75}
76
81
83 set_Ekin(*m_chain[0]);
84
85 for (const auto &param : m_chain) {
86 if (param->Ekin_min() < Ekin_min())
87 set_Ekin_min(param->Ekin_min());
88 if (param->Ekin_max() > Ekin_max())
89 set_Ekin_max(param->Ekin_max());
90 if (Ekin_nominal() < Ekin_min() || Ekin_nominal() > Ekin_max())
91 set_Ekin_nominal(param->Ekin_nominal());
92 }
93
94 if (Ekin_nominal() < Ekin_min() || Ekin_nominal() > Ekin_max())
95 set_Ekin_nominal(0.5 * (Ekin_min() + Ekin_max()));
96}
97
99 set_eta(*m_chain[0]);
100
101 for (const auto &param : m_chain) {
102 if (param->eta_min() < eta_min())
103 set_eta_min(param->eta_min());
104 if (param->eta_max() > eta_max())
105 set_eta_max(param->eta_max());
106 if (eta_nominal() < eta_min() || eta_nominal() > eta_max())
107 set_eta_nominal(param->eta_nominal());
108 }
109
110 if (eta_nominal() < eta_min() || eta_nominal() > eta_max())
111 set_eta_nominal(0.5 * (eta_min() + eta_max()));
112}
113
118
120 clear();
121 if (m_chain.empty())
122 return;
123
126
127 m_chain.shrink_to_fit();
128}
129
131 for (const auto &param : m_chain)
132 if (!param->is_match_Ekin_bin(Ekin_bin))
133 return false;
134 return true;
135}
136
138 for (const auto &param : m_chain)
139 if (!param->is_match_calosample(calosample))
140 return false;
141 return true;
142}
143
145 TFCSSimulationState &simulstate, const TFCSTruthState *truth,
146 const TFCSExtrapolationState *extrapol) const {
147 Int_t retry = 0;
148 Int_t retry_warning = 1;
149
150 FCSReturnCode status = FCSSuccess;
151 for (int i = 0; i <= retry; i++) {
152 if (i >= retry_warning)
154 "TFCSParametrizationChain::simulate(): Retry simulate call "
155 << i << "/" << retry);
156 for (const auto &param : m_chain) {
157 status = simulate_and_retry(param, simulstate, truth, extrapol);
158
159 if (status >= FCSRetry) {
160 retry = status - FCSRetry;
161 retry_warning = retry >> 1;
162 if (retry_warning < 1)
163 retry_warning = 1;
164 break;
165 }
166 if (status == FCSFatal)
167 return FCSFatal;
168 }
169
170 if (status == FCSSuccess)
171 break;
172 }
173
174 if (status != FCSSuccess) {
176 "TFCSParametrizationChain::simulate(): Simulate call failed after "
177 << retry << " retries");
178 return FCSFatal;
179 }
180
181 return FCSSuccess;
182}
183
184void TFCSParametrizationChain::Print(Option_t *option) const {
186 TString opt(option);
187 // bool shortprint=opt.Index("short")>=0;
188 // bool longprint=msgLvl(MSG::DEBUG) || (msgLvl(MSG::INFO) && !shortprint);
189
190 char count = 'A';
191 for (const auto &param : m_chain) {
192 param->Print(opt + count + ' ');
193 count++;
194 }
195}
196
197void TFCSParametrizationChain::Streamer(TBuffer &R_b) {
198 // Stream an object of class TFCSParametrizationChain.
199
200 UInt_t R_s, R_c;
201 TDirectory *dir = nullptr;
202
203 if (R_b.IsReading()) {
204 Version_t R_v = R_b.ReadVersion(&R_s, &R_c);
205 if (R_v == 1) {
206 R_b.SetBufferOffset(R_s);
207 R_b.ReadClassBuffer(TFCSParametrizationChain::Class(), this);
208 } else {
209 TFCSParametrization::Streamer(R_b);
210
211 TObject *parent = R_b.GetParent();
212 if (R_b.GetParent()) {
213 if (parent->InheritsFrom(TDirectory::Class())) {
214 dir = static_cast<TDirectory *>(parent);
215 }
216 }
217
219 R_stl.clear();
220 TClass *R_tcl1 = TFCSParametrizationBase::Class();
221 if (R_tcl1 == nullptr) {
222 Error("m_chain streamer",
223 "Missing the TClass object for class TFCSParametrizationBase *!");
224 return;
225 }
226 int R_i, R_n;
227 R_b >> R_n;
228 R_stl.reserve(R_n);
229 for (R_i = 0; R_i < R_n; R_i++) {
230 std::unique_ptr<TFCSParametrizationBase> R_t;
231 R_t.reset((TFCSParametrizationBase *)R_b.ReadObjectAny(R_tcl1));
232 if (R_t != nullptr) {
233 if (R_t->InheritsFrom(TFCSParametrizationPlaceholder::Class())) {
234 std::unique_ptr<TFCSParametrizationBase> new_R_t = nullptr;
235
236 if (dir) {
237 new_R_t.reset(
238 (TFCSParametrizationBase *)dir->Get(R_t->GetName()));
239 }
240
241 if (new_R_t) {
242 R_t = std::move(new_R_t);
243 } else {
244 Error("TFCSParametrizationChain::Streamer",
245 "Found placeholder object in the parametrization chain, "
246 "but could not read the real object from the file!");
247 }
248 }
249 }
250 if(R_t){
251 R_t->fixHists();
252 R_stl.emplace_back(R_t.release());
253 }
254 }
255
256 R_b.CheckByteCount(R_s, R_c, TFCSParametrizationChain::IsA());
257 }
258 } else {
259 R_c = R_b.WriteVersion(TFCSParametrizationChain::IsA(), kTRUE);
260 TFCSParametrization::Streamer(R_b);
261
262 if (SplitChainObjects()) {
263 TObject *parent = R_b.GetParent();
264 if (R_b.GetParent()) {
265 if (parent->InheritsFrom(TDirectory::Class())) {
266 dir = static_cast<TDirectory *>(parent);
267 }
268 }
269 }
270
272 int R_n = int(R_stl.size());
273 R_b << R_n;
274 if (R_n) {
275 TFCSParametrizationChain::Chain_t::iterator R_k;
276 for (R_k = R_stl.begin(); R_k != R_stl.end(); ++R_k) {
277 TFCSParametrizationBase *R_t = *R_k; // Ownership stays with m_chain
278 if (dir && R_t != nullptr) {
279 dir->WriteTObject(R_t);
280 TFCSParametrizationPlaceholder tmp( R_t->GetName(), TString("Placeholder for: ") + R_t->GetTitle());
281 R_b.WriteObject( &tmp, false ); // tell R_b object with same address are actually different
282 } else {
283 R_b.WriteObject( R_t );
284 }
285 }
286 }
287 R_b.SetByteCount(R_c, kTRUE);
288 }
289}
290
292 TFCSSimulationState *simulstate, const TFCSTruthState *truth,
293 const TFCSExtrapolationState *extrapol) {
295 if (!simulstate)
296 simulstate = new TFCSSimulationState();
297 if (!truth)
298 truth = new TFCSTruthState();
299 if (!extrapol)
300 extrapol = new TFCSExtrapolationState();
301
302 TFCSParametrizationChain chain("chain", "chain");
303 chain.setLevel(MSG::DEBUG);
304
305 ATH_MSG_NOCLASS(logger, "==== Chain setup ====");
306 chain.Print();
307 ATH_MSG_NOCLASS(logger, "==== Simulate with empty chain ====");
308 chain.simulate(*simulstate, truth, extrapol);
309 ATH_MSG_NOCLASS(logger, "===================================" << std::endl);
310
312 param = new TFCSInvisibleParametrization("A begin all", "A begin all");
313 param->setLevel(MSG::VERBOSE);
314 chain.push_back(param);
315 param = new TFCSParametrization("A end all", "A end all");
316 param->setLevel(MSG::DEBUG);
317 chain.push_back(param);
318
319 ATH_MSG_NOCLASS(logger, "==== Chain setup ====");
320 chain.Print();
321 ATH_MSG_NOCLASS(logger, "==== Simulate only begin/end all ====");
322 chain.simulate(*simulstate, truth, extrapol);
324 "==== Simulate only begin/end all with chain retry====");
325 chain.set_RetryChainFromStart();
326 chain.simulate(*simulstate, truth, extrapol);
327 chain.reset_RetryChainFromStart();
328 ATH_MSG_NOCLASS(logger, "===================================" << std::endl);
329}
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_NOCLASS(logger_name, x)
Definition MLogging.h:52
FCSReturnCode
Base class for all FastCaloSim parametrizations Functionality in derivde classes is provided through ...
Cut down AthMessaging.
Definition MLogging.h:176
virtual void setLevel(MSG::Level lvl)
Update outputlevel.
Definition MLogging.cxx:105
void Print(Option_t *option="") const
Print object information.
TFCSParametrizationBase(const char *name=nullptr, const char *title=nullptr)
FCSReturnCode simulate_and_retry(TFCSParametrizationBase *parametrization, TFCSSimulationState &simulstate, const TFCSTruthState *truth, const TFCSExtrapolationState *extrapol) const
static void unit_test(TFCSSimulationState *simulstate=nullptr, const TFCSTruthState *truth=nullptr, const TFCSExtrapolationState *extrapol=nullptr)
void Print(Option_t *option="") const override
TFCSParametrizationChain(const char *name=nullptr, const char *title=nullptr)
std::vector< TFCSParametrizationBase * > Chain_t
virtual bool is_match_calosample(int calosample) const override
const Chain_t & chain() const
virtual FCSReturnCode simulate(TFCSSimulationState &simulstate, const TFCSTruthState *truth, const TFCSExtrapolationState *extrapol) const override
Method in all derived classes to do some simulation.
virtual void recalc()
Default is to call recalc_pdgid_intersect() and recalc_Ekin_eta_intersect().
virtual bool is_match_Ekin_bin(int Ekin_bin) const override
virtual void set_eta(const TFCSParametrizationBase &ref)
double Ekin_nominal() const override
double eta_nominal() const override
virtual void set_eta_max(double max)
TFCSParametrization(const char *name=nullptr, const char *title=nullptr)
virtual void set_Ekin_max(double max)
virtual void set_Ekin_min(double min)
virtual void set_Ekin(const TFCSParametrizationBase &ref)
double Ekin_min() const override
double eta_max() const override
double Ekin_max() const override
const std::set< int > & pdgid() const override
virtual void set_eta_nominal(double min)
double eta_min() const override
virtual void set_pdgid(int id)
virtual void set_eta_min(double min)
virtual void set_Ekin_nominal(double min)
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:148
static Root::TMsgLogger logger("iLumiCalc")
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition Error.h:16