#include <Dnn3piCylinder.hh>
Inheritance diagram for fastjet::Dnn3piCylinder:
Public Member Functions | |
Dnn3piCylinder () | |
empty initaliser | |
Dnn3piCylinder (const std::vector< EtaPhi > &, const bool &ignore_nearest_is_mirror=false, const bool &verbose=false) | |
initialiser... | |
int | NearestNeighbourIndex (const int &ii) const |
Note: one of the difficulties of the 0--3pi mapping is that a point may have its mirror copy as its own nearest neighbour (if no other point is within a distance of 2pi). | |
double | NearestNeighbourDistance (const int &ii) const |
Returns the distance to the nearest neighbour of point labelled by index ii (assumes ii is valid). | |
bool | Valid (const int &index) const |
Returns true iff the given index corresponds to a point that exists in the DNN structure (meaning that it has been added, and not removed in the meantime). | |
void | RemoveAndAddPoints (const std::vector< int > &indices_to_remove, const std::vector< EtaPhi > &points_to_add, std::vector< int > &indices_added, std::vector< int > &indices_of_updated_neighbours) |
insertion and removal of points | |
~Dnn3piCylinder () | |
Private Member Functions | |
EtaPhi | _remap_phi (const EtaPhi &point) |
given a phi value in the 0--2pi range return one in the pi--3pi range. | |
void | _RegisterCylinderPoint (const EtaPhi &cylinder_point, std::vector< EtaPhi > &plane_points) |
What on earth does this do? | |
Private Attributes | |
bool | _verbose |
bool | _ignore_nearest_is_mirror |
std::vector< MirrorVertexInfo > | _mirror_info |
std::vector< int > | _cylinder_index_of_plane_vertex |
DnnPlane * | _DNN |
Static Private Attributes | |
static const int | INEXISTENT_VERTEX = -3 |
Classes | |
struct | MirrorVertexInfo |
Definition at line 45 of file Dnn3piCylinder.hh.
|
empty initaliser
Definition at line 48 of file Dnn3piCylinder.hh. 00048 {}
|
|
initialiser... NB: this class is more efficient than the plain Dnn4piCylinder class, but can give wrong answers when the nearest neighbour is further away than 2pi (in this case a point's nearest neighbour becomes itself, because it is considered to be a distance 2pi away). For the kt-algorithm (e.g.) this is actually not a problem (the distance need only be accurate when it is less than R), so we can tell the routine to ignore this problem -- alternatively the routine will crash if it detects it occurring (only when finding the nearest neighbour index, not its distance). Definition at line 41 of file Dnn3piCylinder.cc. References _DNN, _ignore_nearest_is_mirror, _RegisterCylinderPoint(), and _verbose. 00044 { 00045 00046 _verbose = verbose; 00047 _ignore_nearest_is_mirror = ignore_nearest_is_mirror; 00048 vector<EtaPhi> plane_points; 00049 //plane_points.reserve(2*input_points.size()); 00050 00051 for (unsigned int i=0; i < input_points.size(); i++) { 00052 _RegisterCylinderPoint(input_points[i], plane_points); 00053 } 00054 00055 if (_verbose) cout << "============== Preparing _DNN" << endl; 00056 _DNN = new DnnPlane(plane_points, verbose); 00057 }
|
|
Definition at line 249 of file Dnn3piCylinder.hh. References _DNN. 00249 { 00250 delete _DNN; 00251 }
|
|
What on earth does this do? Example: last true "cylinder" index was 15 last plane index was 23 Then: _cylinder_index_of_plane_vertex.size() = 24 and _mirror_info.size() = 16 IF cylinder_point's phi < pi then create: _mirror_info[16] = (main_index = 24, mirror_index=25) _cylinder_index_of_plane_vertex[24] = 16 _cylinder_index_of_plane_vertex[25] = 16 ELSE create: _mirror_info[16] = (main_index = 24, mirror_index=INEXISTENT..) _cylinder_index_of_plane_vertex[24] = 16 ADDITIONALLY push the cylinder_point (and if it exists the mirror copy) onto the vector plane_points. Definition at line 79 of file Dnn3piCylinder.cc. References _cylinder_index_of_plane_vertex, _mirror_info, _remap_phi(), INEXISTENT_VERTEX, fastjet::Dnn3piCylinder::MirrorVertexInfo::main_index, fastjet::Dnn3piCylinder::MirrorVertexInfo::mirror_index, fastjet::pi, and fastjet::EtaPhi::second. Referenced by Dnn3piCylinder(), and RemoveAndAddPoints(). 00080 { 00081 double phi = cylinder_point.second; 00082 assert(phi >= 0.0 && phi < 2*pi); 00083 00084 // do main point 00085 MirrorVertexInfo mvi; 00086 mvi.main_index = _cylinder_index_of_plane_vertex.size(); 00087 _cylinder_index_of_plane_vertex.push_back(_mirror_info.size()); 00088 plane_points.push_back(cylinder_point); 00089 00090 // do mirror point if need be 00091 if (phi < pi) { 00092 mvi.mirror_index = _cylinder_index_of_plane_vertex.size(); 00093 _cylinder_index_of_plane_vertex.push_back(_mirror_info.size()); 00094 plane_points.push_back(_remap_phi(cylinder_point)); 00095 } else { 00096 mvi.mirror_index = INEXISTENT_VERTEX; 00097 } 00098 00099 // 00100 _mirror_info.push_back(mvi); 00101 }
|
|
given a phi value in the 0--2pi range return one in the pi--3pi range.
Definition at line 162 of file Dnn3piCylinder.hh. References fastjet::EtaPhi::first, fastjet::pi, fastjet::EtaPhi::second, and twopi. Referenced by _RegisterCylinderPoint(). 00162 { 00163 double phi = point.second; 00164 if (phi < pi) { phi += twopi ;} 00165 return EtaPhi(point.first, phi);}
|
|
Returns the distance to the nearest neighbour of point labelled by index ii (assumes ii is valid).
Implements fastjet::DynamicNearestNeighbours. Definition at line 229 of file Dnn3piCylinder.hh. References _DNN, _mirror_info, INEXISTENT_VERTEX, and fastjet::DnnPlane::NearestNeighbourDistance(). 00229 { 00230 int main_index = _mirror_info[current].main_index; 00231 int mirror_index = _mirror_info[current].mirror_index; 00232 if (mirror_index == INEXISTENT_VERTEX ) { 00233 return _DNN->NearestNeighbourDistance(main_index); 00234 } else { 00235 return ( 00236 _DNN->NearestNeighbourDistance(main_index) < 00237 _DNN->NearestNeighbourDistance(mirror_index)) ? 00238 _DNN->NearestNeighbourDistance(main_index) : 00239 _DNN->NearestNeighbourDistance(mirror_index) ; 00240 } 00241 00242 }
|
|
Note: one of the difficulties of the 0--3pi mapping is that a point may have its mirror copy as its own nearest neighbour (if no other point is within a distance of 2pi). This does not matter for the kt_algorithm with reasonable values of radius, but might matter for a general use of this algorithm -- depending on whether or not the user has initialised the class with instructions to ignore this problem the program will detect and ignore it, or crash. Implements fastjet::DynamicNearestNeighbours. Definition at line 204 of file Dnn3piCylinder.hh. References _cylinder_index_of_plane_vertex, _DNN, _ignore_nearest_is_mirror, _mirror_info, INEXISTENT_VERTEX, fastjet::DnnPlane::NearestNeighbourDistance(), and fastjet::DnnPlane::NearestNeighbourIndex(). 00204 { 00205 int main_index = _mirror_info[current].main_index; 00206 int mirror_index = _mirror_info[current].mirror_index; 00207 int plane_index; 00208 if (mirror_index == INEXISTENT_VERTEX ) { 00209 plane_index = _DNN->NearestNeighbourIndex(main_index); 00210 } else { 00211 plane_index = ( 00212 _DNN->NearestNeighbourDistance(main_index) < 00213 _DNN->NearestNeighbourDistance(mirror_index)) ? 00214 _DNN->NearestNeighbourIndex(main_index) : 00215 _DNN->NearestNeighbourIndex(mirror_index) ; 00216 } 00217 int this_cylinder_index = _cylinder_index_of_plane_vertex[plane_index]; 00218 // either the user has acknowledged the fact that they may get the 00219 // mirror copy as the closest point, or crash if it should occur 00220 // that mirror copy is the closest point. 00221 assert(_ignore_nearest_is_mirror || this_cylinder_index != current); 00222 //if (this_cylinder_index == current) { 00223 // std::cerr << "WARNING point "<<current<< 00224 // " has its mirror copy as its own nearest neighbour"<<endl; 00225 //} 00226 return this_cylinder_index; 00227 }
|
|
insertion and removal of points
Implements fastjet::DynamicNearestNeighbours. Definition at line 106 of file Dnn3piCylinder.cc. References _cylinder_index_of_plane_vertex, _DNN, _mirror_info, _RegisterCylinderPoint(), INEXISTENT_VERTEX, fastjet::Dnn3piCylinder::MirrorVertexInfo::main_index, fastjet::Dnn3piCylinder::MirrorVertexInfo::mirror_index, and fastjet::DnnPlane::RemoveAndAddPoints(). 00109 { 00110 00111 // translate from "cylinder" indices of points to remove to the 00112 // plane indices of points to remove, bearing in mind that sometimes 00113 // there are multple plane points to remove. 00114 vector<int> plane_indices_to_remove; 00115 for (unsigned int i=0; i < indices_to_remove.size(); i++) { 00116 MirrorVertexInfo * mvi; 00117 mvi = & _mirror_info[indices_to_remove[i]]; 00118 plane_indices_to_remove.push_back(mvi->main_index); 00119 if (mvi->mirror_index != INEXISTENT_VERTEX) { 00120 plane_indices_to_remove.push_back(mvi->mirror_index); 00121 } 00122 } 00123 00124 // given "cylinder" points to add get hold of the list of 00125 // plane-points to add. 00126 vector<EtaPhi> plane_points_to_add; 00127 indices_added.clear(); 00128 for (unsigned int i=0; i < points_to_add.size(); i++) { 00129 indices_added.push_back(_mirror_info.size()); 00130 _RegisterCylinderPoint(points_to_add[i], plane_points_to_add); 00131 } 00132 00133 // now get the hard work done (note that we need to supply the 00134 // plane_indices_added vector but that we will not actually check 00135 // its contents in any way -- the indices_added that is actually 00136 // returned has been calculated above). 00137 vector<int> updated_plane_neighbours, plane_indices_added; 00138 _DNN->RemoveAndAddPoints(plane_indices_to_remove, plane_points_to_add, 00139 plane_indices_added, updated_plane_neighbours); 00140 00141 // extract, from the updated_plane_neighbours, the set of cylinder 00142 // neighbours that have changed 00143 set<int> index_set; 00144 unsigned int i; 00145 for (i=0; i < updated_plane_neighbours.size(); i++) { 00146 index_set.insert( 00147 _cylinder_index_of_plane_vertex[updated_plane_neighbours[i]]);} 00148 00149 // decant the set into the vector that needs to be returned 00150 indices_of_updated_neighbours.clear(); 00151 for (set<int>::iterator iter = index_set.begin(); 00152 iter != index_set.end(); iter++) { 00153 indices_of_updated_neighbours.push_back(*iter); 00154 } 00155 }
|
|
Returns true iff the given index corresponds to a point that exists in the DNN structure (meaning that it has been added, and not removed in the meantime).
Implements fastjet::DynamicNearestNeighbours. Definition at line 244 of file Dnn3piCylinder.hh. References _DNN, _mirror_info, and fastjet::DnnPlane::Valid(). 00244 { 00245 return (_DNN->Valid(_mirror_info[index].main_index)); 00246 }
|
|
Definition at line 152 of file Dnn3piCylinder.hh. Referenced by _RegisterCylinderPoint(), NearestNeighbourIndex(), and RemoveAndAddPoints(). |
|
Definition at line 158 of file Dnn3piCylinder.hh. Referenced by Dnn3piCylinder(), NearestNeighbourDistance(), NearestNeighbourIndex(), RemoveAndAddPoints(), Valid(), and ~Dnn3piCylinder(). |
|
Definition at line 95 of file Dnn3piCylinder.hh. Referenced by Dnn3piCylinder(), and NearestNeighbourIndex(). |
|
Definition at line 148 of file Dnn3piCylinder.hh. Referenced by _RegisterCylinderPoint(), NearestNeighbourDistance(), NearestNeighbourIndex(), RemoveAndAddPoints(), and Valid(). |
|
Definition at line 93 of file Dnn3piCylinder.hh. Referenced by Dnn3piCylinder(). |
|
Definition at line 91 of file Dnn3piCylinder.hh. Referenced by _RegisterCylinderPoint(), NearestNeighbourDistance(), NearestNeighbourIndex(), and RemoveAndAddPoints(). |