1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
// -*- C++ -*-
//
// Package: Alignment/MillePedeAlignmentAlgorithm
// Class: ZMuMuMassConstraintParameterFinder
//
/**\class ZMuMuMassConstraintParameterFinder ZMuMuMassConstraintParameterFinder.cc Alignment/MillePedeAlignmentAlgorithm/plugins/ZMuMuMassConstraintParameterFinder.cc
Description: Determines the generator di-muon invariant-mass distribution
Implementation:
Generator muons are extracted from the genParticles collection and matched to
Z-boson decays. The configured selection should match the selection applied
on muon tracks in real data to obtain a "true" invariant mass distribution
within the selection.
*/
//
// Original Author: Gregor Mittag
// Created: Fri, 17 Jun 2016 09:42:56 GMT
//
//
// system include files
#include <cmath>
#include <cstdlib>
#include <vector>
// ROOT include files
#include "TTree.h"
// user include files
#include "CommonTools/UtilAlgos/interface/TFileService.h"
#include "DataFormats/HepMCCandidate/interface/GenParticle.h"
#include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/one/EDAnalyzer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ServiceRegistry/interface/Service.h"
//
// class declaration
//
class ZMuMuMassConstraintParameterFinder : public edm::one::EDAnalyzer<edm::one::SharedResources> {
public:
explicit ZMuMuMassConstraintParameterFinder(const edm::ParameterSet&);
~ZMuMuMassConstraintParameterFinder() override = default;
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
private:
/// helper class containing information about a di-muon system
class DiMuonInfo {
public:
DiMuonInfo(double, double);
void setupTree(const std::string&, edm::Service<TFileService>&);
void fill();
std::vector<reco::GenParticle>& muons() { return muons_; }
private:
TTree* tree_{nullptr};
std::vector<reco::GenParticle> muons_;
double diMuonMass_{-1.0};
int pdgMother_{0};
bool passed_{false};
const double minMassPair_;
const double maxMassPair_;
};
void analyze(const edm::Event&, const edm::EventSetup&) override;
// ----------member data ---------------------------
edm::EDGetTokenT<reco::GenParticleCollection> genParticlesToken_;
// particle IDs
const int muonPdg_{13};
const int zBosonPdg_{23};
// muon cuts
const double pMin_;
const double ptMin_;
const double etaMin_;
const double etaMax_;
const double phiMin_;
const double phiMax_;
// di-muon cuts
const double minMassPair_;
const double maxMassPair_;
DiMuonInfo muonInfo_;
DiMuonInfo muonInfoFromZ_;
};
//
// constructors and destructor
//
ZMuMuMassConstraintParameterFinder ::ZMuMuMassConstraintParameterFinder(const edm::ParameterSet& iConfig)
: genParticlesToken_(consumes<reco::GenParticleCollection>(edm::InputTag{"genParticles"})),
pMin_(iConfig.getParameter<double>("pMin")),
ptMin_(iConfig.getParameter<double>("ptMin")),
etaMin_(iConfig.getParameter<double>("etaMin")),
etaMax_(iConfig.getParameter<double>("etaMax")),
phiMin_(iConfig.getParameter<double>("phiMin")),
phiMax_(iConfig.getParameter<double>("phiMax")),
minMassPair_(iConfig.getParameter<double>("minMassPair")),
maxMassPair_(iConfig.getParameter<double>("maxMassPair")),
muonInfo_(minMassPair_, maxMassPair_),
muonInfoFromZ_(minMassPair_, maxMassPair_) {
usesResource(TFileService::kSharedResource);
edm::Service<TFileService> fs;
muonInfo_.setupTree("di_muon", fs);
muonInfoFromZ_.setupTree("di_muon_from_Z", fs);
}
//
// member functions
//
// ------------ method called for each event ------------
void ZMuMuMassConstraintParameterFinder ::analyze(const edm::Event& iEvent, const edm::EventSetup&) {
edm::Handle<reco::GenParticleCollection> genParticles;
iEvent.getByToken(genParticlesToken_, genParticles);
for (const auto& particle : *(genParticles.product())) {
if (std::abs(particle.pdgId()) != muonPdg_ || particle.status() != 1)
continue;
if (particle.p() < pMin_)
continue;
if (particle.pt() < ptMin_)
continue;
if (particle.eta() < etaMin_ || particle.eta() > etaMax_)
continue;
if (particle.phi() < phiMin_ || particle.phi() > phiMax_)
continue;
muonInfo_.muons().push_back(particle);
if (particle.mother()->pdgId() == zBosonPdg_) {
muonInfoFromZ_.muons().push_back(particle);
}
}
muonInfo_.fill();
muonInfoFromZ_.fill();
}
// ------------ method fills 'descriptions' with the allowed parameters for the module ------------
void ZMuMuMassConstraintParameterFinder ::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.setComment("Extract information on 'Z -> mu mu' decays.");
desc.add<double>("pMin", 3.0);
desc.add<double>("ptMin", 15.0);
desc.add<double>("etaMin", -3.0);
desc.add<double>("etaMax", 3.0);
desc.add<double>("phiMin", -M_PI);
desc.add<double>("phiMax", M_PI);
desc.add<double>("minMassPair", 85.8);
desc.add<double>("maxMassPair", 95.8);
descriptions.add("zMuMuMassConstraintParameterFinder", desc);
}
// ------------ helper class definition ------------
ZMuMuMassConstraintParameterFinder ::DiMuonInfo ::DiMuonInfo(double minMass, double maxMass)
: minMassPair_{minMass}, maxMassPair_{maxMass} {}
void ZMuMuMassConstraintParameterFinder ::DiMuonInfo ::setupTree(const std::string& name,
edm::Service<TFileService>& fs) {
tree_ = fs->make<TTree>(name.c_str(), name.c_str());
tree_->Branch("muons", &muons_);
tree_->Branch("di_muon_mass", &diMuonMass_);
tree_->Branch("pdg_mother", &pdgMother_);
tree_->Branch("in_mass_window", &passed_);
}
void ZMuMuMassConstraintParameterFinder ::DiMuonInfo ::fill() {
if (muons_.size() == 2) {
diMuonMass_ = (muons_[0].p4() + muons_[1].p4()).M();
pdgMother_ = muons_[0].mother()->pdgId();
if (diMuonMass_ > minMassPair_ && diMuonMass_ < maxMassPair_)
passed_ = true;
tree_->Fill();
}
muons_.clear();
diMuonMass_ = -1.0;
pdgMother_ = 0;
passed_ = false;
}
//define this as a plug-in
DEFINE_FWK_MODULE(ZMuMuMassConstraintParameterFinder);
|