def plotLimits():
    mkdir(os.path.join(limitsDir, args.outDirName))
    for mass in args.massPoints:
        plotLimitsByMass(mass)
    for category in sorted(categoriesToUse):
        if names2RepsToUse[category] in args.categoriesToSkip:
            continue
        plotLimitsByCategory(category)
    for combination in sorted(combinationsToUse):
        if combination in args.categoriesToSkip:
            continue
        plotLimitsByCategory(combination)
Example #2
0
def categories():
    #
    # prepare the submission/output dirs
    #
    outDir = os.path.join(combineoutputDir, args.outDirName)
    mkdir(outDir)
    submitDir = os.path.join(combinesubmissionsDir, args.outDirName)
    mkdir(submitDir)

    #
    # Do each Category separately
    #
    import definitions as defs
    cmds = []
    for category in categoriesToUse:
        if names2RepsToUse[category] in args.categoriesToSkip:
            continue
        datacard = os.path.join(
            datacardsworkspacesDir, args.inDirName,
            "datacard__{category}__{signalModel}.root".format(
                category=names2RepsToUse[category],
                signalModel=args.signalModel))
        for massPoint in args.massPoints:
            # set the mass for splines
            physicsModelParametersToSet["MH"] = massPoint

            outputModifier = names2RepsToUse[category] + "__" + \
                str(massPoint) + "__" + args.signalModel
            cmdToRun = "combine -M {method} -m {mass} -n {outputModifier} -d {datacard} --setPhysicsModelParameters {physicsModelParametersToSet} --freezeNuisances {nuisancesToFreeze}".format(
                method=args.method,
                mass=massPoint,
                outputModifier=outputModifier,
                datacard=datacard,
                physicsModelParametersToSet=map2string(
                    physicsModelParametersToSet),
                nuisancesToFreeze=",".join(nuisancesToFreeze))
            cmd = defs.Command(category, [cmdToRun])
            cmds.append(cmd)

    label = "%s_%s_%s" % ("categories", args.method, args.signalModel)
    createLaunchers(cmds, submitDir, label)
def biasScan():
    biasScanResultsDir = os.path.join(biasScanDir, args.outDirName)
    combineoutputPathDir = os.path.join(combineoutputDir, args.outDirName)
    workspacesDir = os.path.join(datacardsworkspacesDir, args.workspacesDirName)
    mkdir(biasScanResultsDir)
    hMeans = {}
    hMedians = {}
    for category in categoriesToUse:
        if names2RepsToUse[category] in args.categoriesToSkip:
            continue

        # extract the multi pdf
        workspaceFileName = "workspace__{category}__{signalModel}.root".format(
            category=names2RepsToUse[category], signalModel=args.signalModel)
        refWorkspaceFile = R.TFile(os.path.join(workspacesDir, workspaceFileName))
        higgsWorkspace = refWorkspaceFile.Get("higgs")
        multipdf = higgsWorkspace.pdf("multipdf_{category}".format(
            category=names2RepsToUse[category]))

        for massPoint in args.massPoints:
            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)] = R.TH2D("Means_{category}_{mass}".format(category=category, mass=massPoint), "Means", multipdf.getNumPdfs()+1, 0, multipdf.getNumPdfs()+1,
                multipdf.getNumPdfs()+1, 0, multipdf.getNumPdfs()+1)
            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)] = R.TH2D("Madians_{category}_{mass}".format(category=category, mass=massPoint), "Medians", multipdf.getNumPdfs()+1, 0, multipdf.getNumPdfs()+1,
                multipdf.getNumPdfs()+1, 0, multipdf.getNumPdfs()+1)

            for iref in range(multipdf.getNumPdfs()):
                refPdfName = multipdf.getPdf(iref).GetName()
                q = False
                for xxx in args.modelsToSkip:
                    if xxx==refPdfName.split("_")[0]:
                        q = True
                if q==True: continue
                for icurrent in range(multipdf.getNumPdfs()):
                    fitPdfName = multipdf.getPdf(icurrent).GetName()
                    q = False
                    for xxx in args.modelsToSkip:
                        if xxx==fitPdfName.split("_")[0]:
                            q = True
                    if q==True: continue
                    canvas = R.TCanvas("c1", "c1", 1000, 600)
                    try:
                        fileName = "mlfit{category}__{mass}__{iref}__{icurrent}__{signalModel}.root".format(category=names2RepsToUse[category], mass=massPoint, iref=iref, icurrent=icurrent, signalModel=args.signalModel)
                        f = R.TFile(os.path.join(combineoutputPathDir, fileName))
                        tree = f.Get("tree_fit_sb")
                        tree.Draw("(mu-1)/muErr>>h(500, -5,5)")

                        # get the histogram and perform some manipulations
                        hist = R.gFile.Get("h")
                        import array
                        probs = array.array("d", [0.5])
                        quantiles = array.array("d", [0])
                        hist.GetQuantiles(1, quantiles, probs)

                        latex = R.TLatex()
                        latex.SetNDC()
                        latex.SetTextSize(0.02)
                        latex.SetTextAlign(13) # align at top
                        latex.SetTextSize(0.03)
                        latex.DrawLatex(0.2, 0.8, "Median = " + str(quantiles[0]))

                        hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].Fill(iref, icurrent, hist.GetMean()*100)
                        hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].GetXaxis().SetBinLabel(iref+1, refPdfName)
                        hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].GetYaxis().SetBinLabel(icurrent+1, fitPdfName)
                        hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].Fill(iref, icurrent, quantiles[0]*100)
                        hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].GetXaxis().SetBinLabel(iref+1, refPdfName)
                        hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].GetYaxis().SetBinLabel(icurrent+1, fitPdfName)


                        cfileName = "pull__{category}__{mass}__{iref}__{icurrent}__{signalModel}.png".format(category=names2RepsToUse[category], mass=massPoint, iref=iref, icurrent=icurrent, signalModel=args.signalModel)
                        canvas.SaveAs(os.path.join(biasScanResultsDir, cfileName))
                    except Exception as exc:
                        print "There was a problem with file: {file}\n".format(file=fileName)
                        print type(exc)
                        print exc.args
                        print exc
                    finally:
                        f.Close()
            # plot the 2D
            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].SetTitle("Mean (#mu_{fit} - #mu_{0})/#sigma #mu_{fit} (%%), %s, %d GeV" % (category, massPoint))
            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].SetStats(0)
            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].GetYaxis().SetTitle("Fit Model")
            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].GetXaxis().SetTitle("Reference Model")
