def test_decombine_result_multiple_backgrounds(self):
     N_signal = 100
     N_background_1 = 20
     N_background_2 = 40
     N_total = N_signal + N_background_1 + N_background_2
     # ratio of bkg_1 to other samples
     ratio_signal_bkg_1 = (N_signal + N_background_2)/N_background_1
     # ratio of bkg_2 to signal
     ratio_signal_bkg_2 = N_signal/N_background_2
     
     N_total_prime = N_total * 2
     N_signal_plus_bkg_2_prime, N_background_1_prime = decombine_result((N_total_prime, 0), ratio_signal_bkg_1)
     N_signal_prime, N_background_2_prime = decombine_result(N_signal_plus_bkg_2_prime, ratio_signal_bkg_2)
     
     self.assertEqual(N_signal_prime[0], N_signal * 2)
     self.assertEqual(N_background_1_prime[0], N_background_1 * 2)
     self.assertEqual(N_background_2_prime[0], N_background_2 * 2)
    def test_decombine_result_multiple_backgrounds(self):
        N_signal = 100
        N_background_1 = 20
        N_background_2 = 40
        N_total = N_signal + N_background_1 + N_background_2
        # ratio of bkg_1 to other samples
        ratio_signal_bkg_1 = (N_signal + N_background_2) / N_background_1
        # ratio of bkg_2 to signal
        ratio_signal_bkg_2 = N_signal / N_background_2

        N_total_prime = N_total * 2
        N_signal_plus_bkg_2_prime, N_background_1_prime = decombine_result(
            (N_total_prime, 0), ratio_signal_bkg_1)
        N_signal_prime, N_background_2_prime = decombine_result(
            N_signal_plus_bkg_2_prime, ratio_signal_bkg_2)

        self.assertEqual(N_signal_prime[0], N_signal * 2)
        self.assertEqual(N_background_1_prime[0], N_background_1 * 2)
        self.assertEqual(N_background_2_prime[0], N_background_2 * 2)
 def test_decombine_result_background_free(self):
     N_signal = 100
     N_background = 0
     N_total = N_signal
     ratio_signal_bkg = 0
     
     N_total_prime = N_total * 2
     N_signal_prime, N_background_prime = decombine_result((N_total_prime, 0), ratio_signal_bkg)
     
     self.assertEqual(N_signal_prime[0], N_signal * 2)
     self.assertEqual(N_background_prime[0], N_background * 2)
    def test_decombine_result_background_free(self):
        N_signal = 100
        N_background = 0
        N_total = N_signal
        ratio_signal_bkg = 0

        N_total_prime = N_total * 2
        N_signal_prime, N_background_prime = decombine_result(
            (N_total_prime, 0), ratio_signal_bkg)

        self.assertEqual(N_signal_prime[0], N_signal * 2)
        self.assertEqual(N_background_prime[0], N_background * 2)
