ATLAS Offline Software
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 
8 #include "GNN_DataStorage.h"
9 
10 #include<iostream>
11 #include<cmath>
12 #include<cstring>
13 #include<algorithm>
14 
15 TrigFTF_GNN_EtaBin::TrigFTF_GNN_EtaBin(): m_minRadius(0), m_maxRadius(0) {
16 
17  m_in.clear();
18  m_vn.clear();
19  m_params.clear();
20  m_vn.reserve(1000);
21 }
22 
24  m_in.clear();
25  m_vn.clear();
26  m_params.clear();
27 }
28 
30 
31  std::vector<std::pair<float, const TrigFTF_GNN_Node*> > phiBuckets[32];
32 
33  int nBuckets = 31;
34 
35  for(const auto& n : m_vn) {
36  int bIdx = (int)(0.5*nBuckets*(n->phi()/(float)M_PI + 1.0f));
37  phiBuckets[bIdx].push_back(std::make_pair(n->phi(), n));
38  }
39 
40  for(auto& b : phiBuckets) {
41  std::sort(b.begin(), b.end());
42  }
43 
44  int idx = 0;
45  for(const auto& b : phiBuckets) {
46  for(const auto& p : b) {
47  m_vn[idx++] = p.second;
48  }
49  }
50 
51 }
52 
53 
55 
56  if(m_vn.empty()) return;
57 
58  m_params.resize(m_vn.size());
59 
60  m_in.resize(m_vn.size());
61  for(auto& v : m_in) v.reserve(50);//reasonably high number of incoming edges per node
62 
63  std::transform(m_vn.begin(), m_vn.end(), m_params.begin(),
64  [](const TrigFTF_GNN_Node* pN) { std::array<float,5> a = {-100.0, 100.0, pN->phi(), pN->r(), pN->z()}; return a;});
65 
66  auto [min_iter, max_iter] = std::minmax_element(m_vn.begin(), m_vn.end(),
67  [](const TrigFTF_GNN_Node* s, const TrigFTF_GNN_Node* s1) { return (s->r() < s1->r()); });
68  m_maxRadius = (*max_iter)->r();
69  m_minRadius = (*min_iter)->r();
70 }
71 
73 
74  for(unsigned int nIdx=0;nIdx<m_vn.size();nIdx++) {
75 
76  float phi = m_params[nIdx][2];
77  if(phi <= M_PI-dphi) continue;
78  m_vPhiNodes.push_back(std::pair<float, unsigned int>(phi - 2*M_PI, nIdx));
79 
80  }
81 
82  for(unsigned int nIdx=0;nIdx<m_vn.size();nIdx++) {
83  float phi = m_params[nIdx][2];
84  m_vPhiNodes.push_back(std::pair<float, unsigned int>(phi, nIdx));
85  }
86 
87  for(unsigned int nIdx=0;nIdx<m_vn.size();nIdx++) {
88 
89  float phi = m_params[nIdx][2];
90  if(phi >= -M_PI + dphi) break;
91  m_vPhiNodes.push_back(std::pair<float, unsigned int>(phi + 2*M_PI, nIdx));
92  }
93 
94 }
95 
96 TrigFTF_GNN_DataStorage::TrigFTF_GNN_DataStorage(const TrigFTF_GNN_Geometry& g, const std::vector<std::array<float, 5> >& lut) : m_geo(g), m_mlLUT(lut) {
97  m_etaBins.resize(g.num_bins());
98 }
99 
100 
102 
103 }
104 
105 int TrigFTF_GNN_DataStorage::loadPixelGraphNodes(short layerIndex, const std::vector<TrigFTF_GNN_Node>& coll, bool useML) {
106 
107  int nLoaded = 0;
108 
109  const TrigFTF_GNN_Layer* pL = m_geo.getTrigFTF_GNN_LayerByIndex(layerIndex);
110 
111  if(pL == nullptr) {
112  return -1;
113  }
114 
115  bool isBarrel = (pL->m_layer.m_type == 0);
116 
117  for(const auto& node : coll) {
118 
119  int binIndex = pL->getEtaBin(node.z(), node.r());
120 
121  if(binIndex == -1) {
122  continue;
123  }
124 
125  if(isBarrel) {
126  m_etaBins.at(binIndex).m_vn.push_back(&node);
127  }
128  else {
129  if (useML) {
130  float cluster_width = node.pixelClusterWidth();
131  if(cluster_width > 0.35) continue;
132  }
133  m_etaBins.at(binIndex).m_vn.push_back(&node);
134  }
135 
136  nLoaded++;
137 
138  }
139 
140  return nLoaded;
141 }
142 
143 int TrigFTF_GNN_DataStorage::loadStripGraphNodes(short layerIndex, const std::vector<TrigFTF_GNN_Node>& coll) {
144 
145  int nLoaded = 0;
146 
147  const TrigFTF_GNN_Layer* pL = m_geo.getTrigFTF_GNN_LayerByIndex(layerIndex);
148 
149  if(pL == nullptr) {
150  return -1;
151  }
152 
153  for(const auto& node : coll) {
154 
155  int binIndex = pL->getEtaBin(node.z(), node.r());
156 
157  if(binIndex == -1) {
158  continue;
159  }
160 
161  m_etaBins.at(binIndex).m_vn.push_back(&node);
162  nLoaded++;
163  }
164 
165  return nLoaded;
166 }
167 
169 
170  unsigned int n=0;
171 
172  for(const auto& b : m_etaBins) {
173  n += b.m_vn.size();
174  }
175  return n;
176 }
177 
179 
180  for(auto& b : m_etaBins) b.sortByPhi();
181 }
182 
184 
185  for(auto& b : m_etaBins) {
186  b.initializeNodes();
187  }
188 
189  if(!useML) return;
190 
191  unsigned int nL = m_geo.num_layers();
192 
193  for(unsigned int layerIdx=0;layerIdx<nL;layerIdx++) {
194 
196 
197  if(pL->m_layer.m_subdet < 20000) {//skip strips volumes: layers in range [1200X-1400X]
198  continue;
199  }
200 
201  bool isBarrel = (pL->m_layer.m_type == 0);
202 
203  if(!isBarrel) continue;
204 
205  // adjusting cuts on |cot(theta)| using pre-trained LUT
206 
207  int lutSize = m_mlLUT.size();
208 
209  int nBins = pL->m_bins.size();
210 
211  for(int b=0;b<nBins;b++) {//loop over eta-bins in Layer
212 
213  TrigFTF_GNN_EtaBin& B = m_etaBins.at(pL->m_bins.at(b));
214 
215  if(B.empty()) continue;
216 
217  for(unsigned int nIdx=0;nIdx<B.m_vn.size();nIdx++) {
218 
219  float cluster_width = B.m_vn[nIdx]->pixelClusterWidth();
220 
221  float locPosY = B.m_vn[nIdx]->localPositionY();
222 
223  int lutBinIdx = std::floor(20*cluster_width) - 1;//lut bin width is 0.05 mm
224 
225  if (lutBinIdx >= lutSize) continue;
226 
227  const std::array<float, 5> lutBin = m_mlLUT.at(lutBinIdx);
228 
229  float dist2border = 10.0 - std::abs(locPosY);
230 
231  float min_tau = -100.0;
232  float max_tau = 100.0;
233 
234  if (dist2border > 0.3f) {//far enough from the edge
235  min_tau = lutBin[1];
236  max_tau = lutBin[2];
237  } else {//possible cluster shortening at a module edge
238  min_tau = lutBin[3];
239  max_tau = lutBin[4];
240  }
241 
242  if (max_tau < 0) {//insufficient training data
243  max_tau = 100.0;//use "no-cut" default
244  }
245 
246  B.m_params[nIdx][0] = min_tau;
247  B.m_params[nIdx][1] = max_tau;
248 
249  }
250  }
251  }
252 }
253 
255  for(auto& b : m_etaBins) b.generatePhiIndexing(dphi);
256 }
257 
TrigFTF_GNN_EtaBin
Definition: GNN_DataStorage.h:41
ReadCellNoiseFromCoolCompare.s1
s1
Definition: ReadCellNoiseFromCoolCompare.py:378
TrigFTF_GNN_EtaBin::m_in
std::vector< std::vector< unsigned int > > m_in
Definition: GNN_DataStorage.h:73
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:178
TrigFTF_GNN_EtaBin::TrigFTF_GNN_EtaBin
TrigFTF_GNN_EtaBin()
Definition: GNN_DataStorage.cxx:15
TrigFTF_GNN_DataStorage::m_mlLUT
const std::vector< std::array< float, 5 > > & m_mlLUT
Definition: GNN_DataStorage.h:102
M_PI
#define M_PI
Definition: ActiveFraction.h:11
TrigFTF_GNN_DataStorage::TrigFTF_GNN_DataStorage
TrigFTF_GNN_DataStorage(const TrigFTF_GNN_Geometry &, const std::vector< std::array< float, 5 > > &)
Definition: GNN_DataStorage.cxx:96
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:23
TrigFTF_GNN_Node
Definition: GNN_DataStorage.h:18
ITkPixEncoding::lut
constexpr auto lut(Generator &&f)
Definition: ITkPixQCoreEncodingLUT.h:19
TrigInDetSiLayer.h
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
TrigFTF_GNN_DataStorage::m_etaBins
std::vector< TrigFTF_GNN_EtaBin > m_etaBins
Definition: GNN_DataStorage.h:104
TrigFTF_GNN_DataStorage::generatePhiIndexing
void generatePhiIndexing(float)
Definition: GNN_DataStorage.cxx:254
TrigFTF_GNN_EtaBin::m_vPhiNodes
std::vector< std::pair< float, unsigned int > > m_vPhiNodes
Definition: GNN_DataStorage.h:72
TrigFTF_GNN_EtaBin::initializeNodes
void initializeNodes()
Definition: GNN_DataStorage.cxx:54
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
beamspotman.n
n
Definition: beamspotman.py:727
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:168
hist_file_dump.f
f
Definition: hist_file_dump.py:140
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:105
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:183
dumpTgcDigiJitter.nBins
list nBins
Definition: dumpTgcDigiJitter.py:29
TrigFTF_GNN_Layer
Definition: GNN_Geometry.h:16
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
TrigFTF_GNN_EtaBin::generatePhiIndexing
void generatePhiIndexing(float)
Definition: GNN_DataStorage.cxx:72
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
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
python.LArCondContChannels.isBarrel
isBarrel
Definition: LArCondContChannels.py:659
python.SystemOfUnits.s
float s
Definition: SystemOfUnits.py:147
TrigFTF_GNN_DataStorage::loadStripGraphNodes
int loadStripGraphNodes(short, const std::vector< TrigFTF_GNN_Node > &)
Definition: GNN_DataStorage.cxx:143
TrigFTF_GNN_DataStorage::m_geo
const TrigFTF_GNN_Geometry & m_geo
Definition: GNN_DataStorage.h:101
TrigFTF_GNN_EtaBin::sortByPhi
void sortByPhi()
Definition: GNN_DataStorage.cxx:29
GNN_DataStorage.h
TrigFTF_GNN_EtaBin::m_vn
std::vector< const TrigFTF_GNN_Node * > m_vn
Definition: GNN_DataStorage.h:71
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:101
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:74
GNN_Geometry.h