Example #1
0
def addGenuineTauPreselection(process,
                              sequence,
                              param,
                              prefix="genuineTauPreselection",
                              pileupWeight=None,
                              maxGenTaus=None):
    counters = []

    genTauSequence = cms.Sequence()
    # Create PU weight producer for the counters
    if pileupWeight == None:
        puModule = cms.EDProducer(
            "HPlusVertexWeightProducer",
            alias=cms.string("pileupWeight"),
            histogramAmbientLevel=cms.untracked.string("Systematics"))
        HChTools.insertPSetContentsTo(param.vertexWeight.clone(), puModule)
        pileupWeight = prefix + "PileupWeight"
        setattr(process, pileupWeight, puModule)
        genTauSequence *= puModule

    counterPrototype = cms.EDProducer("HPlusEventCountProducer",
                                      weightSrc=cms.InputTag(pileupWeight))

    allCount = counterPrototype.clone()
    setattr(process, prefix + "AllCount", allCount)
    counters.append(prefix + "AllCount")

    # Generator taus (if you modify this, remember to modify similar in below)
    genTaus = cms.EDFilter("GenParticleSelector",
                           src=cms.InputTag("genParticles"),
                           cut=cms.string(generatorTauSelection %
                                          generatorTauPt))
    genTausName = prefix + "GenTau"
    setattr(process, genTausName, genTaus)

    if maxGenTaus is not None:
        genTausFilter = cms.EDFilter(
            "PATCandViewCountFilter",
            src=cms.InputTag(genTausName),
            minNumber=cms.uint32(1),
            maxNumber=cms.uint32(maxGenTaus),
        )
    else:
        genTausFilter = cms.EDFilter(
            "CandViewCountFilter",
            src=cms.InputTag(genTausName),
            minNumber=cms.uint32(1),
        )
    setattr(process, prefix + "GenTauFilter", genTausFilter)

    genTausCount = counterPrototype.clone()
    setattr(process, prefix + "GenTauCount", genTausCount)
    counters.append(prefix + "GenTauCount")

    genTauSequence *= (allCount * genTaus * genTausFilter * genTausCount)
    setattr(process, prefix + "Sequence", genTauSequence)
    sequence *= genTauSequence

    return counters
Example #2
0
def addGenuineTauPreselection(process, sequence, param, prefix="genuineTauPreselection", pileupWeight=None, maxGenTaus=None):
    counters = []

    genTauSequence = cms.Sequence()
    # Create PU weight producer for the counters
    if pileupWeight == None:
        puModule = cms.EDProducer("HPlusVertexWeightProducer",
            alias = cms.string("pileupWeight"),
            histogramAmbientLevel = cms.untracked.string("Systematics")
        )
        HChTools.insertPSetContentsTo(param.vertexWeight.clone(), puModule)
        pileupWeight = prefix+"PileupWeight"
        setattr(process, pileupWeight, puModule)
        genTauSequence *= puModule
    
    counterPrototype = cms.EDProducer("HPlusEventCountProducer",
        weightSrc = cms.InputTag(pileupWeight)
    )

    allCount = counterPrototype.clone()
    setattr(process, prefix+"AllCount", allCount)
    counters.append(prefix+"AllCount")

    # Generator taus (if you modify this, remember to modify similar in below)
    genTaus = cms.EDFilter("GenParticleSelector",
        src = cms.InputTag("genParticles"),
        cut = cms.string(generatorTauSelection % generatorTauPt)
    )
    genTausName = prefix+"GenTau"
    setattr(process, genTausName, genTaus)

    if maxGenTaus is not None:
        genTausFilter = cms.EDFilter("PATCandViewCountFilter",
            src = cms.InputTag(genTausName),
            minNumber = cms.uint32(1),
            maxNumber = cms.uint32(maxGenTaus),
        )
    else:
        genTausFilter = cms.EDFilter("CandViewCountFilter",
            src = cms.InputTag(genTausName),
            minNumber = cms.uint32(1),
        )
    setattr(process, prefix+"GenTauFilter", genTausFilter)

    genTausCount = counterPrototype.clone()
    setattr(process, prefix+"GenTauCount", genTausCount)
    counters.append(prefix+"GenTauCount")

    genTauSequence *= (
        allCount *
        genTaus * genTausFilter * genTausCount
    )
    setattr(process, prefix+"Sequence", genTauSequence)
    sequence *= genTauSequence

    return counters
