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)
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)))
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)
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)
} 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)