ATLAS Offline Software
TFCSGANXMLParameters.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 // 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  edges.push_back (edges.back()+1);
90  } else {
91  m_relevantlayers.push_back(layer);
92  }
93 
94  double minAlpha = -M_PI;
95  if (m_symmetrisedAlpha && binsInAlpha > 1) {
96  minAlpha = 0;
97  }
98  // Create histogram and add to binning map
99  m_binning.emplace(
100  layer,
101  TH2D(name.c_str(), name.c_str(), xBins, edges.data(),
102  binsInAlpha, minAlpha, M_PI));
103  }
104  }
105  }
106  }
107  }
108  }
109  }
110  }
111  }
112  }
113 
114  // Free XML document after parsing
115  xmlFreeDoc(doc);
116 }
117 
119  xmlNodePtr node) {
120  std::string attribute =
121  reinterpret_cast<const char*>(xmlGetProp(node, BAD_CAST name.c_str()));
122  return attribute == "true";
123 }
124 
126  ATH_MSG_INFO("Parameters taken from XML");
127  ATH_MSG_INFO(" symmetrisedAlpha: " << m_symmetrisedAlpha);
128  ATH_MSG_INFO(" ganVersion:" << m_ganVersion);
129  ATH_MSG_INFO(" latentDim: " << m_latentDim);
130  ATH_MSG(INFO) << " relevantlayers: ";
131  for (const auto& l : m_relevantlayers) {
132  ATH_MSG(INFO) << l << " ";
133  }
134  ATH_MSG(INFO) << END_MSG(INFO);
135 
136  for (const auto& element : m_binning) {
137  int layer = element.first;
138  const TH2D* h = &element.second;
139 
140  // attempt to debug intermittent ci issues described in
141  // https://its.cern.ch/jira/browse/ATLASSIM-7031
142  if (h->IsZombie()) {
143  ATH_MSG_WARNING("Histogram pointer for layer "
144  << layer << " is broken. Skipping.");
145  continue;
146  }
147 
148  int xBinNum = h->GetNbinsX();
149  const TAxis* x = h->GetXaxis();
150 
151  if (xBinNum == 1) {
152  ATH_MSG_INFO("layer " << layer << " not used");
153  continue;
154  }
155  ATH_MSG_INFO("Binning along r for layer " << layer);
156  ATH_MSG(INFO) << "0,";
157  // First fill energies
158  for (int ix = 1; ix <= xBinNum; ++ix) {
159  ATH_MSG(INFO) << x->GetBinUpEdge(ix) << ",";
160  }
161  ATH_MSG(INFO) << END_MSG(INFO);
162  }
163 }
TFCSGANXMLParameters::Print
void Print() const
Definition: TFCSGANXMLParameters.cxx:125
TFCSGANXMLParameters::m_symmetrisedAlpha
bool m_symmetrisedAlpha
Definition: TFCSGANXMLParameters.h:42
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:157
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:66
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:118
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:240
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:15
python.SystemOfUnits.s
float s
Definition: SystemOfUnits.py:147
MakeTH3DFromTH2Ds.xBins
list xBins
Definition: MakeTH3DFromTH2Ds.py:76
node
Definition: node.h:24
TFCSGANXMLParameters::m_ganVersion
int m_ganVersion
Definition: TFCSGANXMLParameters.h:45