Skip to content

Commit

Permalink
Merge pull request #18321 from drkovalskyi/muon-arbitration
Browse files Browse the repository at this point in the history
Muon arbitration
  • Loading branch information
davidlange6 authored Apr 28, 2017
2 parents 3d2e48b + aa23e33 commit 366951b
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 45 deletions.
43 changes: 41 additions & 2 deletions RecoMuon/MuonIdentification/plugins/MuonIdProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ muIsoExtractorCalo_(0),muIsoExtractorTrack_(0),muIsoExtractorJet_(0)
writeIsoDeposits_ = iConfig.getParameter<bool>("writeIsoDeposits");
fillGlobalTrackQuality_ = iConfig.getParameter<bool>("fillGlobalTrackQuality");
fillGlobalTrackRefits_ = iConfig.getParameter<bool>("fillGlobalTrackRefits");
arbitrateTrackerMuons_ = iConfig.getParameter<bool>("arbitrateTrackerMuons");
//SK: (maybe temporary) run it only if the global is also run
fillTrackerKink_ = false;
if (fillGlobalTrackQuality_) fillTrackerKink_ = iConfig.getParameter<bool>("fillTrackerKink");
Expand Down Expand Up @@ -586,8 +587,7 @@ void MuonIdProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
} else {
LogTrace("MuonIdentification") << "track failed minimal number of muon matches requirement";
const reco::CaloMuon& caloMuon = makeCaloMuon(trackerMuon);
if ( ! caloMuon.isCaloCompatibilityValid() || caloMuon.caloCompatibility() < caloCut_ || caloMuon.p() < minPCaloMuon_) continue;
caloMuons->push_back( caloMuon );
if (isGoodCaloMuon(caloMuon)) caloMuons->push_back( caloMuon );
}
}
}
Expand Down Expand Up @@ -637,6 +637,11 @@ void MuonIdProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
}
}

if (arbitrateTrackerMuons_){
fillArbitrationInfo( outputMuons.get() );
arbitrateMuons( outputMuons.get(), caloMuons.get() );
}

LogTrace("MuonIdentification") << "Dress up muons if it's necessary";

const int nMuons=outputMuons->size();
Expand Down Expand Up @@ -756,6 +761,12 @@ bool MuonIdProducer::isGoodTrackerMuon( const reco::Muon& muon )
return ( muon.numberOfMatches( reco::Muon::NoArbitration ) >= minNumberOfMatches_ );
}

bool MuonIdProducer::isGoodCaloMuon( const reco::CaloMuon& caloMuon )
{
if ( ! caloMuon.isCaloCompatibilityValid() || caloMuon.caloCompatibility() < caloCut_ || caloMuon.p() < minPCaloMuon_) return false;
return true;
}

