ATLAS Offline Software
GNN_TrackingFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include<iostream>
6 #include<cmath>
7 #include<cstring>
8 
9 #include "GNN_TrackingFilter.h"
10 
11 #include<algorithm>
12 #include<list>
13 
14 
16 
17  m_initialized = true;
18 
19  m_J = 0.0;
20  m_vs.clear();
21 
22 
23  //n2->n1
24 
25  float dx = pS->m_n1->m_sp.x() - pS->m_n2->m_sp.x();
26  float dy = pS->m_n1->m_sp.y() - pS->m_n2->m_sp.y();
27  float L = std::sqrt(dx*dx + dy*dy);
28 
29  m_s = dy/L;
30  m_c = dx/L;
31 
32  //transform for extrapolation and update
33  // x' = x*m_c + y*m_s
34  // y' = -x*m_s + y*m_c
35 
36  m_refY = pS->m_n2->m_sp.r();
37  m_refX = pS->m_n2->m_sp.x()*m_c + pS->m_n2->m_sp.y()*m_s;
38 
39  //X-state: y, dy/dx, d2y/dx2
40 
41  m_X[0] = -pS->m_n2->m_sp.x()*m_s + pS->m_n2->m_sp.y()*m_c;
42  m_X[1] = 0.0;
43  m_X[2] = 0.0;
44 
45  //Y-state: z, dz/dr
46 
47  m_Y[0] = pS->m_n2->m_sp.z();
48  m_Y[1] = (pS->m_n1->m_sp.z() - pS->m_n2->m_sp.z())/(pS->m_n1->m_sp.r() - pS->m_n2->m_sp.r());
49 
50  memset(&m_Cx[0][0], 0, sizeof(m_Cx));
51  memset(&m_Cy[0][0], 0, sizeof(m_Cy));
52 
53  m_Cx[0][0] = 0.25;
54  m_Cx[1][1] = 0.001;
55  m_Cx[2][2] = 0.001;
56 
57  m_Cy[0][0] = 1.5;
58  m_Cy[1][1] = 0.001;
59 
60 }
61 
63 
64  memcpy(&m_X[0], &st.m_X[0], sizeof(m_X));
65  memcpy(&m_Y[0], &st.m_Y[0], sizeof(m_Y));
66  memcpy(&m_Cx[0][0], &st.m_Cx[0][0], sizeof(m_Cx));
67  memcpy(&m_Cy[0][0], &st.m_Cy[0][0], sizeof(m_Cy));
68  m_refX = st.m_refX;
69  m_refY = st.m_refY;
70  m_c = st.m_c;
71  m_s = st.m_s;
72  m_J = st.m_J;
73  m_vs.clear();
74  m_vs.reserve(st.m_vs.size());
75  std::copy(st.m_vs.begin(), st.m_vs.end(), std::back_inserter(m_vs));
76 
77  m_initialized = true;
78 }
79 
80 TrigFTF_GNN_TrackingFilter::TrigFTF_GNN_TrackingFilter(const std::vector<TrigInDetSiLayer>& g, std::vector<TrigFTF_GNN_Edge>& sb) : m_geo(g), m_segStore(sb) {
81 
82 }
83 
85 
86 
87  if(pS->m_level == -1) return;//already collected
88 
90 
91  //create track state
92 
94 
95  pInitState->initialize(pS);
96 
97  m_stateVec.clear();
98 
99  //recursive branching and propagation
100 
101  propagate(pS, *pInitState);
102 
103 
104  if(m_stateVec.empty()) return;
105 
106  std::sort(m_stateVec.begin(), m_stateVec.end(), TrigFTF_GNN_EDGE_STATE::Compare());
107 
108  TrigFTF_GNN_EDGE_STATE* best = (*m_stateVec.begin());
109 
110 
111  output.clone(*best);
112 
114 
115 }
116 
118 
119  if(m_globalStateCounter >= MAX_EDGE_STATE) return;
120 
122 
123  TrigFTF_GNN_EDGE_STATE& new_ts = *p_new_ts;
124  new_ts.clone(ts);
125 
126  new_ts.m_vs.push_back(pS);
127 
128  bool accepted = update(pS, new_ts); //update using n1 of the segment
129 
130  if(!accepted) return;//stop further propagation
131 
132  int level = pS->m_level;
133 
134  std::list<TrigFTF_GNN_Edge*> lCont;
135 
136  for(int nIdx=0;nIdx<pS->m_nNei;nIdx++) {//loop over the neighbours of this segment
137  unsigned int nextSegmentIdx = pS->m_vNei[nIdx];
138 
139  TrigFTF_GNN_Edge* pN = &(m_segStore.at(nextSegmentIdx));
140 
141  if(pN->m_level == -1) continue;//already collected
142 
143  if(pN->m_level == level - 1) {
144 
145  lCont.push_back(pN);
146  }
147  }
148 
149  if(lCont.empty()) {//the end of chain
150 
151  //store in the vector
153 
154  if(m_stateVec.empty()) {//add the first segment state
156  p->clone(new_ts);
157  m_stateVec.push_back(p);
158  }
159  else {//compare with the best and add
160  float best_so_far = (*m_stateVec.begin())->m_J;
161  if(new_ts.m_J > best_so_far) {
163  p->clone(new_ts);
164  m_stateVec.push_back(p);
165  }
166  }
167  }
168  }
169  else {//branching
170  int nBranches = 0;
171  for(std::list<TrigFTF_GNN_Edge*>::iterator sIt = lCont.begin();sIt!=lCont.end();++sIt, nBranches++) {
172  propagate((*sIt), new_ts);//recursive call
173  }
174  }
175 }
176 
178 
179  const float sigma_t = 0.0003;
180  const float sigma_w = 0.00009;
181 
182  const float sigmaMS = 0.016;
183 
184  const float sigma_x = 0.25;//was 0.22
185  const float sigma_y = 2.5;//was 1.7
186 
187  const float weight_x = 0.5;
188  const float weight_y = 0.5;
189 
190  const float maxDChi2_x = 60.0;//35.0;
191  const float maxDChi2_y = 60.0;//31.0;
192 
193  const float add_hit = 14.0;
194 
195  if(ts.m_Cx[2][2] < 0.0 || ts.m_Cx[1][1] < 0.0 || ts.m_Cx[0][0] < 0.0) {
196  std::cout<<"Negative cov_x"<<std::endl;
197  }
198 
199  if(ts.m_Cy[1][1] < 0.0 || ts.m_Cy[0][0] < 0.0) {
200  std::cout<<"Negative cov_y"<<std::endl;
201  }
202 
203  //add ms.
204 
205  ts.m_Cx[2][2] += sigma_w*sigma_w;
206  ts.m_Cx[1][1] += sigma_t*sigma_t;
207 
208  int type1 = getLayerType(pS->m_n2->m_sp.layer());
209 
210  float t2 = type1 == 0 ? 1.0 + ts.m_Y[1]*ts.m_Y[1] : 1.0 + 1.0/(ts.m_Y[1]*ts.m_Y[1]);
211  float s1 = sigmaMS*t2;
212  float s2 = s1*s1;
213 
214  s2 *= std::sqrt(t2);
215 
216  ts.m_Cy[1][1] += s2;
217 
218  //extrapolation
219 
220  float X[3], Y[2];
221  float Cx[3][3], Cy[2][2];
222 
223  float refX, refY, mx, my;
224 
225  float x, y, z, r;
226 
227  x = pS->m_n1->m_sp.x();
228  y = pS->m_n1->m_sp.y();
229  z = pS->m_n1->m_sp.z();
230  r = pS->m_n1->m_sp.r();
231 
232  refX = x*ts.m_c + y*ts.m_s;
233  mx = -x*ts.m_s + y*ts.m_c;//measured X[0]
234  refY = r;
235  my = z;//measured Y[0]
236 
237  float A = refX - ts.m_refX;
238  float B = 0.5*A*A;
239  float dr = refY - ts.m_refY;
240 
241  X[0] = ts.m_X[0] + ts.m_X[1]*A + ts.m_X[2]*B;
242  X[1] = ts.m_X[1] + ts.m_X[2]*A;
243  X[2] = ts.m_X[2];
244 
245  Cx[0][0] = ts.m_Cx[0][0] + 2*ts.m_Cx[0][1]*A + 2*ts.m_Cx[0][2]*B + A*A*ts.m_Cx[1][1] + 2*A*B*ts.m_Cx[1][2] + B*B*ts.m_Cx[2][2];
246  Cx[0][1] = Cx[1][0] = ts.m_Cx[0][1] + ts.m_Cx[1][1]*A + ts.m_Cx[1][2]*B + ts.m_Cx[0][2]*A + A*A*ts.m_Cx[1][2] + A*B*ts.m_Cx[2][2];
247  Cx[0][2] = Cx[2][0] = ts.m_Cx[0][2] + ts.m_Cx[1][2]*A + ts.m_Cx[2][2]*B;
248 
249  Cx[1][1] = ts.m_Cx[1][1] + 2*A*ts.m_Cx[1][2] + A*A*ts.m_Cx[2][2];
250  Cx[1][2] = Cx[2][1] = ts.m_Cx[1][2] + ts.m_Cx[2][2]*A;
251 
252  Cx[2][2] = ts.m_Cx[2][2];
253 
254  Y[0] = ts.m_Y[0] + ts.m_Y[1]*dr;
255  Y[1] = ts.m_Y[1];
256 
257  Cy[0][0] = ts.m_Cy[0][0] + 2*ts.m_Cy[0][1]*dr + dr*dr*ts.m_Cy[1][1];
258  Cy[0][1] = Cy[1][0] = ts.m_Cy[0][1] + dr*ts.m_Cy[1][1];
259  Cy[1][1] = ts.m_Cy[1][1];
260 
261  //chi2 test
262 
263  float resid_x = mx - X[0];
264  float resid_y = my - Y[0];
265 
266  float CHx[3] = {Cx[0][0], Cx[0][1], Cx[0][2]};
267  float CHy[2] = {Cy[0][0], Cy[0][1]};
268 
269 
270  float sigma_rz = 0.0;
271 
272  int type = getLayerType(pS->m_n1->m_sp.layer());
273 
274  if(type == 0) {//barrel TO-DO: split into barrel Pixel and barrel SCT
275  sigma_rz = sigma_y*sigma_y;
276  }
277  else {
278  sigma_rz = sigma_y*ts.m_Y[1];
279  sigma_rz = sigma_rz*sigma_rz;
280  }
281 
282  float Dx = 1.0/(Cx[0][0] + sigma_x*sigma_x);
283 
284  float Dy = 1.0/(Cy[0][0] + sigma_rz);
285 
286  float dchi2_x = resid_x*resid_x*Dx;
287  float dchi2_y = resid_y*resid_y*Dy;
288 
289 
290  if(dchi2_x > maxDChi2_x || dchi2_y > maxDChi2_y) {
291  return false;
292  }
293 
294  ts.m_J += add_hit - dchi2_x*weight_x - dchi2_y*weight_y;
295 
296  //state update
297 
298  float Kx[3] = {Dx*Cx[0][0], Dx*Cx[0][1], Dx*Cx[0][2]};
299  float Ky[2] = {Dy*Cy[0][0], Dy*Cy[0][1]};
300 
301  for(int i=0;i<3;i++) ts.m_X[i] = X[i] + Kx[i]*resid_x;
302  for(int i=0;i<2;i++) ts.m_Y[i] = Y[i] + Ky[i]*resid_y;
303 
304  for(int i=0;i<3;i++) {
305  for(int j=0;j<3;j++) {
306  ts.m_Cx[i][j] = Cx[i][j] - Kx[i]*CHx[j];
307  }
308  }
309 
310  for(int i=0;i<2;i++) {
311  for(int j=0;j<2;j++) {
312  ts.m_Cy[i][j] = Cy[i][j] - Ky[i]*CHy[j];
313  }
314  }
315  ts.m_refX = refX;
316  ts.m_refY = refY;
317  return true;
318 }
319 
321  return m_geo.at(l).m_type;
322 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
TrigFTF_GNN_TrackingFilter::update
bool update(TrigFTF_GNN_Edge *, TrigFTF_GNN_EDGE_STATE &)
Definition: GNN_TrackingFilter.cxx:177
TrigFTF_GNN_TrackingFilter::getLayerType
int getLayerType(int)
Definition: GNN_TrackingFilter.cxx:320
beamspotman.r
def r
Definition: beamspotman.py:676
ReadCellNoiseFromCoolCompare.s1
s1
Definition: ReadCellNoiseFromCoolCompare.py:378
TrigFTF_GNN_TrackingFilter::m_globalStateCounter
int m_globalStateCounter
Definition: GNN_TrackingFilter.h:69
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
TrigFTF_GNN_TrackingFilter::followTrack
void followTrack(TrigFTF_GNN_Edge *, TrigFTF_GNN_EDGE_STATE &)
Definition: GNN_TrackingFilter.cxx:84
TrigFTF_GNN_Node::m_sp
const TrigSiSpacePointBase & m_sp
Definition: GNN_DataStorage.h:57
fitman.my
my
Definition: fitman.py:523
MAX_EDGE_STATE
#define MAX_EDGE_STATE
Definition: GNN_TrackingFilter.h:42
TrigFTF_GNN_EdgeState::m_s
float m_s
Definition: GNN_TrackingFilter.h:36
TrigFTF_GNN_EdgeState
Definition: GNN_TrackingFilter.h:11
TrigFTF_GNN_Edge::m_vNei
unsigned int m_vNei[N_SEG_CONNS]
Definition: GNN_DataStorage.h:135
TrigFTF_GNN_EdgeState::m_Cx
float m_Cx[3][3]
Definition: GNN_TrackingFilter.h:35
TrigFTF_GNN_Edge::m_n2
TrigFTF_GNN_Node * m_n2
Definition: GNN_DataStorage.h:128
fitman.mx
mx
Definition: fitman.py:520
TrigSiSpacePointBase::x
void x(const double x)
Definition: TrigSiSpacePointBase.h:54
TrigFTF_GNN_EdgeState::m_J
float m_J
Definition: GNN_TrackingFilter.h:31
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
python.TurnDataReader.dr
dr
Definition: TurnDataReader.py:112
x
#define x
python.iconfTool.models.loaders.level
level
Definition: loaders.py:20
Monitored::X
@ X
Definition: HistogramFillerUtils.h:24
TrigFTF_GNN_EdgeState::m_vs
std::vector< TrigFTF_GNN_Edge * > m_vs
Definition: GNN_TrackingFilter.h:33
TrigFTF_GNN_EdgeState::m_Y
float m_Y[2]
Definition: GNN_TrackingFilter.h:35
TrigFTF_GNN_EdgeState::clone
void clone(const struct TrigFTF_GNN_EdgeState &)
Definition: GNN_TrackingFilter.cxx:62
TrigSiSpacePointBase::z
void z(const double z)
Definition: TrigSiSpacePointBase.h:53
TrigFTF_GNN_EdgeState::m_initialized
bool m_initialized
Definition: GNN_TrackingFilter.h:38
dqt_zlumi_alleff_HIST.A
A
Definition: dqt_zlumi_alleff_HIST.py:110
TrigSiSpacePointBase::layer
long layer() const
Definition: TrigSiSpacePointBase.h:68
TrigSiSpacePointBase::r
void r(const double r)
Definition: TrigSiSpacePointBase.h:51
TrigFTF_GNN_TrackingFilter::TrigFTF_GNN_TrackingFilter
TrigFTF_GNN_TrackingFilter(const std::vector< TrigInDetSiLayer > &, std::vector< TrigFTF_GNN_Edge > &)
Definition: GNN_TrackingFilter.cxx:80
TrigFTF_GNN_EdgeState::m_refX
float m_refX
Definition: GNN_TrackingFilter.h:36
TrigFTF_GNN_TrackingFilter::m_stateStore
TrigFTF_GNN_EDGE_STATE m_stateStore[MAX_EDGE_STATE]
Definition: GNN_TrackingFilter.h:67
TrigFTF_GNN_Edge
Definition: GNN_DataStorage.h:108
lumiFormat.i
int i
Definition: lumiFormat.py:92
z
#define z
TrigFTF_GNN_Edge::m_level
signed char m_level
Definition: GNN_DataStorage.h:130
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
TrigFTF_GNN_TrackingFilter::m_segStore
std::vector< TrigFTF_GNN_Edge > & m_segStore
Definition: GNN_TrackingFilter.h:63
TrigFTF_GNN_EdgeState::m_c
float m_c
Definition: GNN_TrackingFilter.h:36
TrigSiSpacePointBase::y
void y(const double y)
Definition: TrigSiSpacePointBase.h:55
TrigFTF_GNN_TrackingFilter::propagate
void propagate(TrigFTF_GNN_Edge *, TrigFTF_GNN_EDGE_STATE &)
Definition: GNN_TrackingFilter.cxx:117
python.utils.best
def best(iterable, priorities=[3, 2, 1, -1, 0])
Definition: DataQuality/DQUtils/python/utils.py:50
GNN_TrackingFilter.h
TrigFTF_GNN_EdgeState::Compare
Definition: GNN_TrackingFilter.h:15
TrigFTF_GNN_EdgeState::m_Cy
float m_Cy[2][2]
Definition: GNN_TrackingFilter.h:35
TrigFTF_GNN_EdgeState::m_refY
float m_refY
Definition: GNN_TrackingFilter.h:36
TrigFTF_GNN_TrackingFilter::m_geo
const std::vector< TrigInDetSiLayer > & m_geo
Definition: GNN_TrackingFilter.h:61
merge.output
output
Definition: merge.py:17
Monitored::Y
@ Y
Definition: HistogramFillerUtils.h:24
keylayer_zslicemap.sb
sb
Definition: keylayer_zslicemap.py:192
TrigFTF_GNN_Edge::m_n1
TrigFTF_GNN_Node * m_n1
Definition: GNN_DataStorage.h:127
dqt_zlumi_alleff_HIST.B
B
Definition: dqt_zlumi_alleff_HIST.py:110
TrigFTF_GNN_Edge::m_nNei
unsigned char m_nNei
Definition: GNN_DataStorage.h:132
makeTRTBarrelCans.dy
tuple dy
Definition: makeTRTBarrelCans.py:21
ALFA_EventTPCnv_Dict::t2
std::vector< ALFA_RawDataContainer_p1 > t2
Definition: ALFA_EventTPCnvDict.h:44
y
#define y
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
ReadCellNoiseFromCoolCompare.s2
s2
Definition: ReadCellNoiseFromCoolCompare.py:379
makeTRTBarrelCans.dx
tuple dx
Definition: makeTRTBarrelCans.py:20
TrigFTF_GNN_EdgeState::initialize
void initialize(TrigFTF_GNN_Edge *)
Definition: GNN_TrackingFilter.cxx:15
TrigFTF_GNN_EdgeState::m_X
float m_X[3]
Definition: GNN_TrackingFilter.h:35
calibdata.copy
bool copy
Definition: calibdata.py:27
TrigFTF_GNN_TrackingFilter::m_stateVec
std::vector< TrigFTF_GNN_EDGE_STATE * > m_stateVec
Definition: GNN_TrackingFilter.h:65
python.CaloScaleNoiseConfig.ts
ts
Definition: CaloScaleNoiseConfig.py:86