Example #1
0
def adaptTauToMiniAODReReco(process, reclusterJets=True):
    # TRYING TO MAKE THINGS MINIAOD COMPATIBLE, FROM THE START, TO THE END, 1 BY 1
    #print '[adaptTauToMiniAODReReco]: Start'

    jetCollection = 'slimmedJets'
    # Add new jet collections if reclustering is demanded
    if reclusterJets:
        jetCollection = 'patJetsPAT'
        from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
        process.ak4PFJetsPAT = ak4PFJets.clone(
            src=cms.InputTag("packedPFCandidates"))
        # trivial PATJets
        from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets
        process.patJetsPAT = _patJets.clone(
            jetSource=cms.InputTag("ak4PFJetsPAT"),
            addJetCorrFactors=cms.bool(False),
            jetCorrFactorsSource=cms.VInputTag(),
            addBTagInfo=cms.bool(False),
            addDiscriminators=cms.bool(False),
            discriminatorSources=cms.VInputTag(),
            addAssociatedTracks=cms.bool(False),
            addJetCharge=cms.bool(False),
            addGenPartonMatch=cms.bool(False),
            embedGenPartonMatch=cms.bool(False),
            addGenJetMatch=cms.bool(False),
            getJetMCFlavour=cms.bool(False),
            addJetFlavourInfo=cms.bool(False),
        )
        process.miniAODTausTask.add(process.ak4PFJetsPAT)
        process.miniAODTausTask.add(process.patJetsPAT)

    # so this adds all tracks to jet in some deltaR region. we don't have tracks so don't need it :D
    # process.ak4PFJetTracksAssociatorAtVertex.jets = cms.InputTag(jetCollection)

    # Remove ak4PFJetTracksAssociatorAtVertex from recoTauCommonSequence
    # Remove pfRecoTauTagInfoProducer from recoTauCommonSequence since it uses the jet-track association
    # HOWEVER, may use https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookMiniAOD2017#Isolated_Tracks
    # probably needs recovery of the two modules above

    process.recoTauAK4Jets08RegionPAT = cms.EDProducer(
        "RecoTauPatJetRegionProducer",
        deltaR=process.recoTauAK4PFJets08Region.deltaR,
        maxJetAbsEta=process.recoTauAK4PFJets08Region.maxJetAbsEta,
        minJetPt=process.recoTauAK4PFJets08Region.minJetPt,
        pfCandAssocMapSrc=cms.InputTag(""),
        pfCandSrc=cms.InputTag("packedPFCandidates"),
        src=cms.InputTag(jetCollection))

    process.recoTauPileUpVertices.src = cms.InputTag(
        "offlineSlimmedPrimaryVertices")
    # Redefine recoTauCommonTask
    # with redefined region and PU vertices, and w/o track-to-vertex associator and tauTagInfo (the two latter are probably obsolete and not needed at all)
    process.recoTauCommonTask = cms.Task(process.recoTauAK4Jets08RegionPAT,
                                         process.recoTauPileUpVertices)

    for moduleName in process.TauReco.moduleNames():
        convertModuleToMiniAODInput(process, moduleName)

    # Adapt TauPiZeros producer
    process.ak4PFJetsLegacyHPSPiZeros.builders[
        0].qualityCuts.primaryVertexSrc = cms.InputTag(
            "offlineSlimmedPrimaryVertices")
    process.ak4PFJetsLegacyHPSPiZeros.jetSrc = cms.InputTag(jetCollection)

    # Adapt TauChargedHadrons producer
    for builder in process.ak4PFJetsRecoTauChargedHadrons.builders:
        builder.qualityCuts.primaryVertexSrc = cms.InputTag(
            "offlineSlimmedPrimaryVertices")
        if builder.name.value(
        ) == 'tracks':  #replace plugin based on generalTracks by one based on lostTracks
            builder.name = 'lostTracks'
            builder.plugin = 'PFRecoTauChargedHadronFromLostTrackPlugin'
            builder.srcTracks = cms.InputTag("lostTracks")
    process.ak4PFJetsRecoTauChargedHadrons.jetSrc = cms.InputTag(jetCollection)

    # Adapt combinatoricRecoTau producer
    process.combinatoricRecoTaus.jetRegionSrc = 'recoTauAK4Jets08RegionPAT'
    process.combinatoricRecoTaus.jetSrc = jetCollection
    # Adapt builders
    for builder in process.combinatoricRecoTaus.builders:
        for name, value in builder.parameters_().iteritems():
            if name == 'qualityCuts':
                builder.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
            elif name == 'pfCandSrc':
                builder.pfCandSrc = 'packedPFCandidates'
    # Adapt supported modifiers and remove unsupported ones
    modifiersToRemove_ = cms.VPSet()
    for mod in process.combinatoricRecoTaus.modifiers:
        if mod.name.value() == 'elec_rej':
            modifiersToRemove_.append(mod)
            continue
        elif mod.name.value() == 'TTIworkaround':
            modifiersToRemove_.append(mod)
            continue
        for name, value in mod.parameters_().iteritems():
            if name == 'qualityCuts':
                mod.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
    for mod in modifiersToRemove_:
        process.combinatoricRecoTaus.modifiers.remove(mod)
        #print "\t\t Removing '%s' modifier from 'combinatoricRecoTaus'" %mod.name.value()

    # Redefine tau PV producer
    process.hpsPFTauPrimaryVertexProducer.__dict__[
        '_TypedParameterizable__type'] = 'PFTauMiniAODPrimaryVertexProducer'
    process.hpsPFTauPrimaryVertexProducer.PVTag = 'offlineSlimmedPrimaryVertices'
    process.hpsPFTauPrimaryVertexProducer.packedCandidatesTag = cms.InputTag(
        "packedPFCandidates")
    process.hpsPFTauPrimaryVertexProducer.lostCandidatesTag = cms.InputTag(
        "lostTracks")

    # Redefine tau SV producer
    process.hpsPFTauSecondaryVertexProducer = cms.EDProducer(
        "PFTauSecondaryVertexProducer",
        PFTauTag=cms.InputTag("hpsPFTauProducer"))

    # Remove RecoTau producers which are not supported (yet?), i.e. against-e/mu discriminats
    for moduleName in process.TauReco.moduleNames():
        if 'ElectronRejection' in moduleName or 'MuonRejection' in moduleName:
            process.miniAODTausTask.remove(getattr(process, moduleName))

    # Instead add against-mu discriminants which are MiniAOD compatible
    from RecoTauTag.RecoTau.hpsPFTauDiscriminationByAMuonRejectionSimple_cff import hpsPFTauDiscriminationByLooseMuonRejectionSimple, hpsPFTauDiscriminationByTightMuonRejectionSimple

    process.hpsPFTauDiscriminationByLooseMuonRejectionSimple = hpsPFTauDiscriminationByLooseMuonRejectionSimple
    process.hpsPFTauDiscriminationByTightMuonRejectionSimple = hpsPFTauDiscriminationByTightMuonRejectionSimple
    process.miniAODTausTask.add(
        process.hpsPFTauDiscriminationByLooseMuonRejectionSimple)
    process.miniAODTausTask.add(
        process.hpsPFTauDiscriminationByTightMuonRejectionSimple)

    #####
    # PAT part in the following

    process.tauGenJets.GenParticles = cms.InputTag("prunedGenParticles")
    process.tauMatch.matched = cms.InputTag("prunedGenParticles")

    # Remove unsupported tauIDs
    for name, src in process.patTaus.tauIDSources.parameters_().iteritems():
        if name.find('againstElectron') > -1 or name.find('againstMuon') > -1:
            delattr(process.patTaus.tauIDSources, name)
    # Add MiniAOD specific ones
    setattr(process.patTaus.tauIDSources, 'againstMuonLooseSimple',
            cms.InputTag('hpsPFTauDiscriminationByLooseMuonRejectionSimple'))
    setattr(process.patTaus.tauIDSources, 'againstMuonTightSimple',
            cms.InputTag('hpsPFTauDiscriminationByTightMuonRejectionSimple'))
