ATLAS Offline Software
Loading...
Searching...
No Matches
TiledEtaPhiMap.icc
Go to the documentation of this file.
1// emacs, this is -*- C++ -*-
2
3/*
4 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
5*/
6
7
8namespace JetTiledMap {
9
10
11
12 template<class POINT, class DIST2>
13 void Tile<POINT,DIST2>::fillPointsInDr2(POINT &p, double r2, pointvec_t& points ) const {
14 //double r2= r*r;
15 if(this->empty()) return;
16 const_iterator it = this->begin();
17 const_iterator itE = this->end();
18 //std::cout <<"fillPointsInDr2 around "<< center << std::endl;
19 for(;it !=itE; ++it){
20 //std::cout << " ->> "<< dr2( p, *it) << " for "<< *it<<std::endl;
21 if( dr2( p, *it) < r2) points.push_back(*it);
22 }
23 }
24
25 template<class POINT, class DIST2>
26 const DIST2 Tile<POINT, DIST2>::dr2;
27 template<class POINT, class DIST2>
28 const Tile<POINT, DIST2> Tile<POINT, DIST2>::voidTile =
29 Tile<POINT, DIST2>(POINT(100, 2*M_PI*10)); // unphysical dummy coordinates
30
31
32 template<class POINT, class DIST2 >
33 void TiledEtaPhiMap<POINT,DIST2>::init(double rmax){
34
35 m_rmax = rmax;
36
37 m_ndivX = int(m_etarange/rmax);
38 m_sizeX = m_etarange/m_ndivX;
39
40 const double twopi = 2.0*acos(-1.0);
41 m_ndivY = int(twopi/rmax);
42 m_sizeY = twopi/m_ndivY;
43
44 m_tiles.resize(m_ndivY*m_ndivX);
45
46 for(int i=0;i<static_cast<int>(m_ndivX); i++){
47 for(int j=0;j<static_cast<int>(m_ndivY); j++){
48 tile_t & thisTile = m_tiles[ tileIndex_i(i,j) ];
49 thisTile.center = POINT( (i+0.5)*m_sizeX -m_halfetarange , M_PI - (j+0.5)*m_sizeY );
50 int jnorth = j-1;
51 if(j==0) jnorth=m_ndivY-1;
52 int jsouth = j+1;
53 if(jsouth==static_cast<int>(m_ndivY)) jsouth=0;
54
55
56
57 if(i>0){
58 thisTile.m_neighbour[NW] = &m_tiles[tileIndex_i(i-1, jnorth)] ;
59 thisTile.m_neighbour[W] = &m_tiles[tileIndex_i(i-1, j)] ;
60 thisTile.m_neighbour[SW] = &m_tiles[tileIndex_i(i-1, jsouth)] ;
61 } else { // west side
62 thisTile.m_neighbour[NW] = &tile_t::voidTile;
63 thisTile.m_neighbour[W] = &tile_t::voidTile;
64 thisTile.m_neighbour[SW] = &tile_t::voidTile;
65 }
66
67 thisTile.m_neighbour[N] = &m_tiles[tileIndex_i(i, jnorth)] ;
68 thisTile.m_neighbour[S] = &m_tiles[tileIndex_i(i, jsouth)] ;
69
70 //std::cout<<" south = "<< thisTile.m_neighbour[S]<< " ind="<< tileIndex_i(i, jsouth) << std::endl;
71
72 if(i< (static_cast<int>(m_ndivX)-1) ){
73 thisTile.m_neighbour[NE] = &m_tiles[tileIndex_i(i+1, jnorth)] ;
74 thisTile.m_neighbour[E] = &m_tiles[tileIndex_i(i+1, j)] ;
75 thisTile.m_neighbour[SE] = &m_tiles[tileIndex_i(i+1, jsouth)] ;
76 }else{ //east side
77 thisTile.m_neighbour[NE] = &tile_t::voidTile;
78 thisTile.m_neighbour[E] = &tile_t::voidTile;
79 thisTile.m_neighbour[SE] = &tile_t::voidTile;
80 }
81
82 }
83 }
84
85 }
86
87 template<class POINT, class DIST2 >
88 void TiledEtaPhiMap<POINT,DIST2>::insert(POINT & p) {
89 m_size++;
90 size_t ind = tileIndex(p);
91 m_tiles[ind].push_back(p);
92 }
93
94
95 template<class POINT, class DIST2 >
96 std::vector<POINT> TiledEtaPhiMap<POINT,DIST2>::pointsInDr(POINT &p, double r) const {
97
98 std::vector<POINT> vec;
99
100 double r2=r*r;
101
102 //std::cout << "pointsinDR "<< p.x()<< ", "<< p.y() << " " << tileIndex(p)<< " "<< m_tiles.size() << std::endl;
103 // p is part of thisTile
104 const tile_t & thisTile = m_tiles[tileIndex(p)];
105 const POINT& center = thisTile.center;
106
107
108 // compute distance to edges of thisTile
109 double d_to_N2 = xAOD::P4Helpers::deltaPhi(p.y(), (center.y() + m_sizeY/2) ); d_to_N2*=d_to_N2;
110 double d_to_E2 = ( p.x() - (center.x() + m_sizeX/2) ) ; d_to_E2*=d_to_E2;
111 double d_to_S2 = xAOD::P4Helpers::deltaPhi(p.y(), (center.y() - m_sizeY/2) ); d_to_S2*=d_to_S2;
112 double d_to_W2 = ( p.x() - (center.x() - m_sizeX/2) ) ; d_to_W2*=d_to_W2;
113
114 // get points in this tile :
115 thisTile.fillPointsInDr2(p,r2,vec);
116
117 //std::cout << "pointsinDR "<< p << " " << tileIndex(p)<< " "<< &thisTile <<" center="<<thisTile.center << std::endl;
118
119 // check if close to neighbouring tiles. if so consider points in these tiles :
120 if(d_to_N2 < r2) thisTile.m_neighbour[N]->fillPointsInDr2(p,r2,vec);
121 if(d_to_E2 < r2) thisTile.m_neighbour[E]->fillPointsInDr2(p,r2,vec);
122 if(d_to_S2 < r2) thisTile.m_neighbour[S]->fillPointsInDr2(p,r2,vec);
123 if(d_to_W2 < r2) thisTile.m_neighbour[W]->fillPointsInDr2(p,r2,vec);
124
125 if( (d_to_N2+ d_to_E2) < r2 ) thisTile.m_neighbour[NE]->fillPointsInDr2(p,r2,vec);
126 if( (d_to_S2+ d_to_E2) < r2 ) thisTile.m_neighbour[SE]->fillPointsInDr2(p,r2,vec);
127
128 if((d_to_N2+ d_to_W2) < r2 ) thisTile.m_neighbour[NW]->fillPointsInDr2(p,r2,vec);
129 if((d_to_S2+ d_to_W2) < r2 ) thisTile.m_neighbour[SW]->fillPointsInDr2(p,r2,vec);
130
131 return vec;
132
133 }
134
135
136 template<class POINT, class DIST2 >
137 void TiledEtaPhiMap<POINT,DIST2>::clear(){
138 for(size_t i=0; i<m_tiles.size();i++){
139 m_tiles[i].clear();
140 }
141 m_size=0;
142 }
143
144}