ATLAS Offline Software
TFCSParametrizationBase.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "TClass.h"
7 #ifdef USE_GPU
8 // for purpose of copying all parameterization files to GPU in initialization
13 #include "TString.h"
14 #endif
15 
16 //=============================================
17 //======= TFCSParametrizationBase =========
18 //=============================================
19 
21  const char *title)
22  : TNamed(name, title) {}
23 
25  for (unsigned int i = 0; i < size(); ++i)
26  (*this)[i]->set_geometry(geo);
27 }
28 
33  TFCSSimulationState & /*simulstate*/, const TFCSTruthState * /*truth*/,
34  const TFCSExtrapolationState * /*extrapol*/) const {
35  ATH_MSG_ERROR("now in TFCSParametrizationBase::simulate(). This should "
36  "normally not happen");
37  // Force one retry to issue a printout from the chain causing the call to this
38  // method
39  return (FCSReturnCode)(FCSRetry + 1);
40 }
41 
43  const TFCSParametrizationBase &ref) const {
44  if (this == &ref) {
45  ATH_MSG_DEBUG("compare(): identical instances " << this << " == " << &ref);
46  return true;
47  }
48  return false;
49 }
50 
52 void TFCSParametrizationBase::Print(Option_t *option) const {
53  TString opt(option);
54  bool shortprint = opt.Index("short") >= 0;
55  bool longprint = msgLvl(MSG::DEBUG) || (msgLvl(MSG::INFO) && !shortprint);
56  TString optprint = opt;
57  optprint.ReplaceAll("short", "");
58 
59  if (longprint) {
60  ATH_MSG_INFO(optprint << GetTitle() << " " << IsA()->GetName() );
61  ATH_MSG(INFO) << optprint << " PDGID: ";
62  if (is_match_all_pdgid()) {
63  ATH_MSG(INFO) << "all";
64  } else {
65  for (std::set<int>::iterator it = pdgid().begin(); it != pdgid().end();
66  ++it) {
67  if (it != pdgid().begin())
68  ATH_MSG(INFO) << ", ";
69  ATH_MSG(INFO) << *it;
70  }
71  }
72  if (is_match_all_Ekin()) {
73  ATH_MSG(INFO) << " ; Ekin=all";
74  } else {
75  ATH_MSG(INFO) << " ; Ekin=" << Ekin_nominal() << " [" << Ekin_min()
76  << " , " << Ekin_max() << ") MeV";
77  }
78  if (is_match_all_eta()) {
79  ATH_MSG(INFO) << " ; eta=all";
80  } else {
81  ATH_MSG(INFO) << " ; eta=" << eta_nominal() << " [" << eta_min() << " , "
82  << eta_max() << ")";
83  }
84  ATH_MSG(INFO) << END_MSG(INFO);
85  } else {
86  ATH_MSG_INFO(optprint << GetTitle());
87  }
88 }
89 
91  FindDuplicateClasses_t &dupclasses) {
92 
93  for (unsigned int i = 0; i < size(); ++i)
94  if ((*this)[i]) {
95  TFCSParametrizationBase *param = (*this)[i];
96  FindDuplicates_t &dup = dupclasses[param->GetName()];
97  // If param is already in the duplication list, skip over
98  auto checkexist = dup.find(param);
99  if (checkexist != dup.end()) {
100  ATH_MSG_WARNING(" [TFCSParametrizationBase::FindDuplicates] "
101  "DUPLICATE POINTER DETECTED");
102 
103  ATH_MSG_WARNING(" - Pointer : " << param);
104  ATH_MSG_WARNING(" - Name : " << param->GetName());
105  ATH_MSG_WARNING(" - Class : " << param->ClassName());
106  ATH_MSG_WARNING(" - Occurs in parent : " << this
107  << " (" << this->ClassName() << ")"
108  << " index=" << i);
109 
110  if (checkexist->second.replace) {
111  TFCSParametrizationBase *refparam = checkexist->second.replace;
112  ATH_MSG_DEBUG("Found duplicate pointer: "
113  << refparam << "=" << refparam->GetName()
114  << ", duplicate is " << param << "=" << param->GetName()
115  << " index " << i << " of " << this);
116  dup[refparam].mother.push_back(this);
117  dup[refparam].index.push_back(i);
118  }
119  continue;
120  }
121  // Add param to duplication list
122  dup[param] = Duplicate_t();
123  for (auto &ref : dup) {
124  TFCSParametrizationBase *refparam = ref.first;
125  // skip itself, as this just added above
126  if (param == refparam)
127  continue;
128  // skip nullptr reference
129  if (refparam == nullptr)
130  continue;
131  // skip reference that is itself going to get replaced
132  if (ref.second.replace)
133  continue;
134  // Check for objects with identical content
135  if (*param == *refparam) {
136  ATH_MSG_DEBUG("Found duplicate: "
137  << refparam << "=" << refparam->GetName()
138  << ", duplicate is " << param << "=" << param->GetName()
139  << " index " << i << " of " << this);
140 
141  dup[param].replace = refparam;
142  dup[refparam].mother.push_back(this);
143  dup[refparam].index.push_back(i);
144  break;
145  }
146  }
147  // Continue for child objects in param
148  param->FindDuplicates(dupclasses);
149  }
150 }
151 
153  FindDuplicateClasses_t dupclasses;
154  FindDuplicates(dupclasses);
155 
156  std::set<TFCSParametrizationBase *> dellist;
157  for (auto &dupiter : dupclasses) {
158  FindDuplicates_t &dup = dupiter.second;
159  for (auto onedup : dup) {
160  if (onedup.second.mother.empty())
161  continue;
162  TFCSParametrizationBase *ref = onedup.first;
163  ATH_MSG_DEBUG("Main object " << ref << "=" << ref->GetName());
164  for (unsigned int i = 0; i < onedup.second.mother.size(); ++i) {
165  int index = onedup.second.index[i];
166  TFCSParametrizationBase *mother = onedup.second.mother[i];
167  TFCSParametrizationBase *delparam = mother->operator[](index);
168  unsigned int delcount = dup[delparam].mother.size();
169  if (delcount == 0) {
170  ATH_MSG_DEBUG(" - Delete object "
171  << delparam << "=" << delparam->GetName() << " index "
172  << index << " of " << mother << ", has " << delcount
173  << " other replacements attached. Deleting");
174  mother->set_daughter(index, ref);
175  dellist.insert(delparam);
176  } else {
177  ATH_MSG_WARNING(" - Delete object "
178  << delparam << "=" << delparam->GetName() << " index "
179  << index << " of " << mother << ", has " << delcount
180  << " other replacements attached. Skipping");
181  }
182  }
183  }
184  }
185 
186  ATH_MSG_INFO("RERUNNING DUPLICATE FINDING");
187  FindDuplicateClasses_t dupclasses2;
188  FindDuplicates(dupclasses2);
189 
190  std::map<std::string, int> ndel;
191  for (auto *delparam : dellist) {
192  FindDuplicates_t &dup2 = dupclasses2[delparam->GetName()];
193  bool present = dup2.find(delparam) != dup2.end();
194  if (present) {
195  ATH_MSG_WARNING("- Delete object " << delparam << "="
196  << delparam->GetName()
197  << " still referenced somewhere!");
198  } else {
199  ATH_MSG_DEBUG("- Delete object " << delparam << "="
200  << delparam->GetName());
201  ++ndel[delparam->ClassName()];
202  delete delparam;
203  }
204  }
205  for (auto &del : ndel)
206  ATH_MSG_INFO("Deleted " << del.second << " duplicate objects of class "
207  << del.first);
208 }
209 
211  for (unsigned int i = 0; i < size(); ++i)
212  if ((*this)[i]) {
213  TFCSParametrizationBase *param = (*this)[i];
214  param->SetName("");
215  param->SetTitle("");
216 
217  // Continue for child objects in param
218  param->RemoveNameTitle();
219  }
220 }
221 
222 #ifdef USE_GPU
223 void TFCSParametrizationBase::Copy2GPU() {
224  for (unsigned int i = 0; i < size(); ++i) {
225  if (!((*this)[i]))
226  continue;
227  TFCSParametrizationBase *param = (*this)[i];
228  TString name = param->ClassName();
229  if (name.EqualTo("TFCSLateralShapeParametrizationHitChain")) {
230  auto size = (static_cast<TFCSLateralShapeParametrizationHitChain *>(param))->size();
231  for (size_t ichain = 0; ichain < size; ++ichain) {
232  TFCSParametrizationBase *hitsim =
233  *(static_cast<TFCSLateralShapeParametrizationHitChain *>(param))[ichain];
234  TString hitsimname = hitsim->ClassName();
235  if (hitsimname.EqualTo("TFCSHistoLateralShapeParametrization")) {
236  (static_cast<TFCSHistoLateralShapeParametrization *>(hitsim))->LoadHistFuncs();
237  } else if (hitsimname.EqualTo("TFCSHitCellMappingWiggle")) {
238  (static_cast<TFCSHitCellMappingWiggle *>(hitsim))->LoadHistFuncs();
239  } else if (hitsimname.EqualTo("TFCSHistoLateralShapeGausLogWeight")) {
240  (static_cast<TFCSHistoLateralShapeGausLogWeight *>(hitsim))->LoadHist();
241  }
242  }
243  }
244  param->Copy2GPU();
245  }
246 }
247 #endif
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
TFCSParametrizationBase::set_daughter
virtual void set_daughter(unsigned int, TFCSParametrizationBase *)
Some derived classes have daughter instances of TFCSParametrizationBase objects The set_daughter meth...
Definition: TFCSParametrizationBase.h:113
TFCSHitCellMappingWiggle
Definition: TFCSHitCellMappingWiggle.h:19
FCSReturnCode
FCSReturnCode
Base class for all FastCaloSim parametrizations Functionality in derivde classes is provided through ...
Definition: TFCSParametrizationBase.h:41
TFCSParametrizationBase::compare
bool compare(const TFCSParametrizationBase &ref) const
Do not persistify!
Definition: TFCSParametrizationBase.cxx:42
TFCSLateralShapeParametrizationHitChain
Definition: TFCSLateralShapeParametrizationHitChain.h:15
ATH_MSG
#define ATH_MSG(lvl)
Definition: AthMsgStreamMacros.h:38
TFCSHistoLateralShapeParametrization
Definition: TFCSHistoLateralShapeParametrization.h:20
IsA
#define IsA
Declare the TObject style functions.
Definition: xAODTEventBranch.h:59
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TFCSParametrizationBase::is_match_all_pdgid
virtual bool is_match_all_pdgid() const
Definition: TFCSParametrizationBase.h:66
make_coralServer_rep.opt
opt
Definition: make_coralServer_rep.py:19
TFCSParametrizationBase::eta_nominal
virtual double eta_nominal() const
Definition: TFCSParametrizationBase.h:79
index
Definition: index.py:1
TFCSHistoLateralShapeGausLogWeight
Definition: TFCSHistoLateralShapeGausLogWeight.h:16
skel.it
it
Definition: skel.GENtoEVGEN.py:407
TFCSParametrizationBase::FindDuplicates
void FindDuplicates(FindDuplicateClasses_t &dup)
Definition: TFCSParametrizationBase.cxx:90
ReadBchFromCrest.begin
begin
Definition: ReadBchFromCrest.py:80
TFCSParametrizationBase::Ekin_nominal
virtual double Ekin_nominal() const
Definition: TFCSParametrizationBase.h:76
TFCSParametrizationBase::simulate
virtual FCSReturnCode simulate(TFCSSimulationState &simulstate, const TFCSTruthState *truth, const TFCSExtrapolationState *extrapol) const
Method in all derived classes to do some simulation.
Definition: TFCSParametrizationBase.cxx:32
TFCSExtrapolationState
Definition: TFCSExtrapolationState.h:13
TFCSParametrizationBase::is_match_all_Ekin
virtual bool is_match_all_Ekin() const
Definition: TFCSParametrizationBase.h:67
TFCSHistoLateralShapeGausLogWeight.h
FCSRetry
@ FCSRetry
Definition: TFCSParametrizationBase.h:41
TFCSParametrizationBase.h
TFCSParametrizationBase
Definition: TFCSParametrizationBase.h:46
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TFCSParametrizationBase::Ekin_max
virtual double Ekin_max() const
Definition: TFCSParametrizationBase.h:78
lumiFormat.i
int i
Definition: lumiFormat.py:85
TFCSLateralShapeParametrizationHitChain.h
TFCSParametrizationBase::pdgid
virtual const std::set< int > & pdgid() const
Definition: TFCSParametrizationBase.h:72
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TFCSHistoLateralShapeParametrization.h
ICaloGeometry
Definition: ICaloGeometry.h:14
ClassName
An interface for getting the name of a class as a string.
Definition: AthenaKernel/AthenaKernel/ClassName.h:31
TFCSParametrizationBase::eta_min
virtual double eta_min() const
Definition: TFCSParametrizationBase.h:80
TFCSParametrizationBase::FindDuplicateClasses_t
std::map< std::string, FindDuplicates_t > FindDuplicateClasses_t
Definition: TFCSParametrizationBase.h:142
TFCSParametrizationBase::eta_max
virtual double eta_max() const
Definition: TFCSParametrizationBase.h:81
covarianceTool.title
title
Definition: covarianceTool.py:542
TFCSParametrizationBase::set_geometry
virtual void set_geometry(ICaloGeometry *geo)
Method to set the geometry access pointer.
Definition: TFCSParametrizationBase.cxx:24
TFCSParametrizationBase::Duplicate_t
Definition: TFCSParametrizationBase.h:136
TFCSParametrizationBase::Print
void Print(Option_t *option="") const
Print object information.
Definition: TFCSParametrizationBase.cxx:52
TFCSParametrizationBase::FindDuplicates_t
std::map< TFCSParametrizationBase *, Duplicate_t > FindDuplicates_t
Definition: TFCSParametrizationBase.h:141
TFCSParametrizationBase::RemoveNameTitle
void RemoveNameTitle()
Definition: TFCSParametrizationBase.cxx:210
TFCSParametrizationBase::Ekin_min
virtual double Ekin_min() const
Definition: TFCSParametrizationBase.h:77
TFCSParametrizationBase::RemoveDuplicates
void RemoveDuplicates()
Definition: TFCSParametrizationBase.cxx:152
TFCSParametrizationBase::is_match_all_eta
virtual bool is_match_all_eta() const
Definition: TFCSParametrizationBase.h:68
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DeMoScan.index
string index
Definition: DeMoScan.py:362
END_MSG
#define END_MSG(lvl)
Definition: MLogging.h:171
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.Constants.INFO
int INFO
Definition: Control/AthenaCommon/python/Constants.py:15
ref
const boost::regex ref(r_ef)
LArCellConditions.geo
bool geo
Definition: LArCellConditions.py:46
DEBUG
#define DEBUG
Definition: page_access.h:11
TFCSHitCellMappingWiggle.h
TFCSParametrizationBase::TFCSParametrizationBase
TFCSParametrizationBase(const char *name=nullptr, const char *title=nullptr)
Definition: TFCSParametrizationBase.cxx:20
TFCSTruthState
Definition: TFCSTruthState.h:13
TFCSParametrizationBase::size
virtual unsigned int size() const
Some derived classes have daughter instances of TFCSParametrizationBase objects The size() and operat...
Definition: TFCSParametrizationBase.h:93
TFCSSimulationState
Definition: TFCSSimulationState.h:32
ISF_FCS::MLogging::msgLvl
bool msgLvl(const MSG::Level lvl) const
Check whether the logging system is active at the provided verbosity level.
Definition: MLogging.h:222