Example #2
0
def makeFatJets(process, src, algoLabel, jetRadius, colLabel, jetPtMin = 150., btagLabel = ''):

  rLabel = algoLabel + '%d' % (int(jetRadius * 10)) # 'ak8'

  if algoLabel.lower() == 'ca':
    jetAlgo = 'CambridgeAachen'
  elif algoLabel.lower() == 'ak':
    jetAlgo = 'AntiKt'
  else:
    raise RuntimeError('Unknown jet algo ' + algoLabel)

  if jetRadius < 1.:
    sdZcut = 0.1
    sdBeta = 0.0
  else:
    sdZcut = 0.15
    sdBeta = 1.0

  ## Used for btagging & jet clustering (pvSource)
  ## CMS uses the particleFlow collection to compute the btag info regardless of the jet source collection.
  pfSource = 'particleFlow'
  pvSource = 'offlinePrimaryVertices'

  ########################################
  ##           CLUSTER JETS             ##
  ########################################

  jets = ak4PFJets.clone(
    jetAlgorithm = cms.string(jetAlgo),
    rParam = cms.double(jetRadius),
    src = cms.InputTag(src),
    srcPVs = cms.InputTag(pvSource),
    doAreaFastjet = cms.bool(True),
    jetPtMin = cms.double(jetPtMin)
  )

  jetsName = rLabel + colLabel # 'ak8PFJetsCHS'
  setattr(process, jetsName, jets)

  softDropJets = jets.clone(
    useSoftDrop = cms.bool(True),
    R0 = cms.double(jetRadius),
    zcut = cms.double(sdZcut),
    beta = cms.double(sdBeta),
    writeCompound = cms.bool(True),
    useExplicitGhosts = cms.bool(True),
    jetCollInstanceName = cms.string("SubJets")
  )

  softDropJetsName = jetsName + 'SoftDrop'
  setattr(process, softDropJetsName, softDropJets)

  softDropSubjetsName = softDropJetsName + 'Subjets'

  clustering = cms.Sequence(
    jets +
    softDropJets
  )
  
  ########################################
  ##           SUBSTRUCTURE             ##
  ########################################

  njettiness = Njettiness.clone(
    src = cms.InputTag(jetsName),
    R0 = cms.double(jetRadius),
    Njets = cms.vuint32(1,2,3,4)
  )

  njettinessName = 'njettiness' + jetsName
  setattr(process, njettinessName, njettiness)

  sdKinematics = cms.EDProducer('RecoJetDeltaRValueMapProducer',
    src = cms.InputTag(jetsName),
    matched = cms.InputTag(softDropJetsName),
    distMax = cms.double(1.5),
    values = cms.vstring('mass'),
    valueLabels = cms.vstring('Mass'),
  )

  sdKinematicsName = 'sdKinematics' + jetsName
  setattr(process, sdKinematicsName, sdKinematics)

  substructure = cms.Sequence(
    njettiness +
    sdKinematics
  )

  if btagLabel != '':
    #######################################
    ##         FATJET BTAGGING           ##
    #######################################

    initBTag(process, btagLabel, pfSource, pvSource)
  
    btags = [
      'pfJetProbabilityBJetTags',
      'pfJetBProbabilityBJetTags',
      'pfCombinedSecondaryVertexV2BJetTags',
      'pfCombinedInclusiveSecondaryVertexV2BJetTags',
      'pfCombinedMVAV2BJetTags'
    ]
  
    btagInfos = []
    btagging = setupBTag(process, jetsName, jetsName, btagLabel, tags = btags, addedTagInfos = btagInfos)

    doubleBtags = [
      'pfBoostedDoubleSecondaryVertexBJetTags'
    ]
    
    doubleBtagging = setupDoubleBTag(process, jetsName, jetsName, btagLabel, rLabel.lower(), addedTagInfos = btagInfos)

    #######################################
    ##         SUBJET BTAGGING           ##
    #######################################
  
    # Product: std::vector<reco::CandIPTagInfo>
    # IPTagInfo object contains a reference to jet
    subjetIpTagInfos = btag.pfImpactParameterTagInfos.clone(
      jets = cms.InputTag(softDropJetsName, 'SubJets'),
      primaryVertex = cms.InputTag(pvSource),
      candidates = cms.InputTag(pfSource),
#      explicitJTA = cms.bool(True)
    )
  
    subjetIpTagInfosName = 'pfImpactParameterTagInfos' + softDropSubjetsName
    setattr(process, subjetIpTagInfosName, subjetIpTagInfos)
  
    # Product: std::vector<TemplatedSecondaryVertexTagInfo<reco::CandIPTagInfo, reco::VertexCompositePtrCandidate>>
    subjetInclSVFinderTagInfos = btag.pfInclusiveSecondaryVertexFinderTagInfos.clone(
      trackIPTagInfos = cms.InputTag(subjetIpTagInfosName),
      extSVCollection = cms.InputTag('inclusiveCandidateSecondaryVertices' + btagLabel),
#      useSVClustering = cms.bool(True),
#      jetAlgorithm = cms.string(jetAlgo),
#      rParam = cms.double(jetRadius),
#      fatJets = cms.InputTag(jetsName),
#      groomedFatJets = cms.InputTag(softDropJetsName)
    )
  
    subjetInclSVFinderTagInfosName = 'pfInclusiveSecondaryVertexFinderTagInfos' + softDropSubjetsName
    setattr(process, subjetInclSVFinderTagInfosName, subjetInclSVFinderTagInfos)
  
    # Product: JetTagCollection (aka reco::JetFloatAssociation::Container aka edm::AssociationVector<reco::JetRefBaseProd, std::vector<float>>)
    # Uses the internal reference to the jet in the TagInfos object to create an AssociationVector
    subjetBjetTags = btag.pfCombinedInclusiveSecondaryVertexV2BJetTags.clone(
      tagInfos = cms.VInputTag( 
        cms.InputTag(subjetIpTagInfosName), 
        cms.InputTag(subjetInclSVFinderTagInfosName)
      )
    )
  
    subjetBjetTagsName = 'pfCombinedInclusiveSecondaryVertexV2BJetTags' + softDropSubjetsName
    setattr(process, subjetBjetTagsName, subjetBjetTags)
  
    subjetBTagging = cms.Sequence(
      subjetIpTagInfos +
      subjetInclSVFinderTagInfos +
      subjetBjetTags
    )

  else:
    btagging = cms.Sequence()
    doubleBtagging = cms.Sequence()
    subjetBTagging = cms.Sequence()

  ########################################
  ##          MAKE PAT JETS             ##
  ########################################

  patJets = _patJets.clone(
    jetSource = cms.InputTag(jetsName),
    getJetMCFlavour = cms.bool(False),
    addGenJetMatch = cms.bool(False),
    addGenPartonMatch = cms.bool(False),
    addJetFlavourInfo = cms.bool(False),
    addAssociatedTracks = cms.bool(False),
    addJetCharge = cms.bool(False),
    addJetCorrFactors = cms.bool(False),
    addBTagInfo = cms.bool(True),
    addTagInfos = cms.bool(True),
    addDiscriminators = cms.bool(True),
    tagInfoSources = cms.VInputTag([cms.InputTag(name) for name in btagInfos]),
    discriminatorSources = cms.VInputTag([cms.InputTag(name + jetsName) for name in btags + doubleBtags])
  )
  patJets.userData.userFloats.src = [
    cms.InputTag(njettinessName + ':tau1'),
    cms.InputTag(njettinessName + ':tau2'),
    cms.InputTag(njettinessName + ':tau3'),
    cms.InputTag(njettinessName + ':tau4'),
    cms.InputTag(sdKinematicsName + ':Mass')
  ]

  patJetsName = 'pat' + jetsName
  setattr(process, patJetsName, patJets)

  selectedJets = selectedPatJets.clone(
    src = cms.InputTag(patJetsName)
  )

  selectedJetsName = 'selectedPat' + jetsName
  setattr(process, selectedJetsName, selectedJets)

  patSoftDropJets = _patJets.clone(
    jetSource = cms.InputTag(softDropJetsName),
    getJetMCFlavour = cms.bool(False),
    addGenJetMatch = cms.bool(False),
    addGenPartonMatch = cms.bool(False),
    addJetFlavourInfo = cms.bool(False),
    addTagInfos = cms.bool(False),
    addBTagInfo = cms.bool(False),
    addDiscriminators = cms.bool(False),
    addAssociatedTracks = cms.bool(False),
    addJetCharge = cms.bool(False),
    addJetCorrFactors = cms.bool(False)
  )

  patSoftDropJetsName = 'pat' + softDropJetsName
  setattr(process, patSoftDropJetsName, patSoftDropJets)

  selectedSoftDropJets = selectedPatJets.clone(
    src = cms.InputTag(patSoftDropJetsName)
  )

  selectedSoftDropJetsName = 'selectedPat' + softDropJetsName
  setattr(process, selectedSoftDropJetsName, selectedSoftDropJets)

  patSoftDropSubjets = _patJets.clone(
    jetSource = cms.InputTag(softDropJetsName, 'SubJets'),
    getJetMCFlavour = cms.bool(False),
    addGenJetMatch = cms.bool(False),
    addGenPartonMatch = cms.bool(False),
    addJetFlavourInfo = cms.bool(False),
    addAssociatedTracks = cms.bool(False),
    addJetCharge = cms.bool(False),
    addJetCorrFactors = cms.bool(False),
    addBTagInfo = cms.bool(True),
    addDiscriminators = cms.bool(True),
    addTagInfos = cms.bool(False),
    discriminatorSources = cms.VInputTag(
      cms.InputTag(subjetBjetTagsName)
    )
  )

  patSoftDropSubjetsName = 'pat' + softDropJetsName + 'Subjets'
  setattr(process, patSoftDropSubjetsName, patSoftDropSubjets)

  selectedSoftDropSubjets = selectedPatJets.clone(
    src = cms.InputTag(patSoftDropSubjetsName)
  )

  selectedSoftDropSubjetsName = 'selectedPat' + softDropSubjetsName
  setattr(process, selectedSoftDropSubjetsName, selectedSoftDropSubjets)

  pat = cms.Sequence(
    patJets +
    selectedJets +
    patSoftDropJets +
    selectedSoftDropJets +
    patSoftDropSubjets +
    selectedSoftDropSubjets
  )

  ###############################################
  ##     Pack subjets back into fat jets       ##
  ###############################################

  packedSoftDropJets = cms.EDProducer('BoostedJetMerger',
    jetSrc = cms.InputTag(selectedSoftDropJetsName),
    subjetSrc = cms.InputTag(selectedSoftDropSubjetsName)
  )

  packedSoftDropJetsName = 'packed' + softDropJetsName
  setattr(process, packedSoftDropJetsName, packedSoftDropJets)

  packedPatJets = cms.EDProducer('JetSubstructurePacker',
    jetSrc = cms.InputTag(selectedJetsName),
    distMax = cms.double(jetRadius),
    algoTags = cms.VInputTag(cms.InputTag(packedSoftDropJetsName)),
    algoLabels = cms.vstring('SoftDrop'),
    fixDaughters = cms.bool(False)
  )

  packedPatJetsName = 'packed' + jetsName
  setattr(process, packedPatJetsName, packedPatJets)

  packing = cms.Sequence(
    packedSoftDropJets +
    packedPatJets
  )

  ##############################
  ##     Return a sequence    ##
  ##############################

  sequence = cms.Sequence(
    clustering + 
    substructure +
    btagging +
    doubleBtagging +
    subjetBTagging +
    pat +
    packing
  )

  return sequence
