CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/JetMETCorrections/FFTJetObjects/interface/FFTJetScaleCalculators.h

Go to the documentation of this file.
00001 #ifndef JetMETCorrections_FFTJetObjects_FFTJetScaleCalculators_h
00002 #define JetMETCorrections_FFTJetObjects_FFTJetScaleCalculators_h
00003 
00004 #include <cassert>
00005 #include <cmath>
00006 
00007 #include "JetMETCorrections/FFTJetObjects/interface/AbsFFTSpecificScaleCalculator.h"
00008 #include "JetMETCorrections/FFTJetObjects/interface/AbsFFTJetScaleCalculator.h"
00009 #include "FWCore/Utilities/interface/Exception.h"
00010 
00011 template<class MyJet, class Adjustable>
00012 class FFTEtaLogPtConeRadiusMapper : 
00013     public AbsFFTJetScaleCalculator<MyJet, Adjustable>
00014 {
00015 public:
00016     inline explicit FFTEtaLogPtConeRadiusMapper(
00017         CPP11_shared_ptr<npstat::AbsMultivariateFunctor> f)
00018         : AbsFFTJetScaleCalculator<MyJet, Adjustable>(f) {}
00019 
00020 private:
00021     inline void map(const MyJet& jet,
00022                     const Adjustable& current,
00023                     double* buf, const unsigned dim) const
00024     {
00025         assert(buf);
00026         if (dim != 3)
00027             throw cms::Exception("FFTJetBadConfig")
00028                 << "In FFTEtaLogPtConeRadiusMapper::map: "
00029                 << "invalid table dimensionality: "
00030                 << dim << std::endl;
00031         buf[0] = current.vec().eta();
00032         buf[1] = log(current.vec().pt());
00033         buf[2] = jet.getFFTSpecific().f_recoScale();
00034     }
00035 };
00036 
00037 template<class MyJet, class Adjustable>
00038 class FFTSpecificScaleCalculator : 
00039     public AbsFFTJetScaleCalculator<MyJet, Adjustable>
00040 {
00041 public:
00042     //
00043     // This class will assume the ownership of the
00044     // AbsFFTSpecificScaleCalculator object provided
00045     // in the constructor
00046     //
00047     inline FFTSpecificScaleCalculator(
00048         CPP11_shared_ptr<npstat::AbsMultivariateFunctor> f,
00049         const AbsFFTSpecificScaleCalculator* p)
00050         : AbsFFTJetScaleCalculator<MyJet, Adjustable>(f), calc_(p) {assert(p);}
00051 
00052     inline virtual ~FFTSpecificScaleCalculator() {delete calc_;}
00053 
00054 private:
00055     inline void map(const MyJet& jet,
00056                     const Adjustable& current,
00057                     double* buf, const unsigned dim) const
00058     {
00059         return calc_->mapFFTJet(jet, jet.getFFTSpecific(),
00060                                 current.vec(), buf, dim);
00061     }
00062 
00063     const AbsFFTSpecificScaleCalculator* calc_;
00064 };
00065 
00066 #endif // JetMETCorrections_FFTJetObjects_FFTJetScaleCalculators_h