CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_5_3_13_patch3/src/Utilities/BinningTools/interface/PeriodicBinFinderInPhi.h

Go to the documentation of this file.
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