def addToDatacards(myDir, massPoints, dataCardList, rootFileList, dataCardPattern, rootFilePattern): m = DatacardReader.getMassPointsForDatacardPattern(myDir, dataCardPattern) if len(m) > 0: m = DatacardReader.getMassPointsForDatacardPattern(myDir, dataCardPattern, massPoints) del massPoints[:] massPoints.extend(m) dataCardList.append(dataCardPattern) rootFileList.append(rootFilePattern)
def addToDatacards(myDir, massPoints, dataCardList, rootFileList, dataCardPattern, rootFilePattern): if rootFilePattern != None and "%s" in dataCardPattern: m = DatacardReader.getMassPointsForDatacardPattern(myDir, dataCardPattern) if len(m) > 0: m = DatacardReader.getMassPointsForDatacardPattern(myDir, dataCardPattern, massPoints) del massPoints[:] massPoints.extend(m) dataCardList.append(dataCardPattern) rootFileList.append(rootFilePattern) else: if os.path.exists(dataCardPattern): dataCardList.append(dataCardPattern) rootFileList.append(rootFilePattern)
def addToDatacards(myDir, massPoints, dataCardList, rootFileList, dataCardPattern, rootFilePattern): if rootFilePattern != None and "%s" in dataCardPattern: m = DatacardReader.getMassPointsForDatacardPattern( myDir, dataCardPattern) if len(m) > 0: m = DatacardReader.getMassPointsForDatacardPattern( myDir, dataCardPattern, massPoints) del massPoints[:] massPoints.extend(m) dataCardList.append(dataCardPattern) rootFileList.append(rootFilePattern) else: if os.path.exists(dataCardPattern): dataCardList.append(dataCardPattern) rootFileList.append(rootFilePattern)
def doPlot(opts,mass,nameList,allShapeNuisances,luminosity,myDatacardPattern,rootFilePattern,signalTable): f = ROOT.TFile.Open(rootFilePattern%mass) content = f.GetListOfKeys() # Suppress the warning message of missing dictionary for some iterator backup = ROOT.gErrorIgnoreLevel ROOT.gErrorIgnoreLevel = ROOT.kError diriter = content.MakeIterator() ROOT.gErrorIgnoreLevel = backup # Find the datacard and nuisance names myCardReader = DatacardReader.DataCardReader(".", mass, myDatacardPattern, rootFilePattern) myDatasetNames = myCardReader.getDatasetNames() # Find the name stem and the name of the uncertainties datasets = [] shapes = [] for d in myDatasetNames: myLabel = d myStatus = not d in nameList if d == myDatasetNames[0]: myStatus = True if not str(mass) in d: myLabel = "%sm%d"%(d,mass) myShapeNuisanceNames = myCardReader.getShapeNuisanceNames(d) myFilteredShapeNuisances = [] for n in myShapeNuisanceNames: if not "statBin" in n and not n.endswith("_statUp") and not n.endswith("_statDown"): myFilteredShapeNuisances.append(n) if myStatus: myDataset = DatasetContainer(column=d, label=myLabel, nuisances=myFilteredShapeNuisances, cardReader=myCardReader) datasets.append(myDataset) nameList.append(d) for n in myFilteredShapeNuisances: if not n in shapes: shapes.append(n) rebinList = None #rebinList = [0,200,250,300,350,400,450,500,550,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500] ## Do the actual plots for d in datasets: #d.debug() d.doPlot(opts,shapes,f,mass,luminosity,signalTable,rebinList) # Close the file f.Close()
def produceScaledCards(self, mHp, tanbeta): if self.resultExists(mHp, tanbeta): return # Obtain branching and sigma from MSSM model database self._readFromDatabase(mHp, tanbeta) if self._results[constructResultKey(mHp, tanbeta)]["sigmaTheory"] == None: return #print " Scaled '%s/%s' signal in datacards by branching %f (mHp=%s, tanbeta=%.1f)"%(mySignalScaleFactor, mHp, tanbeta) # Obtain theoretical uncertinties from MSSM model database myDbInputName = _modelPattern % self._mssmModel if not os.path.exists(myDbInputName): raise Exception("Error: Cannot find file '%s'!" % myDbInputName) # Scale datacards myResult = self.getResult(mHp, tanbeta) for fskey in self._decayModeMatrix.keys(): print " . final state %10s:" % fskey myOriginalRates = [] myPrimaryReader = None for dmkey in self._decayModeMatrix[fskey].keys(): myDatacardPattern = self._decayModeMatrix[fskey][dmkey][0] myRootFilePattern = self._decayModeMatrix[fskey][dmkey][1] if myRootFilePattern != None: mySignalScaleFactor = myResult["%sTheory" % dmkey] # Leave reader for first key open if dmkey == self._decayModeMatrix[fskey].keys()[0]: if not "_Control_" in myDatacardPattern: # Skip control cards (they have no signal) myPrimaryReader = DatacardReader.DataCardReader( ".", mHp, myDatacardPattern, myRootFilePattern, rootFileDirectory="", readOnly=False) myPrimaryReader.scaleSignal(mySignalScaleFactor) myOriginalRates.append( float( myPrimaryReader.getRateValue( myPrimaryReader.getDatasetNames()[0]))) #print fskey,dmkey,myOriginalRates[len(myOriginalRates)-1] else: # Scale according to br and add signal to primary (i.e. only one datacard for the decay modes) myReader = DatacardReader.DataCardReader( ".", mHp, myDatacardPattern, myRootFilePattern, rootFileDirectory="", readOnly=False) myReader.scaleSignal(mySignalScaleFactor) myOriginalRates.append( float( myReader.getRateValue( myReader.getDatasetNames()[0]))) #print fskey,dmkey,myOriginalRates[len(myOriginalRates)-1] myPrimaryReader.addSignal(myReader) myReader.close() # Remove datacard from current directory so that it is not used for limit calculation (a copy of them is at originalDatacards directory) if os.path.exists(myDatacardPattern % mHp): os.system("rm %s" % (myDatacardPattern % mHp)) os.system("rm %s" % (myRootFilePattern % mHp)) if myPrimaryReader != None: mySignalColumnName = myPrimaryReader.getDatasetNames()[0] myUpdatedRate = float( myPrimaryReader.getRateValue( myPrimaryReader.getDatasetNames()[0])) myTheorUncertPrefix = "theory_" # Add theoretical cross section uncertainties to datacard db = BRXSDB.BRXSDatabaseInterface(myDbInputName, silentStatus=True) myXsecUncert = [0.0, 0.0] if float(mHp) > 179: myXsecUncert = [ db.xsecUncertOrig("mHp", "tanb", "", mHp, tanbeta, "-"), db.xsecUncertOrig("mHp", "tanb", "", mHp, tanbeta, "+") ] if self._separateTheoreticalXsectionAndBrUncertainties: myNuisanceName = "%sxsectionHp" % myTheorUncertPrefix myUncertValueString = "%.3f/%.3f" % ( 1.0 - myXsecUncert[0], 1.0 + myXsecUncert[1]) myPrimaryReader.addNuisance(myNuisanceName, "lnN", mySignalColumnName, myUncertValueString) print " . H+ xsec uncert: %s" % myUncertValueString else: self._separateTheoreticalXsectionAndBrUncertainties = True # Add theoretical branching ratio uncertainties to datacard (depends on how many decay modes are combined) myDecayModeKeys = self._decayModeMatrix[fskey].keys() for i in range(len(myDecayModeKeys)): myDecayModeKeys[i] = "BR_%s" % myDecayModeKeys[i] myBrUncert = None if float(mHp) < 179: myBrUncert = db.brUncertLight( "mHp", "tanb", myDecayModeKeys, mHp, tanbeta, linearSummation=_linearSummingForTheoryUncertainties, silentStatus=True) else: myBrUncert = db.brUncertHeavy( "mHp", "tanb", myDecayModeKeys, mHp, tanbeta, linearSummation=_linearSummingForTheoryUncertainties, silentStatus=True) for i in range(len(myDecayModeKeys)): for k in myBrUncert.keys(): if myDecayModeKeys[i] in k: # Scale uncertainty according to amount of signal from that decay mode myUncertValue = myBrUncert[k] * myOriginalRates[ i] / myUpdatedRate if self._separateTheoreticalXsectionAndBrUncertainties: myNuisanceName = "%s%s" % (myTheorUncertPrefix, k) myUncertValueString = "%.3f" % (1.0 + myUncertValue) if float(mHp) < 179 and ( "HH" in mySignalColumnName or "ttHpHp" in mySignalColumnName): # Add for HH myUncertValueStringHH = "%.3f" % ( 1.0 + myUncertValue * 2.0) myPrimaryReader.addNuisance( myNuisanceName, "lnN", mySignalColumnName, myUncertValueStringHH) # Add for HW myPrimaryReader.addNuisance( myNuisanceName, "lnN", myPrimaryReader.getDatasetNames()[1], myUncertValueString) print " . H+ HH Br uncert(%s): %s" % ( k, myUncertValueStringHH) print " . H+ HW Br uncert(%s): %s" % ( k, myUncertValueString) else: myPrimaryReader.addNuisance( myNuisanceName, "lnN", mySignalColumnName, myUncertValueString) print " . H+ Br uncert(%s): %s" % ( k, myUncertValueString) else: if _linearSummingForTheoryUncertainties: myXsecUncert[0] += myUncertValue myXsecUncert[1] += myUncertValue else: myXsecUncert[0] = math.sqrt( myXsecUncert[0]**2 + myUncertValue**2) myXsecUncert[1] = math.sqrt( myXsecUncert[1]**2 + myUncertValue**2) if not self._separateTheoreticalXsectionAndBrUncertainties: myNuisanceName = "%sxsectionHp_and_Br" % myTheorUncertPrefix myUncertValueString = "%.3f/%.3f" % (1.0 - myXsecUncert[0], 1.0 + myXsecUncert[1]) myPrimaryReader.addNuisance(myNuisanceName, "lnN", mySignalColumnName, myUncertValueString) print " . %s: %s" % (myNuisanceName, myUncertValueString) # Write changes to datacard myPrimaryReader.close() # Something in memory management leaks - the following helps dramatically to recude the leak ROOT.gROOT.CloseFiles() ROOT.gROOT.GetListOfCanvases().Delete() ROOT.gDirectory.GetList().Delete() else: print " . no changes to datacard needed"
# Apply TDR style style = tdrstyle.TDRStyle() histograms.createLegend.moveDefaults(dx=-0.1, dh=-0.15) histograms.uncertaintyMode.set(histograms.Uncertainty.StatOnly) styles.ratioLineStyle.append(styles.StyleLine(lineColor=13)) # Find out the mass points nameList = [] allShapeNuisances = [] signalTable = {} myDatacardPattern = "" myRootfilePattern = "" if opts.cardPattern == None: mySettings = limitTools.GeneralSettings(".",[]) myDatacardPattern = mySettings.getDatacardPattern(limitTools.LimitProcessType.TAUJETS) myRootfilePattern = mySettings.getRootfilePattern(limitTools.LimitProcessType.TAUJETS) else: myDatacardPattern = opts.cardPattern.replace("MMM","M%s").replace("MM","%s") myRootfilePattern = opts.rootfilePattern.replace("MMM","M%s").replace("MM","%s") massPoints = DatacardReader.getMassPointsForDatacardPattern(".", myDatacardPattern) print "The following masses are considered:",massPoints for m in massPoints: # Obtain luminosity from datacard myLuminosity = float(limitTools.readLuminosityFromDatacard(".",myDatacardPattern%m)) # Do plots doPlot(opts,int(m),nameList,allShapeNuisances,myLuminosity,myDatacardPattern,myRootfilePattern,signalTable) # Print signal table print "Max contracted uncertainty for signal:" for k in signalTable.keys(): print "%s, %.3f--%.3f"%(k, signalTable[k]["min"],signalTable[k]["max"])
dirs = opts.directoryList if dirs == None: dirs = ["."] if opts.recursive: allDirs = [] for d in dirs: if os.path.exists(d): if d.startswith("datacards_combine_"): allDirs.append(d) else: allDirs.extend(findDirList(d)) else: raise Exception( "The directory '%s' does not exist! Check your command line parameters!" % d) dirs = allDirs[:] nTests = 0 nMassPoints = 0 nDirs = 0 for d in dirs: (a, b) = DatacardReader.validateDatacards(d) nTests += a nMassPoints += b nDirs += 1 print "\nDatacard consistency checks passed" print ".. checked %d datacards in %d directories" % (nMassPoints, nDirs) print ".. passed %d unit tests" % nTests
def hplusTauNuToTauJets(myDir, doCorrelation, nobtagcorr): print "*** H+ -> taunu, tau+jets final state ***" datacardPattern = "combine_datacard_hplushadronic_m%s.txt" rootFilePattern = "combine_histograms_hplushadronic_m%s.root" myMgr = DatacardReader.DataCardDirectoryManager(myDir, datacardPattern, rootFilePattern, readOnly=False) myNuisanceReplaces = {} myNuisanceReplaces["QCD_metshape"] = "CMS_Hptntj_QCDbkg_metshape" myNuisanceReplaces["QCDinvTemplateFit"] = "CMS_Hptntj_QCDbkg_templateFit" myNuisanceReplaces["Emb_QCDcontam"] = "CMS_Hptntj_taubkg_QCDcontam" myNuisanceReplaces[ "Emb_hybridCaloMET"] = "CMS_Hptntj_taubkg_HybridCaloMETApprox" myNuisanceReplaces["Emb_WtauTomu"] = "CMS_Hptntj_taubkg_WTauToMu" myNuisanceReplaces["Emb_reweighting"] = "CMS_Hptntj_taubkg_Reweighting" myNuisanceReplaces["probBtag"] = "CMS_Hptntj_fakebkg_probabilisticBTag" myNuisanceReplaces["higherOrderCorr"] = "ttbar_higherOrderCorrections" myNuisanceReplaces["e_mu_veto"] = "CMS_Hptntj_leptonVeto" myNuisanceReplaces["Emb_mu_ID"] = "CMS_id_m" myNuisanceReplaces[ "EWKnontt_faketau_TailFit_par0"] = "CMS_Hptntj_fakebkg_tailFitPar0" myNuisanceReplaces[ "EWKnontt_faketau_TailFit_par1"] = "CMS_Hptntj_fakebkg_tailFitPar1" myNuisanceReplaces["QCDinv_TailFit_par0"] = "CMS_Hptntj_QCDbkg_tailFitPar0" myNuisanceReplaces["QCDinv_TailFit_par1"] = "CMS_Hptntj_QCDbkg_tailFitPar1" myNuisanceReplaces[ "EWK_Tau_TailFit_par0"] = "CMS_Hptntj_taubkg_tailFitPar0" myNuisanceReplaces[ "EWK_Tau_TailFit_par1"] = "CMS_Hptntj_taubkg_tailFitPar1" myNuisanceReplaces["b_tag"] = "CMS_btag_CSVT" myNuisanceReplaces["top_pt"] = "CMS_Hptntj_topPtReweighting" myMgr.replaceNuisanceNames(myNuisanceReplaces) # Replace column names myColumnReplaces = {} myColumnReplaces["EWKnontt_faketau"] = "CMS_Hptntj_fakebkg" myColumnReplaces["EWK_Tau"] = "CMS_Hptntj_taubkg" myColumnReplaces["QCDinv"] = "CMS_Hptntj_QCDbkg" for m in myMgr._massPoints: myColumnReplaces["Hp%s_a" % m] = "CMS_Hptntj_Hptn" myColumnReplaces["HW%s_a" % m] = "CMS_ttHpW_signal" myColumnReplaces["HH%s_a" % m] = "CMS_ttHpHp_signal" myMgr.replaceColumnNames(myColumnReplaces) myMgr.replaceNuisanceNames(_CommonNuisanceReplaces) # Remove lines myMgr.removeNuisance("CMS_fake_eToTauEndcap") myMgr.removeNuisance("CMS_id_m") myMgr.removeNuisance("CMS_trg_mu_dataEff") myMgr.removeNuisance("CMS_trg_taumet_L1ETMMCEff") myMgr.removeNuisance("CMS_Hptntj_taubkg_QCDcontam") myMgr.removeNuisance("CMS_Hptntj_taubkg_HybridCaloMETApprox") myMgr.removeNuisance("CMS_Hptntj_taubkg_WTauToMu") myMgr.addNuisance("CMS_Hptntj_taubkg_combined", distribution="lnN", columns=["CMS_Hptntj_taubkg"], value="1.122") # Convert not affected items to hyphens myMgr.replaceNuisanceValue("CMS_trg_taumet_tauMCEff", "-", "CMS_Hptntj_taubkg") myMgr.replaceNuisanceValue("CMS_trg_taumet_L1ETMMCEff", "-", "CMS_Hptntj_taubkg") myMgr.replaceNuisanceValue( "CMS_trg_mu_dataEff", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_fakebkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue("CMS_fake_eToTauEndcap", "-", "CMS_Hptntj_taubkg") myMgr.replaceNuisanceValue("CMS_scale_j", "-", "CMS_Hptntj_taubkg") myMgr.replaceNuisanceValue("CMS_res_j", "-", "CMS_Hptntj_taubkg") myMgr.replaceNuisanceValue("CMS_scale_met", "-", "CMS_Hptntj_taubkg") myMgr.replaceNuisanceValue( "CMS_id_m", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_fakebkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue("CMS_Hptntj_leptonVeto", "-", ["CMS_Hptntj_taubkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue( "CMS_Hptntj_taubkg_QCDcontam", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_fakebkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue( "CMS_Hptntj_taubkg_HybridCaloMETApprox", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_fakebkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue( "CMS_Hptntj_taubkg_WTauToMu", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_fakebkg", "CMS_Hptntj_QCDbkg"]) #myMgr.replaceNuisanceValue("CMS_Hptntj_taubkg_Reweighting", "-", ["CMS_Hptntj_Hptn","CMS_Hptntj_fakebkg","CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue("xsect_tt_8TeV", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_taubkg"]) myMgr.replaceNuisanceValue( "xsect_Wjets", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_taubkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue( "xsect_singleTop", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_taubkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue( "xsect_DYtoll", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_taubkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue( "xsect_VV", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_taubkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue("lumi_8TeV", "-", "CMS_Hptntj_taubkg") myMgr.replaceNuisanceValue("pileup", "-", "CMS_Hptntj_taubkg") myMgr.replaceNuisanceValue( "CMS_Hptntj_fakebkg_probabilisticBTag", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_taubkg", "CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue( "CMS_Hptntj_QCDbkg_templateFit", "-", ["CMS_Hptntj_Hptn", "CMS_Hptntj_taubkg", "CMS_Hptntj_fakebkg"]) myMgr.removeNuisance("xsect_tt_8TeV") myMgr.addNuisance("xsect_tt_8TeV_scale", distribution="lnN", columns=["CMS_Hptntj_Hptn"], value="0.9659/1.0253") myMgr.replaceNuisanceValue("xsect_tt_8TeV_scale", "1.010/0.993", ["CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue("xsect_tt_8TeV_scale", "0.971/1.022", ["CMS_Hptntj_fakebkg"]) myMgr.addNuisance("xsect_tt_8TeV_pdf_alphaS", distribution="lnN", columns=["CMS_Hptntj_Hptn"], value="1.0463") myMgr.replaceNuisanceValue("xsect_tt_8TeV_pdf_alphaS", "0.984", ["CMS_Hptntj_QCDbkg"]) myMgr.replaceNuisanceValue("xsect_tt_8TeV_pdf_alphaS", "1.040", ["CMS_Hptntj_fakebkg"]) #myMgr.addNuisance("ttbar_higherOrderCorrections", distribution="lnN", columns=["CMS_Hptntj_fakebkg"], value="1.026") #myMgr.replaceNuisanceValue("ttbar_higherOrderCorrections", "-", ["CMS_Hptntj_Hptn","CMS_Hptntj_taubkg","CMS_Hptntj_QCDbkg"]) #myMgr.replaceNuisanceValue("ttbar_higherOrderCorrections", "0.992", "CMS_Hptntj_QCDbkg") myMgr.removeManyNuisances(_removeUncertainties) myMgr.keepManyNuisances(_keepUncertainties) myMgr.recreateShapeStatUncert(threshold=0.001) myMgr.close()
def hplusTBToSingleLepton(myDir, label): print "*** H+ -> tb, single lepton %s category ***" % (label) rootFilePattern = None datacardPattern = None if label.startswith("Control_"): rootFilePattern = "HpToSingleLepton_HT_CR_" + label + ".root" datacardPattern = "HpToSingleLepton_datacard_" + label + ".txt" else: rootFilePattern = "HpToSingleLepton_HT_M%s_" + label + ".root" datacardPattern = "HpToSingleLepton_datacard_" + label + "_%s.txt" rootFileDirectory = "" myMgr = DatacardReader.DataCardDirectoryManager( myDir, datacardPattern, rootFilePattern, rootFileDirectory=rootFileDirectory, readOnly=False, outSuffix=label) myMgr.replaceNuisanceNames(_CommonNuisanceReplaces) #myMgr.addNuisance("xsect_tt_8TeV", distribution="lnN", columns=["ttbar","otherttbar"], value="0.940/1.052") #myMgr.addNuisance("xsect_singleTop", distribution="lnN", columns=["st"], value="1.091") #myMgr.addNuisance("xsect_DYtoll", distribution="lnN", columns=qaqq["dy"], value="1.040") #myMgr.addNuisance("xsect_VV", distribution="lnN", columns=["vv"], value="1.040") #if suffix in ["ee","emu"]: # myMgr.addNuisance("xsect_Wjets", distribution="lnN", columns=["wjets"], value="0.963/1.040") #myMgr.removeColumn("wjets") #myMgr.removeColumn("vv") #myMgr.removeColumn("otherttbar") # Merge columns #myMgr.mergeColumns("OtherTop",["Wlight","Wheavy","ZDMerge","qcd"]) #myMgr.removeNuisance("wheavy_SF_mu") #myMgr.removeNuisance("wheavy_SF_el") # Replace column names myColumnReplaces = {} if myMgr._massPoints != None: for m in myMgr._massPoints: myColumnReplaces["Hplus%s" % m] = "CMS_Hptbsl_%s" % (label) myColumnReplaces["Wlight"] = "CMS_Hptbsl_%s_Wlight" % (label) #myColumnReplaces["Wheavy"] = "CMS_Hptbsl_%s_Wheavy"%(label) myColumnReplaces["Wc"] = "CMS_Hptbsl_%s_Wc" % (label) myColumnReplaces["Wb"] = "CMS_Hptbsl_%s_Wb" % (label) myColumnReplaces["qcd"] = "CMS_Hptbsl_%s_qcd" % (label) myColumnReplaces["ZDMerge"] = "CMS_Hptbsl_%s_DY_VV" % (label) myColumnReplaces["OtherTop"] = "CMS_Hptbsl_%s_OtherTop" % (label) myColumnReplaces["OtherEwk"] = "CMS_Hptbsl_%s_OtherEwk" % (label) myColumnReplaces["TTbar"] = "CMS_Hptbsl_%s_ttbar" % (label) myMgr.replaceColumnNames(myColumnReplaces) # Replace nuisance names myNuisanceReplaces = {} myNuisanceReplaces["trigger_mu"] = "CMS_trg_m" myNuisanceReplaces["lepton_mu"] = "CMS_eff_m" if label in ["nB1_mu", "nB2p_mu"]: myNuisanceReplaces["trigger_el"] = "CMS_trg_m" else: myNuisanceReplaces["trigger_el"] = "CMS_trg_e" myNuisanceReplaces["lepton_el"] = "CMS_eff_e" myNuisanceReplaces["xsec_OTop"] = "xsect_singleTop" myNuisanceReplaces["xsec_ZJets"] = "xsect_DYtoll" myNuisanceReplaces["xsec_QCD"] = "xsect_QCD" myNuisanceReplaces["xsec_OEwk"] = "xsect_VV" myNuisanceReplaces["xsec_ZDMerge"] = "xsect_ZDMerge" myNuisanceReplaces["ttbar_SF_mu"] = "CMS_Hptbsl_muX_ttbarNorm" myNuisanceReplaces["wlight_SF_mu"] = "CMS_Hptbsl_muX_wlightNorm" #myNuisanceReplaces["wheavy_SF_mu"] = "CMS_Hptbsl_muX_wheavyNorm" myNuisanceReplaces["wc_SF_mu"] = "CMS_Hptbsl_muX_wcNorm" myNuisanceReplaces["wb_SF_mu"] = "CMS_Hptbsl_muX_wbNorm" myNuisanceReplaces["ttbar_SF_el"] = "CMS_Hptbsl_eX_ttbarNorm" myNuisanceReplaces["wlight_SF_el"] = "CMS_Hptbsl_eX_wlightNorm" #myNuisanceReplaces["wheavy_SF_el"] = "CMS_Hptbsl_eX_wheavyNorm" myNuisanceReplaces["wc_SF_el"] = "CMS_Hptbsl_eX_wcNorm" myNuisanceReplaces["wb_SF_el"] = "CMS_Hptbsl_eX_wbNorm" myNuisanceReplaces["jes"] = "CMS_scale_j" myNuisanceReplaces["jer"] = "CMS_res_j" #myNuisanceReplaces["pdf"] = "ttbarPDFVariation" #myNuisanceReplaces["top_ljets"] = "CMS_Hptbsl_%s_topPtReweighting"%label #FIXME #myNuisanceReplaces["top_ljets"] = "CMS_Hptbsl_topPtReweighting" myNuisanceReplaces[ "top_ljets"] = "CMS_Hptbsl_%s_topPtReweighting" % label.replace( "nB1_", "").replace("nB2p_", "") myNuisanceReplaces["top_ljets_el"] = "CMS_Hptbsl_el_topPtReweighting" myNuisanceReplaces["top_ljets_mu"] = "CMS_Hptbsl_mu_topPtReweighting" myNuisanceReplaces["btag"] = "CMS_btaguntag_CSVM" myNuisanceReplaces["pdf"] = "CMS_ttbar_pdfShape" myNuisanceReplaces["matching_ljets"] = "CMS_ttbar_matchingVariation" myNuisanceReplaces["scale_ljets"] = "CMS_ttbar_q2" if label.startswith("Control_"): for l in ["el", "mu"]: myNuisanceReplaces["xsec_TTbar__%s" % l] = "CMS_Hptbsl_%s_ttbarNormUncert" % l myNuisanceReplaces["xsec_Wlight__%s" % l] = "CMS_Hptbsl_%s_wlightNormUncert" % l myNuisanceReplaces["xsec_Wc__%s" % l] = "CMS_Hptbsl_%s_wcNormUncert" % l myNuisanceReplaces["xsec_Wb__%s" % l] = "CMS_Hptbsl_%s_wbNormUncert" % l myMgr.replaceNuisanceNames(myNuisanceReplaces) myMgr.replaceNuisanceValue("xsect_singleTop", "1.069", ["OtherTop"]) #myMgr.addNuisance("btagshapePDF", distribution="lnN", columns=["ttbar","otherttbar"], value="1.050") #myMgr.convertShapeToNormalizationNuisance(["CMS_scale_j","CMS_res_j","CMS_scale_met","pileup"]) #myMgr.convertShapeToNormalizationNuisance(["CMS_btag_CSVL","CMS_unbtag_CSVL"]) #myMgr.convertShapeToNormalizationNuisance(["CMS_btag_CSVL","CMS_unbtag_CSVL"],columnList=myNonTTColumns) #myMgr.convertShapeToNormalizationNuisance(["CMS_Hptb%s_topPtReweighting"%suffix],columnList=myNonTTColumns) #myMgr.convertShapeToNormalizationNuisance(["btag","unbtag","top_pt","b_tag"]) # TMP #myMgr.convertShapeToNormalizationNuisance(["CMS_scale_j","CMS_res_j"]) # Rebin if False: myCard = myMgr._datacards[myMgr._datacards.keys()[0]] hCache = myCard._hCache if len(hCache) > 0: h = hCache[0] s = [] for i in range(1, h.GetNbinsX() + 1): s.append(h.GetXaxis().GetBinLowEdge(i)) rebinList = [0] for i in range(1, len(s)): if i % 2 == 1: rebinList.append(s[i]) rebinList.append(h.GetXaxis().GetXmax()) #if label == "nB1": #rebinList = [0,195,235,275,315,355,395,435,475,515,555,595,635,675,715,755,795,835,875,915,955,995,1095,1195,1305,1425,1545,1690,1800,1910,2500] #elif label == "nB2p": #rebinList = [0,190,230,270,310,350,390,430,470,510,550,590,630,670,710,750,790,830,870,910,950,990,1090,1190,1290,1390,1490,1590,1670,1830,2500] if len(rebinList) > 2: print "Rebinning:" print " original: %s" % ", ".join(map(str, s)) print " new: %s" % ", ".join(map(str, rebinList)) myMgr.rebinShapes(rebinList) # Smoothen QCD background #myMgr.smoothBackgroundByLinearExtrapolation("CMS_HptbmuX_%s_qcd"%label) # Redo stat. uncert. shape histograms # Insert QCD events to the tail if False: column = "qcd" for m in myMgr._datacards.keys(): dcard = myMgr._datacards[m] datasetIndex = 0 for c in dcard.getDatasetNames(): if c == column: hRate = dcard.getRateHisto(c) nbins = hRate.GetNbinsX() hRate.SetBinContent(nbins - 1, 10) hRate.SetBinError(nbins - 1, 10) # Update rate number in table print "sample yield changed %s -> %f" % ( dcard._rateValues[datasetIndex], hRate.Integral()) dcard._rateValues[datasetIndex] = "%f" % hRate.Integral() # Update stat uncert for h in dcard._hCache: if column in h.GetName() and h.GetName().endswith( "statUp"): h.SetBinContent( nbins - 1, hRate.GetBinContent(nbins - 1) + hRate.GetBinError(nbins - 1)) print "stat.uncert. updated" if column in h.GetName() and h.GetName().endswith( "statDown"): h.SetBinContent( nbins - 1, hRate.GetBinContent(nbins - 1) - hRate.GetBinError(nbins - 1)) if h.GetBinContent(nbins - 1) < 0: h.SetBinContent(nbins - 1, 0.0) datasetIndex += 1 #myMgr.fixTooSmallStatUncertProblem(signalMinimumAbsStatValue=0.2, bkgMinimumAbsStatValue=_MinimumStatUncertByBkg) myMgr.removeManyNuisances(_removeUncertainties) myMgr.keepManyNuisances(_keepUncertainties) if not label.startswith("Control_"): myMgr.recreateShapeStatUncert( recreateShapeStatUncertForLargestBkgOnly=True) #myMgr.recreateShapeStatUncert(threshold=0.10) #myMgr.recreateShapeStatUncert() else: myMgr.recreateShapeStatUncert() myMgr.close()
def hplusTbToDilepton(myDir, doCorrelation, nobtagcorr): for suffix in ["ee", "emu", "mumu"]: print "*** H+ -> tb, %s final state ***" % suffix datacardPattern = "DataCard_" + suffix + "_tb_m%s.txt" #rootFilePattern = "CrossSectionShapes_tb_m%s.root" #rootFileDirectory = suffix #myMgr = DatacardReader.DataCardDirectoryManager(myDir, datacardPattern, rootFilePattern, rootFileDirectory=rootFileDirectory, readOnly=False) rootFilePattern = "CrossSectionShapes_tb_m%s_" + suffix + ".root" myMgr = DatacardReader.DataCardDirectoryManager(myDir, datacardPattern, rootFilePattern, readOnly=False) myMgr.fixTooSmallStatUncertProblem( signalMinimumAbsStatValue=0.2, bkgMinimumAbsStatValue=_MinimumStatUncertByBkg) myMgr.removeNuisance("theoryUncXS_vv") myMgr.removeNuisance("theoryUncXS_wjets") myMgr.removeNuisance("theoryUncXS_otherttbar") myMgr.removeNuisance("theoryUncXS_st") myMgr.removeNuisance("theoryUncXS_dy") myMgr.removeNuisance("theoryUncXS_ttbar") # Replace nuisance names myNuisanceReplaces = {} myNuisanceReplaces["tes"] = "ES_taus" myNuisanceReplaces["topptunc%s" % suffix] = "CMS_Hptb%s_topPtReweighting" % suffix myNuisanceReplaces["jes"] = "ES_jets" myNuisanceReplaces["jer"] = "JER" myNuisanceReplaces["umet"] = "ES_METunclustered" myNuisanceReplaces["dy_additional_8TeV"] = "dyAdditional_8TeV" myNuisanceReplaces["btag"] = "CMS_btag_CSVL" myNuisanceReplaces["unbtag"] = "CMS_unbtag_CSVL" myNuisanceReplaces["pdf"] = "CMS_ttbar_pdfShape" myNuisanceReplaces["ttbbmeps"] = "CMS_ttbb_matchingVariation" myNuisanceReplaces["dilemeps"] = "CMS_ttbar_matchingVariation" myNuisanceReplaces["ttbbq2"] = "CMS_ttbb_q2" myNuisanceReplaces["dileq2"] = "CMS_ttbar_q2" #myNuisanceReplaces["CMS_meps_dile"] = "CMS_ttbar_matchingVariation" #myNuisanceReplaces["CMS_q2_dile"] = "CMS_ttbar_q2" #%suffix #myNuisanceReplaces["CMS_meps_ttbb"] = "CMS_ttbb_matchingVariation" #myNuisanceReplaces["CMS_q2_ttbb"] = "CMS_ttbb_q2" #%suffix myNuisanceReplaces["trigeff_ee_8TeV"] = "CMS_trg_ee" myNuisanceReplaces["trigeff_emu_8TeV"] = "CMS_trg_em" myNuisanceReplaces["trigeff_mumu_8TeV"] = "CMS_trg_mm" myMgr.replaceNuisanceNames(myNuisanceReplaces) myMgr.replaceNuisanceNames(_CommonNuisanceReplaces) if suffix == "ee": myMgr.removeNuisance("CMS_eff_m") if suffix == "mumu": myMgr.removeNuisance("CMS_eff_e") myMgr.addNuisance("xsect_tt_8TeV_scale", distribution="lnN", columns=["ttbar", "otherttbar"], value="0.9659/1.0253") myMgr.addNuisance("xsect_tt_8TeV_pdf_alphaS", distribution="lnN", columns=["ttbar", "otherttbar"], value="1.0463") myMgr.addNuisance("xsect_singleTop", distribution="lnN", columns=["st"], value="1.069") myMgr.addNuisance("xsect_DYtoll", distribution="lnN", columns=["dy"], value="1.040") #myMgr.addNuisance("xsect_VV", distribution="lnN", columns=["vv"], value="1.040") #if suffix in ["ee","emu"]: #myMgr.addNuisance("xsect_Wjets", distribution="lnN", columns=["wjets"], value="0.963/1.040") #myMgr.removeColumn("wjets") #myMgr.removeColumn("vv") #myMgr.removeColumn("otherttbar") # Replace column names myColumnReplaces = {} myColumnReplaces["HTB"] = "CMS_Hptb%s_Hp%s" % (suffix, suffix) myColumnReplaces["vv"] = "CMS_Hptb%s_vv" % suffix myColumnReplaces["wjets"] = "CMS_Hptb%s_wjets" % suffix myColumnReplaces["otherttbar"] = "CMS_Hptb%s_otherttbar" % suffix myColumnReplaces["st"] = "CMS_Hptb%s_st" % suffix myColumnReplaces["dy"] = "CMS_Hptb%s_dy" % suffix myColumnReplaces["ttbar"] = "CMS_Hptb%s_ttbar" % suffix myColumnReplaces["ttbb"] = "CMS_Hptb%s_ttbb" % suffix myMgr.replaceColumnNames(myColumnReplaces) myNonTTColumns = [ "CMS_Hptb%s_Hp%s" % (suffix, suffix), "CMS_Hptb%s_vv" % suffix, "CMS_Hptb%s_wjets" % suffix, "CMS_Hptb%s_otherttbar" % suffix, "CMS_Hptb%s_st" % suffix, "CMS_Hptb%s_dy" % suffix ] myMgr.replaceNuisanceValue("ttbarQ2Scale", "-", "CMS_Hptb%s_Hp%s" % (suffix, suffix)) myMgr.replaceNuisanceValue("ttbarMatchingVariation", "-", "CMS_Hptb%s_Hp%s" % (suffix, suffix)) myMgr.replaceNuisanceValue("ttbarQ2Scale", "1.030", "CMS_Hptb%s_otherttbar" % (suffix)) myMgr.replaceNuisanceValue("ttbarMatchingVariation", "1.010", "CMS_Hptb%s_otherttbar" % (suffix)) #myMgr.addNuisance("btagshapePDF", distribution="lnN", columns=["ttbar","otherttbar"], value="1.050") #myColumnReplaces = {} #for c in myMgr.getColumnNames(): #myColumnReplaces["%s_%s"%(c,c)] = c #myMgr.replaceColumnNames(myColumnReplaces) myNuisanceReplaces = {} myNuisanceReplaces["st%s_%s_st%sat" % (suffix, suffix, suffix)] = "st_%s_stat" % suffix myMgr.replaceNuisanceNames(myNuisanceReplaces) myMgr.convertShapeToNormalizationNuisance( ["CMS_scale_j", "CMS_res_j", "CMS_scale_met", "pileup"]) #myMgr.convertShapeToNormalizationNuisance(["CMS_btag_CSVL","CMS_unbtag_CSVL"]) #myMgr.convertShapeToNormalizationNuisance(["CMS_btag_CSVL","CMS_unbtag_CSVL"],columnList=myNonTTColumns) #myMgr.convertShapeToNormalizationNuisance(["CMS_Hptb%s_topPtReweighting"%suffix],columnList=myNonTTColumns) #myMgr.convertShapeToNormalizationNuisance(["btag","unbtag","top_pt","b_tag"]) # TMP myMgr.removeNuisance("othemeps") myMgr.removeNuisance("otheq2") myMgr.removeNuisance("CMS_eff_dilepton") #if suffix != "ee": #myMgr.addNuisance("CMS_eff_m", distribution="lnN", columns=["CMS_Hptb%s_Hp%s"%(suffix,suffix),"CMS_Hptb%s_ttbar"%suffix,"CMS_Hptb%s_st"%suffix,"CMS_Hptb%s_ttbb"%suffix,"CMS_Hptb%s_dy"%suffix], value="1.01") #if suffix != "mumu": #myMgr.addNuisance("CMS_eff_e", distribution="lnN", columns=["CMS_Hptb%s_Hp%s"%(suffix,suffix),"CMS_Hptb%s_ttbar"%suffix,"CMS_Hptb%s_st"%suffix,"CMS_Hptb%s_ttbb"%suffix,"CMS_Hptb%s_dy"%suffix], value="1.02") #if suffix == "ee": #myMgr.addNuisance("CMS_trg_ee", distribution="lnN", columns=["CMS_Hptb%s_Hp%s"%(suffix,suffix),"CMS_Hptb%s_ttbar"%suffix,"CMS_Hptb%s_st"%suffix,"CMS_Hptb%s_ttbb"%suffix,"CMS_Hptb%s_dy"%suffix], value="1.03") #elif suffix == "emu": #myMgr.addNuisance("CMS_trg_em", distribution="lnN", columns=["CMS_Hptb%s_Hp%s"%(suffix,suffix),"CMS_Hptb%s_ttbar"%suffix,"CMS_Hptb%s_st"%suffix,"CMS_Hptb%s_ttbb"%suffix,"CMS_Hptb%s_dy"%suffix], value="1.03") #elif suffix == "mumu": #myMgr.addNuisance("CMS_trg_mm", distribution="lnN", columns=["CMS_Hptb%s_Hp%s"%(suffix,suffix),"CMS_Hptb%s_ttbar"%suffix,"CMS_Hptb%s_st"%suffix,"CMS_Hptb%s_ttbb"%suffix,"CMS_Hptb%s_dy"%suffix], value="1.03") #myMgr.replaceNuisanceValue("lumi_8TeV", "1.026") # Redo stat. uncert. shape histograms myMgr.recreateShapeStatUncert() myMgr.removeManyNuisances(_removeUncertainties) myMgr.keepManyNuisances(_keepUncertainties) myMgr.close()
def hplusTbToTauMu(myDir, doCorrelation, nobtagcorr): print "*** H+ -> tb, tau+mu final state ***" datacardPattern = "datacard_mutau_tb_m%s_mutau.txt" rootFilePattern = "shapes_tb_m%s_btagmultiplicity_j.root" myMgr = DatacardReader.DataCardDirectoryManager(myDir, datacardPattern, rootFilePattern, readOnly=False) myMgr.removeNuisance("theoryUncXS_vv") myMgr.removeNuisance("theoryUncXS_diboson") myMgr.removeNuisance("theoryUncXS_wjets") myMgr.removeNuisance("theoryUncXS_zll") myMgr.removeNuisance("theoryUncXS_ztautau") myMgr.removeNuisance("theoryUncXS_otherttbar") myMgr.removeNuisance("theoryUncXS_st") myMgr.removeNuisance("theoryUncXS_singletop") myMgr.removeNuisance("theoryUncXS_dy") myMgr.removeNuisance("theoryUncXS_ttbar") # Replace column names myColumnReplaces = {} myColumnReplaces["HTB"] = "CMS_Hptbmt_Hptb" myColumnReplaces["tau_fake"] = "CMS_Hptbmt_taufake" myColumnReplaces["tt_ltau"] = "CMS_Hptbmt_ttltau" myColumnReplaces["tt_ll"] = "CMS_Hptbmt_ttll" myColumnReplaces["tt_bb"] = "CMS_Hptbmt_ttbb" myColumnReplaces["singleTop"] = "CMS_Hptbmt_singleTop" myColumnReplaces["di_boson"] = "CMS_Hptbmt_vv" myColumnReplaces["Z_tautau"] = "CMS_Hptbmt_Ztt" myColumnReplaces["Z_eemumu"] = "CMS_Hptbmt_Zeemm" myColumnReplaces["Z_eemumu"] = "CMS_Hptbmt_Zeemm" myMgr.replaceColumnNames(myColumnReplaces) myMgr.replaceNuisanceNames(_CommonNuisanceReplaces) # Replace nuisance names myNuisanceReplaces = {} myNuisanceReplaces["tauId"] = "tau_ID_shape" myNuisanceReplaces["jetTauMisId"] = "tau_ID_jetToTau_shape" #myNuisanceReplaces["fakesSyst"] = "???" myNuisanceReplaces["tes"] = "ES_taus" myNuisanceReplaces["topptunc"] = "CMS_Hptbmt_topPtReweighting" if nobtagcorr: myNuisanceReplaces["btagMed"] = "CMS_btag_CSVM" myNuisanceReplaces["unbtagMed"] = "CMS_unbtag_CSVM" myNuisanceReplaces["Z_tautau_embedded"] = "CMS_Hptbmt_DYtautau_embedding" #myNuisanceReplaces["matching"] = "ttbarMatchingVariation" myNuisanceReplaces["fakesSyst"] = "CMS_Hptbmt_fakebkg_syst" #myNuisanceReplaces["q2scale"] = "ttbarQ2Scale" myNuisanceReplaces["leptEff"] = "CMS_eff_m" myNuisanceReplaces["pdf"] = "CMS_ttbar_pdfShape" myNuisanceReplaces["match"] = "CMS_ttbar_matchingVariation" myNuisanceReplaces["scale"] = "CMS_ttbar_q2" #%suffix myNuisanceReplaces["ttbbmeps"] = "CMS_ttbb_matchingVariation" myNuisanceReplaces["meps"] = "CMS_ttbar_matchingVariation" myNuisanceReplaces["ttbbq2"] = "CMS_ttbb_q2" myNuisanceReplaces["q2"] = "CMS_ttbar_q2" myMgr.replaceNuisanceNames(myNuisanceReplaces) myMgr.removeNuisance("xsect_tt_8TeV_scale") myMgr.removeNuisance("xsect_tt_8TeV_pdf_alphaS") myMgr.addNuisance("xsect_tt_8TeV_scale", distribution="lnN", columns=["CMS_Hptbmt_ttltau", "CMS_Hptbmt_ttll"], value="0.9659/1.0253") myMgr.addNuisance("xsect_tt_8TeV_pdf_alphaS", distribution="lnN", columns=["CMS_Hptbmt_ttltau", "CMS_Hptbmt_ttll"], value="1.0463") myMgr.addNuisance("xsect_singleTop", distribution="lnN", columns=["CMS_Hptbmt_singleTop"], value="1.069") #myMgr.addNuisance("xsect_tt_8TeV", distribution="lnN", columns=["CMS_Hptbmt_ttltau","CMS_Hptbmt_ttll"], value="0.940/1.052") #myMgr.addNuisance("xsect_singleTop", distribution="lnN", columns=["CMS_Hptbmt_singleTop"], value="1.091") #myMgr.addNuisance("xsect_DYtoll", distribution="lnN", columns=["CMS_Hptbmt_Ztt","CMS_Hptbmt_Zeemm"], value="1.040") #myMgr.addNuisance("xsect_VV", distribution="lnN", columns=["CMS_Hptbmt_vv"], value="1.040") #myMgr.replaceNuisanceValue("CMS_eff_t", "1.060", "CMS_Hptbmt_Ztt") myMgr.replaceNuisanceValue( "CMS_eff_t", "-", ["CMS_Hptbmt_taufake", "CMS_Hptbmt_Zeemm", "CMS_Hptbmt_ttll"]) myMgr.replaceNuisanceValue("CMS_fake_jetToTau", "-", [ "CMS_Hptbmt_Hptb", "CMS_Hptbmt_taufake", "CMS_Hptbmt_ttltau", "CMS_Hptbmt_singleTop", "CMS_Hptbmt_vv", "CMS_Hptbmt_Ztt" ]) myMgr.replaceNuisanceValue("CMS_Hptbmt_fakebkg_syst", "-", [ "CMS_Hptbmt_Hptb", "CMS_Hptbmt_ttltau", "CMS_Hptbmt_ttll", "CMS_Hptbmt_singleTop", "CMS_Hptbmt_vv", "CMS_Hptbmt_Ztt", "CMS_Hptbmt_Zeemm" ]) myMgr.replaceNuisanceValue("CMS_eff_m", "-", "CMS_Hptbmt_taufake") myMgr.replaceNuisanceValue("lumi_8TeV", "-", "CMS_Hptbmt_taufake") myMgr.replaceNuisanceValue("CMS_pileup", "-", "CMS_Hptbmt_taufake") myMgr.replaceNuisanceValue("CMS_eff_e", "-", "CMS_Hptbmt_taufake") myMgr.replaceNuisanceValue("CMS_trg_m", "-", "CMS_Hptbmt_taufake") myMgr.replaceNuisanceValue("fakesSyst", "-", [ "CMS_Hptbmt_Hptb", "CMS_Hptbmt_ttltau", "CMS_Hptbmt_singleTop", "CMS_Hptbmt_ttll" ]) myMgr.convertShapeToNormalizationNuisance( ["CMS_scale_j", "CMS_res_j", "CMS_scale_met"]) #,"CMS_Hptbmt_topPtReweighting"]) #myMgr.replaceNuisanceValue("CMS_scale_j", "1.040", ["CMS_Hptbmt_Ztt","CMS_Hptbmt_Zeemm"]) #myMgr.replaceNuisanceValue("CMS_res_j", "1.010", ["CMS_Hptbmt_Ztt","CMS_Hptbmt_Zeemm"]) #myMgr.replaceNuisanceValue("CMS_scale_met", "1.020", ["CMS_Hptbmt_Ztt","CMS_Hptbmt_Zeemm"]) # Redo stat. uncert. shape histograms myMgr.fixTooSmallStatUncertProblem( signalMinimumAbsStatValue=0.2, bkgMinimumAbsStatValue=_MinimumStatUncertByBkg) myMgr.recreateShapeStatUncert() #myMgr.removeStatUncert() myMgr.removeManyNuisances(_removeUncertainties) myMgr.keepManyNuisances(_keepUncertainties) #myMgr.convertShapeToNormalizationNuisance(["ttbarPDFVariation","CMS_scale_t","CMS_topPtReweighting","CMS_btag_CSVM","CMS_unbtag_CSVM"]) #myMgr.convertShapeToNormalizationNuisance(["CMS_scale_t"]) #myMgr.convertShapeToNormalizationNuisance(["CMS_btag_CSVM","CMS_unbtag_CSVM"]) myMgr.close()
style = tdrstyle.TDRStyle() histograms.createLegend.moveDefaults(dx=-0.1, dh=-0.15) histograms.uncertaintyMode.set(histograms.Uncertainty.StatOnly) styles.ratioLineStyle.append(styles.StyleLine(lineColor=13)) # Find out the mass points nameList = [] allShapeNuisances = [] signalTable = {} myDatacardPattern = "" myRootfilePattern = "" if opts.cardPattern == None: mySettings = limitTools.GeneralSettings(".",[]) myDatacardPattern = mySettings.getDatacardPattern(limitTools.LimitProcessType.TAUJETS) myRootfilePattern = mySettings.getRootfilePattern(limitTools.LimitProcessType.TAUJETS) else: myDatacardPattern = opts.cardPattern.replace("MMM","M%s").replace("MM","%s") myRootfilePattern = opts.rootfilePattern.replace("MMM","M%s").replace("MM","%s") massPoints = DatacardReader.getMassPointsForDatacardPattern(".", myDatacardPattern) print "The following masses are considered:",massPoints for m in massPoints: # Obtain luminosity from datacard myLuminosity = float(limitTools.readLuminosityFromDatacard(".",myDatacardPattern%m)) # Do plots doPlot(opts,int(m),nameList,allShapeNuisances,myLuminosity,myDatacardPattern,myRootfilePattern,signalTable) # Print signal table print "Max contracted uncertainty for signal:" for k in signalTable.keys(): # print "Key: "+str(k) print "%s, %.3f--%.3f"%(k, signalTable[k]["min"],signalTable[k]["max"])
dirs = opts.directoryList if dirs == None: dirs = ["."] if opts.recursive: allDirs = [] for d in dirs: if os.path.exists(d): if d.startswith("datacards_combine_"): allDirs.append(d) else: allDirs.extend(findDirList(d)) else: raise Exception("The directory '%s' does not exist! Check your command line parameters!"%d) dirs = allDirs[:] nTests = 0 nMassPoints = 0 nDirs = 0 for d in dirs: (a,b) = DatacardReader.validateDatacards(d) nTests += a nMassPoints += b nDirs += 1 print "\nDatacard consistency checks passed" print ".. checked %d datacards in %d directories"%(nMassPoints, nDirs) print ".. passed %d unit tests"%nTests
def main(opts): # Apply TDR style style = tdrstyle.TDRStyle() style.setGridX(opts.gridx) style.setGridY(opts.gridy) style.setLogX(opts.logx) style.setLogY(opts.logy) # Create legend and set style histograms.createLegend.moveDefaults(dx=-0.1, dh=-0.15) histograms.uncertaintyMode.set(histograms.Uncertainty.StatOnly) styles.ratioLineStyle.append(styles.StyleLine(lineColor=13)) # Define some variables nameList = [] allShapeNuisances = [] signalTable = {} myDatacardPattern = "" myRootfilePattern = "" # Find out the mass points if opts.cardPattern == None: mySettings = limitTools.GeneralSettings(".", []) myDatacardPattern = mySettings.getDatacardPattern( limitTools.LimitProcessType.TAUJETS) myRootfilePattern = mySettings.getRootfilePattern( limitTools.LimitProcessType.TAUJETS) else: myDatacardPattern = opts.cardPattern.replace("MMM", "M%s").replace( "MM", "%s") myRootfilePattern = opts.rootfilePattern.replace("MMM", "M%s").replace( "MM", "%s") # Get mass points to consider massPoints = DatacardReader.getMassPointsForDatacardPattern( ".", myDatacardPattern) Print( "The following masses will be considered: %s" % (ShellStyles.HighlightAltStyle() + ", ".join(massPoints) + ShellStyles.NormalStyle()), True) # For-loop: All mass points for i, m in enumerate(massPoints, 1): # Obtain luminosity from the datacard myLuminosity = float( limitTools.readLuminosityFromDatacard(".", myDatacardPattern % m)) # Do the plots doPlot(opts, int(m), nameList, allShapeNuisances, myLuminosity, myDatacardPattern, myRootfilePattern, signalTable) # Print signal table Print("Max contracted uncertainty for signal:", True) table = [] align = "{:>15} {:>15} {:>15}" hLine = "=" * 50 table.append(hLine) table.append(align.format("Systematic", "Minimum", "Maximum")) table.append(hLine) # For-loop: All signal for i, k in enumerate(signalTable.keys(), 1): # Print("Key = %s" % (k), False) minVal = "%.3f" % (signalTable[k]["min"]) maxVal = "%.3f" % (signalTable[k]["max"]) msg = align.format(k, minVal, maxVal) table.append(msg) table.append(hLine) for row in table: Print(row, False) msg = "All results under directory %s" % ( ShellStyles.SuccessStyle() + opts.dirName + ShellStyles.NormalStyle()) Print(msg, True) return
def doPlot(opts, mass, nameList, allShapeNuisances, luminosity, myDatacardPattern, rootFilePattern, signalTable): fName = rootFilePattern % mass f = ROOT.TFile.Open(fName) content = f.GetListOfKeys() # Suppress the warning message of missing dictionary for some iterator backup = ROOT.gErrorIgnoreLevel ROOT.gErrorIgnoreLevel = ROOT.kError diriter = content.MakeIterator() ROOT.gErrorIgnoreLevel = backup # Find the datacard and nuisance names myCardReader = DatacardReader.DataCardReader(".", mass, myDatacardPattern, rootFilePattern) myDatasetNames = myCardReader.getDatasetNames() # Find the name stem and the name of the uncertainties datasets = [] shapes = [] for d in myDatasetNames: myLabel = d myStatus = not d in nameList if d == myDatasetNames[0]: myStatus = True if not str(mass) in d: myLabel = "%sm%d" % (d, mass) myShapeNuisanceNames = myCardReader.getShapeNuisanceNames(d) myFilteredShapeNuisances = [] for n in myShapeNuisanceNames: if not "statBin" in n and not n.endswith( "_statUp") and not n.endswith("_statDown"): myFilteredShapeNuisances.append(n) if myStatus: myDataset = DatasetContainer(column=d, label=myLabel, nuisances=myFilteredShapeNuisances, cardReader=myCardReader, verbose=opts.verbose) datasets.append(myDataset) nameList.append(d) for n in myFilteredShapeNuisances: if not n in shapes: shapes.append(n) rebinList = None if opts.h2tb: rebinList = systematics._dataDrivenCtrlPlotBinning[ "LdgTetrajetMass_AfterAllSelections"] ## Do the actual plots for i, d in enumerate(datasets, 1): if opts.verbose: d.debug() msg = "{:>10}, {:<20}".format("m = %d GeV" % (mass), d.GetName()) if i < len(datasets): Print( ShellStyles.HighlightAltStyle() + msg + ShellStyles.NormalStyle(), False) else: Print(ShellStyles.SuccessStyle() + msg + ShellStyles.NormalStyle(), False) d.doPlot(opts, shapes, f, mass, luminosity, signalTable, rebinList) Verbose("Closing ROOT file %s" % (fName), True) f.Close()