00001 #ifndef TemplateMultiFitter_h_
00002 #define TemplateMultiFitter_h_
00003
00004 #include "TFitterMinuit.h"
00005 #include "TPulseIsland.h"
00006 #include "TTemplate.h"
00007
00008 class MultiHistogramFitFCN;
00009 #include "definitions.h"
00010 #include "AlcapExcept.h"
00011
00012 MAKE_EXCEPTION(TemplateMultiFitter, Base);
00013 MAKE_EXCEPTION(MismatchedTemplateRefineFactors, TemplateMultiFitter);
00014
00015 class TemplateMultiFitter {
00016 void operator=(const TemplateMultiFitter&);
00017
00018 struct TemplateDetails_t{
00019 double fAmplitudeScaleFactor;
00020 double fTimeOffset;
00021 TTemplate* fTemplate;
00022 double GetTime()const{ return fTemplate->GetTime()+fTimeOffset; }
00023 double GetAmplitude()const{ return fTemplate->GetAmplitude()*fAmplitudeScaleFactor; }
00024 void Set(double amp, double time){
00025 fAmplitudeScaleFactor=amp/fTemplate->GetAmplitude();
00026 fTimeOffset=time- fTemplate->GetTime();
00027 }
00028 };
00029 typedef std::vector<TemplateDetails_t> TemplateList;
00030
00031 public:
00032 TemplateMultiFitter(const IDs::channel& ch);
00033 ~TemplateMultiFitter();
00034 void Init();
00035
00036 public:
00037 enum FitStatus{
00038 kSuccess=0 ,
00039 kPedestalOutOfBounds= -100,
00040 kAmplitudeOutOfBounds= -101,
00041 kTimeOutOfBounds= -102,
00042 kFitNotConverged= 1,
00043 kInitialised=-200
00044 };
00045 void AddTemplate(TTemplate* tpl);
00046
00051 void SetPedestal(double v){fPedestal=v;}
00052 void SetPulseEstimates( int index, double amp, double time){
00053 fTemplates.at(index).Set(amp,time);
00054 }
00055 int FitWithOneTimeFree(int index,const TH1D* hPulse);
00056 int FitWithAllTimesFixed(const TH1D* hPulse);
00058
00061 double GetPedestal()const { return fPedestal; }
00062 double GetAmplitude(int i)const { return fTemplates.at(i).GetAmplitude();}
00063 double GetTime(int i)const { return fTemplates.at(i).GetTime(); }
00064 double GetChi2()const { return fChi2; }
00065 double GetNDoF()const { return fNDoF; }
00067
00068 private:
00069 TFitterMinuit* fMinuitFitter;
00070 MultiHistogramFitFCN* fFitFCN;
00071 IDs::channel fChannel;
00072 double fMaxADC,fMinADC;
00073
00074 double fPedestal;
00075 int fRefineFactor;
00076 TemplateList fTemplates;
00077 int fFreeTemplate;
00078
00079 double fChi2;
00080 int fNDoF;
00081 };
00082
00083 #endif