Go to the documentation of this file.00001 #ifndef __BCTEMPLATEFITTER__H
00002 #define __BCTEMPLATEFITTER__H
00003
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <vector>
00030
00031 #include <TH1D.h>
00032 #include <TF1.h>
00033
00034 #include "../../BAT/BCModel.h"
00035
00036 class TH2D;
00037
00038
00039
00040 class BCTemplateFitter : public BCModel
00041 {
00042 public:
00043
00047 BCTemplateFitter();
00048
00052 BCTemplateFitter(const char * name);
00053
00057 ~BCTemplateFitter();
00058
00062 int GetNTemplates()
00063 { return int(fTemplateParIndexContainer.size()); }
00064
00069 int GetNTemplatesType(int templatetype);
00070
00074 int GetNSystErrors()
00075 { return int(fSystErrorParIndexContainer.size()); }
00076
00080 int GetNDF()
00081 { return fHistData.GetNbinsX() - GetNParameters(); }
00082
00086 int GetNRatios()
00087 { return int(fHistRatios1D.size()); }
00088
00092 std::vector<TH1D> GetHistRatios1D()
00093 { return fHistRatios1D; }
00094
00098 std::vector<TH1D> GetTemplateHistogramContainer()
00099 { return fTemplateHistogramContainer; };
00100
00104 std::vector<TF1> GetTemplateFunctionContainer()
00105 { return fTemplateFunctionContainer; };
00106
00110 TH1D GetHistRatio1D(int index)
00111 { return fHistRatios1D.at(index); }
00112
00113 TH2D* GetUncertaintyHistogramExp()
00114 { return fUncertaintyHistogramExp; };
00115
00116 TH2D* GetUncertaintyHistogramObsPosterior()
00117 { return fUncertaintyHistogramObsPosterior; };
00118
00123 int GetIndexTemplate(const char * name);
00124
00129 int GetIndexSystError(const char * name);
00130
00135 int GetParIndexTemplate(const char * name);
00136
00141 int GetParIndexTemplate(int index);
00142
00147 int GetParIndexEff(const char * name);
00148
00153 int GetParIndexSystError(const char * name);
00154
00159
00160
00164 TH1D GetData()
00165 { return fHistData; }
00166
00171 int GetHistogramIndex(int templatenumber)
00172 { return fHistogramIndexContainer.at(templatenumber); };
00173
00178 int GetFunctionIndex(int templatenumber)
00179 { return fFunctionIndexContainer.at(templatenumber); };
00180
00184 std::vector<int> GetTemplateParIndexContainer()
00185 { return fTemplateParIndexContainer; };
00186
00192 double Expectation(int binnumber, const std::vector<double>& parameters);
00193
00200 double TemplateEfficiency(int templatenumber, int binnumber, const std::vector<double>& parameters);
00201
00208 double TemplateProbability(int templatenumber, int binnumber, const std::vector<double>& parameters);
00209
00210
00216 void SetFlagPhysicalLimits(bool flag)
00217 { fFlagPhysicalLimits = flag; }
00218
00223 void SetFlagFixNorm(bool flag)
00224 { fFlagFixNorm = flag; }
00225
00229 void SetNorm(double norm)
00230 { fNorm = norm; }
00231
00237 int SetData(const TH1D& hist);
00238
00239 int FixTemplateFunctions(const std::vector<double>& parameters);
00240
00245 int Initialize();
00246
00256 int AddTemplate(TH1D hist, const char * name, double Nmin=0, double Nmax=0);
00257
00258 int AddTemplate(TF1 func, const char * name, double Nmin=0, double Nmax=0, const char* options="");
00259
00266 int SetTemplateEfficiency(const char * name, double effmean = 1., double effsigma = 0.);
00267
00275 int SetTemplateEfficiency(const char * name, TH1D eff, TH1D efferr);
00276
00283 int AddSystError(const char * errorname, const char * errtype = "gauss");
00284
00292 int SetTemplateSystError(const char * errorname, const char * templatename, TH1D parerror);
00293
00301
00302
00310 int ConstrainSum(std::vector<int> indices, double mean, double rms);
00311
00320 int CalculateRatio(int index, std::vector<int> indices, double rmin = -1.0, double rmax = 1.0);
00321
00326 int CompareHistogramProperties(TH1D hist1, TH1D hist2);
00327
00332 double CalculateChi2(const std::vector<double> & parameters);
00333
00337 double CalculateChi2Prob(const std::vector<double> & parameters);
00338
00342 double CalculateMaxLike();
00343
00347 double CalculatePValue();
00348
00352 double CalculateKSProb();
00353
00357 void MCMCUserIterationInterface();
00358
00373 void PrintStack(const char * filename = "stack.ps", const char * options="LE2E0D");
00374
00381 void PrintRatios(const char * filename = "ratio.ps", int option = 0, double ovalue = 0.);
00382
00389 int PrintTemplate(const char * name, const char * filename);
00390
00394 void PrintTemp();
00395
00402 TH1D CreateErrorHist(TH1D hist, TH1D histerr);
00403
00408 double LogLikelihood(const std::vector<double> & parameters);
00409
00414 int PerformFit();
00415
00422 TH1D CombineUncertainties(const char * name);
00423
00424 protected:
00425
00429 TH1D fHistData;
00430
00431
00432
00435 std::vector<TH1D> fTemplateHistogramContainer;
00436
00439 std::vector<TF1> fTemplateFunctionContainer;
00440
00443 std::vector<TH1D> fEffHistogramContainer;
00444
00447 std::vector<TH1D> fEffErrHistogramContainer;
00448
00451 std::vector< std::vector<TH1D> > fSystErrorHistogramContainer;
00452
00453
00454
00457 std::vector<std::string> fTemplateNameContainer;
00458
00461 std::vector<std::string> fSystErrorNameContainer;
00462
00463
00464
00467 std::vector<int> fTemplateParIndexContainer;
00468
00471 std::vector<int> fHistogramIndexContainer;
00472
00475 std::vector<int> fFunctionIndexContainer;
00476
00479 std::vector<int> fEffParIndexContainer;
00480
00484 std::vector<int> fSystErrorParIndexContainer;
00485
00486
00487
00490 std::vector<std::string> fSystErrorTypeContainer;
00491
00492
00497 std::vector<int> fTemplateTypeContainer;
00498
00502 std::vector< std::vector<int> > fConstraintSumIndices;
00503
00507 std::vector< double > fConstraintSumMean;
00508
00512 std::vector< double > fConstraintSumRMS;
00513
00517 TH1D fHistNorm;
00518
00522 std::vector< std::vector<int> > fIndicesRatios1D;
00523
00527 std::vector<TH1D> fHistRatios1D;
00528
00532 bool fFlagFixNorm;
00533
00538 bool fFlagPhysicalLimits;
00539
00543 TH2D * fUncertaintyHistogramExp;
00544
00548 TH2D * fUncertaintyHistogramObsPosterior;
00549
00553 double fNorm;
00554
00557 int fNBins;
00558
00561 double fXmin;
00562
00565 double fXmax;
00566
00567 };
00568
00569
00570
00571 #endif
00572