TemplateMultiFitter Class Reference

#include <TemplateMultiFitter.h>

List of all members.

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

Sets the intial estimates for the template fitter



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
MultiHistogramFitFCNfFitFCN
IDs::channel fChannel
double fMaxADC
double fMinADC
double fPedestal
int fRefineFactor
TemplateList fTemplates
int fFreeTemplate
double fChi2
int fNDoF

Detailed Description

Definition at line 15 of file TemplateMultiFitter.h.


Member Typedef Documentation

typedef std::vector<TemplateDetails_t> TemplateMultiFitter::TemplateList [private]

Definition at line 29 of file TemplateMultiFitter.h.


Member Enumeration Documentation

Enumerator:
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   };


Constructor & Destructor Documentation

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.

00040                                           {
00041 }


Member Function Documentation

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]
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   }


Member Data Documentation

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().

Definition at line 70 of file TemplateMultiFitter.h.

Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and Init().

Definition at line 77 of file TemplateMultiFitter.h.

double TemplateMultiFitter::fMaxADC [private]
double TemplateMultiFitter::fMinADC [private]
TFitterMinuit* TemplateMultiFitter::fMinuitFitter [private]

Definition at line 69 of file TemplateMultiFitter.h.

Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and Init().

Definition at line 80 of file TemplateMultiFitter.h.

Referenced by FitWithAllTimesFixed(), FitWithOneTimeFree(), and GetNDoF().

Definition at line 75 of file TemplateMultiFitter.h.

Referenced by AddTemplate(), FitWithOneTimeFree(), and Init().


The documentation for this class was generated from the following files:

Generated on 15 Jun 2016 for AlcapDAQ by  doxygen 1.6.1