def get_fitted_normalisation_from_ROOT(channel, input_files, variable,
                                       met_type, b_tag_bin):
    results = {}
    initial_values = {}
    templates = {}

    for variable_bin in variable_bins_ROOT[variable]:
        histograms = get_histograms(channel,
                                    input_files,
                                    variable=variable,
                                    met_type=met_type,
                                    variable_bin=variable_bin,
                                    b_tag_bin=b_tag_bin,
                                    rebin=measurement_config.rebin)
        # create signal histograms
        h_eta_signal = histograms['TTJet'] + histograms['SingleTop']

        N_ttbar_before_fit = histograms['TTJet'].Integral()
        N_SingleTop_before_fit = histograms['SingleTop'].Integral()
        N_vjets_before_fit = histograms['V+Jets'].Integral()
        N_qcd_before_fit = histograms['QCD'].Integral()
        N_signal_before_fit = N_ttbar_before_fit + N_SingleTop_before_fit

        N_ttbar_error_before_fit = sum(histograms['TTJet'].errors())
        N_SingleTop_error_before_fit = sum(histograms['SingleTop'].errors())
        N_vjets_error_before_fit = sum(histograms['V+Jets'].errors())
        N_QCD_error_before_fit = sum(histograms['QCD'].errors())

        if (N_SingleTop_before_fit != 0):
            TTJet_SingleTop_ratio = N_ttbar_before_fit / N_SingleTop_before_fit
        else:
            print 'Bin ', variable_bin, ': ttbar/singleTop ratio undefined for %s channel! Setting to 0.' % channel
            TTJet_SingleTop_ratio = 0

        leptonAbsEta = RooRealVar("leptonAbsEta", "leptonAbsEta", 0., 2.4)
        # this has to move to dps.utils.Fitting.py
        vars = RooArgList()
        vars.add(leptonAbsEta)
        vars_set = RooArgSet()
        vars_set.add(leptonAbsEta)
        n_event_obs = histograms['data'].Integral()

        lowerBound = 0.
        upperBound = n_event_obs + 10 * sqrt(n_event_obs)
        n_init = n_event_obs / 2.

        data = RooDataHist("data", "dataset with leptonAbsEta", vars,
                           histograms['data'])
        rh_vj = RooDataHist("rh_vj", "vj", vars, histograms['V+Jets'])
        rh_qcd = RooDataHist("rh_qcd", "qcd", vars, histograms['QCD'])
        rh_signal = RooDataHist("rh_signal", "signal", vars, h_eta_signal)

        pdf_vj = RooHistPdf("pdf_vj", "V+Jets pdf", vars_set, rh_vj, 0)
        pdf_qcd = RooHistPdf("pdf_qcd", "QCD pdf ", vars_set, rh_qcd, 0)
        pdf_signal = RooHistPdf("pdf_signal", "single top pdf", vars_set,
                                rh_signal, 0)

        # RooRealVar(const char *name, const char *title, Double_t value, Double_t minValue, Double_t maxValue, const char *unit) :
        nSignal = RooRealVar("nSignal", "number of single top + ttbar events",
                             N_signal_before_fit, lowerBound, upperBound,
                             "event")
        nvj = RooRealVar("nvj", "number of V+Jets bgnd events",
                         N_vjets_before_fit, lowerBound, upperBound, "event")
        nqcd = RooRealVar("nqcd", "number of QCD bgnd events",
                          N_QCD_error_before_fit, lowerBound, upperBound,
                          "event")

        model = RooAddPdf("model", "sig+vj+qcd",
                          RooArgList(pdf_signal, pdf_vj, pdf_qcd),
                          RooArgList(nSignal, nvj, nqcd))
        vj_constraint = RooGaussian("nvj_constraint", "nvj_constraint", nvj,
                                    RooFit.RooConst(N_vjets_before_fit),
                                    RooFit.RooConst(0.5 * N_vjets_before_fit))
        qcd_constraint = RooGaussian("nqcd_constraint", "nqcd_constraint",
                                     nqcd, RooFit.RooConst(N_qcd_before_fit),
                                     RooFit.RooConst(2 * N_qcd_before_fit))
        model_with_constraints = RooProdPdf(
            "model_with_constraints", "model with gaussian constraints",
            RooArgSet(model, vj_constraint, qcd_constraint), RooLinkedList())
        model_with_constraints.fitTo(data, RooFit.Minimizer(
            "Minuit2",
            "Migrad"))  #WARNING: number of cores changes the results!!!
        #         nll = model.createNLL(data, RooFit.NumCPU(2))
        #         RooMinuit(nll).migrad()
        #         frame1 = nSignal.frame(RooFit.Bins(100), RooFit.Range(lowerBound, n_event_obs), RooFit.Title("LL and profileLL in nSignal"))
        #         nll.plotOn(frame1, RooFit.ShiftToZero())
        #         frame2 = nvj.frame(RooFit.Bins(100), RooFit.Range(lowerBound, n_event_obs), RooFit.Title("LL and profileLL in nvj"))
        #         nll.plotOn(frame2, RooFit.ShiftToZero())
        #         frame3 = nqcd.frame(RooFit.Bins(100), RooFit.Range(lowerBound, n_event_obs), RooFit.Title("LL and profileLL in nqcd"))
        #         nll.plotOn(frame3, RooFit.ShiftToZero())
        #
        #         pll_nSignal = nll.createProfile(nSignal)
        #         pll_nSignal.plotOn(frame1, RooFit.LineColor(2))
        #         frame1.SetMinimum(0)
        #         frame1.SetMaximum(3)
        #
        #         pll_nvj = nll.createProfile(nvj)
        #         pll_nvj.plotOn(frame2, RooFit.LineColor(2))
        #         frame2.SetMinimum(0)
        #         frame2.SetMaximum(3)
        #
        #         pll_nqcd = nll.createProfile(nqcd)
        #         pll_nqcd.plotOn(frame3, RooFit.LineColor(2))
        #         frame3.SetMinimum(0)
        #         frame3.SetMaximum(3)
        #         c = TCanvas("profilell","profilell",1200, 400)
        #         c.Divide(3)
        #         c.cd(1)
        #         frame1.Draw()
        #         c.cd(2)
        #         frame2.Draw()
        #         c.cd(3)
        #         frame3.Draw()
        #         c.SaveAs('profileLL.png')
        #         model.fitTo(data, RooFit.Minimizer("Minuit2", "Migrad"), RooFit.NumCPU(1))#WARNING: number of cores changes the results!!!
        fit_results = {}
        fit_results['signal'] = (nSignal.getVal(), nSignal.getError())
        fit_results['QCD'] = ufloat(nqcd.getVal(), nqcd.getError())
        fit_results['V+Jets'] = ufloat(nvj.getVal(), nvj.getError())

        N_ttbar, N_SingleTop = decombine_result(fit_results['signal'],
                                                TTJet_SingleTop_ratio)
        fit_results['signal'] = ufloat(nSignal.getVal(), nSignal.getError())
        fit_results['TTJet'] = ufloat(N_ttbar)
        fit_results['SingleTop'] = ufloat(N_SingleTop)

        if results == {}:  # empty
            for sample in fit_results.keys():
                results[sample] = [fit_results[sample]]
        else:
            for sample in fit_results.keys():
                results[sample].append(fit_results[sample])

    return results, None, None