#            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].GetXaxis().SetRangeUser(0,5)
#            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].GetYaxis().SetRangeUser(0,5)
            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].GetZaxis().SetRangeUser(-100,+100)
            hMeans["Mean_{category}_{mass}".format(category=category, mass=massPoint)].Draw("COLZTEXT")
            canvas.SaveAs(os.path.join(biasScanResultsDir, "pullMeans2D__{category}__{mass}__{signalModel}.png".format(
                category=names2RepsToUse[category], mass=massPoint, signalModel=args.signalModel)))
            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].SetTitle("Median (#mu_{fit} - #mu_{0})/#sigma #mu_{fit} (%%), %s, %d GeV" % (category, massPoint))
            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].SetStats(0)
            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].GetYaxis().SetTitle("Fit Model")
            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].GetXaxis().SetTitle("Reference Model")
#            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].GetXaxis().SetRangeUser(0,5)
#            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].GetYaxis().SetRangeUser(0,5)
            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].GetZaxis().SetRangeUser(-100,+100)
            hMedians["Median_{category}_{mass}".format(category=category, mass=massPoint)].Draw("COLZTEXT")
            canvas.SaveAs(os.path.join(biasScanResultsDir, "pullMedians2D__{category}__{mass}__{signalModel}.png".format(
                category=names2RepsToUse[category], mass=massPoint, signalModel=args.signalModel)))
Example #4
0

def map2string(m, sep=","):
    return ",".join(["{key}={value}".format(key=x, value=m[x]) for x in m])


#######################
### Directory Setup ###
#######################
projectDirLocal = "/Users/vk/software/Analysis/files/analysis_results/"
projectDirLxplus = "/afs/cern.ch/work/v/vkhriste/Projects/HiggsAnalysis/analysis_results"
cmsswDir = "/afs/cern.ch/work/v/vkhriste/Projects/HiggsAnalysis/CMSSW_7_4_9/src"
projectDirToUse = projectDirLxplus
histDir = os.path.join(projectDirToUse, "results", jobLabel)
distributionsDir = os.path.join(projectDirToUse, "distributions", jobLabel)
aux.mkdir(distributionsDir)
backgroundfitsDir = os.path.join(projectDirToUse, "backgroundfits", jobLabel)
aux.mkdir(backgroundfitsDir)
signalfitsDir = os.path.join(projectDirToUse, "signalfits", jobLabel)
aux.mkdir(signalfitsDir)
singalfitinterpolationsDir = os.path.join(projectDirToUse,
                                          "signalfitinterpolations", jobLabel)
aux.mkdir(singalfitinterpolationsDir)
signalfitinterpolationswithsplineDir = os.path.join(
    projectDirToUse, "signalfitinterpolationswithspline", jobLabel)