Example #3
0
    def adaptTauToMiniAODReReco(self, reclusterJets=True):
        # TRYING TO MAKE THINGS MINIAOD COMPATIBLE, FROM THE START, TO THE END, 1 BY 1
        #print '[adaptTauToMiniAODReReco]: Start'
        jetCollection = 'slimmedJets'
        # Add new jet collections if reclustering is demanded
        if self.runBoosted:
            jetCollection = 'boostedTauSeedsPAT' + self.postfix
            from RecoTauTag.Configuration.boostedHPSPFTaus_cff import ca8PFJetsCHSprunedForBoostedTaus
            setattr(
                self.process,
                'ca8PFJetsCHSprunedForBoostedTausPAT' + self.postfix,
                ca8PFJetsCHSprunedForBoostedTaus.clone(
                    src='packedPFCandidates',
                    jetCollInstanceName='subJetsForSeedingBoostedTausPAT'))
            setattr(
                self.process, 'boostedTauSeedsPAT' + self.postfix,
                cms.EDProducer(
                    "PATBoostedTauSeedsProducer",
                    subjetSrc=cms.InputTag(
                        'ca8PFJetsCHSprunedForBoostedTausPAT' + self.postfix,
                        'subJetsForSeedingBoostedTausPAT'),
                    pfCandidateSrc=cms.InputTag('packedPFCandidates'),
                    verbosity=cms.int32(0)))
            self.miniAODTausTask.add(
                getattr(self.process,
                        'ca8PFJetsCHSprunedForBoostedTausPAT' + self.postfix))
            self.miniAODTausTask.add(
                getattr(self.process, 'boostedTauSeedsPAT' + self.postfix))
        elif reclusterJets:
            jetCollection = 'patJetsPAT' + self.postfix
            from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
            setattr(self.process, 'ak4PFJetsPAT' + self.postfix,
                    ak4PFJets.clone(src="packedPFCandidates"))
            # trivial PATJets
            from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets
            setattr(
                self.process, 'patJetsPAT' + self.postfix,
                _patJets.clone(
                    jetSource="ak4PFJetsPAT" + self.postfix,
                    addJetCorrFactors=False,
                    jetCorrFactorsSource=[],
                    addBTagInfo=False,
                    addDiscriminators=False,
                    discriminatorSources=[],
                    addAssociatedTracks=False,
                    addJetCharge=False,
                    addGenPartonMatch=False,
                    embedGenPartonMatch=False,
                    addGenJetMatch=False,
                    getJetMCFlavour=False,
                    addJetFlavourInfo=False,
                ))
            self.miniAODTausTask.add(
                getattr(self.process, 'ak4PFJetsPAT' + self.postfix))
            self.miniAODTausTask.add(
                getattr(self.process, 'patJetsPAT' + self.postfix))

        # so this adds all tracks to jet in some deltaR region. we don't have tracks so don't need it :D
        # self.process.ak4PFJetTracksAssociatorAtVertex.jets = cms.InputTag(jetCollection)

        # Remove ak4PFJetTracksAssociatorAtVertex from recoTauCommonSequence
        # Remove pfRecoTauTagInfoProducer from recoTauCommonSequence since it uses the jet-track association
        # HOWEVER, may use https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookMiniAOD2017#Isolated_Tracks
        # probably needs recovery of the two modules above
        self.miniAODTausTask.remove(
            getattr(self.process,
                    'ak4PFJetTracksAssociatorAtVertex' + self.postfix))
        self.miniAODTausTask.remove(
            getattr(self.process, 'pfRecoTauTagInfoProducer' + self.postfix))

        self.miniAODTausTask.remove(
            getattr(self.process, 'recoTauAK4PFJets08Region' + self.postfix))
        setattr(
            self.process, 'recoTauAK4Jets08RegionPAT' + self.postfix,
            cms.EDProducer(
                "RecoTauPatJetRegionProducer",
                deltaR=self.process.recoTauAK4PFJets08Region.deltaR,
                maxJetAbsEta=self.process.recoTauAK4PFJets08Region.
                maxJetAbsEta,
                minJetPt=self.process.recoTauAK4PFJets08Region.minJetPt,
                pfCandAssocMapSrc=cms.InputTag(""),
                pfCandSrc=cms.InputTag("packedPFCandidates"),
                src=cms.InputTag(jetCollection)))
        _jetRegionProducer = getattr(
            self.process, 'recoTauAK4Jets08RegionPAT' + self.postfix)
        self.miniAODTausTask.add(_jetRegionProducer)
        if self.runBoosted:
            _jetRegionProducer.pfCandAssocMapSrc = cms.InputTag(
                jetCollection, 'pfCandAssocMapForIsolation')

        getattr(self.process, 'recoTauPileUpVertices' +
                self.postfix).src = "offlineSlimmedPrimaryVertices"

        for moduleName in self.miniAODTausTask.moduleNames():
            self.convertModuleToMiniAODInput(moduleName)

        # Adapt TauPiZeros producer
        _piZeroProducer = getattr(self.process,
                                  'ak4PFJetsLegacyHPSPiZeros' + self.postfix)
        for builder in _piZeroProducer.builders:
            builder.qualityCuts.primaryVertexSrc = "offlineSlimmedPrimaryVertices"
        _piZeroProducer.jetSrc = jetCollection

        # Adapt TauChargedHadrons producer
        _chargedHadronProducer = getattr(
            self.process, 'ak4PFJetsRecoTauChargedHadrons' + self.postfix)
        for builder in _chargedHadronProducer.builders:
            builder.qualityCuts.primaryVertexSrc = "offlineSlimmedPrimaryVertices"
            if builder.name.value(
            ) == 'tracks':  #replace plugin based on generalTracks by one based on lostTracks
                builder.name = 'lostTracks'
                builder.plugin = 'PFRecoTauChargedHadronFromLostTrackPlugin'
                builder.srcTracks = "lostTracks"
                if self.runBoosted:
                    builder.dRcone = 0.3
                    builder.dRconeLimitedToJetArea = True
        _chargedHadronProducer.jetSrc = jetCollection

        # Adapt combinatoricRecoTau producer
        _combinatoricRecoTauProducer = getattr(
            self.process, 'combinatoricRecoTaus' + self.postfix)
        _combinatoricRecoTauProducer.jetRegionSrc = 'recoTauAK4Jets08RegionPAT' + self.postfix
        _combinatoricRecoTauProducer.jetSrc = jetCollection
        # Adapt builders
        for builder in _combinatoricRecoTauProducer.builders:
            for name, value in builder.parameters_().items():
                if name == 'qualityCuts':
                    builder.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
                elif name == 'pfCandSrc':
                    builder.pfCandSrc = 'packedPFCandidates'
        # Adapt supported modifiers and remove unsupported ones
        _modifiersToRemove = cms.VPSet()
        for mod in _combinatoricRecoTauProducer.modifiers:
            if mod.name.value() == 'elec_rej':
                _modifiersToRemove.append(mod)
                continue
            elif mod.name.value() == 'TTIworkaround':
                _modifiersToRemove.append(mod)
                continue
            elif mod.name.value() == 'tau_lost_tracks':
                _modifiersToRemove.append(mod)
                continue
            for name, value in mod.parameters_().items():
                if name == 'qualityCuts':
                    mod.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
        for mod in _modifiersToRemove:
            _combinatoricRecoTauProducer.modifiers.remove(mod)
        #print "\t\t Removing '%s' modifier from 'combinatoricRecoTaus'" %mod.name.value()

        # Redefine tau PV producer
        _tauPVProducer = getattr(
            self.process, 'hpsPFTauPrimaryVertexProducer' + self.postfix)
        _tauPVProducer.__dict__[
            '_TypedParameterizable__type'] = 'PFTauMiniAODPrimaryVertexProducer'
        _tauPVProducer.PVTag = 'offlineSlimmedPrimaryVertices'
        _tauPVProducer.packedCandidatesTag = cms.InputTag("packedPFCandidates")
        _tauPVProducer.lostCandidatesTag = cms.InputTag("lostTracks")

        # Redefine tau SV producer
        setattr(
            self.process, 'hpsPFTauSecondaryVertexProducer' + self.postfix,
            cms.EDProducer("PFTauSecondaryVertexProducer",
                           PFTauTag=cms.InputTag("hpsPFTauProducer" +
                                                 self.postfix)))

        # Remove RecoTau producers which are not supported (yet?), i.e. against-e/mu discriminats
        for moduleName in self.miniAODTausTask.moduleNames():
            if 'ElectronRejection' in moduleName or 'MuonRejection' in moduleName:
                if 'ByDeadECALElectronRejection' in moduleName: continue
                self.miniAODTausTask.remove(getattr(self.process, moduleName))

        # Instead add against-mu discriminants which are MiniAOD compatible
        from RecoTauTag.RecoTau.hpsPFTauDiscriminationByMuonRejectionSimple_cff import hpsPFTauDiscriminationByMuonRejectionSimple

        setattr(
            self.process,
            'hpsPFTauDiscriminationByMuonRejectionSimple' + self.postfix,
            hpsPFTauDiscriminationByMuonRejectionSimple.clone(
                PFTauProducer="hpsPFTauProducer" + self.postfix))
        _tauIDAntiMuSimple = getattr(
            self.process,
            'hpsPFTauDiscriminationByMuonRejectionSimple' + self.postfix)
        if self.runBoosted:
            _tauIDAntiMuSimple.dRmuonMatch = 0.1
        self.miniAODTausTask.add(_tauIDAntiMuSimple)

        #####
        # PAT part in the following

        getattr(self.process, 'tauGenJets' +
                self.postfix).GenParticles = "prunedGenParticles"
        getattr(self.process,
                'tauMatch' + self.postfix).matched = "prunedGenParticles"

        # Remove unsupported tauIDs
        _patTauProducer = getattr(self.process, 'patTaus' + self.postfix)
        for name, src in _patTauProducer.tauIDSources.parameters_().items():
            if name.find('againstElectron') > -1 or name.find(
                    'againstMuon') > -1:
                if name.find('againstElectronDeadECAL') > -1: continue
                delattr(_patTauProducer.tauIDSources, name)
        # Add MiniAOD specific ones
        setattr(
            _patTauProducer.tauIDSources, 'againstMuonLooseSimple',
            cms.PSet(inputTag=cms.InputTag(
                'hpsPFTauDiscriminationByMuonRejectionSimple' + self.postfix),
                     provenanceConfigLabel=cms.string('IDWPdefinitions'),
                     idLabel=cms.string('ByLooseMuonRejectionSimple')))
        setattr(
            _patTauProducer.tauIDSources, 'againstMuonTightSimple',
            cms.PSet(inputTag=cms.InputTag(
                'hpsPFTauDiscriminationByMuonRejectionSimple' + self.postfix),
                     provenanceConfigLabel=cms.string('IDWPdefinitions'),
                     idLabel=cms.string('ByTightMuonRejectionSimple')))
        #Add Run-2 tauIDs still used for boostedTaus
        if self.runBoosted:
            from PhysicsTools.PatAlgos.producersLayer1.tauProducer_cfi import containerID
            containerID(
                _patTauProducer.tauIDSources,
                "hpsPFTauDiscriminationByIsolationMVArun2v1DBoldDMwLT" +
                self.postfix, "rawValues",
                [["byIsolationMVArun2DBoldDMwLTraw", "discriminator"]])
            containerID(
                _patTauProducer.tauIDSources,
                "hpsPFTauDiscriminationByIsolationMVArun2v1DBoldDMwLT" +
                self.postfix, "workingPoints",
                [["byVVLooseIsolationMVArun2DBoldDMwLT", "_VVLoose"],
                 ["byVLooseIsolationMVArun2DBoldDMwLT", "_VLoose"],
                 ["byLooseIsolationMVArun2DBoldDMwLT", "_Loose"],
                 ["byMediumIsolationMVArun2DBoldDMwLT", "_Medium"],
                 ["byTightIsolationMVArun2DBoldDMwLT", "_Tight"],
                 ["byVTightIsolationMVArun2DBoldDMwLT", "_VTight"],
                 ["byVVTightIsolationMVArun2DBoldDMwLT", "_VVTight"]])
            containerID(
                _patTauProducer.tauIDSources,
                "hpsPFTauDiscriminationByIsolationMVArun2v1DBnewDMwLT" +
                self.postfix, "rawValues",
                [["byIsolationMVArun2DBnewDMwLTraw", "discriminator"]])
            containerID(
                _patTauProducer.tauIDSources,
                "hpsPFTauDiscriminationByIsolationMVArun2v1DBnewDMwLT" +
                self.postfix, "workingPoints",
                [["byVVLooseIsolationMVArun2DBnewDMwLT", "_VVLoose"],
                 ["byVLooseIsolationMVArun2DBnewDMwLT", "_VLoose"],
                 ["byLooseIsolationMVArun2DBnewDMwLT", "_Loose"],
                 ["byMediumIsolationMVArun2DBnewDMwLT", "_Medium"],
                 ["byTightIsolationMVArun2DBnewDMwLT", "_Tight"],
                 ["byVTightIsolationMVArun2DBnewDMwLT", "_VTight"],
                 ["byVVTightIsolationMVArun2DBnewDMwLT", "_VVTight"]])

        # Run TauIDs (anti-e && deepTau) on top of selectedPatTaus
        _updatedTauName = 'selectedPatTausNewIDs' + self.postfix
        _noUpdatedTauName = 'selectedPatTausNoNewIDs' + self.postfix
        toKeep = ['deepTau2017v2p1']
        #For boosted do not run deepTauIDs, but add still used Run-2 anti-e MVA
        if self.runBoosted:
            toKeep = ['againstEle2018']
        import RecoTauTag.RecoTau.tools.runTauIdMVA as tauIdConfig
        tauIdEmbedder = tauIdConfig.TauIDEmbedder(
            self.process,
            debug=False,
            originalTauName=_noUpdatedTauName,
            updatedTauName=_updatedTauName,
            postfix="MiniAODTaus" + self.postfix,
            toKeep=toKeep)
        tauIdEmbedder.runTauID()
        setattr(
            self.process, _noUpdatedTauName,
            getattr(self.process, 'selectedPatTaus' + self.postfix).clone())
        self.miniAODTausTask.add(getattr(self.process, _noUpdatedTauName))
        delattr(self.process, 'selectedPatTaus' + self.postfix)
        setattr(self.process, 'selectedPatTaus' + self.postfix,
                getattr(self.process, _updatedTauName).clone())
        delattr(self.process, _updatedTauName)
        setattr(
            self.process, 'newTauIDsTask' + self.postfix,
            cms.Task(
                getattr(self.process,
                        'rerunMvaIsolationTaskMiniAODTaus' + self.postfix),
                getattr(self.process, 'selectedPatTaus' + self.postfix)))
        self.miniAODTausTask.add(
            getattr(self.process, 'newTauIDsTask' + self.postfix))
