//STARTHEADER // $Id: DnnPlane.hh 2577 2011-09-13 15:11:38Z salam $ // // Copyright (c) 2005-2011, Matteo Cacciari, Gavin P. Salam and Gregory Soyez // //---------------------------------------------------------------------- // This file is part of FastJet. // // FastJet is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // The algorithms that underlie FastJet have required considerable // development and are described in hep-ph/0512210. If you use // FastJet as part of work towards a scientific publication, please // include a citation to the FastJet paper. // // FastJet is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with FastJet. If not, see . //---------------------------------------------------------------------- //ENDHEADER #ifndef DROP_CGAL // in case we do not have the code for CGAL #ifndef __FASTJET_DNNPLANE_HH__ #define __FASTJET_DNNPLANE_HH__ #include "fastjet/internal/Triangulation.hh" #include "fastjet/internal/DynamicNearestNeighbours.hh" FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh /// \if internal_doc /// @ingroup internal /// \class DnnPlane /// class derived from DynamicNearestNeighbours that provides an /// implementation for the Euclidean plane /// \endif class DnnPlane : public DynamicNearestNeighbours { public: /// empty initaliser DnnPlane() {} /// Initialiser from a set of points on an Eta-Phi plane, where both /// eta and phi can have arbitrary ranges DnnPlane(const std::vector &, const bool & verbose = false ); /// Returns the index of the nearest neighbour of point labelled /// by ii (assumes ii is valid) int NearestNeighbourIndex(const int & ii) const ; /// Returns the distance to the nearest neighbour of point labelled /// by index ii (assumes ii is valid) double NearestNeighbourDistance(const int & ii) 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) bool Valid(const int & index) const; void RemoveAndAddPoints(const std::vector & indices_to_remove, const std::vector & points_to_add, std::vector & indices_added, std::vector & indices_of_updated_neighbours); /// returns the EtaPhi of point with index i. EtaPhi etaphi(const int i) const; /// returns the eta point with index i. double eta(const int i) const; /// returns the phi point with index i. double phi(const int i) const; private: /// Structure containing a vertex_handle and cached information on /// the nearest neighbour. struct SuperVertex { Vertex_handle vertex; // NULL indicates inexistence... double NNdistance; int NNindex; // later on for cylinder put a second vertex? }; std::vector _supervertex; //set _vertex_set; bool _verbose; static const bool _crash_on_coincidence = true; //static const bool _crash_on_coincidence = false; Triangulation _TR; /// CGAL object for dealing with triangulations /// calculates and returns the euclidean distance between points p1 /// and p2 inline double _euclid_distance(const Point& p1, const Point& p2) const { double distx= p1.x()-p2.x(); double disty= p1.y()-p2.y(); return distx*distx+disty*disty; } //---------------------------------------------------------------------- /// Determines the index and distance of the nearest neighbour to /// point j and puts the information into the _supervertex entry for j void _SetNearest(const int & j); //---------------------------------------------------------------------- /// Determines and stores the nearest neighbour of j. /// /// For each voronoi neighbour D of j if the distance between j and D /// is less than D's own nearest neighbour, then update the /// nearest-neighbour info in D; push D's index onto /// indices_of_updated_neighbours /// /// Note that j is NOT pushed onto indices_of_updated_neighbours -- /// if you want it there, put it there yourself. void _SetAndUpdateNearest(const int & j, std::vector & indices_of_updated_neighbours); /// given a vertex_handle returned by CGAL on insertion of a new /// points, crash if it turns out that it corresponds to a vertex /// that we already knew about (usually because two points coincide) void _CrashIfVertexPresent(const Vertex_handle & vertex, const int & its_index); }; // here follow some inline implementations of the simpler of the // functions defined above inline int DnnPlane::NearestNeighbourIndex(const int & ii) const { return _supervertex[ii].NNindex;} inline double DnnPlane::NearestNeighbourDistance(const int & ii) const { return _supervertex[ii].NNdistance;} inline bool DnnPlane::Valid(const int & index) const { if (index >= 0 && index < static_cast(_supervertex.size())) { return (_supervertex[index].vertex != NULL);} else {return false;} } inline EtaPhi DnnPlane::etaphi(const int i) const { Point * p = & (_supervertex[i].vertex->point()); return EtaPhi(p->x(),p->y()); } inline double DnnPlane::eta(const int i) const { return _supervertex[i].vertex->point().x(); } inline double DnnPlane::phi(const int i) const { return _supervertex[i].vertex->point().y(); } FASTJET_END_NAMESPACE #endif // __FASTJET_DNNPLANE_HH__ #endif // DROP_CGAL