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 
25  public:
26  ParticleVector leptons() const {return _leptons;}
27  ParticleVector photons() const {return _photons;}
28  ParticleVector neutrinos() const {return _neutrinos;}
29  Jets jets() const {return _jets;}
30  Jets fatjets() const {return _fatjets;}
31  Vector3 met() const {return _met;}
32 
33  private:
37 
42 
44 
45  ParticleVector _leptons, _photons, _neutrinos;
46  Jets _jets, _fatjets;
47  Vector3 _met;
48 
49  public:
50  RivetAnalysis(const edm::ParameterSet& pset) : Analysis("RivetAnalysis"),
51  _usePromptFinalStates(pset.getParameter<bool>("usePromptFinalStates")),
52  _excludePromptLeptonsFromJetClustering(pset.getParameter<bool>("excludePromptLeptonsFromJetClustering")),
53  _excludeNeutrinosFromJetClustering(pset.getParameter<bool>("excludeNeutrinosFromJetClustering")),
54 
55  _particleMinPt (pset.getParameter<double>("particleMinPt")),
56  _particleMaxEta (pset.getParameter<double>("particleMaxEta")),
57 
58  _lepConeSize (pset.getParameter<double>("lepConeSize")),
59  _lepMinPt (pset.getParameter<double>("lepMinPt")),
60  _lepMaxEta (pset.getParameter<double>("lepMaxEta")),
61 
62  _jetConeSize (pset.getParameter<double>("jetConeSize")),
63  _jetMinPt (pset.getParameter<double>("jetMinPt")),
64  _jetMaxEta (pset.getParameter<double>("jetMaxEta")),
65 
66  _fatJetConeSize (pset.getParameter<double>("fatJetConeSize")),
67  _fatJetMinPt (pset.getParameter<double>("fatJetMinPt")),
68  _fatJetMaxEta (pset.getParameter<double>("fatJetMaxEta")),
69 
70  _phoMinPt (pset.getParameter<double>("phoMinPt")),
71  _phoMaxEta (pset.getParameter<double>("phoMaxEta")),
72  _phoIsoConeSize (pset.getParameter<double>("phoIsoConeSize")),
73  _phoMaxRelIso (pset.getParameter<double>("phoMaxRelIso"))
74  {
75  }
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  addProjection(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  addProjection(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 dressed_leptons(prompt_photons, prompt_leptons, _lepConeSize,
106  lepton_cut, /*useDecayPhotons*/ true);
107  if (not _usePromptFinalStates)
108  dressed_leptons = DressedLeptons(photons, charged_leptons, _lepConeSize,
109  lepton_cut, /*useDecayPhotons*/ true);
110  addProjection(dressed_leptons, "DressedLeptons");
111 
112  // Photons
113  addProjection(photons, "Photons");
114 
115  // Jets
116  VetoedFinalState fsForJets(fs);
117  if (_usePromptFinalStates and _excludePromptLeptonsFromJetClustering)
118  fsForJets.addVetoOnThisFinalState(dressed_leptons);
119  JetAlg::InvisiblesStrategy invisiblesStrategy = JetAlg::DECAY_INVISIBLES;
120  if (_excludeNeutrinosFromJetClustering)
121  invisiblesStrategy = JetAlg::NO_INVISIBLES;
122  addProjection(FastJets(fsForJets, FastJets::ANTIKT, _jetConeSize,
123  JetAlg::ALL_MUONS, invisiblesStrategy), "Jets");
124 
125  // FatJets
126  addProjection(FastJets(fsForJets, FastJets::ANTIKT, _fatJetConeSize), "FatJets");
127 
128  // Neutrinos
129  IdentifiedFinalState neutrinos(fs);
130  neutrinos.acceptNeutrinos();
131  if (_usePromptFinalStates) {
132  PromptFinalState prompt_neutrinos(neutrinos);
133  prompt_neutrinos.acceptMuonDecays(true);
134  prompt_neutrinos.acceptTauDecays(true);
135  addProjection(prompt_neutrinos, "Neutrinos");
136  }
137  else
138  addProjection(neutrinos, "Neutrinos");
139 
140  // MET
141  addProjection(MissingMomentum(fs), "MET");
142  };
143 
144  // Apply Rivet projections
145  void analyze(const Event& event) override {
146  _jets.clear();
147  _fatjets.clear();
148  _leptons.clear();
149  _photons.clear();
150  _neutrinos.clear();
151 
152  // Get analysis objects from projections
153  Cut jet_cut = (Cuts::abseta < _jetMaxEta) and (Cuts::pT > _jetMinPt*GeV);
154  Cut fatjet_cut = (Cuts::abseta < _fatJetMaxEta) and (Cuts::pT > _fatJetMinPt*GeV);
155 
156  _leptons = applyProjection<DressedLeptons>(event, "DressedLeptons").particlesByPt();
157  // search tau ancestors
158  Particles promptleptons = applyProjection<PromptFinalState>(event, "PromptLeptons").particles();
159  for ( auto & lepton : _leptons ) {
160  const auto & cl = lepton.constituents().front(); // this has no ancestors anymore :(
161  for ( auto const & pl : promptleptons ) {
162  if (cl.momentum() == pl.momentum()) {
163  for ( auto & p : pl.ancestors()) {
164  if (p.abspid() == 15) {
165  p.setMomentum(p.momentum()*10e-20);
166  lepton.addConstituent(p, false);
167  }
168  }
169  break;
170  }
171  }
172  }
173 
174  Particles fsparticles = applyProjection<FinalState>(event,"FS").particles();
175 
176  for ( auto & photon : applyProjection<FinalState>(event, "Photons").particlesByPt() ) {
177 
178  if (photon.pt() < _phoMinPt)
179  continue;
180 
181  if (abs(photon.eta()) > _phoMaxEta)
182  continue;
183 
184  double photonptsum = 0;
185 
186  for (auto &fsparticle : fsparticles) {
187 
188  if (deltaR(fsparticle, photon) == 0)
189  continue;
190 
191  if (deltaR(fsparticle, photon) > _phoIsoConeSize)
192  continue;
193 
194  photonptsum += fsparticle.pt();
195  }
196 
197  if (photonptsum/photon.pt() > _phoMaxRelIso)
198  continue;
199 
200  _photons.push_back(photon);
201 
202  }
203 
204  _jets = applyProjection<FastJets>(event, "Jets").jetsByPt(jet_cut);
205  _fatjets = applyProjection<FastJets>(event, "FatJets").jetsByPt(fatjet_cut);
206  _neutrinos = applyProjection<FinalState>(event, "Neutrinos").particlesByPt();
207  _met = applyProjection<MissingMomentum>(event, "MET").missingMomentum().p3();
208 
209  // check for leptonic decays of tag particles
210  for (auto& jet : _jets) {
211  for (auto& pt : jet.tags()) {
212  for (auto& p : pt.children(isLepton)) {
213  pt.addConstituent(p, false);
214  }
215  }
216  }
217  for (auto& jet : _fatjets) {
218  for (auto& pt : jet.tags()) {
219  for (auto& p : pt.children(isLepton)) {
220  pt.addConstituent(p, false);
221  }
222  }
223  }
224  };
225 
226  // Do nothing here
227  void finalize() override {};
228 
229  std::string status() const override { return "VALIDATED"; }
230 
231  };
232 
233 }
234 
235 #endif
const double GeV
Definition: MathUtil.h:16
Vector3 met() const
Definition: RivetAnalysis.h:31
void finalize() override
void init() override
Definition: RivetAnalysis.h:78
bool isLepton(const Candidate &part)
Definition: pdgIdUtils.h:19
Jets fatjets() const
Definition: RivetAnalysis.h:30
ParticleVector _photons
Definition: RivetAnalysis.h:45
ParticleVector neutrinos() const
Definition: RivetAnalysis.h:28
RivetAnalysis(const edm::ParameterSet &pset)
Definition: RivetAnalysis.h:50
Jets jets() const
Definition: RivetAnalysis.h:29
ParticleVector _leptons
Definition: RivetAnalysis.h:45
ParticleVector photons() const
Definition: RivetAnalysis.h:27
bool _excludeNeutrinosFromJetClustering
Definition: RivetAnalysis.h:36
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void analyze(const Event &event) override
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
std::string status() const override
bool _excludePromptLeptonsFromJetClustering
Definition: RivetAnalysis.h:35
ParticleVector _neutrinos
Definition: RivetAnalysis.h:45
ParticleVector leptons() const
Definition: RivetAnalysis.h:26
Definition: event.py:1