ATLAS Offline Software
FasTrackConnector.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include <iostream>
7 #include <cstring>
8 
9 #include <list>
10 #include <set>
11 #include <unordered_map>
12 
13 FasTrackConnection::FasTrackConnection(unsigned int s, unsigned int d) : m_src(s), m_dst(d) {
14 
15 }
16 
18 
19  m_connMap.clear();
20  m_layerGroups.clear();
21 
22  int nLinks;
23 
24  inFile >> nLinks >> m_etaBin;
25 
26 
27  for(int l=0;l<nLinks;l++) {
28 
29  unsigned int stage, lIdx, src, dst, nEntries;
30  int height, width;
31 
32  inFile >> lIdx >> stage >> src >> dst >> height >> width >> nEntries;
33 
35 
36  int dummy;
37 
38  for(int i=0;i<height;i++) {
39  for(int j=0;j<width;j++) inFile >> dummy;//pC->m_binTable[j+i*width];
40  }
41 
42  int vol_id = src / 1000;
43 
44  if(vol_id == 13 || vol_id == 12 || vol_id == 14) {
45  delete pC;
46  continue;
47  }
48 
49  vol_id = dst / 1000;
50 
51  if(vol_id == 13 || vol_id == 12 || vol_id == 14) {
52  delete pC;
53  continue;
54  }
55 
56  std::map<int, std::vector<FASTRACK_CONNECTION*> >::iterator it = m_connMap.find(stage);
57 
58  if(it == m_connMap.end()) {
59  std::vector<FASTRACK_CONNECTION*> v = {pC};
60  m_connMap.insert(std::make_pair(stage, v));
61  } else (*it).second.push_back(pC);
62  }
63 
64  //re-arrange the connection stages
65 
66  std::list<const FASTRACK_CONNECTION*> lConns;
67 
68  std::map<int, std::vector<const FASTRACK_CONNECTION*> > newConnMap;
69 
70  for(const auto& conn : m_connMap) {
71  std::copy(conn.second.begin(), conn.second.end(), std::back_inserter(lConns));
72  }
73 
74  int stageCounter = 0;
75 
76  while(!lConns.empty()) {
77 
78  std::unordered_map<unsigned int, std::pair<int, int> > mCounter;//layerKey, nDst, nSrc
79 
80  for(const auto& conn : lConns) {
81  auto entryIt = mCounter.find(conn->m_dst);
82  if(entryIt != mCounter.end()) {
83  (*entryIt).second.first++;
84  }
85  else {
86  int nDst = 1;
87  int nSrc = 0;
88  mCounter.insert(std::make_pair(conn->m_dst, std::make_pair(nDst, nSrc)));
89  }
90 
91  entryIt = mCounter.find(conn->m_src);
92  if(entryIt != mCounter.end()) {
93  (*entryIt).second.second++;
94  }
95  else {
96  int nDst = 0;
97  int nSrc = 1;
98  mCounter.insert(std::make_pair(conn->m_src, std::make_pair(nDst, nSrc)));
99  }
100  }
101 
102  //find layers with nSrc = 0
103 
104  std::set<unsigned int> zeroLayers;
105 
106  for(const auto& layerCounts : mCounter) {
107 
108  if(layerCounts.second.second!=0) continue;
109 
110  zeroLayers.insert(layerCounts.first);
111  }
112 
113  //remove connections which use zeroLayer as destination
114 
115  std::vector<const FASTRACK_CONNECTION*> theStage;
116 
118 
119  while(cIt!=lConns.end()) {
120  if(zeroLayers.find((*cIt)->m_dst) != zeroLayers.end()) {//check if contains
121  theStage.push_back(*cIt);
122  cIt = lConns.erase(cIt);
123  continue;
124  }
125  ++cIt;
126  }
127  newConnMap.insert(std::make_pair(stageCounter, theStage));
128  stageCounter++;
129  }
130 
131  //create layer groups
132 
133  int currentStage = 0;
134 
135  //the doublet making is done using "outside-in" approach hence the reverse iterations
136 
137  for(std::map<int, std::vector<const FASTRACK_CONNECTION*> >::reverse_iterator it = newConnMap.rbegin();it!=newConnMap.rend();++it, currentStage++) {
138 
139  const std::vector<const FASTRACK_CONNECTION*> & vConn = (*it).second;
140 
141  //loop over links, extract all connections for the stage, group sources by L1 (dst) index
142 
143  std::map<unsigned int, std::vector<const FASTRACK_CONNECTION*> > l1ConnMap;
144 
145  for(const auto* conn : vConn) {
146 
147  unsigned int dst = conn->m_dst;
148 
149  std::map<unsigned int, std::vector<const FASTRACK_CONNECTION*> >::iterator l1MapIt = l1ConnMap.find(dst);
150  if(l1MapIt != l1ConnMap.end())
151  (*l1MapIt).second.push_back(conn);
152  else {
153  std::vector<const FASTRACK_CONNECTION*> v = {conn};
154  l1ConnMap.insert(std::make_pair(dst, v));
155  }
156  }
157 
158  std::vector<LayerGroup> lgv;
159 
160  lgv.reserve(l1ConnMap.size());
161 
162  for(const auto& l1Group : l1ConnMap) {
163  lgv.push_back(LayerGroup(l1Group.first, l1Group.second));
164  }
165 
166  m_layerGroups.insert(std::make_pair(currentStage, lgv));
167  }
168 
169  newConnMap.clear();
170 
171 }
172 
174  m_layerGroups.clear();
175  for(std::map<int, std::vector<FASTRACK_CONNECTION*> >::iterator it = m_connMap.begin();it!=m_connMap.end();++it) {
176  for(std::vector<FASTRACK_CONNECTION*>::iterator cIt=(*it).second.begin();cIt!=(*it).second.end();++cIt) {
177  delete (*cIt);
178  }
179  (*it).second.clear();
180  }
181  m_connMap.clear();
182 
183 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
FasTrackConnection
Definition: FasTrackConnector.h:12
FasTrackConnector.h
checkCorrelInHIST.conn
conn
Definition: checkCorrelInHIST.py:25
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
python.FPGATrackSimAnalysisConfig.stage
stage
Definition: FPGATrackSimAnalysisConfig.py:604
WriteCellNoiseToCool.src
src
Definition: WriteCellNoiseToCool.py:513
hist_file_dump.d
d
Definition: hist_file_dump.py:137
makeTOC.inFile
string inFile
Definition: makeTOC.py:5
skel.it
it
Definition: skel.GENtoEVGEN.py:423
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
FasTrackConnection::FasTrackConnection
FasTrackConnection(unsigned int, unsigned int)
Definition: FasTrackConnector.cxx:13
FASTRACK_CONNECTION
struct FasTrackConnection FASTRACK_CONNECTION
lumiFormat.i
int i
Definition: lumiFormat.py:92
FasTrackConnector::FasTrackConnector
FasTrackConnector(std::ifstream &)
Definition: FasTrackConnector.cxx:17
python.xAODType.dummy
dummy
Definition: xAODType.py:4
FasTrackConnector::m_connMap
std::map< int, std::vector< FASTRACK_CONNECTION * > > m_connMap
Definition: FasTrackConnector.h:42
FasTrackConnector::m_etaBin
float m_etaBin
Definition: FasTrackConnector.h:39
python.PyAthena.v
v
Definition: PyAthena.py:157
Base_Fragment.width
width
Definition: Sherpa_i/share/common/Base_Fragment.py:59
FasTrackConnector::~FasTrackConnector
~FasTrackConnector()
Definition: FasTrackConnector.cxx:173
FasTrackConnector::m_layerGroups
std::map< int, std::vector< struct LayerGroup > > m_layerGroups
Definition: FasTrackConnector.h:41
calibdata.copy
bool copy
Definition: calibdata.py:27
dqBeamSpot.nEntries
int nEntries
Definition: dqBeamSpot.py:73