def elmu(sample, rname): """ 1e, 1mu. mostly ttbar """ selector = ROOT.EventSelector(rname) selector.addOperator(ROOT.HLTFilter(selconf['smuTrigger'])) selector.setPreskim('muons.size > 0 && electrons.size > 0') selector.addOperator(ROOT.MetFilters()) leptons = ROOT.LeptonSelection() leptons.setN(1, 1) leptons.setStrictMu(False) leptons.setStrictEl(False) leptons.setRequireTight(False) selector.addOperator(leptons) # NOTE: photon selection is not cleaned up against leptons and we want it that way - we are interested also in photons overlapping with electrons photonSel = ROOT.PhotonSelection() photonSel.setIDTune(selconf['photonIDTune']) photonSel.setWP(selconf['photonWP']) setupPhotonSelection(photonSel, changes=['-EVeto']) photonSel.setMinPt(30.) photonSel.setIgnoreDecision(True) selector.addOperator(photonSel) jets = ROOT.JetCleaning() jets.setCleanAgainst(ROOT.cTaus, False) selector.addOperator(jets) selector.addOperator(ROOT.CopyMet()) if not sample.data: selector.addOperator( ROOT.ConstantWeight(sample.crosssection / sample.sumw, 'crosssection')) su.addPUWeight(sample, selector) addPDFVariation(sample, selector) return selector
def leptonBase(sample, rname, flavor, selcls=None): """ Base for n-lepton + photon selection. For MC, we could use PartonSelector, but for interest of clarity and comparing cut flow with the other groups, we let events with all flavors pass. """ if selcls is None: selector = ROOT.EventSelector(rname) else: selector = selcls(rname) selector.setPreskim( 'superClusters.rawPt > 165. && TMath::Abs(superClusters.eta) < 1.4442') if sample.data: selector.addOperator(ROOT.HLTFilter(selconf['sphTrigger'])) else: partons = ROOT.PartonFlavor() if flavor == ROOT.lElectron: partons.setRequiredPdgId(11) elif flavor == ROOT.lMuon: partons.setRequiredPdgId(13) selector.addOperator(partons) operators = [ 'MetFilters', 'PhotonSelection', 'LeptonSelection', 'TauVeto', 'JetCleaning', 'BjetVeto', 'CopyMet', 'CopySuperClusters', 'LeptonRecoil', ] if not sample.data: operators.append('MetVariations') operators += [ 'PhotonMetDPhi', 'JetMetDPhi', 'Met', 'PhotonPtOverMet', 'PhotonMt' ] for op in operators: selector.addOperator(getattr(ROOT, op)()) jetDPhi = selector.findOperator('JetMetDPhi') jetDPhi.setMetSource(ROOT.kInMet) photonSel = selector.findOperator('PhotonSelection') photonSel.setIDTune(selconf['photonIDTune']) photonSel.setWP(selconf['photonWP']) leptonSel = selector.findOperator('LeptonSelection') leptonSel.setRequireMedium(False) setupPhotonSelection(photonSel) selector.findOperator('LeptonRecoil').setFlavor(flavor) if not sample.data: metVar = selector.findOperator('MetVariations') metVar.setPhotonSelection(photonSel) realMetVar = ROOT.MetVariations('RealMetVar') realMetVar.setMetSource(ROOT.kInMet) realMetVar.setPhotonSelection(photonSel) selector.findOperator('PhotonMetDPhi').setMetVariations(metVar) jetDPhi.setMetVariations(realMetVar) selector.addOperator( ROOT.ConstantWeight(sample.crosssection / sample.sumw, 'crosssection')) su.addPUWeight(sample, selector) addIDSFWeight(sample, selector) addPDFVariation(sample, selector) if flavor == ROOT.lElectron: addElectronIDSFWeight(sample, selector) else: addMuonIDSFWeight(sample, selector) addElectronVetoSFWeight(sample, selector) addMuonVetoSFWeight(sample, selector) if not sample.data: selector.findOperator('PartonFlavor').setIgnoreDecision(True) selector.findOperator('TauVeto').setIgnoreDecision(True) selector.findOperator('BjetVeto').setIgnoreDecision(True) selector.findOperator('JetCleaning').setCleanAgainst(ROOT.cTaus, False) selector.findOperator('PhotonMetDPhi').setIgnoreDecision(True) selector.findOperator('JetMetDPhi').setIgnoreDecision(True) selector.findOperator('Met').setIgnoreDecision(True) selector.findOperator('PhotonPtOverMet').setIgnoreDecision(True) return selector