def addGenuineTauPreselection(process, sequence, param, prefix="genuineTauPreselection"):
    counters = []

    # Create PU weight producer for the counters
    pileupWeight = cms.EDProducer("HPlusVertexWeightProducer",
        alias = cms.string("pileupWeight"),
    )
    HChTools.insertPSetContentsTo(param.vertexWeight.clone(), pileupWeight)
    setattr(process, prefix+"PileupWeight", pileupWeight)

    counterPrototype = cms.EDProducer("HPlusEventCountProducer",
        weightSrc = cms.InputTag(prefix+"PileupWeight")
    )

    allCount = counterPrototype.clone()
    setattr(process, prefix+"AllCount", allCount)
    counters.append(prefix+"AllCount")

    # Generator taus (if you modify this, remember to modify similar in below)
    genTaus = cms.EDFilter("GenParticleSelector",
        src = cms.InputTag("genParticles"),
        cut = cms.string("abs(pdgId()) == 15 && pt() > 40 && abs(eta()) < 2.1")
    )
    genTausName = prefix+"GenTau"
    setattr(process, genTausName, genTaus)

    genTausFilter = cms.EDFilter("CandViewCountFilter",
        src = cms.InputTag(genTausName),
        minNumber = cms.uint32(1),
    )
    setattr(process, prefix+"GenTauFilter", genTausFilter)

    genTausCount = counterPrototype.clone()
    setattr(process, prefix+"GenTauCount", genTausCount)
    counters.append(prefix+"GenTauCount")

    genTauSequence = cms.Sequence(
        pileupWeight *
        allCount *
        genTaus * genTausFilter * genTausCount
    )
    setattr(process, prefix+"Sequence", genTauSequence)
    sequence *= genTauSequence

    return counters
Example #4
0
def addEmbeddingLikePreselection(process, sequence, param, prefix="embeddingLikePreselection", disableTrigger=True, pileupWeight=None, selectOnlyFirstGenTau=False, maxGenTaus=None):
    counters = []

    genTauSequence = cms.Sequence()
    # Create PU weight producer for the counters
    if pileupWeight == None:
        puModule = cms.EDProducer("HPlusVertexWeightProducer",
            alias = cms.string("pileupWeight"),
            histogramAmbientLevel = cms.untracked.string("Systematics")
        )
        HChTools.insertPSetContentsTo(param.vertexWeight.clone(), puModule)
        pileupWeight = prefix+"PileupWeight"
        setattr(process, pileupWeight, puModule)
        genTauSequence *= puModule
    
    counterPrototype = cms.EDProducer("HPlusEventCountProducer",
        weightSrc = cms.InputTag(pileupWeight)
    )

    # Disable trigger
    if disableTrigger:
        param.trigger.selectionType = "disabled"
        param.tauTriggerEfficiencyScaleFactor.mode = "disabled"
        param.metTriggerEfficiencyScaleFactor.mode = "disabled"

    allCount = counterPrototype.clone()
    setattr(process, prefix+"AllCount", allCount)
    genTauSequence *= allCount
    counters.append(prefix+"AllCount")

    # Primary vertex
    pvFilter = cms.EDFilter("VertexCountFilter",
        src = cms.InputTag("selectedPrimaryVertex"),
        minNumber = cms.uint32(1),
        maxNumber = cms.uint32(999)
    )
    pvFilterCount = counterPrototype.clone()
    setattr(process, prefix+"PrimaryVertex", pvFilter)
    setattr(process, prefix+"PrimaryVertexCount", pvFilterCount)
    genTauSequence *= (pvFilter * pvFilterCount)
    counters.append(prefix+"PrimaryVertexCount")

    # Generator taus (if you modify this, remember to modify similar in above)
    genTaus = cms.EDFilter("GenParticleSelector",
        src = cms.InputTag("genParticles"),
        cut = cms.string(generatorTauSelection % generatorTauPt)
    )
    genTausName = prefix+"GenTau"
    setattr(process, genTausName, genTaus)
    genTauSequence *= genTaus

    if maxGenTaus is not None:
        genTausFilter = cms.EDFilter("PATCandViewCountFilter",
            src = cms.InputTag(genTausName),
            minNumber = cms.uint32(1),
            maxNumber = cms.uint32(maxGenTaus),
        )
    else:
        genTausFilter = cms.EDFilter("CandViewCountFilter",
            src = cms.InputTag(genTausName),
            minNumber = cms.uint32(1),
        )
    setattr(process, prefix+"GenTauFilter", genTausFilter)
    genTauSequence *= genTausFilter

    genTausCount = counterPrototype.clone()
    setattr(process, prefix+"GenTauCount", genTausCount)
    genTauSequence *= genTausCount
    counters.append(prefix+"GenTauCount")

    # Select first generator tau for e/mu veto, and if the flag is
    # true, also for the jet cleaning and tau selection
    genTauFirst = cms.EDProducer("HPlusFirstGenParticleSelector",
        src = cms.InputTag(genTausName)
    )
    genTauFirstName = prefix+"GenTauFirst"
    setattr(process, genTauFirstName, genTauFirst)
    genTauSequence *= genTauFirst
    if selectOnlyFirstGenTau:
         genTausName = genTauFirstName

    genTausVisible = cms.EDProducer("HPlusGenVisibleTauComputer",
        src = cms.InputTag(genTausName)
    )
    genTausVisibleName = prefix+"GenTauVisible"
    setattr(process, genTausVisibleName, genTausVisible)
    genTauSequence *= genTausVisible

    genTauFirstVisible = cms.EDProducer("HPlusGenVisibleTauComputer",
        src = cms.InputTag(genTauFirstName)
    )
    genTauFirstVisibleName = prefix+"GenTauFirstVisible"
    setattr(process, genTauFirstVisibleName, genTauFirstVisible)
    genTauSequence *= genTauFirstVisible
    
    # Tau selection
    # genTauReco = cms.EDProducer("HPlusPATTauCandViewClosestDeltaRSelector",
    #     src = cms.InputTag("selectedPatTausHpsPFTau"),
    #     refSrc = cms.InputTag(genTausName),
    #     maxDeltaR = cms.double(0.5),
    # )
    genTauReco = cms.EDProducer("HPlusPATTauLorentzVectorViewClosestDeltaRSelector",
#        src = cms.InputTag("selectedPatTaus"+PF2PATVersion), # not trigger matched
#        src = cms.InputTag("selectedPatTausHpsPFTau"), # 2011
        src = cms.InputTag("selectedPatTaus"),
        refSrc = cms.InputTag(genTausVisibleName),
        maxDeltaR = cms.double(0.5),
    )

