00001 #ifndef TAPAlgorithms_h_
00002 #define TAPAlgorithms_h_
00003
00004 #include "TPulseIsland.h"
00005
00006
00007 namespace Algorithm {
00008
00009
00010 struct MaxBinAmplitude;
00011 struct MaxBinTime;
00012 struct ConstantFractionTime;
00013 struct SimpleIntegral;
00014 struct IntegralRatio;
00015 };
00016
00017 struct Algorithm::MaxBinAmplitude {
00018 public:
00019 MaxBinAmplitude(double ped, int trig_pol)
00020 :trigger_polarity(trig_pol), pedestal(ped){}
00021 double operator() (const TPulseIsland* tpi) const;
00022 double GetTime()const {return time;}
00023 double GetAmplitude()const {return amplitude;}
00024
00025 const int trigger_polarity;
00026 const double pedestal;
00027 private:
00028 mutable double time;
00029 mutable double amplitude;
00030 };
00031
00032 struct Algorithm::MaxBinTime {
00033 public:
00034 MaxBinTime(int trig_pol, double clk_tick, double t_shift)
00035 :trigger_polarity(trig_pol), clock_tick_in_ns(clk_tick), time_shift(t_shift){}
00036 double operator() (const TPulseIsland* tpi) const;
00037
00038 const int trigger_polarity;
00039 const double clock_tick_in_ns;
00040 const double time_shift;
00041 };
00042
00043 struct Algorithm::ConstantFractionTime {
00044 public:
00045 ConstantFractionTime(double ped, int trig_pol, double clk_tick, double t_shift, double const_frac)
00046 :pedestal(ped), trigger_polarity(trig_pol), clock_tick_in_ns(clk_tick), time_shift(t_shift), constant_fraction(const_frac){}
00047 double operator() (const TPulseIsland* tpi) const;
00048
00049 const double pedestal;
00050 const int trigger_polarity;
00051 const double clock_tick_in_ns;
00052 const double time_shift;
00053
00054 const double constant_fraction;
00055 };
00056
00057
00058 struct Algorithm::SimpleIntegral {
00059 public:
00060 SimpleIntegral(double ped, int trig_pol)
00061 :trigger_polarity(trig_pol), pedestal(ped),start(0),stop(0){}
00065 SimpleIntegral(double ped, int trig_pol, int first, int last)
00066 :trigger_polarity(trig_pol), pedestal(ped),start(first),stop(last){}
00067 double operator() (const TPulseIsland* tpi)const;
00068
00069 const int trigger_polarity;
00070
00071 double GetPedestal()const{return pedestal;};
00072 int GetStart()const{return start;};
00073 int GetStop()const{return stop;};
00074
00075 void SetPedestal(double v){pedestal=v;};
00076 void SetStart(int v){start=v;};
00077 void SetStop(int v){stop=v;};
00078
00079 private:
00080 void operator=(const SimpleIntegral& rhs){};
00081 double pedestal;
00082 int start;
00083 int stop;
00084 };
00085
00086 struct Algorithm::IntegralRatio{
00087 IntegralRatio(int begin,int tail, int end, int trig_pol,double ped=0.)
00088 :fTailIntegrator(ped,trig_pol,tail,end)
00089 ,fHeadIntegrator(ped,trig_pol,begin,tail){
00090 }
00091 double operator() (const TPulseIsland* tpi);
00092
00093 double GetRatio()const {return fTail/(fHead+fTail);}
00094 double GetTotal()const{return fHead+fTail;}
00095 double GetTail()const{return fTail;}
00096
00097 void SetTailStart(int v){ fTailIntegrator.SetStart(v); fHeadIntegrator.SetStop(v);}
00098 void SetPedestal(double v){ fTailIntegrator.SetPedestal(v); fHeadIntegrator.SetPedestal(v);}
00099 void SetPedestalToMinimum(const TPulseIsland* tpi);
00100
00101 private:
00102 Algorithm::SimpleIntegral fTailIntegrator;
00103 Algorithm::SimpleIntegral fHeadIntegrator;
00104 double fTail;
00105 double fHead;
00106 };
00107
00108 #endif