def addAlternatePairInfo(self, step): ''' Add modules to embed alternate lepton pair (e.g. e1+m1) info. ''' for chan in parseChannels('zz'): mod = cms.EDProducer( 'AlternateDaughterInfoEmbedder', src=step.getObjTag(chan), names=cms.vstring(*mapObjects(chan)), fsrLabel=cms.string("fsr"), ) step.addModule(chan + 'AlternatePairs', mod, chan)
def addAlternatePairInfo(self, step): ''' Add modules to embed alternate lepton pair (e.g. e1+m1) info. ''' for chan in parseChannels('zz'): mod = cms.EDProducer( 'AlternateDaughterInfoEmbedder', src = step.getObjTag(chan), names = cms.vstring(*mapObjects(chan)), fsrLabel = cms.string("fsr"), ) step.addModule(chan+'AlternatePairs', mod, chan)
def makeGenBranchSet(channel, extraInitialStateBranches=[], extraIntermediateStateBranches=[], **extraFinalObjectBranches): if len(channel) != 4: raise RuntimeError("makeGenBranchSet is only implemented for 4l final " "states. Please add it for {}".format(channel)) branches = [genNtupleEventBranches, objectBranches ] + extraInitialStateBranches branches.append(makeCrossDaughterBranches(channel)) branchSet = combinePSets(*branches) finalObjects = mapObjects(channel) daughterNames = [ '_'.join(finalObjects[:2] + ['']), '_'.join(finalObjects[2:] + ['']), ] branchSet.daughterNames = cms.vstring(*daughterNames) finalObjBranches = { 'e': combinePSets(objectBranches.clone(), extraFinalObjectBranches.get('e', cms.PSet())), 'm': combinePSets(objectBranches.clone(), extraFinalObjectBranches.get('m', cms.PSet())), } z1BranchSet = objectBranches.clone( daughterNames=cms.vstring(*finalObjects[:2]), daughterParams=cms.VPSet(finalObjBranches[channel[0]], finalObjBranches[channel[0]]), ) z1BranchSet = combinePSets(z1BranchSet, *extraIntermediateStateBranches) z2BranchSet = objectBranches.clone( daughterNames=cms.vstring(*finalObjects[2:]), daughterParams=cms.VPSet(finalObjBranches[channel[2]], finalObjBranches[channel[2]]), ) z2BranchSet = combinePSets(z2BranchSet, *extraIntermediateStateBranches) branchSet.daughterParams = cms.VPSet(z1BranchSet, z2BranchSet) return branchSet
def makeGenBranchSet(channel, extraInitialStateBranches=[], extraIntermediateStateBranches=[], **extraFinalObjectBranches): if len(channel) != 4: raise RuntimeError("makeGenBranchSet is only implemented for 4l final " "states. Please add it for {}".format(channel)) branches = [genNtupleEventBranches, objectBranches] + extraInitialStateBranches branches.append(makeCrossDaughterBranches(channel)) branchSet = combinePSets(*branches) finalObjects = mapObjects(channel) daughterNames = [ '_'.join(finalObjects[:2]+['']), '_'.join(finalObjects[2:]+['']), ] branchSet.daughterNames = cms.vstring(*daughterNames) finalObjBranches = { 'e' : combinePSets(objectBranches.clone(), extraFinalObjectBranches.get('e',cms.PSet())), 'm' : combinePSets(objectBranches.clone(), extraFinalObjectBranches.get('m',cms.PSet())), } z1BranchSet = objectBranches.clone( daughterNames = cms.vstring(*finalObjects[:2]), daughterParams = cms.VPSet(finalObjBranches[channel[0]], finalObjBranches[channel[0]]), ) z1BranchSet = combinePSets(z1BranchSet, *extraIntermediateStateBranches) z2BranchSet = objectBranches.clone( daughterNames = cms.vstring(*finalObjects[2:]), daughterParams = cms.VPSet(finalObjBranches[channel[2]], finalObjBranches[channel[2]]), ) z2BranchSet = combinePSets(z2BranchSet, *extraIntermediateStateBranches) branchSet.daughterParams = cms.VPSet(z1BranchSet,z2BranchSet) return branchSet
def makeCrossDaughterBranches(channel, includeFSR=False): ''' Make a PSet of branches for di-object variables outside of Zs, e.g. e1_m2_Mass. ''' objects = mapObjects(channel) params = {'floats' : {}, 'bools' : {}} for pair in combinations(objects, 2): # don't include regular Zs if pair[0][0] == pair[1][0] and int(pair[0][1]) % 2 == 1 and int(pair[0][1]) + 1 == int(pair[1][1]): continue name = '_'.join([pair[0], pair[1], '']) params['floats'][name + 'Mass'] = cms.string('? hasUserFloat("{0}") ? userFloat("{0}") : -999.'.format(name+'Mass')) if includeFSR: params['floats'][name + 'MassNoFSR'] = cms.string('? hasUserFloat("{0}") ? userFloat("{0}") : -999.'.format(name+'MassNoFSR')) params['bools'][name + 'SS'] = cms.string('? hasUserFloat("{0}") ? userFloat("{0}") : 0'.format(name+'SS')) params['floats'][name + 'DR'] = cms.string('? hasUserFloat("{0}") ? userFloat("{0}") : -999.'.format(name+'DR')) return dict2PSet(params)
def makeBranchSet(channel, extraInitialStateBranches=[], extraIntermediateStateBranches=[], **extraFinalObjectBranches): ''' extraInitialStateBranches (PSet or list of PSets): branches for the whole event or the whole system extraIntermediateStateBranches (PSet or list of PSets): branches for the Zs or other intermediate composite objects extraFinalObjectBranches (PSet or list of PSets keyed to object type, e.g. 'e'): branches for individual leptons, jets, etc. ''' branches = [eventBranches] if hasattr(extraInitialStateBranches, '__iter__'): for b in extraInitialStateBranches: branches.append(b) elif isinstance(extraInitialStateBranches, cms.PSet): branches.append(extraInitialStateBranches) finalObjects = mapObjects(channel) if len(channel) == 1: # single object branches.append( makeLepBranchSet( channel, extraInitialStateBranches + extraFinalObjectBranches[channel])) elif len(channel) == 2: # single Z assert channel[0] == channel[1], '{} does not make a valid Z'.format( channel) branches.append( makeZBranchSet(channel[0], 1, extraIntermediateStateBranches, extraFinalObjectBranches.get(channel[0], []))) else: branches.append(objectBranches) if len(channel) == 3: # Z+l if channel[0] != channel[1]: # emm -> mme assert channel[1] == channel[2], "Invalid channel {}".format( channel) channel = channel[1:] + channel[0] finalObjects = finalObjects[1:] + finalObjects[:1] assert channel[0] == channel[1], "Invalid channel {}".format(channel) branches.append(makeCrossDaughterBranches(channel, True)) daughterSets = [ makeZBranchSet(channel[0], 1, extraIntermediateStateBranches, extraFinalObjectBranches.get(channel[0], [])), makeLepBranchSet(channel[2], extraFinalObjectBranches.get(channel[2], [])) ] daughterNames = [ '_'.join(finalObjects[:2] + ['']), finalObjects[2], ] elif len(channel) == 4: assert channel[0] == channel[1] and channel[2] == channel[3], \ 'Invalid channel {}'.format(channel) branches.append(makeCrossDaughterBranches(channel, True)) daughterSets = [ makeZBranchSet(channel[0], 1, extraIntermediateStateBranches, extraFinalObjectBranches.get(channel[0], [])), makeZBranchSet(channel[2], int(finalObjects[3][1]) / 2, extraIntermediateStateBranches, extraFinalObjectBranches.get(channel[2], [])), ] daughterNames = [ '_'.join(finalObjects[:2] + ['']), '_'.join(finalObjects[2:] + ['']), ] else: daughterSets = [] daughterNames = [] branchSet = combinePSets(*branches) if daughterSets: branchSet.daughterParams = cms.VPSet(*daughterSets) if daughterNames: branchSet.daughterNames = cms.vstring(*daughterNames) return branchSet
def makeBranchSet(channel, extraInitialStateBranches=[], extraIntermediateStateBranches=[], **extraFinalObjectBranches): ''' extraInitialStateBranches (PSet or list of PSets): branches for the whole event or the whole system extraIntermediateStateBranches (PSet or list of PSets): branches for the Zs or other intermediate composite objects extraFinalObjectBranches (PSet or list of PSets keyed to object type, e.g. 'e'): branches for individual leptons, jets, etc. ''' branches = [eventBranches] if hasattr(extraInitialStateBranches, '__iter__'): for b in extraInitialStateBranches: branches.append(b) elif isinstance(extraInitialStateBranches, cms.PSet): branches.append(extraInitialStateBranches) finalObjects = mapObjects(channel) if len(channel) == 1: # single object branches.append(makeLepBranchSet(channel, extraInitialStateBranches+extraFinalObjectBranches[channel])) elif len(channel) == 2: # single Z assert channel[0] == channel[1], '{} does not make a valid Z'.format(channel) branches.append(makeZBranchSet(channel[0], 1, extraIntermediateStateBranches, extraFinalObjectBranches.get(channel[0], []))) else: branches.append(objectBranches) if len(channel) == 3: # Z+l if channel[0] != channel[1]: # emm -> mme assert channel[1] == channel[2], "Invalid channel {}".format(channel) channel = channel[1:] + channel[0] finalObjects = finalObjects[1:] + finalObjects[:1] assert channel[0] == channel[1], "Invalid channel {}".format(channel) branches.append(makeCrossDaughterBranches(channel, True)) daughterSets = [ makeZBranchSet(channel[0], 1, extraIntermediateStateBranches, extraFinalObjectBranches.get(channel[0], [])), makeLepBranchSet(channel[2], extraFinalObjectBranches.get(channel[2], [])) ] daughterNames = [ '_'.join(finalObjects[:2]+['']), finalObjects[2], ] elif len(channel) == 4: assert channel[0] == channel[1] and channel[2] == channel[3], \ 'Invalid channel {}'.format(channel) branches.append(makeCrossDaughterBranches(channel, True)) daughterSets = [ makeZBranchSet(channel[0], 1, extraIntermediateStateBranches, extraFinalObjectBranches.get(channel[0], [])), makeZBranchSet(channel[2], int(finalObjects[3][1])/2, extraIntermediateStateBranches, extraFinalObjectBranches.get(channel[2], [])), ] daughterNames = [ '_'.join(finalObjects[:2]+['']), '_'.join(finalObjects[2:]+['']), ] else: daughterSets = [] daughterNames = [] branchSet = combinePSets(*branches) if daughterSets: branchSet.daughterParams = cms.VPSet(*daughterSets) if daughterNames: branchSet.daughterNames = cms.vstring(*daughterNames) return branchSet
def makeAnalysisStep(self, stepName, **inputs): step = super(GenZZBase, self).makeAnalysisStep(stepName, **inputs) if stepName == 'initialStateCreation': for chan in parseChannels('zz'): z1Name = 'z{}1'.format(chan[0]) z2Name = 'z{}{}'.format(chan[2], 2 if chan[0] == chan[2] else 1) mod = cms.EDProducer( 'PATCandViewShallowCloneCombiner', decay=cms.string('{0} {1}'.format( step.getObjTagString(chan[:2]), step.getObjTagString(chan[2:]))), roles=cms.vstring(z1Name, z2Name), cut=cms.string( ('4. < daughter("{}").mass && ' '4. < daughter("{}").mass').format(z1Name, z2Name)), checkCharge=cms.bool(False), setPdgId=cms.int32(25), ) step.addModule(chan + 'GenProducer', mod, chan) cleaner = cms.EDProducer( "GenZZCleaner", src=step.getObjTag(chan), l1PtCut=cms.double(20.), l2PtCut=cms.double(10.), l3PtCut=cms.double(5.), l4PtCut=cms.double(5.), etaCut=cms.double(2.5), ossfMassCut=cms.double(4.), z1MassMin=cms.double(40.), z1MassMax=cms.double(120.), z2MassMin=cms.double(4.), z2MassMax=cms.double(120.), ) step.addModule(chan + 'GenZZCleaner', cleaner, chan) if stepName == 'initialStateEmbedding': for chan in parseChannels('zz'): mod = cms.EDProducer( 'AlternateDaughterInfoEmbedder', src=step.getObjTag(chan), names=cms.vstring(*mapObjects(chan)), fsrLabel=cms.string(""), ) step.addModule(chan + 'AlternatePairs', mod, chan) if stepName == 'selection': # select and cross clean gen jets mod = cms.EDProducer( "GenJetCleaner", src=step.getObjTag('j'), preselection=cms.string('pt > 30. && abs(eta) < 4.7'), checkOverlaps=cms.PSet( electrons=cms.PSet( src=step.getObjTag('e'), preselection=cms.string(''), deltaR=cms.double(0.4), ), muons=cms.PSet( src=step.getObjTag('m'), preselection=cms.string(''), deltaR=cms.double(0.4), ), ), finalCut=cms.string(''), ) step.addModule('genJetCleaner', mod, 'j') return step
def makeAnalysisStep(self, stepName, **inputs): step = super(GenZZBase, self).makeAnalysisStep(stepName, **inputs) if stepName == 'initialStateCreation': for chan in parseChannels('zz'): z1Name = 'z{}1'.format(chan[0]) z2Name = 'z{}{}'.format(chan[2], 2 if chan[0] == chan[2] else 1) mod = cms.EDProducer( 'PATCandViewShallowCloneCombiner', decay = cms.string('{0} {1}'.format(step.getObjTagString(chan[:2]), step.getObjTagString(chan[2:]))), roles = cms.vstring(z1Name, z2Name), cut = cms.string(('4. < daughter("{}").mass && ' '4. < daughter("{}").mass').format(z1Name, z2Name)), checkCharge = cms.bool(False), setPdgId = cms.int32(25), ) step.addModule(chan+'GenProducer', mod, chan) cleaner = cms.EDProducer( "GenZZCleaner", src = step.getObjTag(chan), l1PtCut = cms.double(20.), l2PtCut = cms.double(10.), l3PtCut = cms.double(5.), l4PtCut = cms.double(5.), etaCut = cms.double(2.5), ossfMassCut = cms.double(4.), z1MassMin = cms.double(40.), z1MassMax = cms.double(120.), z2MassMin = cms.double(4.), z2MassMax = cms.double(120.), ) step.addModule(chan+'GenZZCleaner', cleaner, chan) if stepName == 'initialStateEmbedding': for chan in parseChannels('zz'): mod = cms.EDProducer( 'AlternateDaughterInfoEmbedder', src = step.getObjTag(chan), names = cms.vstring(*mapObjects(chan)), fsrLabel = cms.string(""), ) step.addModule(chan+'AlternatePairs', mod, chan) if stepName == 'selection': # select and cross clean gen jets mod = cms.EDProducer( "GenJetCleaner", src=step.getObjTag('j'), preselection=cms.string('pt > 30. && abs(eta) < 4.7'), checkOverlaps = cms.PSet( electrons = cms.PSet( src=step.getObjTag('e'), preselection=cms.string(''), deltaR=cms.double(0.4), ), muons = cms.PSet( src=step.getObjTag('m'), preselection=cms.string(''), deltaR=cms.double(0.4), ), ), finalCut = cms.string(''), ) step.addModule('genJetCleaner', mod, 'j') return step