00001 #ifndef ElementsInCone_h 00002 #define ElementsInCone_h 00003 00004 #include "DataFormats/Common/interface/RefVector.h" 00005 #include "DataFormats/Math/interface/angle.h" 00006 #include "DataFormats/Math/interface/deltaR.h" 00007 #include "DataFormats/Math/interface/Point3D.h" 00008 00009 template <typename T, typename M, typename C> 00010 class ElementsInCone { 00011 public: 00012 ElementsInCone() {} 00013 ~ElementsInCone() {} 00014 const edm::RefVector<C> operator()(const T& coneAxis,const M& coneMetric,double coneSize,const edm::RefVector<C>& elements)const{ 00015 edm::RefVector<C> elementsInCone; 00016 for(typename edm::RefVector<C>::const_iterator element=elements.begin();element!=elements.end();++element) { 00017 double distance = coneMetric(coneAxis,(*element)->momentum()); 00018 if (distance<=coneSize)elementsInCone.push_back(*element); 00019 } 00020 return elementsInCone; 00021 } 00022 }; 00023 00024 template <typename T, typename M> 00025 class ElementsInCone<T, M, std::pair<math::XYZPoint,float> >{ 00026 public: 00027 ElementsInCone() {} 00028 ~ElementsInCone() {} 00029 const std::vector<std::pair<math::XYZPoint,float> > operator()(const T& coneAxis,const M& coneMetric,double coneSize,const std::vector<std::pair<math::XYZPoint,float> >& elements)const{ 00030 std::vector<std::pair<math::XYZPoint,float> > elementsInCone; 00031 for(typename std::vector<std::pair<math::XYZPoint,float> >::const_iterator element=elements.begin();element!=elements.end();++element) { 00032 double distance = coneMetric(coneAxis,(*element).first); 00033 if (distance<=coneSize)elementsInCone.push_back(*element); 00034 } 00035 return elementsInCone; 00036 } 00037 }; 00038 00039 #endif 00040