Example #4
0
def makeFatJets(process, isData, label, candidates, ptMin=100.):
    """
    @param label: AK8PFchs, CA15PFPuppi, etc.
    """

    matches = re.match('(AK|CA)([0-9]+)PF(.+)', label)
    if not matches:
        raise RuntimeError('Unknown algo label ' + label)

    algo = matches.group(1) + matches.group(2)

    # set up radius and algoName from the input label
    radius = float(matches.group(2)) * 0.1
    if matches.group(1) == 'CA':
        algoName = 'CambridgeAachen'
    elif matches.group(1) == 'AK':
        algoName = 'AntiKt'

    pu = matches.group(3)

    if pu == 'chs':
        jecLabel = 'AK8PFchs'  # regardless of jet algo
    elif pu == 'Puppi':
        jecLabel = 'AK8PFPuppi'  # regardless of jet algo
    else:
        raise RuntimeError('Unknown PU mitigation ' + pu)

    sdZcut, sdBeta = sdParams(radius)

    sequence = cms.Sequence()

    # Callable object that adds the second argument to process and sequence with label attached as suffix
    addattr = AddAttr(process, sequence, label)

    ########################################
    ##           REMAKE JETS              ##
    ########################################

    pfJets = addattr(
        'pfJets',
        ak4PFJets.clone(
            doAreaFastjet=cms.bool(
                False
            ),  # This flag is turned on by default in CMSSW and makes things much slower, do not turn this on
            jetAlgorithm=cms.string(algoName),
            rParam=cms.double(radius),
            src=cms.InputTag(candidates),
            jetPtMin=cms.double(ptMin)))

    pfJetsSoftDrop = addattr(
        'pfJetsSoftDrop',
        ak4PFJets.clone(
            doAreaFastjet=cms.bool(
                False
            ),  # This flag is turned on by default in CMSSW and makes things much slower, do not turn this on
            jetAlgorithm=cms.string(algoName),
            rParam=cms.double(radius),
            src=cms.InputTag(candidates),
            jetPtMin=cms.double(ptMin),
            useSoftDrop=cms.bool(True),
            R0=cms.double(radius),
            zcut=cms.double(sdZcut),
            beta=cms.double(sdBeta),
            writeCompound=cms.bool(True),
            useExplicitGhosts=cms.bool(True),
            jetCollInstanceName=cms.string("SubJets")))
    subjets = cms.InputTag(pfJetsSoftDrop.getModuleLabel(), 'SubJets')

    pfJetsPruned = addattr(
        'pfJetsPruned',
        ak4PFJets.clone(
            doAreaFastjet=cms.bool(
                False
            ),  # This flag is turned on by default in CMSSW and makes things much slower, do not turn this on
            jetAlgorithm=cms.string(algoName),
            rParam=cms.double(radius),
            src=cms.InputTag(candidates),
            jetPtMin=cms.double(ptMin),
            usePruning=cms.bool(True),
            useExplicitGhosts=cms.bool(True),
            writeCompound=cms.bool(True),
            zcut=cms.double(0.1),  # no idea if these parameters are correct
            rcut_factor=cms.double(0.5),
            nFilt=cms.int32(2),
            jetCollInstanceName=cms.string("SubJets")))

    ########################################
    ##           SUBSTRUCTURE             ##
    #######################################

    Njettiness = addattr(
        'Njettiness',
        nJettinessAdder_cfi.Njettiness.clone(src=pfJets,
                                             R0=cms.double(radius),
                                             Njets=cms.vuint32(1, 2, 3, 4)))

    sdKinematics = addattr(
        'sdKinematics',
        cms.EDProducer('RecoJetDeltaRValueMapProducer',
                       src=pfJets,
                       matched=pfJetsSoftDrop,
                       distMax=cms.double(radius),
                       values=cms.vstring('mass'),
                       valueLabels=cms.vstring('Mass')))

    prunedKinematics = addattr(
        'prunedKinematics',
        cms.EDProducer('RecoJetDeltaRValueMapProducer',
                       src=pfJets,
                       matched=pfJetsPruned,
                       distMax=cms.double(radius),
                       values=cms.vstring('mass'),
                       valueLabels=cms.vstring('Mass')))

    ### subjet qg-tagging ###

    subQGTag = addattr(
        'subQGTag',
        QGTagger.clone(srcJets=subjets, jetsLabel=cms.string('QGL_AK4PFchs')))

    ########################################
    ##          MAKE PAT JETS             ##
    ########################################

    ## MAIN JET ##

    jecLevels = ['L1FastJet', 'L2Relative', 'L3Absolute']
    if isData:
        jecLevels.append('L2L3Residual')

    jetCorrFactors = addattr(
        'jetCorrFactors',
        jetUpdater_cff.patJetCorrFactors.clone(src=pfJets,
                                               payload=jecLabel,
                                               levels=jecLevels,
                                               primaryVertices=pvSource))

    if not isData:
        genJetMatch = addattr(
            'genJetMatch',
            patJetGenJetMatch.clone(src=pfJets,
                                    maxDeltaR=radius,
                                    matched='genJetsNoNu' + algo))

    patJets = addattr(
        'patJets',
        _patJets.clone(jetSource=pfJets,
                       addJetCorrFactors=True,
                       addBTagInfo=True,
                       addAssociatedTracks=False,
                       addJetCharge=False,
                       addGenPartonMatch=False,
                       addGenJetMatch=(not isData),
                       getJetMCFlavour=False,
                       addJetFlavourInfo=False))
    patJetsMod = addattr.last
    patJetsMod.jetCorrFactorsSource = [jetCorrFactors]
    patJetsMod.discriminatorSources = []
    if not isData:
        patJetsMod.genJetMatch = genJetMatch

    for tau in ['tau1', 'tau2', 'tau3', 'tau4']:
        patJetsMod.userData.userFloats.src.append(Njettiness.getModuleLabel() +
                                                  ':' + tau)

    patJetsMod.userData.userFloats.src.append(sdKinematics.getModuleLabel() +
                                              ':Mass')
    patJetsMod.userData.userFloats.src.append(
        prunedKinematics.getModuleLabel() + ':Mass')
    patJetsMod.userData.userFloats.labelPostfixesToStrip = cms.vstring(label)

    selectedPatJets = addattr(
        'selectedPatJets',
        jetSelector_cfi.selectedPatJets.clone(src=patJets,
                                              cut='abs(eta) < 2.5'))

    ## SOFT DROP ##

    patJetsSoftDrop = addattr(
        'patJetsSoftDrop',
        _patJets.clone(jetSource=pfJetsSoftDrop,
                       addJetCorrFactors=False,
                       addBTagInfo=False,
                       addAssociatedTracks=False,
                       addJetCharge=False,
                       addGenPartonMatch=False,
                       addGenJetMatch=False,
                       getJetMCFlavour=False,
                       addJetFlavourInfo=False))

    selectedPatJetsSoftDrop = addattr(
        'selectedPatJetsSoftDrop',
        jetSelector_cfi.selectedPatJets.clone(src=patJetsSoftDrop,
                                              cut='abs(eta) < 2.5'))

    ## GEN MATCH ##

    if not isData:
        genSubjetsMatch = addattr(
            'genSubjetMatch',
            patJetGenJetMatch.clone(src=subjets,
                                    maxDeltaR=0.4,
                                    matched='genJetsNoNuSoftDrop' + algo +
                                    ':SubJets'))

    ### SUBJETS ###

    patSubjets = addattr(
        'patSubjets',
        _patJets.clone(jetSource=subjets,
                       addJetCorrFactors=False,
                       addBTagInfo=False,
                       addAssociatedTracks=False,
                       addJetCharge=False,
                       addGenPartonMatch=False,
                       addGenJetMatch=(not isData),
                       getJetMCFlavour=False,
                       addJetFlavourInfo=False))
    patSubjetsMod = addattr.last
    patSubjetsMod.userData.userFloats.src.append(
        cms.InputTag(subQGTag.getModuleLabel(), 'qgLikelihood'))
    patSubjetsMod.userData.userFloats.labelPostfixesToStrip = cms.vstring(
        label)
    if not isData:
        patSubjetsMod.genJetMatch = genSubjetsMatch

    ## MERGE SUBJETS BACK ##
    jetMerger = addattr(
        'jetMerger',
        cms.EDProducer("BoostedJetMerger",
                       jetSrc=selectedPatJetsSoftDrop,
                       subjetSrc=patSubjets))

    ## PACK ##
    addattr(
        'packedPatJets',
        cms.EDProducer("JetSubstructurePacker",
                       jetSrc=selectedPatJets,
                       distMax=cms.double(radius),
                       algoTags=cms.VInputTag(jetMerger),
                       algoLabels=cms.vstring('SoftDrop'),
                       fixDaughters=cms.bool(False)))

    return sequence
 jetSrc = 'patJetsLowerPt'
 recoJetSrc = 'ak4PFJetsLowerPt'
 from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
 ak4PFJetsNew = ak4PFJets.clone(
     src=cms.InputTag(pfCandSrc)
 )
 setattr(process,recoJetSrc,ak4PFJetsNew)
 from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets
 patJetsNew = _patJets.clone(
     jetSource            = cms.InputTag(recoJetSrc),
     addJetCorrFactors    = cms.bool(False),
     jetCorrFactorsSource = cms.VInputTag(),
     addBTagInfo          = cms.bool(False),
     addDiscriminators    = cms.bool(False),
     discriminatorSources = cms.VInputTag(),
     addAssociatedTracks  = cms.bool(False),
     addJetCharge         = cms.bool(False),
     addGenPartonMatch    = cms.bool(False),
     embedGenPartonMatch  = cms.bool(False),
     addGenJetMatch       = cms.bool(False),
     getJetMCFlavour      = cms.bool(False),
     addJetFlavourInfo    = cms.bool(False),
 )
 setattr(process,jetSrc,patJetsNew)
 
 process.lowerPtTausTask = cms.Task(
     getattr(process,recoJetSrc),
     getattr(process,jetSrc),
 )
 
 tauAtMiniTools.adaptTauToMiniAODReReco(process, jetSrc=jetSrc, postfix='LowerPt')