#     if PF2PATVersion != "":
#         raise Exception("I don't support PF2PAT at the moment")
    if not disableTrigger:
        genTauReco.src = param.tauSelection.src.value()
    genTauRecoName = prefix+"TauMCMatched"
    setattr(process, genTauRecoName, genTauReco)
    genTauSequence *= genTauReco
    param.tauSelection.src = genTauRecoName

    genTauFirstReco = genTauReco.clone(
        refSrc = genTauFirstVisibleName
    )
    genTauFirstRecoName = prefix+"FirstTauMCMatched"
    setattr(process, genTauFirstRecoName, genTauFirstReco)
    genTauSequence *= genTauFirstReco

    if not selectOnlyFirstGenTau:
        # Select the tau candidate which is most likely going to pass the identification
        genTauSelected = cms.EDProducer("HPlusPATTauMostLikelyIdentifiedSelector",
            eventCounter = param.eventCounter.clone(enabled = cms.untracked.bool(False)),
            tauSelection = param.tauSelection.clone(),
            vertexSrc = cms.InputTag(param.primaryVertexSelection.selectedSrc.value()),
            histogramAmbientLevel = cms.untracked.string("Systematics"),
        )
        genTauSelectedName = prefix+"TauSelected"
        setattr(process, genTauSelectedName, genTauSelected)
        genTauSequence *= genTauSelected
        param.tauSelection.src = genTauSelectedName
    
    genTauCleanPSet = cms.PSet(
#        src                 = cms.InputTag(param.tauSelection.src.value()),
        src                 = cms.InputTag(genTauFirstRecoName),
        algorithm           = cms.string("byDeltaR"),
        preselection        = cms.string(""),
        deltaR              = cms.double(0.5),
        checkRecoComponents = cms.bool(False),
        pairCut             = cms.string(""),
        requireNoOverlaps   = cms.bool(True),
    )

    # Clean the selected generator tau from the electrons and muons
    # for the e/mu veto. We don't want to reject events where the e/mu
    # comes from the tau decay.
    from PhysicsTools.PatAlgos.cleaningLayer1.electronCleaner_cfi import cleanPatElectrons
    from PhysicsTools.PatAlgos.cleaningLayer1.muonCleaner_cfi import cleanPatMuons
    cleanedElectrons = cleanPatElectrons.clone(
        src = cms.InputTag(param.ElectronSelection.ElectronCollectionName.value()),
        checkOverlaps = cms.PSet(
            genTaus = genTauCleanPSet.clone()
        )
    )
    cleanedElectronsName = prefix+"CleanedElectrons"
    param.ElectronSelection.ElectronCollectionName = cleanedElectronsName
    setattr(process, cleanedElectronsName, cleanedElectrons)
    cleanedMuons = cleanPatMuons.clone(
        src = cms.InputTag(param.MuonSelection.MuonCollectionName.value()),
        checkOverlaps = cms.PSet(
            genTaus = genTauCleanPSet.clone()
        )
    )
    cleanedMuonsName = prefix+"CleanedMuons"
    param.MuonSelection.MuonCollectionName = cleanedMuonsName
    setattr(process, cleanedMuonsName, cleanedMuons)
    genTauSequence *= (cleanedElectrons * cleanedMuons)

    # Electron and muon veto
    import HiggsAnalysis.HeavyChHiggsToTauNu.HChGlobalElectronVetoFilter_cfi as ElectronVeto
    eveto = ElectronVeto.hPlusGlobalElectronVetoFilter.clone(
        histogramAmbientLevel = "Systematics"
    )
    eveto.eventCounter.enabled = cms.untracked.bool(False)
    evetoCount = counterPrototype.clone()
    import HiggsAnalysis.HeavyChHiggsToTauNu.HChGlobalMuonVetoFilter_cfi as MuonVeto
    muveto = MuonVeto.hPlusGlobalMuonVetoFilter.clone(
        histogramAmbientLevel = "Systematics"
    )
    muveto.eventCounter.enabled = cms.untracked.bool(False)
    muvetoCount = counterPrototype.clone()
    setattr(process, prefix+"ElectronVeto", eveto)
    setattr(process, prefix+"ElectronVetoCount", evetoCount)
    setattr(process, prefix+"MuonVeto", muveto)
    setattr(process, prefix+"MuonVetoCount", muvetoCount)
    counters.extend([prefix+"ElectronVetoCount", prefix+"MuonVetoCount"])
    genTauSequence *= (
        eveto * evetoCount *
        muveto * muvetoCount
    )

    # 3 jets
    # from PhysicsTools.PatAlgos.cleaningLayer1.jetCleaner_cfi import cleanPatJets
    # cleanedJets = cleanPatJets.clone(
    #     src = cms.InputTag(param.jetSelection.src.value()),
    #     preselection = cms.string(jetSelection),
    #     checkOverlaps = cms.PSet(
    #         genTaus = genTauCleanPSet.clone()
    #     )
    # )
    # cleanedJetsName = prefix+"CleanedJets"
    # setattr(process, cleanedJetsName, cleanedJets)

    # cleanedJetsFilter = cms.EDFilter("CandViewCountFilter",
    #     src = cms.InputTag(cleanedJetsName),
    #     minNumber = cms.uint32(3)
    # )
    # setattr(process, cleanedJetsName+"Filter", cleanedJetsFilter)
    import HiggsAnalysis.HeavyChHiggsToTauNu.HChJetFilter_cfi as jetFilter_cfi
    cleanedJets = jetFilter_cfi.hPlusJetPtrSelectorFilter.clone(
        tauSrc = param.tauSelection.src.value(),
        allowEmptyTau = True,
        histogramAmbientLevel = "Systematics",
    )
    cleanedJets.eventCounter.enabled = cms.untracked.bool(False)
    cleanedJetsName = prefix+"CleanedJets"
    setattr(process, cleanedJetsName, cleanedJets)

    cleanedJetsCount = counterPrototype.clone()
    setattr(process, cleanedJetsName+"Count", cleanedJetsCount)
    counters.append(cleanedJetsName+"Count")

    genTauSequence *= (
        cleanedJets * #cleanedJetsFilter *
        cleanedJetsCount 
    )
    setattr(process, prefix+"Sequence", genTauSequence)
    sequence *= genTauSequence

    return counters
