Fork me on GitHub

source: svn/trunk/external/fastjet/internal/DnnPlane.hh@ 1237

Last change on this file since 1237 was 859, checked in by Pavel Demin, 12 years ago

update fastjet to version 3.0.3

File size: 5.8 KB
Line 
1//STARTHEADER
2// $Id: DnnPlane.hh 2577 2011-09-13 15:11:38Z salam $
3//
4// Copyright (c) 2005-2011, Matteo Cacciari, Gavin P. Salam and Gregory Soyez
5//
6//----------------------------------------------------------------------
7// This file is part of FastJet.
8//
9// FastJet is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; either version 2 of the License, or
12// (at your option) any later version.
13//
14// The algorithms that underlie FastJet have required considerable
15// development and are described in hep-ph/0512210. If you use
16// FastJet as part of work towards a scientific publication, please
17// include a citation to the FastJet paper.
18//
19// FastJet is distributed in the hope that it will be useful,
20// but WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22// GNU General Public License for more details.
23//
24// You should have received a copy of the GNU General Public License
25// along with FastJet. If not, see <http://www.gnu.org/licenses/>.
26//----------------------------------------------------------------------
27//ENDHEADER
28
29
30#ifndef DROP_CGAL // in case we do not have the code for CGAL
31
32#ifndef __FASTJET_DNNPLANE_HH__
33#define __FASTJET_DNNPLANE_HH__
34
35#include "fastjet/internal/Triangulation.hh"
36#include "fastjet/internal/DynamicNearestNeighbours.hh"
37
38FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
39
40
41/// \if internal_doc
42/// @ingroup internal
43/// \class DnnPlane
44/// class derived from DynamicNearestNeighbours that provides an
45/// implementation for the Euclidean plane
46/// \endif
47class DnnPlane : public DynamicNearestNeighbours {
48 public:
49 /// empty initaliser
50 DnnPlane() {}
51
52 /// Initialiser from a set of points on an Eta-Phi plane, where both
53 /// eta and phi can have arbitrary ranges
54 DnnPlane(const std::vector<EtaPhi> &, const bool & verbose = false );
55
56
57 /// Returns the index of the nearest neighbour of point labelled
58 /// by ii (assumes ii is valid)
59 int NearestNeighbourIndex(const int & ii) const ;
60
61 /// Returns the distance to the nearest neighbour of point labelled
62 /// by index ii (assumes ii is valid)
63 double NearestNeighbourDistance(const int & ii) const ;
64
65 /// Returns true iff the given index corresponds to a point that
66 /// exists in the DNN structure (meaning that it has been added, and
67 /// not removed in the meantime)
68 bool Valid(const int & index) const;
69
70 void RemoveAndAddPoints(const std::vector<int> & indices_to_remove,
71 const std::vector<EtaPhi> & points_to_add,
72 std::vector<int> & indices_added,
73 std::vector<int> & indices_of_updated_neighbours);
74
75 /// returns the EtaPhi of point with index i.
76 EtaPhi etaphi(const int i) const;
77 /// returns the eta point with index i.
78 double eta(const int i) const;
79 /// returns the phi point with index i.
80 double phi(const int i) const;
81
82 private:
83
84 /// Structure containing a vertex_handle and cached information on
85 /// the nearest neighbour.
86 struct SuperVertex {
87 Vertex_handle vertex; // NULL indicates inexistence...
88 double NNdistance;
89 int NNindex;
90 // later on for cylinder put a second vertex?
91 };
92
93 std::vector<SuperVertex> _supervertex;
94 //set<Vertex_handle> _vertex_set;
95 bool _verbose;
96
97 static const bool _crash_on_coincidence = true;
98 //static const bool _crash_on_coincidence = false;
99
100 Triangulation _TR; /// CGAL object for dealing with triangulations
101
102 /// calculates and returns the euclidean distance between points p1
103 /// and p2
104 inline double _euclid_distance(const Point& p1, const Point& p2) const {
105 double distx= p1.x()-p2.x();
106 double disty= p1.y()-p2.y();
107 return distx*distx+disty*disty;
108 }
109
110 //----------------------------------------------------------------------
111 /// Determines the index and distance of the nearest neighbour to
112 /// point j and puts the information into the _supervertex entry for j
113 void _SetNearest(const int & j);
114
115 //----------------------------------------------------------------------
116 /// Determines and stores the nearest neighbour of j.
117 ///
118 /// For each voronoi neighbour D of j if the distance between j and D
119 /// is less than D's own nearest neighbour, then update the
120 /// nearest-neighbour info in D; push D's index onto
121 /// indices_of_updated_neighbours
122 ///
123 /// Note that j is NOT pushed onto indices_of_updated_neighbours --
124 /// if you want it there, put it there yourself.
125 void _SetAndUpdateNearest(const int & j,
126 std::vector<int> & indices_of_updated_neighbours);
127
128 /// given a vertex_handle returned by CGAL on insertion of a new
129 /// points, crash if it turns out that it corresponds to a vertex
130 /// that we already knew about (usually because two points coincide)
131 void _CrashIfVertexPresent(const Vertex_handle & vertex,
132 const int & its_index);
133
134};
135
136
137// here follow some inline implementations of the simpler of the
138// functions defined above
139
140inline int DnnPlane::NearestNeighbourIndex(const int & ii) const {
141 return _supervertex[ii].NNindex;}
142
143inline double DnnPlane::NearestNeighbourDistance(const int & ii) const {
144 return _supervertex[ii].NNdistance;}
145
146inline bool DnnPlane::Valid(const int & index) const {
147 if (index >= 0 && index < static_cast<int>(_supervertex.size())) {
148 return (_supervertex[index].vertex != NULL);} else {return false;} }
149
150inline EtaPhi DnnPlane::etaphi(const int i) const {
151 Point * p = & (_supervertex[i].vertex->point());
152 return EtaPhi(p->x(),p->y()); }
153
154inline double DnnPlane::eta(const int i) const {
155 return _supervertex[i].vertex->point().x(); }
156
157inline double DnnPlane::phi(const int i) const {
158 return _supervertex[i].vertex->point().y(); }
159
160
161FASTJET_END_NAMESPACE
162
163#endif // __FASTJET_DNNPLANE_HH__
164
165#endif // DROP_CGAL
Note: See TracBrowser for help on using the repository browser.