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'))
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
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))
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')
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
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)
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