示例#1
0
    def _preFitSteps(self):
        """Prefit uncorrelated term"""
        args = self.pdf.getParameters(self.data)
        FitDBPlayer.initFromDB(self.process.dbplayer.odbfile, args)
        self.ToggleConstVar(args, isConst=True)

        # Disable xTerm correction and fit to 1-D
        args.find('hasXTerm').setVal(0)

        h_accXrec_fine_ProjectionX = self.process.sourcemanager.get(
            self.cfg['dataX'])
        h_accXrec_fine_ProjectionY = self.process.sourcemanager.get(
            self.cfg['dataY'])
        effi_cosl = self.process.sourcemanager.get(self.cfg['pdfX'])
        effi_cosK = self.process.sourcemanager.get(self.cfg['pdfY'])
        for proj, pdf, var, argPats in [
            (h_accXrec_fine_ProjectionX, effi_cosl, CosThetaL, [r"^l\d+$"]),
            (h_accXrec_fine_ProjectionY, effi_cosK, CosThetaK, [r"^k\d+$"])
        ]:
            hdata = ROOT.RooDataHist("hdata", "", ROOT.RooArgList(var),
                                     ROOT.RooFit.Import(proj))
            self.ToggleConstVar(args, isConst=False, targetArgs=argPats)
            pdf.chi2FitTo(hdata, ROOT.RooLinkedList())
            self.ToggleConstVar(args, isConst=True, targetArgs=argPats)

        args.find('effi_norm').setConstant(False)
        self.pdf.chi2FitTo(self.data, ROOT.RooFit.Minos(True))
        args.find('effi_norm').setVal(args.find('effi_norm').getVal() / 4.)
        args.find('effi_norm').setConstant(True)

        # Fix uncorrelated term and for later update with xTerms in main fit step
        args.find('hasXTerm').setVal(1)
        self.ToggleConstVar(args, isConst=False, targetArgs=[r"^x\d+$"])
示例#2
0
 def initPdfPlotCfg(self, p):
     """ [Name, plotOnOpt, argAliasInDB, LegendName] """
     pdfPlotTemplate = ["", plotterCfg_styles['allStyle'], None, None]
     p = p + pdfPlotTemplate[len(p):]
     if isinstance(p[0], str):
         self.logger.logDEBUG("Initialize pdfPlot {0}".format(p[0]))
         p[0] = self.process.sourcemanager.get(p[0])
         if p[0] == None:
             errorMsg = "pdfPlot not found in source manager."
             self.logger.logERROR(errorMsg)
             raise RuntimeError("pdfPlot not found in source manager.")
     args = p[0].getParameters(
         ROOT.RooArgSet(Bmass, CosThetaK, CosThetaL, Mumumass, Phimass))
     if not self.process.cfg['args'].Function_name in ['submit', 'run']:
         FitterCore.ArgLooper(args, lambda p: p.Print())
     if type(
             p[2]
     ) is str:  # In case ArgAlias is to be defined with string at the end for all args
         tag = p[2]
         p[2] = {}
         arglist = []
         FitterCore.ArgLooper(args, lambda p: arglist.append(p.GetName()))
         for var in arglist:
             p[2].update({var: var + tag})
     if self.process.cfg['args'].NoFit:
         self.process.cfg['args'].NoImport = True
     if (not self.process.cfg['args'].NoImport):
         FitDBPlayer.initFromDB(self.process.dbplayer.odbfile, args, p[2])
     if not self.process.cfg['args'].Function_name in ['submit']:
         FitterCore.ArgLooper(args, lambda p: p.Print())
     return p
示例#3
0
    def wrapped_f(self):
        self.pdf = self.process.sourcemanager.get(self.cfg['pdf'])
        self.argset = self.cfg['argset']
        self.params = self.pdf.getParameters(self.argset)
        FitDBPlayer.initFromDB(self.cfg['db'].format(binLabel=q2bins[self.process.cfg['binKey']]['label']), self.params, self.cfg.get('argAliasInDB', []))

        func(self)
示例#4
0
 def _preFitSteps_initFromDB(self):
     """Initialize from DB"""
     if not self.process.cfg['args'].NoImport:
         #FitDBPlayer.initFromDB(self.process.dbplayer.odbfile, self.args, self.cfg['argAliasInDB'], exclude=['nBkgComb', 'nSig', 'nBkgPeak', 'PeakFrac', 'unboundFl', 'unboundAfb'])
         FitDBPlayer.initFromDB(self.process.dbplayer.odbfile, self.args,
                                self.cfg['argAliasInDB'])
     self.ToggleConstVar(self.args, True)
     self.ToggleConstVar(self.args, False, self.cfg.get('argPattern'))
示例#5
0
        def wrapped_f(self):
            func(self)

            targetParams = ROOT.RooArgSet()
            def setParamsToFluc(arg):
                if arg.GetName() in parList:
                    targetParams.add(arg)
            FitterCore.ArgLooper(self.params, setParamsToFluc)
            FitDBPlayer.fluctuateFromDB(self.cfg['db'].format(binLabel=q2bins[self.process.cfg['binKey']]['label']), targetParams, self.cfg.get('argAliasInDB', []))
示例#6
0
 def wrapped_f(self, expYield, Year):
     self.pdf = self.process.sourcemanager.get(self.cfg['pdf'])
     self.argset = self.cfg['argset']
     self.params = self.pdf.getParameters(self.argset)
     dbfile = os.path.join(
         self.process.cwd, "plots_{0}".format(Year), self.cfg['db'].format(
             binLabel=q2bins[self.process.cfg['binKey']]['label']))
     FitDBPlayer.initFromDB(dbfile, self.params,
                            self.cfg.get('argAliasInDB', []))
     func(self, expYield, Year)
 def _postFitSteps(self):
     """Post-processing"""
     #  FitterCore.ArgLooper(self.args, lambda arg: arg.Print())
     self.ToggleConstVar(self.args, True)
     if self.cfg['saveToDB']:
         FitDBPlayer.UpdateToDB(
             self.process.dbplayer.odbfile, self.args,
             self.cfg['argAliasInDB']
             if self.cfg['argAliasSaveToDB'] else None)
         FitDBPlayer.UpdateToDB(self.process.dbplayer.odbfile,
                                self.fitResult)
示例#8
0
    def preFitSteps_randEffi(self):
        self.args = self.pdf.getParameters(self.data)
        self._preFitSteps_initFromDB()

        # Fluctuate cross-term correction
        effiArgs = ROOT.RooArgSet()
        FitterCore.ArgLooper(self.args, lambda iArg: effiArgs.add(iArg), targetArgs=[r"x\d{1,2}"])
        FitDBPlayer.fluctuateFromDB(self.process.dbplayer.odbfile, effiArgs, self.cfg['argAliasInDB'])

        self._preFitSteps_vetoSmallFs()
        self._preFitSteps_preFit()
 def initPdfPlotCfg(self, p):
     """ [Name, plotOnOpt, argAliasInDB, LegendName] """
     pdfPlotTemplate = ["", plotterCfg_allStyle, None, None]
     p = p + pdfPlotTemplate[len(p):]
     if isinstance(p[0], str):
         self.logger.logDEBUG("Initialize pdfPlot {0}".format(p[0]))
         p[0] = self.process.sourcemanager.get(p[0])
         if p[0] == None:
             self.logger.logERROR("pdfPlot not found in source manager.")
             raise RuntimeError
     args = p[0].getParameters(
         ROOT.RooArgSet(Bmass, CosThetaK, CosThetaL, Mumumass, Phimass))
     FitDBPlayer.initFromDB(self.process.dbplayer.odbfile, args, p[2])
     return p
示例#10
0
def func_simMismodel(args):
    p.setSequence([])
    try:
        p.beginSeq()
        db = shelve.open(p.dbplayer.odbfile)
        fl_GEN = unboundFlToFl(db['unboundFl_GEN']['getVal'])
        fl_RECO = unboundFlToFl(db['unboundFl_RECO']['getVal'])
        afb_GEN = unboundAfbToAfb(db['unboundAfb_GEN']['getVal'], fl_GEN)
        afb_RECO = unboundAfbToAfb(db['unboundAfb_RECO']['getVal'], fl_RECO)
        db.close()
        syst_simMismodel = {
            'syst_simMismodel_fl': {
                'getError': math.fabs(fl_GEN - fl_RECO),
                'getErrorHi': math.fabs(fl_GEN - fl_RECO),
                'getErrorLo': -math.fabs(fl_GEN - fl_RECO),
            },
            'syst_simMismodel_afb': {
                'getError': math.fabs(afb_GEN - afb_RECO),
                'getErrorHi': math.fabs(afb_GEN - afb_RECO),
                'getErrorLo': -math.fabs(afb_GEN - afb_RECO),
            }
        }
        print(syst_simMismodel)

        if args.updateDB:
            FitDBPlayer.UpdateToDB(p.dbplayer.odbfile, syst_simMismodel)
    finally:
        p.endSeq()