Example #6
0
def adaptTauToMiniAODReReco(process, reclusterJets=True):
	# TRYING TO MAKE THINGS MINIAOD COMPATIBLE, FROM THE START, TO THE END, 1 BY 1
	#print '[adaptTauToMiniAODReReco]: Start'

	jetCollection = 'slimmedJets'
	# Add new jet collections if reclustering is demanded
	if reclusterJets:
		jetCollection = 'patJetsPAT'
		from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
		process.ak4PFJetsPAT = ak4PFJets.clone(
			src=cms.InputTag("packedPFCandidates")
		)
		# trivial PATJets
		from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets
		process.patJetsPAT = _patJets.clone(
			jetSource            = cms.InputTag("ak4PFJetsPAT"),
			addJetCorrFactors    = cms.bool(False),
			jetCorrFactorsSource = cms.VInputTag(),
			addBTagInfo          = cms.bool(False),
			addDiscriminators    = cms.bool(False),
			discriminatorSources = cms.VInputTag(),
			addAssociatedTracks  = cms.bool(False),
			addJetCharge         = cms.bool(False),
			addGenPartonMatch    = cms.bool(False),
			embedGenPartonMatch  = cms.bool(False),
			addGenJetMatch       = cms.bool(False),
			getJetMCFlavour      = cms.bool(False),
			addJetFlavourInfo    = cms.bool(False),
		)
		process.miniAODTausTask.add(process.ak4PFJetsPAT)
		process.miniAODTausTask.add(process.patJetsPAT)
 
	# so this adds all tracks to jet in some deltaR region. we don't have tracks so don't need it :D
	# process.ak4PFJetTracksAssociatorAtVertex.jets = cms.InputTag(jetCollection)
	
	# Remove ak4PFJetTracksAssociatorAtVertex from recoTauCommonSequence
	# Remove pfRecoTauTagInfoProducer from recoTauCommonSequence since it uses the jet-track association
	# HOWEVER, may use https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookMiniAOD2017#Isolated_Tracks
	# probably needs recovery of the two modules above

	process.recoTauAK4Jets08RegionPAT = cms.EDProducer("RecoTauPatJetRegionProducer",
		deltaR = process.recoTauAK4PFJets08Region.deltaR,
		maxJetAbsEta = process.recoTauAK4PFJets08Region.maxJetAbsEta,
		minJetPt = process.recoTauAK4PFJets08Region.minJetPt,
		pfCandAssocMapSrc = cms.InputTag(""),
		pfCandSrc = cms.InputTag("packedPFCandidates"),
		src = cms.InputTag(jetCollection)
	)

	process.recoTauPileUpVertices.src = cms.InputTag("offlineSlimmedPrimaryVertices")
	# Redefine recoTauCommonTask 
	# with redefined region and PU vertices, and w/o track-to-vertex associator and tauTagInfo (the two latter are probably obsolete and not needed at all)
	process.recoTauCommonTask = cms.Task(
		process.recoTauAK4Jets08RegionPAT,
		process.recoTauPileUpVertices
	)

	for moduleName in process.TauReco.moduleNames(): 
		convertModuleToMiniAODInput(process, moduleName)


	# Adapt TauPiZeros producer
	process.ak4PFJetsLegacyHPSPiZeros.builders[0].qualityCuts.primaryVertexSrc = cms.InputTag("offlineSlimmedPrimaryVertices")
	process.ak4PFJetsLegacyHPSPiZeros.jetSrc = cms.InputTag(jetCollection)

	# Adapt TauChargedHadrons producer
	for builder in process.ak4PFJetsRecoTauChargedHadrons.builders:
		builder.qualityCuts.primaryVertexSrc = cms.InputTag("offlineSlimmedPrimaryVertices")
		if builder.name.value() == 'tracks': #replace plugin based on generalTracks by one based on lostTracks
			builder.name = 'lostTracks'
			builder.plugin = 'PFRecoTauChargedHadronFromLostTrackPlugin'
			builder.srcTracks = cms.InputTag("lostTracks")
	process.ak4PFJetsRecoTauChargedHadrons.jetSrc = cms.InputTag(jetCollection)

	# Adapt combinatoricRecoTau producer
	process.combinatoricRecoTaus.jetRegionSrc = 'recoTauAK4Jets08RegionPAT'
	process.combinatoricRecoTaus.jetSrc = jetCollection
	# Adapt builders
	for builder in process.combinatoricRecoTaus.builders:
		for name,value in six.iteritems(builder.parameters_()):
			if name == 'qualityCuts':
				builder.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
			elif name == 'pfCandSrc':
				builder.pfCandSrc = 'packedPFCandidates'
	# Adapt supported modifiers and remove unsupported ones 
	modifiersToRemove_ = cms.VPSet()
	for mod in process.combinatoricRecoTaus.modifiers:
		if mod.name.value() == 'elec_rej':
			modifiersToRemove_.append(mod)
			continue
		elif mod.name.value() == 'TTIworkaround':
			modifiersToRemove_.append(mod)
			continue
		for name,value in six.iteritems(mod.parameters_()):
			if name == 'qualityCuts':
				mod.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
	for mod in modifiersToRemove_:
		process.combinatoricRecoTaus.modifiers.remove(mod)
		#print "\t\t Removing '%s' modifier from 'combinatoricRecoTaus'" %mod.name.value()

	# Redefine tau PV producer
	process.hpsPFTauPrimaryVertexProducer.__dict__['_TypedParameterizable__type'] = 'PFTauMiniAODPrimaryVertexProducer'
	process.hpsPFTauPrimaryVertexProducer.PVTag = 'offlineSlimmedPrimaryVertices'
	process.hpsPFTauPrimaryVertexProducer.packedCandidatesTag = cms.InputTag("packedPFCandidates")
	process.hpsPFTauPrimaryVertexProducer.lostCandidatesTag = cms.InputTag("lostTracks")

	# Redefine tau SV producer
	process.hpsPFTauSecondaryVertexProducer = cms.EDProducer("PFTauSecondaryVertexProducer",
		PFTauTag = cms.InputTag("hpsPFTauProducer")
	)
	
	# Remove RecoTau producers which are not supported (yet?), i.e. against-e/mu discriminats
	for moduleName in process.TauReco.moduleNames(): 
		if 'ElectronRejection' in moduleName or 'MuonRejection' in moduleName:
			process.miniAODTausTask.remove(getattr(process, moduleName))

	# Instead add against-mu discriminants which are MiniAOD compatible
	from RecoTauTag.RecoTau.hpsPFTauDiscriminationByAMuonRejectionSimple_cff import hpsPFTauDiscriminationByLooseMuonRejectionSimple, hpsPFTauDiscriminationByTightMuonRejectionSimple
	
	process.hpsPFTauDiscriminationByLooseMuonRejectionSimple = hpsPFTauDiscriminationByLooseMuonRejectionSimple
	process.hpsPFTauDiscriminationByTightMuonRejectionSimple = hpsPFTauDiscriminationByTightMuonRejectionSimple
	process.miniAODTausTask.add(process.hpsPFTauDiscriminationByLooseMuonRejectionSimple)
	process.miniAODTausTask.add(process.hpsPFTauDiscriminationByTightMuonRejectionSimple)

	#####
	# PAT part in the following

	process.tauGenJets.GenParticles = cms.InputTag("prunedGenParticles")
	process.tauMatch.matched = cms.InputTag("prunedGenParticles")

	# Remove unsupported tauIDs
	for name, src in six.iteritems(process.patTaus.tauIDSources.parameters_()):
		if name.find('againstElectron') > -1 or name.find('againstMuon') > -1:
			delattr(process.patTaus.tauIDSources,name)
	# Add MiniAOD specific ones
	setattr(process.patTaus.tauIDSources,'againstMuonLooseSimple',cms.InputTag('hpsPFTauDiscriminationByLooseMuonRejectionSimple'))
	setattr(process.patTaus.tauIDSources,'againstMuonTightSimple',cms.InputTag('hpsPFTauDiscriminationByTightMuonRejectionSimple'))
