CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/JetMETCorrections/InterpolationTables/interface/MultivariateFunctorScanner.h

Go to the documentation of this file.
00001 #ifndef NPSTAT_MULTIVARIATEFUNCTORSCANNER_HH_
00002 #define NPSTAT_MULTIVARIATEFUNCTORSCANNER_HH_
00003 
00015 #include <vector>
00016 #include <cassert>
00017 #include "JetMETCorrections/InterpolationTables/interface/NpstatException.h"
00018 
00019 #include "JetMETCorrections/InterpolationTables/interface/AbsMultivariateFunctor.h"
00020 
00021 namespace npstat {
00026     template<class IndexMapper>
00027     class MultivariateFunctorScanner
00028     {
00029     public:
00040         inline MultivariateFunctorScanner(const AbsMultivariateFunctor& fcn,
00041                                           const std::vector<IndexMapper>& maps)
00042             : fcn_(fcn), mapping_(maps), buf_(fcn.minDim()), dim_(fcn.minDim())
00043         {
00044             if (!(dim_ && dim_ == maps.size())) throw npstat::NpstatInvalidArgument(
00045                 "In npstat::MultivariateFunctorScanner constructor: "
00046                 "incompatible arguments");
00047             if (dim_ != fcn.maxDim()) throw npstat::NpstatInvalidArgument(
00048                 "In npstat::MultivariateFunctorScanner constructor: "
00049                 "functors of variable dimensionality are not supported");
00050         }
00051 
00053         inline double operator()(const unsigned* index,
00054                                  const unsigned indexLen) const
00055         {
00056             if (dim_ != indexLen) throw npstat::NpstatInvalidArgument(
00057                 "In npstat::MultivariateFunctorScanner::operator(): "
00058                 "incompatible input point dimensionality");
00059             assert(index);
00060             double* x = &buf_[0];
00061             for (unsigned i=0; i<dim_; ++i)
00062                 x[i] = mapping_[i](index[i]);
00063             return fcn_(x, dim_);
00064         }
00065 
00066     private:
00067         MultivariateFunctorScanner();
00068 
00069         const AbsMultivariateFunctor& fcn_;
00070         const std::vector<IndexMapper>& mapping_;
00071         mutable std::vector<double> buf_;
00072         unsigned dim_;
00073     };
00074 }
00075 
00076 #endif // NPSTAT_MULTIVARIATEFUNCTORSCANNER_HH_
00077