aux.mkdir(signalfitinterpolationswithsplineDir)
backgroundfitswithroomultipdfDir = os.path.join(
    projectDirToUse, "backgroundfitswithroomultipdf", jobLabel)
aux.mkdir(backgroundfitswithroomultipdfDir)
datacardsworkspacesDir = os.path.join(projectDirToUse, "datacardsworkspaces",
                                      jobLabel)
Example #5
0
def biasScan():
    R.gSystem.Load("libHiggsAnalysisCombinedLimit.so")

    #
    # prepare the submission/output dirs
    #
    outDir = os.path.join(combineoutputDir, args.outDirName)
    mkdir(outDir)
    submitDir = os.path.join(combinesubmissionsDir, args.outDirName)
    mkdir(submitDir)
    workspacesDir = os.path.join(datacardsworkspacesDir, args.inDirName)

    #
    # perform the scan
    #
    import definitions as defs
    cmds = []
    ourNuisances = nuisancesToFreeze
    for category in categoriesToUse:
        if names2RepsToUse[category] in args.categoriesToSkip:
            continue
        datacard = os.path.join(
            datacardsworkspacesDir, args.inDirName,
            "datacard__{category}__{signalModel}.root".format(
                category=names2RepsToUse[category],
                signalModel=args.signalModel))
        # add the current pdfindex to the list of nuisances to be frozen
        ourNuisances.append(
            "pdfindex_{category}".format(category=names2RepsToUse[category]))

        # get the current workspace
        workspaceFileName = "workspace__{category}__{signalModel}.root".format(
            category=names2RepsToUse[category], signalModel=args.signalModel)
        currentWorkspaceFile = R.TFile(
            os.path.join(workspacesDir, workspaceFileName))
        higgsWorkspace = currentWorkspaceFile.Get("higgs")
        # get all the variables
        allVariables = higgsWorkspace.allVars().contentsString().split(",")
        # get the multipdf
        multipdf = higgsWorkspace.pdf(
            "multipdf_{category}".format(category=names2RepsToUse[category]))
        for massPoint in args.massPoints:
            physicsModelParametersToSet["MH"] = massPoint
            # iterate thru all of the pdfs in our envelope
            for iref in range(multipdf.getNumPdfs()):
                # this is list of cmd strings that have to go as a single Command!
                cmdStrings = []
                # set the pdfindex_category to the iref
                physicsModelParametersToSet["pdfindex_{category}".format(
                    category=names2RepsToUse[category])] = iref

                outputModifierGenerateOnly = names2RepsToUse[category] + "__" + \
                    str(massPoint) + "__" + str(iref) + "__" + args.signalModel
                # retrieve the names of all other parameters
                # that we have to fix. Given that we fit with ibkg
                # parameters of other models must be frozen
                # for the fit to be executed 100% correctly!!!
                otherModelsParametersToFreezeForGenOnly = []
                for var in allVariables:
                    for ipdf in range(multipdf.getNumPdfs()):
                        if iref == ipdf: continue
                        currentPdfName = multipdf.getPdf(ipdf).GetName()
                        if currentPdfName in var:
                            otherModelsParametersToFreezeForGenOnly.append(var)
                            break
                # generate the toys command
                cmdStrings.append("# GenerateOnly\n")
                cmdGenerateOnly = "combine -d {datacard} -n {outputModifier} -M GenerateOnly --setPhysicsModelParameters {physicsModelParametersToSet} --toysFrequentist -t {nToys} -s {seed} --expectSignal {injectSignal} --saveToys -m {mass} --freezeNuisances {nuisancesToFreeze}".format(
                    datacard=datacard,
                    mass=massPoint,
                    outputModifier=outputModifierGenerateOnly,
                    physicsModelParametersToSet=map2string(
                        physicsModelParametersToSet),
                    nuisancesToFreeze=",".join(
                        ourNuisances +
                        otherModelsParametersToFreezeForGenOnly),
                    nToys=nToys,
                    seed="$SEED",
                    injectSignal=args.injectSig)
                cmdStrings.append(cmdGenerateOnly)
                for ibkg in range(multipdf.getNumPdfs()):
                    currentPdfName = multipdf.getPdf(ibkg).GetName()
                    # retrieve the names of all other parameters
                    # that we have to fix. Given that we fit with ibkg
                    # parameters of other models must be frozen
                    # for the fit to be executed 100% correctly!!!
                    otherModelsParametersToFreeze = []
                    for var in allVariables:
                        for ipdf in range(multipdf.getNumPdfs()):
                            if ibkg == ipdf: continue
                            currentPdfName = multipdf.getPdf(ipdf).GetName()
                            if currentPdfName in var:
                                otherModelsParametersToFreeze.append(var)
                                break
                    # set the pdfindex_category to the model that
                    # we are going to fit our toy's reference with!
                    physicsModelParametersToSet["pdfindex_{category}".format(
                        category=names2RepsToUse[category])] = ibkg
                    outputModifier = names2RepsToUse[category] + "__" + \
                        str(massPoint) + "__" + str(iref) + "__" + str(ibkg) + \
                        "__" + args.signalModel
                    # perform the fit for that function
                    cmdStrings.append("# MaxLikelihoodFit\n")
                    cmdMaxLikelihoodFit = "combine -d {datacard} -M MaxLikelihoodFit  --setPhysicsModelParameters {physicsModelParametersToSet} --toysFile higgsCombine{outputModifierGenerateOnly}.GenerateOnly.mH{mass}.{seed}.root  -t {nToys} -s {seed} --rMin -20 --rMax 20 --freezeNuisances {nuisancesToFreeze} -m {mass} -n {outputModifier} --saveShapes --robustFit 1 --initFromBonly --maxFailedSteps 100 --stepSize 0.01".format(
                        datacard=datacard,  ## --saveShapes --plots
                        physicsModelParametersToSet=map2string(
                            physicsModelParametersToSet),
                        outputModifierGenerateOnly=outputModifierGenerateOnly,
                        mass=massPoint,
                        nuisancesToFreeze=",".join(
                            ourNuisances + otherModelsParametersToFreeze),
                        outputModifier=outputModifier,
                        seed="$SEED",
                        nToys=nToys)
                    cmdStrings.append(cmdMaxLikelihoodFit)
                    if nIter != 1:
                        cmdStrings.append(
                            "rename mlfit saveShapes_${SEED} mlfit*.root")
                # create a single Command
                # We must not split Generation[iref] + Fit[iref, *]
                # this is exactly what we do - splitting on
                # iref!
                cmd = defs.Command(category, cmdStrings)
                cmds.append(cmd)
            # remove that pdfindex..... from the dictionary!
            del physicsModelParametersToSet["pdfindex_{category}".format(
                category=names2RepsToUse[category])]


