remainingVars = vars[1:] cuts = getCutsFromRegions(subRegions, var) # print "At:", var, "remaining", remainingVars, "looping over",cuts,subRegions, var for c in reversed(cuts): # print "Looping", c listRecursive(remainingVars, subRegions, requiredCuts + [c]) else: assert len(subRegions) == 1, "Regions not unique!" r = subRegions[0] print ", ".join([c['name'] + ":" + str(c['cut']) for c in r['cuts']]) listRecursive() from StopsDilepton.tools.cardFileWriter import cardFileWriter c = cardFileWriter.cardFileWriter() c.defWidth = 20 c.precision = 6 c.unique = False limit = {} signals = goodRegions[0]['sigYields'].keys() for s in reversed(signals): c.reset() for i, r in enumerate(goodRegions): c.addBin('Bin' + str(i), ['bkg'], 'Bin' + str(i)) bkg = r['bkgYield'] sig = r['sigYields'][s] c.specifyObservation('Bin' + str(i), int(bkg)) c.specifyExpectation('Bin' + str(i), 'bkg', bkg) c.specifyExpectation('Bin' + str(i), 'signal', sig)
def wrapper(s): c = cardFileWriter.cardFileWriter() c.releaseLocation = releaseLocation71XC counter = 0 c.reset() c.addUncertainty('PU', 'lnN') c.addUncertainty('topPt', 'lnN') c.addUncertainty('JEC', 'lnN') c.addUncertainty('JER', 'lnN') c.addUncertainty('SFb', 'lnN') c.addUncertainty('SFl', 'lnN') c.addUncertainty('SFFS', 'lnN') c.addUncertainty('leptonSF', 'lnN') eSignal = MCBasedEstimate(name=s['name'], sample={channel: s for channel in allChannels}, cacheDir=setup.defaultCacheDir()) cardFileName = os.path.join(setup.analysisOutputDir, setup.prefix(), 'cardFiles', limitPrefix, s['name'] + '.txt') if not os.path.exists(cardFileName) or overWrite: for r in regions: for channel in ['MuMu', 'EE', 'EMu']: # for channel in ['all']: niceName = ' '.join([channel, r.__str__()]) binname = 'Bin' + str(counter) counter += 1 total_exp_bkg = 0 c.addBin(binname, [e.name for e in bkgEstimators], niceName) for e in bkgEstimators: expected = e.cachedEstimate(r, channel, setup) total_exp_bkg += expected.val c.specifyExpectation(binname, e.name, expected.val) if expected.val > 0: #PU bkg c.specifyUncertainty( 'PU', binname, e.name, 1 + e.PUSystematic(r, channel, setup).val) #JEC bkg c.specifyUncertainty( 'JEC', binname, e.name, 1 + e.JECSystematic(r, channel, setup).val) #JER bkg c.specifyUncertainty( 'JER', binname, e.name, 1 + e.JERSystematic(r, channel, setup).val) #topPt reweighting c.specifyUncertainty( 'topPt', binname, e.name, 1 + e.topPtSystematic(r, channel, setup).val) #b-tagging SF c.specifyUncertainty( 'SFb', binname, e.name, 1 + e.btaggingSFbSystematic(r, channel, setup).val) c.specifyUncertainty( 'SFl', binname, e.name, 1 + e.btaggingSFlSystematic(r, channel, setup).val) #MC bkg stat (some condition to neglect the smaller ones?) uname = 'Stat_' + binname + '_' + e.name c.addUncertainty(uname, 'lnN') c.specifyUncertainty('Stat_' + binname + '_' + e.name, binname, e.name, 1 + expected.sigma / expected.val) # assert total_exp_bkg>=0, "Total background is negative. Don't know what to do." c.specifyObservation(binname, int(total_exp_bkg)) #signal e = eSignal signal = e.cachedEstimate( r, channel, setup.sysClone({'reweight': ['reweightLeptonFastSimSF']})) c.specifyExpectation(binname, 'signal', signal.val) if signal.val > 0: #PU signal c.specifyUncertainty( 'PU', binname, 'signal', 1 + e.PUSystematic(r, channel, setup).val) #JEC signal c.specifyUncertainty( 'JEC', binname, 'signal', 1 + e.JECSystematic(r, channel, setup).val) #JER signal c.specifyUncertainty( 'JER', binname, 'signal', 1 + e.JERSystematic(r, channel, setup).val) #lepton FastSim SF uncertainty c.specifyUncertainty( 'leptonSF', binname, 'signal', 1 + e.leptonFSSystematic(r, channel, setup).val) #b-tagging SF (including FastSim SF) c.specifyUncertainty( 'SFb', binname, 'signal', 1 + e.btaggingSFbSystematic(r, channel, setup).val) c.specifyUncertainty( 'SFl', binname, 'signal', 1 + e.btaggingSFlSystematic(r, channel, setup).val) c.specifyUncertainty( 'SFFS', binname, 'signal', 1 + e.btaggingSFFSSystematic(r, channel, setup).val) #signal MC stat added in quadrature with PDF uncertainty: 10% uncorrelated uname = 'Stat_' + binname + '_signal' c.addUncertainty(uname, 'lnN') c.specifyUncertainty( uname, binname, 'signal', 1 + sqrt(0.1**2 + signal.sigma / signal.val)) if signal.val <= 0.01 and total_exp_bkg <= 0.01: # or (total_exp_bkg>300 and signal.val<0.05): if verbose: print "Muting bin %s. Total sig: %f, total bkg: %f" % ( binname, signal.val, total_exp_bkg) c.muted[binname] = True else: if verbose: print "NOT Muting bin %s. Total sig: %f, total bkg: %f" % ( binname, signal.val, total_exp_bkg) # c.addUncertainty('Lumi', 'lnN') c.specifyFlatUncertainty('Lumi', 1.046) cardFileName = c.writeToFile(cardFileName) else: print "File %s found. Reusing." % cardFileName res = c.calcLimit(cardFileName) mStop, mNeu = s['mStop'], s['mNeu'] try: if res: print "Result: mStop %i mNeu %i obs %5.3f exp %5.3f -1sigma %5.3f +1sigma %5.3f" % ( mStop, mNeu, res['-1.000'], res['0.500'], res['0.160'], res['0.840']) except: print "Something wrong with the limit: %r" % res return mStop, mNeu, res
def wrapper(s): c = cardFileWriter.cardFileWriter() c.releaseLocation = combineReleaseLocation cardFileName = os.path.join(limitDir, s.name + '.txt') if not os.path.exists(cardFileName) or overWrite: counter = 0 c.reset() c.addUncertainty('PU', 'lnN') c.addUncertainty('topPt', 'lnN') c.addUncertainty('JEC', 'lnN') c.addUncertainty('JER', 'lnN') c.addUncertainty('SFb', 'lnN') c.addUncertainty('SFl', 'lnN') if fastSim: c.addUncertainty('SFFS', 'lnN') c.addUncertainty('leptonSF', 'lnN') eSignal = MCBasedEstimate( name=s.name, sample={channel: s for channel in allChannels}, cacheDir=setup.defaultCacheDir()) for r in regions[1:]: for channel in ['MuMu', 'EE', 'EMu']: # for channel in ['all']: niceName = ' '.join([channel, r.__str__()]) binname = 'Bin' + str(counter) counter += 1 total_exp_bkg = 0 c.addBin(binname, [e.name for e in estimators], niceName) for e in estimators: expected = e.cachedEstimate(r, channel, setup) total_exp_bkg += expected.val c.specifyExpectation(binname, e.name, expected.val) if expected.val > 0: c.specifyUncertainty( 'PU', binname, e.name, 1 + e.PUSystematic(r, channel, setup).val) c.specifyUncertainty( 'JEC', binname, e.name, 1 + e.JECSystematic(r, channel, setup).val) c.specifyUncertainty( 'JER', binname, e.name, 1 + e.JERSystematic(r, channel, setup).val) c.specifyUncertainty( 'topPt', binname, e.name, 1 + e.topPtSystematic(r, channel, setup).val) c.specifyUncertainty( 'SFb', binname, e.name, 1 + e.btaggingSFbSystematic(r, channel, setup).val) c.specifyUncertainty( 'SFl', binname, e.name, 1 + e.btaggingSFlSystematic(r, channel, setup).val) #MC bkg stat (some condition to neglect the smaller ones?) uname = 'Stat_' + binname + '_' + e.name c.addUncertainty(uname, 'lnN') c.specifyUncertainty('Stat_' + binname + '_' + e.name, binname, e.name, 1 + expected.sigma / expected.val) c.specifyObservation(binname, int(total_exp_bkg)) #signal e = eSignal if fastSim: signalSetup = setup.sysClone( sys={'reweight': ['reweightLeptonFastSimSF']}, parameters={'useTriggers': False}) else: signalSetup = setup.sysClone( parameters={'useTriggers': False}) signal = e.cachedEstimate(r, channel, signalSetup) c.specifyExpectation(binname, 'signal', signal.val) if signal.val > 0: c.specifyUncertainty( 'PU', binname, 'signal', 1 + e.PUSystematic(r, channel, signalSetup).val) c.specifyUncertainty( 'JEC', binname, 'signal', 1 + e.JECSystematic(r, channel, signalSetup).val) c.specifyUncertainty( 'JER', binname, 'signal', 1 + e.JERSystematic(r, channel, signalSetup).val) c.specifyUncertainty( 'SFb', binname, 'signal', 1 + e.btaggingSFbSystematic(r, channel, signalSetup).val) c.specifyUncertainty( 'SFl', binname, 'signal', 1 + e.btaggingSFlSystematic(r, channel, signalSetup).val) if fastSim: c.specifyUncertainty( 'leptonSF', binname, 'signal', 1 + e.leptonFSSystematic(r, channel, signalSetup).val) c.specifyUncertainty( 'SFFS', binname, 'signal', 1 + e.btaggingSFFSSystematic( r, channel, signalSetup).val) #signal MC stat added in quadrature with PDF uncertainty: 10% uncorrelated uname = 'Stat_' + binname + '_signal' c.addUncertainty(uname, 'lnN') c.specifyUncertainty( uname, binname, 'signal', 1 + sqrt(0.1**2 + signal.sigma / signal.val)) if signal.val <= 0.01 and total_exp_bkg <= 0.01 or total_exp_bkg <= 0: # or (total_exp_bkg>300 and signal.val<0.05): if verbose: print "Muting bin %s. Total sig: %f, total bkg: %f" % ( binname, signal.val, total_exp_bkg) c.muted[binname] = True else: if verbose: print "NOT Muting bin %s. Total sig: %f, total bkg: %f" % ( binname, signal.val, total_exp_bkg) c.addUncertainty('Lumi', 'lnN') c.specifyFlatUncertainty('Lumi', 1.046) cardFileName = c.writeToFile(cardFileName) else: print "File %s found. Reusing." % cardFileName if args.signal == "DM": sConfig = s.mChi, s.mPhi, s.type elif args.signal == "T2tt": sConfig = s.mStop, s.mNeu if useCache and not overWrite and limitCache.contains(s): res = limitCache.get(sConfig) else: res = c.calcLimit(cardFileName) limitCache.add(sConfig, res, save=True) try: if res: if args.signal == "DM": sString = "mChi %i mPhi %i type %i" % sConfig elif args.signal == "T2tt": sString = "mStop %i mNeu %i" % sConfig print "Result: %i obs %5.3f exp %5.3f -1sigma %5.3f +1sigma %5.3f" % ( sString, res['-1.000'], res['0.500'], res['0.160'], res['0.840']) except: print "Something wrong with the limit: %r" % res return sConfig, res
def wrapper(s): c = cardFileWriter.cardFileWriter() c.releaseLocation = combineReleaseLocation cardFileName = os.path.join(limitDir, s.name + ".txt") if not os.path.exists(cardFileName) or overWrite: counter = 0 c.reset() c.addUncertainty("PU", "lnN") c.addUncertainty("topPt", "lnN") c.addUncertainty("JEC", "lnN") c.addUncertainty("JER", "lnN") c.addUncertainty("SFb", "lnN") c.addUncertainty("SFl", "lnN") c.addUncertainty("SFFS", "lnN") c.addUncertainty("leptonSF", "lnN") eSignal = MCBasedEstimate( name=s.name, sample={channel: s for channel in allChannels}, cacheDir=setup.defaultCacheDir() ) for r in regions[1:]: for channel in ["MuMu", "EE", "EMu"]: # for channel in ['all']: niceName = " ".join([channel, r.__str__()]) binname = "Bin" + str(counter) counter += 1 total_exp_bkg = 0 c.addBin(binname, [e.name for e in bkgEstimators], niceName) for e in bkgEstimators: expected = e.cachedEstimate(r, channel, setup) total_exp_bkg += expected.val c.specifyExpectation(binname, e.name, expected.val) if expected.val > 0: # PU bkg c.specifyUncertainty("PU", binname, e.name, 1 + e.PUSystematic(r, channel, setup).val) # JEC bkg c.specifyUncertainty("JEC", binname, e.name, 1 + e.JECSystematic(r, channel, setup).val) # JER bkg c.specifyUncertainty("JER", binname, e.name, 1 + e.JERSystematic(r, channel, setup).val) # topPt reweighting c.specifyUncertainty("topPt", binname, e.name, 1 + e.topPtSystematic(r, channel, setup).val) # b-tagging SF c.specifyUncertainty("SFb", binname, e.name, 1 + e.btaggingSFbSystematic(r, channel, setup).val) c.specifyUncertainty("SFl", binname, e.name, 1 + e.btaggingSFlSystematic(r, channel, setup).val) # MC bkg stat (some condition to neglect the smaller ones?) uname = "Stat_" + binname + "_" + e.name c.addUncertainty(uname, "lnN") c.specifyUncertainty( "Stat_" + binname + "_" + e.name, binname, e.name, 1 + expected.sigma / expected.val ) # assert total_exp_bkg>=0, "Total background is negative. Don't know what to do." c.specifyObservation(binname, int(total_exp_bkg)) # signal e = eSignal signalSetup = setup.sysClone( sys={"reweight": ["reweightLeptonFastSimSF"]}, parameters={"useTriggers": False} ) signal = e.cachedEstimate(r, channel, signalSetup) c.specifyExpectation(binname, "signal", signal.val) if signal.val > 0: # PU signal c.specifyUncertainty("PU", binname, "signal", 1 + e.PUSystematic(r, channel, signalSetup).val) # JEC signal c.specifyUncertainty("JEC", binname, "signal", 1 + e.JECSystematic(r, channel, signalSetup).val) # JER signal c.specifyUncertainty("JER", binname, "signal", 1 + e.JERSystematic(r, channel, signalSetup).val) # lepton FastSim SF uncertainty c.specifyUncertainty( "leptonSF", binname, "signal", 1 + e.leptonFSSystematic(r, channel, signalSetup).val ) # b-tagging SF (including FastSim SF) c.specifyUncertainty( "SFb", binname, "signal", 1 + e.btaggingSFbSystematic(r, channel, signalSetup).val ) c.specifyUncertainty( "SFl", binname, "signal", 1 + e.btaggingSFlSystematic(r, channel, signalSetup).val ) c.specifyUncertainty( "SFFS", binname, "signal", 1 + e.btaggingSFFSSystematic(r, channel, signalSetup).val ) # signal MC stat added in quadrature with PDF uncertainty: 10% uncorrelated uname = "Stat_" + binname + "_signal" c.addUncertainty(uname, "lnN") c.specifyUncertainty(uname, binname, "signal", 1 + sqrt(0.1 ** 2 + signal.sigma / signal.val)) if ( signal.val <= 0.01 and total_exp_bkg <= 0.01 or total_exp_bkg <= 0 ): # or (total_exp_bkg>300 and signal.val<0.05): if verbose: print "Muting bin %s. Total sig: %f, total bkg: %f" % (binname, signal.val, total_exp_bkg) c.muted[binname] = True else: if verbose: print "NOT Muting bin %s. Total sig: %f, total bkg: %f" % (binname, signal.val, total_exp_bkg) # c.addUncertainty("Lumi", "lnN") c.specifyFlatUncertainty("Lumi", 1.046) cardFileName = c.writeToFile(cardFileName) else: print "File %s found. Reusing." % cardFileName mStop, mNeu = s.mStop, s.mNeu if useCache and not overWrite and limitCache.contains((mStop, mNeu)): res = limitCache.get((mStop, mNeu)) else: res = c.calcLimit(cardFileName) try: if res: print "Result: mStop %i mNeu %i obs %5.3f exp %5.3f -1sigma %5.3f +1sigma %5.3f" % ( mStop, mNeu, res["-1.000"], res["0.500"], res["0.160"], res["0.840"], ) except: print "Something wrong with the limit: %r" % res limitCache.add((mStop, mNeu), res, save=True) return mStop, mNeu, res
var = vars[0] remainingVars = vars[1:] cuts = getCutsFromRegions(subRegions, var) # print "At:", var, "remaining", remainingVars, "looping over",cuts,subRegions, var for c in reversed(cuts): # print "Looping", c listRecursive(remainingVars, subRegions, requiredCuts+[c]) else: assert len(subRegions)==1, "Regions not unique!" r = subRegions[0] print ", ".join([c['name']+":"+str(c['cut']) for c in r['cuts']]) listRecursive() from StopsDilepton.tools.cardFileWriter import cardFileWriter c = cardFileWriter.cardFileWriter() c.defWidth=20 c.precision=6 c.unique=False limit={} signals = goodRegions[0]['sigYields'].keys() for s in reversed(signals): c.reset() for i, r in enumerate(goodRegions): c.addBin('Bin'+str(i), ['bkg'], 'Bin'+str(i)) bkg = r['bkgYield'] sig = r['sigYields'][s] c.specifyObservation('Bin'+str(i), int(bkg)) c.specifyExpectation('Bin'+str(i), 'bkg', bkg) c.specifyExpectation('Bin'+str(i), 'signal', sig)
def wrapper(s): c = cardFileWriter.cardFileWriter() c.releaseLocation = releaseLocation71XC counter=0 c.reset() c.addUncertainty('PU', 'lnN') c.addUncertainty('topPt', 'lnN') c.addUncertainty('JEC', 'lnN') c.addUncertainty('JER', 'lnN') c.addUncertainty('SFb', 'lnN') c.addUncertainty('SFl', 'lnN') c.addUncertainty('SFFS', 'lnN') c.addUncertainty('leptonSF', 'lnN') eSignal = MCBasedEstimate(name=s['name'], sample={channel:s for channel in allChannels}, cacheDir=setup.defaultCacheDir() ) cardFileName = os.path.join(setup.analysisOutputDir, setup.prefix(), 'cardFiles', limitPrefix, s['name']+'.txt') if not os.path.exists(cardFileName) or overWrite: for r in regions: for channel in ['MuMu', 'EE', 'EMu']: # for channel in ['all']: niceName = ' '.join([channel, r.__str__()]) binname = 'Bin'+str(counter) counter += 1 total_exp_bkg = 0 c.addBin(binname, [e.name for e in bkgEstimators], niceName) for e in bkgEstimators: expected = e.cachedEstimate(r, channel, setup) total_exp_bkg += expected.val c.specifyExpectation(binname, e.name, expected.val ) if expected.val>0: #PU bkg c.specifyUncertainty('PU', binname, e.name, 1 + e.PUSystematic(r, channel, setup).val ) #JEC bkg c.specifyUncertainty('JEC', binname, e.name, 1 + e.JECSystematic(r, channel, setup).val ) #JER bkg c.specifyUncertainty('JER', binname, e.name, 1 + e.JERSystematic(r, channel, setup).val ) #topPt reweighting c.specifyUncertainty('topPt', binname, e.name, 1 + e.topPtSystematic(r, channel, setup).val ) #b-tagging SF c.specifyUncertainty('SFb', binname, e.name, 1 + e.btaggingSFbSystematic(r, channel, setup).val ) c.specifyUncertainty('SFl', binname, e.name, 1 + e.btaggingSFlSystematic(r, channel, setup).val ) #MC bkg stat (some condition to neglect the smaller ones?) uname = 'Stat_'+binname+'_'+e.name c.addUncertainty(uname, 'lnN') c.specifyUncertainty('Stat_'+binname+'_'+e.name, binname, e.name, 1+expected.sigma/expected.val ) # assert total_exp_bkg>=0, "Total background is negative. Don't know what to do." c.specifyObservation(binname, int(total_exp_bkg) ) #signal e = eSignal signal = e.cachedEstimate(r, channel, setup.sysClone({'reweight':['reweightLeptonFastSimSF']})) c.specifyExpectation(binname, 'signal', signal.val ) if signal.val>0: #PU signal c.specifyUncertainty('PU', binname, 'signal', 1 + e.PUSystematic(r, channel, setup).val ) #JEC signal c.specifyUncertainty('JEC', binname, 'signal', 1 + e.JECSystematic(r, channel, setup).val ) #JER signal c.specifyUncertainty('JER', binname, 'signal', 1 + e.JERSystematic(r, channel, setup).val ) #lepton FastSim SF uncertainty c.specifyUncertainty('leptonSF', binname, 'signal', 1 + e.leptonFSSystematic(r, channel, setup).val ) #b-tagging SF (including FastSim SF) c.specifyUncertainty('SFb', binname, 'signal', 1 + e.btaggingSFbSystematic(r, channel, setup).val ) c.specifyUncertainty('SFl', binname, 'signal', 1 + e.btaggingSFlSystematic(r, channel, setup).val ) c.specifyUncertainty('SFFS', binname, 'signal', 1 + e.btaggingSFFSSystematic(r, channel, setup).val ) #signal MC stat added in quadrature with PDF uncertainty: 10% uncorrelated uname = 'Stat_'+binname+'_signal' c.addUncertainty(uname, 'lnN') c.specifyUncertainty(uname, binname, 'signal', 1 + sqrt(0.1**2 + signal.sigma/signal.val) ) if signal.val<=0.01 and total_exp_bkg<=0.01:# or (total_exp_bkg>300 and signal.val<0.05): if verbose: print "Muting bin %s. Total sig: %f, total bkg: %f"%(binname, signal.val, total_exp_bkg) c.muted[binname] = True else: if verbose: print "NOT Muting bin %s. Total sig: %f, total bkg: %f"%(binname, signal.val, total_exp_bkg) # c.addUncertainty('Lumi', 'lnN') c.specifyFlatUncertainty('Lumi', 1.046) cardFileName = c.writeToFile(cardFileName) else: print "File %s found. Reusing."%cardFileName res = c.calcLimit(cardFileName) mStop, mNeu = s['mStop'], s['mNeu'] try: if res: print "Result: mStop %i mNeu %i obs %5.3f exp %5.3f -1sigma %5.3f +1sigma %5.3f"%(mStop, mNeu, res['-1.000'], res['0.500'], res['0.160'], res['0.840']) except: print "Something wrong with the limit: %r"%res return mStop, mNeu, res