def get_fitted_normalisation_from_ROOT(channel, input_files, variable, met_type, b_tag_bin):
    results = {}
    initial_values = {}
    templates = {}

    for variable_bin in variable_bins_ROOT[variable]:
        histograms = get_histograms(channel,
                                    input_files,
                                    variable=variable,
                                    met_type=met_type,
                                    variable_bin=variable_bin,
                                    b_tag_bin=b_tag_bin,
                                    rebin=measurement_config.rebin
                                    )
        # create signal histograms
        h_eta_signal = histograms['TTJet'] + histograms['SingleTop']
        
        N_ttbar_before_fit = histograms['TTJet'].Integral()
        N_SingleTop_before_fit = histograms['SingleTop'].Integral()
        N_vjets_before_fit = histograms['V+Jets'].Integral()
        N_qcd_before_fit = histograms['QCD'].Integral()
        N_signal_before_fit = N_ttbar_before_fit + N_SingleTop_before_fit
        
        N_ttbar_error_before_fit = sum(histograms['TTJet'].errors())
        N_SingleTop_error_before_fit = sum(histograms['SingleTop'].errors())
        N_vjets_error_before_fit = sum(histograms['V+Jets'].errors())
        N_QCD_error_before_fit = sum(histograms['QCD'].errors())
        
        if (N_SingleTop_before_fit != 0):
            TTJet_SingleTop_ratio = N_ttbar_before_fit / N_SingleTop_before_fit
        else:
            print 'Bin ', variable_bin, ': ttbar/singleTop ratio undefined for %s channel! Setting to 0.' % channel
            TTJet_SingleTop_ratio = 0
            
        
        leptonAbsEta = RooRealVar("leptonAbsEta", "leptonAbsEta", 0., 2.4)
        # this has to move to dps.utils.Fitting.py
        vars = RooArgList()
        vars.add(leptonAbsEta)
        vars_set = RooArgSet()
        vars_set.add(leptonAbsEta)
        n_event_obs = histograms['data'].Integral()
        
        lowerBound = 0. 
        upperBound = n_event_obs + 10 * sqrt(n_event_obs)
        n_init = n_event_obs / 2.
        
        data = RooDataHist("data", "dataset with leptonAbsEta", vars, histograms['data'])
        rh_vj = RooDataHist("rh_vj", "vj", vars, histograms['V+Jets'])
        rh_qcd = RooDataHist("rh_qcd", "qcd", vars, histograms['QCD'])
        rh_signal = RooDataHist("rh_signal", "signal", vars, h_eta_signal)
        
        pdf_vj = RooHistPdf ("pdf_vj", "V+Jets pdf", vars_set, rh_vj, 0)
        pdf_qcd = RooHistPdf("pdf_qcd", "QCD pdf ", vars_set, rh_qcd, 0)
        pdf_signal = RooHistPdf("pdf_signal", "single top pdf", vars_set, rh_signal, 0)
        
        # RooRealVar(const char *name, const char *title, Double_t value, Double_t minValue, Double_t maxValue, const char *unit) :
        nSignal = RooRealVar("nSignal", "number of single top + ttbar events", N_signal_before_fit, lowerBound, upperBound, "event")
        nvj = RooRealVar  ("nvj", "number of V+Jets bgnd events", N_vjets_before_fit, lowerBound, upperBound, "event")
        nqcd = RooRealVar("nqcd", "number of QCD bgnd events", N_QCD_error_before_fit, lowerBound, upperBound, "event")
        
        model = RooAddPdf("model", "sig+vj+qcd",
                          RooArgList(pdf_signal, pdf_vj, pdf_qcd),
                          RooArgList(nSignal, nvj, nqcd)
                          )
        vj_constraint = RooGaussian("nvj_constraint", "nvj_constraint", nvj, RooFit.RooConst(N_vjets_before_fit), RooFit.RooConst(0.5 * N_vjets_before_fit))
        qcd_constraint = RooGaussian("nqcd_constraint", "nqcd_constraint", nqcd, RooFit.RooConst(N_qcd_before_fit), RooFit.RooConst(2 * N_qcd_before_fit))  
        model_with_constraints = RooProdPdf("model_with_constraints", "model with gaussian constraints",
                                            RooArgSet(model, vj_constraint, qcd_constraint), RooLinkedList())
        model_with_constraints.fitTo(data, RooFit.Minimizer("Minuit2", "Migrad"))  #WARNING: number of cores changes the results!!!
