54 double ux = TMath::Cos(refP4.phi())*TMath::Sin(refP4.theta());
55 double uy = TMath::Sin(refP4.phi())*TMath::Sin(refP4.theta());
56 double uz = TMath::Cos(refP4.theta());
84 bool isMuonRadiation =
false;
87 pfCandidate != pfCandidatesNoPU->end(); ++pfCandidate ) {
89 double dRmuPlus =
deltaR((*pfCandidate)->p4(), muPlus->
p4());
90 if (
checkMuonRadiation((*pfCandidate)->p4(), &caloP4muPlus, dRmuPlus, *pfCandidatesNoPU, *pfCandidatesPU, *muPlus, *muMinus) ) isMuonRadiation =
true;
91 double dRmuMinus =
deltaR((*pfCandidate)->p4(), muMinus->
p4());
92 if (
checkMuonRadiation((*pfCandidate)->p4(), &caloP4muMinus, dRmuMinus, *pfCandidatesNoPU, *pfCandidatesPU, *muPlus, *muMinus) ) isMuonRadiation =
true;
96 if (
checkMuonRadiation(caloP4muPlus, 0, 0., *pfCandidatesNoPU, *pfCandidatesPU, *muPlus, *muMinus) ) isMuonRadiation =
true;
97 if (
checkMuonRadiation(caloP4muMinus, 0, 0., *pfCandidatesNoPU, *pfCandidatesPU, *muPlus, *muMinus) ) isMuonRadiation =
true;
102 if (
invert_ != isMuonRadiation )
return false;
105 std::auto_ptr<bool> filter_result(
new bool(
invert_ != !isMuonRadiation));
106 evt.
put(filter_result);
113 double caloEnECAL = 0.;
115 pfCandidate != pfCandidates.
end(); ++pfCandidate ) {
116 double dR =
deltaR(refP4, (*pfCandidate)->p4());
118 caloEnECAL += (*pfCandidate)->ecalEnergy();
127 double& pfChargedCandIsoSum,
double& pfGammaIsoSum,
double& pfNeutralHadronIsoSum)
129 pfChargedCandIsoSum = 0.;
131 pfNeutralHadronIsoSum = 0.;
133 pfCandidate != pfCandidates.
end(); ++pfCandidate ) {
134 double dR =
deltaR(refP4, (*pfCandidate)->p4());
140 double dRmuPlus =
deltaR(muPlusP4, (*pfCandidate)->p4());
142 double dRmuMinus =
deltaR(muMinusP4, (*pfCandidate)->p4());
145 if ( isVeto )
continue;
146 if (
TMath::Abs((*pfCandidate)->charge()) > 0.5 ) {
147 if (
verbosity_ )
std::cout <<
" adding PFChargedCand: Pt = " << (*pfCandidate)->pt() <<
", eta = " << (*pfCandidate)->eta() <<
", phi = " << (*pfCandidate)->phi() <<
" (dR = " << dR <<
")" << std::endl;
148 pfChargedCandIsoSum += (*pfCandidate)->pt();
150 if (
verbosity_ )
std::cout <<
" adding PFGamma: Pt = " << (*pfCandidate)->pt() <<
", eta = " << (*pfCandidate)->eta() <<
", phi = " << (*pfCandidate)->phi() <<
" (dR = " << dR <<
")" << std::endl;
151 pfGammaIsoSum += (*pfCandidate)->pt();
153 if (
verbosity_ )
std::cout <<
" adding PFNeutralHadron: Pt = " << (*pfCandidate)->pt() <<
", eta = " << (*pfCandidate)->eta() <<
", phi = " << (*pfCandidate)->phi() <<
" (dR = " << dR <<
")" << std::endl;
154 pfNeutralHadronIsoSum += (*pfCandidate)->pt();
161 const PFView& pfCandidatesNoPU,
const PFView& pfCandidatesPU,
165 double pfChargedCandIsoSumNoPU, pfGammaIsoSumNoPU, pfNeutralHadronIsoSumNoPU;
166 compPFIso_raw(refP4, pfCandidatesNoPU, muPlusP4, muMinusP4, pfChargedCandIsoSumNoPU, pfGammaIsoSumNoPU, pfNeutralHadronIsoSumNoPU);
169 double pfChargedCandIsoSumPU, pfGammaIsoSumPU, pfNeutralHadronIsoSumPU;
170 compPFIso_raw(refP4, pfCandidatesPU, muPlusP4, muMinusP4, pfChargedCandIsoSumPU, pfGammaIsoSumPU, pfNeutralHadronIsoSumPU);
173 double pfIso = pfChargedCandIsoSumNoPU +
TMath::Max(0., pfGammaIsoSumNoPU + pfNeutralHadronIsoSumNoPU - 0.5*pfChargedCandIsoSumPU);
175 std::cout <<
" pfChargedCandIsoSumNoPU = " << pfChargedCandIsoSumNoPU << std::endl;
176 std::cout <<
" pfGammaIsoSumNoPU = " << pfGammaIsoSumNoPU << std::endl;
177 std::cout <<
" pfNeutralHadronIsoSumNoPU = " << pfNeutralHadronIsoSumNoPU << std::endl;
178 std::cout <<
" pfChargedCandIsoSumPU = " << pfChargedCandIsoSumPU << std::endl;
179 std::cout <<
"--> isolation of PFGamma = " << pfIso << std::endl;
189 if ( dynamic_cast<const reco::Muon*>(&muon_candidate) ) {
194 }
else if( dynamic_cast<const reco::PFCandidate*>(&muon_candidate) ) {
205 double muonP = muonTrack->
p();
206 double muonPx = muonP*TMath::Cos(muon_candidate.
phi())*TMath::Sin(muon_candidate.
theta());
207 double muonPy = muonP*TMath::Sin(muon_candidate.
phi())*TMath::Sin(muon_candidate.
theta());
208 double muonPz = muonP*TMath::Cos(muon_candidate.
theta());
210 double muonEn = TMath::Sqrt(muonP*muonP + muonMass*muonMass);
213 std::cout <<
"muon (original): Pt = " << muon_candidate.
pt() <<
", eta = " << muon_candidate.
eta() <<
", phi = " << muon_candidate.
phi() << std::endl;
214 std::cout <<
"muon (from track): Pt = " << muonP4.pt() <<
", eta = " << muonP4.eta() <<
", phi = " << muonP4.phi() << std::endl;
218 return muon_candidate.
p4();
224 const PFView& pfCandidatesNoPU,
const PFView& pfCandidatesPU,
227 bool isMuonRadiation =
false;
231 double massWithoutPhoton = (muPlusP4_fromTrack + muMinusP4_fromTrack).mass();
235 double massWithPhoton = (muPlusP4_fromTrack + muMinusP4_fromTrack + photonP4sumLow).mass();
237 std::cout <<
"low photon Pt threshold:" << std::endl;
238 std::cout <<
" muon #1:" <<
"Pt = " << muPlusP4_fromTrack.pt() <<
", eta = " << muPlusP4_fromTrack.eta() <<
", phi = " << muPlusP4_fromTrack.phi() << std::endl;
239 std::cout <<
" muon #2:" <<
"Pt = " << muMinusP4_fromTrack.pt() <<
", eta = " << muMinusP4_fromTrack.eta() <<
", phi = " << muMinusP4_fromTrack.phi() << std::endl;
240 std::cout <<
" photon:" <<
"Pt = " << photonP4sumLow.pt() <<
", eta = " << photonP4sumLow.eta() <<
", phi = " << photonP4sumLow.phi() <<
" (dR = " << dR <<
")" << std::endl;
241 std::cout <<
" M(mu+mu) = " << massWithoutPhoton <<
", M(mu+mu+gamma) = " << massWithPhoton << std::endl;
244 double pfIso =
compPFIso_puCorr(photonP4sumLow, pfCandidatesNoPU, pfCandidatesPU, muPlus.
p4(), muMinus.
p4());
245 if ( pfIso < (
maxRelIso_*photonP4sumLow.pt()) ) isMuonRadiation =
true;
251 double massWithPhoton = (muPlusP4_fromTrack + muMinusP4_fromTrack + photonP4sumHigh).mass();
253 std::cout <<
"high photon Pt threshold:" << std::endl;
254 std::cout <<
" muon #1:" <<
"Pt = " << muPlusP4_fromTrack.pt() <<
", eta = " << muPlusP4_fromTrack.eta() <<
", phi = " << muPlusP4_fromTrack.phi() << std::endl;
255 std::cout <<
" muon #2:" <<
"Pt = " << muMinusP4_fromTrack.pt() <<
", eta = " << muMinusP4_fromTrack.eta() <<
", phi = " << muMinusP4_fromTrack.phi() << std::endl;
256 std::cout <<
" photon:" <<
"Pt = " << photonP4sumHigh.pt() <<
", eta = " << photonP4sumHigh.eta() <<
", phi = " << photonP4sumHigh.phi() <<
" (dR = " << dR <<
")" << std::endl;
257 std::cout <<
" M(mu+mu) = " << massWithoutPhoton <<
", M(mu+mu+gamma) = " << massWithPhoton << std::endl;
260 double pfIso =
compPFIso_puCorr(photonP4sumHigh, pfCandidatesNoPU, pfCandidatesPU, muPlus.
p4(), muMinus.
p4());
261 if ( pfIso < (
maxRelIso_*photonP4sumHigh.pt()) ) isMuonRadiation =
true;
265 return isMuonRadiation;
double p() const
momentum vector magnitude
T getParameter(std::string const &) const
reco::CandidateBaseRef getTheMuMinus(const std::vector< reco::CandidateBaseRef > &)
bool isNonnull() const
Checks for non-null.
virtual TrackRef innerTrack() const
virtual double pt() const =0
transverse momentum
#define DEFINE_FWK_MODULE(type)
bool checkMuonRadiation(const reco::Candidate::LorentzVector &, const reco::Candidate::LorentzVector *, double, const PFView &, const PFView &, const reco::Candidate &, const reco::Candidate &)
bool applyMassWindowSelectionHighPt_
virtual const CandidatePtr & masterClonePtr() const =0
bool exists(std::string const ¶meterName) const
checks if a parameter exists
double compCaloEnECAL(const reco::Candidate::LorentzVector &, const PFView &)
void compPFIso_raw(const reco::Candidate::LorentzVector &, const PFView &, const reco::Candidate::LorentzVector &, const reco::Candidate::LorentzVector &, double &, double &, double &)
edm::InputTag srcSelectedMuons_
edm::InputTag srcPFCandsNoPU_
std::vector< PFCandidatePtr > pfCandidates(const PFJet &jet, int particleId, bool sort=true)
reco::TrackRef trackRef() const
virtual bool hasMasterClone() const =0
const_iterator begin() const
virtual double theta() const =0
momentum polar angle
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
double compPFIso_puCorr(const reco::Candidate::LorentzVector &, const PFView &, const PFView &, const reco::Candidate::LorentzVector &, const reco::Candidate::LorentzVector &)
T const * get() const
Returns C++ pointer to the item.
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
reco::MuonRef muonRef() const
double deltaR(double eta1, double eta2, double phi1, double phi2)
virtual bool hasMasterClonePtr() const =0
bool applyMassWindowSelectionLowPt_
bool addCaloEnECALhighPt_
bool isNull() const
Checks for null.
bool filter(edm::Event &, const edm::EventSetup &)
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Particle reconstructed by the particle flow algorithm.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
reco::GsfTrackRef gsfTrackRef() const
const_iterator end() const
std::vector< reco::CandidateBaseRef > getSelMuons(const edm::Event &, const edm::InputTag &)
edm::InputTag srcPFCandsPU_
reco::CandidateBaseRef getTheMuPlus(const std::vector< reco::CandidateBaseRef > &)
virtual double phi() const =0
momentum azimuthal angle
virtual double eta() const =0
momentum pseudorapidity
MuonRadiationFilter(const edm::ParameterSet &)
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector
virtual const CandidateBaseRef & masterClone() const =0