def adaptTauToMiniAODReReco(process, reclusterJets=True):
    jetCollection = 'slimmedJets'
    # Add new jet collections if reclustering is demanded
    if reclusterJets:
        jetCollection = 'patJetsPAT'
        from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
        process.ak4PFJetsPAT = ak4PFJets.clone(
            src=cms.InputTag("packedPFCandidates"))
        # trivial PATJets
        from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets
        process.patJetsPAT = _patJets.clone(
            jetSource=cms.InputTag("ak4PFJetsPAT"),
            addJetCorrFactors=cms.bool(False),
            jetCorrFactorsSource=cms.VInputTag(),
            addBTagInfo=cms.bool(False),
            addDiscriminators=cms.bool(False),
            discriminatorSources=cms.VInputTag(),
            addAssociatedTracks=cms.bool(False),
            addJetCharge=cms.bool(False),
            addGenPartonMatch=cms.bool(False),
            embedGenPartonMatch=cms.bool(False),
            addGenJetMatch=cms.bool(False),
            getJetMCFlavour=cms.bool(False),
            addJetFlavourInfo=cms.bool(False),
        )
        process.miniAODTausTask.add(process.ak4PFJetsPAT)
        process.miniAODTausTask.add(process.patJetsPAT)
        ###################### ElectronCleaned ######################
        jetCollectionElectronCleaned = 'patJetsPATElectronCleaned'
        jetCollectionMuonCleaned = 'patJetsPATMuonCleaned'
        from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
        process.ak4PFJetsPATElectronCleaned = ak4PFJets.clone(src=cms.InputTag(
            'PackedCandsElectronCleaned', 'packedPFCandidatesElectronCleaned'))
        from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets
        process.patJetsPATElectronCleaned = _patJets.clone(
            jetSource=cms.InputTag("ak4PFJetsPATElectronCleaned"),
            addJetCorrFactors=cms.bool(False),
            jetCorrFactorsSource=cms.VInputTag(),
            addBTagInfo=cms.bool(False),
            addDiscriminators=cms.bool(False),
            discriminatorSources=cms.VInputTag(),
            addAssociatedTracks=cms.bool(False),
            addJetCharge=cms.bool(False),
            addGenPartonMatch=cms.bool(False),
            embedGenPartonMatch=cms.bool(False),
            addGenJetMatch=cms.bool(False),
            getJetMCFlavour=cms.bool(False),
            addJetFlavourInfo=cms.bool(False),
        )

        process.miniAODTausTaskElectronCleaned.add(
            process.ak4PFJetsPATElectronCleaned)
        process.miniAODTausTaskElectronCleaned.add(
            process.patJetsPATElectronCleaned)

        from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets
        process.ak4PFJetsPATMuonCleaned = ak4PFJets.clone(src=cms.InputTag(
            'PackedCandsMuonCleaned', 'packedPFCandidatesMuonCleaned'))
        from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets
        process.patJetsPATMuonCleaned = _patJets.clone(
            jetSource=cms.InputTag("ak4PFJetsPATMuonCleaned"),
            addJetCorrFactors=cms.bool(False),
            jetCorrFactorsSource=cms.VInputTag(),
            addBTagInfo=cms.bool(False),
            addDiscriminators=cms.bool(False),
            discriminatorSources=cms.VInputTag(),
            addAssociatedTracks=cms.bool(False),
            addJetCharge=cms.bool(False),
            addGenPartonMatch=cms.bool(False),
            embedGenPartonMatch=cms.bool(False),
            addGenJetMatch=cms.bool(False),
            getJetMCFlavour=cms.bool(False),
            addJetFlavourInfo=cms.bool(False),
        )

        process.miniAODTausTaskMuonCleaned.add(process.ak4PFJetsPATMuonCleaned)
        process.miniAODTausTaskMuonCleaned.add(process.patJetsPATMuonCleaned)

    process.recoTauAK4Jets08RegionPAT = cms.EDProducer(
        "RecoTauPatJetRegionProducer",
        deltaR=process.recoTauAK4PFJets08Region.deltaR,
        maxJetAbsEta=process.recoTauAK4PFJets08Region.maxJetAbsEta,
        minJetPt=process.recoTauAK4PFJets08Region.minJetPt,
        pfCandAssocMapSrc=cms.InputTag(""),
        pfCandSrc=cms.InputTag("packedPFCandidates"),
        src=cms.InputTag(jetCollection))

    process.recoTauPileUpVertices.src = cms.InputTag(
        "offlineSlimmedPrimaryVertices")
    # Redefine recoTauCommonTask
    # with redefined region and PU vertices, and w/o track-to-vertex associator and tauTagInfo (the two latter are probably obsolete and not needed at all)
    process.recoTauCommonTask = cms.Task(process.recoTauAK4Jets08RegionPAT,
                                         process.recoTauPileUpVertices)

    process.recoTauAK4Jets08RegionPATElectronCleaned = cms.EDProducer(
        "RecoTauPatJetRegionProducer",
        deltaR=process.recoTauAK4PFJets08RegionElectronCleaned.deltaR,
        maxJetAbsEta=process.recoTauAK4PFJets08RegionElectronCleaned.
        maxJetAbsEta,
        minJetPt=process.recoTauAK4PFJets08RegionElectronCleaned.minJetPt,
        pfCandAssocMapSrc=cms.InputTag(""),
        pfCandSrc=cms.InputTag('PackedCandsElectronCleaned',
                               'packedPFCandidatesElectronCleaned'),
        src=cms.InputTag(jetCollectionElectronCleaned))

    process.recoTauPileUpVerticesElectronCleaned.src = cms.InputTag(
        "offlineSlimmedPrimaryVertices")

    # Redefine recoTauCommonTask-ElectronCleaned
    process.miniAODTausTaskElectronCleaned.add(
        process.recoTauAK4Jets08RegionPATElectronCleaned)
    process.miniAODTausTaskElectronCleaned.add(
        process.recoTauPileUpVerticesElectronCleaned)

    process.recoTauAK4Jets08RegionPATMuonCleaned = cms.EDProducer(
        "RecoTauPatJetRegionProducer",
        deltaR=process.recoTauAK4PFJets08RegionMuonCleaned.deltaR,
        maxJetAbsEta=process.recoTauAK4PFJets08RegionMuonCleaned.maxJetAbsEta,
        minJetPt=process.recoTauAK4PFJets08RegionMuonCleaned.minJetPt,
        pfCandAssocMapSrc=cms.InputTag(""),
        pfCandSrc=cms.InputTag('PackedCandsMuonCleaned',
                               'packedPFCandidatesMuonCleaned'),
        src=cms.InputTag(jetCollectionMuonCleaned))

    process.recoTauPileUpVerticesMuonCleaned.src = cms.InputTag(
        "offlineSlimmedPrimaryVertices")

    # Redefine recoTauCommonTask-MuonCleaned
    process.miniAODTausTaskMuonCleaned.add(
        process.recoTauAK4Jets08RegionPATMuonCleaned)
    process.miniAODTausTaskMuonCleaned.add(
        process.recoTauPileUpVerticesMuonCleaned)

    for moduleName in process.TauReco.moduleNames():
        convertModuleToMiniAODInput(process, moduleName)

    for moduleName in process.TauRecoElectronCleaned.moduleNames():
        convertModuleToMiniAODInput(process, moduleName)

    for moduleName in process.TauRecoMuonCleaned.moduleNames():
        convertModuleToMiniAODInput(process, moduleName)

    # Adapt TauPiZeros producer
    process.ak4PFJetsLegacyHPSPiZeros.builders[
        0].qualityCuts.primaryVertexSrc = cms.InputTag(
            "offlineSlimmedPrimaryVertices")
    process.ak4PFJetsLegacyHPSPiZeros.jetSrc = cms.InputTag(jetCollection)

    # Adapt TauPiZeros producer-ElectronCleaned
    process.ak4PFJetsLegacyHPSPiZerosElectronCleaned.builders[
        0].qualityCuts.primaryVertexSrc = cms.InputTag(
            "offlineSlimmedPrimaryVertices")
    process.ak4PFJetsLegacyHPSPiZerosElectronCleaned.jetSrc = cms.InputTag(
        jetCollectionElectronCleaned)

    # Adapt TauPiZeros producer-MuonCleaned
    process.ak4PFJetsLegacyHPSPiZerosMuonCleaned.builders[
        0].qualityCuts.primaryVertexSrc = cms.InputTag(
            "offlineSlimmedPrimaryVertices")
    process.ak4PFJetsLegacyHPSPiZerosMuonCleaned.jetSrc = cms.InputTag(
        jetCollectionMuonCleaned)

    # Adapt TauChargedHadrons producer
    for builder in process.ak4PFJetsRecoTauChargedHadrons.builders:
        builder.qualityCuts.primaryVertexSrc = cms.InputTag(
            "offlineSlimmedPrimaryVertices")
        if builder.name.value(
        ) == 'tracks':  #replace plugin based on generalTracks by one based on lostTracks
            builder.name = 'lostTracks'
            builder.plugin = 'PFRecoTauChargedHadronFromLostTrackPlugin'
            builder.srcTracks = cms.InputTag("lostTracks")
    process.ak4PFJetsRecoTauChargedHadrons.jetSrc = cms.InputTag(jetCollection)

    # Adapt TauChargedHadrons producer-ElectronCleaned
    for builder in process.ak4PFJetsRecoTauChargedHadronsElectronCleaned.builders:
        builder.qualityCuts.primaryVertexSrc = cms.InputTag(
            "offlineSlimmedPrimaryVertices")
        if builder.name.value(
        ) == 'tracks':  #replace plugin based on generalTracks by one based on lostTracks
            builder.name = 'lostTracks'
            builder.plugin = 'PFRecoTauChargedHadronFromLostTrackPlugin'
            builder.srcTracks = cms.InputTag("lostTracks")
    process.ak4PFJetsRecoTauChargedHadronsElectronCleaned.jetSrc = cms.InputTag(
        jetCollectionElectronCleaned)

    # Adapt TauChargedHadrons producer-MuonCleaned
    for builder in process.ak4PFJetsRecoTauChargedHadronsMuonCleaned.builders:
        builder.qualityCuts.primaryVertexSrc = cms.InputTag(
            "offlineSlimmedPrimaryVertices")
        if builder.name.value(
        ) == 'tracks':  #replace plugin based on generalTracks by one based on lostTracks
            builder.name = 'lostTracks'
            builder.plugin = 'PFRecoTauChargedHadronFromLostTrackPlugin'
            builder.srcTracks = cms.InputTag("lostTracks")
    process.ak4PFJetsRecoTauChargedHadronsMuonCleaned.jetSrc = cms.InputTag(
        jetCollectionMuonCleaned)

    # Adapt combinatoricRecoTau producer
    process.combinatoricRecoTaus.jetRegionSrc = 'recoTauAK4Jets08RegionPAT'
    process.combinatoricRecoTaus.jetSrc = jetCollection
    # Adapt builders
    for builder in process.combinatoricRecoTaus.builders:
        for name, value in six.iteritems(builder.parameters_()):
            if name == 'qualityCuts':
                builder.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
            elif name == 'pfCandSrc':
                builder.pfCandSrc = 'packedPFCandidates'

    # Adapt combinatoricRecoTau producer - ElectronCleaned
    process.combinatoricRecoTausElectronCleaned.jetRegionSrc = 'recoTauAK4Jets08RegionPATElectronCleaned'
    process.combinatoricRecoTausElectronCleaned.jetSrc = jetCollectionElectronCleaned
    # Adapt builders - ElectronCleaned
    for builder in process.combinatoricRecoTausElectronCleaned.builders:
        for name, value in six.iteritems(builder.parameters_()):
            if name == 'qualityCuts':
                builder.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
            elif name == 'pfCandSrc':
                builder.pfCandSrc = cms.InputTag(
                    'PackedCandsElectronCleaned',
                    'packedPFCandidatesElectronCleaned')

    # Adapt combinatoricRecoTau producer - MuonCleaned
    process.combinatoricRecoTausMuonCleaned.jetRegionSrc = 'recoTauAK4Jets08RegionPATMuonCleaned'
    process.combinatoricRecoTausMuonCleaned.jetSrc = jetCollectionMuonCleaned
    # Adapt builders - MuonCleaned
    for builder in process.combinatoricRecoTausMuonCleaned.builders:
        for name, value in six.iteritems(builder.parameters_()):
            if name == 'qualityCuts':
                builder.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
            elif name == 'pfCandSrc':
                builder.pfCandSrc = cms.InputTag(
                    'PackedCandsMuonCleaned', 'packedPFCandidatesMuonCleaned')

    # Adapt supported modifiers and remove unsupported ones
    modifiersToRemove_ = cms.VPSet()

    for mod in process.combinatoricRecoTaus.modifiers:
        if mod.name.value() == 'elec_rej':
            modifiersToRemove_.append(mod)
            continue
        elif mod.name.value() == 'TTIworkaround':
            modifiersToRemove_.append(mod)
            continue
        for name, value in six.iteritems(mod.parameters_()):
            if name == 'qualityCuts':
                mod.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
    for mod in modifiersToRemove_:
        process.combinatoricRecoTaus.modifiers.remove(mod)

    modifiersToRemoveElectronCleaned_ = cms.VPSet()

    for mod in process.combinatoricRecoTausElectronCleaned.modifiers:
        if mod.name.value() == 'elec_rej':
            modifiersToRemoveElectronCleaned_.append(mod)
            continue
        elif mod.name.value() == 'TTIworkaround':
            modifiersToRemoveElectronCleaned_.append(mod)
            continue
        for name, value in six.iteritems(mod.parameters_()):
            if name == 'qualityCuts':
                mod.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
    for mod in modifiersToRemoveElectronCleaned_:
        process.combinatoricRecoTausElectronCleaned.modifiers.remove(mod)

    modifiersToRemoveMuonCleaned_ = cms.VPSet()

    for mod in process.combinatoricRecoTausMuonCleaned.modifiers:
        if mod.name.value() == 'elec_rej':
            modifiersToRemoveMuonCleaned_.append(mod)
            continue
        elif mod.name.value() == 'TTIworkaround':
            modifiersToRemoveMuonCleaned_.append(mod)
            continue
        for name, value in six.iteritems(mod.parameters_()):
            if name == 'qualityCuts':
                mod.qualityCuts.primaryVertexSrc = 'offlineSlimmedPrimaryVertices'
    for mod in modifiersToRemoveMuonCleaned_:
        process.combinatoricRecoTausMuonCleaned.modifiers.remove(mod)

    # Redefine tau PV producer
    process.hpsPFTauPrimaryVertexProducer.__dict__[
        '_TypedParameterizable__type'] = 'PFTauMiniAODPrimaryVertexProducer'
    process.hpsPFTauPrimaryVertexProducer.PVTag = 'offlineSlimmedPrimaryVertices'
    process.hpsPFTauPrimaryVertexProducer.packedCandidatesTag = cms.InputTag(
        "packedPFCandidates")
    process.hpsPFTauPrimaryVertexProducer.lostCandidatesTag = cms.InputTag(
        "lostTracks")

    # Redefine tau PV producer-ElectronCleaned
    process.hpsPFTauPrimaryVertexProducerElectronCleaned.__dict__[
        '_TypedParameterizable__type'] = 'PFTauMiniAODPrimaryVertexProducer'
    process.hpsPFTauPrimaryVertexProducerElectronCleaned.PVTag = 'offlineSlimmedPrimaryVertices'
    process.hpsPFTauPrimaryVertexProducerElectronCleaned.packedCandidatesTag = cms.InputTag(
        'PackedCandsElectronCleaned', 'packedPFCandidatesElectronCleaned')
    process.hpsPFTauPrimaryVertexProducerElectronCleaned.lostCandidatesTag = cms.InputTag(
        "lostTracks")

    # Redefine tau PV producer-MuonCleaned
    process.hpsPFTauPrimaryVertexProducerMuonCleaned.__dict__[
        '_TypedParameterizable__type'] = 'PFTauMiniAODPrimaryVertexProducer'
    process.hpsPFTauPrimaryVertexProducerMuonCleaned.PVTag = 'offlineSlimmedPrimaryVertices'
    process.hpsPFTauPrimaryVertexProducerMuonCleaned.packedCandidatesTag = cms.InputTag(
        'PackedCandsMuonCleaned', 'packedPFCandidatesMuonCleaned')
    process.hpsPFTauPrimaryVertexProducerMuonCleaned.lostCandidatesTag = cms.InputTag(
        "lostTracks")

    # Redefine tau SV producer
    process.hpsPFTauSecondaryVertexProducer = cms.EDProducer(
        "PFTauSecondaryVertexProducer",
        PFTauTag=cms.InputTag("hpsPFTauProducer"))

    # Redefine tau SV producer-ElectronCleaned
    process.hpsPFTauSecondaryVertexProducerElectronCleaned = cms.EDProducer(
        "PFTauSecondaryVertexProducer",
        PFTauTag=cms.InputTag("hpsPFTauProducerElectronCleaned"))

    # Redefine tau SV producer-MuonCleaned
    process.hpsPFTauSecondaryVertexProducerMuonCleaned = cms.EDProducer(
        "PFTauSecondaryVertexProducer",
        PFTauTag=cms.InputTag("hpsPFTauProducerMuonCleaned"))
    # Remove RecoTau producers which are not supported (yet?), i.e. against-e/mu discriminats
    for moduleName in process.TauReco.moduleNames():
        if 'ElectronRejection' in moduleName or 'MuonRejection' in moduleName:
            process.miniAODTausTask.remove(getattr(process, moduleName))

    # Remove RecoTau producers which are not supported (yet?), i.e. against-e/mu discriminats
    for moduleName in process.TauRecoElectronCleaned.moduleNames():
        if 'ElectronRejection' in moduleName or 'MuonRejection' in moduleName:
            process.miniAODTausTaskElectronCleaned.remove(
                getattr(process, moduleName))

    # Remove RecoTau producers which are not supported (yet?), i.e. against-e/mu discriminats
    for moduleName in process.TauRecoMuonCleaned.moduleNames():
        if 'ElectronRejection' in moduleName or 'MuonRejection' in moduleName:
            process.miniAODTausTaskMuonCleaned.remove(
                getattr(process, moduleName))

    # Instead add against-mu discriminants which are MiniAOD compatible
    from RecoTauTag.RecoTau.hpsPFTauDiscriminationByAMuonRejectionSimple_cff import hpsPFTauDiscriminationByLooseMuonRejectionSimple, hpsPFTauDiscriminationByTightMuonRejectionSimple

    process.hpsPFTauDiscriminationByLooseMuonRejectionSimple = hpsPFTauDiscriminationByLooseMuonRejectionSimple
    process.hpsPFTauDiscriminationByTightMuonRejectionSimple = hpsPFTauDiscriminationByTightMuonRejectionSimple
    process.miniAODTausTask.add(
        process.hpsPFTauDiscriminationByLooseMuonRejectionSimple)
    process.miniAODTausTask.add(
        process.hpsPFTauDiscriminationByTightMuonRejectionSimple)

    process.hpsPFTauDiscriminationByLooseMuonRejectionSimpleElectronCleaned = process.hpsPFTauDiscriminationByLooseMuonRejectionSimple.clone(
        PFTauProducer=cms.InputTag("hpsPFTauProducerElectronCleaned"))
    process.hpsPFTauDiscriminationByTightMuonRejectionSimpleElectronCleaned = hpsPFTauDiscriminationByTightMuonRejectionSimple.clone(
        PFTauProducer=cms.InputTag("hpsPFTauProducerElectronCleaned"))
    process.miniAODTausTaskElectronCleaned.add(
        process.hpsPFTauDiscriminationByLooseMuonRejectionSimpleElectronCleaned
    )
    process.miniAODTausTaskElectronCleaned.add(
        process.hpsPFTauDiscriminationByTightMuonRejectionSimpleElectronCleaned
    )

    process.hpsPFTauDiscriminationByLooseMuonRejectionSimpleMuonCleaned = process.hpsPFTauDiscriminationByLooseMuonRejectionSimple.clone(
        PFTauProducer=cms.InputTag("hpsPFTauProducerMuonCleaned"))
    process.hpsPFTauDiscriminationByTightMuonRejectionSimpleMuonCleaned = hpsPFTauDiscriminationByTightMuonRejectionSimple.clone(
        PFTauProducer=cms.InputTag("hpsPFTauProducerMuonCleaned"))
    process.miniAODTausTaskMuonCleaned.add(
        process.hpsPFTauDiscriminationByLooseMuonRejectionSimpleMuonCleaned)
    process.miniAODTausTaskMuonCleaned.add(
        process.hpsPFTauDiscriminationByTightMuonRejectionSimpleMuonCleaned)

    #####
    # PAT part in the following

    process.tauGenJets.GenParticles = cms.InputTag("prunedGenParticles")
    process.tauMatch.matched = cms.InputTag("prunedGenParticles")

    process.tauGenJetsElectronCleaned.GenParticles = cms.InputTag(
        "prunedGenParticles")
    process.tauMatchElectronCleaned.matched = cms.InputTag(
        "prunedGenParticles")

    process.tauGenJetsMuonCleaned.GenParticles = cms.InputTag(
        "prunedGenParticles")
    process.tauMatchMuonCleaned.matched = cms.InputTag("prunedGenParticles")

    # Remove unsupported tauIDs
    for name, src in six.iteritems(process.patTaus.tauIDSources.parameters_()):
        if name.find('againstElectron') > -1 or name.find('againstMuon') > -1:
            delattr(process.patTaus.tauIDSources, name)
    # Add MiniAOD specific ones
    setattr(process.patTaus.tauIDSources, 'againstMuonLooseSimple',
            cms.InputTag('hpsPFTauDiscriminationByLooseMuonRejectionSimple'))
    setattr(process.patTaus.tauIDSources, 'againstMuonTightSimple',
            cms.InputTag('hpsPFTauDiscriminationByTightMuonRejectionSimple'))

    for name, src in six.iteritems(
            process.patTausElectronCleaned.tauIDSources.parameters_()):
        if name.find('againstElectron') > -1 or name.find('againstMuon') > -1:
            delattr(process.patTausElectronCleaned.tauIDSources, name)
    # Add MiniAOD specific ones
    setattr(
        process.patTausElectronCleaned.tauIDSources, 'againstMuonLooseSimple',
        cms.InputTag(
            'hpsPFTauDiscriminationByLooseMuonRejectionSimpleElectronCleaned'))
    setattr(
        process.patTausElectronCleaned.tauIDSources, 'againstMuonTightSimple',
        cms.InputTag(
            'hpsPFTauDiscriminationByTightMuonRejectionSimpleElectronCleaned'))

    for name, src in six.iteritems(
            process.patTausMuonCleaned.tauIDSources.parameters_()):
        if name.find('againstElectron') > -1 or name.find('againstMuon') > -1:
            delattr(process.patTausMuonCleaned.tauIDSources, name)
    # Add MiniAOD specific ones
    setattr(
        process.patTausMuonCleaned.tauIDSources, 'againstMuonLooseSimple',
        cms.InputTag(
            'hpsPFTauDiscriminationByLooseMuonRejectionSimpleMuonCleaned'))
    setattr(
        process.patTausMuonCleaned.tauIDSources, 'againstMuonTightSimple',
        cms.InputTag(
            'hpsPFTauDiscriminationByTightMuonRejectionSimpleMuonCleaned'))

    from PhysicsTools.PatAlgos.slimming.slimmedTaus_cfi import slimmedTaus
