File indexing completed on 2023-09-20 02:50:18
0001
0002 #include <memory>
0003
0004
0005 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0006 #include "DataFormats/Common/interface/Handle.h"
0007 #include "DataFormats/MuonReco/interface/Muon.h"
0008 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0009 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
0010 #include "DataFormats/TrackReco/interface/HitPattern.h"
0011 #include "DataFormats/TrackReco/interface/TrackExtra.h"
0012 #include "DataFormats/TrackReco/interface/TrackExtraFwd.h"
0013 #include "FWCore/Framework/interface/Event.h"
0014 #include "FWCore/Framework/interface/Frameworkfwd.h"
0015 #include "FWCore/Framework/interface/global/EDProducer.h"
0016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0017 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0020 #include "FWCore/Utilities/interface/InputTag.h"
0021 #include "FWCore/Utilities/interface/StreamID.h"
0022 #include "RecoTracker/TrackProducer/interface/TrackProducerBase.h"
0023
0024
0025 #include "TLorentzVector.h"
0026
0027 class ZtoMMMuonTrackProducer : public edm::global::EDProducer<> {
0028 public:
0029 explicit ZtoMMMuonTrackProducer(const edm::ParameterSet&);
0030 ~ZtoMMMuonTrackProducer() override = default;
0031 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0032
0033 void produce(edm::StreamID streamID, edm::Event& iEvent, edm::EventSetup const& iSetup) const override;
0034
0035 private:
0036
0037 const edm::InputTag muonTag_;
0038 const edm::InputTag bsTag_;
0039 const edm::EDGetTokenT<reco::MuonCollection> muonToken_;
0040 const edm::EDGetTokenT<reco::BeamSpot> bsToken_;
0041
0042 const double maxEta_;
0043 const double minPt_;
0044 const double maxNormChi2_;
0045 const double maxD0_;
0046 const double maxDz_;
0047 const int minPixelHits_;
0048 const int minStripHits_;
0049 const int minChambers_;
0050 const int minMatches_;
0051 const int minMatchedStations_;
0052 const double maxIso_;
0053 const double minPtHighest_;
0054 const double minInvMass_;
0055 const double maxInvMass_;
0056 };
0057
0058 using namespace std;
0059 using namespace edm;
0060
0061 void ZtoMMMuonTrackProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0062 edm::ParameterSetDescription desc;
0063 desc.addUntracked<edm::InputTag>("muonInputTag", edm::InputTag("muons"));
0064 desc.addUntracked<edm::InputTag>("offlineBeamSpot", edm::InputTag("offlineBeamSpot"));
0065 desc.addUntracked<double>("maxEta", 2.4);
0066 desc.addUntracked<double>("minPt", 5);
0067 desc.addUntracked<double>("maxNormChi2", 1000);
0068 desc.addUntracked<double>("maxD0", 0.02);
0069 desc.addUntracked<double>("maxDz", 20.);
0070 desc.addUntracked<uint32_t>("minPixelHits", 1);
0071 desc.addUntracked<uint32_t>("minStripHits", 8);
0072 desc.addUntracked<uint32_t>("minChambers", 2);
0073 desc.addUntracked<uint32_t>("minMatches", 2);
0074 desc.addUntracked<double>("minMatchedStations", 2);
0075 desc.addUntracked<double>("maxIso", 0.3);
0076 desc.addUntracked<double>("minPtHighest", 24);
0077 desc.addUntracked<double>("minInvMass", 60);
0078 desc.addUntracked<double>("maxInvMass", 120);
0079 descriptions.addWithDefaultLabel(desc);
0080 }
0081
0082 ZtoMMMuonTrackProducer::ZtoMMMuonTrackProducer(const edm::ParameterSet& ps)
0083 : muonTag_(ps.getUntrackedParameter<edm::InputTag>("muonInputTag", edm::InputTag("muons"))),
0084 bsTag_(ps.getUntrackedParameter<edm::InputTag>("offlineBeamSpot", edm::InputTag("offlineBeamSpot"))),
0085 muonToken_(consumes<reco::MuonCollection>(muonTag_)),
0086 bsToken_(consumes<reco::BeamSpot>(bsTag_)),
0087 maxEta_(ps.getUntrackedParameter<double>("maxEta", 2.4)),
0088 minPt_(ps.getUntrackedParameter<double>("minPt", 5)),
0089 maxNormChi2_(ps.getUntrackedParameter<double>("maxNormChi2", 1000)),
0090 maxD0_(ps.getUntrackedParameter<double>("maxD0", 0.02)),
0091 maxDz_(ps.getUntrackedParameter<double>("maxDz", 20.)),
0092 minPixelHits_(ps.getUntrackedParameter<uint32_t>("minPixelHits", 1)),
0093 minStripHits_(ps.getUntrackedParameter<uint32_t>("minStripHits", 8)),
0094 minChambers_(ps.getUntrackedParameter<uint32_t>("minChambers", 2)),
0095 minMatches_(ps.getUntrackedParameter<uint32_t>("minMatches", 2)),
0096 minMatchedStations_(ps.getUntrackedParameter<double>("minMatchedStations", 2)),
0097 maxIso_(ps.getUntrackedParameter<double>("maxIso", 0.3)),
0098 minPtHighest_(ps.getUntrackedParameter<double>("minPtHighest", 24)),
0099 minInvMass_(ps.getUntrackedParameter<double>("minInvMass", 60)),
0100 maxInvMass_(ps.getUntrackedParameter<double>("maxInvMass", 120)) {
0101 produces<reco::TrackCollection>("");
0102 }
0103
0104 void ZtoMMMuonTrackProducer::produce(edm::StreamID streamID, edm::Event& iEvent, edm::EventSetup const& iSetup) const {
0105 std::unique_ptr<reco::TrackCollection> outputTColl(new reco::TrackCollection());
0106
0107
0108 edm::Handle<reco::MuonCollection> muonColl;
0109 iEvent.getByToken(muonToken_, muonColl);
0110
0111
0112 edm::Handle<reco::BeamSpot> beamSpot;
0113 iEvent.getByToken(bsToken_, beamSpot);
0114
0115 std::vector<TLorentzVector> list;
0116 if (muonColl.isValid()) {
0117 for (auto const& mu : *muonColl) {
0118 if (!mu.isGlobalMuon())
0119 continue;
0120 if (!mu.isPFMuon())
0121 continue;
0122 if (std::abs(mu.eta()) >= maxEta_)
0123 continue;
0124 if (mu.pt() < minPt_)
0125 continue;
0126
0127 reco::TrackRef gtk = mu.globalTrack();
0128 double chi2 = gtk->chi2();
0129 double ndof = gtk->ndof();
0130 double chbyndof = (ndof > 0) ? chi2 / ndof : 0;
0131 if (chbyndof >= maxNormChi2_)
0132 continue;
0133
0134 reco::TrackRef tk = mu.innerTrack();
0135 if (beamSpot.isValid()) {
0136 double trkd0 = -(tk->dxy(beamSpot->position()));
0137 if (std::abs(trkd0) >= maxD0_)
0138 continue;
0139 double trkdz = tk->dz(beamSpot->position());
0140 if (std::abs(trkdz) >= maxDz_)
0141 continue;
0142 } else {
0143 edm::LogError("ZtoMMMuonTrackProducer") << "Error >> Failed to get BeamSpot for label: " << bsTag_;
0144 }
0145 const reco::HitPattern& hitp = gtk->hitPattern();
0146 if (hitp.numberOfValidPixelHits() < minPixelHits_)
0147 continue;
0148 if (hitp.numberOfValidStripHits() < minStripHits_)
0149 continue;
0150
0151 if (mu.numberOfChambers() < minChambers_)
0152 continue;
0153 if (mu.numberOfMatches() < minMatches_)
0154 continue;
0155 if (mu.numberOfMatchedStations() < minMatchedStations_)
0156 continue;
0157 if (!muon::isGoodMuon(mu, muon::GlobalMuonPromptTight))
0158 continue;
0159
0160
0161
0162
0163 const reco::MuonPFIsolation& pfIso04 = mu.pfIsolationR04();
0164 double absiso = pfIso04.sumChargedHadronPt +
0165 std::max(0.0, pfIso04.sumNeutralHadronEt + pfIso04.sumPhotonEt - 0.5 * pfIso04.sumPUPt);
0166 if (absiso / mu.pt() > maxIso_)
0167 continue;
0168
0169 TLorentzVector lv;
0170 lv.SetPtEtaPhiE(mu.pt(), mu.eta(), mu.phi(), mu.energy());
0171 list.push_back(lv);
0172
0173 outputTColl->push_back(*tk);
0174 }
0175 } else {
0176 edm::LogError("ZtoMMMuonTrackProducer") << "Error >> Failed to get MuonCollection for label: " << muonTag_;
0177 }
0178
0179 iEvent.put(std::move(outputTColl));
0180 }
0181
0182
0183 #include "FWCore/Framework/interface/MakerMacros.h"
0184 DEFINE_FWK_MODULE(ZtoMMMuonTrackProducer);