CMS 3D CMS Logo

RivetAnalysis.h
Go to the documentation of this file.
1 #ifndef GeneratorInterface_RivetInterface_RivetAnalysis_H
2 #define GeneratorInterface_RivetInterface_RivetAnalysis_H
3 
5 
6 #include "Rivet/Analysis.hh"
7 #include "Rivet/Projections/FinalState.hh"
8 #include "Rivet/Particle.hh"
9 #include "Rivet/Particle.fhh"
10 #include "Rivet/Event.hh"
11 #include "Rivet/Projections/FastJets.hh"
12 #include "Rivet/Projections/JetAlg.hh"
13 #include "Rivet/Projections/ChargedLeptons.hh"
14 #include "Rivet/Projections/PromptFinalState.hh"
15 #include "Rivet/Projections/DressedLeptons.hh"
16 #include "Rivet/Projections/VetoedFinalState.hh"
17 #include "Rivet/Projections/IdentifiedFinalState.hh"
18 #include "Rivet/Projections/MissingMomentum.hh"
19 #include "Rivet/Tools/RivetHepMC.hh"
20 
21 namespace Rivet {
22 
23  class RivetAnalysis : public Analysis {
24  public:
25  Particles leptons() const { return _leptons; }
26  Particles photons() const { return _photons; }
27  Particles neutrinos() const { return _neutrinos; }
28  Jets jets() const { return _jets; }
29  Jets fatjets() const { return _fatjets; }
30  Vector3 met() const { return _met; }
31 
32  private:
37 
42 
44 
47  Vector3 _met;
48 
49  public:
51  : Analysis("RivetAnalysis"),
52  _usePromptFinalStates(pset.getParameter<bool>("usePromptFinalStates")),
53  _excludePromptLeptonsFromJetClustering(pset.getParameter<bool>("excludePromptLeptonsFromJetClustering")),
54  _excludeNeutrinosFromJetClustering(pset.getParameter<bool>("excludeNeutrinosFromJetClustering")),
55  _doJetClustering(pset.getParameter<bool>("doJetClustering")),
56 
57  _particleMinPt(pset.getParameter<double>("particleMinPt")),
58  _particleMaxEta(pset.getParameter<double>("particleMaxEta")),
59 
60  _lepConeSize(pset.getParameter<double>("lepConeSize")),
61  _lepMinPt(pset.getParameter<double>("lepMinPt")),
62  _lepMaxEta(pset.getParameter<double>("lepMaxEta")),
63 
64  _jetConeSize(pset.getParameter<double>("jetConeSize")),
65  _jetMinPt(pset.getParameter<double>("jetMinPt")),
66  _jetMaxEta(pset.getParameter<double>("jetMaxEta")),
67 
68  _fatJetConeSize(pset.getParameter<double>("fatJetConeSize")),
69  _fatJetMinPt(pset.getParameter<double>("fatJetMinPt")),
70  _fatJetMaxEta(pset.getParameter<double>("fatJetMaxEta")),
71 
72  _phoMinPt(pset.getParameter<double>("phoMinPt")),
73  _phoMaxEta(pset.getParameter<double>("phoMaxEta")),
74  _phoIsoConeSize(pset.getParameter<double>("phoIsoConeSize")),
75  _phoMaxRelIso(pset.getParameter<double>("phoMaxRelIso")) {}
76 
77  // Initialize Rivet projections
78  void init() override {
79  // Cuts
80  Cut particle_cut = (Cuts::abseta < _particleMaxEta) and (Cuts::pT > _particleMinPt * GeV);
81  Cut lepton_cut = (Cuts::abseta < _lepMaxEta) and (Cuts::pT > _lepMinPt * GeV);
82 
83  // Generic final state
84  FinalState fs(particle_cut);
85 
86  declare(fs, "FS");
87 
88  // Dressed leptons
89  ChargedLeptons charged_leptons(fs);
90  IdentifiedFinalState photons(fs);
91  photons.acceptIdPair(PID::PHOTON);
92 
93  PromptFinalState prompt_leptons(charged_leptons);
94  prompt_leptons.acceptMuonDecays(true);
95  prompt_leptons.acceptTauDecays(true);
96  declare(prompt_leptons, "PromptLeptons");
97 
98  PromptFinalState prompt_photons(photons);
99  prompt_photons.acceptMuonDecays(true);
100  prompt_photons.acceptTauDecays(true);
101 
102  // useDecayPhotons=true allows for photons with tau ancestor,
103  // photons from hadrons are vetoed by the PromptFinalState;
104  // will be default DressedLeptons behaviour for Rivet >= 2.5.4
105  DressedLeptons prompt_dressed_leptons(
106  prompt_photons, prompt_leptons, _lepConeSize, lepton_cut, /*useDecayPhotons*/ true);
107  DressedLeptons dressed_leptons(photons, charged_leptons, _lepConeSize, lepton_cut, /*useDecayPhotons*/ true);
108  declare(_usePromptFinalStates ? prompt_dressed_leptons : dressed_leptons, "DressedLeptons");
109 
110  declare(photons, "Photons");
111 
112  // Jets
113  VetoedFinalState fsForJets(fs);
115  fsForJets.addVetoOnThisFinalState(prompt_dressed_leptons);
116  JetAlg::Invisibles invisiblesStrategy = JetAlg::Invisibles::DECAY;
118  invisiblesStrategy = JetAlg::Invisibles::NONE;
119  declare(FastJets(fsForJets, FastJets::ANTIKT, _jetConeSize, JetAlg::Muons::ALL, invisiblesStrategy), "Jets");
120 
121  // FatJets
122  declare(FastJets(fsForJets, FastJets::ANTIKT, _fatJetConeSize), "FatJets");
123 
124  // Neutrinos
125  IdentifiedFinalState neutrinos(fs);
126  neutrinos.acceptNeutrinos();
127  if (_usePromptFinalStates) {
128  PromptFinalState prompt_neutrinos(neutrinos);
129  prompt_neutrinos.acceptMuonDecays(true);
130  prompt_neutrinos.acceptTauDecays(true);
131  declare(prompt_neutrinos, "Neutrinos");
132  } else
133  declare(neutrinos, "Neutrinos");
134 
135  // MET
136  declare(MissingMomentum(fs), "MET");
137  };
138 
139  // Apply Rivet projections
140  void analyze(const Event& event) override {
141  _jets.clear();
142  _fatjets.clear();
143  _leptons.clear();
144  _photons.clear();
145  _neutrinos.clear();
146 
147  // Get analysis objects from projections
148  Cut jet_cut = (Cuts::abseta < _jetMaxEta) and (Cuts::pT > _jetMinPt * GeV);
149  Cut fatjet_cut = (Cuts::abseta < _fatJetMaxEta) and (Cuts::pT > _fatJetMinPt * GeV);
150 
151  _leptons = apply<DressedLeptons>(event, "DressedLeptons").particlesByPt();
152 
153  // search tau ancestors
154  Particles promptleptons = apply<PromptFinalState>(event, "PromptLeptons").particles();
155  for (auto& lepton : _leptons) {
156  const auto& cl = lepton.constituents().front(); // this has no ancestors anymore :(
157  for (auto const& pl : promptleptons) {
158  if (cl.momentum() == pl.momentum()) {
159  for (auto& p : pl.ancestors()) {
160  if (p.abspid() == 15) {
161  p.setMomentum(p.momentum() * 10e-20);
162  lepton.addConstituent(p, false);
163  }
164  }
165  break;
166  }
167  }
168  }
169 
170  // Photons
171  Particles fsparticles = apply<FinalState>(event, "FS").particles();
172 
173  for (auto& photon : apply<FinalState>(event, "Photons").particlesByPt()) {
174  if (photon.pt() < _phoMinPt)
175  continue;
176 
177  if (abs(photon.eta()) > _phoMaxEta)
178  continue;
179 
180  double photonptsum = 0;
181 
182  for (auto& fsparticle : fsparticles) {
183  if (deltaR(fsparticle, photon) == 0)
184  continue;
185 
186  if (deltaR(fsparticle, photon) > _phoIsoConeSize)
187  continue;
188 
189  photonptsum += fsparticle.pt();
190  }
191 
192  if (photonptsum / photon.pt() > _phoMaxRelIso)
193  continue;
194 
195  _photons.push_back(photon);
196  }
197 
198  if (_doJetClustering) {
199  _jets = apply<FastJets>(event, "Jets").jetsByPt(jet_cut);
200  _fatjets = apply<FastJets>(event, "FatJets").jetsByPt(fatjet_cut);
201  }
202  _neutrinos = apply<FinalState>(event, "Neutrinos").particlesByPt();
203  _met = apply<MissingMomentum>(event, "MET").missingMomentum().p3();
204 
205  // check for leptonic decays of tag particles
206  for (auto& jet : _jets) {
207  for (auto& pt : jet.tags()) {
208  for (auto& p : pt.children(isLepton)) {
209  pt.addConstituent(p, false);
210  }
211  }
212  }
213  for (auto& jet : _fatjets) {
214  for (auto& pt : jet.tags()) {
215  for (auto& p : pt.children(isLepton)) {
216  pt.addConstituent(p, false);
217  }
218  }
219  }
220  };
221 
222  // Do nothing here
223  void finalize() override{};
224 
225  std::string status() const override { return "VALIDATED"; }
226  };
227 
228 } // namespace Rivet
229 
230 #endif
void finalize() override
void init() override
Definition: RivetAnalysis.h:78
Particles leptons() const
Definition: RivetAnalysis.h:25
bool isLepton(const Candidate &part)
Definition: pdgIdUtils.h:13
def ALL(dt, wheel, station, sector)
Definition: diffTwoXMLs.py:28
Particles photons() const
Definition: RivetAnalysis.h:26
RivetAnalysis(const edm::ParameterSet &pset)
Definition: RivetAnalysis.h:50
bool _excludeNeutrinosFromJetClustering
Definition: RivetAnalysis.h:35
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void analyze(const Event &event) override
bool _excludePromptLeptonsFromJetClustering
Definition: RivetAnalysis.h:34
Jets fatjets() const
Definition: RivetAnalysis.h:29
std::string status() const override
Particles neutrinos() const
Definition: RivetAnalysis.h:27
Definition: TkAlStyle.h:43
Vector3 met() const
Definition: RivetAnalysis.h:30
Definition: event.py:1