CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SoftLepton.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SoftLepton
4 // Class: SoftLepton
5 //
13 // Original Author: fwyzard
14 // Created: Wed Oct 18 18:02:07 CEST 2006
15 
16 
17 #include <memory>
18 #include <string>
19 #include <utility>
20 #include <cmath>
21 
23 
24 // ROOT::Math vectors (aka math::XYZVector)
26 #include "Math/GenVector/PxPyPzM4D.h"
27 #include "Math/GenVector/VectorUtil.h"
28 #include "Math/GenVector/Boost.h"
29 
31 
36 #include "SoftLepton.h"
37 
38 enum AxisType {
39  AXIS_CALORIMETRIC = 0, // use the calorimietric jet axis
40  AXIS_CHARGED_AVERAGE = 1, // refine jet axis using charged tracks: use a pT-weighted average of (eta, phi)
41  AXIS_CHARGED_AVERAGE_NOLEPTON = 2, // as above, without the tagging lepton track
42  AXIS_CHARGED_SUM = 3, // refine jet axis using charged tracks: use the sum of tracks momentum
43  AXIS_CHARGED_SUM_NOLEPTON = 4, // as above, without the tagging lepton track
44  AXIS_CALORIMETRIC_NOLEPTON = 5 // use the calorimetric jet axis minus the lepton momentum
45 };
46 
47 using namespace std;
48 using namespace edm;
49 using namespace reco;
50 using namespace ROOT::Math::VectorUtil;
51 
55 
56 // ------------ static copy of the nominal beamspot --------------------------------------
58  reco::Vertex::Point( 0, 0, 0 ),
59  reco::Vertex::Error( ROOT::Math::SVector<double,6>( 0.0015 * 0.0015, // 0.0, 0.0
60  0.0, 0.0015 * 0.0015, // 0.0
61  0.0, 0.0, 15. * 15. ) ),
62  1, 1, 0 );
63 
64 // ------------ c'tor --------------------------------------------------------------------
66  m_jets( iConfig.getParameter<edm::InputTag>( "jets" ) ),
67  token_jtas( mayConsume<reco::JetTracksAssociationCollection>( iConfig.getParameter<edm::InputTag>( "jets" ) ) ),
68  token_jets( mayConsume<edm::View<reco::Jet> >( iConfig.getParameter<edm::InputTag>( "jets" ) ) ),
69  token_primaryVertex( consumes<reco::VertexCollection>( iConfig.getParameter<edm::InputTag>( "primaryVertex" ) ) ),
70  m_leptons( iConfig.getParameter<edm::InputTag>( "leptons" ) ),
71  token_gsfElectrons( mayConsume<GsfElectronView>( iConfig.getParameter<edm::InputTag>( "leptons" ) ) ),
72  token_electrons( mayConsume<ElectronView>( iConfig.getParameter<edm::InputTag>( "leptons" ) ) ),
73  token_pfElectrons( mayConsume<reco::PFCandidateCollection>( iConfig.getParameter<edm::InputTag>( "leptons" ) ) ),
74  token_muons( mayConsume<MuonView>( iConfig.getParameter<edm::InputTag>( "leptons" ) ) ),
75  token_tracks( mayConsume<edm::View<reco::Track> >( iConfig.getParameter<edm::InputTag>( "leptons" ) ) ),
76  m_leptonCands( iConfig.exists("leptonCands") ? iConfig.getParameter<edm::InputTag>( "leptonCands" ) : edm::InputTag() ),
77  token_leptonCands( mayConsume<edm::ValueMap<float> >( iConfig.exists("leptonCands") ? iConfig.getParameter<edm::InputTag>( "leptonCands" ) : edm::InputTag() ) ),
78  m_leptonId( iConfig.exists("leptonId") ? iConfig.getParameter<edm::InputTag>( "leptonId" ) : edm::InputTag() ),
79  token_leptonId( mayConsume<edm::ValueMap<float> >( iConfig.exists("leptonId") ? iConfig.getParameter<edm::InputTag>( "leptonId" ) : edm::InputTag() ) ),
80  m_transientTrackBuilder( 0 ),
81  m_refineJetAxis( iConfig.getParameter<unsigned int>( "refineJetAxis" ) ),
82  m_deltaRCut( iConfig.getParameter<double>( "leptonDeltaRCut" ) ),
83  m_chi2Cut( iConfig.getParameter<double>( "leptonChi2Cut" ) ),
84  m_muonSelection( (muon::SelectionType) iConfig.getParameter<unsigned int>( "muonSelection" ) )
85 {
86  produces<reco::SoftLeptonTagInfoCollection>();
87 }
88 
89 // ------------ d'tor --------------------------------------------------------------------
91 }
92 
93 // ------------ method called once per event during the event loop -----------------------
94 void
96 
97  // grab a TransientTrack helper from the Event Setup
99  setup.get<TransientTrackRecord>().get( "TransientTrackBuilder", builder );
100  m_transientTrackBuilder = builder.product();
101 
102  // input objects
103 
104  // input jets (and possibly tracks)
105  ProductID jets_id;
106  std::vector<edm::RefToBase<reco::Jet> > jets;
107  std::vector<reco::TrackRefVector> tracks;
108  do { {
109  // look for a JetTracksAssociationCollection
111  event.getByToken(token_jtas, h_jtas);
112  if (h_jtas.isValid()) {
113  unsigned int size = h_jtas->size();
114  jets.resize(size);
115  tracks.resize(size);
116  for (unsigned int i = 0; i < size; ++i) {
117  jets[i] = (*h_jtas)[i].first;
118  tracks[i] = (*h_jtas)[i].second;
119  }
120  break;
121  }
122  } { // else...
123  // look for a View<Jet>
125  event.getByToken(token_jets, h_jets);
126  if (h_jets.isValid()) {
127  unsigned int size = h_jets->size();
128  jets.resize(size);
129  tracks.resize(size);
130  for (unsigned int i = 0; i < h_jets->size(); i++)
131  jets[i] = h_jets->refAt(i);
132  break;
133  }
134  } { // else...
135  throw edm::Exception(edm::errors::NotFound) << "Object " << m_jets << " of type among (\"reco::JetTracksAssociationCollection\", \"edm::View<reco::Jet>\") not found";
136  } } while (false);
137 
138  // input primary vetex
139  reco::Vertex vertex;
140  Handle<reco::VertexCollection> h_primaryVertex;
141  event.getByToken(token_primaryVertex, h_primaryVertex);
142  if (h_primaryVertex.isValid() and not h_primaryVertex->empty())
143  vertex = h_primaryVertex->front();
144  else
145  // fall back to nominal beam spot
146  vertex = s_nominalBeamSpot;
147 
148  // input leptons (can be of different types)
150 
151  Handle<edm::ValueMap<float> > h_leptonCands;
152  bool haveLeptonCands = !(m_leptonCands == edm::InputTag());
153  if (haveLeptonCands)
154  event.getByToken(token_leptonCands, h_leptonCands);
155 
156  // try to access the input collection as a collection of GsfElectrons, Muons or Tracks
157 
158  unsigned int leptonId = SoftLeptonProperties::Quality::leptonId;
159  do { {
160  // look for View<GsfElectron>
161  Handle<GsfElectronView> h_electrons;
162  event.getByToken(token_gsfElectrons, h_electrons);
163 
164  if (h_electrons.isValid()) {
165  leptonId = SoftLeptonProperties::Quality::egammaElectronId;
166  for (GsfElectronView::const_iterator electron = h_electrons->begin(); electron != h_electrons->end(); ++electron) {
167  LeptonIds &id = leptons[reco::TrackBaseRef(electron->gsfTrack())];
168  id[SoftLeptonProperties::Quality::pfElectronId] = electron->mva_e_pi();
169  if (haveLeptonCands)
170  id[SoftLeptonProperties::Quality::btagElectronCands] = (*h_leptonCands)[h_electrons->refAt(electron - h_electrons->begin())];
171  }
172  break;
173  }
174  } { // else
175  // look for View<Electron>
176  // FIXME: is this obsolete?
177  Handle<ElectronView> h_electrons;
178  event.getByToken(token_electrons, h_electrons);
179  if (h_electrons.isValid()) {
180  leptonId = SoftLeptonProperties::Quality::egammaElectronId;
181  for (ElectronView::const_iterator electron = h_electrons->begin(); electron != h_electrons->end(); ++electron) {
182  LeptonIds &id = leptons[reco::TrackBaseRef(electron->track())];
183  if (haveLeptonCands)
184  id[SoftLeptonProperties::Quality::btagElectronCands] = (*h_leptonCands)[h_electrons->refAt(electron - h_electrons->begin())];
185  }
186  break;
187  }
188  } { // else
189  // look for PFElectrons
190  // FIXME: is this obsolete?
192  event.getByToken(token_pfElectrons, h_electrons);
193  if (h_electrons.isValid()) {
194  leptonId = SoftLeptonProperties::Quality::egammaElectronId;
195  for (reco::PFCandidateCollection::const_iterator electron = h_electrons->begin(); electron != h_electrons->end(); ++electron) {
196  LeptonIds *id;
197  if (electron->gsfTrackRef().isNonnull())
198  id = &leptons[reco::TrackBaseRef(electron->gsfTrackRef())];
199  else if (electron->trackRef().isNonnull())
200  id = &leptons[reco::TrackBaseRef(electron->trackRef())];
201  else
202  continue;
203  (*id)[SoftLeptonProperties::Quality::pfElectronId] = electron->mva_e_pi();
204  if (haveLeptonCands)
205  (*id)[SoftLeptonProperties::Quality::btagElectronCands] = (*h_leptonCands)[reco::PFCandidateRef(h_electrons, electron - h_electrons->begin())];
206  }
207  break;
208  }
209  } { // else
210  // look for View<Muon>
211  Handle<MuonView> h_muons;
212  event.getByToken(token_muons, h_muons);
213  if (h_muons.isValid()) {
214  for (MuonView::const_iterator muon = h_muons->begin(); muon != h_muons->end(); ++muon) {
215  // FIXME -> turn this selection into a muonCands input?
217  LeptonIds *id;
218  if (muon->globalTrack().isNonnull())
219  id = &leptons[reco::TrackBaseRef(muon->globalTrack())];
220  else if (muon->innerTrack().isNonnull())
221  id = &leptons[reco::TrackBaseRef(muon->innerTrack())];
222  else if (muon->outerTrack().isNonnull())
223  // does this makes sense ?
224  id = &leptons[reco::TrackBaseRef(muon->outerTrack())];
225  else
226  continue;
227  if (haveLeptonCands)
228  (*id)[SoftLeptonProperties::Quality::btagMuonCands] = (*h_leptonCands)[h_muons->refAt(muon - h_muons->begin())];
229  }
230  }
231  break;
232  }
233  } { // else
234  // look for edm::View<Track>
236  event.getByToken(token_tracks, h_tracks);
237  if (h_tracks.isValid()) {
238  for (unsigned int i = 0; i < h_tracks->size(); i++) {
239  LeptonIds &id = leptons[h_tracks->refAt(i)];
240  if (haveLeptonCands)
241  id[SoftLeptonProperties::Quality::btagLeptonCands] = (*h_leptonCands)[h_tracks->refAt(i)];
242  }
243  break;
244  }
245  } { // else
246  throw edm::Exception(edm::errors::NotFound) << "Object " << m_leptons << " of type among (\"edm::View<reco::GsfElectron>\", \"edm::View<reco::Muon>\", \"edm::View<reco::Track>\") !found";
247  } } while (false);
248 
249  if (!(m_leptonId == edm::InputTag())) {
250  Handle<edm::ValueMap<float> > h_leptonId;
251  event.getByToken(token_leptonId, h_leptonId);
252 
253  for (Leptons::iterator lepton = leptons.begin(); lepton != leptons.end(); ++lepton)
254  lepton->second[leptonId] = (*h_leptonId)[lepton->first];
255  }
256 
257  // output collections
258  std::auto_ptr<reco::SoftLeptonTagInfoCollection> outputCollection( new reco::SoftLeptonTagInfoCollection() );
259  for (unsigned int i = 0; i < jets.size(); ++i) {
260  reco::SoftLeptonTagInfo result = tag( jets[i], tracks[i], leptons, vertex );
261  outputCollection->push_back( result );
262  }
263  event.put( outputCollection );
264 }
265 
266 // ---------------------------------------------------------------------------------------
270  const Leptons & leptons,
272 ) const {
274  info.setJetRef( jet );
275 
276  for(Leptons::const_iterator lepton = leptons.begin(); lepton != leptons.end(); ++lepton) {
277  const math::XYZVector & lepton_momentum = lepton->first->momentum();
278  if (m_chi2Cut > 0.0 && lepton->first->normalizedChi2() > m_chi2Cut)
279  continue;
280 
281  const GlobalVector jetAxis = refineJetAxis( jet, tracks, lepton->first );
282  const math::XYZVector axis( jetAxis.x(), jetAxis.y(), jetAxis.z());
283  float deltaR = Geom::deltaR(lepton_momentum, axis);
284  if (deltaR > m_deltaRCut)
285  continue;
286 
287  reco::SoftLeptonProperties properties;
288 
289  reco::TransientTrack transientTrack = m_transientTrackBuilder->build(*lepton->first);
290  properties.sip2d = IPTools::signedTransverseImpactParameter( transientTrack, jetAxis, primaryVertex ).second.significance();
291  properties.sip3d = IPTools::signedImpactParameter3D( transientTrack, jetAxis, primaryVertex ).second.significance();
292  properties.deltaR = deltaR;
293  properties.ptRel = Perp( lepton_momentum, axis );
294  properties.p0Par = boostedPPar( lepton_momentum, axis );
295  properties.etaRel = relativeEta( lepton_momentum, axis );
296  properties.ratio = lepton_momentum.R() / axis.R();
297  properties.ratioRel = lepton_momentum.Dot(axis) / axis.Mag2();
298 
299  for(LeptonIds::const_iterator iter = lepton->second.begin(); iter != lepton->second.end(); ++iter)
300  properties.setQuality(static_cast<SoftLeptonProperties::Quality::Generic>(iter->first), iter->second);
301 
302  info.insert( lepton->first, properties );
303  }
304 
305  return info;
306 }
307 
308 
309 // ---------------------------------------------------------------------------------------
313  const reco::TrackBaseRef & exclude /* = reco::TrackBaseRef() */
314 ) const {
315  math::XYZVector axis = jet->momentum();
316 
319 
320  double sum_pT = 0.;
321  double sum_eta_by_pT = 0.;
322  double sum_phi_by_pT = 0.;
323 
324  double perp;
325  double phi_rel;
326  double eta_rel;
327 
328  // refine jet eta and phi with charged tracks measurements, if available
329  for (reco::TrackRefVector::const_iterator track_it = tracks.begin(); track_it != tracks.end(); ++track_it ) {
330  const reco::Track & track = **track_it;
331 
332  perp = track.pt();
333  eta_rel = (double) track.eta() - axis.eta();
334  phi_rel = (double) track.phi() - axis.phi();
335  while (phi_rel < -M_PI) phi_rel += 2*M_PI;
336  while (phi_rel > M_PI) phi_rel -= 2*M_PI;
337 
338  sum_pT += perp;
339  sum_phi_by_pT += perp * phi_rel;
340  sum_eta_by_pT += perp * eta_rel;
341  }
342 
343  // "remove" excluded track
345  const reco::Track & track = *exclude;
346 
347  perp = track.pt();
348  eta_rel = (double) track.eta() - axis.eta();
349  phi_rel = (double) track.phi() - axis.phi();
350  while (phi_rel < -M_PI) phi_rel += 2*M_PI;
351  while (phi_rel > M_PI) phi_rel -= 2*M_PI;
352 
353  sum_pT -= perp;
354  sum_phi_by_pT -= perp * phi_rel;
355  sum_eta_by_pT -= perp * eta_rel;
356  }
357 
358  if (sum_pT > 1.) // avoid the case of only the lepton-track with small rounding errors
359  axis = math::RhoEtaPhiVector( axis.rho(), axis.eta() + sum_eta_by_pT / sum_pT, axis.phi() + sum_phi_by_pT / sum_pT);
360 
361  } else if (m_refineJetAxis == AXIS_CHARGED_SUM or
363  math::XYZVector sum;
364 
365  // recalculate the jet direction as the sum of charget tracks momenta
366  for (reco::TrackRefVector::const_iterator track_it = tracks.begin(); track_it != tracks.end(); ++track_it ) {
367  const reco::Track & track = **track_it;
368  sum += track.momentum();
369  }
370 
371  // "remove" excluded track
372  if (m_refineJetAxis == AXIS_CHARGED_SUM_NOLEPTON and exclude.isNonnull()) {
373  const reco::Track & track = *exclude;
374  sum -= track.momentum();
375  }
376 
377  if (sum.R() > 1.) // avoid the case of only the lepton-track with small rounding errors
378  axis = sum;
380  axis -= exclude->momentum();
381  }
382 
383  return GlobalVector(axis.x(), axis.y(), axis.z());
384 }
385 
386 double SoftLepton::relativeEta(const math::XYZVector& vector, const math::XYZVector& axis) {
387  double mag = vector.r() * axis.r();
388  double dot = vector.Dot(axis);
389  return -log((mag - dot)/(mag + dot)) / 2;
390 }
391 
392 // compute the lepton momentum along the jet axis, in the jet rest frame
393 double SoftLepton::boostedPPar(const math::XYZVector& vector, const math::XYZVector& axis) {
394  static const double lepton_mass = 0.00; // assume a massless (ultrarelativistic) lepton
395  static const double jet_mass = 5.279; // use B±/B0 mass as the jet rest mass [PDG 2007 updates]
396  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<double> > lepton(vector.Dot(axis) / axis.r(), Perp(vector, axis), 0., lepton_mass);
397  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<double> > jet( axis.r(), 0., 0., jet_mass );
398  ROOT::Math::BoostX boost( -jet.Beta() );
399  return boost(lepton).x();
400 }
int i
Definition: DBlmapReader.cc:9
const edm::EDGetTokenT< reco::PFCandidateCollection > token_pfElectrons
Definition: SoftLepton.h:104
static const TGPicture * info(bool iBackgroundIsBlack)
edm::View< reco::Muon > MuonView
Definition: SoftLepton.cc:54
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())
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:50
const edm::EDGetTokenT< edm::ValueMap< float > > token_leptonCands
Definition: SoftLepton.h:108
virtual Vector momentum() const
spatial momentum vector
reco::TransientTrack build(const reco::Track *p) const
T y() const
Definition: PV3DBase.h:63
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:43
std::pair< bool, Measurement1D > signedImpactParameter3D(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:71
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:693
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
const edm::EDGetTokenT< edm::ValueMap< float > > token_leptonId
Definition: SoftLepton.h:110
bool isNonnull() const
Checks for non-null.
Definition: RefToBase.h:280
const edm::EDGetTokenT< edm::View< reco::Muon > > token_muons
Definition: SoftLepton.h:105
void setJetRef(const edm::Ref< T > &jetRef)
Definition: JetTagInfo.h:25
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:723
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:249
const edm::EDGetTokenT< edm::View< reco::Electron > > token_electrons
Definition: SoftLepton.h:103
RhoEtaPhiVectorD RhoEtaPhiVector
spatial vector with cylindrical internal representation using pseudorapidity
Definition: Vector3D.h:32
double m_chi2Cut
Definition: SoftLepton.h:118
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:244
const edm::EDGetTokenT< edm::View< reco::GsfElectron > > token_gsfElectrons
Definition: SoftLepton.h:102
SelectionType
Selector type.
Definition: MuonSelectors.h:17
void setQuality(Quality::Generic qual, float value)
std::vector< SoftLeptonTagInfo > SoftLeptonTagInfoCollection
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:699
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
Definition: TrackFwd.h:31
const edm::InputTag m_leptons
Definition: SoftLepton.h:101
static double relativeEta(const math::XYZVector &vector, const math::XYZVector &axis)
Definition: SoftLepton.cc:386
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:310
vector< PseudoJet > jets
double pt() const
track transverse momentum
Definition: TrackBase.h:669
T z() const
Definition: PV3DBase.h:64
tuple result
Definition: query.py:137
math::XYZPoint Point
point in the space
Definition: Vertex.h:39
const edm::EDGetTokenT< reco::VertexCollection > token_primaryVertex
Definition: SoftLepton.h:100
AxisType
Definition: SoftLepton.cc:38
const edm::InputTag m_leptonId
Definition: SoftLepton.h:109
edm::Ref< PFCandidateCollection > PFCandidateRef
persistent reference to a PFCandidate
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
bool isValid() const
Definition: HandleBase.h:76
double m_deltaRCut
Definition: SoftLepton.h:117
#define M_PI
const edm::InputTag m_leptonCands
Definition: SoftLepton.h:107
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
unsigned int m_refineJetAxis
Definition: SoftLepton.h:116
void insert(const REF &lepton, const SoftLeptonProperties &properties)
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
reco::SoftLeptonTagInfo tag(const edm::RefToBase< reco::Jet > &jet, const reco::TrackRefVector &tracks, const Leptons &leptons, const reco::Vertex &primaryVertex) const
Definition: SoftLepton.cc:267
const edm::EDGetTokenT< edm::View< reco::Jet > > token_jets
Definition: SoftLepton.h:99
tuple tracks
Definition: testEve_cfg.py:39
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
const T & get() const
Definition: EventSetup.h:55
SoftLepton(const edm::ParameterSet &iConfig)
Definition: SoftLepton.cc:65
T const * product() const
Definition: ESHandle.h:86
std::map< unsigned int, float > LeptonIds
Definition: SoftLepton.h:63
edm::View< reco::GsfElectron > GsfElectronView
Definition: SoftLepton.cc:52
static const reco::Vertex s_nominalBeamSpot
Definition: SoftLepton.h:124
muon::SelectionType m_muonSelection
Definition: SoftLepton.h:121
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:81
std::map< edm::RefToBase< reco::Track >, LeptonIds, TrackCompare > Leptons
Definition: SoftLepton.h:64
const edm::InputTag m_jets
Definition: SoftLepton.h:97
const TransientTrackBuilder * m_transientTrackBuilder
Definition: SoftLepton.h:113
const edm::EDGetTokenT< edm::View< reco::Track > > token_tracks
Definition: SoftLepton.h:106
edm::View< reco::Electron > ElectronView
Definition: SoftLepton.cc:53
virtual void produce(edm::Event &event, const edm::EventSetup &setup)
Definition: SoftLepton.cc:95
T x() const
Definition: PV3DBase.h:62
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
const edm::EDGetTokenT< reco::JetTracksAssociationCollection > token_jtas
Definition: SoftLepton.h:98
Global3DVector GlobalVector
Definition: GlobalVector.h:10
static double boostedPPar(const math::XYZVector &vector, const math::XYZVector &axis)
Definition: SoftLepton.cc:393