ATLAS Offline Software
TFCSGANXMLParameters.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // TFCSGANXMLParameters.cxx, (c) ATLAS Detector software //
8 
9 // Class header include
11 
13 
15 
17  int pid, int etaMid, const std::string& FastCaloGANInputFolderName) {
18 
19  m_fastCaloGANInputFolderName = FastCaloGANInputFolderName;
20  std::string xmlFullFileName = FastCaloGANInputFolderName + "/binning.xml";
21 
22  // Parse the XML file
23  xmlDocPtr doc = xmlParseFile(xmlFullFileName.c_str());
24  if (!doc) {
25  ATH_MSG_WARNING("Failed to parse XML file: " << xmlFullFileName);
26  return;
27  }
28 
29  for (xmlNodePtr nodeRoot = doc->children; nodeRoot != nullptr;
30  nodeRoot = nodeRoot->next) {
31  if (xmlStrEqual(nodeRoot->name, BAD_CAST "Bins")) {
32  for (xmlNodePtr nodeParticle = nodeRoot->children;
33  nodeParticle != nullptr; nodeParticle = nodeParticle->next) {
34  if (xmlStrEqual(nodeParticle->name, BAD_CAST "Particle")) {
35  int nodePid = std::stoi(reinterpret_cast<const char*>(
36  xmlGetProp(nodeParticle, BAD_CAST "pid")));
37 
38  if (nodePid == pid) {
39  for (xmlNodePtr nodeBin = nodeParticle->children;
40  nodeBin != nullptr; nodeBin = nodeBin->next) {
41  if (xmlStrEqual(nodeBin->name, BAD_CAST "Bin")) {
42  int nodeEtaMin = std::stoi(reinterpret_cast<const char*>(
43  xmlGetProp(nodeBin, BAD_CAST "etaMin")));
44  int nodeEtaMax = std::stoi(reinterpret_cast<const char*>(
45  xmlGetProp(nodeBin, BAD_CAST "etaMax")));
46  int regionId = std::stoi(reinterpret_cast<const char*>(
47  xmlGetProp(nodeBin, BAD_CAST "regionId")));
48 
49  if (std::abs(etaMid) > nodeEtaMin &&
50  std::abs(etaMid) < nodeEtaMax) {
51 
53  ReadBooleanAttribute("symmetriseAlpha", nodeParticle);
54  m_ganVersion = std::stod(reinterpret_cast<const char*>(
55  xmlGetProp(nodeBin, BAD_CAST "ganVersion")));
56  m_latentDim = std::stod(reinterpret_cast<const char*>(
57  xmlGetProp(nodeParticle, BAD_CAST "latentDim")));
58 
59  for (xmlNodePtr nodeLayer = nodeBin->children;
60  nodeLayer != nullptr; nodeLayer = nodeLayer->next) {
61  if (xmlStrEqual(nodeLayer->name, BAD_CAST "Layer")) {
62  std::vector<double> edges;
63  std::string s(reinterpret_cast<const char*>(
64  xmlGetProp(nodeLayer, BAD_CAST "r_edges")));
65 
66  std::istringstream ss(s);
67  std::string token;
68 
69  while (std::getline(ss, token, ',')) {
70  edges.push_back(std::stod(token));
71  }
72 
73  int binsInAlpha = std::stoi(reinterpret_cast<const char*>(
74  xmlGetProp(nodeLayer, BAD_CAST "n_bin_alpha")));
75  int layer = std::stoi(reinterpret_cast<const char*>(
76  xmlGetProp(nodeLayer, BAD_CAST "id")));
77 
78  std::string name = "hist_pid_" + std::to_string(nodePid) +
79  "_region_" + std::to_string(regionId) +
80  "_layer_" + std::to_string(layer);
81  int xBins = static_cast<int>(edges.size()) - 1;
82 
83  if (xBins <= 0) {
85  "No bins defined in r for layer "
86  << layer
87  << ", setting to 1 bin to avoid empty histogram");
88  xBins = 1; // Remove warning and set a default bin
89  } else {
90  m_relevantlayers.push_back(layer);
91  }
92 
93  double minAlpha = -M_PI;
94  if (m_symmetrisedAlpha && binsInAlpha > 1) {
95  minAlpha = 0;
96  }
97  // Create histogram and add to binning map
98  m_binning.emplace(
99  layer,
100  TH2D(name.c_str(), name.c_str(), xBins, edges.data(),
101  binsInAlpha, minAlpha, M_PI));
102  }
103  }
104  }
105  }
106  }
107  }
108  }
109  }
110  }
111  }
112 
113  // Free XML document after parsing
114  xmlFreeDoc(doc);
115 }
116 
118  xmlNodePtr node) {
119  std::string attribute =
120  reinterpret_cast<const char*>(xmlGetProp(node, BAD_CAST name.c_str()));
121  return attribute == "true";
122 }
123 
125  ATH_MSG_INFO("Parameters taken from XML");
126  ATH_MSG_INFO(" symmetrisedAlpha: " << m_symmetrisedAlpha);
127  ATH_MSG_INFO(" ganVersion:" << m_ganVersion);
128  ATH_MSG_INFO(" latentDim: " << m_latentDim);
129  ATH_MSG(INFO) << " relevantlayers: ";
130  for (const auto& l : m_relevantlayers) {
131  ATH_MSG(INFO) << l << " ";
132  }
133  ATH_MSG(INFO) << END_MSG(INFO);
134 
135  for (const auto& element : m_binning) {
136  int layer = element.first;
137  const TH2D* h = &element.second;
138 
139  // attempt to debug intermittent ci issues described in
140  // https://its.cern.ch/jira/browse/ATLASSIM-7031
141  if (h->IsZombie()) {
142  ATH_MSG_WARNING("Histogram pointer for layer "
143  << layer << " is broken. Skipping.");
144  continue;
145  }
146 
147  int xBinNum = h->GetNbinsX();
148  const TAxis* x = h->GetXaxis();
149 
150  if (xBinNum == 1) {
151  ATH_MSG_INFO("layer " << layer << " not used");
152  continue;
153  }
154  ATH_MSG_INFO("Binning along r for layer " << layer);
155  ATH_MSG(INFO) << "0,";
156  // First fill energies
157  for (int ix = 1; ix <= xBinNum; ++ix) {
158  ATH_MSG(INFO) << x->GetBinUpEdge(ix) << ",";
159  }
160  ATH_MSG(INFO) << END_MSG(INFO);
161  }
162 }
TFCSGANXMLParameters::Print
void Print() const
Definition: TFCSGANXMLParameters.cxx:124
TFCSGANXMLParameters::m_symmetrisedAlpha
bool m_symmetrisedAlpha
Definition: TFCSGANXMLParameters.h:42
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
ATH_MSG
#define ATH_MSG(lvl)
Definition: AthMsgStreamMacros.h:38
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TFCSGANXMLParameters::InitialiseFromXML
void InitialiseFromXML(int pid, int etaMid, const std::string &FastCaloGANInputFolderName)
Definition: TFCSGANXMLParameters.cxx:16
M_PI
#define M_PI
Definition: ActiveFraction.h:11
TFCSGANXMLParameters.h
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
x
#define x
TFCSGANXMLParameters::m_binning
Binning m_binning
Definition: TFCSGANXMLParameters.h:43
TFCSGANXMLParameters::m_fastCaloGANInputFolderName
std::string m_fastCaloGANInputFolderName
Definition: TFCSGANXMLParameters.h:47
TFCSGANXMLParameters::ReadBooleanAttribute
static bool ReadBooleanAttribute(const std::string &name, xmlNodePtr node)
Definition: TFCSGANXMLParameters.cxx:117
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
TFCSGANXMLParameters::TFCSGANXMLParameters
TFCSGANXMLParameters()
ParticleGun_EoverP_Config.pid
pid
Definition: ParticleGun_EoverP_Config.py:62
TFCSGANXMLParameters::~TFCSGANXMLParameters
virtual ~TFCSGANXMLParameters()
merge_scale_histograms.doc
string doc
Definition: merge_scale_histograms.py:9
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
TFCSGANXMLParameters::m_relevantlayers
std::vector< int > m_relevantlayers
Definition: TFCSGANXMLParameters.h:44
END_MSG
#define END_MSG(lvl)
Definition: MLogging.h:171
h
TFCSGANXMLParameters::m_latentDim
int m_latentDim
Definition: TFCSGANXMLParameters.h:46
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.Constants.INFO
int INFO
Definition: Control/AthenaCommon/python/Constants.py:16
MakeTH3DFromTH2Ds.xBins
list xBins
Definition: MakeTH3DFromTH2Ds.py:76
node
Definition: memory_hooks-stdcmalloc.h:74
TFCSGANXMLParameters::m_ganVersion
int m_ganVersion
Definition: TFCSGANXMLParameters.h:45