ATLAS Offline Software
Loading...
Searching...
No Matches
TFCSParametrizationChain.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 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 R__stl.emplace_back(R__t.release());
251 }
252
253 R__b.CheckByteCount(R__s, R__c, TFCSParametrizationChain::IsA());
254 }
255 } else {
256 R__c = R__b.WriteVersion(TFCSParametrizationChain::IsA(), kTRUE);
257 TFCSParametrization::Streamer(R__b);
258
259 if (SplitChainObjects()) {
260 TObject *parent = R__b.GetParent();
261 if (R__b.GetParent()) {
262 if (parent->InheritsFrom(TDirectory::Class())) {
263 dir = static_cast<TDirectory *>(parent);
264 }
265 }
266 }
267
269 int R__n = int(R__stl.size());
270 R__b << R__n;
271 if (R__n) {
272 TFCSParametrizationChain::Chain_t::iterator R__k;
273 for (R__k = R__stl.begin(); R__k != R__stl.end(); ++R__k) {
274 TFCSParametrizationBase *R__t = *R__k; // Ownership stays with m_chain
275 if (dir && R__t != nullptr) {
276 dir->WriteTObject(R__t);
277 TFCSParametrizationPlaceholder tmp( R__t->GetName(), TString("Placeholder for: ") + R__t->GetTitle());
278 R__b.WriteObject( &tmp, false ); // tell R__b object with same address are actually different
279 } else {
280 R__b.WriteObject( R__t );
281 }
282 }
283 }
284 R__b.SetByteCount(R__c, kTRUE);
285 }
286}
287
289 TFCSSimulationState *simulstate, const TFCSTruthState *truth,
290 const TFCSExtrapolationState *extrapol) {
292 if (!simulstate)
293 simulstate = new TFCSSimulationState();
294 if (!truth)
295 truth = new TFCSTruthState();
296 if (!extrapol)
297 extrapol = new TFCSExtrapolationState();
298
299 TFCSParametrizationChain chain("chain", "chain");
300 chain.setLevel(MSG::DEBUG);
301
302 ATH_MSG_NOCLASS(logger, "==== Chain setup ====");
303 chain.Print();
304 ATH_MSG_NOCLASS(logger, "==== Simulate with empty chain ====");
305 chain.simulate(*simulstate, truth, extrapol);
306 ATH_MSG_NOCLASS(logger, "===================================" << std::endl);
307
309 param = new TFCSInvisibleParametrization("A begin all", "A begin all");
310 param->setLevel(MSG::VERBOSE);
311 chain.push_back(param);
312 param = new TFCSParametrization("A end all", "A end all");
313 param->setLevel(MSG::DEBUG);
314 chain.push_back(param);
315
316 ATH_MSG_NOCLASS(logger, "==== Chain setup ====");
317 chain.Print();
318 ATH_MSG_NOCLASS(logger, "==== Simulate only begin/end all ====");
319 chain.simulate(*simulstate, truth, extrapol);
321 "==== Simulate only begin/end all with chain retry====");
322 chain.set_RetryChainFromStart();
323 chain.simulate(*simulstate, truth, extrapol);
324 chain.reset_RetryChainFromStart();
325 ATH_MSG_NOCLASS(logger, "===================================" << std::endl);
326}
#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:146
static Root::TMsgLogger logger("iLumiCalc")
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition Error.h:16