Skip to content

Commit

Permalink
updated MuonMCClassifier, added association of Global_or_Tracker muons
Browse files Browse the repository at this point in the history
  • Loading branch information
abbiendi committed Aug 3, 2017
1 parent 6d9aa3c commit 0ef2011
Show file tree
Hide file tree
Showing 10 changed files with 503 additions and 106 deletions.
217 changes: 157 additions & 60 deletions MuonAnalysis/MuonAssociators/plugins/MuonMCClassifier.cc

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
### Add MC classification by hits
### Note: this cfi needs TrackingParticle collection from the Event

from SimMuon.MCTruth.muonAssociatorByHitsNoSimHitsHelper_cfi import *

classByHitsTM = cms.EDProducer("MuonMCClassifier",
muons = cms.InputTag("muons"),
muonPreselection = cms.string("muonID('TrackerMuonArbitrated')"), # definition of "duplicates" depends on the preselection
trackType = cms.string("segments"), # 'inner','outer','global','segments','glb_or_trk'
trackingParticles = cms.InputTag("mix","MergedTrackTruth"), # default TrackingParticle collection (should exist in the Event)
associatorLabel = cms.InputTag("muonAssociatorByHitsNoSimHitsHelper"),
decayRho = cms.double(200), # to classify differently decay muons included in ppMuX
decayAbsZ = cms.double(400), # and decay muons that could not be in ppMuX
linkToGenParticles = cms.bool(True), # produce also a collection of GenParticles for secondary muons
genParticles = cms.InputTag("genParticles"), # and associations to primary and secondaries
)
classByHitsTMLSAT = classByHitsTM.clone(
muonPreselection = cms.string("muonID('TMLastStationAngTight')")
)
classByHitsGlb = classByHitsTM.clone(
muonPreselection = cms.string("isGlobalMuon"),
trackType = "global"
)
classByHitsSta = classByHitsTM.clone(
muonPreselection = cms.string("isStandAloneMuon"),
trackType = "outer"
)
classByHitsGlbOrTrk = classByHitsTM.clone(
muonPreselection = cms.string("isGlobalMuon || muonID('TrackerMuonArbitrated')"),
trackType = "glb_or_trk"
)


muonClassificationByHits = cms.Sequence(
muonAssociatorByHitsNoSimHitsHelper +
(
# classByHitsTM +
# classByHitsTMLSAT +
# classByHitsGlb +
# classByHitsSta +
classByHitsGlbOrTrk
)
)
#def addUserData(patMuonProducer,labels=['classByHitsTM', 'classByHitsSta', 'classByHitsGlbOrTrk'], extraInfo = False):
def addUserData(patMuonProducer,labels=['classByHitsGlbOrTrk'], extraInfo = False):
for label in labels:
patMuonProducer.userData.userInts.src.append( cms.InputTag(label) )
patMuonProducer.userData.userInts.src.append( cms.InputTag(label, "ext") )
if extraInfo:
for ints in ("flav", "hitsPdgId", "G4processType", "momPdgId", "gmomPdgId", "momFlav", "gmomFlav", "hmomFlav", "tpId", "tpBx", "tpEv", "momStatus"):
patMuonProducer.userData.userInts.src.append(cms.InputTag(label, ints))
for ins in ("signp", "pt", "eta", "phi", "prodRho", "prodZ", "tpAssoQuality", "momRho", "momZ"):

patMuonProducer.userData.userFloats.src.append(cms.InputTag(label, ins))

def addGenParticleRef(patMuonProducer, label = 'classByHitsGlbOrTrk'):
patMuonProducer.addGenMatch = True
patMuonProducer.genParticleMatch = cms.VInputTag(cms.InputTag(label, "toPrimaries"), cms.InputTag(label, "toSecondaries"))

46 changes: 26 additions & 20 deletions MuonAnalysis/MuonAssociators/python/muonClassificationByHits_cfi.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
### Add MC classification by hits
# Requires:
# SimGeneral/TrackingAnalysis V04-01-05 (35X+)
# SimTracker/TrackAssociation V01-08-17 (35X+)
# SimMuon/MCTruth V02-05-00-03 (35X) or V02-06-00+ (37X+)

from SimGeneral.MixingModule.mixNoPU_cfi import *
from SimGeneral.MixingModule.mixNoPU_cfi import *

