00001 #ifndef DetLayers_PeriodicBinFinderInZ_H 00002 #define DetLayers_PeriodicBinFinderInZ_H 00003 00004 #include "Utilities/BinningTools/interface/BaseBinFinder.h" 00005 #include "Geometry/CommonDetUnit/interface/GeomDet.h" 00006 #include <cmath> 00007 00012 template <class T> 00013 class PeriodicBinFinderInZ : public BaseBinFinder<T> { 00014 public: 00015 00016 PeriodicBinFinderInZ() : theNbins(0), theZStep(0), theZOffset(0) {} 00017 00018 PeriodicBinFinderInZ(std::vector<const GeomDet*>::const_iterator first, 00019 std::vector<const GeomDet*>::const_iterator last) : 00020 theNbins( last-first) 00021 { 00022 float zFirst = (**first).surface().position().z(); 00023 theZStep = ((**(last-1)).surface().position().z() - zFirst) / (theNbins-1); 00024 theZOffset = zFirst - 0.5*theZStep; 00025 } 00026 00028 virtual int binIndex( T z) const { 00029 return binIndex( int((z-theZOffset)/theZStep)); 00030 } 00031 00033 virtual int binIndex( int i) const { 00034 return std::min( std::max( i, 0), theNbins-1); 00035 } 00036 00038 virtual T binPosition( int ind) const { 00039 return theZOffset + theZStep * ( ind + 0.5); 00040 } 00041 00042 private: 00043 00044 int theNbins; 00045 T theZStep; 00046 T theZOffset; 00047 00048 }; 00049 #endif