00001 #ifndef TEMPLATE_FITTING_TEMPLATECONVOLVER_H
00002 #define TEMPLATE_FITTING_TEMPLATECONVOLVER_H
00003
00004 #include <set>
00005 #include <vector>
00006 #include "IdChannel.h"
00007 #include "Convolver.h"
00008 #include "QuadraticFit.h"
00009
00010 namespace IDs{ class channel;}
00011 class TTemplate;
00012 class TPulseIsland;
00013 class TDirectory;
00014
00015 class TemplateConvolver{
00016 public:
00017 struct FoundPeaks{
00018 double time;
00019 double amplitude;
00020 double pedestal;
00021 double quad;
00022 double linear;
00023 double constant;
00024 bool operator<(const FoundPeaks& rhs)const{
00025 return time<rhs.time;
00026
00027 }
00028 FoundPeaks& operator=(const FoundPeaks& rhs){
00029 time=rhs.time;
00030 amplitude=rhs.amplitude;
00031 pedestal=rhs.pedestal;
00032 quad=rhs.quad;
00033 linear=rhs.linear;
00034 constant=rhs.constant;
00035 return *this;
00036 }
00037 };
00038 typedef std::set<FoundPeaks> PeaksVector;
00039 typedef std::vector<double> SamplesVector;
00040
00041 public:
00042 TemplateConvolver(const IDs::channel ch, TTemplate* tpl, int peak_fit_samples, int left, int right);
00043 ~TemplateConvolver();
00044 bool IsValid()const{return fTemplateLength>0;}
00045
00046 public:
00047 int Convolve(const Algorithm::TpiMinusPedestal_iterator& begin,const Algorithm::TpiMinusPedestal_iterator& end);
00048 void CharacteriseTemplate();
00049
00050 const SamplesVector& GetEnergyConvolution()const{return fEnergySamples;};
00051 const SamplesVector& GetTimeConvolution()const{return fTimeSamples;};
00052 const PeaksVector& GetPeaks()const{return fPeaks;};
00053 double GetTimeShift()const{return fTemplateTime;}
00054 double GetLeftSafety()const{return fLeftSafety;}
00055 double GetAmplitudeScale()const{return fTemplateScale;}
00056 TH1* GetTemplateACF()const {return fTemplateACFHist;}
00057
00058 int FindPeaks(bool expect_pile_up, const Algorithm::TpiMinusPedestal_iterator& waveform);
00059
00060 private:
00061 int FindAllPeaks( const SamplesVector&, const SamplesVector&, const Algorithm::TpiMinusPedestal_iterator* pedestal);
00062 int FindBestPeak( const SamplesVector&, const SamplesVector&, const Algorithm::TpiMinusPedestal_iterator* pedestal);
00063 void FitPeak(FoundPeaks& output, int index, const SamplesVector& energy, const SamplesVector& time, double pedestal);
00064 bool ResetVectors(int size);
00065
00066 private:
00067 IDs::channel fChannel;
00068 TTemplate* fTemplate;
00069 Algorithm::Convolver<Algorithm::TH1_c_iterator>* fEnergyConvolve;
00070 Algorithm::Convolver<std::vector<int>::iterator>* fTimeConvolve;
00071 functions::QuadraticFit fQuadFit;
00072 const int fPolarity;
00073 const int fLeftSafety, fRightSafety;
00074 const int fTemplateLength;
00075 const double fTemplateTime;
00076 double fTemplateQuad, fTemplateLin, fTemplateConst, fTemplateScale;
00077 PeaksVector fPeaks;
00078 SamplesVector fEnergySamples;
00079 SamplesVector fTimeSamples;
00080 std::vector<int> fTimeWeights;
00081 SamplesVector fTemplateACF,fTemplateACFDerivative;
00082 TH1 *fTemplateACFHist, *fTemplateACFDerivativeHist;
00083
00084 };
00085
00086 #endif // TEMPLATE_FITTING_TEMPLATECONVOLVER_H