def addEmbeddingLikePreselection(process, sequence, param, prefix="embeddingLikePreselection", disableTrigger=True):
    counters = []

    # Create PU weight producer for the counters
    pileupWeight = cms.EDProducer("HPlusVertexWeightProducer",
        alias = cms.string("pileupWeight"),
    )
    HChTools.insertPSetContentsTo(param.vertexWeight.clone(), pileupWeight)
    setattr(process, prefix+"PileupWeight", pileupWeight)

    counterPrototype = cms.EDProducer("HPlusEventCountProducer",
        weightSrc = cms.InputTag(prefix+"PileupWeight")
    )

    # Disable trigger
    if disableTrigger:
        param.trigger.selectionType = "disabled"
        param.triggerEfficiencyScaleFactor.mode = "disabled"

    allCount = counterPrototype.clone()
    setattr(process, prefix+"AllCount", allCount)
    counters.append(prefix+"AllCount")

    # Primary vertex
    pvFilter = cms.EDFilter("VertexCountFilter",
        src = cms.InputTag("selectedPrimaryVertex"),
        minNumber = cms.uint32(1),
        maxNumber = cms.uint32(999)
    )
    pvFilterCount = counterPrototype.clone()
    setattr(process, prefix+"PrimaryVertex", pvFilter)
    setattr(process, prefix+"PrimaryVertexCount", pvFilterCount)
    counters.append(prefix+"PrimaryVertexCount")

    # Generator taus (if you modify this, remember to modify similar in above)
    genTaus = cms.EDFilter("GenParticleSelector",
        src = cms.InputTag("genParticles"),
        cut = cms.string("abs(pdgId()) == 15 && pt() > 40 && abs(eta()) < 2.1")
    )
    genTausName = prefix+"GenTau"
    setattr(process, genTausName, genTaus)

    genTausFilter = cms.EDFilter("CandViewCountFilter",
        src = cms.InputTag(genTausName),
        minNumber = cms.uint32(1),
    )
    setattr(process, prefix+"GenTauFilter", genTausFilter)

    genTausCount = counterPrototype.clone()
    setattr(process, prefix+"GenTauCount", genTausCount)
    counters.append(prefix+"GenTauCount")

    # Select first generator tau for the jet cleaning and tau selection
    genTauFirst = cms.EDProducer("HPlusFirstCandidateSelector",
        src = cms.InputTag(genTausName)
    )
    genTauFirstName = prefix+"First"
    setattr(process, genTauFirstName, genTauFirst)

    # Tau selection
    genTauReco = cms.EDProducer("HPlusPATTauCandViewDeltaRSelector",
        src = cms.InputTag("selectedPatTausHpsPFTau"), # not trigger matched
        refSrc = cms.InputTag(genTauFirstName),
        deltaR = cms.double(0.5),
    )
    if not disableTrigger:
        genTauReco.src = param.tauSelection.src.value()
    genTauRecoName = prefix+"Reco"
    setattr(process, genTauRecoName, genTauReco)
    param.tauSelection.src = genTauRecoName

    genTauCleanPSet = cms.PSet(
        src                 = cms.InputTag(genTauFirstName),
        algorithm           = cms.string("byDeltaR"),
        preselection        = cms.string(""),
        deltaR              = cms.double(0.5),
        checkRecoComponents = cms.bool(False),
        pairCut             = cms.string(""),
        requireNoOverlaps   = cms.bool(True),
    )

    # Clean the selected generator tau from the electrons and muons
    # for the e/mu veto. We don't want to reject events where the e/mu
    # comes from the tau decay.
    from PhysicsTools.PatAlgos.cleaningLayer1.electronCleaner_cfi import cleanPatElectrons
    from PhysicsTools.PatAlgos.cleaningLayer1.muonCleaner_cfi import cleanPatMuons
    cleanedElectrons = cleanPatElectrons.clone(
        src = cms.InputTag(param.GlobalElectronVeto.ElectronCollectionName.value()),
        checkOverlaps = cms.PSet(
            genTaus = genTauCleanPSet.clone()
        )
    )
    cleanedElectronsName = prefix+"CleanedElectrons"
    param.GlobalElectronVeto.ElectronCollectionName = cleanedElectronsName
    setattr(process, cleanedElectronsName, cleanedElectrons)
    cleanedMuons = cleanPatMuons.clone(
        src = cms.InputTag(param.GlobalMuonVeto.MuonCollectionName.value()),
        checkOverlaps = cms.PSet(
            genTaus = genTauCleanPSet.clone()
        )
    )
    cleanedMuonsName = prefix+"CleanedMuons"
    param.GlobalMuonVeto.MuonCollectionName = cleanedMuonsName
    setattr(process, cleanedMuonsName, cleanedMuons)

    # Electron and muon veto
    eveto = ElectronVeto.hPlusGlobalElectronVetoFilter.clone()
    evetoCount = counterPrototype.clone()
    muveto = MuonVeto.hPlusGlobalMuonVetoFilter.clone() 
    muvetoCount = counterPrototype.clone()
    setattr(process, prefix+"ElectronVeto", eveto)
    setattr(process, prefix+"ElectronVetoCount", evetoCount)
    setattr(process, prefix+"MuonVeto", muveto)
    setattr(process, prefix+"MuonVetoCount", muvetoCount)
    counters.extend([prefix+"ElectronVetoCount", prefix+"MuonVetoCount"])

    # 3 jets
    from PhysicsTools.PatAlgos.cleaningLayer1.jetCleaner_cfi import cleanPatJets
    cleanedJets = cleanPatJets.clone(
        src = cms.InputTag(param.jetSelection.src.value()),
        preselection = cms.string(jetSelection),
        checkOverlaps = cms.PSet(
            genTaus = genTauCleanPSet.clone()
        )
    )
    cleanedJetsName = prefix+"CleanedJets"
    setattr(process, cleanedJetsName, cleanedJets)

    cleanedJetsFilter = cms.EDFilter("CandViewCountFilter",
        src = cms.InputTag(cleanedJetsName),
        minNumber = cms.uint32(3)
    )
    setattr(process, cleanedJetsName+"Filter", cleanedJetsFilter)

    cleanedJetsCount = counterPrototype.clone()
    setattr(process, cleanedJetsName+"Count", cleanedJetsCount)
    counters.append(cleanedJetsName+"Count")

    genTauSequence = cms.Sequence(
        pileupWeight *
        allCount *
        pvFilter * pvFilterCount *
        genTaus * genTausFilter * genTausCount * genTauFirst * genTauReco *
        cleanedElectrons * cleanedMuons *
        eveto * evetoCount *
        muveto * muvetoCount *
        cleanedJets * cleanedJetsFilter * cleanedJetsCount 
    )
    setattr(process, prefix+"Sequence", genTauSequence)
    sequence *= genTauSequence

    return counters
