Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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