File indexing completed on 2023-10-25 09:32:16
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #include <cmath>
0026 #include <cstdlib>
0027 #include <vector>
0028
0029
0030 #include "TTree.h"
0031
0032
0033 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0034 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
0035 #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
0036 #include "FWCore/Framework/interface/Frameworkfwd.h"
0037 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0038 #include "FWCore/Framework/interface/Event.h"
0039 #include "FWCore/Framework/interface/MakerMacros.h"
0040 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0041 #include "FWCore/ServiceRegistry/interface/Service.h"
0042
0043
0044
0045
0046
0047 class ZMuMuMassConstraintParameterFinder : public edm::one::EDAnalyzer<edm::one::SharedResources> {
0048 public:
0049 explicit ZMuMuMassConstraintParameterFinder(const edm::ParameterSet&);
0050 ~ZMuMuMassConstraintParameterFinder() override;
0051
0052 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0053
0054 private:
0055
0056 class DiMuonInfo {
0057 public:
0058 DiMuonInfo(double, double);
0059 void setupTree(const std::string&, edm::Service<TFileService>&);
0060 void fill();
0061 std::vector<reco::GenParticle>& muons() { return muons_; }
0062
0063 private:
0064 TTree* tree_{nullptr};
0065 std::vector<reco::GenParticle> muons_;
0066 double diMuonMass_{-1.0};
0067 int pdgMother_{0};
0068 bool passed_{false};
0069
0070 const double minMassPair_;
0071 const double maxMassPair_;
0072 };
0073
0074 void analyze(const edm::Event&, const edm::EventSetup&) override;
0075
0076
0077 edm::EDGetTokenT<reco::GenParticleCollection> genParticlesToken_;
0078
0079
0080 const int muonPdg_{13};
0081 const int zBosonPdg_{23};
0082
0083
0084 const double pMin_;
0085 const double ptMin_;
0086 const double etaMin_;
0087 const double etaMax_;
0088 const double phiMin_;
0089 const double phiMax_;
0090
0091
0092 const double minMassPair_;
0093 const double maxMassPair_;
0094
0095 DiMuonInfo muonInfo_;
0096 DiMuonInfo muonInfoFromZ_;
0097 };
0098
0099
0100
0101
0102 ZMuMuMassConstraintParameterFinder ::ZMuMuMassConstraintParameterFinder(const edm::ParameterSet& iConfig)
0103 : genParticlesToken_(consumes<reco::GenParticleCollection>(edm::InputTag{"genParticles"})),
0104 pMin_(iConfig.getParameter<double>("pMin")),
0105 ptMin_(iConfig.getParameter<double>("ptMin")),
0106 etaMin_(iConfig.getParameter<double>("etaMin")),
0107 etaMax_(iConfig.getParameter<double>("etaMax")),
0108 phiMin_(iConfig.getParameter<double>("phiMin")),
0109 phiMax_(iConfig.getParameter<double>("phiMax")),
0110 minMassPair_(iConfig.getParameter<double>("minMassPair")),
0111 maxMassPair_(iConfig.getParameter<double>("maxMassPair")),
0112 muonInfo_(minMassPair_, maxMassPair_),
0113 muonInfoFromZ_(minMassPair_, maxMassPair_) {
0114 usesResource(TFileService::kSharedResource);
0115 edm::Service<TFileService> fs;
0116 muonInfo_.setupTree("di_muon", fs);
0117 muonInfoFromZ_.setupTree("di_muon_from_Z", fs);
0118 }
0119
0120 ZMuMuMassConstraintParameterFinder ::~ZMuMuMassConstraintParameterFinder() {}
0121
0122
0123
0124
0125
0126
0127 void ZMuMuMassConstraintParameterFinder ::analyze(const edm::Event& iEvent, const edm::EventSetup&) {
0128 edm::Handle<reco::GenParticleCollection> genParticles;
0129 iEvent.getByToken(genParticlesToken_, genParticles);
0130
0131 for (const auto& particle : *(genParticles.product())) {
0132 if (std::abs(particle.pdgId()) != muonPdg_ || particle.status() != 1)
0133 continue;
0134 if (particle.p() < pMin_)
0135 continue;
0136 if (particle.pt() < ptMin_)
0137 continue;
0138 if (particle.eta() < etaMin_ || particle.eta() > etaMax_)
0139 continue;
0140 if (particle.phi() < phiMin_ || particle.phi() > phiMax_)
0141 continue;
0142
0143 muonInfo_.muons().push_back(particle);
0144 if (particle.mother()->pdgId() == zBosonPdg_) {
0145 muonInfoFromZ_.muons().push_back(particle);
0146 }
0147 }
0148
0149 muonInfo_.fill();
0150 muonInfoFromZ_.fill();
0151 }
0152
0153
0154 void ZMuMuMassConstraintParameterFinder ::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0155 edm::ParameterSetDescription desc;
0156 desc.setComment("Extract information on 'Z -> mu mu' decays.");
0157 desc.add<double>("pMin", 3.0);
0158 desc.add<double>("ptMin", 15.0);
0159 desc.add<double>("etaMin", -3.0);
0160 desc.add<double>("etaMax", 3.0);
0161 desc.add<double>("phiMin", -3.1416);
0162 desc.add<double>("phiMax", 3.1416);
0163 desc.add<double>("minMassPair", 85.8);
0164 desc.add<double>("maxMassPair", 95.8);
0165 descriptions.add("zMuMuMassConstraintParameterFinder", desc);
0166 }
0167
0168
0169 ZMuMuMassConstraintParameterFinder ::DiMuonInfo ::DiMuonInfo(double minMass, double maxMass)
0170 : minMassPair_{minMass}, maxMassPair_{maxMass} {}
0171
0172 void ZMuMuMassConstraintParameterFinder ::DiMuonInfo ::setupTree(const std::string& name,
0173 edm::Service<TFileService>& fs) {
0174 tree_ = fs->make<TTree>(name.c_str(), name.c_str());
0175 tree_->Branch("muons", &muons_);
0176 tree_->Branch("di_muon_mass", &diMuonMass_);
0177 tree_->Branch("pdg_mother", &pdgMother_);
0178 tree_->Branch("in_mass_window", &passed_);
0179 }
0180
0181 void ZMuMuMassConstraintParameterFinder ::DiMuonInfo ::fill() {
0182 if (muons_.size() == 2) {
0183 diMuonMass_ = (muons_[0].p4() + muons_[1].p4()).M();
0184 pdgMother_ = muons_[0].mother()->pdgId();
0185 if (diMuonMass_ > minMassPair_ && diMuonMass_ < maxMassPair_)
0186 passed_ = true;
0187 tree_->Fill();
0188 }
0189 muons_.clear();
0190 diMuonMass_ = -1.0;
0191 pdgMother_ = 0;
0192 passed_ = false;
0193 }
0194
0195
0196 DEFINE_FWK_MODULE(ZMuMuMassConstraintParameterFinder);