Example #8
0
def setupHOTVR(process, runOnMC=False, path=None):

    # HOTVR
    process.hotvrPuppi = cms.EDProducer('HOTVRProducer',
        src=cms.InputTag("puppi")
    )

    from  PhysicsTools.PatAlgos.recoLayer0.jetCorrFactors_cfi import patJetCorrFactors
    process.jetCorrFactorsHOTVRSubjets = patJetCorrFactors.clone(
        src=cms.InputTag('hotvrPuppi', 'RecoSubJets'),
        levels=cms.vstring('L2Relative', 'L3Absolute', 'L2L3Residual'),
        payload=cms.string('AK4PFPuppi'),
        primaryVertices=cms.InputTag("offlineSlimmedPrimaryVertices"),
    )
    from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets
    process.updatedHOTVRSubjets = _patJets.clone(
        jetSource=cms.InputTag('hotvrPuppi', 'RecoSubJets'),
        jetCorrFactorsSource=cms.VInputTag(cms.InputTag("jetCorrFactorsHOTVRSubjets")),
        addBTagInfo=cms.bool(False),
        addAssociatedTracks=cms.bool(False),
        addJetCharge=cms.bool(False),
        addGenPartonMatch=cms.bool(False),
        embedGenPartonMatch=cms.bool(False),
        addGenJetMatch=cms.bool(False),
        embedGenJetMatch=cms.bool(False),
        getJetMCFlavour=cms.bool(False),
        addJetFlavourInfo=cms.bool(False),
    )

    process.finalHOTVR = cms.EDProducer('HOTVRUpdater',
        src=cms.InputTag("hotvrPuppi"),
        subjets=cms.InputTag("updatedHOTVRSubjets"),
    )

    process.hotvrTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
        src=cms.InputTag("finalHOTVR"),
        name=cms.string("HOTVRPuppi"),
        cut=cms.string(""),
        doc=cms.string("HOTVR Puppi jets"),
        singleton=cms.bool(False),  # the number of entries is variable
        extension=cms.bool(False),  # this is the main table for the jets
        variables=cms.PSet(P4Vars,
            tau1=Var("userFloat('tau1')", float, doc="Nsubjettiness (1 axis)", precision=10),
            tau2=Var("userFloat('tau2')", float, doc="Nsubjettiness (2 axis)", precision=10),
            tau3=Var("userFloat('tau3')", float, doc="Nsubjettiness (3 axis)", precision=10),
            fpt=Var("userFloat('fpt')", float, doc="pT(sj1)/pT(jet)", precision=10),
            mmin=Var("userFloat('mmin')", float, doc="min mass of subjet pairs", precision=10),
            nsubjets=Var("?nSubjetCollections()>0?subjets().size():0", int, doc="number of subjets"),
            subJetIdx1=Var("?nSubjetCollections()>0 && subjets().size()>0?subjets()[0].key():-1", int,
                 doc="index of first subjet"),
            subJetIdx2=Var("?nSubjetCollections()>0 && subjets().size()>1?subjets()[1].key():-1", int,
                 doc="index of second subjet"),
            subJetIdx3=Var("?nSubjetCollections()>0 && subjets().size()>2?subjets()[2].key():-1", int,
                 doc="index of third subjet"),
        )
    )
    process.hotvrTable.variables.pt.precision = 10

    process.hotvrSubJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
        src=cms.InputTag("updatedHOTVRSubjets"),
        cut=cms.string(""),
        name=cms.string("HOTVRPuppiSubJet"),
        doc=cms.string("HOTVR Puppi subjets"),
        singleton=cms.bool(False),  # the number of entries is variable
        extension=cms.bool(False),  # this is the main table for the jets
        variables=cms.PSet(P4Vars,
            rawFactor=Var("1.-jecFactor('Uncorrected')", float, doc="1 - Factor to get back to raw pT", precision=6),
            area=Var("jetArea()", float, doc="jet catchment area, for JECs", precision=10),
        )
    )
    process.hotvrSubJetTable.variables.pt.precision = 10

    process.hotvrTask = cms.Task(
        process.hotvrPuppi,
        process.jetCorrFactorsHOTVRSubjets,
        process.updatedHOTVRSubjets,
        process.finalHOTVR,
        process.hotvrTable,
        process.hotvrSubJetTable
        )

    if path is None:
        process.schedule.associate(process.hotvrTask)
    else:
        getattr(process, path).associate(process.hotvrTask)