#            cmd = defs.Command(category, cmdStrings)
#            cmds.append(cmd)
# remove the current pdfindex from the list of nuisances to be frozen!
        ourNuisances.remove(
            "pdfindex_{category}".format(category=names2RepsToUse[category]))

    label = "biasScan_{signalModel}".format(signalModel=args.signalModel)
    createLaunchers(cmds, submitDir, label)
Example #6
0
}
physicsModelParametersToSet = {}
nuisancesToFreeze = ["MH"]
def map2string(m, sep=","):
    return ",".join(["{key}={value}".format(key=x, value=m[x]) for x in m])

#######################
### Directory Setup ###
#######################
projectDirLocal = "/Users/vk/software/Analysis/files/analysis_results/"
projectDirLxplus = "/afs/cern.ch/work/v/vkhriste/Projects/HiggsAnalysis/analysis_results"
cmsswDir = "/afs/cern.ch/work/v/vkhriste/Projects/HiggsAnalysis/CMSSW_7_4_9/src"
projectDirToUse = projectDirLxplus
histDir = os.path.join(projectDirToUse, "results", jobLabel)
distributionsDir = os.path.join(projectDirToUse, "distributions", jobLabel);
aux.mkdir(distributionsDir)
backgroundfitsDir = os.path.join(projectDirToUse, "backgroundfits", jobLabel)
aux.mkdir(backgroundfitsDir)
signalfitsDir = os.path.join(projectDirToUse, "signalfits", jobLabel)
aux.mkdir(signalfitsDir)
singalfitinterpolationsDir = os.path.join(projectDirToUse, "signalfitinterpolations", jobLabel)
aux.mkdir(singalfitinterpolationsDir)
signalfitinterpolationswithsplineDir = os.path.join(projectDirToUse, "signalfitinterpolationswithspline", jobLabel)
aux.mkdir(signalfitinterpolationswithsplineDir)
backgroundfitswithroomultipdfDir = os.path.join(projectDirToUse, "backgroundfitswithroomultipdf", jobLabel)
aux.mkdir(backgroundfitswithroomultipdfDir)
datacardsworkspacesDir = os.path.join(projectDirToUse, "datacardsworkspaces", jobLabel)
aux.mkdir(datacardsworkspacesDir)
combineoutputDir = os.path.join(projectDirToUse, "combineoutput", jobLabel)
aux.mkdir(combineoutputDir)
combinesubmissionsDir = os.path.join(projectDirToUse, "combinesubmissions", jobLabel)