Skip to content

Commit

Permalink
Merge pull request #29529 from sscruz/muonPOG_updateLostTracks_bp
Browse files Browse the repository at this point in the history
Update of the lostTrack collection for MUO (back-port of #29389)
  • Loading branch information
cmsbuild authored Apr 23, 2020
2 parents 2f6bdc9 + fe11dae commit 1c34137
Show file tree
Hide file tree
Showing 4 changed files with 180 additions and 10 deletions.
38 changes: 29 additions & 9 deletions PhysicsTools/PatAlgos/plugins/PATLostTracks.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "DataFormats/PatCandidates/interface/Jet.h"
#include "DataFormats/Common/interface/Association.h"
#include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
#include "CommonTools/Utils/interface/StringCutObjectSelector.h"

namespace {
bool passesQuality(const reco::Track& trk,const std::vector<reco::TrackBase::TrackQuality>& allowedQuals){
Expand Down Expand Up @@ -57,7 +58,8 @@ namespace pat {
const reco::VertexRef& pvSlimmed,
const reco::VertexRefProd& pvSlimmedColl,
const reco::Vertex& pvOrig,
const TrkStatus trkStatus)const;
const TrkStatus trkStatus,
edm::Handle<reco::MuonCollection> muons) const;

private:
const edm::EDGetTokenT<reco::PFCandidateCollection> cands_;
Expand All @@ -75,6 +77,9 @@ namespace pat {
const int covarianceVersion_;
const int covarianceSchema_;
std::vector<reco::TrackBase::TrackQuality> qualsToAutoAccept_;
const edm::EDGetTokenT<reco::MuonCollection> muons_;
StringCutObjectSelector<reco::Track, false> passThroughCut_;
bool allowMuonId_;
};
}

Expand All @@ -92,9 +97,10 @@ pat::PATLostTracks::PATLostTracks(const edm::ParameterSet& iConfig) :
minPixelHits_(iConfig.getParameter<uint32_t>("minPixelHits")) ,
minPtToStoreProps_(iConfig.getParameter<double>("minPtToStoreProps")),
covarianceVersion_(iConfig.getParameter<int >("covarianceVersion")),
covarianceSchema_(iConfig.getParameter<int >("covarianceSchema"))

{
covarianceSchema_(iConfig.getParameter<int >("covarianceSchema")),
muons_(consumes<reco::MuonCollection>(iConfig.getParameter<edm::InputTag>("muons"))),
passThroughCut_(iConfig.getParameter<std::string>("passThroughCut")),
allowMuonId_(iConfig.getParameter<bool>("allowMuonId")){
std::vector<std::string> trkQuals(iConfig.getParameter<std::vector<std::string> >("qualsToAutoAccept"));
std::transform(trkQuals.begin(),trkQuals.end(),std::back_inserter(qualsToAutoAccept_),reco::TrackBase::qualityByName);

Expand Down Expand Up @@ -126,6 +132,9 @@ void pat::PATLostTracks::produce(edm::StreamID, edm::Event& iEvent, const edm::E
edm::Handle<reco::VertexCollection> vertices;
iEvent.getByToken( vertices_, vertices );

edm::Handle<reco::MuonCollection> muons;
iEvent.getByToken(muons_, muons);

edm::Handle<reco::VertexCompositeCandidateCollection> kshorts;
iEvent.getByToken( kshorts_, kshorts );
edm::Handle<reco::VertexCompositeCandidateCollection> lambdas;
Expand Down Expand Up @@ -189,15 +198,15 @@ void pat::PATLostTracks::produce(edm::StreamID, edm::Event& iEvent, const edm::E
(trkStatus[trkIndx]==TrkStatus::NOTUSED && passTrkCuts(*trk)) ) {

outPtrTrks->emplace_back(*trk);
addPackedCandidate(*outPtrTrksAsCands,trk,pv,pvRefProd,pvOrig,trkStatus[trkIndx]);
addPackedCandidate(*outPtrTrksAsCands, trk, pv, pvRefProd, pvOrig, trkStatus[trkIndx], muons);

//for creating the reco::Track -> pat::PackedCandidate map
//not done for the lostTrack:eleTracks collection
mapping[trkIndx]=lostTrkIndx;
lostTrkIndx++;
}else if( (trkStatus[trkIndx]==TrkStatus::PFELECTRON || trkStatus[trkIndx]==TrkStatus::PFPOSITRON )
&& passTrkCuts(*trk) ) {
addPackedCandidate(*outPtrEleTrksAsCands,trk,pv,pvRefProd,pvOrig,trkStatus[trkIndx]);
addPackedCandidate(*outPtrEleTrksAsCands, trk, pv, pvRefProd, pvOrig, trkStatus[trkIndx], muons);


}
Expand All @@ -220,22 +229,33 @@ bool pat::PATLostTracks::passTrkCuts(const reco::Track& tr)const
tr.hitPattern().numberOfValidPixelHits() >= minPixelHits_;
const bool passTrkQual = passesQuality(tr,qualsToAutoAccept_);

return passTrkHits || passTrkQual;
return passTrkHits || passTrkQual || passThroughCut_(tr) ;
}

void pat::PATLostTracks::addPackedCandidate(std::vector<pat::PackedCandidate>& cands,
const reco::TrackRef& trk,
const reco::VertexRef& pvSlimmed,
const reco::VertexRefProd& pvSlimmedColl,
const reco::Vertex& pvOrig,
const pat::PATLostTracks::TrkStatus trkStatus)const
const pat::PATLostTracks::TrkStatus trkStatus,
edm::Handle<reco::MuonCollection> muons) const
{
const float mass = 0.13957018;

int id=211*trk->charge();
if(trkStatus==TrkStatus::PFELECTRON) id=11;
else if(trkStatus==TrkStatus::PFPOSITRON) id=-11;


// assign the proper pdgId for tracks that are reconstructed as a muon
if (allowMuonId_){
for (auto& mu : *muons) {
if (reco::TrackRef(mu.innerTrack()) == trk) {
id = -13 * trk->charge();
break;
}
}
}

reco::Candidate::PolarLorentzVector p4(trk->pt(),trk->eta(),trk->phi(),mass);
cands.emplace_back(pat::PackedCandidate(p4,trk->vertex(),
trk->pt(),trk->eta(),trk->phi(),
Expand Down
134 changes: 134 additions & 0 deletions PhysicsTools/PatAlgos/plugins/PATMuonMerger.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Utilities/interface/InputTag.h"

#include "DataFormats/PatCandidates/interface/Muon.h"
#include "DataFormats/MuonReco/interface/Muon.h"
#include "DataFormats/PatCandidates/interface/PackedCandidate.h"

#include "CommonTools/Utils/interface/StringCutObjectSelector.h"
#include "DataFormats/Common/interface/getRef.h"
#include "DataFormats/Common/interface/RefToPtr.h"

#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"

namespace pat {
typedef edm::Ptr<pat::PackedCandidate> PackedCandidatePtr;
}

class PATMuonMerger : public edm::stream::EDProducer<> {
public:
explicit PATMuonMerger(const edm::ParameterSet& iConfig);
~PATMuonMerger() override {}

static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;

private:
edm::InputTag muons_;
StringCutObjectSelector<pat::Muon, false> muonsCut_;
edm::InputTag pfCandidate_;
StringCutObjectSelector<pat::PackedCandidate, false> pfCandidateCut_;
edm::InputTag lostTrack_;
StringCutObjectSelector<pat::PackedCandidate, false> lostTrackCut_;

edm::EDGetTokenT<std::vector<pat::Muon>> muonToken_;
edm::EDGetTokenT<std::vector<pat::PackedCandidate>> pfCandToken_;
edm::EDGetTokenT<std::vector<pat::PackedCandidate>> lostTrackToken_;
};

PATMuonMerger::PATMuonMerger(const edm::ParameterSet& iConfig)
: muons_(iConfig.getParameter<edm::InputTag>("muons")),
muonsCut_(iConfig.getParameter<std::string>("muonCut")),
pfCandidate_(iConfig.getParameter<edm::InputTag>("pfCandidates")),
pfCandidateCut_(iConfig.getParameter<std::string>("pfCandidatesCut")),
lostTrack_(iConfig.getParameter<edm::InputTag>("otherTracks")),
lostTrackCut_(iConfig.getParameter<std::string>("lostTrackCut")) {
muonToken_ = consumes<std::vector<pat::Muon>>(muons_);
pfCandToken_ = consumes<std::vector<pat::PackedCandidate>>(pfCandidate_);
lostTrackToken_ = consumes<std::vector<pat::PackedCandidate>>(lostTrack_);
produces<std::vector<pat::Muon>>();
}

void PATMuonMerger::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
// mergedMuons
edm::ParameterSetDescription desc;
desc.add<std::string>("muonCut", "");
desc.add<edm::InputTag>("otherTracks", edm::InputTag("lostTracks"));
desc.add<edm::InputTag>("pfCandidates", edm::InputTag("packedPFCandidates"));
desc.add<std::string>("pfCandidatesCut", "");
desc.add<edm::InputTag>("muons", edm::InputTag("slimmedMuons"));
desc.add<std::string>("lostTrackCut", "");
descriptions.add("mergedMuonsNoCuts", desc);
}

void PATMuonMerger::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
edm::Handle<std::vector<pat::Muon>> muons;
edm::Handle<std::vector<pat::PackedCandidate>> pfCands;
edm::Handle<std::vector<pat::PackedCandidate>> lostTracks;

iEvent.getByToken(muonToken_, muons);
iEvent.getByToken(pfCandToken_, pfCands);
iEvent.getByToken(lostTrackToken_, lostTracks);

auto out = std::make_unique<std::vector<pat::Muon>>();
out->reserve(muons->size() + pfCands->size() + lostTracks->size());

// copy all muons
for (auto& muon : *muons) {
if (!muonsCut_(muon))
continue;
out->push_back(muon);
}

// add other pfCandidates, removing duplicates
for (unsigned int pf = 0; pf < pfCands->size(); ++pf) {
auto pfCand = pfCands->at(pf);
if (!pfCandidateCut_(pfCand))
continue;
reco::CandidatePtr pfCandPtr(pfCands, pf);
bool isPFMuon = false;
for (auto& muon : *muons) {
for (unsigned int i = 0, n = muon.numberOfSourceCandidatePtrs(); i < n; ++i) {
reco::CandidatePtr ptr = muon.sourceCandidatePtr(i);
if (ptr.isNonnull() && ptr == pfCandPtr) {
isPFMuon = true;
break;
}
}
if (isPFMuon)
break;
}
if (isPFMuon) {
continue;
}

// now make a reco::Muon and recast to pat::Muon
double energy = sqrt(pfCand.p() * pfCand.p() + 0.011163691);
math::XYZTLorentzVector p4(pfCand.px(), pfCand.py(), pfCand.pz(), energy);
reco::Muon mu(pfCand.charge(), p4, pfCand.vertex());
pat::Muon aMu(mu);
out->push_back(aMu);
}

// adding now lost tracks, removing duplicates
for (auto& lostTrack : *lostTracks) {
if (!lostTrackCut_(lostTrack))
continue;
if (std::abs(lostTrack.pdgId()) == 13)
continue;

// now make a reco::Muon and recast to pat::Muon
double energy = sqrt(lostTrack.p() * lostTrack.p() + 0.011163691);
math::XYZTLorentzVector p4(lostTrack.px(), lostTrack.py(), lostTrack.pz(), energy);
reco::Muon mu(lostTrack.charge(), p4, lostTrack.vertex());
pat::Muon aMu(mu);
out->push_back(aMu);
}
iEvent.put(std::move(out));
}

#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(PATMuonMerger);
10 changes: 10 additions & 0 deletions PhysicsTools/PatAlgos/python/patMuonMerger_cfi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import FWCore.ParameterSet.Config as cms

mergedMuons = cms.EDProducer("PATMuonMerger",
muons = cms.InputTag("slimmedMuons"),
pfCandidates=cms.InputTag("packedPFCandidates"),
otherTracks = cms.InputTag("lostTracks"),
muonCut = cms.string("pt>15 && abs(eta)<2.4"),
pfCandidatesCut = cms.string("pt>15 && abs(eta)<2.4"),
lostTrackCut = cms.string("pt>15 && abs(eta)<2.4")
)
8 changes: 7 additions & 1 deletion PhysicsTools/PatAlgos/python/slimming/lostTracks_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,20 @@
lambdas=cms.InputTag("generalV0Candidates","Lambda"),
primaryVertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
originalVertices = cms.InputTag("offlinePrimaryVertices"),
muons = cms.InputTag("muons"),
minPt = cms.double(0.95),
minHits = cms.uint32(8),
minPixelHits = cms.uint32(1),
covarianceVersion = cms.int32(0), #so far: 0 is Phase0, 1 is Phase1
covarianceSchema = cms.int32(0), #old miniaod like
qualsToAutoAccept = cms.vstring("highPurity"),
minPtToStoreProps = cms.double(0.95)
minPtToStoreProps = cms.double(0.95),
passThroughCut = cms.string("0"),
allowMuonId = cms.bool(False)
)
from Configuration.Eras.Modifier_phase1Pixel_cff import phase1Pixel
phase1Pixel.toModify(lostTracks, covarianceVersion =1 )

from Configuration.Eras.Modifier_run2_miniAOD_devel_cff import run2_miniAOD_devel
run2_miniAOD_devel.toModify(lostTracks, passThroughCut="pt>2", allowMuonId=True)

0 comments on commit 1c34137

Please sign in to comment.