27 #include "Math/GenVector/PxPyPzM4D.h" 28 #include "Math/GenVector/VectorUtil.h" 29 #include "Math/GenVector/Boost.h" 62 0.0, 0.0, 15. * 15. ) ),
67 m_jets( iConfig.getParameter<
edm::
InputTag>(
"jets" ) ),
71 m_leptons( iConfig.getParameter<
edm::
InputTag>(
"leptons" ) ),
77 m_leptonCands( iConfig.exists(
"leptonCands") ? iConfig.getParameter<
edm::
InputTag>(
"leptonCands" ) :
edm::
InputTag() ),
79 m_leptonId( iConfig.exists(
"leptonId") ? iConfig.getParameter<
edm::
InputTag>(
"leptonId" ) :
edm::
InputTag() ),
81 m_transientTrackBuilder( 0 ),
82 m_refineJetAxis( iConfig.getParameter<unsigned
int>(
"refineJetAxis" ) ),
83 m_deltaRCut( iConfig.getParameter<double>(
"leptonDeltaRCut" ) ),
84 m_chi2Cut( iConfig.getParameter<double>(
"leptonChi2Cut" ) ),
87 produces<reco::SoftLeptonTagInfoCollection>();
107 std::vector<edm::RefToBase<reco::Jet> >
jets;
108 std::vector<reco::TrackRefVector>
tracks;
117 for (
unsigned int i = 0;
i <
size; ++
i) {
118 jets[
i] = (*h_jtas)[
i].first;
119 tracks[
i] = (*h_jtas)[
i].second;
128 unsigned int size = h_jets->size();
131 for (
unsigned int i = 0;
i < h_jets->size();
i++)
132 jets[
i] = h_jets->refAt(
i);
143 if (h_primaryVertex.
isValid() and not h_primaryVertex->empty())
144 vertex = h_primaryVertex->front();
166 leptonId = SoftLeptonProperties::Quality::egammaElectronId;
169 id[SoftLeptonProperties::Quality::pfElectronId] =
electron->mva_e_pi();
171 id[SoftLeptonProperties::Quality::btagElectronCands] = (*h_leptonCands)[h_electrons->
refAt(
electron - h_electrons->
begin())];
181 leptonId = SoftLeptonProperties::Quality::egammaElectronId;
185 id[SoftLeptonProperties::Quality::btagElectronCands] = (*h_leptonCands)[h_electrons->
refAt(
electron - h_electrons->
begin())];
195 leptonId = SoftLeptonProperties::Quality::egammaElectronId;
196 for (reco::PFCandidateCollection::const_iterator
electron = h_electrons->begin();
electron != h_electrons->end(); ++
electron) {
198 if (
electron->gsfTrackRef().isNonnull())
200 else if (
electron->trackRef().isNonnull())
204 (*id)[SoftLeptonProperties::Quality::pfElectronId] =
electron->mva_e_pi();
206 (*id)[SoftLeptonProperties::Quality::btagElectronCands] = (*h_leptonCands)[
reco::PFCandidateRef(h_electrons,
electron - h_electrons->begin())];
219 if (
muon->globalTrack().isNonnull())
221 else if (
muon->innerTrack().isNonnull())
223 else if (
muon->outerTrack().isNonnull())
229 (*id)[SoftLeptonProperties::Quality::btagMuonCands] = (*h_leptonCands)[h_muons->
refAt(
muon - h_muons->
begin())];
239 for (
unsigned int i = 0;
i < h_tracks->size();
i++) {
242 id[SoftLeptonProperties::Quality::btagLeptonCands] = (*h_leptonCands)[h_tracks->refAt(
i)];
254 for (Leptons::iterator lepton = leptons.begin(); lepton != leptons.end(); ++lepton)
255 lepton->second[leptonId] = (*h_leptonId)[lepton->first];
259 auto outputCollection = std::make_unique<reco::SoftLeptonTagInfoCollection>();
260 for (
unsigned int i = 0;
i < jets.size(); ++
i) {
262 outputCollection->push_back( result );
277 for(Leptons::const_iterator lepton = leptons.begin(); lepton != leptons.end(); ++lepton) {
298 properties.
ptRel = Perp( lepton_momentum, axis );
301 properties.
ratio = lepton_momentum.R() / axis.R();
302 properties.
ratioRel = lepton_momentum.Dot(axis) / axis.Mag2();
304 for(LeptonIds::const_iterator iter = lepton->second.begin(); iter != lepton->second.end(); ++iter)
305 properties.
setQuality(static_cast<SoftLeptonProperties::Quality::Generic>(iter->first), iter->second);
307 info.
insert( lepton->first, properties );
326 double sum_eta_by_pT = 0.;
327 double sum_phi_by_pT = 0.;
338 eta_rel = (double) track.
eta() - axis.eta();
339 phi_rel = (double) track.
phi() - axis.phi();
340 while (phi_rel < -
M_PI) phi_rel += 2*
M_PI;
341 while (phi_rel >
M_PI) phi_rel -= 2*
M_PI;
344 sum_phi_by_pT += perp * phi_rel;
345 sum_eta_by_pT += perp * eta_rel;
353 eta_rel = (double) track.
eta() - axis.eta();
354 phi_rel = (double) track.
phi() - axis.phi();
355 while (phi_rel < -
M_PI) phi_rel += 2*
M_PI;
356 while (phi_rel >
M_PI) phi_rel -= 2*
M_PI;
359 sum_phi_by_pT -= perp * phi_rel;
360 sum_eta_by_pT -= perp * eta_rel;
364 axis =
math::RhoEtaPhiVector( axis.rho(), axis.eta() + sum_eta_by_pT / sum_pT, axis.phi() + sum_phi_by_pT / sum_pT);
392 double mag = vector.r() * axis.r();
393 double dot = vector.Dot(axis);
394 return -
log((mag - dot)/(mag + dot)) / 2;
399 static const double lepton_mass = 0.00;
400 static const double jet_mass = 5.279;
401 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<double> > lepton(vector.Dot(axis) / axis.r(), Perp(vector, axis), 0., lepton_mass);
402 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<double> >
jet( axis.r(), 0., 0., jet_mass );
403 ROOT::Math::BoostX
boost( -
jet.Beta() );
404 return boost(lepton).x();
412 desc.
add<
unsigned int>(
"muonSelection",1);
417 desc.
add<
unsigned int>(
"refineJetAxis",0);
419 desc.
add<
double>(
"leptonDeltaRCut",0.4);
420 desc.
add<
double>(
"leptonChi2Cut",9999.0);
const edm::EDGetTokenT< reco::PFCandidateCollection > token_pfElectrons
edm::View< reco::Muon > MuonView
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
const edm::EDGetTokenT< edm::ValueMap< float > > token_leptonCands
reco::TransientTrack build(const reco::Track *p) const
math::Error< dimension >::type Error
covariance error matrix (3x3)
def setup(process, global_tag, zero_tesla=False)
double phi() const
azimuthal angle of momentum vector
std::vector< Vertex > VertexCollection
collection of Vertex objects
const edm::EDGetTokenT< edm::ValueMap< float > > token_leptonId
bool isNonnull() const
Checks for non-null.
const edm::EDGetTokenT< edm::View< reco::Muon > > token_muons
void setJetRef(const edm::Ref< T > &jetRef)
const Vector & momentum() const
track momentum vector
const_iterator end() const
Termination of iteration.
const edm::EDGetTokenT< edm::View< reco::Electron > > token_electrons
RhoEtaPhiVectorD RhoEtaPhiVector
spatial vector with cylindrical internal representation using pseudorapidity
const_iterator begin() const
Initialize an iterator over the RefVector.
const edm::EDGetTokenT< edm::View< reco::GsfElectron > > token_gsfElectrons
SelectionType
Selector type.
void setQuality(Quality::Generic qual, float value)
RefToBase< value_type > refAt(size_type i) const
Vector momentum() const final
spatial momentum vector
double eta() const
pseudorapidity of momentum vector
void addDefault(ParameterSetDescription const &psetDescription)
const_iterator begin() const
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
const edm::InputTag m_leptons
static double relativeEta(const math::XYZVector &vector, const math::XYZVector &axis)
GlobalVector refineJetAxis(const edm::RefToBase< reco::Jet > &jet, const reco::TrackRefVector &tracks, const edm::RefToBase< reco::Track > &exclude=edm::RefToBase< reco::Track >()) const
double pt() const
track transverse momentum
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::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
math::XYZPoint Point
point in the space
const edm::EDGetTokenT< reco::VertexCollection > token_primaryVertex
const edm::InputTag m_leptonId
edm::Ref< PFCandidateCollection > PFCandidateRef
persistent reference to a PFCandidate
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const edm::InputTag m_leptonCands
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)
unsigned int m_refineJetAxis
void insert(const REF &lepton, const SoftLeptonProperties &properties)
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
double significance() const
reco::SoftLeptonTagInfo tag(const edm::RefToBase< reco::Jet > &jet, const reco::TrackRefVector &tracks, const Leptons &leptons, const reco::Vertex &primaryVertex) const
const edm::EDGetTokenT< edm::View< reco::Jet > > token_jets
XYZVectorD XYZVector
spatial vector with cartesian internal representation
SoftLepton(const edm::ParameterSet &iConfig)
std::map< unsigned int, float > LeptonIds
edm::View< reco::GsfElectron > GsfElectronView
static const reco::Vertex s_nominalBeamSpot
muon::SelectionType m_muonSelection
T perp() const
Magnitude of transverse component.
T dot(const Basic3DVector &v) const
Scalar product, or "dot" product, with a vector of same type.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
std::map< edm::RefToBase< reco::Track >, LeptonIds, TrackCompare > Leptons
const edm::InputTag m_jets
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const_iterator end() const
const TransientTrackBuilder * m_transientTrackBuilder
const edm::EDGetTokenT< edm::View< reco::Track > > token_tracks
edm::View< reco::Electron > ElectronView
virtual void produce(edm::Event &event, const edm::EventSetup &setup)
T const * product() const
const edm::EDGetTokenT< reco::JetTracksAssociationCollection > token_jtas
Global3DVector GlobalVector
static double boostedPPar(const math::XYZVector &vector, const math::XYZVector &axis)