示例#11
0
 def _preFitSteps(self):
     """Rename parameter names and import values from database"""
     for pdf, data, Year in zip(self.pdf, self.data, self.Years):
         args = pdf.getParameters(
             ROOT.RooArgSet(CosThetaK, CosThetaL, Bmass))
         odbfile = os.path.join(self.process.cwd, "plots_{0}".format(Year),
                                self.process.dbplayer.odbfile)
         if not self.process.cfg['args'].NoImport:
             FitDBPlayer.initFromDB(odbfile,
                                    args,
                                    aliasDict=self.cfg['argAliasInDB'])
         self.ToggleConstVar(args, True)
         self.ToggleConstVar(args, False, self.cfg['argPattern'])
         # Rename parameter names
         FitterCore.ArgLooper(
             args,
             lambda p: p.SetName(p.GetName() + "_{0}".format(Year)),
             targetArgs=self.cfg['argPattern'],
             inverseSel=True)
示例#12
0
def GetPDFlist(binkey):
    from BsToPhiMuMuFitter.FitDBPlayer import FitDBPlayer
    cwd = os.getcwd()
    os.chdir("../input/")
    mfile = "wspace_{}_{}.root".format(args.Year, binkey)
    ifile = ROOT.TFile.Open(mfile, 'READ')
    wspace = ifile.Get("wspace.{}.{}".format(args.Year, binkey))
    pdf = {
        'pdfL': wspace.obj("effi_cosl"),
        'pdfK': wspace.obj("effi_cosK"),
        'pdfL_ts': wspace.obj("effi_cosl_ts"),
        'pdfK_ts': wspace.obj("effi_cosK_ts")
    }
    os.chdir(cwd)
    os.chdir('../plots_{}/'.format(args.Year))
    odbfile = 'fitResults_{}.db'.format(binkey)

    for key in pdf.keys():
        arguments = pdf[key].getParameters(ROOT.RooArgSet(
            CosThetaL, CosThetaK))
        FitDBPlayer.initFromDB(odbfile, arguments)
    os.chdir(cwd)
    return pdf
示例#13
0
    def beginSeq_registerServices(self):
        """Initialize all services."""
        if not 'dbplayer' in self._services.keys():
            dbplayer = FitDBPlayer(
                absInputDir=os.path.join(modulePath, self.work_dir))
            self.addService("dbplayer", dbplayer)
        self.addService('logger', Logger("runtime.log", 999))
        self.addService('filemanager', FileManager())
        self.addService('sourcemanager', SourceManager())

        for seq_obj in self._sequence:
            if seq_obj.logger is None: setattr(seq_obj, "logger", self.logger)
        for key, s in self._services.items():
            setattr(s, "process", self)
            if s.logger is None:
                setattr(s, "logger", self.logger)
            s._beginSeq()
示例#14
0
def updateToDB_altShape(args, tag):
    """ Template db entry maker for syst """
    db = shelve.open(p.dbplayer.odbfile)
    nominal_fl = unboundFlToFl(db['unboundFl']['getVal'])
    nominal_afb = unboundAfbToAfb(db['unboundAfb']['getVal'], nominal_fl)
    db.close()
    afb = p.sourcemanager.get('afb').getVal()
    fl = p.sourcemanager.get('fl').getVal()
    syst_altShape = {}
    syst_altShape['syst_{0}_afb'.format(tag)] = {
        'getError': math.fabs(afb - nominal_afb),
        'getErrorHi': math.fabs(afb - nominal_afb),
        'getErrorLo': -1 * math.fabs(afb - nominal_afb),
    }
    syst_altShape['syst_{0}_fl'.format(tag)] = {
        'getError': math.fabs(fl - nominal_fl),
        'getErrorHi': math.fabs(fl - nominal_fl),
        'getErrorLo': -1 * math.fabs(fl - nominal_fl),
    }
    print(syst_altShape)

    if args.updateDB:
        FitDBPlayer.UpdateToDB(p.dbplayer.odbfile, syst_altShape)
