#include <TemplateMultiFitter.h>
Classes | |
struct | TemplateDetails_t |
Public Types | |
enum | FitStatus { kSuccess = 0, kPedestalOutOfBounds = -100, kAmplitudeOutOfBounds = -101, kTimeOutOfBounds = -102, kFitNotConverged = 1, kInitialised = -200 } |
Public Member Functions | |
TemplateMultiFitter (const IDs::channel &ch) | |
~TemplateMultiFitter () | |
void | Init () |
void | AddTemplate (TTemplate *tpl) |
fitting | |
void | SetPedestal (double v) |
void | SetPulseEstimates (int index, double amp, double time) |
int | FitWithOneTimeFree (int index, const TH1D *hPulse) |
int | FitWithAllTimesFixed (const TH1D *hPulse) |
getters | |
double | GetPedestal () const |
double | GetAmplitude (int i) const |
double | GetTime (int i) const |
double | GetChi2 () const |
double | GetNDoF () const |
Private Types | |
typedef std::vector < TemplateDetails_t > | TemplateList |
Private Member Functions | |
void | operator= (const TemplateMultiFitter &) |
Private Attributes | |
TFitterMinuit * | fMinuitFitter |
MultiHistogramFitFCN * | fFitFCN |
IDs::channel | fChannel |
double | fMaxADC |
double | fMinADC |
double | fPedestal |
int | fRefineFactor |
TemplateList | fTemplates |
int | fFreeTemplate |
double | fChi2 |
int | fNDoF |
Definition at line 15 of file TemplateMultiFitter.h.
typedef std::vector<TemplateDetails_t> TemplateMultiFitter::TemplateList [private] |
Definition at line 29 of file TemplateMultiFitter.h.
kSuccess | |
kPedestalOutOfBounds | |
kAmplitudeOutOfBounds | |
kTimeOutOfBounds | |
kFitNotConverged | |
kInitialised |
Definition at line 37 of file TemplateMultiFitter.h.
00037 { 00038 kSuccess=0 , 00039 kPedestalOutOfBounds= -100, 00040 kAmplitudeOutOfBounds= -101, 00041 kTimeOutOfBounds= -102, 00042 kFitNotConverged= 1, 00043 kInitialised=-200 00044 };
TemplateMultiFitter::TemplateMultiFitter | ( | const IDs::channel & | ch | ) |
Definition at line 14 of file TemplateMultiFitter.cpp.
References fChannel, fMaxADC, fMinADC, SetupRecord::GetMaxADC(), EventNavigator::GetSetupRecord(), and EventNavigator::Instance().
00014 : 00015 fMinuitFitter(NULL), fFitFCN(NULL), fChannel(ch),fPedestal(0), fRefineFactor(0) { 00016 00017 // Calculate the max ADC value 00018 fMinADC = 0; 00019 fMaxADC = EventNavigator::Instance().GetSetupRecord().GetMaxADC(fChannel); 00020 }
TemplateMultiFitter::~TemplateMultiFitter | ( | ) |
Definition at line 40 of file TemplateMultiFitter.cpp.
void TemplateMultiFitter::AddTemplate | ( | TTemplate * | tpl | ) |
Definition at line 169 of file TemplateMultiFitter.cpp.
References fRefineFactor, TemplateMultiFitter::TemplateDetails_t::fTemplate, fTemplates, and TTemplate::GetRefineFactor().
Referenced by TemplateFitAPGenerator::TemplateFitAPGenerator().
00169 { 00170 TemplateDetails_t tmp; 00171 tmp.fTemplate=tpl; 00172 fTemplates.push_back(tmp); 00173 if(fRefineFactor==0) fRefineFactor=tpl->GetRefineFactor(); 00174 else if(fRefineFactor!= tpl->GetRefineFactor()){ 00175 throw Except::MismatchedTemplateRefineFactors(); 00176 } 00177 }
int TemplateMultiFitter::FitWithAllTimesFixed | ( | const TH1D * | hPulse | ) |
Definition at line 137 of file TemplateMultiFitter.cpp.
References fChi2, fFitFCN, fMaxADC, fMinADC, fMinuitFitter, fNDoF, fPedestal, fTemplates, MultiHistogramFitFCN::GetNDoF(), MultiHistogramFitFCN::SetPulseHist(), and MultiHistogramFitFCN::SetTimeOffset().
Referenced by TemplateFitAPGenerator::RefitWithTwo().
00137 { 00138 // Prepare for minimizations 00139 fMinuitFitter->Clear(); 00140 fFitFCN->SetPulseHist(hPulse); 00141 fMinuitFitter->CreateMinimizer(TFitterMinuit::kMigrad); 00142 00143 // initialise fit 00144 fMinuitFitter->SetParameter(0, "PedestalOffset", fPedestal, 0.1, fMinADC, fMaxADC); 00145 for(TemplateList::const_iterator i_tpl=fTemplates.begin(); i_tpl!=fTemplates.end(); ++i_tpl){ 00146 int i=i_tpl-fTemplates.begin(); 00147 fMinuitFitter->SetParameter(i+1, Form("AmplitudeScaleFactor_%d",i), i_tpl->fAmplitudeScaleFactor, 0.1, fMinADC, fMaxADC); 00148 fFitFCN->SetTimeOffset(i, i_tpl->fTimeOffset); 00149 } 00150 00151 // run the fitter 00152 int status = fMinuitFitter->Minimize(1000); 00153 00154 // get fitted parameters 00155 std::vector<double> parameters(1+fTemplates.size()); 00156 parameters[0]=fPedestal=fMinuitFitter->GetParameter(0); 00157 for(TemplateList::iterator i_tpl=fTemplates.begin(); i_tpl!=fTemplates.end(); ++i_tpl) 00158 parameters[i_tpl-fTemplates.begin()+1]=i_tpl->fAmplitudeScaleFactor= fMinuitFitter->GetParameter(i_tpl-fTemplates.begin()+1); 00159 00160 // check chi-2 00161 fChi2 = (*fFitFCN)(parameters); 00162 fNDoF = fFitFCN->GetNDoF(); 00163 00164 // return status 00165 return status; 00166 00167 }
int TemplateMultiFitter::FitWithOneTimeFree | ( | int | index, | |
const TH1D * | hPulse | |||
) |
Definition at line 43 of file TemplateMultiFitter.cpp.
References DEBUG_VALUE, fChi2, fFitFCN, fMaxADC, fMinADC, fMinuitFitter, fNDoF, fPedestal, fRefineFactor, fTemplates, TemplateMultiFitter::TemplateDetails_t::fTimeOffset, MultiHistogramFitFCN::GetNDoF(), kAmplitudeOutOfBounds, kInitialised, kPedestalOutOfBounds, kTimeOutOfBounds, MultiHistogramFitFCN::SetPulseHist(), and MultiHistogramFitFCN::SetTimeOffset().
Referenced by TemplateFitAPGenerator::ProcessPulses(), and TemplateFitAPGenerator::RefitWithTwo().
00043 { 00044 00045 // Get the template we're going to shift around 00046 TemplateDetails_t& current=fTemplates.at(index); 00047 00048 // Prepare for minimizations 00049 fMinuitFitter->Clear(); 00050 fFitFCN->SetPulseHist(hPulse); 00051 fMinuitFitter->CreateMinimizer(TFitterMinuit::kMigrad); 00052 00053 // Loop through some time offsets ourselved 00054 const double offset_range = 10*fRefineFactor; // maximum distance to go from the initial estimate 00055 double best_time_offset = 0; 00056 std::vector<double> best_parameters(1+fTemplates.size()); 00057 double best_chi2 = 1e34; 00058 int best_ndof = 0; 00059 int best_status = kInitialised; 00060 int status = kInitialised; 00061 00062 // Calculate the bounds of the parameters 00063 int min_offset = current.fTimeOffset - offset_range; 00064 int max_offset = current.fTimeOffset + offset_range; 00065 00066 std::vector<double> parameters(1+fTemplates.size()); 00067 for (double time_offset = min_offset; time_offset <= max_offset; ++time_offset) { 00068 fFitFCN->SetTimeOffset(index, time_offset); 00069 00070 // Reset the estimates 00071 fMinuitFitter->SetParameter(0, "PedestalOffset", fPedestal, 0.1, fPedestal-10, fPedestal+10); 00072 for(TemplateList::const_iterator i_tpl=fTemplates.begin(); i_tpl!=fTemplates.end(); ++i_tpl){ 00073 int i=i_tpl-fTemplates.begin(); 00074 fMinuitFitter->SetParameter(i+1, Form("AmplitudeScaleFactor_%d",i), i_tpl->fAmplitudeScaleFactor, 0.1, fMinADC, fMaxADC); 00075 } 00076 00077 // Minimize and notify if there was a problem 00078 status = fMinuitFitter->Minimize(1000); // set limit of 1000 calls to FCN 00079 DEBUG_VALUE(status); 00080 if(status!=0) continue; 00081 00082 // Store the Chi2 and degrees of freedom 00083 parameters[0]=fMinuitFitter->GetParameter(0); 00084 for(std::vector<double>::iterator i_par=parameters.begin()+1; i_par!=parameters.end(); ++i_par){ 00085 int n=i_par-parameters.begin(); 00086 *i_par= fMinuitFitter->GetParameter(n); 00087 } 00088 00089 // Check the bounds 00090 const double delta_ped_offset_error = 1; // if the given parameter is within this much of the boundaries, then we will ignore it 00091 const double delta_amp_sf_error = 0.001; 00092 if ( (parameters[0] < delta_ped_offset_error ) || (parameters[0] > fMaxADC - delta_ped_offset_error) ) { 00093 status = kPedestalOutOfBounds; 00094 } else { 00095 for(std::vector<double>::const_iterator i_par=parameters.begin()+1; i_par!=parameters.end(); ++i_par){ 00096 if ( ( *i_par < fMinADC + delta_amp_sf_error ) || ( *i_par > fMaxADC - delta_amp_sf_error ) ) { 00097 DEBUG_VALUE(*i_par, delta_amp_sf_error, fMinADC, fMaxADC); 00098 status = kAmplitudeOutOfBounds; 00099 break; 00100 } 00101 } 00102 } 00103 00104 // get the chi-2 00105 fChi2 = (*fFitFCN)(parameters); 00106 fNDoF = fFitFCN->GetNDoF(); 00107 DEBUG_VALUE(status,parameters[0],fChi2,fNDoF); 00108 00109 if (status == 0 && fChi2 < best_chi2) { 00110 best_time_offset = time_offset; 00111 best_parameters=parameters; 00112 best_chi2 = fChi2; 00113 best_status = status; 00114 best_ndof = fNDoF; 00115 } 00116 } 00117 00118 // Store the final best values 00119 fChi2 = best_chi2; 00120 fNDoF = best_ndof; 00121 current.fTimeOffset = best_time_offset; 00122 fPedestal = best_parameters[0]; 00123 for(TemplateList::iterator i_tpl=fTemplates.begin(); i_tpl!=fTemplates.end(); ++i_tpl){ 00124 i_tpl->fAmplitudeScaleFactor=best_parameters[i_tpl-fTemplates.begin()+1]; 00125 } 00126 00127 static int offset_safety = 1; 00128 if ( (current.fTimeOffset < min_offset + offset_safety && current.fTimeOffset > min_offset - offset_safety) || 00129 (current.fTimeOffset < max_offset + offset_safety && current.fTimeOffset > max_offset - offset_safety) ) { 00130 00131 best_status = kTimeOutOfBounds; 00132 } 00133 00134 return best_status; // return status for the calling module to look at 00135 }
double TemplateMultiFitter::GetAmplitude | ( | int | i | ) | const [inline] |
Definition at line 62 of file TemplateMultiFitter.h.
References fTemplates.
Referenced by TemplateFitAPGenerator::ProcessPulses(), and TemplateFitAPGenerator::RefitWithTwo().
00062 { return fTemplates.at(i).GetAmplitude();}
double TemplateMultiFitter::GetChi2 | ( | ) | const [inline] |
Definition at line 64 of file TemplateMultiFitter.h.
References fChi2.
Referenced by TemplateFitAPGenerator::ProcessPulses(), and TemplateFitAPGenerator::RefitWithTwo().
00064 { return fChi2; }
double TemplateMultiFitter::GetNDoF | ( | ) | const [inline] |
Definition at line 65 of file TemplateMultiFitter.h.
References fNDoF.
Referenced by TemplateFitAPGenerator::ProcessPulses(), and TemplateFitAPGenerator::RefitWithTwo().
00065 { return fNDoF; }
double TemplateMultiFitter::GetPedestal | ( | ) | const [inline] |
Definition at line 61 of file TemplateMultiFitter.h.
References fPedestal.
Referenced by TemplateFitAPGenerator::ProcessPulses(), and TemplateFitAPGenerator::RefitWithTwo().
00061 { return fPedestal; }
double TemplateMultiFitter::GetTime | ( | int | i | ) | const [inline] |
Definition at line 63 of file TemplateMultiFitter.h.
References fTemplates.
Referenced by TemplateFitAPGenerator::ProcessPulses(), and TemplateFitAPGenerator::RefitWithTwo().
00063 { return fTemplates.at(i).GetTime(); }
void TemplateMultiFitter::Init | ( | ) |
Definition at line 22 of file TemplateMultiFitter.cpp.
References MultiHistogramFitFCN::AddTemplate(), fFitFCN, fMinuitFitter, fRefineFactor, fTemplates, and MultiHistogramFitFCN::SetRefineFactor().
Referenced by TemplateFitAPGenerator::TemplateFitAPGenerator().
00022 { 00023 if(fFitFCN || fMinuitFitter) { 00024 cout<< "TemplateMultiFitter: Warning: trying to initialize fitter which was already initialised!"<<endl; 00025 return; 00026 } 00027 00028 fFitFCN=new MultiHistogramFitFCN(fRefineFactor); 00029 fFitFCN->SetRefineFactor(fRefineFactor); 00030 for(TemplateList::iterator i_tpl=fTemplates.begin(); i_tpl!=fTemplates.end(); ++i_tpl){ 00031 fFitFCN->AddTemplate(i_tpl->fTemplate->GetHisto()); 00032 } 00033 00034 int num_params=fTemplates.size()+1; // 1 parameter per template (amplitude) + global pedestal. 00035 fMinuitFitter = new TFitterMinuit(num_params); 00036 fMinuitFitter->SetMinuitFCN(fFitFCN); 00037 fMinuitFitter->SetPrintLevel(-1); // set the debug level to quiet (-1=quiet, 0=normal, 1=verbose) 00038 }
void TemplateMultiFitter::operator= | ( | const TemplateMultiFitter & | ) | [private] |
void TemplateMultiFitter::SetPedestal | ( | double | v | ) | [inline] |
Definition at line 51 of file TemplateMultiFitter.h.
References fPedestal.
Referenced by TemplateFitAPGenerator::ProcessPulses(), and TemplateFitAPGenerator::RefitWithTwo().
00051 {fPedestal=v;}
void TemplateMultiFitter::SetPulseEstimates | ( | int | index, | |
double | amp, | |||
double | time | |||
) | [inline] |
Definition at line 52 of file TemplateMultiFitter.h.
References fTemplates.
Referenced by TemplateFitAPGenerator::ProcessPulses(), and TemplateFitAPGenerator::RefitWithTwo().
00052 { 00053 fTemplates.at(index).Set(amp,time); 00054 }
IDs::channel TemplateMultiFitter::fChannel [private] |
Definition at line 71 of file TemplateMultiFitter.h.
Referenced by TemplateMultiFitter().
double TemplateMultiFitter::fChi2 [private] |
Definition at line 79 of file TemplateMultiFitter.h.
Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and GetChi2().
MultiHistogramFitFCN* TemplateMultiFitter::fFitFCN [private] |
Definition at line 70 of file TemplateMultiFitter.h.
Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and Init().
int TemplateMultiFitter::fFreeTemplate [private] |
Definition at line 77 of file TemplateMultiFitter.h.
double TemplateMultiFitter::fMaxADC [private] |
Definition at line 72 of file TemplateMultiFitter.h.
Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and TemplateMultiFitter().
double TemplateMultiFitter::fMinADC [private] |
Definition at line 72 of file TemplateMultiFitter.h.
Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and TemplateMultiFitter().
TFitterMinuit* TemplateMultiFitter::fMinuitFitter [private] |
Definition at line 69 of file TemplateMultiFitter.h.
Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and Init().
int TemplateMultiFitter::fNDoF [private] |
Definition at line 80 of file TemplateMultiFitter.h.
Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and GetNDoF().
double TemplateMultiFitter::fPedestal [private] |
Definition at line 74 of file TemplateMultiFitter.h.
Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), GetPedestal(), and SetPedestal().
int TemplateMultiFitter::fRefineFactor [private] |
Definition at line 75 of file TemplateMultiFitter.h.
Referenced by AddTemplate(), FitWithOneTimeFree(), and Init().
TemplateList TemplateMultiFitter::fTemplates [private] |
Definition at line 76 of file TemplateMultiFitter.h.
Referenced by AddTemplate(), FitWithAllTimesFixed(), FitWithOneTimeFree(), GetAmplitude(), GetTime(), Init(), and SetPulseEstimates().