Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
GNN_DataStorage.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
7 #include "GNN_Geometry.h"
8 #include "GNN_DataStorage.h"
9 
10 #include<cmath>
11 #include<cstring>
12 #include<algorithm>
13 
14 TrigFTF_GNN_EtaBin::TrigFTF_GNN_EtaBin(): m_minRadius(0), m_maxRadius(0) {
15 
16  m_in.clear();
17  m_vn.clear();
18  m_params.clear();
19  m_vn.reserve(1000);
20 }
21 
23  m_in.clear();
24  m_vn.clear();
25  m_params.clear();
26 }
27 
29 
30  std::vector<std::pair<float, const TrigFTF_GNN_Node*> > phiBuckets[32];
31 
32  int nBuckets = 31;
33 
34  for(const auto& n : m_vn) {
35  int bIdx = (int)(0.5*nBuckets*(n->phi()/(float)M_PI + 1.0f));
36  phiBuckets[bIdx].push_back(std::make_pair(n->phi(), n));
37  }
38 
39  for(auto& b : phiBuckets) {
40  std::sort(b.begin(), b.end());
41  }
42 
43  int idx = 0;
44  for(const auto& b : phiBuckets) {
45  for(const auto& p : b) {
46  m_vn[idx++] = p.second;
47  }
48  }
49 
50 }
51 
52 
54 
55  if(m_vn.empty()) return;
56 
57  m_params.resize(m_vn.size());
58 
59  m_in.resize(m_vn.size());
60  for(auto& v : m_in) v.reserve(50);//reasonably high number of incoming edges per node
61 
62  std::transform(m_vn.begin(), m_vn.end(), m_params.begin(),
63  [](const TrigFTF_GNN_Node* pN) { std::array<float,5> a = {-100.0, 100.0, pN->phi(), pN->r(), pN->z()}; return a;});
64 
65  auto [min_iter, max_iter] = std::minmax_element(m_vn.begin(), m_vn.end(),
66  [](const TrigFTF_GNN_Node* s, const TrigFTF_GNN_Node* s1) { return (s->r() < s1->r()); });
67  m_maxRadius = (*max_iter)->r();
68  m_minRadius = (*min_iter)->r();
69 }
70 
72 
73  for(unsigned int nIdx=0;nIdx<m_vn.size();nIdx++) {
74 
75  float phi = m_params[nIdx][2];
76  if(phi <= M_PI-dphi) continue;
77  m_vPhiNodes.push_back(std::pair<float, unsigned int>(phi - 2*M_PI, nIdx));
78 
79  }
80 
81  for(unsigned int nIdx=0;nIdx<m_vn.size();nIdx++) {
82  float phi = m_params[nIdx][2];
83  m_vPhiNodes.push_back(std::pair<float, unsigned int>(phi, nIdx));
84  }
85 
86  for(unsigned int nIdx=0;nIdx<m_vn.size();nIdx++) {
87 
88  float phi = m_params[nIdx][2];
89  if(phi >= -M_PI + dphi) break;
90  m_vPhiNodes.push_back(std::pair<float, unsigned int>(phi + 2*M_PI, nIdx));
91  }
92 
93 }
94 
96  m_etaBins.resize(g.num_bins());
97 }
98 
99 
101 
102 }
103 
104 int TrigFTF_GNN_DataStorage::loadPixelGraphNodes(short layerIndex, const std::vector<TrigFTF_GNN_Node>& coll, bool useML) {
105 
106  int nLoaded = 0;
107 
108  const TrigFTF_GNN_Layer* pL = m_geo.getTrigFTF_GNN_LayerByIndex(layerIndex);
109 
110  if(pL == nullptr) {
111  return -1;
112  }
113 
114  bool isBarrel = (pL->m_layer.m_type == 0);
115 
116  for(const auto& node : coll) {
117 
118  int binIndex = pL->getEtaBin(node.z(), node.r());
119 
120  if(binIndex == -1) {
121  continue;
122  }
123 
124  if(isBarrel) {
125  m_etaBins.at(binIndex).m_vn.push_back(&node);
126  }
127  else {
128  if (useML) {
129  float cluster_width = node.pixelClusterWidth();
130  if(cluster_width > 0.2) continue;
131  }
132  m_etaBins.at(binIndex).m_vn.push_back(&node);
133  }
134 
135  nLoaded++;
136 
137  }
138 
139  return nLoaded;
140 }
141 
142 int TrigFTF_GNN_DataStorage::loadStripGraphNodes(short layerIndex, const std::vector<TrigFTF_GNN_Node>& coll) {
143 
144  int nLoaded = 0;
145 
146  const TrigFTF_GNN_Layer* pL = m_geo.getTrigFTF_GNN_LayerByIndex(layerIndex);
147 
148  if(pL == nullptr) {
149  return -1;
150  }
151 
152  for(const auto& node : coll) {
153 
154  int binIndex = pL->getEtaBin(node.z(), node.r());
155 
156  if(binIndex == -1) {
157  continue;
158  }
159 
160  m_etaBins.at(binIndex).m_vn.push_back(&node);
161  nLoaded++;
162  }
163 
164  return nLoaded;
165 }
166 
168 
169  unsigned int n=0;
170 
171  for(const auto& b : m_etaBins) {
172  n += b.m_vn.size();
173  }
174  return n;
175 }
176 
178 
179  for(auto& b : m_etaBins) b.sortByPhi();
180 }
181 
183 
184  for(auto& b : m_etaBins) {
185  b.initializeNodes();
186  }
187 
188  if(!useML) return;
189 
190  unsigned int nL = m_geo.num_layers();
191 
192  for(unsigned int layerIdx=0;layerIdx<nL;layerIdx++) {
193 
195 
196  if(pL->m_layer.m_subdet < 20000) {//skip strips volumes: layers in range [1200X-1400X]
197  continue;
198  }
199 
200  bool isBarrel = (pL->m_layer.m_type == 0);
201 
202  if(!isBarrel) continue;
203 
204  int nBins = pL->m_bins.size();
205 
206  for(int b=0;b<nBins;b++) {//loop over eta-bins in Layer
207 
208  TrigFTF_GNN_EtaBin& B = m_etaBins.at(pL->m_bins.at(b));
209 
210  if(B.empty()) continue;
211 
212  for(unsigned int nIdx=0;nIdx<B.m_vn.size();nIdx++) {
213  float cluster_width = B.m_vn[nIdx]->pixelClusterWidth();
214  //adjusting cuts using fitted boundaries of |cot(theta)| vs. cluster z-width distribution
215  float min_tau = 6.7*(cluster_width - 0.2);//linear fit
216  float max_tau = 1.6 + 0.15/(cluster_width + 0.2) + 6.1*(cluster_width - 0.2);//linear fit + correction for short clusters
217 
218  B.m_params[nIdx][0] = min_tau;
219  B.m_params[nIdx][1] = max_tau;
220 
221  }
222  }
223  }
224 }
225 
227  for(auto& b : m_etaBins) b.generatePhiIndexing(dphi);
228 }
229 
TrigFTF_GNN_EtaBin
Definition: GNN_DataStorage.h:40
ReadCellNoiseFromCoolCompare.s1
s1
Definition: ReadCellNoiseFromCoolCompare.py:378
TrigFTF_GNN_EtaBin::m_in
std::vector< std::vector< unsigned int > > m_in
Definition: GNN_DataStorage.h:72
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
TrigFTF_GNN_Geometry::num_layers
unsigned int num_layers() const
Definition: GNN_Geometry.h:57
TrigFTF_GNN_DataStorage::sortByPhi
void sortByPhi()
Definition: GNN_DataStorage.cxx:177
TrigFTF_GNN_EtaBin::TrigFTF_GNN_EtaBin
TrigFTF_GNN_EtaBin()
Definition: GNN_DataStorage.cxx:14
M_PI
#define M_PI
Definition: ActiveFraction.h:11
TrigFTF_GNN_Layer::m_bins
std::vector< int > m_bins
Definition: GNN_Geometry.h:31
TrigFTF_GNN_EtaBin::~TrigFTF_GNN_EtaBin
~TrigFTF_GNN_EtaBin()
Definition: GNN_DataStorage.cxx:22
TrigFTF_GNN_Node
Definition: GNN_DataStorage.h:18
TrigInDetSiLayer.h
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
TrigFTF_GNN_DataStorage::m_etaBins
std::vector< TrigFTF_GNN_EtaBin > m_etaBins
Definition: GNN_DataStorage.h:102
TrigFTF_GNN_DataStorage::TrigFTF_GNN_DataStorage
TrigFTF_GNN_DataStorage(const TrigFTF_GNN_Geometry &)
Definition: GNN_DataStorage.cxx:95
TrigFTF_GNN_DataStorage::generatePhiIndexing
void generatePhiIndexing(float)
Definition: GNN_DataStorage.cxx:226
TrigFTF_GNN_EtaBin::m_vPhiNodes
std::vector< std::pair< float, unsigned int > > m_vPhiNodes
Definition: GNN_DataStorage.h:71
TrigFTF_GNN_EtaBin::initializeNodes
void initializeNodes()
Definition: GNN_DataStorage.cxx:53
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
beamspotman.n
n
Definition: beamspotman.py:731
python.LArMinBiasAlgConfig.int
int
Definition: LArMinBiasAlgConfig.py:59
TrigFTF_GNN_Layer::m_layer
const TrigInDetSiLayer & m_layer
Definition: GNN_Geometry.h:30
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
TrigFTF_GNN_DataStorage::numberOfNodes
unsigned int numberOfNodes() const
Definition: GNN_DataStorage.cxx:167
IDPVM::binIndex
unsigned int binIndex(const T &val, const std::vector< T > &partitions)
general utility function to return bin index given a value and the upper endpoints of each bin
Definition: InDetPhysValMonitoringUtilities.h:43
TrigFTF_GNN_DataStorage::loadPixelGraphNodes
int loadPixelGraphNodes(short, const std::vector< TrigFTF_GNN_Node > &, bool)
Definition: GNN_DataStorage.cxx:104
TrigInDetSiLayer::m_type
int m_type
Definition: TrigInDetSiLayer.h:11
TrigFTF_GNN_Geometry::getTrigFTF_GNN_LayerByIndex
const TrigFTF_GNN_Layer * getTrigFTF_GNN_LayerByIndex(int) const
Definition: GNN_Geometry.cxx:302
TrigFTF_GNN_DataStorage::initializeNodes
void initializeNodes(bool)
Definition: GNN_DataStorage.cxx:182
dumpTgcDigiJitter.nBins
list nBins
Definition: dumpTgcDigiJitter.py:29
TrigFTF_GNN_Layer
Definition: GNN_Geometry.h:16
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
TrigFTF_GNN_EtaBin::generatePhiIndexing
void generatePhiIndexing(float)
Definition: GNN_DataStorage.cxx:71
dqt_zlumi_alleff_HIST.B
B
Definition: dqt_zlumi_alleff_HIST.py:110
TrigFTF_GNN_Geometry
Definition: GNN_Geometry.h:48
python.PyAthena.v
v
Definition: PyAthena.py:154
a
TList * a
Definition: liststreamerinfos.cxx:10
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
python.LArCondContChannels.isBarrel
isBarrel
Definition: LArCondContChannels.py:659
TrigFTF_GNN_DataStorage::loadStripGraphNodes
int loadStripGraphNodes(short, const std::vector< TrigFTF_GNN_Node > &)
Definition: GNN_DataStorage.cxx:142
TrigFTF_GNN_DataStorage::m_geo
const TrigFTF_GNN_Geometry & m_geo
Definition: GNN_DataStorage.h:100
TrigFTF_GNN_EtaBin::sortByPhi
void sortByPhi()
Definition: GNN_DataStorage.cxx:28
GNN_DataStorage.h
TrigFTF_GNN_EtaBin::m_vn
std::vector< const TrigFTF_GNN_Node * > m_vn
Definition: GNN_DataStorage.h:70
TrigFTF_GNN_Layer::getEtaBin
int getEtaBin(float, float) const
Definition: GNN_Geometry.cxx:184
TrigFTF_GNN_DataStorage::~TrigFTF_GNN_DataStorage
~TrigFTF_GNN_DataStorage()
Definition: GNN_DataStorage.cxx:100
node
Definition: node.h:21
TrigInDetSiLayer::m_subdet
int m_subdet
Definition: TrigInDetSiLayer.h:10
TrigFTF_GNN_EtaBin::m_params
std::vector< std::array< float, 5 > > m_params
Definition: GNN_DataStorage.h:73
GNN_Geometry.h