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