CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
SoftLepton.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SoftLepton
4 // Class: SoftLepton
5 //
14 // Original Author: fwyzard
15 // Created: Wed Oct 18 18:02:07 CEST 2006
16 
17 #include <memory>
18 #include <string>
19 #include <utility>
20 #include <cmath>
21 #include <map>
22 
45 
48 
51 
52 // ROOT::Math vectors (aka math::XYZVector)
54 #include "Math/GenVector/PxPyPzM4D.h"
55 #include "Math/GenVector/VectorUtil.h"
56 #include "Math/GenVector/Boost.h"
57 
59 
64 
66 public:
67  explicit SoftLepton(const edm::ParameterSet &iConfig);
68 
69  static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
70 
71  struct TrackCompare {
72  inline bool operator()(const edm::RefToBase<reco::Track> &t1, const edm::RefToBase<reco::Track> &t2) const {
73  return t1.key() < t2.key();
74  }
75  };
76 
77  using LeptonIds = std::map<unsigned int, float>;
78  using Leptons = std::map<edm::RefToBase<reco::Track>, LeptonIds, TrackCompare>;
79 
80  // generic interface, using a TrackRefVector for lepton tracks
83  const Leptons &leptons,
85  const TransientTrackBuilder &builder) const;
86 
87 protected:
88  // generic interface, using a TrackRefVector for lepton tracks
89 
93 
94  static double relativeEta(const math::XYZVector &vector, const math::XYZVector &axis);
95 
96  static double boostedPPar(const math::XYZVector &vector, const math::XYZVector &axis);
97 
98 private:
99  void produce(edm::StreamID, edm::Event &event, const edm::EventSetup &setup) const final;
100 
101  // configuration
116 
117  // service used to make transient tracks from tracks
119 
121  // algorithm configuration
122  const unsigned int m_refineJetAxis;
123  const double m_deltaRCut;
124  const double m_chi2Cut;
125 
126  // specific for reco::Muons
128 
129  // nominal beam spot position
131 };
132 
133 enum AxisType {
134  AXIS_CALORIMETRIC = 0, // use the calorimietric jet axis
135  AXIS_CHARGED_AVERAGE = 1, // refine jet axis using charged tracks: use a pT-weighted average of (eta, phi)
136  AXIS_CHARGED_AVERAGE_NOLEPTON = 2, // as above, without the tagging lepton track
137  AXIS_CHARGED_SUM = 3, // refine jet axis using charged tracks: use the sum of tracks momentum
138  AXIS_CHARGED_SUM_NOLEPTON = 4, // as above, without the tagging lepton track
139  AXIS_CALORIMETRIC_NOLEPTON = 5 // use the calorimetric jet axis minus the lepton momentum
140 };
141 
142 using namespace std;
143 using namespace edm;
144 using namespace reco;
145 using namespace ROOT::Math::VectorUtil;
146 
150 
151 // ------------ static copy of the nominal beamspot --------------------------------------
153  reco::Vertex::Point(0, 0, 0),
154  reco::Vertex::Error(ROOT::Math::SVector<double, 6>(0.0015 * 0.0015, // 0.0, 0.0
155  0.0,
156  0.0015 * 0.0015, // 0.0
157  0.0,
158  0.0,
159  15. * 15.)),
160  1,
161  1,
162  0);
163 
164 // ------------ c'tor --------------------------------------------------------------------
166  : m_jets(iConfig.getParameter<edm::InputTag>("jets")),
167  token_jtas(mayConsume<reco::JetTracksAssociationCollection>(m_jets)),
168  token_jets(mayConsume<edm::View<reco::Jet> >(m_jets)),
169  token_primaryVertex(consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("primaryVertex"))),
170  m_leptons(iConfig.getParameter<edm::InputTag>("leptons")),
171  token_gsfElectrons(mayConsume<GsfElectronView>(m_leptons)),
172  token_electrons(mayConsume<ElectronView>(m_leptons)),
173  token_pfElectrons(mayConsume<reco::PFCandidateCollection>(m_leptons)),
174  token_muons(mayConsume<MuonView>(m_leptons)),
175  token_tracks(mayConsume<edm::View<reco::Track> >(m_leptons)),
176  m_leptonCands(iConfig.getParameter<edm::InputTag>("leptonCands")),
177  token_leptonCands(mayConsume<edm::ValueMap<float> >(m_leptonCands)),
178  m_leptonId(iConfig.getParameter<edm::InputTag>("leptonId")),
179  token_leptonId(mayConsume<edm::ValueMap<float> >(m_leptonId)),
180  token_builder(esConsumes(edm::ESInputTag("", "TransientTrackBuilder"))),
181  token_put(produces()),
182  m_refineJetAxis(iConfig.getParameter<unsigned int>("refineJetAxis")),
183  m_deltaRCut(iConfig.getParameter<double>("leptonDeltaRCut")),
184  m_chi2Cut(iConfig.getParameter<double>("leptonChi2Cut")),
185  m_muonSelection((muon::SelectionType)iConfig.getParameter<unsigned int>("muonSelection")) {}
186 
187 // ------------ method called once per event during the event loop -----------------------
189  // grab a TransientTrack helper from the Event Setup
190  auto const &transientTrackBuilder = setup.getData(token_builder);
191 
192  // input objects
193 
194  // input jets (and possibly tracks)
195  ProductID jets_id;
196  std::vector<edm::RefToBase<reco::Jet> > jets;
197  std::vector<reco::TrackRefVector> tracks;
198  do {
199  {
200  // look for a JetTracksAssociationCollection
202  if (h_jtas.isValid()) {
203  unsigned int size = h_jtas->size();
204  jets.resize(size);
205  tracks.resize(size);
206  for (unsigned int i = 0; i < size; ++i) {
207  jets[i] = (*h_jtas)[i].first;
208  tracks[i] = (*h_jtas)[i].second;
209  }
210  break;
211  }
212  }
213  { // else...
214  // look for a View<Jet>
215  edm::Handle<edm::View<reco::Jet> > h_jets = event.getHandle(token_jets);
216  if (h_jets.isValid()) {
217  unsigned int size = h_jets->size();
218  jets.resize(size);
219  tracks.resize(size);
220  for (unsigned int i = 0; i < h_jets->size(); i++)
221  jets[i] = h_jets->refAt(i);
222  break;
223  }
224  }
225  { // else...
227  << "Object " << m_jets
228  << " of type among (\"reco::JetTracksAssociationCollection\", \"edm::View<reco::Jet>\") not found";
229  }
230  } while (false);
231 
232  // input primary vetex
233  reco::Vertex vertex;
234  Handle<reco::VertexCollection> h_primaryVertex = event.getHandle(token_primaryVertex);
235  if (h_primaryVertex.isValid() and not h_primaryVertex->empty())
236  vertex = h_primaryVertex->front();
237  else
238  // fall back to nominal beam spot
239  vertex = s_nominalBeamSpot;
240 
241  // input leptons (can be of different types)
243 
244  Handle<edm::ValueMap<float> > h_leptonCands;
245  bool haveLeptonCands = !(m_leptonCands == edm::InputTag());
246  if (haveLeptonCands)
247  h_leptonCands = event.getHandle(token_leptonCands);
248 
249  // try to access the input collection as a collection of GsfElectrons, Muons or Tracks
250 
252  do {
253  {
254  // look for View<GsfElectron>
255  Handle<GsfElectronView> h_electrons = event.getHandle(token_gsfElectrons);
256 
257  if (h_electrons.isValid()) {
258  leptonId = SoftLeptonProperties::Quality::egammaElectronId;
259  for (GsfElectronView::const_iterator electron = h_electrons->begin(); electron != h_electrons->end();
260  ++electron) {
261  LeptonIds &id = leptons[reco::TrackBaseRef(electron->gsfTrack())];
262  id[SoftLeptonProperties::Quality::pfElectronId] = electron->mva_e_pi();
263  if (haveLeptonCands)
264  id[SoftLeptonProperties::Quality::btagElectronCands] =
265  (*h_leptonCands)[h_electrons->refAt(electron - h_electrons->begin())];
266  }
267  break;
268  }
269  }
270  { // else
271  // look for View<Electron>
272  // FIXME: is this obsolete?
273  Handle<ElectronView> h_electrons = event.getHandle(token_electrons);
274  if (h_electrons.isValid()) {
275  leptonId = SoftLeptonProperties::Quality::egammaElectronId;
276  for (ElectronView::const_iterator electron = h_electrons->begin(); electron != h_electrons->end(); ++electron) {
277  LeptonIds &id = leptons[reco::TrackBaseRef(electron->track())];
278  if (haveLeptonCands)
279  id[SoftLeptonProperties::Quality::btagElectronCands] =
280  (*h_leptonCands)[h_electrons->refAt(electron - h_electrons->begin())];
281  }
282  break;
283  }
284  }
285  { // else
286  // look for PFElectrons
287  // FIXME: is this obsolete?
288  Handle<reco::PFCandidateCollection> h_electrons = event.getHandle(token_pfElectrons);
289  if (h_electrons.isValid()) {
290  leptonId = SoftLeptonProperties::Quality::egammaElectronId;
291  for (reco::PFCandidateCollection::const_iterator electron = h_electrons->begin();
292  electron != h_electrons->end();
293  ++electron) {
294  LeptonIds *id;
295  if (electron->gsfTrackRef().isNonnull())
296  id = &leptons[reco::TrackBaseRef(electron->gsfTrackRef())];
297  else if (electron->trackRef().isNonnull())
298  id = &leptons[reco::TrackBaseRef(electron->trackRef())];
299  else
300  continue;
301  (*id)[SoftLeptonProperties::Quality::pfElectronId] = electron->mva_e_pi();
302  if (haveLeptonCands)
303  (*id)[SoftLeptonProperties::Quality::btagElectronCands] =
304  (*h_leptonCands)[reco::PFCandidateRef(h_electrons, electron - h_electrons->begin())];
305  }
306  break;
307  }
308  }
309  { // else
310  // look for View<Muon>
311  Handle<MuonView> h_muons = event.getHandle(token_muons);
312  if (h_muons.isValid()) {
313  for (MuonView::const_iterator muon = h_muons->begin(); muon != h_muons->end(); ++muon) {
314  // FIXME -> turn this selection into a muonCands input?
316  LeptonIds *id;
317  if (muon->globalTrack().isNonnull())
318  id = &leptons[reco::TrackBaseRef(muon->globalTrack())];
319  else if (muon->innerTrack().isNonnull())
320  id = &leptons[reco::TrackBaseRef(muon->innerTrack())];
321  else if (muon->outerTrack().isNonnull())
322  // does this makes sense ?
323  id = &leptons[reco::TrackBaseRef(muon->outerTrack())];
324  else
325  continue;
326  if (haveLeptonCands)
327  (*id)[SoftLeptonProperties::Quality::btagMuonCands] =
328  (*h_leptonCands)[h_muons->refAt(muon - h_muons->begin())];
329  }
330  }
331  break;
332  }
333  }
334  { // else
335  // look for edm::View<Track>
336  Handle<edm::View<reco::Track> > h_tracks = event.getHandle(token_tracks);
337  if (h_tracks.isValid()) {
338  for (unsigned int i = 0; i < h_tracks->size(); i++) {
339  LeptonIds &id = leptons[h_tracks->refAt(i)];
340  if (haveLeptonCands)
341  id[SoftLeptonProperties::Quality::btagLeptonCands] = (*h_leptonCands)[h_tracks->refAt(i)];
342  }
343  break;
344  }
345  }
346  { // else
347  throw edm::Exception(edm::errors::NotFound) << "Object " << m_leptons
348  << " of type among (\"edm::View<reco::GsfElectron>\", "
349  "\"edm::View<reco::Muon>\", \"edm::View<reco::Track>\") !found";
350  }
351  } while (false);
352 
353  if (!(m_leptonId == edm::InputTag())) {
354  edm::ValueMap<float> const &h_leptonId = event.get(token_leptonId);
355 
356  for (Leptons::iterator lepton = leptons.begin(); lepton != leptons.end(); ++lepton)
357  lepton->second[leptonId] = h_leptonId[lepton->first];
358  }
359 
360  // output collections
361  reco::SoftLeptonTagInfoCollection outputCollection;
362  for (unsigned int i = 0; i < jets.size(); ++i) {
363  reco::SoftLeptonTagInfo result = tag(jets[i], tracks[i], leptons, vertex, transientTrackBuilder);
364  outputCollection.push_back(result);
365  }
366  event.emplace(token_put, std::move(outputCollection));
367 }
368 
369 // ---------------------------------------------------------------------------------------
372  const Leptons &leptons,
374  const TransientTrackBuilder &transientTrackBuilder) const {
376  info.setJetRef(jet);
377 
378  for (Leptons::const_iterator lepton = leptons.begin(); lepton != leptons.end(); ++lepton) {
379  const math::XYZVector &lepton_momentum = lepton->first->momentum();
380  if (m_chi2Cut > 0.0 && lepton->first->normalizedChi2() > m_chi2Cut)
381  continue;
382 
383  const GlobalVector jetAxis = refineJetAxis(jet, tracks, lepton->first);
384  const math::XYZVector axis(jetAxis.x(), jetAxis.y(), jetAxis.z());
385  float deltaR = Geom::deltaR(lepton_momentum, axis);
386  if (deltaR > m_deltaRCut)
387  continue;
388 
389  reco::SoftLeptonProperties properties;
390 
391  reco::TransientTrack transientTrack = transientTrackBuilder.build(*lepton->first);
392  Measurement1D ip2d = IPTools::signedTransverseImpactParameter(transientTrack, jetAxis, primaryVertex).second;
393  Measurement1D ip3d = IPTools::signedImpactParameter3D(transientTrack, jetAxis, primaryVertex).second;
394  properties.sip2dsig = ip2d.significance();
395  properties.sip3dsig = ip3d.significance();
396  properties.sip2d = ip2d.value();
397  properties.sip3d = ip3d.value();
398  properties.deltaR = deltaR;
399  properties.ptRel = Perp(lepton_momentum, axis);
400  properties.p0Par = boostedPPar(lepton_momentum, axis);
401  properties.etaRel = relativeEta(lepton_momentum, axis);
402  properties.ratio = lepton_momentum.R() / axis.R();
403  properties.ratioRel = lepton_momentum.Dot(axis) / axis.Mag2();
404 
405  for (LeptonIds::const_iterator iter = lepton->second.begin(); iter != lepton->second.end(); ++iter)
406  properties.setQuality(static_cast<SoftLeptonProperties::Quality::Generic>(iter->first), iter->second);
407 
408  info.insert(lepton->first, properties);
409  }
410 
411  return info;
412 }
413 
414 // ---------------------------------------------------------------------------------------
417  const reco::TrackBaseRef &exclude /* = reco::TrackBaseRef() */
418 ) const {
419  math::XYZVector axis = jet->momentum();
420 
422  double sum_pT = 0.;
423  double sum_eta_by_pT = 0.;
424  double sum_phi_by_pT = 0.;
425 
426  double perp;
427  double phi_rel;
428  double eta_rel;
429 
430  // refine jet eta and phi with charged tracks measurements, if available
431  for (reco::TrackRefVector::const_iterator track_it = tracks.begin(); track_it != tracks.end(); ++track_it) {
432  const reco::Track &track = **track_it;
433 
434  perp = track.pt();
435  eta_rel = (double)track.eta() - axis.eta();
436  phi_rel = (double)track.phi() - axis.phi();
437  while (phi_rel < -M_PI)
438  phi_rel += 2 * M_PI;
439  while (phi_rel > M_PI)
440  phi_rel -= 2 * M_PI;
441 
442  sum_pT += perp;
443  sum_phi_by_pT += perp * phi_rel;
444  sum_eta_by_pT += perp * eta_rel;
445  }
446 
447  // "remove" excluded track
449  const reco::Track &track = *exclude;
450 
451  perp = track.pt();
452  eta_rel = (double)track.eta() - axis.eta();
453  phi_rel = (double)track.phi() - axis.phi();
454  while (phi_rel < -M_PI)
455  phi_rel += 2 * M_PI;
456  while (phi_rel > M_PI)
457  phi_rel -= 2 * M_PI;
458 
459  sum_pT -= perp;
460  sum_phi_by_pT -= perp * phi_rel;
461  sum_eta_by_pT -= perp * eta_rel;
462  }
463 
464  if (sum_pT > 1.) // avoid the case of only the lepton-track with small rounding errors
465  axis =
466  math::RhoEtaPhiVector(axis.rho(), axis.eta() + sum_eta_by_pT / sum_pT, axis.phi() + sum_phi_by_pT / sum_pT);
467 
469  math::XYZVector sum;
470 
471  // recalculate the jet direction as the sum of charget tracks momenta
472  for (reco::TrackRefVector::const_iterator track_it = tracks.begin(); track_it != tracks.end(); ++track_it) {
473  const reco::Track &track = **track_it;
474  sum += track.momentum();
475  }
476 
477  // "remove" excluded track
478  if (m_refineJetAxis == AXIS_CHARGED_SUM_NOLEPTON and exclude.isNonnull()) {
479  const reco::Track &track = *exclude;
480  sum -= track.momentum();
481  }
482 
483  if (sum.R() > 1.) // avoid the case of only the lepton-track with small rounding errors
484  axis = sum;
486  axis -= exclude->momentum();
487  }
488 
489  return GlobalVector(axis.x(), axis.y(), axis.z());
490 }
491 
493  double mag = vector.r() * axis.r();
494  double dot = vector.Dot(axis);
495  return -log((mag - dot) / (mag + dot)) / 2;
496 }
497 
498 // compute the lepton momentum along the jet axis, in the jet rest frame
500  static const double lepton_mass = 0.00; // assume a massless (ultrarelativistic) lepton
501  static const double jet_mass = 5.279; // use B±/B0 mass as the jet rest mass [PDG 2007 updates]
502  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<double> > lepton(
503  vector.Dot(axis) / axis.r(), Perp(vector, axis), 0., lepton_mass);
504  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<double> > jet(axis.r(), 0., 0., jet_mass);
505  ROOT::Math::BoostX boost(-jet.Beta());
506  return boost(lepton).x();
507 }
508 
509 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
512  desc.add<unsigned int>("muonSelection", 1);
513  desc.add<edm::InputTag>("leptons", edm::InputTag("muons"));
514  desc.add<edm::InputTag>("primaryVertex", edm::InputTag("offlinePrimaryVertices"));
515  desc.add<edm::InputTag>("leptonCands", edm::InputTag());
516  desc.add<edm::InputTag>("leptonId", edm::InputTag());
517  desc.add<unsigned int>("refineJetAxis", 0);
518  desc.add<edm::InputTag>("jets", edm::InputTag("ak4PFJetsCHS"));
519  desc.add<double>("leptonDeltaRCut", 0.4);
520  desc.add<double>("leptonChi2Cut", 9999.0);
521  descriptions.addDefault(desc);
522 }
523 
const edm::EDGetTokenT< reco::PFCandidateCollection > token_pfElectrons
Definition: SoftLepton.cc:109
static const TGPicture * info(bool iBackgroundIsBlack)
const edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > token_builder
Definition: SoftLepton.cc:118
static std::vector< std::string > checklist log
Vector momentum() const final
spatial momentum vector
edm::View< reco::Muon > MuonView
Definition: SoftLepton.cc:149
const double m_deltaRCut
Definition: SoftLepton.cc:123
void produce(edm::StreamID, edm::Event &event, const edm::EventSetup &setup) const final
Definition: SoftLepton.cc:188
uint16_t *__restrict__ id
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Base class for all types of Jets.
Definition: Jet.h:20
std::pair< bool, Measurement1D > signedTransverseImpactParameter(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:57
const edm::EDGetTokenT< edm::ValueMap< float > > token_leptonCands
Definition: SoftLepton.cc:113
reco::TransientTrack build(const reco::Track *p) const
T y() const
Definition: PV3DBase.h:60
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:44
std::pair< bool, Measurement1D > signedImpactParameter3D(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:81
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:649
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
const edm::EDGetTokenT< edm::ValueMap< float > > token_leptonId
Definition: SoftLepton.cc:115
bool isNonnull() const
Checks for non-null.
Definition: RefToBase.h:301
auto const & tracks
cannot be loose
const edm::EDGetTokenT< edm::View< reco::Muon > > token_muons
Definition: SoftLepton.cc:110
void setJetRef(const edm::Ref< T > &jetRef)
Definition: JetTagInfo.h:25
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:664
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:228
const edm::EDGetTokenT< edm::View< reco::Electron > > token_electrons
Definition: SoftLepton.cc:108
RhoEtaPhiVectorD RhoEtaPhiVector
spatial vector with cylindrical internal representation using pseudorapidity
Definition: Vector3D.h:33
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:223
const edm::EDGetTokenT< edm::View< reco::GsfElectron > > token_gsfElectrons
Definition: SoftLepton.cc:107
tuple result
Definition: mps_fire.py:311
SelectionType
Selector type.
Definition: MuonSelectors.h:18
void setQuality(Quality::Generic qual, float value)
std::map< edm::RefToBase< reco::Track >, LeptonIds, TrackCompare > Leptons
Definition: SoftLepton.cc:78
bool getData(T &iHolder) const
Definition: EventSetup.h:128
std::vector< SoftLeptonTagInfo > SoftLeptonTagInfoCollection
std::map< unsigned int, float > LeptonIds
Definition: SoftLepton.cc:77
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
void addDefault(ParameterSetDescription const &psetDescription)
bool operator()(const edm::RefToBase< reco::Track > &t1, const edm::RefToBase< reco::Track > &t2) const
Definition: SoftLepton.cc:72
const muon::SelectionType m_muonSelection
Definition: SoftLepton.cc:127
const unsigned int m_refineJetAxis
Definition: SoftLepton.cc:122
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
Definition: TrackFwd.h:35
const edm::InputTag m_leptons
Definition: SoftLepton.cc:106
size_t key() const
Definition: RefToBase.h:219
static double relativeEta(const math::XYZVector &vector, const math::XYZVector &axis)
Definition: SoftLepton.cc:492
GlobalVector refineJetAxis(const edm::RefToBase< reco::Jet > &jet, const reco::TrackRefVector &tracks, const edm::RefToBase< reco::Track > &exclude=edm::RefToBase< reco::Track >()) const
Definition: SoftLepton.cc:415
vector< PseudoJet > jets
double pt() const
track transverse momentum
Definition: TrackBase.h:637
T z() const
Definition: PV3DBase.h:61
def move
Definition: eostools.py:511
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
const edm::EDGetTokenT< reco::VertexCollection > token_primaryVertex
Definition: SoftLepton.cc:105
AxisType
Definition: SoftLepton.cc:133
const double m_chi2Cut
Definition: SoftLepton.cc:124
const edm::InputTag m_leptonId
Definition: SoftLepton.cc:114
edm::Ref< PFCandidateCollection > PFCandidateRef
persistent reference to a PFCandidate
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:70
const_reference_type get(ProductID id, size_t idx) const
Definition: ValueMap.h:144
const edm::InputTag m_leptonCands
Definition: SoftLepton.cc:112
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
#define M_PI
void insert(const REF &lepton, const SoftLeptonProperties &properties)
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
double significance() const
Definition: Measurement1D.h:29
const edm::EDGetTokenT< edm::View< reco::Jet > > token_jets
Definition: SoftLepton.cc:104
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
SoftLepton(const edm::ParameterSet &iConfig)
Definition: SoftLepton.cc:165
edm::View< reco::GsfElectron > GsfElectronView
Definition: SoftLepton.cc:147
double value() const
Definition: Measurement1D.h:25
static const reco::Vertex s_nominalBeamSpot
Definition: SoftLepton.cc:130
T perp() const
Magnitude of transverse component.
T dot(const Basic3DVector &v) const
Scalar product, or &quot;dot&quot; product, with a vector of same type.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
reco::SoftLeptonTagInfo tag(const edm::RefToBase< reco::Jet > &jet, const reco::TrackRefVector &tracks, const Leptons &leptons, const reco::Vertex &primaryVertex, const TransientTrackBuilder &builder) const
Definition: SoftLepton.cc:370
const edm::InputTag m_jets
Definition: SoftLepton.cc:102
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: SoftLepton.cc:510
const edm::EDGetTokenT< edm::View< reco::Track > > token_tracks
Definition: SoftLepton.cc:111
edm::View< reco::Electron > ElectronView
Definition: SoftLepton.cc:148
T x() const
Definition: PV3DBase.h:59
const edm::EDPutTokenT< reco::SoftLeptonTagInfoCollection > token_put
Definition: SoftLepton.cc:120
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
tuple size
Write out results.
const edm::EDGetTokenT< reco::JetTracksAssociationCollection > token_jtas
Definition: SoftLepton.cc:103
Global3DVector GlobalVector
Definition: GlobalVector.h:10
static double boostedPPar(const math::XYZVector &vector, const math::XYZVector &axis)
Definition: SoftLepton.cc:499