#         nll = model.createNLL(data, RooFit.NumCPU(2))
#         RooMinuit(nll).migrad()
#         frame1 = nSignal.frame(RooFit.Bins(100), RooFit.Range(lowerBound, n_event_obs), RooFit.Title("LL and profileLL in nSignal")) 
#         nll.plotOn(frame1, RooFit.ShiftToZero())
#         frame2 = nvj.frame(RooFit.Bins(100), RooFit.Range(lowerBound, n_event_obs), RooFit.Title("LL and profileLL in nvj"))
#         nll.plotOn(frame2, RooFit.ShiftToZero())
#         frame3 = nqcd.frame(RooFit.Bins(100), RooFit.Range(lowerBound, n_event_obs), RooFit.Title("LL and profileLL in nqcd"))
#         nll.plotOn(frame3, RooFit.ShiftToZero())  
#         
#         pll_nSignal = nll.createProfile(nSignal)
#         pll_nSignal.plotOn(frame1, RooFit.LineColor(2)) 
#         frame1.SetMinimum(0)
#         frame1.SetMaximum(3)
#         
#         pll_nvj = nll.createProfile(nvj)
#         pll_nvj.plotOn(frame2, RooFit.LineColor(2)) 
#         frame2.SetMinimum(0)
#         frame2.SetMaximum(3)
#         
#         pll_nqcd = nll.createProfile(nqcd)
#         pll_nqcd.plotOn(frame3, RooFit.LineColor(2)) 
#         frame3.SetMinimum(0)
#         frame3.SetMaximum(3)
#         c = TCanvas("profilell","profilell",1200, 400)
#         c.Divide(3)
#         c.cd(1)
#         frame1.Draw()
#         c.cd(2)
#         frame2.Draw()
#         c.cd(3)
#         frame3.Draw()
#         c.SaveAs('profileLL.png')
#         model.fitTo(data, RooFit.Minimizer("Minuit2", "Migrad"), RooFit.NumCPU(1))#WARNING: number of cores changes the results!!!
        fit_results = {}
        fit_results['signal'] = (nSignal.getVal(), nSignal.getError())
        fit_results['QCD'] = ufloat(nqcd.getVal(), nqcd.getError())
        fit_results['V+Jets'] = ufloat(nvj.getVal(), nvj.getError())
        
        N_ttbar, N_SingleTop = decombine_result(fit_results['signal'], TTJet_SingleTop_ratio)
        fit_results['signal'] = ufloat(nSignal.getVal(), nSignal.getError())
        fit_results['TTJet'] = ufloat(N_ttbar)
        fit_results['SingleTop'] = ufloat(N_SingleTop)
        
        if results == {}:  # empty
            for sample in fit_results.keys():
                results[sample] = [fit_results[sample]]
        else:
            for sample in fit_results.keys():
                results[sample].append(fit_results[sample])
        
    return results, None, None