class CouplingsFitter2(object): def __init__(self): self.poiLabels = [] self.BR = dict(b=0.577, tau=0.063, mu=2.2e-4, c=2.91e-2, g=8.57e-2, gamma=3.82e-3, W=0.215, Z=0.0264, t=0.0) self.poi = dict() self.poilabels = dict() self.constraint = dict() self.canvases = dict() self._keep = [] def addPOI(self, poi, label='', minimum=-0.3, maximum=0.3): '''Add a parameter of interest. Example: addPOI('Z','Z',-0.05,0.05) -> Z[0,-0.05,0.05] # adds variable Z with value 0, # allow it to scale between -0.05 and 0.05 ''' self.poi[poi] = ROOT.RooRealVar(poi, poi, 0, minimum, maximum) if label == '': label = poi self.poilabels[poi] = label def createWidthDeviation(self): '''Compute the width deviation (denoted \kappa_H^2 by M.Peskin in arxiv 1312.4974). Note that we fit an additive modification of the coupling: (1 + dx) is therefore equal to kappa_x ''' expr = '0' sumBR = sum(self.BR.values()) pwidths = [] for dcoupling, br in self.BR.iteritems(): pwidth = None if dcoupling in self.poi: pwidth = str( br / sumBR) + "*(1+" + dcoupling + ")*(1+" + dcoupling + ")" else: # using sm partial width pwidth = str(br / sumBR) pwidths.append(pwidth) expr = '+'.join(pwidths) if 'inv' in self.poi: expr = '(' + expr + ')/(1.0-inv)' else: # setting invisible width to 0. expr = '(' + expr + ')' dependentlist = RooArgList() for dep in self.poi.values(): dependentlist.add(dep) self.width = RooGenericPdf('width', 'width', expr, dependentlist) def addConstraint(self, name, expr, deplist, mean, sigma): '''Add a constraint on one of the observables For example, for ZH inclusive: f.addConstraint('Zh','(1+Z)*(1+Z)','Z',1,0.004) Z is an additive modification of the gZ coupling w/r to the standard model, so 1+Z = \kappa_Z Zh is the pdf of the ratio of the yield w/r to the one expected in the standard model. This pdf depends on Z, as (1+Z)*(1+Z). ZhObs is the measured value, here 1 so we assume that the SM yield is observed. The fit varies the parameter of interest Z, thus modifying the pdf, while ZhObs is fixed at 1. The likelihood of each value of Z is evaluated at ZhObs on the pdf. ''' print 'constraint:', name print expr print deplist print mean, '+/-', sigma deps = self._getdeps(deplist) self.constraint[name] = GaussianConstraint(name, expr, deps, mean, sigma) def _getdeps(self, deplist): depnames = deplist try: depnames = deplist.split(',') except: pass deps = [] for dep in depnames: if dep == 'width': deps.append(self.width) else: deps.append(self.poi[dep]) return deps def addChannel(self, name, mean, sigma, prod, decay=None): expr_prod = '(1+{prod})*(1+{prod})'.format(prod=prod) expr = expr_prod variables = [prod] if decay: if isinstance(decay, basestring): expr_decay = '(1+{decay})*(1+{decay})'.format(decay=decay) variables.append(decay) else: decay_exprs = [] for decay, fraction in decay: n = mean * fraction decay_expr = '{n}*(1+{decay})*(1+{decay})'.format( n=n, decay=decay) decay_exprs.append(decay_expr) variables.append(decay) expr_decay = ' + '.join(decay_exprs) expr = '{expr_prod}*({expr_decay})/width'.format( expr_prod=expr_prod, expr_decay=expr_decay, ) variables.append('width') variables = list(set(variables)) deplist = ','.join(variables) self.addConstraint(name, expr, deplist, mean, sigma) def addUniformConstraint(self, name, expr): '''Adds a uniform constraint with pdf name, and expression expr. For example: f.addPOI('inv','inv', 0, 0.01) f.addUniformConstraint('Zhinv','inv') ####->Means free floating inv (the invisible BR) is free to float between 0 and 1% ''' deps = self._getdeps([expr]) self.constraint[name] = UniformConstraint(name, expr, deps) def info(self): for name, constraint in sorted(self.constraint.iteritems()): constraint.info() def fit(self): pdfs = RooArgList() obsvars = RooArgSet('set') for constraint in self.constraint.values(): pdfs.add(constraint.pdf_constraint) if hasattr(constraint, 'var_obs'): obsvars.add(constraint.var_obs) self.model = RooProdPdf('model', 'model', pdfs) self.data = RooDataSet('data', 'data', obsvars) self.data.add(obsvars) self.data.Print() self.fit_result = self.model.fitTo(self.data, ROOT.RooFit.PrintLevel(3), ROOT.RooFit.Optimize(1), ROOT.RooFit.Hesse(1), ROOT.RooFit.Minos(1), ROOT.RooFit.Strategy(2), ROOT.RooFit.Save(1)) def canvas(self, name, *args): canvas = self.canvases.setdefault(name, ROOT.TCanvas(name, name, *args)) canvas.cd() return canvas def keep(self, obj): self._keep.append(obj) return obj def createSummary(self): #sample the covariance matrix for the width # ROOT.gStyle.SetOptTitle(0) ROOT.gStyle.SetStatW(0.4) ROOT.gStyle.SetStatH(0.4) self.graph_couplings = ROOT.TGraphAsymmErrors(len(self.poi) + 2) order_BR = ['Z', 'W', 'b', 'c', 'g', 'tau', 'mu', 'gamma', 'inv'] for br in order_BR: if not self.poi.get(br, None): order_BR.remove(br) for i, poiname in enumerate(order_BR): poi = self.poi.get(poiname) self.graph_couplings.SetPoint(i, i + 0.5, poi.getVal()) self.graph_couplings.SetPointError(i, 0.0, 0.0, -poi.getAsymErrorLo(), poi.getAsymErrorHi()) print 'Sampling the covariance matrix to propagate error on width' self.h_width = ROOT.TH1F('h_width', 'width', 1000, 0.5, 1.5) ntoys = 10000 for i in range(ntoys): randomizedPars = self.fit_result.randomizePars() for j in range(0, randomizedPars.getSize()): self.poi[randomizedPars.at(j).GetName()].setVal( randomizedPars.at(j).getVal()) self.h_width.Fill(self.width.getVal()) for cstr in self.constraint.values(): cstr.fill_pull() self.graph_couplings.SetMarkerStyle(20) self.graph_couplings.SetLineWidth(3) can_couplings = self.canvas('couplings') self.graph_couplings.Draw("AP") self.graph_couplings.GetYaxis().SetTitle("68% CL on d(A) ") self.graph_couplings.GetXaxis().SetNdivisions(0) l = self.keep(ROOT.TLine()) l.SetLineColor(ROOT.kRed) l.SetLineWidth(3) l.DrawLine(0.0, 0.0, len(self.poi) + 1.5, 0) self.graph_couplings.SetPoint(len(self.poi), len(self.poi) + 0.5, 0.0) self.graph_couplings.SetPointError( len(self.poi), 0.0, 0.0, self.h_width.GetRMS() / self.h_width.GetMean(), self.h_width.GetRMS() / self.h_width.GetMean()) for i, poiname in enumerate(order_BR + ['#Gamma_{T}']): label = self.poilabels.get(poiname, poiname) tex = self.keep( ROOT.TLatex(i + 0.5, 0.95 * self.graph_couplings.GetYaxis().GetXmin(), label)) tex.Draw() print """ ############################################################### ############################################################### ############################################################### RESULTS ############################################################### ############################################################### ############################################################### """ print 'RESULTS FOR THE CONFIDENCE INTERVALS------>' for name in order_BR: poi = self.poi[name] poiLabel = self.poilabels.get(name, name) mind = poi.getAsymErrorLo() * 100 maxd = poi.getAsymErrorHi() * 100 avd = abs(maxd - mind) / 2. # print poiLabel+': ('+str(poi.getAsymErrorLo())+','+str(poi.getAsymErrorHi())+'), ' + str(avd) print '{label:10}:\t{mind:5.3f}%\t{maxd:5.3f}%\t{avd:5.3f}%'.format( label=poiLabel, mind=mind, maxd=maxd, avd=avd) can_gamma = self.canvas('gamma') self.h_width.GetXaxis().SetTitle("#Gamma_{T}") self.h_width.GetYaxis().SetTitle("N toys") self.h_width.Draw() print 'Relative error on the total width ', self.h_width.GetRMS( ) / self.h_width.GetMean() print 'Please check the histogram to see that the dist is Gaussian. If not the fit is biased' print 'The fit can be biased when floating the width sometimes.' can_pulls = self.canvas('pulls', 1000, 1000) npulls = len(self.constraint) nxy = int(math.ceil(math.sqrt(npulls))) can_pulls.Divide(nxy, nxy) for i, c in enumerate(self.constraint.values()): can_pulls.cd(i + 1) c.pulls.Draw()
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
class CouplingsFitterTest(object): def __init__(self): self.poiLabels = [] self.poi = dict() self.poilabels = dict() self.constraint = dict() self.canvases = dict() self._keep = [] def addPOI(self, poi, label='', minimum=-0.3, maximum=0.3): '''Add a parameter of interest. Example: addPOI('Z','Z',-0.05,0.05) -> Z[0,-0.05,0.05] # adds variable Z with value 0, # allow it to scale between -0.05 and 0.05 ''' self.poi[poi] = ROOT.RooRealVar(poi, poi, 0, minimum, maximum) if label == '': label = poi self.poilabels[poi] = label def addConstraint(self, name, expr, deplist, mean, sigma): '''Add a constraint on one of the observables For example, for ZH inclusive: f.addConstraint('Zh','(1+Z)*(1+Z)','Z',1,0.004) Z is an additive modification of the gZ coupling w/r to the standard model, so 1+Z = \kappa_Z Zh is the pdf of the ratio of the yield w/r to the one expected in the standard model. This pdf depends on Z, as (1+Z)*(1+Z). ZhObs is the measured value, here 1 so we assume that the SM yield is observed. The fit varies the parameter of interest Z, thus modifying the pdf, while ZhObs is fixed at 1. The likelihood of each value of Z is evaluated at ZhObs on the pdf. ''' deps = self._getdeps(deplist) self.constraint[name] = GaussianConstraint(name, expr, deps, mean, sigma) def _getdeps(self, deplist): depnames = deplist try: depnames = deplist.split(',') except: pass deps = [] for dep in depnames: if dep == 'width': deps.append(self.width) else: deps.append(self.poi[dep]) return deps def addUniformConstraint(self, name, expr): '''Adds a uniform constraint with pdf name, and expression expr. For example: f.addPOI('inv','inv', 0, 0.01) f.addUniformConstraint('Zhinv','inv') ####->Means free floating inv (the invisible BR) is free to float between 0 and 1% ''' deps = self._getdeps([expr]) self.constraint[name] = UniformConstraint(name, expr, deps) def info(self): for name, constraint in sorted(self.constraint.iteritems()): constraint.info() def fit(self): pdfs = RooArgList() obsvars = RooArgSet('set') for constraint in self.constraint.values(): pdfs.add(constraint.pdf_constraint) if hasattr(constraint, 'var_obs'): obsvars.add(constraint.var_obs) self.model = RooProdPdf('model', 'model', pdfs) self.data = RooDataSet('data', 'data', obsvars) self.data.add(obsvars) self.data.Print() self.fit_result = self.model.fitTo(self.data, ROOT.RooFit.PrintLevel(3), ROOT.RooFit.Optimize(1), ROOT.RooFit.Hesse(1), ROOT.RooFit.Minos(1), ROOT.RooFit.Strategy(2), ROOT.RooFit.Save(1)) def canvas(self, name, *args): canvas = self.canvases.setdefault(name, ROOT.TCanvas(name, name, *args)) canvas.cd() return canvas def keep(self, obj): self._keep.append(obj) return obj def createSummary(self): #sample the covariance matrix for the width # ROOT.gStyle.SetOptTitle(0) ## ROOT.gStyle.SetStatW(0.4); ## ROOT.gStyle.SetStatH(0.4); ## ## self.graph_couplings = ROOT.TGraphAsymmErrors(len(self.poi)+2) ## ## order_BR = ['Z', 'W', 'b', 'c', 'g', 'tau', 'mu', 'gamma', 'inv'] ## ## for br in order_BR: ## if not self.poi.get(br, None): ## order_BR.remove(br) ## ## for i, poiname in enumerate(order_BR): ## poi = self.poi.get(poiname) ## self.graph_couplings.SetPoint(i, i+0.5, poi.getVal()) ## self.graph_couplings.SetPointError(i, 0.0, 0.0, -poi.getAsymErrorLo(), poi.getAsymErrorHi()) print 'Sampling the covariance matrix to propagate error on width' ## self.h_width = ROOT.TH1F('h_width','width',1000,0.5,1.5) ntoys = 10000 for i in range(ntoys): randomizedPars = self.fit_result.randomizePars() for j in range(0, randomizedPars.getSize()): self.poi[randomizedPars.at(j).GetName()].setVal( randomizedPars.at(j).getVal()) ## self.h_width.Fill(self.width.getVal()) ## for cstr in self.constraint.values(): ## cstr.fill_pull() ## self.graph_couplings.SetMarkerStyle(20) ## self.graph_couplings.SetLineWidth(3) ## can_couplings = self.canvas('couplings') ## self.graph_couplings.Draw("AP") ## self.graph_couplings.GetYaxis().SetTitle("68% CL on d(A) ") ## self.graph_couplings.GetXaxis().SetNdivisions(0) ## l= self.keep(ROOT.TLine()) ## l.SetLineColor(ROOT.kRed) ## l.SetLineWidth(3) ## l.DrawLine(0.0,0.0,len(self.poi)+1.5,0) ## self.graph_couplings.SetPoint(len(self.poi),len(self.poi)+0.5,0.0) ## self.graph_couplings.SetPointError(len(self.poi),0.0,0.0,self.h_width.GetRMS()/self.h_width.GetMean(), ## self.h_width.GetRMS()/self.h_width.GetMean()) ## ## for i, poiname in enumerate(order_BR+['#Gamma_{T}']): ## label = self.poilabels.get(poiname, poiname) ## tex = self.keep(ROOT.TLatex(i+0.5,0.95*self.graph_couplings.GetYaxis().GetXmin(),label)) ## tex.Draw() ## print """ ############################################################### ############################################################### ############################################################### RESULTS ############################################################### ############################################################### ############################################################### """ print 'RESULTS FOR THE CONFIDENCE INTERVALS------>' for name in self.poi: poi = self.poi[name] poiLabel = self.poilabels.get(name, name) mind = poi.getAsymErrorLo() * 100 maxd = poi.getAsymErrorHi() * 100 avd = abs(maxd - mind) / 2. # print poiLabel+': ('+str(poi.getAsymErrorLo())+','+str(poi.getAsymErrorHi())+'), ' + str(avd) print '{label:10}:\t{mind:5.3f}%\t{maxd:5.3f}%\t{avd:5.3f}%'.format( label=poiLabel, mind=mind, maxd=maxd, avd=avd)
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