def func_postproc(args):
    """ Fit to fit result and make plots """
    GenResult = []
    RecoResult = []
    os.chdir(args.wrapper.task_dir)
    args.process.addService(
        "dbplayer",
        FitDBPlayer(absInputDir=os.path.join(modulePath, "plots_{}".format(
            args.Year))))
    binKeys = args.process.cfg['allBins'] if args.process.cfg[
        'args'].forall else args.process.cfg[
            'bins']  #Run over all bins if no binkey arg is supplied
    for binKey in binKeys:
        ifilename = "setSummary_{}_{}.root".format(
            "Simult" if args.SimFit else args.Year, q2bins[binKey]['label'])
        if not os.path.exists(ifilename) or args.forceHadd:
            call(["hadd", "-f", ifilename] +
                 glob.glob('*/setSummary_{}_{}.root'.format(
                     "Simult" if args.SimFit else args.Year, q2bins[binKey]
                     ['label'])))
        ifile = ROOT.TFile(ifilename)
        tree = ifile.Get("tree")

        binWidth = 0.01
        h_setSummary_afb = ROOT.TH1F("h_setSummary_afb", "",
                                     int(1.5 / binWidth), -0.75, 0.75)
        h_setSummary_fl = ROOT.TH1F("h_setSummary_fl", "", int(1. / binWidth),
                                    0., 1.)

        tree.Draw("afb>>h_setSummary_afb", "status==0")
        tree.Draw("fl>>h_setSummary_fl", "status==0")

        f_setSummary_afb = ROOT.TF1("f_setSummary_afb", "gaus",
                                    -0.75 + binWidth, 0.75 - binWidth)
        #f_setSummary_afb.SetLineColor(ROOT.kBlue)
        h_setSummary_afb.Fit("f_setSummary_afb")
        h_setSummary_afb.GetFunction("f_setSummary_afb").SetLineColor(4)

        f_setSummary_fl = ROOT.TF1("f_setSummary_fl", "gaus", binWidth,
                                   1 - binWidth)
        #f_setSummary_fl.SetLineColor(ROOT.kBlue)
        h_setSummary_fl.Fit("f_setSummary_fl")
        h_setSummary_fl.GetFunction("f_setSummary_fl").SetLineColor(4)

        # Draw
        db = shelve.open(
            os.path.join(args.process.dbplayer.absInputDir,
                         "fitResults_{0}.db".format(q2bins[binKey]['label'])),
            'r')
        fl_GEN = StdFitter.unboundFlToFl(db['unboundFl_GEN']['getVal'])
        afb_GEN = StdFitter.unboundAfbToAfb(db['unboundAfb_GEN']['getVal'],
                                            fl_GEN)
        line = ROOT.TLine()
        line.SetLineWidth(2)
        line.SetLineColor(2)
        line.SetLineStyle(9)
        plotCollection.Plotter.canvas.cd()

        h_setSummary_afb.SetXTitle("A_{6}")
        h_setSummary_afb.SetYTitle("Number of test samples")
        h_setSummary_afb.SetFillColor(ROOT.kGreen - 10)
        h_setSummary_afb.GetYaxis().SetRangeUser(
            0., 1.5 * h_setSummary_afb.GetMaximum())
        h_setSummary_afb.Draw()
        GetParams(f_setSummary_afb, h_setSummary_afb, binKey, afb_GEN, "a6")
        if args.drawGEN:
            line.DrawLine(afb_GEN, 0, afb_GEN, h_setSummary_afb.GetMaximum())
        plotCollection.Plotter.latexDataMarks(['sim'])
        plotCollection.Plotter.canvas.Print(
            "h_setSummary_sigMCValidation_a6_{}_{}.pdf".format(
                "Simult" if args.SimFit else args.Year,
                q2bins[binKey]['label']))

        h_setSummary_fl.SetXTitle("F_{L}")
        h_setSummary_fl.SetYTitle("Number of test samples")
        h_setSummary_fl.SetFillColor(ROOT.kGreen - 10)
        h_setSummary_fl.GetYaxis().SetRangeUser(
            0., 1.5 * h_setSummary_fl.GetMaximum())
        h_setSummary_fl.Draw()
        GetParams(f_setSummary_fl, h_setSummary_fl, binKey, fl_GEN, "fl")
        if args.drawGEN:
            line.DrawLine(fl_GEN, 0, fl_GEN, h_setSummary_fl.GetMaximum())
        plotCollection.Plotter.latexDataMarks(['sim'])
        plotCollection.Plotter.canvas.Print(
            "h_setSummary_sigMCValidation_fl_{}_{}.pdf".format(
                "Simult" if args.SimFit else args.Year,
                q2bins[binKey]['label']))

        Fl_GENErr = abs(
            StdFitter.unboundFlToFl(db['unboundFl_GEN']['getVal'] +
                                    db['unboundFl_GEN']['getError']) - fl_GEN)
        A6_GENErr = abs(
            StdFitter.unboundAfbToAfb(
                db['unboundAfb_GEN']['getVal'] +
                db['unboundAfb_GEN']['getError'], fl_GEN) - afb_GEN)
        GenResult.append((fl_GEN, Fl_GENErr, afb_GEN, A6_GENErr))
        RecoResult.append(
            (f_setSummary_fl.GetParameter(1), f_setSummary_fl.GetParameter(2),
             f_setSummary_afb.GetParameter(1),
             f_setSummary_afb.GetParameter(2)))
        db.close()
    if args.process.cfg['args'].forall:
        from BsToPhiMuMuFitter.script.batchTask_mixedToyValidation import GetSummaryGraph as SummaryGraph
        SummaryGraph(binKeys,
                     RecoResult,
                     GenResult,
                     args,
                     pltName="sigMCSubsample")
 def _preFitSteps_initFromDB(self):
     """Initialize from DB"""
     FitDBPlayer.initFromDB(self.process.dbplayer.odbfile, self.args,
                            self.cfg['argAliasInDB'])
     self.ToggleConstVar(self.args, True)
     self.ToggleConstVar(self.args, False, self.cfg.get('argPattern'))
    def _preFitSteps(self):
        """Prefit uncorrelated term"""
        args = self.pdf.getParameters(self.data)
        if not self.process.cfg['args'].NoImport:
            FitDBPlayer.initFromDB(self.process.dbplayer.odbfile, args)
        self.ToggleConstVar(args, isConst=True)

        # Disable xTerm correction and fit to 1-D
        args.find('hasXTerm{}'.format(self.cfg['label'])).setVal(0)

        h_accXrec_fine_ProjectionX = self.process.sourcemanager.get(
            self.cfg['dataX'])
        h_accXrec_fine_ProjectionY = self.process.sourcemanager.get(
            self.cfg['dataY'])
        effi_cosl = self.process.sourcemanager.get(self.cfg['pdfX'])
        effi_cosK = self.process.sourcemanager.get(self.cfg['pdfY'])
        for proj, pdf, var, argPats in [
            (h_accXrec_fine_ProjectionX, effi_cosl, CosThetaL, [r"^l\d+\w*"]),
            (h_accXrec_fine_ProjectionY, effi_cosK, CosThetaK, [r"^k\d+\w*"])
        ]:
            hdata = ROOT.RooDataHist("hdata", "", ROOT.RooArgList(var),
                                     ROOT.RooFit.Import(proj))
            self.ToggleConstVar(args, isConst=False, targetArgs=argPats)

            theList = ROOT.RooLinkedList()
            Err = ROOT.RooFit.Minos(True)
            theSave = ROOT.RooFit.Save()  #Python discards temporary objects
            Verbose = ROOT.RooFit.Verbose(0)
            Strategy = ROOT.RooFit.Strategy(2)
            PrintLevel = ROOT.RooFit.PrintLevel(-1)
            theList.Add(theSave)
            theList.Add(Verbose)
            theList.Add(PrintLevel)
            theList.Add(Err)
            theList.Add(Strategy)
            Res = pdf.chi2FitTo(hdata, theList)
            Res = pdf.chi2FitTo(hdata, theList)
            Res.Print("v")
            FitDBPlayer.UpdateToDB(
                self.process.dbplayer.odbfile,
                FitterCore.GetFitResult(self.name, var.GetName(), Res))

            ################## AlTernatively #######################
            #chi2 = pdf.createChi2(hdata, ROOT.RooFit.Save(1))
            #m=ROOT.RooMinuit(chi2)
            #m.setPrintLevel(3)
            #m.migrad()
            #m.hesse()
            #m.minos()
            #RooRes=m.save()

            self.ToggleConstVar(args, isConst=True, targetArgs=argPats)

        effi_norm = 'effi_norm{}'.format(self.cfg['label'])
        args.find('hasXTerm{}'.format(self.cfg['label'])).setVal(1)
        args.find(effi_norm).setConstant(False)
        Res2D = self.pdf.chi2FitTo(self.data, ROOT.RooFit.Minos(True),
                                   ROOT.RooFit.Save(), ROOT.RooFit.Strategy(2),
                                   ROOT.RooFit.PrintLevel(-1))
        Res2D.Print()
        #args.find(effi_norm).setVal(args.find(effi_norm).getVal() / 4.)
        args.find(effi_norm).setConstant(True)

        # Fix uncorrelated term and for later update with xTerms in main fit step
        self.ToggleConstVar(args, isConst=False, targetArgs=[r"^x\d+\w*"])
    def _runFitSteps(self):
        h2_accXrec = self.process.sourcemanager.get(self.cfg['datahist'])
        args = self.pdf.getParameters(self.data)
        nPar = 0
        floaters = {}  #Saving indices for cross terms

        def GetTFunction():
            nonlocal nPar
            args_it = args.createIterator()
            arg = args_it.Next()
            effi_sigA_formula = self.pdf.formula().formulaString()
            paramDict = {}
            for p in range(self.pdf.formula().actualDependents().getSize()):
                paramDict[self.pdf.formula().getParameter(p).GetName()] = p
            effi_sigA_formula = effi_sigA_formula.replace(
                "x[{0}]".format(paramDict['CosThetaL']), "x")
            effi_sigA_formula = effi_sigA_formula.replace(
                "x[{0}]".format(paramDict['CosThetaK']), "y")
            while arg:
                if any(
                        re.match(pat, arg.GetName()) for pat in
                    ["effi_norm", "hasXTerm", r"^l\d+\w*", r"^k\d+\w*"]):
                    effi_sigA_formula = effi_sigA_formula.replace(
                        'x[{0}]'.format(paramDict[arg.GetName()]),
                        "({0})".format(arg.getVal()))
                elif re.match(r"^x\d+\w*$", arg.GetName()):
                    effi_sigA_formula = effi_sigA_formula.replace(
                        'x[{0}]'.format(paramDict[arg.GetName()]),
                        "[{0}]".format(nPar))
                    floaters[nPar] = arg.GetName()
                    nPar = nPar + 1
                arg = args_it.Next()
            f2_effi_sigA = ROOT.TF2("f2_effi_sigA", effi_sigA_formula, -1, 1,
                                    -1, 1)
            return f2_effi_sigA

        if True:  #Using RooMinuit
            if False:  #Using {} optimization
                fitter = ROOT.StdFitter()
                minuit = fitter.Init(self.pdf, self.data)
                minuit.setStrategy(2)
                minuit.optimizeConst(1)
                minuit.setPrintLevel(0)
                self._nll = fitter.GetNLL()
                self.fitter = fitter.FitMigrad()
                self.fitter = fitter.FitHesse()
                self.fitter = fitter.FitMinos(
                    self.pdf.getParameters(self.data).selectByAttrib(
                        "Constant", 0))
            else:  #Using chi2 optimization
                self.fitter = self.pdf.chi2FitTo(self.data,
                                                 ROOT.RooFit.Minos(1),
                                                 ROOT.RooFit.Strategy(2),
                                                 ROOT.RooFit.Save(1),
                                                 ROOT.RooFit.PrintLevel(-1))
                self.fitter = self.pdf.chi2FitTo(self.data,
                                                 ROOT.RooFit.Minos(1),
                                                 ROOT.RooFit.Strategy(2),
                                                 ROOT.RooFit.Save(1),
                                                 ROOT.RooFit.PrintLevel(-1))
            self.fitter.Print("v")
            FitDBPlayer.UpdateToDB(
                self.process.dbplayer.odbfile,
                FitterCore.GetFitResult(self.name, "XTerm", self.fitter))

            setStyle()
            canvas = ROOT.TCanvas()
            latex = ROOT.TLatex()
            h2_effi_2D_comp = h2_accXrec.Clone("h2_effi_2D_comp")
            h2_effi_2D_comp.Reset("ICESM")
            pdfhist = h2_accXrec.Clone("pdfhist")
            pdfhist.Reset("ICESM")
            self.pdf.fillHistogram(pdfhist,
                                   ROOT.RooArgList(CosThetaL, CosThetaK))

            #Text plot comparison
            canvas2 = ROOT.TCanvas()
            for lBin, KBin in itertools.product(
                    list(range(1,
                               h2_effi_2D_comp.GetNbinsX() + 1)),
                    list(range(1,
                               h2_effi_2D_comp.GetNbinsY() + 1))):
                if h2_accXrec.GetBinContent(lBin, KBin) == 0:
                    h2_effi_2D_comp.SetBinContent(lBin, KBin, 0)
                    print(">> ** Warning ** Empty bins: (l, k)", lBin, KBin)
                else:
                    h2_effi_2D_comp.SetBinContent(
                        lBin, KBin,
                        pdfhist.GetBinContent(lBin, KBin) /
                        h2_accXrec.GetBinContent(lBin, KBin))

            ROOT.gStyle.SetPalette(
                ROOT.kLightTemperature)  #kColorPrintableOnGrey)
            h2_effi_2D_text = h2_effi_2D_comp.Clone(
                "h2_effi_2D_text")  #; h2_effi_2D_text.Reset("ICESM")
            h2_effi_2D_text.Draw("COLZ")
            h2_effi_2D_text.GetYaxis().SetTitleOffset(1)
            ROOT.gStyle.SetPaintTextFormat("6.4g")
            pdfhist.SetBarOffset(0.25)
            pdfhist.Draw("TEXT SAME")
            canvas2.SetRightMargin(0.115)
            canvas2.SetLeftMargin(0.1)
            h2_accXrec.SetBarOffset(0.)
            h2_accXrec.Draw("TEXT SAME")
            h2_effi_2D_comp.SetBarOffset(-0.25)
            h2_effi_2D_comp.Draw("TEXT SAME")
            ROOT.TLatex().DrawLatexNDC(
                0.12, 0.96,
                r"#scale[0.8]{{{latexLabel}}}".format(latexLabel=q2bins[
                    self.process.cfg['binKey']]['latexLabel']))

            canvas.cd()
            h2_effi_2D_comp.SetMinimum(0)
            h2_effi_2D_comp.SetMaximum(1.5)
            h2_effi_2D_comp.SetTitleOffset(1.6, "X")
            h2_effi_2D_comp.SetTitleOffset(1.8, "Y")
            h2_effi_2D_comp.SetTitleOffset(1.5, "Z")
            h2_effi_2D_comp.SetZTitle(
                "#varepsilon_{fit}/#varepsilon_{measured}")
            h2_effi_2D_comp.Draw("LEGO2")
            latex.DrawLatexNDC(
                .08, .93, "#font[61]{CMS} #font[52]{#scale[0.8]{Simulation}}")
            chi2ndf = self.fitter.minNll() / (
                h2_effi_2D_comp.GetNbinsX() * h2_effi_2D_comp.GetNbinsY() -
                self.pdf.getParameters(self.data).selectByAttrib(
                    "Constant", 0).getSize())
            latex.DrawLatexNDC(.08, .89,
                               "#chi^{{2}}/ndf={0:.2f}".format(chi2ndf))
            print("2D Efficiency Chi^2/ndf: ", chi2ndf)

        else:  #Using TMinuit (This section can be used only if pdf is defined in terms of expression (e.g. RooFormulaVar). Does not work for RooProdPdf or RooProduct)
            f2_effi_sigA = GetTFunction()
            fitter = ROOT.EfficiencyFitter()
            self.minimizer = fitter.Init(nPar, h2_accXrec, f2_effi_sigA)
            self.minimizer.SetPrintLevel(0)  #Pritam
            self.minimizer.mnexcm("SET STR", ctypes.c_double(2.), 1,
                                  ctypes.c_int(0))
            for xIdx in range(nPar):
                self.minimizer.DefineParameter(xIdx, floaters[xIdx], 0., 1E-4,
                                               -1E+2, 1E+2)
            MigStatus = self.minimizer.Migrad()
            MigStatus = self.minimizer.Migrad()
            MinosStatus = self.minimizer.Command("MINOS")

            # Check if efficiency is positive definite
            f2_max_x, f2_max_y = ctypes.c_double(0.), ctypes.c_double(.0)
            f2_min_x, f2_min_y = ctypes.c_double(0.), ctypes.c_double(.0)
            f2_effi_sigA.GetMaximumXY(f2_max_x, f2_max_y)
            f2_effi_sigA.GetMinimumXY(f2_min_x, f2_min_y)
            print("Sanitary check: Efficiency ranges from {0:.2e} to {1:.2e}".
                  format(f2_effi_sigA.Eval(f2_min_x, f2_min_y),
                         f2_effi_sigA.Eval(f2_max_x, f2_max_y)))
            EfficiencyFitter.isPosiDef(f2_effi_sigA)

            #Update parameter values
            parVal, parErr = ctypes.c_double(.0), ctypes.c_double(.0)
            eplus, eminus, eparab, gcc = ctypes.c_double(0.), ctypes.c_double(
                0.), ctypes.c_double(.0), ctypes.c_double(0.)
            for xIdx in range(nPar):
                self.minimizer.GetParameter(xIdx, parVal, parErr)
                self.minimizer.mnerrs(xIdx, eplus, eminus, eparab, gcc)
                arg = args.find(floaters[xIdx])
                arg.setVal(parVal.value)
                arg.setError(parErr.value)
                arg.setAsymError(eplus.value, eminus.value)

            # Plot comparison between fitting result to data
            setStyle()
            canvas = ROOT.TCanvas()
            latex = ROOT.TLatex()
            h2_effi_2D_comp = h2_accXrec.Clone("h2_effi_2D_comp")
            h2_effi_2D_comp.Reset("ICESM")
            pdfhist = h2_accXrec.Clone("pdfhist")
            pdfhist.Reset("ICESM")
            self.pdf.fillHistogram(pdfhist,
                                   ROOT.RooArgList(CosThetaL, CosThetaK))
            print(
                "2D Efficiency Chi^2/ndf: ",
                fitter.GetChi2() /
                (h2_effi_2D_comp.GetNbinsX() * h2_effi_2D_comp.GetNbinsY() -
                 nPar))
            print("TMinuit Status: ", self.minimizer.GetStatus(), MigStatus,
                  MinosStatus)

            #Text plot comparison
            canvas2 = ROOT.TCanvas()
            for lBin, KBin in itertools.product(
                    list(range(1,
                               h2_effi_2D_comp.GetNbinsX() + 1)),
                    list(range(1,
                               h2_effi_2D_comp.GetNbinsY() + 1))):
                if h2_accXrec.GetBinContent(lBin, KBin) == 0:
                    h2_effi_2D_comp.SetBinContent(lBin, KBin, 0)
                    print(">> ** Warning ** Empty bins: (l, k)", lBin, KBin)
                else:
                    h2_effi_2D_comp.SetBinContent(
                        lBin, KBin,
                        f2_effi_sigA.Eval(
                            h2_accXrec.GetXaxis().GetBinCenter(lBin),
                            h2_accXrec.GetYaxis().GetBinCenter(KBin)) /
                        h2_accXrec.GetBinContent(lBin, KBin))

            ROOT.gStyle.SetPalette(
                ROOT.kLightTemperature)  #kColorPrintableOnGrey)
            h2_effi_2D_text = h2_effi_2D_comp.Clone(
                "h2_effi_2D_text")  #; h2_effi_2D_text.Reset("ICESM")
            h2_effi_2D_text.Draw("COLZ")
            h2_effi_2D_text.GetYaxis().SetTitleOffset(1)
            ROOT.gStyle.SetPaintTextFormat("6.4g")
            pdfhist.SetBarOffset(0.25)
            pdfhist.Draw("TEXT SAME")
            canvas2.SetRightMargin(0.115)
            canvas2.SetLeftMargin(0.1)
            h2_accXrec.SetBarOffset(0.)
            h2_accXrec.Draw("TEXT SAME")
            h2_effi_2D_comp.SetBarOffset(-0.25)
            h2_effi_2D_comp.Draw("TEXT SAME")
            ROOT.TLatex().DrawLatexNDC(
                0.12, 0.96,
                r"#scale[0.8]{{{latexLabel}}}".format(latexLabel=q2bins[
                    self.process.cfg['binKey']]['latexLabel']))

            canvas.cd()
            h2_effi_2D_comp.SetMinimum(0)
            h2_effi_2D_comp.SetMaximum(1.5)
            h2_effi_2D_comp.SetTitleOffset(1.6, "X")
            h2_effi_2D_comp.SetTitleOffset(1.8, "Y")
            h2_effi_2D_comp.SetTitleOffset(1.5, "Z")
            h2_effi_2D_comp.SetZTitle(
                "#varepsilon_{fit}/#varepsilon_{measured}")
            h2_effi_2D_comp.Draw("LEGO2")
            latex.DrawLatexNDC(
                .08, .93, "#font[61]{CMS} #font[52]{#scale[0.8]{Simulation}}")
            latex.DrawLatexNDC(
                .08, .89, "#chi^{{2}}/ndf={0:.2f}".format(
                    fitter.GetChi2() / (h2_effi_2D_comp.GetNbinsX() *
                                        h2_effi_2D_comp.GetNbinsY() - nPar)))
            FitterCore.ArgLooper(args, lambda p: p.Print())

        ####################################
        path = os.path.join(modulePath, self.process.work_dir, "Efficiency")
        if not os.path.exists(path):
            os.mkdir(path)
        os.chdir(path)
        ####################################
        canvas.Print("effi_2D_comp{}_{}.pdf".format(
            self.cfg['label'], q2bins[self.process.cfg['binKey']]['label']))
        canvas2.cd()
        canvas2.Print("effi_2D_TEXT{}_{}.pdf".format(
            self.cfg['label'], q2bins[self.process.cfg['binKey']]['label']))
        os.chdir(os.path.join(modulePath, self.process.work_dir))
 def _postFitSteps(self):
     """Post-processing"""
     args = self.pdf.getParameters(self.data)
     self.ToggleConstVar(args, True)
     FitDBPlayer.UpdateToDB(self.process.dbplayer.odbfile, args)
