00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <TFile.h>
00011 #include <TTree.h>
00012 #include <TROOT.h>
00013 #include <TRandom3.h>
00014 #include <TPostScript.h>
00015 #include <TCanvas.h>
00016
00017 #include <math.h>
00018 #include <iostream>
00019
00020 #include "../../BAT/BCLog.h"
00021 #include "../../BAT/BCH1D.h"
00022
00023 #include "BCTemplateFitter.h"
00024 #include "BCTemplateEnsembleTest.h"
00025
00026
00027 BCTemplateEnsembleTest::BCTemplateEnsembleTest()
00028 : fTemplateFitter(0)
00029 , fFile(0)
00030 , fTree(0)
00031 , fEnsembleCounter(0)
00032 , fEnsembleExpectation(0)
00033 , fNEnsembles(0)
00034 , fFlagMCMC(false)
00035 {
00036 fRandom = new TRandom3(0);
00037
00038 BCLog::OutWarning("Class BCTemplateFitter is depreceted and it will be removed");
00039 BCLog::OutWarning("in the future version of BAT. The same is true for the class");
00040 BCLog::OutWarning("BCTemplateEnsembleTest. Use the new class BCMTF and its ensemble");
00041 BCLog::OutWarning("testing capabilities instead.");
00042 }
00043
00044
00045 BCTemplateEnsembleTest::~BCTemplateEnsembleTest()
00046 {
00047 if (fRandom)
00048 delete fRandom;
00049 }
00050
00051
00052 int BCTemplateEnsembleTest::SetEnsembleTemplate(TH1D hist)
00053 {
00054
00055 double integral = hist.Integral();
00056
00057
00058 if (integral <= 0) {
00059 std::cout << "Template not valid. Integral is lower or equal to 0." << std::endl;
00060 return 0;
00061 }
00062
00063
00064 fEnsembleTemplate = hist;
00065
00066
00067 fEnsembleTemplate.Scale(1.0/integral);
00068
00069
00070 return 1;
00071 }
00072
00073
00074 int BCTemplateEnsembleTest::PerformEnsembleTest(TTree* tree)
00075 {
00076
00077 BCLog::LogLevel ll = BCLog::GetLogLevelScreen();
00078 BCLog::SetLogLevel(BCLog::nothing);
00079
00080
00081 fTemplateFitter->Initialize();
00082
00083
00084 PrepareTree();
00085
00086
00087 int npar = fTemplateFitter->GetNParameters();
00088
00089
00090 if (tree) {
00091 fTemplateParameters = std::vector<double>(npar);
00092 for (int i = 0; i < npar; ++i) {
00093 tree->SetBranchAddress(Form("Parameter%i", i), &(fTemplateParameters[i]));
00094 }
00095 }
00096
00097
00098 for(int j = 0; j < fNEnsembles; j++){
00099
00100
00101 if ((j+1) % 100 == 0 && j > 0)
00102 std::cout << "Fraction of ensembles analyzed: " << double(j+1) / double(fNEnsembles) * 100 << "%" << std::endl;
00103
00104
00105 if (tree) {
00106 int index = (int) fRandom->Uniform(tree->GetEntries());
00107 tree->GetEntry(index);
00108 }
00109
00110
00111 TH1D* ensemble = BuildEnsemble();
00112
00113
00114 fTemplateFitter->SetData(*ensemble);
00115
00116
00117 fTemplateFitter->FindMode();
00118
00119
00120 if(fFlagMCMC) {
00121 fTemplateFitter->MCMCInitialize();
00122
00123 fTemplateFitter->MarginalizeAll();
00124
00125
00126 fTemplateFitter->FindMode(fTemplateFitter->GetBestFitParameters());
00127
00128
00129 for (int i = 0; i < npar; ++i) {
00130 BCH1D* hist = fTemplateFitter->GetMarginalized(fTemplateFitter->GetParameter(i));
00131 fOutParModeMarg[i] = hist->GetMode();
00132 fOutParMedianMarg[i] = hist->GetMedian();
00133 fOutParMeanMarg[i] = hist->GetMean();
00134 fOutParRMSMarg[i] = hist->GetRMS();
00135 fOutParErrorUpMarg[i] = hist->GetQuantile(0.84)-hist->GetMode();
00136 fOutParErrorDownMarg[i] = hist->GetMode()-hist->GetQuantile(0.16);
00137 fOutParQuantile5Marg[i] = hist->GetQuantile(0.05);
00138 fOutParQuantile10Marg[i] = hist->GetQuantile(0.10);
00139 fOutParQuantile90Marg[i] = hist->GetQuantile(0.90);
00140 fOutParQuantile95Marg[i] = hist->GetQuantile(0.95);
00141 fOutParPullMarg[i] = -1;
00142 double error = 0.5 * (fOutParErrorUpMarg.at(i) + fOutParErrorDownMarg.at(i));
00143 if (error > 0)
00144 fOutParPullMarg[i] = (fOutParModeMarg.at(i) - fTemplateParameters.at(i)) / ( error );
00145 }
00146 fOutChi2Marg = fTemplateFitter->CalculateChi2( fTemplateFitter->GetBestFitParametersMarginalized() );
00147 fOutChi2ProbMarg = fTemplateFitter->CalculateChi2Prob(fTemplateFitter->GetBestFitParametersMarginalized());
00148 }
00149
00150 if (fFlagMCMC) {
00151 int nratios = fTemplateFitter->GetNRatios();
00152 for (int i = 0; i < nratios; ++i) {
00153 TH1D histtemp = fTemplateFitter->GetHistRatio1D(i);
00154 BCH1D * hist = new BCH1D( &histtemp );
00155 fOutRatioModeMarg[i] = hist->GetMode();
00156 fOutRatioMedianMarg[i] = hist->GetMedian();
00157 fOutRatioMeanMarg[i] = hist->GetMean();
00158 fOutRatioRMSMarg[i] = hist->GetRMS();
00159 fOutRatioErrorUpMarg[i] = hist->GetQuantile(0.84)-hist->GetMode();
00160 fOutRatioErrorDownMarg[i] = hist->GetMode()-hist->GetQuantile(0.16);
00161 fOutRatioQuantile5Marg[i] = hist->GetQuantile(0.05);
00162 fOutRatioQuantile10Marg[i] = hist->GetQuantile(0.10);
00163 fOutRatioQuantile90Marg[i] = hist->GetQuantile(0.90);
00164 fOutRatioQuantile95Marg[i] = hist->GetQuantile(0.95);
00165 }
00166 }
00167
00168
00169 fOutParValue = fTemplateParameters;
00170 fOutParModeGlobal = fTemplateFitter->GetBestFitParameters();
00171 fOutParErrorUpGlobal = fTemplateFitter->GetBestFitParameterErrors();
00172 fOutParErrorDownGlobal = fTemplateFitter->GetBestFitParameterErrors();
00173 fOutChi2Global = fTemplateFitter->CalculateChi2( fTemplateFitter->GetBestFitParameters() );
00174 fOutNDF = fTemplateFitter->GetNDF();
00175 fOutChi2ProbGlobal = fTemplateFitter->CalculateChi2Prob(fTemplateFitter->GetBestFitParameters());
00176 fOutKSProb = fTemplateFitter->CalculateKSProb();
00177 fOutPValue = fTemplateFitter->CalculatePValue();
00178 fOutNEvents = int(fTemplateFitter->GetData().Integral());
00179
00180 for (int i = 0; i < npar; ++i) {
00181 fOutParPullGlobal[i] = -1;
00182 double error = 0.5 * (fOutParErrorUpGlobal.at(i) + fOutParErrorDownGlobal.at(i));
00183 if (error > 0)
00184 fOutParPullGlobal[i] = (fOutParModeGlobal.at(i) - fTemplateParameters.at(i)) / ( error );
00185 }
00186
00187
00188 fTree->Fill();
00189 }
00190
00191
00192 BCLog::SetLogLevel(ll);
00193
00194
00195 return 1;
00196 }
00197
00198
00199 TH1D* BCTemplateEnsembleTest::BuildEnsemble()
00200 {
00201
00202 int nbins = fTemplateFitter->GetData().GetNbinsX();
00203
00204
00205 TH1D* ensemble = new TH1D(fTemplateFitter->GetData());
00206
00207
00208 fEnsembleCounter++;
00209
00210
00211 std::vector<double> parameters = fTemplateParameters;
00212
00213
00214 for(int ibin = 1; ibin <= nbins; ++ibin){
00215 double nexp = fTemplateFitter->Expectation(ibin, parameters);
00216 double nobs = gRandom->Poisson(nexp);
00217
00218
00219 ensemble->SetBinContent(ibin, nobs);
00220 }
00221
00222
00223 return ensemble;
00224 }
00225
00226
00227 int BCTemplateEnsembleTest::Write(const char * filename)
00228 {
00229
00230 fFile = new TFile(filename, "RECREATE");
00231
00232
00233 fTree->Write();
00234
00235
00236 fFile->Close();
00237
00238
00239 delete fFile;
00240
00241
00242 return 1;
00243 }
00244
00245
00246 int BCTemplateEnsembleTest::PrepareTree()
00247 {
00248
00249 if (fTree)
00250 delete fTree;
00251
00252
00253 fTree = new TTree("fTree", "fTree");
00254
00255
00256 int npar = fTemplateFitter->GetNParameters();
00257 int nratios = fTemplateFitter->GetNRatios();
00258
00259
00260 fOutParValue.assign(npar, 0);
00261 fOutParModeGlobal.assign(npar, 0);
00262 fOutParErrorUpGlobal.assign(npar, 0);
00263 fOutParErrorDownGlobal.assign(npar, 0);
00264 fOutParPullGlobal.assign(npar, 0);
00265 fOutParModeMarg.assign(npar, 0);
00266 fOutParMeanMarg.assign(npar, 0);
00267 fOutParMedianMarg.assign(npar, 0);
00268 fOutParRMSMarg.assign(npar, 0);
00269 fOutParErrorUpMarg.assign(npar, 0);
00270 fOutParErrorDownMarg.assign(npar, 0);
00271 fOutParPullMarg.assign(npar, 0);
00272 fOutParQuantile5Marg.assign(npar, 0);
00273 fOutParQuantile10Marg.assign(npar, 0);
00274 fOutParQuantile90Marg.assign(npar, 0);
00275 fOutParQuantile95Marg.assign(npar, 0);
00276 fOutRatioModeMarg.assign(nratios, 0);
00277 fOutRatioMeanMarg.assign(nratios, 0);
00278 fOutRatioMedianMarg.assign(nratios, 0);
00279 fOutRatioRMSMarg.assign(nratios, 0);
00280 fOutRatioErrorUpMarg.assign(nratios, 0);
00281 fOutRatioErrorDownMarg.assign(nratios, 0);
00282 fOutRatioQuantile5Marg.assign(nratios, 0);
00283 fOutRatioQuantile10Marg.assign(nratios, 0);
00284 fOutRatioQuantile90Marg.assign(nratios, 0);
00285 fOutRatioQuantile95Marg.assign(nratios, 0);
00286
00287 fTree->Branch("chi2_global", &fOutChi2Global, "chi2 (global)/D");
00288 fTree->Branch("ndf", &fOutNDF, "ndf/I");
00289 fTree->Branch("chi2prob_global", &fOutChi2ProbGlobal, "chi2 prob probability (global)/D");
00290 fTree->Branch("KSprob", &fOutKSProb, "KS probability/D");
00291 fTree->Branch("pvalue", &fOutPValue, "p-value/D");
00292 fTree->Branch("nevents", &fOutNEvents, "n events/I");
00293
00294 for (int i = 0; i < npar; ++i) {
00295
00296 fTree->Branch(Form("parameter_%i", i), &fOutParValue[i], Form("parameter_%i/D", i));
00297 fTree->Branch(Form("par_global_mode_par_%i", i), &fOutParModeGlobal[i], Form("par_global_Mode_par_%i/D", i));
00298 fTree->Branch(Form("par_global_error_up_par_%i", i), &fOutParErrorUpGlobal[i], Form("par_global_error_up_par_%i/D", i));
00299 fTree->Branch(Form("par_global_error_down_par_%i", i), &fOutParErrorDownGlobal[i], Form("par_global_error_down_par_%i/D", i));
00300 fTree->Branch(Form("par_global_pull_par_%i", i), &fOutParPullGlobal[i], Form("par_global_pull_par_%i/D", i));
00301
00302 if(fFlagMCMC) {
00303 fTree->Branch(Form("par_marg_mode_par_%i", i), &fOutParModeMarg[i], Form("par_marg_mode_par_%i/D", i));
00304 fTree->Branch(Form("par_marg_mean_par_%i", i), &fOutParMeanMarg[i], Form("par_marg_mean_par_%i/D", i));
00305 fTree->Branch(Form("par_marg_median_par_%i", i), &fOutParMedianMarg[i], Form("par_marg_median_par_%i/D", i));
00306 fTree->Branch(Form("par_marg_rms_par_%i", i), &fOutParRMSMarg[i], Form("par_marg_rms_par_%i/D", i));
00307 fTree->Branch(Form("par_marg_error_up_par_%i", i), &fOutParErrorUpMarg[i], Form("par_marg_ErrorUp_par_%i/D", i));
00308 fTree->Branch(Form("par_marg_error_down_par_%i", i), &fOutParErrorDownMarg[i], Form("par_marg_error_down_par_%i/D", i));
00309 fTree->Branch(Form("par_marg_pull_par_%i", i), &fOutParPullMarg[i], Form("par_marg_pull_par_%i/D", i));
00310 fTree->Branch(Form("par_marg_quantile5_par_%i", i), &fOutParQuantile5Marg[i], Form("par_marg_Quantile5_par_%i/D", i));
00311 fTree->Branch(Form("par_marg_quantile10_par_%i", i), &fOutParQuantile10Marg[i], Form("par_marg_Quantile10_par_%i/D", i));
00312 fTree->Branch(Form("par_marg_quantile90_par_%i", i), &fOutParQuantile90Marg[i], Form("par_marg_Quantile90_par_%i/D", i));
00313 fTree->Branch(Form("par_marg_quantile95_par_%i", i), &fOutParQuantile95Marg[i], Form("par_marg_Quantile95_par_%i/D", i));
00314 }
00315 }
00316
00317 if (fFlagMCMC) {
00318 fTree->Branch("chi2_marg", &fOutChi2Marg, "chi2 (marginalized)/D");
00319 fTree->Branch("chi2prob_marg", &fOutChi2ProbMarg, "chi2 prob probability (marginalized)/D");
00320
00321 for (int i = 0; i < nratios; ++i) {
00322 fTree->Branch(Form("ratio_marg_mode_ratio_%i", i), &fOutRatioModeMarg[i], Form("ratio_marg_mode_ratio_%i/D", i));
00323 fTree->Branch(Form("ratio_marg_mean_ratio_%i", i), &fOutRatioMeanMarg[i], Form("ratio_marg_mean_ratio_%i/D", i));
00324 fTree->Branch(Form("ratio_marg_median_ratio_%i", i), &fOutRatioMedianMarg[i], Form("ratio_marg_median_ratio_%i/D", i));
00325 fTree->Branch(Form("ratio_marg_rms_ratio_%i", i), &fOutRatioRMSMarg[i], Form("ratio_marg_rms_ratio_%i/D", i));
00326 fTree->Branch(Form("ratio_marg_error_up_ratio_%i", i), &fOutRatioErrorUpMarg[i], Form("ratio_marg_ErrorUp_ratio_%i/D", i));
00327 fTree->Branch(Form("ratio_marg_error_down_ratio_%i", i), &fOutRatioErrorDownMarg[i], Form("ratio_marg_error_down_ratio_%i/D", i));
00328 fTree->Branch(Form("ratio_marg_quantile5_ratio_%i", i), &fOutRatioQuantile5Marg[i], Form("ratio_marg_Quantile5_ratio_%i/D", i));
00329 fTree->Branch(Form("ratio_marg_quantile10_ratio_%i", i), &fOutRatioQuantile10Marg[i], Form("ratio_marg_Quantile10_ratio_%i/D", i));
00330 fTree->Branch(Form("ratio_marg_quantile90_ratio_%i", i), &fOutRatioQuantile90Marg[i], Form("ratio_marg_Quantile90_ratio_%i/D", i));
00331 fTree->Branch(Form("ratio_marg_quantile95_ratio_%i", i), &fOutRatioQuantile95Marg[i], Form("ratio_marg_Quantile95_ratio_%i/D", i));
00332 }
00333 }
00334
00335
00336 return 1;
00337 }
00338
00339
00340 void BCTemplateEnsembleTest::PrintPulls(const char* filename)
00341 {
00342
00343 TPostScript * ps = new TPostScript(filename);
00344
00345
00346 TCanvas * canvas = new TCanvas();
00347
00348 canvas->Update();
00349 ps->NewPage();
00350 canvas->cd();
00351
00352
00353 int npar = fTemplateFitter->GetNParameters();
00354
00355
00356 std::vector<TH1D*> histcontainer = std::vector<TH1D*>(0);
00357
00358
00359 for (int j = 0; j < npar; ++j) {
00360 TH1D* hist = new TH1D("", "Pull;N", 11, -5.5, 5.5);
00361 histcontainer.push_back(hist);
00362 }
00363
00364
00365 for (int i = 0; i < fNEnsembles; ++i) {
00366
00367
00368 fTree->GetEntry(i);
00369
00370
00371 for (int j = 0; j < npar; ++j) {
00372 histcontainer[j]->Fill(fOutParPullGlobal[j]);
00373 }
00374 }
00375
00376
00377 for (int j = 0; j < npar; ++j) {
00378
00379 canvas->Update();
00380 ps->NewPage();
00381 canvas->cd();
00382
00383 canvas->cd();
00384 histcontainer.at(j)->Draw();
00385 }
00386
00387 canvas->Update();
00388 ps->Close();
00389
00390
00391 delete ps;
00392 delete canvas;
00393
00394 }
00395
00396