00001 #ifndef PeriodicBinFinderInPhi_H 00002 #define PeriodicBinFinderInPhi_H 00003 00004 #include "Utilities/BinningTools/interface/BaseBinFinder.h" 00005 00006 #include <cmath> 00007 00012 template <class T> 00013 class PeriodicBinFinderInPhi : public BaseBinFinder<T> { 00014 public: 00015 00016 PeriodicBinFinderInPhi() : theNbins(0), thePhiStep(0), thePhiOffset(0) {} 00017 00018 PeriodicBinFinderInPhi( T firstPhi, int nbins) : 00019 theNbins( nbins), thePhiStep( twoPi() / nbins), 00020 thePhiOffset( firstPhi - thePhiStep/2.) {} 00021 00023 virtual int binIndex( T phi) const { 00024 T tmp = fmod((phi - thePhiOffset), twoPi()) / thePhiStep; 00025 if ( tmp < 0) tmp += theNbins; 00026 return std::min( int(tmp), theNbins-1); 00027 } 00028 00030 virtual int binIndex( int i) const { 00031 int ind = i % theNbins; 00032 return ind < 0 ? ind+theNbins : ind; 00033 } 00034 00036 virtual T binPosition( int ind) const { 00037 return thePhiOffset + thePhiStep * ( ind + 0.5); 00038 } 00039 00040 static T pi() { return 3.141592653589793238;} 00041 static T twoPi() { return 2.*pi();} 00042 00043 private: 00044 00045 int theNbins; 00046 T thePhiStep; 00047 T thePhiOffset; 00048 00049 }; 00050 #endif