示例#20
0
from __future__ import print_function

import os, sys, re, math, glob, shelve, pdb
from subprocess import call
from argparse import ArgumentParser
from multiprocessing import Pool

import ROOT
from BsToPhiMuMuFitter.anaSetup import modulePath, q2bins
from BsToPhiMuMuFitter.StdFitter import unboundFlToFl, unboundAfbToAfb
from BsToPhiMuMuFitter.plotCollection import Plotter
from BsToPhiMuMuFitter.python.datainput import allBins
from BsToPhiMuMuFitter.FitDBPlayer import FitDBPlayer

dbplayer = FitDBPlayer(
    absInputDir=os.path.join(modulePath, "input", "selected"))
targetBinKeys = [
    'summary'
]  #allBins #["belowJpsi", "betweenPeaks", "abovePsi2s", "summary"]
targetCoverage = 0.683


def worker_mergeToys(task_dir):
    print("INFO\t: Merge toys from {0}".format(task_dir))
    for binKey in targetBinKeys:
        for fileKey, wspaceKey in [("sigToyGenerator", "f_sig3DData"),
                                   ("bkgCombToyGenerator", "f_bkgCombData")]:
            files = glob.glob(
                args.batchDir + "/" + task_dir +
                "/*/{0}_{1}.root".format(fileKey, q2bins[binKey]['label']))
            merged_file = args.batchDir + "/" + task_dir + "/{0}_{1}.root".format(
示例#21
0
def func_postproc(args):
    """ Fit to fit result and make plots """
    GenResult = []
    RecoResult = []
    os.chdir(args.wrapper.task_dir)
    args.process.addService(
        "dbplayer",
        FitDBPlayer(absInputDir=os.path.join(modulePath, "plots_{}".format(
            args.Year))))
    binKeys = args.process.cfg['allBins'] if args.process.cfg[
        'args'].forall else args.process.cfg[
            'bins']  #Run over all bins if no binkey arg is supplied
    for binKey in binKeys:
        ifilename = "setSummary_{}_{}.root".format(
            "Simult" if args.SimFit else args.Year, q2bins[binKey]['label'])
        if not os.path.exists(ifilename) or args.forceHadd:
            call(["hadd", "-f", ifilename] +
                 glob.glob('*/setSummary_{}_{}.root'.format(
                     "Simult" if args.SimFit else args.Year, q2bins[binKey]
                     ['label'])))
        ifile = ROOT.TFile(ifilename)
        tree = ifile.Get("tree")
        Cuts = "covQual==3&&status==0&&hesse==0"

        binWidth = 0.01
        h_setSummary_afb = ROOT.TH1F("h_setSummary_afb", "",
                                     int(1.5 / binWidth), -0.75, 0.75)
        h_setSummary_fl = ROOT.TH1F("h_setSummary_fl", "", int(1. / binWidth),
                                    0., 1.)

        tree.Draw("afb>>h_setSummary_afb", Cuts)
        tree.Draw("fl>>h_setSummary_fl", Cuts)

        f_setSummary_afb = ROOT.TF1("f_setSummary_afb", "gaus",
                                    -0.75 + binWidth, 0.75 - binWidth)
        h_setSummary_afb.Fit("f_setSummary_afb")
        h_setSummary_afb.GetFunction("f_setSummary_afb").SetLineColor(4)

        f_setSummary_fl = ROOT.TF1("f_setSummary_fl", "gaus", binWidth,
                                   1 - binWidth)
        if binKey == "betweenPeaks":
            r = h_setSummary_fl.Fit("f_setSummary_fl", "S", "", 0.39, .8)
        else:
            r = h_setSummary_fl.Fit("f_setSummary_fl", "S")
        h_setSummary_fl.GetFunction("f_setSummary_fl").SetLineColor(4)

        # Draw
        db = shelve.open(
            os.path.join(args.process.dbplayer.absInputDir,
                         "fitResults_{0}.db".format(q2bins[binKey]['label'])),
            'r')
        fl_GEN = StdFitter.unboundFlToFl(db['unboundFl_GEN']['getVal'])
        afb_GEN = StdFitter.unboundAfbToAfb(db['unboundAfb_GEN']['getVal'],
                                            fl_GEN)
        line = ROOT.TLine()
        line.SetLineWidth(2)
        line.SetLineColor(2)
        line.SetLineStyle(9)
        plotCollection.Plotter.canvas.cd()

        h_setSummary_afb.SetXTitle("A_{6}")
        h_setSummary_afb.SetYTitle("Number of test samples")
        h_setSummary_afb.SetFillColor(ROOT.kGreen - 10)
        h_setSummary_afb.GetYaxis().SetRangeUser(
            0., 1.5 * h_setSummary_afb.GetMaximum())
        h_setSummary_afb.Draw()
        GetParams(f_setSummary_afb, h_setSummary_afb, binKey, afb_GEN, "a6")
        if args.drawGEN:
            line.DrawLine(afb_GEN, 0, afb_GEN, h_setSummary_afb.GetMaximum())
        plotCollection.Plotter.latexDataMarks(['mix'])
        plotCollection.Plotter.canvas.Print(
            "h_setSummary_mixedToyValidation_a6_{}_{}.pdf".format(
                "Simult" if args.SimFit else args.Year,
                q2bins[binKey]['label']))

        h_setSummary_fl.SetXTitle("F_{L}")
        h_setSummary_fl.SetYTitle("Number of test samples")
        h_setSummary_fl.SetFillColor(ROOT.kGreen - 10)
        h_setSummary_fl.GetYaxis().SetRangeUser(
            0., 1.5 * h_setSummary_fl.GetMaximum())
        h_setSummary_fl.Draw()
        GetParams(f_setSummary_fl, h_setSummary_fl, binKey, fl_GEN, "fl")
        if args.drawGEN:
            line.DrawLine(fl_GEN, 0, fl_GEN, h_setSummary_fl.GetMaximum())
        plotCollection.Plotter.latexDataMarks(['mix'])
        plotCollection.Plotter.canvas.Print(
            "h_setSummary_mixedToyValidation_fl_{}_{}.pdf".format(
                "Simult" if args.SimFit else args.Year,
                q2bins[binKey]['label']))
        Fl_GENErr = abs(
            StdFitter.unboundFlToFl(db['unboundFl_GEN']['getVal'] +
                                    db['unboundFl_GEN']['getError']) - fl_GEN)
        A6_GENErr = abs(
            StdFitter.unboundAfbToAfb(
                db['unboundAfb_GEN']['getVal'] +
                db['unboundAfb_GEN']['getError'], fl_GEN) - afb_GEN)
        GenResult.append((fl_GEN, Fl_GENErr, afb_GEN, A6_GENErr))
        RecoResult.append(
            (f_setSummary_fl.GetParameter(1), f_setSummary_fl.GetParameter(2),
             f_setSummary_afb.GetParameter(1),
             f_setSummary_afb.GetParameter(2)))

        if not args.process.cfg['args'].SimFit:
            from copy import deepcopy
            tree.Draw("nSig", Cuts)
            nSigHist = deepcopy(ROOT.gPad.GetPrimitive("htemp"))
            tree.Draw("nBkgComb", Cuts)
            nBkgCombHist = deepcopy(ROOT.gPad.GetPrimitive("htemp"))
            tree.Draw("nBkgPeak", Cuts)
            nBkgPeakHist = deepcopy(ROOT.gPad.GetPrimitive("htemp"))
            tree.Draw("entries", Cuts)
            nTotalHist = deepcopy(ROOT.gPad.GetPrimitive("htemp"))

            # Signal Event Distributions
            nSigHist.Draw()
            nSigHist.SetFillColor(ROOT.kBlue - 10)
            #nSigHist.SetLineColor(ROOT.kBlue)
            ROOT.TLatex().DrawLatexNDC(
                .73, .77,
                r"#scale[0.7]{{#color[4]{{Mean}}   : {param}}}".format(
                    param=round(nSigHist.GetMean(), 5)))
            ROOT.TLatex().DrawLatexNDC(
                .73, .73,
                r"#scale[0.7]{{#color[1]{{Samples}} : {param}}}".format(
                    param=round(nSigHist.GetEntries(), 0)))
            ROOT.TLatex().DrawLatexNDC(
                .73, .82, r"#scale[0.7]{{#color[2]{{nSig}} : {param}}}".format(
                    param=round(db['nSig']['getVal'], 0)))
            plotCollection.Plotter.canvas.Update()
            line.DrawLine(db['nSig']['getVal'], 0, db['nSig']['getVal'],
                          ROOT.gPad.GetUymax())
            ROOT.TLatex().DrawLatexNDC(
                .45, .89, r"#scale[0.8]{{{latexLabel}}}".format(
                    latexLabel=q2bins[binKey]['latexLabel']))
            plotCollection.Plotter.canvas.Print("h_nSig_{}_{}.pdf".format(
                args.Year, q2bins[binKey]['label']))

            #Bkg yield distribution
            nBkgCombHist.Draw()
            nBkgCombHist.SetFillColor(ROOT.kRed - 10)
            #nBkgCombHist.SetLineColor(ROOT.kRed)
            ROOT.TLatex().DrawLatexNDC(
                .73, .77,
                r"#scale[0.7]{{#color[2]{{Mean}}   : {param}}}".format(
                    param=round(nBkgCombHist.GetMean(), 5)))
            ROOT.TLatex().DrawLatexNDC(
                .73, .73,
                r"#scale[0.7]{{#color[1]{{Samples}} : {param}}}".format(
                    param=round(nBkgCombHist.GetEntries(), 0)))
            ROOT.TLatex().DrawLatexNDC(
                .73, .82, r"#scale[0.7]{{#color[2]{{nBkg}} : {param}}}".format(
                    param=round(db['nBkgComb']['getVal'], 0)))
            plotCollection.Plotter.canvas.Update()
            line.DrawLine(db['nBkgComb']['getVal'], 0,
                          db['nBkgComb']['getVal'], ROOT.gPad.GetUymax())
            ROOT.TLatex().DrawLatexNDC(
                .45, .89, r"#scale[0.8]{{{latexLabel}}}".format(
                    latexLabel=q2bins[binKey]['latexLabel']))
            plotCollection.Plotter.canvas.Print("h_nBkgComb_{}_{}.pdf".format(
                args.Year, q2bins[binKey]['label']))

            #Peaking Bkg yield distribution
            nBkgPeakHist.Draw()
            nBkgPeakHist.SetFillColor(ROOT.kGreen - 10)
            #nBkgPeakHist.SetLineColor(ROOT.kGreen)
            ROOT.TLatex().DrawLatexNDC(
                .73, .77,
                r"#scale[0.7]{{#color[3]{{Mean}}   : {param}}}".format(
                    param=round(nBkgPeakHist.GetMean(), 5)))
            ROOT.TLatex().DrawLatexNDC(
                .73, .73,
                r"#scale[0.7]{{#color[1]{{Samples}} : {param}}}".format(
                    param=round(nBkgPeakHist.GetEntries(), 0)))
            nPeak = db['PeakFrac']['getVal'] * db['nSig']['getVal']
            ROOT.TLatex().DrawLatexNDC(
                .73, .82,
                r"#scale[0.7]{{#color[2]{{nPeak}} : {param}}}".format(
                    param=round(nPeak, 0)))
            plotCollection.Plotter.canvas.Update()
            line.DrawLine(nPeak, 0, nPeak, ROOT.gPad.GetUymax())
            ROOT.TLatex().DrawLatexNDC(
                .45, .89, r"#scale[0.8]{{{latexLabel}}}".format(
                    latexLabel=q2bins[binKey]['latexLabel']))
            plotCollection.Plotter.canvas.Print("h_nBkgPeak_{}_{}.pdf".format(
                args.Year, q2bins[binKey]['label']))

            # Total yield distributions
            nTotalHist.Draw()
            nTotalHist.SetFillColor(ROOT.kBlue - 10)
            #nTotalHist.SetLineColor(ROOT.kBlue)
            ROOT.TLatex().DrawLatexNDC(
                .73, .77,
                r"#scale[0.7]{{#color[4]{{Mean}}   : {param}}}".format(
                    param=round(nTotalHist.GetMean(), 5)))
            ROOT.TLatex().DrawLatexNDC(
                .73, .73,
                r"#scale[0.7]{{#color[1]{{Samples}} : {param}}}".format(
                    param=round(nTotalHist.GetEntries(), 0)))
            nTotal = db['nBkgComb']['getVal'] + db['nSig']['getVal'] + nPeak
            ROOT.TLatex().DrawLatexNDC(
                .73, .82,
                r"#scale[0.7]{{#color[2]{{nTotal}} : {param}}}".format(
                    param=round(nTotal, 0)))
            plotCollection.Plotter.canvas.Update()
            line.DrawLine(nTotal, 0, nTotal, ROOT.gPad.GetUymax())
            ROOT.TLatex().DrawLatexNDC(
                .45, .89, r"#scale[0.8]{{{latexLabel}}}".format(
                    latexLabel=q2bins[binKey]['latexLabel']))
            plotCollection.Plotter.canvas.Print("h_nTotal_{}_{}.pdf".format(
                args.Year, q2bins[binKey]['label']))

        Hist2D = ROOT.TH2F("Hist2D", "title", 100, -1, 1, 100, 0., 1.05)
        tree.Draw("fl:afb>>Hist2D", Cuts)  #+"&&(fl-abs(afb))<=0.95")
        Hist2D.Draw("COLZ")
        Hist2D.GetXaxis().SetTitle("A_{6}")
        Hist2D.GetYaxis().SetTitle("F_{L}")
        ROOT.gPad.SetRightMargin(0.115)
        #ROOT.TColor.InvertPalette()
        #ROOT.TLine().DrawLine(-1, 0, 0, 1);        ROOT.TLine().DrawLine(0, 1, 1, 0);        ROOT.TLine().DrawLine(-1, 0, 1, 0)
        plotCollection.Plotter.canvas.Print("h2_{}_{}.pdf".format(
            "Simult" if args.SimFit else args.Year, q2bins[binKey]['label']))

        db.close()
    if args.process.cfg['args'].forall:
        GetSummaryGraph(binKeys,
                        RecoResult,
                        GenResult,
                        args,
                        pltName="mixedToy")
示例#22
0
pfile = ROOT.TFile.Open(modulePath + "/input/wspace_bin0.root")
wspace = pfile.Get('wspace.bin0')
pdf = wspace.obj('f_final')

#----------------------------
# Assemble TMinuit Minimizer
#----------------------------

#----------------------------
# Plot Post-Fit Distributions
#----------------------------
pdb.set_trace()
odbfile = modulePath + "/Plots/fitResults_bin0.db"
args = pdf.getParameters(
    ROOT.RooArgSet(Bmass, CosThetaK, CosThetaL, Mumumass, Phimass))
FitDBPlayer.initFromDB(odbfile, args)
args = pdf.getParameters(ROOT.RooArgSet(Bmass, CosThetaK, CosThetaL))

nSigDB = args.find('nSig').getVal()
nSigErrorDB = args.find('nSig').getError()
nBkgCombDB = args.find('nBkgComb').getVal()
nBkgCombErrorDB = args.find('nBkgComb').getError()

#flDB = unboundFlToFl(args.find('unboundFl').getVal())
#afbDB = unboundAfbToAfb(args.find('unboundAfb').getVal(), flDB)

###
obs = pdf.getObservables(data)
obs.find('Bmass').setRange("sigRegion", 5.2, 5.6)
Bmass.setRange("sigRegion")
sigFrac = pdf.createIntegral(obs, ROOT.RooFit.NormSet(obs),
def plotEfficiency(self, data_name, pdf_name):
    pltName = "effi"
    data = self.process.sourcemanager.get(data_name)
    pdf = self.process.sourcemanager.get(pdf_name)
    if data == None or pdf == None:
        self.logger.logWARNING("Skip plotEfficiency. pdf or data not found")
        return
    args = pdf.getParameters(data)
    FitDBPlayer.initFromDB(self.process.dbplayer.odbfile, args)

    binningL = ROOT.RooBinning(
        len(dataCollection.accXEffThetaLBins) - 1,
        dataCollection.accXEffThetaLBins)
    binningK = ROOT.RooBinning(
        len(dataCollection.accXEffThetaKBins) - 1,
        dataCollection.accXEffThetaKBins)

    data_accXrec = self.process.sourcemanager.get("effiHistReader.h2_accXrec")
    data_accXrec.Scale(100)
    data_accXrec.SetMinimum(0)
    #data_accXrec.SetMaximum(100 * 0.00015)  # Z axis in percentage
    data_accXrec.SetTitleOffset(1.6, "X")
    data_accXrec.SetTitleOffset(1.8, "Y")
    data_accXrec.SetTitleOffset(1.8, "Z")
    data_accXrec.SetZTitle("Efficiency [%]")
    data_accXrec.Draw("LEGO2")
    h2_effi_sigA_fine = pdf.createHistogram(
        "h2_effi_sigA_fine", CosThetaL, ROOT.RooFit.Binning(20),
        ROOT.RooFit.YVar(CosThetaK, ROOT.RooFit.Binning(20)))
    h2_effi_sigA_fine.Scale(100)
    h2_effi_sigA_fine.SetLineColor(2)
    h2_effi_sigA_fine.Draw("SURF SAME")
    Plotter.latexCMSSim(.08, .93)
    Plotter.latexCMSExtra(.08, .89)
    self.latexQ2(.40, .93)
    self.canvasPrint(pltName + "_2D")
    data_accXrec.Scale(0.01)

    cloned_frameL = Plotter.frameL.emptyClone("cloned_frameL")
    h_accXrec_fine_ProjectionX = self.process.sourcemanager.get(
        "effiHistReader.h_accXrec_fine_ProjectionX")
    data_accXrec_fine_ProjectionX = ROOT.RooDataHist(
        "data_accXrec_fine_ProjectionX", "", ROOT.RooArgList(CosThetaL),
        ROOT.RooFit.Import(h_accXrec_fine_ProjectionX))
    data_accXrec_fine_ProjectionX.plotOn(cloned_frameL,
                                         ROOT.RooFit.Rescale(100))
    pdfL = self.process.sourcemanager.get("effi_cosl")
    pdfL.plotOn(cloned_frameL,
                ROOT.RooFit.Normalization(100, ROOT.RooAbsReal.Relative),
                *plotterCfg_sigStyleNoFill)
    cloned_frameL.GetYaxis().SetTitle("Efficiency [%]")
    cloned_frameL.SetMaximum(1.5 * cloned_frameL.GetMaximum())
    cloned_frameL.Draw()
    Plotter.latexCMSSim()
    Plotter.latexCMSExtra()
    self.latexQ2()
    #  Plotter.latex.DrawLatexNDC(.85, .89, "#chi^{{2}}={0:.2f}".format(cloned_frameL.chiSquare()))
    self.canvasPrint(pltName + "_cosl")

    cloned_frameK = Plotter.frameK.emptyClone("cloned_frameK")
    h_accXrec_fine_ProjectionY = self.process.sourcemanager.get(
        "effiHistReader.h_accXrec_fine_ProjectionY")
    data_accXrec_fine_ProjectionY = ROOT.RooDataHist(
        "data_accXrec_fine_ProjectionY", "", ROOT.RooArgList(CosThetaK),
        ROOT.RooFit.Import(h_accXrec_fine_ProjectionY))
    data_accXrec_fine_ProjectionY.plotOn(cloned_frameK,
                                         ROOT.RooFit.Rescale(100))
    pdfK = self.process.sourcemanager.get("effi_cosK")
    pdfK.plotOn(cloned_frameK,
                ROOT.RooFit.Normalization(100, ROOT.RooAbsReal.Relative),
                *plotterCfg_sigStyleNoFill)
    cloned_frameK.GetYaxis().SetTitle("Efficiency [%]")
    cloned_frameK.SetMaximum(1.5 * cloned_frameK.GetMaximum())
    cloned_frameK.Draw()
    Plotter.latexCMSSim()
    Plotter.latexCMSExtra()
    self.latexQ2()
    #  Plotter.latex.DrawLatexNDC(.85, .89, "#chi^{{2}}={0:.2f}".format(cloned_frameK.chiSquare()))
    self.canvasPrint(pltName + "_cosK")
示例#24
0
    def _postFitSteps(self):
        """ Abstract: Do something after main fit loop"""

        for pdf, data in zip(self.pdf, self.data):
            self.ToggleConstVar(pdf.getParameters(data), True)

        cwd = os.getcwd()
        if self.process.cfg['args'].seqKey == 'fitBkgCombA':
            os.chdir(
                os.path.join(self.process.cwd, "plots_{0}".format(
                    self.process.cfg['args'].Year)))
        if self.cfg['saveToDB']:  #Update parameters to db file
            FitDBPlayer.UpdateToDB(
                self.process.dbplayer.odbfile,
                self.minimizer.getParameters(self.dataWithCategories),
                self.cfg['argAliasInDB']
                if self.cfg['argAliasSaveToDB'] else None)
        for pdf, data in zip(self.pdf,
                             self.data):  #Get parameter values from db file
            FitDBPlayer.initFromDB(self.process.dbplayer.odbfile,
                                   pdf.getParameters(data),
                                   aliasDict=self.cfg['argAliasInDB']
                                   if self.cfg['argAliasSaveToDB'] else None,
                                   exclude=None)
        os.chdir(cwd)
        """ofile = ROOT.TFile("../input/Simultaneous_{0}.root".format(q2bins[self.process.cfg['binKey']]['label']), "RECREATE")
        self.minimizer.Write()
        self.dataWithCategories.Write()
        self.category.Write()
        ofile.Close()"""

        self.cfg['source']["{0}.dataWithCategories".format(
            self.name)] = self.dataWithCategories
        self.cfg['source'][self.name] = self.minimizer
        self.cfg['source']["{0}.category".format(self.name)] = self.category
        sampleSet = ROOT.RooArgSet(self.category)
        self.cfg['source']['ProjWData'] = ROOT.RooFit.ProjWData(
            sampleSet, self.dataWithCategories)

        #Attach ProjWData Argument to plotter for getting combined fit
        #self.process._sequence[1].cfg['plots'][self.process._sequence[1].cfg['switchPlots'][0]]['kwargs']['pdfPlots'][0][1]=(ROOT.RooFit.ProjWData(sampleSet, self.dataWithCategories), ROOT.RooFit.LineColor(2), ROOT.RooFit.LineStyle(9))

        frameL = CosThetaL.frame(ROOT.RooFit.Bins(20))
        frameK = CosThetaK.frame(ROOT.RooFit.Bins(20))
        legendInstance = Plotter.legend
        c1 = ROOT.TCanvas()
        binKey = q2bins[self.process.cfg['binKey']]['label']
        if self.process.cfg['args'].seqKey in [
                'fitBkgCombA', 'fitFinal3D_WithKStar'
        ]:
            marks = None
        else:
            marks = ['sim']
        for ID, Category, Year in zip(range(len(self.Years)),
                                      self.cfg['category'], self.Years):
            CopyFrameL = frameL.Clone()
            self.category.setIndex(ID)
            sampleSet = ROOT.RooArgSet(self.category)
            self.dataWithCategories.plotOn(
                CopyFrameL,
                ROOT.RooFit.Cut("({0}==({0}::{1}))".format(
                    self.category.GetName(), Category)))
            self.minimizer.plotOn(
                CopyFrameL, ROOT.RooFit.Slice(self.category, Category),
                ROOT.RooFit.Components(self.pdf[ID].GetName()),
                ROOT.RooFit.ProjWData(sampleSet, self.dataWithCategories),
                ROOT.RooFit.LineStyle(ROOT.kSolid),
                ROOT.RooFit.LineColor(2 if self.process.cfg['args'].seqKey ==
                                      'fitBkgCombA' else 4)
            )  # ROOT.RooFit.Components( self.pdf[ID].GetName())
            CopyFrameL.SetMaximum(1.5 * CopyFrameL.GetMaximum())
            c1.Clear()
            CopyFrameL.Draw(
            ) if self.process.cfg['args'].NoPull else Plotter.DrawWithResidue(
                CopyFrameL)
            Plotter.latexQ2(self.process.cfg['binKey'])
            Plotter.latex.DrawLatexNDC(
                .45, .84, r"#scale[0.8]{{Events = {0:.2f}}}".format(
                    self.dataWithCategories.sumEntries("{0}=={0}::{1}".format(
                        self.category.GetName(), Category))))
            Plotter.latexDataMarks(marks=marks)
            legendInstance.Clear()
            legendInstance.AddEntry(
                CopyFrameL.getObject(0).GetName(), self.cfg['LegName'], "LPFE")
            legendInstance.Draw()
            c1.SaveAs("Simultaneous_Cosl_{0}_{1}_{2}.pdf".format(
                Category, self.process.cfg['args'].seqKey, binKey))

            CopyFrameK = frameK.Clone()
            self.dataWithCategories.plotOn(
                CopyFrameK,
                ROOT.RooFit.Cut("{0}=={0}::{1}".format(self.category.GetName(),
                                                       Category)))
            self.minimizer.plotOn(
                CopyFrameK, ROOT.RooFit.Slice(self.category, Category),
                ROOT.RooFit.Components(self.pdf[ID].GetName()),
                ROOT.RooFit.ProjWData(sampleSet, self.dataWithCategories),
                ROOT.RooFit.LineStyle(ROOT.kSolid),
                ROOT.RooFit.LineColor(2 if self.process.cfg['args'].seqKey ==
                                      'fitBkgCombA' else 4)
            )  #, ROOT.RooFit.Components(self.pdf[ID].GetName())
            CopyFrameK.SetMaximum(1.5 * CopyFrameK.GetMaximum())
            c1.Clear()
            CopyFrameK.Draw(
            ) if self.process.cfg['args'].NoPull else Plotter.DrawWithResidue(
                CopyFrameK)
            Plotter.latexQ2(self.process.cfg['binKey'])
            Plotter.latex.DrawLatexNDC(
                .45, .84, r"#scale[0.8]{{Events = {0:.2f}}}".format(
                    self.dataWithCategories.sumEntries("{0}=={0}::{1}".format(
                        self.category.GetName(), Category))))
            Plotter.latexDataMarks(marks=marks)
            legendInstance.Clear()
            legendInstance.AddEntry(
                CopyFrameK.getObject(0).GetName(), self.cfg['LegName'], "LPFE")
            legendInstance.Draw()
            c1.SaveAs("Simultaneous_CosK_{0}_{1}_{2}.pdf".format(
                Category, self.process.cfg['args'].seqKey, binKey))
示例#25
0
def func_randEffi(args):
    """ Typically less than 5% """
    setupFinalRandEffiFitter = deepcopy(fitCollection.setupFinalFitter)
    setupFinalRandEffiFitter.update({
        'FitMinos': [False, ()],
        'argAliasInDB': {'afb': 'afb_randEffi', 'fl': 'fl_randEffi', 'fs': 'fs_randEffi', 'as': 'as_randEffi'},
        'saveToDB': False,
    })
    finalRandEffiFitter = StdFitter(setupFinalRandEffiFitter)

    def preFitSteps_randEffi(self):
        self.args = self.pdf.getParameters(self.data)
        self._preFitSteps_initFromDB()

        # Fluctuate cross-term correction
        effiArgs = ROOT.RooArgSet()
        FitterCore.ArgLooper(self.args, lambda iArg: effiArgs.add(iArg), targetArgs=[r"x\d{1,2}"])
        FitDBPlayer.fluctuateFromDB(self.process.dbplayer.odbfile, effiArgs, self.cfg['argAliasInDB'])

        self._preFitSteps_vetoSmallFs()
        self._preFitSteps_preFit()

    finalRandEffiFitter._preFitSteps = types.MethodType(preFitSteps_randEffi, finalRandEffiFitter)

    foutName = "syst_randEffi_{0}.root".format(q2bins[args.binKey]['label'])
    class effiStudier(AbsToyStudier):
        def _preSetsLoop(self):
            self.hist_afb = ROOT.TH1F("hist_afb", "", 300, -0.75, 0.75)
            self.hist_afb.GetXaxis().SetTitle("A_{{FB}}")
            self.hist_fl = ROOT.TH1F("hist_fl", "", 200, 0., 1.)
            self.hist_fl.GetXaxis().SetTitle("F_{{L}}")

        def _preRunFitSteps(self, setIndex):
            pass

        def _postRunFitSteps(self, setIndex):
            if self.fitter.fitResult["{0}.migrad".format(self.fitter.name)]['status'] == 0:
                afb = self.process.sourcemanager.get('afb')
                fl = self.process.sourcemanager.get('fl')
                self.hist_afb.Fill(afb.getVal())
                self.hist_fl.Fill(fl.getVal())

        def _postSetsLoop(self):
            fout = ROOT.TFile(foutName, "RECREATE")
            fout.cd()
            self.hist_afb.Write()
            self.hist_fl.Write()
            fout.Close()

        def getSubDataEntries(self, setIndex):
            return 1

        def getSubData(self):
            while True:
                yield self.data

    setupStudier = deepcopy(effiStudier.templateConfig())
    setupStudier.update({
        'name': "effiStudier",
        'data': "dataReader.Fit",
        'fitter': finalRandEffiFitter,
        'nSetOfToys': 200,
    })
    studier = effiStudier(setupStudier)

    p.setSequence([
        pdfCollection.stdWspaceReader,
        dataCollection.dataReader,
        studier,
    ])

    try:
        p.beginSeq()
        if os.path.exists("{0}".format(foutName)):
            print("{0} exists, skip fitting procedure".format(foutName))
        else:
            p.runSeq()

        fin = ROOT.TFile("{0}".format(foutName))

        hist_fl = fin.Get("hist_fl")
        gaus_fl = ROOT.TF1("gaus_fl", "gaus(0)", 0, 1)
        hist_fl.Fit(gaus_fl, "WI")

        hist_afb = fin.Get("hist_afb")
        gaus_afb = ROOT.TF1("gaus_afb", "gaus(0)", -0.75, 0.75)
        hist_afb.Fit(gaus_afb, "WI")

        syst_randEffi = {
            'syst_randEffi_fl': {
                'getError': gaus_fl.GetParameter(2),
                'getErrorHi': gaus_fl.GetParameter(2),
                'getErrorLo': -gaus_fl.GetParameter(2),
            },
            'syst_randEffi_afb': {
                'getError': gaus_afb.GetParameter(2),
                'getErrorHi': gaus_afb.GetParameter(2),
                'getErrorLo': -gaus_afb.GetParameter(2),
            }
        }
        print(syst_randEffi)

        if args.updatePlot:
            canvas = Plotter.canvas.cd()
            hist_afb.Draw("HIST")
            Plotter.latexCMSMark()
            Plotter.latexCMSExtra()
            Plotter.latexCMSSim()
            canvas.Print("syst_randEffi_afb_{0}.pdf".format(q2bins[args.binKey]['label']))

            hist_fl.GetXaxis().SetTitle("F_{{L}}")
            hist_fl.Draw("HIST")
            Plotter.latexCMSMark()
            Plotter.latexCMSExtra()
            Plotter.latexCMSSim()
            canvas.Print("syst_randEffi_fl_{0}.pdf".format(q2bins[args.binKey]['label']))

        if args.updateDB:
            FitDBPlayer.UpdateToDB(p.dbplayer.odbfile, syst_randEffi)
    finally:
        p.endSeq()