Example #9
0
def makeFatJets(process,
                src,
                algoLabel,
                jetRadius,
                colLabel,
                jetPtMin=150.,
                btagLabel=''):

    rLabel = algoLabel + '%d' % (int(jetRadius * 10))  # 'ak8'

    if algoLabel.lower() == 'ca':
        jetAlgo = 'CambridgeAachen'
    elif algoLabel.lower() == 'ak':
        jetAlgo = 'AntiKt'
    else:
        raise RuntimeError('Unknown jet algo ' + algoLabel)

    if jetRadius < 1.:
        sdZcut = 0.1
        sdBeta = 0.0
    else:
        sdZcut = 0.15
        sdBeta = 1.0

    ## Used for btagging & jet clustering (pvSource)
    ## CMS uses the particleFlow collection to compute the btag info regardless of the jet source collection.
    pfSource = 'particleFlow'
    pvSource = 'offlinePrimaryVertices'

    ########################################
    ##           CLUSTER JETS             ##
    ########################################

    jets = ak4PFJets.clone(jetAlgorithm=cms.string(jetAlgo),
                           rParam=cms.double(jetRadius),
                           src=cms.InputTag(src),
                           srcPVs=cms.InputTag(pvSource),
                           doAreaFastjet=cms.bool(True),
                           jetPtMin=cms.double(jetPtMin))

    jetsName = rLabel + colLabel  # 'ak8PFJetsCHS'
    setattr(process, jetsName, jets)

    softDropJets = jets.clone(useSoftDrop=cms.bool(True),
                              R0=cms.double(jetRadius),
                              zcut=cms.double(sdZcut),
                              beta=cms.double(sdBeta),
                              writeCompound=cms.bool(True),
                              useExplicitGhosts=cms.bool(True),
                              jetCollInstanceName=cms.string("SubJets"))

    softDropJetsName = jetsName + 'SoftDrop'
    setattr(process, softDropJetsName, softDropJets)

    softDropSubjetsName = softDropJetsName + 'Subjets'

    clustering = cms.Sequence(jets + softDropJets)

    ########################################
    ##           SUBSTRUCTURE             ##
    ########################################

    njettiness = Njettiness.clone(src=cms.InputTag(jetsName),
                                  R0=cms.double(jetRadius),
                                  Njets=cms.vuint32(1, 2, 3, 4))

    njettinessName = 'njettiness' + jetsName
    setattr(process, njettinessName, njettiness)

    sdKinematics = cms.EDProducer(
        'RecoJetDeltaRValueMapProducer',
        src=cms.InputTag(jetsName),
        matched=cms.InputTag(softDropJetsName),
        distMax=cms.double(1.5),
        values=cms.vstring('mass'),
        valueLabels=cms.vstring('Mass'),
    )

    sdKinematicsName = 'sdKinematics' + jetsName
    setattr(process, sdKinematicsName, sdKinematics)

    substructure = cms.Sequence(njettiness + sdKinematics)

    if btagLabel != '':
        #######################################
        ##         FATJET BTAGGING           ##
        #######################################

        initBTag(process, btagLabel, pfSource, pvSource)

        btags = [
            'pfJetProbabilityBJetTags', 'pfJetBProbabilityBJetTags',
            'pfCombinedSecondaryVertexV2BJetTags',
            'pfCombinedInclusiveSecondaryVertexV2BJetTags',
            'pfCombinedMVAV2BJetTags'
        ]

        btagInfos = []
        btagging = setupBTag(process,
                             jetsName,
                             jetsName,
                             btagLabel,
                             tags=btags,
                             addedTagInfos=btagInfos)

        doubleBtags = ['pfBoostedDoubleSecondaryVertexBJetTags']

        doubleBtagging = setupDoubleBTag(process,
                                         jetsName,
                                         jetsName,
                                         btagLabel,
                                         rLabel.lower(),
                                         addedTagInfos=btagInfos)

        #######################################
        ##         SUBJET BTAGGING           ##
        #######################################

        # Product: std::vector<reco::CandIPTagInfo>
        # IPTagInfo object contains a reference to jet
        subjetIpTagInfos = btag.pfImpactParameterTagInfos.clone(
            jets=cms.InputTag(softDropJetsName, 'SubJets'),
            primaryVertex=cms.InputTag(pvSource),
            candidates=cms.InputTag(pfSource),
            #      explicitJTA = cms.bool(True)
        )

        subjetIpTagInfosName = 'pfImpactParameterTagInfos' + softDropSubjetsName
        setattr(process, subjetIpTagInfosName, subjetIpTagInfos)

        # Product: std::vector<TemplatedSecondaryVertexTagInfo<reco::CandIPTagInfo, reco::VertexCompositePtrCandidate>>
        subjetInclSVFinderTagInfos = btag.pfInclusiveSecondaryVertexFinderTagInfos.clone(
            trackIPTagInfos=cms.InputTag(subjetIpTagInfosName),
            extSVCollection=cms.InputTag(
                'inclusiveCandidateSecondaryVertices' + btagLabel),
            #      useSVClustering = cms.bool(True),
            #      jetAlgorithm = cms.string(jetAlgo),
            #      rParam = cms.double(jetRadius),
            #      fatJets = cms.InputTag(jetsName),
            #      groomedFatJets = cms.InputTag(softDropJetsName)
        )

        subjetInclSVFinderTagInfosName = 'pfInclusiveSecondaryVertexFinderTagInfos' + softDropSubjetsName
        setattr(process, subjetInclSVFinderTagInfosName,
                subjetInclSVFinderTagInfos)

        # Product: JetTagCollection (aka reco::JetFloatAssociation::Container aka edm::AssociationVector<reco::JetRefBaseProd, std::vector<float>>)
        # Uses the internal reference to the jet in the TagInfos object to create an AssociationVector
        subjetBjetTags = btag.pfCombinedInclusiveSecondaryVertexV2BJetTags.clone(
            tagInfos=cms.VInputTag(
                cms.InputTag(subjetIpTagInfosName),
                cms.InputTag(subjetInclSVFinderTagInfosName)))

        subjetBjetTagsName = 'pfCombinedInclusiveSecondaryVertexV2BJetTags' + softDropSubjetsName
        setattr(process, subjetBjetTagsName, subjetBjetTags)

        subjetBTagging = cms.Sequence(subjetIpTagInfos +
                                      subjetInclSVFinderTagInfos +
                                      subjetBjetTags)

    else:
        btagging = cms.Sequence()
        doubleBtagging = cms.Sequence()
        subjetBTagging = cms.Sequence()

    ########################################
    ##          MAKE PAT JETS             ##
    ########################################

    patJets = _patJets.clone(jetSource=cms.InputTag(jetsName),
                             getJetMCFlavour=cms.bool(False),
                             addGenJetMatch=cms.bool(False),
                             addGenPartonMatch=cms.bool(False),
                             addJetFlavourInfo=cms.bool(False),
                             addAssociatedTracks=cms.bool(False),
                             addJetCharge=cms.bool(False),
                             addJetCorrFactors=cms.bool(False),
                             addBTagInfo=cms.bool(True),
                             addTagInfos=cms.bool(True),
                             addDiscriminators=cms.bool(True),
                             tagInfoSources=cms.VInputTag(
                                 [cms.InputTag(name) for name in btagInfos]),
                             discriminatorSources=cms.VInputTag([
                                 cms.InputTag(name + jetsName)
                                 for name in btags + doubleBtags
                             ]))
    patJets.userData.userFloats.src = [
        cms.InputTag(njettinessName + ':tau1'),
        cms.InputTag(njettinessName + ':tau2'),
        cms.InputTag(njettinessName + ':tau3'),
        cms.InputTag(njettinessName + ':tau4'),
        cms.InputTag(sdKinematicsName + ':Mass')
    ]

    patJetsName = 'pat' + jetsName
    setattr(process, patJetsName, patJets)

    selectedJets = selectedPatJets.clone(src=cms.InputTag(patJetsName))

    selectedJetsName = 'selectedPat' + jetsName
    setattr(process, selectedJetsName, selectedJets)

    patSoftDropJets = _patJets.clone(jetSource=cms.InputTag(softDropJetsName),
                                     getJetMCFlavour=cms.bool(False),
                                     addGenJetMatch=cms.bool(False),
                                     addGenPartonMatch=cms.bool(False),
                                     addJetFlavourInfo=cms.bool(False),
                                     addTagInfos=cms.bool(False),
                                     addBTagInfo=cms.bool(False),
                                     addDiscriminators=cms.bool(False),
                                     addAssociatedTracks=cms.bool(False),
                                     addJetCharge=cms.bool(False),
                                     addJetCorrFactors=cms.bool(False))

    patSoftDropJetsName = 'pat' + softDropJetsName
    setattr(process, patSoftDropJetsName, patSoftDropJets)

    selectedSoftDropJets = selectedPatJets.clone(
        src=cms.InputTag(patSoftDropJetsName))

    selectedSoftDropJetsName = 'selectedPat' + softDropJetsName
    setattr(process, selectedSoftDropJetsName, selectedSoftDropJets)

    patSoftDropSubjets = _patJets.clone(
        jetSource=cms.InputTag(softDropJetsName, 'SubJets'),
        getJetMCFlavour=cms.bool(False),
        addGenJetMatch=cms.bool(False),
        addGenPartonMatch=cms.bool(False),
        addJetFlavourInfo=cms.bool(False),
        addAssociatedTracks=cms.bool(False),
        addJetCharge=cms.bool(False),
        addJetCorrFactors=cms.bool(False),
        addBTagInfo=cms.bool(True),
        addDiscriminators=cms.bool(True),
        addTagInfos=cms.bool(False),
        discriminatorSources=cms.VInputTag(cms.InputTag(subjetBjetTagsName)))

    patSoftDropSubjetsName = 'pat' + softDropJetsName + 'Subjets'
    setattr(process, patSoftDropSubjetsName, patSoftDropSubjets)

    selectedSoftDropSubjets = selectedPatJets.clone(
        src=cms.InputTag(patSoftDropSubjetsName))

    selectedSoftDropSubjetsName = 'selectedPat' + softDropSubjetsName
    setattr(process, selectedSoftDropSubjetsName, selectedSoftDropSubjets)

    pat = cms.Sequence(patJets + selectedJets + patSoftDropJets +
                       selectedSoftDropJets + patSoftDropSubjets +
                       selectedSoftDropSubjets)

    ###############################################
    ##     Pack subjets back into fat jets       ##
    ###############################################

    packedSoftDropJets = cms.EDProducer(
        'BoostedJetMerger',
        jetSrc=cms.InputTag(selectedSoftDropJetsName),
        subjetSrc=cms.InputTag(selectedSoftDropSubjetsName))

    packedSoftDropJetsName = 'packed' + softDropJetsName
    setattr(process, packedSoftDropJetsName, packedSoftDropJets)

    packedPatJets = cms.EDProducer('JetSubstructurePacker',
                                   jetSrc=cms.InputTag(selectedJetsName),
                                   distMax=cms.double(jetRadius),
                                   algoTags=cms.VInputTag(
                                       cms.InputTag(packedSoftDropJetsName)),
                                   algoLabels=cms.vstring('SoftDrop'),
                                   fixDaughters=cms.bool(False))

    packedPatJetsName = 'packed' + jetsName
    setattr(process, packedPatJetsName, packedPatJets)

    packing = cms.Sequence(packedSoftDropJets + packedPatJets)

    ##############################
    ##     Return a sequence    ##
    ##############################

    sequence = cms.Sequence(clustering + substructure + btagging +
                            doubleBtagging + subjetBTagging + pat + packing)

    return sequence
process.out = cms.EndPath(process.output)

# TRYING TO MAKE THINGS MINIAOD COMPATIBLE, FROM THE START, TO THE END, 1 BY 1
from RecoJets.JetProducers.ak4PFJets_cfi import ak4PFJets

process.ak4PFJetsPAT = ak4PFJets.clone(src=cms.InputTag("packedPFCandidates"))
from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cfi import _patJets

process.patAK4PFJets = _patJets.clone(
    jetSource=cms.InputTag("ak4PFJetsPAT"),
    addJetCorrFactors=cms.bool(False),
    jetCorrFactorsSource=cms.VInputTag(),
    addBTagInfo=cms.bool(False),
    addDiscriminators=cms.bool(False),
    discriminatorSources=cms.VInputTag(),
    addAssociatedTracks=cms.bool(False),
    addJetCharge=cms.bool(False),
    addGenPartonMatch=cms.bool(False),
    embedGenPartonMatch=cms.bool(False),
    addGenJetMatch=cms.bool(False),
    getJetMCFlavour=cms.bool(False),
    addJetFlavourInfo=cms.bool(False),
)

# so this adds all tracks to jet in some deltaR region. we don't have tracks so don't need it :D
# process.ak4PFJetTracksAssociatorAtVertex.jets = cms.InputTag(jetCollection)

# Remove ak4PFJetTracksAssociatorAtVertex from recoTauCommonSequence
# Remove pfRecoTauTagInfoProducer from recoTauCommonSequence since it uses the jet-track association
# HOWEVER, may use https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookMiniAOD2017#Isolated_Tracks
# probably needs recovery of the two modules above