Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-09-20 02:50:18

0001 // system includes
0002 #include <memory>
0003 
0004 // user includes
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 // ROOT includes
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   // ----------member data ---------------------------
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   // Read Muon Collection
0108   edm::Handle<reco::MuonCollection> muonColl;
0109   iEvent.getByToken(muonToken_, muonColl);
0110 
0111   // and the beamspot
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       // Hits/section in the muon chamber
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       //if (!muon::isMediumMuon(mu)) continue;
0161 
0162       // PF Isolation
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 // Define this as a plug-in
0183 #include "FWCore/Framework/interface/MakerMacros.h"
0184 DEFINE_FWK_MODULE(ZtoMMMuonTrackProducer);