Example #6
0
def addEmbeddingLikePreselection(process,
                                 sequence,
                                 param,
                                 prefix="embeddingLikePreselection",
                                 disableTrigger=True,
                                 pileupWeight=None,
                                 selectOnlyFirstGenTau=False,
                                 maxGenTaus=None):
    counters = []

    genTauSequence = cms.Sequence()
    # Create PU weight producer for the counters
    if pileupWeight == None:
        puModule = cms.EDProducer(
            "HPlusVertexWeightProducer",
            alias=cms.string("pileupWeight"),
            histogramAmbientLevel=cms.untracked.string("Systematics"))
        HChTools.insertPSetContentsTo(param.vertexWeight.clone(), puModule)
        pileupWeight = prefix + "PileupWeight"
        setattr(process, pileupWeight, puModule)
        genTauSequence *= puModule

    counterPrototype = cms.EDProducer("HPlusEventCountProducer",
                                      weightSrc=cms.InputTag(pileupWeight))

    # Disable trigger
    if disableTrigger:
        param.trigger.selectionType = "disabled"
        param.tauTriggerEfficiencyScaleFactor.mode = "disabled"
        param.metTriggerEfficiencyScaleFactor.mode = "disabled"

    allCount = counterPrototype.clone()
    setattr(process, prefix + "AllCount", allCount)
    genTauSequence *= allCount
    counters.append(prefix + "AllCount")

    # Primary vertex
    pvFilter = cms.EDFilter("VertexCountFilter",
                            src=cms.InputTag("selectedPrimaryVertex"),
                            minNumber=cms.uint32(1),
                            maxNumber=cms.uint32(999))
    pvFilterCount = counterPrototype.clone()
    setattr(process, prefix + "PrimaryVertex", pvFilter)
    setattr(process, prefix + "PrimaryVertexCount", pvFilterCount)
    genTauSequence *= (pvFilter * pvFilterCount)
    counters.append(prefix + "PrimaryVertexCount")

    # Generator taus (if you modify this, remember to modify similar in above)
    genTaus = cms.EDFilter("GenParticleSelector",
                           src=cms.InputTag("genParticles"),
                           cut=cms.string(generatorTauSelection %
                                          generatorTauPt))
    genTausName = prefix + "GenTau"
    setattr(process, genTausName, genTaus)
    genTauSequence *= genTaus

    if maxGenTaus is not None:
        genTausFilter = cms.EDFilter(
            "PATCandViewCountFilter",
            src=cms.InputTag(genTausName),
            minNumber=cms.uint32(1),
            maxNumber=cms.uint32(maxGenTaus),
        )
    else:
        genTausFilter = cms.EDFilter(
            "CandViewCountFilter",
            src=cms.InputTag(genTausName),
            minNumber=cms.uint32(1),
        )
    setattr(process, prefix + "GenTauFilter", genTausFilter)
    genTauSequence *= genTausFilter

    genTausCount = counterPrototype.clone()
    setattr(process, prefix + "GenTauCount", genTausCount)
    genTauSequence *= genTausCount
    counters.append(prefix + "GenTauCount")

    # Select first generator tau for e/mu veto, and if the flag is
    # true, also for the jet cleaning and tau selection
    genTauFirst = cms.EDProducer("HPlusFirstGenParticleSelector",
                                 src=cms.InputTag(genTausName))
    genTauFirstName = prefix + "GenTauFirst"
    setattr(process, genTauFirstName, genTauFirst)
    genTauSequence *= genTauFirst
    if selectOnlyFirstGenTau:
        genTausName = genTauFirstName

    genTausVisible = cms.EDProducer("HPlusGenVisibleTauComputer",
                                    src=cms.InputTag(genTausName))
    genTausVisibleName = prefix + "GenTauVisible"
    setattr(process, genTausVisibleName, genTausVisible)
    genTauSequence *= genTausVisible

    genTauFirstVisible = cms.EDProducer("HPlusGenVisibleTauComputer",
                                        src=cms.InputTag(genTauFirstName))
    genTauFirstVisibleName = prefix + "GenTauFirstVisible"
    setattr(process, genTauFirstVisibleName, genTauFirstVisible)
    genTauSequence *= genTauFirstVisible

    # Tau selection
    # genTauReco = cms.EDProducer("HPlusPATTauCandViewClosestDeltaRSelector",
    #     src = cms.InputTag("selectedPatTausHpsPFTau"),
    #     refSrc = cms.InputTag(genTausName),
    #     maxDeltaR = cms.double(0.5),
    # )
    genTauReco = cms.EDProducer(
        "HPlusPATTauLorentzVectorViewClosestDeltaRSelector",
        #        src = cms.InputTag("selectedPatTaus"+PF2PATVersion), # not trigger matched
        #        src = cms.InputTag("selectedPatTausHpsPFTau"), # 2011
        src=cms.InputTag("selectedPatTaus"),
        refSrc=cms.InputTag(genTausVisibleName),
        maxDeltaR=cms.double(0.5),
    )

    #     if PF2PATVersion != "":
    #         raise Exception("I don't support PF2PAT at the moment")
    if not disableTrigger:
        genTauReco.src = param.tauSelection.src.value()
    genTauRecoName = prefix + "TauMCMatched"
    setattr(process, genTauRecoName, genTauReco)
    genTauSequence *= genTauReco
    param.tauSelection.src = genTauRecoName

    genTauFirstReco = genTauReco.clone(refSrc=genTauFirstVisibleName)
    genTauFirstRecoName = prefix + "FirstTauMCMatched"
    setattr(process, genTauFirstRecoName, genTauFirstReco)
    genTauSequence *= genTauFirstReco

    if not selectOnlyFirstGenTau:
        # Select the tau candidate which is most likely going to pass the identification
        genTauSelected = cms.EDProducer(
            "HPlusPATTauMostLikelyIdentifiedSelector",
            eventCounter=param.eventCounter.clone(
                enabled=cms.untracked.bool(False)),
            tauSelection=param.tauSelection.clone(),
            vertexSrc=cms.InputTag(
                param.primaryVertexSelection.selectedSrc.value()),
            histogramAmbientLevel=cms.untracked.string("Systematics"),
        )
        genTauSelectedName = prefix + "TauSelected"
        setattr(process, genTauSelectedName, genTauSelected)
        genTauSequence *= genTauSelected
        param.tauSelection.src = genTauSelectedName

    genTauCleanPSet = cms.PSet(
        #        src                 = cms.InputTag(param.tauSelection.src.value()),
        src=cms.InputTag(genTauFirstRecoName),
        algorithm=cms.string("byDeltaR"),
        preselection=cms.string(""),
        deltaR=cms.double(0.5),
        checkRecoComponents=cms.bool(False),
        pairCut=cms.string(""),
        requireNoOverlaps=cms.bool(True),
    )

    # Clean the selected generator tau from the electrons and muons
    # for the e/mu veto. We don't want to reject events where the e/mu
    # comes from the tau decay.
    from PhysicsTools.PatAlgos.cleaningLayer1.electronCleaner_cfi import cleanPatElectrons
    from PhysicsTools.PatAlgos.cleaningLayer1.muonCleaner_cfi import cleanPatMuons
    cleanedElectrons = cleanPatElectrons.clone(
        src=cms.InputTag(
            param.ElectronSelection.ElectronCollectionName.value()),
        checkOverlaps=cms.PSet(genTaus=genTauCleanPSet.clone()))
    cleanedElectronsName = prefix + "CleanedElectrons"
    param.ElectronSelection.ElectronCollectionName = cleanedElectronsName
    setattr(process, cleanedElectronsName, cleanedElectrons)
    cleanedMuons = cleanPatMuons.clone(
        src=cms.InputTag(param.MuonSelection.MuonCollectionName.value()),
        checkOverlaps=cms.PSet(genTaus=genTauCleanPSet.clone()))
    cleanedMuonsName = prefix + "CleanedMuons"
    param.MuonSelection.MuonCollectionName = cleanedMuonsName
    setattr(process, cleanedMuonsName, cleanedMuons)
    genTauSequence *= (cleanedElectrons * cleanedMuons)

    # Electron and muon veto
    import HiggsAnalysis.HeavyChHiggsToTauNu.HChGlobalElectronVetoFilter_cfi as ElectronVeto
    eveto = ElectronVeto.hPlusGlobalElectronVetoFilter.clone(
        histogramAmbientLevel="Systematics")
    eveto.eventCounter.enabled = cms.untracked.bool(False)
    evetoCount = counterPrototype.clone()
    import HiggsAnalysis.HeavyChHiggsToTauNu.HChGlobalMuonVetoFilter_cfi as MuonVeto
    muveto = MuonVeto.hPlusGlobalMuonVetoFilter.clone(
        histogramAmbientLevel="Systematics")
    muveto.eventCounter.enabled = cms.untracked.bool(False)
    muvetoCount = counterPrototype.clone()
    setattr(process, prefix + "ElectronVeto", eveto)
    setattr(process, prefix + "ElectronVetoCount", evetoCount)
    setattr(process, prefix + "MuonVeto", muveto)
    setattr(process, prefix + "MuonVetoCount", muvetoCount)
    counters.extend([prefix + "ElectronVetoCount", prefix + "MuonVetoCount"])
    genTauSequence *= (eveto * evetoCount * muveto * muvetoCount)

    # 3 jets
    # from PhysicsTools.PatAlgos.cleaningLayer1.jetCleaner_cfi import cleanPatJets
    # cleanedJets = cleanPatJets.clone(
    #     src = cms.InputTag(param.jetSelection.src.value()),
    #     preselection = cms.string(jetSelection),
    #     checkOverlaps = cms.PSet(
    #         genTaus = genTauCleanPSet.clone()
    #     )
    # )
    # cleanedJetsName = prefix+"CleanedJets"
    # setattr(process, cleanedJetsName, cleanedJets)

    # cleanedJetsFilter = cms.EDFilter("CandViewCountFilter",
    #     src = cms.InputTag(cleanedJetsName),
    #     minNumber = cms.uint32(3)
    # )
    # setattr(process, cleanedJetsName+"Filter", cleanedJetsFilter)
    import HiggsAnalysis.HeavyChHiggsToTauNu.HChJetFilter_cfi as jetFilter_cfi
    cleanedJets = jetFilter_cfi.hPlusJetPtrSelectorFilter.clone(
        tauSrc=param.tauSelection.src.value(),
        allowEmptyTau=True,
        histogramAmbientLevel="Systematics",
    )
    cleanedJets.eventCounter.enabled = cms.untracked.bool(False)
    cleanedJetsName = prefix + "CleanedJets"
    setattr(process, cleanedJetsName, cleanedJets)

    cleanedJetsCount = counterPrototype.clone()
    setattr(process, cleanedJetsName + "Count", cleanedJetsCount)
    counters.append(cleanedJetsName + "Count")

    genTauSequence *= (
        cleanedJets *  #cleanedJetsFilter *
        cleanedJetsCount)
    setattr(process, prefix + "Sequence", genTauSequence)
    sequence *= genTauSequence

    return counters