• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

BCTemplateEnsembleTest.cxx

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2008-2012, Daniel Kollar and Kevin Kroeninger.
00003  * All rights reserved.
00004  *
00005  * For the licensing terms see doc/COPYING.
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    // calculate integral
00055    double integral = hist.Integral();
00056 
00057    // check if integral is ok
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    // set template
00064    fEnsembleTemplate = hist;
00065 
00066    // scale template
00067    fEnsembleTemplate.Scale(1.0/integral);
00068 
00069    // no error
00070    return 1;
00071 }
00072 
00073 // ---------------------------------------------------------
00074 int BCTemplateEnsembleTest::PerformEnsembleTest(TTree* tree)
00075 {
00076    // set log level to nothing
00077    BCLog::LogLevel ll = BCLog::GetLogLevelScreen();
00078    BCLog::SetLogLevel(BCLog::nothing);
00079 
00080    // initialize template fitter
00081    fTemplateFitter->Initialize();
00082 
00083    // Prepare tree
00084    PrepareTree();
00085 
00086    // get number of parameters
00087    int npar = fTemplateFitter->GetNParameters();
00088 
00089    // connect tree
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    // loop over ensembles
00098    for(int j = 0; j < fNEnsembles; j++){
00099 
00100       // print status
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       // get parameters from tree
00105       if (tree) {
00106         int index = (int) fRandom->Uniform(tree->GetEntries());
00107         tree->GetEntry(index);
00108       }
00109 
00110       // create new ensemble
00111       TH1D* ensemble = BuildEnsemble();
00112 
00113       // set ensemble as new data set
00114       fTemplateFitter->SetData(*ensemble);
00115 
00116       // find mode
00117       fTemplateFitter->FindMode();
00118 
00119       // perform MCMC
00120       if(fFlagMCMC) {
00121          fTemplateFitter->MCMCInitialize();
00122 
00123          fTemplateFitter->MarginalizeAll();
00124 
00125          // find mode with MCMC best fit
00126          fTemplateFitter->FindMode(fTemplateFitter->GetBestFitParameters());
00127 
00128          // loop over parameters and set tree variables
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       // set tree variables
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       // fill the tree
00188       fTree->Fill();
00189    }
00190 
00191    // reset log level
00192    BCLog::SetLogLevel(ll);
00193 
00194    // no error
00195    return 1;
00196 }
00197 
00198 //---------------------------------------------------------------------------------------------------------
00199 TH1D* BCTemplateEnsembleTest::BuildEnsemble()
00200 {
00201    // get histogram parameters
00202   int nbins   = fTemplateFitter->GetData().GetNbinsX();
00203 
00204    // create new ensemble
00205    TH1D* ensemble = new TH1D(fTemplateFitter->GetData());
00206 
00207    // increase ensemble counter
00208    fEnsembleCounter++;
00209 
00210    // get new parameter if needed
00211    std::vector<double> parameters = fTemplateParameters;
00212 
00213    // loop over bins and fill them
00214   for(int ibin = 1; ibin <= nbins; ++ibin){
00215       double nexp = fTemplateFitter->Expectation(ibin, parameters);
00216       double nobs = gRandom->Poisson(nexp);
00217 
00218       // set the bin content
00219     ensemble->SetBinContent(ibin, nobs);
00220   }
00221 
00222    // return the ensemble histogram
00223   return ensemble;
00224 }
00225 
00226 //---------------------------------------------------------------------------------------------------------
00227 int BCTemplateEnsembleTest::Write(const char * filename)
00228 {
00229    // open file
00230    fFile = new TFile(filename, "RECREATE");
00231 
00232    // write tree
00233    fTree->Write();
00234 
00235    // close file
00236    fFile->Close();
00237 
00238    // free memory
00239    delete fFile;
00240 
00241    // no error
00242    return 1;
00243 }
00244 
00245 //---------------------------------------------------------------------------------------------------------
00246 int BCTemplateEnsembleTest::PrepareTree()
00247 {
00248    // delete old tree if necessary
00249    if (fTree)
00250       delete fTree;
00251 
00252    // create new tree
00253    fTree = new TTree("fTree", "fTree");
00254 
00255    // get number of parameters and ratios
00256    int npar = fTemplateFitter->GetNParameters();
00257    int nratios = fTemplateFitter->GetNRatios();
00258 
00259    // initialize variables
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       // add branches
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    // no error
00336    return 1;
00337 }
00338 
00339 //---------------------------------------------------------------------------------------------------------
00340 void BCTemplateEnsembleTest::PrintPulls(const char* filename)
00341 {
00342    // create postscript
00343    TPostScript * ps = new TPostScript(filename);
00344 
00345    // create canvas and prepare postscript
00346    TCanvas * canvas = new TCanvas();
00347 
00348    canvas->Update();
00349    ps->NewPage();
00350    canvas->cd();
00351 
00352    // get number of parameters
00353    int npar = fTemplateFitter->GetNParameters();
00354 
00355    // create histogram container
00356    std::vector<TH1D*> histcontainer = std::vector<TH1D*>(0);
00357 
00358    // loop over all parameters
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    // loop over all ensembles
00365    for (int i = 0; i < fNEnsembles; ++i) {
00366 
00367       // get ensemble
00368       fTree->GetEntry(i);
00369 
00370       // loop over all parameters
00371       for (int j = 0; j < npar; ++j) {
00372          histcontainer[j]->Fill(fOutParPullGlobal[j]);
00373       }
00374    }
00375 
00376    // loop over all parameters
00377    for (int j = 0; j < npar; ++j) {
00378       // update post script
00379       canvas->Update();
00380       ps->NewPage();
00381       canvas->cd();
00382 
00383       canvas->cd();
00384       histcontainer.at(j)->Draw();
00385    }
00386    // close ps
00387    canvas->Update();
00388    ps->Close();
00389 
00390    // free memory
00391    delete ps;
00392    delete canvas;
00393 
00394 }
00395 
00396 //---------------------------------------------------------------------------------------------------------

Generated by  doxygen 1.7.1