00001
00002
00003
00005 #ifndef WEIGHT_HH
00006 #define WEIGHT_HH
00007
00008 #include <iostream>
00009 #include <map>
00010 #include <vector>
00011
00012 namespace Exhume{
00013
00014 class Weight{
00015
00016 public:
00017
00018 Weight(){NPoints = 1000;};
00019 virtual ~Weight(){};
00020 inline std::map<double, double> GetFuncMap(){
00021 return(FuncMap);
00022 };
00023 inline double GetTotalIntegral(){
00024 return(TotalIntegral);
00025 };
00026
00027 inline std::map<double, double> GetLineShape(){
00028 return(LineShape);
00029 };
00030
00031 protected:
00032
00033 virtual double WeightFunc(const double&)=0;
00034
00035 void AddPoint(const double&, const double&);
00036 inline double GetFunc(const double &xx_){
00037 if(xx_ > Max_){
00038 return(WeightFunc(xx_) );
00039 }
00040
00041 std::map<double, double>::iterator high_, low_;
00042 high_ = FuncMap.upper_bound(xx_);
00043 low_ = high_;
00044 low_--;
00045
00046 return( low_->second +
00047 (high_->second - low_->second) * (xx_ - low_->first)/
00048 (high_->first - low_->first));
00049 };
00050
00051 inline double GetValue(const double &xx_){
00052
00053 std::map<double, double>::iterator high_, low_;
00054 high_ = LineShape.upper_bound(xx_);
00055
00056 if(high_==LineShape.end())high_--;
00057
00058 low_ = high_;
00059 low_--;
00060
00061 return( low_->second +
00062 (high_->second - low_->second) * (xx_ - low_->first)/
00063 (high_->first - low_->first));
00064 };
00065 void WeightInit(const double&, const double&);
00066
00067 double Max_;
00068 double TotalIntegral;
00069
00070 private:
00071
00072 unsigned int NPoints;
00073 std::map<double, double> FuncMap;
00074 std::map<double, double> LineShape;
00075 };
00076 }
00077
00078
00079
00080 #endif