32 if (conn_fileName.empty()) {
33 ATH_MSG_FATAL(
"Cannot find layer connections file " << conn_fileName);
34 return StatusCode::FAILURE;
38 std::ifstream ifs(conn_fileName.c_str());
45 ATH_MSG_INFO(
"Layer connections are initialized from file " << conn_fileName);
63 return StatusCode::SUCCESS;
75 const float cut_dphi_max =
m_LRTmode ? 0.07f : 0.012f;
76 const float cut_dcurv_max =
m_LRTmode ? 0.015f : 0.001f;
80 const float min_deltaPhi =
m_LRTmode ? 0.01f : 0.001f;
82 const float maxOuterRadius =
m_LRTmode ? 1050.0 : 550.0;
84 const float cut_zMinU = min_z0 + maxOuterRadius*roi.
dzdrMinus();
85 const float cut_zMaxU = max_z0 + maxOuterRadius*roi.
dzdrPlus();
87 const float ptCoeff = 0.29997*1.9972/2.0;
89 float tripletPtMin = 0.8*
m_minPt;
90 const float pt_scale = 900.0/
m_minPt;
92 float maxCurv = ptCoeff/tripletPtMin;
94 float maxKappa_high_eta =
m_LRTmode ? 1.0*maxCurv : std::sqrt(0.8)*maxCurv;
95 float maxKappa_low_eta =
m_LRTmode ? 1.0*maxCurv : std::sqrt(0.6)*maxCurv;
98 maxKappa_high_eta = 4.75e-4
f*pt_scale;
99 maxKappa_low_eta = 3.75e-4
f*pt_scale;
102 const float dphi_coeff =
m_LRTmode ? 1.0*maxCurv : 0.68*maxCurv;
104 const float minDeltaRadius = 2.0;
108 unsigned int nConnections = 0;
114 for(
const auto&
bg :
m_geo->bin_groups()) {
118 if(B1.
empty())
continue;
122 for(
const auto& b2_idx :
bg.second) {
126 if(B2.
empty())
continue;
131 float abs_dr = std::fabs(rb2-rb1);
133 deltaPhi = min_deltaPhi + dphi_coeff*abs_dr;
137 deltaPhi = 0.002f + 4.33e-4
f*pt_scale*abs_dr;
139 deltaPhi = 0.015f + 2.2e-4
f*pt_scale*abs_dr;
144 unsigned int first_it = 0;
146 for(
unsigned int n1Idx = 0;n1Idx<B1.
m_vn.size();n1Idx++) {
148 std::vector<unsigned int>& v1In = B1.
m_in[n1Idx];
152 const std::array<float, 5>& n1pars = B1.
m_params[n1Idx];
154 float phi1 = n1pars[2];
155 float r1 = n1pars[3];
156 float z1 = n1pars[4];
163 for(
unsigned int n2PhiIdx = first_it; n2PhiIdx<B2.
m_vPhiNodes.size();n2PhiIdx++) {
171 if(phi2 > maxPhi)
break;
173 unsigned int n2Idx = B2.
m_vPhiNodes[n2PhiIdx].second;
175 const std::vector<unsigned int>& v2In = B2.
m_in[n2Idx];
179 const std::array<float, 5>& n2pars = B2.
m_params[n2Idx];
181 float r2 = n2pars[3];
185 if(
dr < minDeltaRadius) {
189 float z2 = n2pars[4];
193 float ftau = std::fabs(tau);
198 if(ftau < n1pars[0])
continue;
199 if(ftau > n1pars[1])
continue;
201 if(ftau < n2pars[0])
continue;
202 if(ftau > n2pars[1])
continue;
206 float z0 = z1 - r1*tau;
208 if(z0 < min_z0 || z0 > max_z0)
continue;
210 float zouter =
z0 + maxOuterRadius*tau;
212 if(zouter < cut_zMinU || zouter > cut_zMaxU)
continue;
215 float curv = (phi2-phi1)/
dr;
216 float abs_curv = std::abs(curv);
219 if(abs_curv > maxKappa_low_eta) {
224 if(abs_curv > maxKappa_high_eta) {
229 float exp_eta = std::sqrt(1+tau*tau)-tau;
233 bool isGood = v2In.size() <= 2;
237 float uat_1 = 1.0f/exp_eta;
239 for(
const auto& n2_in_idx : v2In) {
241 float tau2 = edgeStorage.at(n2_in_idx).m_p[0];
242 float tau_ratio = tau2*uat_1 - 1.0f;
244 if(std::fabs(tau_ratio) > cut_tau_ratio_max){
257 float dPhi2 = curv*r2;
258 float dPhi1 = curv*r1;
262 edgeStorage.emplace_back(B1.
m_vn[n1Idx], B2.
m_vn[n2Idx], exp_eta, curv, phi1 + dPhi1);
266 int outEdgeIdx = nEdges;
268 float uat_2 = 1/exp_eta;
269 float Phi2 = phi2 + dPhi2;
272 for(
const auto& inEdgeIdx : v2In) {
278 float tau_ratio = pS->
m_p[0]*uat_2 - 1.0f;
280 if(std::abs(tau_ratio) > cut_tau_ratio_max){
284 float dPhi = Phi2 - pS->
m_p[2];
289 if(dPhi < -cut_dphi_max || dPhi > cut_dphi_max) {
293 float dcurv = curv2 - pS->
m_p[1];
295 if(dcurv < -cut_dcurv_max || dcurv > cut_dcurv_max) {
312 ATH_MSG_WARNING(
"Maximum number of graph edges exceeded - possible efficiency loss "<< nEdges);
315 return std::make_pair(nEdges, nConnections);
320 const int maxIter = 15;
326 std::vector<TrigFTF_GNN_Edge*> v_old;
328 for(
int edgeIndex=0;edgeIndex<nEdges;edgeIndex++) {
331 if(pS->
m_nNei == 0)
continue;
339 std::vector<TrigFTF_GNN_Edge*> v_new;
341 v_new.reserve(v_old.size());
343 for(
auto pS : v_old) {
345 int next_level = pS->m_level;
347 for(
int nIdx=0;nIdx<pS->m_nNei;nIdx++) {
349 unsigned int nextEdgeIdx = pS->m_vNei[nIdx];
353 if(pS->m_level == pN->
m_level) {
360 pS->m_next = next_level;
367 for(
auto pS : v_new) {
368 if(pS->m_next != pS->m_level) {
370 pS->m_level = pS->m_next;
371 if(maxLevel < pS->m_level) maxLevel = pS->m_level;
375 if(nChanges == 0)
break;
378 v_old = std::move(v_new);