trackingParticlesNoSimHits = mix.clone(
digitizers = cms.PSet(
mergedtruth = mix.digitizers.mergedtruth.clone(
mergedtruth = theDigitizersValid.mergedtruth.clone(
simHitCollections = cms.PSet(
pixel = cms.VInputTag(),
tracker = cms.VInputTag(),
Expand All @@ -21,16 +18,16 @@
mixTracks = mix.mixObjects.mixTracks.clone(),
),
)

from SimMuon.MCTruth.muonAssociatorByHitsNoSimHitsHelper_cfi import *

classByHitsTM = cms.EDProducer("MuonMCClassifier",
muons = cms.InputTag("muons"),
muonPreselection = cms.string("isTrackerMuon"), #
#muonPreselection = cms.string("muonID('TrackerMuonArbitrated')"), # You might want this
trackType = cms.string("segments"), # or 'inner','outer','global'
muonPreselection = cms.string("muonID('TrackerMuonArbitrated')"), # definition of "duplicates" depends on the preselection
trackType = cms.string("segments"), # 'inner','outer','global','segments','glb_or_trk'
trackingParticles = cms.InputTag("trackingParticlesNoSimHits","MergedTrackTruth"),
associatorLabel = cms.string("muonAssociatorByHitsNoSimHitsHelper"),
decayRho = cms.double(200), # to classifiy differently decay muons included in ppMuX
associatorLabel = cms.InputTag("muonAssociatorByHitsNoSimHitsHelper"),
decayRho = cms.double(200), # to classify differently decay muons included in ppMuX
decayAbsZ = cms.double(400), # and decay muons that could not be in ppMuX
linkToGenParticles = cms.bool(True), # produce also a collection of GenParticles for secondary muons
genParticles = cms.InputTag("genParticles"), # and associations to primary and secondaries
Expand All @@ -46,27 +43,36 @@
muonPreselection = cms.string("isStandAloneMuon"),
trackType = "outer"
)
classByHitsGlbOrTrk = classByHitsTM.clone(
muonPreselection = cms.string("isGlobalMuon || muonID('TrackerMuonArbitrated')"),
trackType = "glb_or_trk"
)


muonClassificationByHits = cms.Sequence(
#mix +
trackingParticlesNoSimHits +
muonAssociatorByHitsNoSimHitsHelper +
( classByHitsTM +
classByHitsTMLSAT +
classByHitsGlb +
classByHitsSta )
(
# classByHitsTM +
# classByHitsTMLSAT +
# classByHitsGlb +
# classByHitsSta +
classByHitsGlbOrTrk
)
)
def addUserData(patMuonProducer,labels=['classByHitsGlb', 'classByHitsTM', 'classByHitsTMLSAT', 'classByHitsSta'], extraInfo = False):
#def addUserData(patMuonProducer,labels=['classByHitsTM', 'classByHitsSta', 'classByHitsGlbOrTrk'], extraInfo = False):
def addUserData(patMuonProducer,labels=['classByHitsGlbOrTrk'], extraInfo = False):
for label in labels:
patMuonProducer.userData.userInts.src.append( cms.InputTag(label) )
patMuonProducer.userData.userInts.src.append( cms.InputTag(label, "ext") )
if extraInfo:
for ints in ("flav", "hitsPdgId", "momPdgId", "gmomPdgId", "momFlav", "gmomFlav", "hmomFlav", "tpId", "momStatus"):
for ints in ("flav", "hitsPdgId", "G4processType", "momPdgId", "gmomPdgId", "momFlav", "gmomFlav", "hmomFlav", "tpId", "tpBx", "tpEv", "momStatus"):
patMuonProducer.userData.userInts.src.append(cms.InputTag(label, ints))
for ins in ("prodRho", "prodZ", "tpAssoQuality", "momRho", "momZ"):
for ins in ("signp", "pt", "eta", "phi", "prodRho", "prodZ", "tpAssoQuality", "momRho", "momZ"):

patMuonProducer.userData.userFloats.src.append(cms.InputTag(label, ins))
def addGenParticleRef(patMuonProducer, label = 'classByHitsGlb'):

def addGenParticleRef(patMuonProducer, label = 'classByHitsGlbOrTrk'):
patMuonProducer.addGenMatch = True
patMuonProducer.genParticleMatch = cms.VInputTag(cms.InputTag(label, "toPrimaries"), cms.InputTag(label, "toSecondaries"))

Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
import FWCore.ParameterSet.Config as cms

from Configuration.StandardSequences.Eras import eras

process = cms.Process('MuonClassif',eras.Phase2)

process.load('Configuration.StandardSequences.Services_cff')
process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi')
process.load('SimGeneral.MixingModule.mix_POISSON_average_cfi')

process.load('FWCore.MessageService.MessageLogger_cfi')
process.options = cms.untracked.PSet( wantSummary = cms.untracked.bool(True) )
process.MessageLogger.cerr.FwkReport.reportEvery = 1000

process.source = cms.Source("PoolSource",
fileNames = cms.untracked.vstring(
'/store/relval/CMSSW_9_1_1/RelValZMM_14/GEN-SIM-RECO/PU25ns_91X_upgrade2023_realistic_v1_D17PU200-v1/10000/003FC7CB-EB3F-E711-92D1-0025905A6076.root'
),
secondaryFileNames = cms.untracked.vstring(
)
)

process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(1) )

process.load('Configuration.Geometry.GeometryExtended2023D17Reco_cff')
process.load('Configuration.StandardSequences.MagneticField_cff')
process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff')
process.load("Configuration.StandardSequences.Reconstruction_cff")

from Configuration.AlCa.GlobalTag import GlobalTag
process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic', '')

## ==== PAT used to parse the muon selection
process.load("MuonAnalysis.MuonAssociators.patMuonsWithTrigger_cff")
from MuonAnalysis.MuonAssociators.patMuonsWithTrigger_cff import *

## ==== Classification by Hits
process.load("MuonAnalysis.MuonAssociators.muonClassificationByHitsTP_cfi")
#
from MuonAnalysis.MuonAssociators.muonClassificationByHitsTP_cfi import addUserData as addClassByHits
addClassByHits(process.patMuonsWithoutTrigger, extraInfo=True)

# Output definition
process.MYoutput = cms.OutputModule("PoolOutputModule",
eventAutoFlushCompressedSize = cms.untracked.int32(5242880),
fileName = cms.untracked.string('ZMMpu25ns-UPG2023_test.root'),
splitLevel = cms.untracked.int32(0)
)

process.MuonClassifier = cms.Path(
process.muonClassificationByHits
)

process.MYoutput_step = cms.EndPath(process.MYoutput)

process.schedule = cms.Schedule(
process.MuonClassifier,
process.MYoutput_step
)

# customisation of the process.

# Automatic addition of the customisation function from SimGeneral.MixingModule.fullMixCustomize_cff
from SimGeneral.MixingModule.fullMixCustomize_cff import setCrossingFrameOn

#call to customisation function setCrossingFrameOn imported from SimGeneral.MixingModule.fullMixCustomize_cff
process = setCrossingFrameOn(process)

# End of customisation functions
#do not add changes to your config after this point (unless you know what you are doing)
from FWCore.ParameterSet.Utilities import convertToUnscheduled
process=convertToUnscheduled(process)

# customisation of the process.

# Customisation from command line

# Add early deletion of temporary data products to reduce peak memory need
from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete
process = customiseEarlyDelete(process)
# End adding early deletion

######
process.MessageLogger.categories = cms.untracked.vstring('MuonToTrackingParticleAssociatorEDProducer',
'MuonToTrackingParticleAssociatorByHits','MuonAssociatorByHitsHelper','MuonToTrackingParticleAssociatorByHitsImpl',
'TrackerMuonHitExtractor','MuonMCClassifier',
'FwkJob','FwkReport','FwkSummary','Root_NoDictionary')

process.MessageLogger.cerr = cms.untracked.PSet(
noTimeStamps = cms.untracked.bool(True),

threshold = cms.untracked.string('WARNING'),

MuonToTrackingParticleAssociatorEDProducer = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
MuonToTrackingParticleAssociatorByHits = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
MuonToTrackingParticleAssociatorByHitsImpl = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
MuonAssociatorByHitsHelper = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
TrackerMuonHitExtractor = cms.untracked.PSet(
limit = cms.untracked.int32(0)
)
)

process.MessageLogger.cout = cms.untracked.PSet(
noTimeStamps = cms.untracked.bool(True),
threshold = cms.untracked.string('INFO'),

default = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
MuonToTrackingParticleAssociatorEDProducer = cms.untracked.PSet(
limit = cms.untracked.int32(10000000)
),
MuonToTrackingParticleAssociatorByHits = cms.untracked.PSet(
limit = cms.untracked.int32(10000000)
),
MuonToTrackingParticleAssociatorByHitsImpl = cms.untracked.PSet(
limit = cms.untracked.int32(10000000)
),
MuonAssociatorByHitsHelper = cms.untracked.PSet(
limit = cms.untracked.int32(10000000)
),
TrackerMuonHitExtractor = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
MuonMCClassifier = cms.untracked.PSet(
limit = cms.untracked.int32(10000000)
),
FwkReport = cms.untracked.PSet(
reportEvery = cms.untracked.int32(1),
limit = cms.untracked.int32(10000000)
),
FwkSummary = cms.untracked.PSet(
reportEvery = cms.untracked.int32(1),
limit = cms.untracked.int32(10000000)
),
FwkJob = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
Root_NoDictionary = cms.untracked.PSet(
limit = cms.untracked.int32(0)
)
)
2 changes: 1 addition & 1 deletion SimDataFormats/Associations/interface/MuonTrackType.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include "DataFormats/MuonReco/interface/Muon.h"

namespace reco {
enum MuonTrackType { InnerTk, OuterTk, GlobalTk, Segments };
enum MuonTrackType { InnerTk, OuterTk, GlobalTk, Segments, GlbOrTrk };

struct RefToBaseSort {
template<typename T> bool operator()(const edm::RefToBase<T> &r1, const edm::RefToBase<T> &r2) const {
Expand Down

0 comments on commit 0ef2011

Please sign in to comment.