bool MuonIdProducer::isGoodRPCMuon( const reco::Muon& muon )
{
if(muon.track()->pt() < minPt_ || muon.track()->p() < minP_) return false;
Expand Down Expand Up @@ -972,6 +983,32 @@ void MuonIdProducer::fillMuonId(edm::Event& iEvent, const edm::EventSetup& iSetu
// fillTime( iEvent, iSetup, aMuon );
}

void MuonIdProducer::arbitrateMuons( reco::MuonCollection* muons, reco::CaloMuonCollection* caloMuons )
{
reco::Muon::ArbitrationType arbitration = reco::Muon::SegmentAndTrackArbitration;
// arbitrate TrackerMuons
// if a muon was exclusively TrackerMuon check if it can be a calo muon
for (reco::MuonCollection::iterator muon=muons->begin(); muon!=muons->end();){
if (muon->isTrackerMuon()){
if (muon->numberOfMatches(arbitration)<minNumberOfMatches_){
// TrackerMuon failed arbitration
// If not any other base type - erase the element
// (PFMuon is not a base type)
unsigned int mask = reco::Muon::TrackerMuon|reco::Muon::PFMuon;
if ((muon->type() & (~mask))==0){
const reco::CaloMuon& caloMuon = makeCaloMuon(*muon);
if (isGoodCaloMuon(caloMuon)) caloMuons->push_back( caloMuon );
muon = muons->erase(muon);
continue;
} else {
muon->setType(muon->type()&(~reco::Muon::TrackerMuon));
}
}
}
muon++;
}
}

void MuonIdProducer::fillArbitrationInfo( reco::MuonCollection* pOutputMuons, unsigned int muonType )
{
//
Expand Down Expand Up @@ -1279,6 +1316,8 @@ void MuonIdProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptio
edm::ParameterSetDescription desc;
desc.setAllowAnything();

desc.add<bool>("arbitrateTrackerMuons",false);

edm::ParameterSetDescription descTrkAsoPar;
descTrkAsoPar.add<edm::InputTag>("GEMSegmentCollectionLabel",edm::InputTag("gemSegments"));
descTrkAsoPar.add<edm::InputTag>("ME0SegmentCollectionLabel",edm::InputTag("me0Segments"));
Expand Down
4 changes: 4 additions & 0 deletions RecoMuon/MuonIdentification/plugins/MuonIdProducer.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ class MuonIdProducer : public edm::stream::EDProducer<> {
void fillMuonId( edm::Event&, const edm::EventSetup&, reco::Muon&,
TrackDetectorAssociator::Direction direction = TrackDetectorAssociator::InsideOut );
void fillArbitrationInfo( reco::MuonCollection*, unsigned int muonType = reco::Muon::TrackerMuon );
void arbitrateMuons( reco::MuonCollection*, reco::CaloMuonCollection* );
void fillMuonIsolation( edm::Event&, const edm::EventSetup&, reco::Muon& aMuon,
reco::IsoDeposit& trackDep, reco::IsoDeposit& ecalDep, reco::IsoDeposit& hcalDep, reco::IsoDeposit& hoDep,
reco::IsoDeposit& jetDep);
Expand All @@ -105,6 +106,7 @@ class MuonIdProducer : public edm::stream::EDProducer<> {
bool isGoodTrack( const reco::Track& track );

bool isGoodTrackerMuon( const reco::Muon& muon );
bool isGoodCaloMuon( const reco::CaloMuon& muon );
bool isGoodRPCMuon( const reco::Muon& muon );
bool isGoodGEMMuon( const reco::Muon& muon );
bool isGoodME0Muon( const reco::Muon& muon );
Expand Down Expand Up @@ -198,6 +200,8 @@ class MuonIdProducer : public edm::stream::EDProducer<> {
double ptThresholdToFillCandidateP4WithGlobalFit_;
double sigmaThresholdToFillCandidateP4WithGlobalFit_;

bool arbitrateTrackerMuons_;

bool debugWithTruthMatching_;

edm::Handle<reco::TrackCollection> innerTrackCollectionHandle_;
Expand Down
2 changes: 1 addition & 1 deletion RecoMuon/MuonIdentification/python/links_cfi.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import FWCore.ParameterSet.Config as cms
globalMuonLinks = cms.EDProducer("MuonLinksProducer",
inputCollection = cms.InputTag("muons")
inputCollection = cms.InputTag("muons","","@skipCurrentProcess")
)

7 changes: 5 additions & 2 deletions RecoMuon/MuonIdentification/python/muons1stStep_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

fillEnergy = cms.bool(True),
# OR
maxAbsPullX = cms.double(4.0),
maxAbsPullX = cms.double(3.0),
maxAbsEta = cms.double(3.0),

# Selection parameters
Expand Down Expand Up @@ -77,7 +77,10 @@
OverlapDTheta = cms.double(0.02), # 1.14 degrees
ClusterDPhi = cms.double(0.6), # 34 degrees
ClusterDTheta = cms.double(0.02) # 1.14
)
),

# tracker muon arbitration
arbitrateTrackerMuons = cms.bool(True)
)

from Configuration.Eras.Modifier_run3_GEM_cff import run3_GEM
Expand Down
142 changes: 102 additions & 40 deletions RecoMuon/MuonIdentification/test/TestMuonIdProducer_cfg.py
Original file line number Diff line number Diff line change
@@ -1,53 +1,89 @@
import FWCore.ParameterSet.Config as cms
process = cms.Process("TEST")

process.load("Configuration.StandardSequences.MagneticField_cff")
process.load("Configuration.StandardSequences.Geometry_cff")
process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff")
process.load("Configuration.StandardSequences.Reconstruction_cff")
process.GlobalTag.globaltag = 'MC_36Y_V3::All'
# process.load("Configuration.StandardSequences.MagneticField_cff")
# process.load("Configuration.StandardSequences.Geometry_cff")
# process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff")
# process.load("Configuration.StandardSequences.Reconstruction_cff")

# import of standard configurations
process.load('Configuration.StandardSequences.Services_cff')
process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi')
process.load('FWCore.MessageService.MessageLogger_cfi')
process.load('Configuration.EventContent.EventContent_cff')
process.load('SimGeneral.MixingModule.mixNoPU_cfi')
process.load('Configuration.StandardSequences.GeometryRecoDB_cff')
process.load('Configuration.StandardSequences.MagneticField_cff')
process.load('Configuration.StandardSequences.Reconstruction_cff')
process.load('Configuration.StandardSequences.EndOfProcess_cff')
process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff')

from Configuration.AlCa.GlobalTag import GlobalTag
process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2017_realistic', '')
# process.GlobalTag.globaltag = 'MC_36Y_V3::All'

process.load("RecoMuon.MuonIdentification.links_cfi")
process.maxEvents = cms.untracked.PSet(
input = cms.untracked.int32(-1)
)
process.MessageLogger = cms.Service("MessageLogger",
destinations = cms.untracked.vstring('cout'),
# categories = cms.untracked.vstring('MuonIdentification','TrackAssociator'),
cout = cms.untracked.PSet(
threshold = cms.untracked.string('INFO'),
# threshold = cms.untracked.string('DEBUG'),
# noTimeStamps = cms.untracked.bool(True),
# noLineBreaks = cms.untracked.bool(True)
DEBUG = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
#MuonIdentification = cms.untracked.PSet(
# limit = cms.untracked.int32(-1)
#),
#TrackAssociator = cms.untracked.PSet(
# limit = cms.untracked.int32(-1)
#),
),
debugModules = cms.untracked.vstring("muons")
)

import FWCore.Framework.test.cmsExceptionsFatalOption_cff
options = cms.untracked.PSet(
Rethrow = FWCore.Framework.test.cmsExceptionsFatalOption_cff.Rethrow
# process.MessageLogger = cms.Service("MessageLogger",
# destinations = cms.untracked.vstring('cout'),
# categories = cms.untracked.vstring('MuonIdentification','TrackAssociator'),
# cout = cms.untracked.PSet(
# threshold = cms.untracked.string('INFO'),
# # threshold = cms.untracked.string('DEBUG'),
# # noTimeStamps = cms.untracked.bool(True),
# # noLineBreaks = cms.untracked.bool(True)
# DEBUG = cms.untracked.PSet(
# limit = cms.untracked.int32(0)
# ),
# #MuonIdentification = cms.untracked.PSet(
# # limit = cms.untracked.int32(-1)
# #),
# #TrackAssociator = cms.untracked.PSet(
# # limit = cms.untracked.int32(-1)
# #),
# ),
# debugModules = cms.untracked.vstring("muons1stStes")
# )

# import FWCore.Framework.test.cmsExceptionsFatalOption_cff
# options = cms.untracked.PSet(
# Rethrow = FWCore.Framework.test.cmsExceptionsFatalOption_cff.Rethrow
# )
process.options = cms.untracked.PSet(
)

process.source = cms.Source("PoolSource",
fileNames = cms.untracked.vstring(
#'/store/relval/CMSSW_3_2_5/RelValSingleMuPt10/GEN-SIM-RECO/MC_31X_V5-v1/0011/E014EF8B-588E-DE11-8D06-001617E30E28.root'
'file:/tmp/jribnik/12D588B7-8D37-DF11-83E5-0030487A1884.root'
)
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/205066EB-531A-E711-A026-0025905B8560.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/2CBB627A-5B1A-E711-8044-0CC47A78A496.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/32AEBC8E-581A-E711-8D0D-0CC47A4D76A2.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/3E4ECA76-571A-E711-B439-0CC47A7452D0.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/56CEFCBB-4C1A-E711-A33D-0CC47A4C8ED8.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/760926DD-5B1A-E711-BD0F-0025905B85FE.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/78958AA6-771A-E711-A294-0CC47A4D75F6.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/88A132C9-541A-E711-B0DE-0CC47A4C8EE8.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/944E62B3-771A-E711-982C-0025905B8610.root',
# '/store/relval/CMSSW_9_1_0_pre2/RelValTTbar_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20_PU50-v1/00000/F6624C6E-4D1A-E711-BA71-0CC47A4D7690.root'
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/18F7C873-5C19-E711-8B21-0CC47A4D7670.root',
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/1A8BB1E0-9D19-E711-9585-0CC47A7C34A0.root',
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/5694119A-5819-E711-914D-0CC47A4D7616.root',
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/68BC6F0D-6B19-E711-B7D5-0CC47A4D768C.root',
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/788BE9DD-6419-E711-B1FB-0CC47A74527A.root',
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/86DE5D32-9F19-E711-8456-0CC47A4D7692.root',
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/DCE77919-5119-E711-8F4F-0CC47A78A468.root',
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/F2FB6238-9C19-E711-8C04-0CC47A7C34A0.root',
'/store/relval/CMSSW_9_1_0_pre2/RelValZMM_13/GEN-SIM-RECO/PU25ns_90X_upgrade2017_realistic_v20-v1/00000/F49D1692-6819-E711-A05B-0CC47A4D7668.root',
),
)

process.out = cms.OutputModule("PoolOutputModule",
fileName = cms.untracked.string('mc-muonid3.root'),
fileName = cms.untracked.string('/eos/cms/store/user/dmytro/tmp/RelValZMM_13+CMSSW_9_1_0_pre2-PU25ns_90X_upgrade2017_realistic_v20-v1+muonid_3sigma_arbitrated.root'),
outputCommands = cms.untracked.vstring("drop *",
"keep *_genParticleCandidates_*_*",
"keep recoGenParticles_genParticles_*_*",
"keep recoTracks_*_*_*",
"keep recoTrackExtras_*_*_*",
"keep recoMuons_*_*_*",
Expand All @@ -57,17 +93,43 @@
"keep *_*_*_TEST")
)

process.p = cms.Path(process.globalMuonLinks*process.muons)
# Setup link re-builder
process.muons1stStep.inputCollectionLabels = cms.VInputTag(cms.InputTag("generalTracks"),
cms.InputTag("globalMuonLinks"),
cms.InputTag("standAloneMuons","UpdatedAtVtx"),
cms.InputTag("tevMuons","firstHit"),cms.InputTag("tevMuons","picky"),cms.InputTag("tevMuons","dyt"))
process.muons1stStep.inputCollectionTypes = cms.vstring('inner tracks',
'links',
'outer tracks',
'tev firstHit',
'tev picky',
'tev dyt')

process.muonid_study = cms.Path(process.globalMuonLinks* process.muonIdProducerSequence)

process.muons.inputCollectionLabels = cms.VInputTag(cms.InputTag("generalTracks"),
cms.InputTag("globalMuonLinks"),
cms.InputTag("standAloneMuons","UpdatedAtVtx"))
process.muons.inputCollectionTypes = cms.vstring('inner tracks',
'links',
'outer tracks')

process.muons.fillIsolation = False
# process.muons.fillIsolation = False
# process.muons.minPt = 0.
# process.muons.minP = 0.

process.endjob_step = cms.EndPath(process.endOfProcess)
process.e = cms.EndPath(process.out)

# Schedule definition
process.schedule = cms.Schedule(process.muonid_study,process.endjob_step,process.e)

#Setup FWK for multithreaded
process.options.numberOfThreads=cms.untracked.uint32(8)
process.options.numberOfStreams=cms.untracked.uint32(0)

#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 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

0 comments on commit 366951b

Please sign in to comment.