19 m_r1 = m_layer.m_refCoord;
20 m_r2 = m_layer.m_refCoord;
21 m_z1 = m_layer.m_minBound;
22 m_z2 = m_layer.m_maxBound;
25 m_r1 = m_layer.m_minBound;
26 m_r2 = m_layer.m_maxBound;
27 m_z1 = m_layer.m_refCoord;
28 m_z2 = m_layer.m_refCoord;
32 float eta1 = -std::log(std::sqrt(1+t1*t1)-t1);
36 float eta2 = -std::log(std::sqrt(1+t2*t2)-t2);
51 int binCounter = bin0;
55 m_bins.push_back(binCounter++);
57 if(m_layer.m_type == 0) {
58 m_minRadius.push_back(m_layer.m_refCoord - 2.0);
59 m_maxRadius.push_back(m_layer.m_refCoord + 2.0);
60 m_minBinCoord.push_back(m_layer.m_minBound);
61 m_maxBinCoord.push_back(m_layer.m_maxBound);
64 m_minRadius.push_back(m_layer.m_minBound - 2.0);
65 m_maxRadius.push_back(m_layer.m_maxBound + 2.0);
66 m_minBinCoord.push_back(m_layer.m_minBound);
67 m_maxBinCoord.push_back(m_layer.m_maxBound);
71 float nB =
static_cast<int>(deltaEta/m_etaBinWidth);
73 if(deltaEta - m_etaBinWidth*nB > 0.5*m_etaBinWidth) m_nBins++;
75 m_etaBin = deltaEta/m_nBins;
78 m_bins.push_back(binCounter++);
79 if(m_layer.m_type == 0) {
80 m_minRadius.push_back(m_layer.m_refCoord - 2.0);
81 m_maxRadius.push_back(m_layer.m_refCoord + 2.0);
82 m_minBinCoord.push_back(m_layer.m_minBound);
83 m_maxBinCoord.push_back(m_layer.m_maxBound);
86 m_minRadius.push_back(m_layer.m_minBound - 2.0);
87 m_maxRadius.push_back(m_layer.m_maxBound + 2.0);
88 m_minBinCoord.push_back(m_layer.m_minBound);
89 m_maxBinCoord.push_back(m_layer.m_maxBound);
94 float eta = m_minEta+0.5*m_etaBin;
96 for(
int i=1;
i<=m_nBins;
i++) {
98 m_bins.push_back(binCounter++);
100 float e1 =
eta - 0.5*m_etaBin;
101 float e2 =
eta + 0.5*m_etaBin;
103 if(m_layer.m_type == 0) {
104 m_minRadius.push_back(m_layer.m_refCoord - 2.0);
105 m_maxRadius.push_back(m_layer.m_refCoord + 2.0);
106 float z1 = m_layer.m_refCoord*std::sinh(e1);
107 m_minBinCoord.push_back(z1);
108 float z2 = m_layer.m_refCoord*std::sinh(e2);
109 m_maxBinCoord.push_back(z2);
112 if (m_layer.m_refCoord > 0) {
115 float r = m_layer.m_refCoord/std::sinh(e1);
116 m_minBinCoord.push_back(
r);
117 m_minRadius.push_back(
r - 2.0);
118 r = m_layer.m_refCoord/std::sinh(e2);
119 m_maxBinCoord.push_back(
r);
120 m_maxRadius.push_back(
r + 2.0);
136 const float tol = 5.0;
145 float A = r2/(r2-r1);
146 float B = r1/(r2-r1);
148 float z0_min = z1min*
A - max_b2*B;
149 float z0_max = z1max*
A - min_b2*B;
151 if(z0_max < min_z0-tol || z0_min > max_z0+tol)
return false;
162 if(r2max <= r1)
return false;
172 z0_max = (z1max*r2max - z2*r1)/(r2max-r1);
173 z0_min = (z1min*r2min - z2*r1)/(r2min-r1);
176 z0_max = (z1max*r2min - z2*r1)/(r2min-r1);
177 z0_min = (z1min*r2max - z2*r1)/(r2max-r1);
180 if(z0_max < min_z0-tol || z0_min > max_z0+tol)
return false;
193 if (r1min >= r2max)
return false;
197 float z0_max = z1 - r1min*(z2-z1)/(r2max-r1min);
199 if(z0_max < min_z0-tol)
return false;
203 float z0_min = z1 - r1max*(z2-z1)/(r2min-r1max);
205 if (z0_min > max_z0+tol)
return false;
209 float z0_min = z1 - r1min*(z2-z1)/(r2max-r1min);
211 if(z0_min > max_z0+tol)
return false;
215 float z0_max = z1 - r1max*(z2-z1)/(r2min-r1max);
217 if (z0_max < min_z0-tol)
return false;
233 if (r2 < r1min)
return false;
237 float z0_min = z1 - (z2max - z1)/(r2/r1max - 1);
238 float z0_max = z1 - (z2max - z1)/(r2/r1min - 1);
240 if (z0_min > z0_max)
std::swap(z0_min, z0_max);
242 bool beyond_range = (z0_max < min_z0-tol || z0_min > max_z0+tol);
244 if (!beyond_range)
return true;
248 z0_min = z1 - (z2min - z1)/(r2/r1max - 1);
249 z0_max = z1 - (z2min - z1)/(r2/r1min - 1);
251 if (z0_min > z0_max)
std::swap(z0_min, z0_max);
253 beyond_range = (z0_max < min_z0-tol || z0_min > max_z0+tol);
255 if (!beyond_range)
return true;
302 const float min_z0 = -168.0;
303 const float max_z0 = 168.0;
307 for(
const auto& layer : layers) {
317 for(std::map<
int, std::vector<GNN_FASTRACK_CONNECTION*> >
::const_iterator it = conn->m_connMap.begin();it!=conn->m_connMap.end();++it) {
319 const std::vector<GNN_FASTRACK_CONNECTION*>& vConn = (*it).second;
321 for(std::vector<GNN_FASTRACK_CONNECTION*>::const_iterator cIt=vConn.begin();cIt!=vConn.end();++cIt) {
323 unsigned int src = (*cIt)->m_src;
324 unsigned int dst = (*cIt)->m_dst;
326 const TrigFTF_GNN_Layer* pL1 = getTrigFTF_GNN_LayerByKey(dst);
327 const TrigFTF_GNN_Layer* pL2 = getTrigFTF_GNN_LayerByKey(src);
330 std::cout <<
" skipping invalid dst layer " << dst << std::endl;
334 std::cout <<
" skipping invalid src layer " << src << std::endl;
337 int nSrcBins = pL2->m_bins.size();
338 int nDstBins = pL1->m_bins.size();
340 (*cIt)->m_binTable.resize(nSrcBins*nDstBins, 0);
342 for(int b1=0;b1<nDstBins;b1++) {
343 for(int b2=0;b2<nSrcBins;b2++) {
344 if(!pL1->verifyBin(pL2, b1, b2, min_z0, max_z0)) continue;
345 int address = b1 + b2*nDstBins;
346 (*cIt)->m_binTable.at(address) = 1;
348 int bin1_idx = pL1->m_bins.at(b1);
349 int bin2_idx = pL2->m_bins.at(b2);
351 if(bin1_idx != lastBin1) {
353 std::vector<int> v2(1, bin2_idx);
354 m_binGroups.push_back(std::make_pair(bin1_idx, v2));
359 (*m_binGroups.rbegin()).second.push_back(bin2_idx);
368 std::map<int, std::pair<std::list<int>, std::list<int> > > bin_map;
374 for (
const auto& bg : m_binGroups) {
378 if (bin_map.find(bin1) == bin_map.end()) {
379 std::pair<std::list<int>, std::list<int> > empty_links;
380 bin_map.insert(std::make_pair(bin1, empty_links));
383 std::pair<std::list<int>, std::list<int> >& bin1_links = (*bin_map.find(bin1)).second;
385 for (
auto bin2 :
bg.second) {
387 if (bin_map.find(
bin2) == bin_map.end()) {
388 std::pair<std::list<int>, std::list<int> > empty_links;
389 bin_map.insert(std::make_pair(
bin2, empty_links));
392 std::pair<std::list<int>, std::list<int> >& bin2_links = (*bin_map.find(
bin2)).second;
394 bin1_links.second.push_back(
bin2);
395 bin2_links.first.push_back(bin1);
400 std::map<int, std::pair<std::list<int>, std::list<int> > > current_map(bin_map);
404 std::vector<std::vector<int> > stages;
408 while (!current_map.empty()) {
412 std::vector<int> exit_bins;
414 for(
const auto& bl : current_map) {
416 if(!bl.second.first.empty())
continue;
418 exit_bins.push_back(bl.first);
424 stages.emplace_back(exit_bins);
428 for (
auto bin1_key : exit_bins) {
429 auto p1 = current_map.find(bin1_key);
430 if (p1 == current_map.end())
continue;
431 auto& bin1_links = (*p1).second;
433 for(
auto bin2_key : bin1_links.second) {
434 auto p2 = current_map.find(bin2_key);
435 if (p2 == current_map.end())
continue;
436 std::list<int>&
links = (*p2).second.first;
437 links.remove(bin1_key);
443 for (
auto bin1_key : exit_bins) {
444 current_map.erase(bin1_key);
453 for (
auto iter = stages.rbegin(); iter != stages.rend(); ++iter) {
455 for (
auto bin1_idx : (*iter)) {
456 const auto p = bin_map.find(bin1_idx);
457 if (p == bin_map.end())
continue;
458 const std::list<int>& bin2_list = (*p).second.second;
460 std::vector<int>
v2(bin2_list.begin(), bin2_list.end());
462 m_binGroups.push_back(std::make_pair(bin1_idx, v2));