16 if (pfCandPtr->trackRef().isNonnull())
17 return pfCandPtr->trackRef().get();
18 else if (pfCandPtr->gsfTrackRef().isNonnull())
19 return pfCandPtr->gsfTrackRef().get();
34 return pfCandPtr->trackRef();
58 LogDebug(
"TauQCuts") <<
"<ptMin>: Pt = " << track->
pt() <<
", cut = " <<
cut;
59 return (track->
pt() >
cut);
63 LogDebug(
"TauQCuts") <<
"<ptMin_cand>: Pt = " << cand.
pt() <<
", cut = " <<
cut;
64 return (cand.
pt() >
cut);
68 LogDebug(
"TauQCuts") <<
"<etMin_cand>: Et = " << cand.
et() <<
", cut = " <<
cut;
69 return (cand.
et() >
cut);
86 LogDebug(
"TauQCuts") <<
"<trkPixelHits_cand>: #Pxl hits = N/A, cut = " <<
cut;
100 LogDebug(
"TauQCuts") <<
"<trkTrackerHits>: #Trk hits = " <<
track->hitPattern().numberOfValidHits()
101 <<
", cut = " <<
cut;
104 LogDebug(
"TauQCuts") <<
"<trkTrackerHits>: #Trk hits = N/A, cut = " <<
cut;
111 edm::LogError(
"QCutsNoPrimaryVertex") <<
"Primary vertex Ref in " 112 <<
"RecoTauQualityCuts is invalid. - trkTransverseImpactParameter";
115 LogDebug(
"TauQCuts") <<
" track: Pt = " << track->
pt() <<
", eta = " << track->
eta()
116 <<
", phi = " << track->
phi();
117 LogDebug(
"TauQCuts") <<
" vertex: x = " << (*pv)->position().x() <<
", y = " << (*pv)->position().y()
118 <<
", z = " << (*pv)->position().z();
119 LogDebug(
"TauQCuts") <<
"--> dxy = " << std::fabs(track->
dxy((*pv)->position())) <<
" (cut = " << cut <<
")";
120 return (std::fabs(track->
dxy((*pv)->position())) <=
cut);
128 LogDebug(
"TauQCuts") <<
"<trkTransverseImpactParameter_cand>: dXY = N/A, cut = " <<
cut;
135 edm::LogError(
"QCutsNoPrimaryVertex") <<
"Primary vertex Ref in " 136 <<
"RecoTauQualityCuts is invalid. - trkLongitudinalImpactParameter";
139 LogDebug(
"TauQCuts") <<
" track: Pt = " << track->
pt() <<
", eta = " << track->
eta()
140 <<
", phi = " << track->
phi();
141 LogDebug(
"TauQCuts") <<
" vertex: x = " << (*pv)->position().x() <<
", y = " << (*pv)->position().y()
142 <<
", z = " << (*pv)->position().z();
143 LogDebug(
"TauQCuts") <<
"--> dz = " << std::fabs(track->
dz((*pv)->position())) <<
" (cut = " << cut <<
")";
144 return (std::fabs(track->
dz((*pv)->position())) <=
cut);
152 LogDebug(
"TauQCuts") <<
"<trkLongitudinalImpactParameter_cand>: dZ = N/A, cut = " <<
cut;
164 <<
"Lead track Ref in " 165 <<
"RecoTauQualityCuts is invalid. - trkLongitudinalImpactParameterWrtTrack";
168 return (std::fabs(track->
dz((*pv)->position()) - leadTrack->
dz((*pv)->position())) <=
cut);
184 edm::LogError(
"QCutsNoPrimaryVertex") <<
"Primary vertex Ref in " 185 <<
"RecoTauQualityCuts is invalid. - minTrackVertexWeight";
188 LogDebug(
"TauQCuts") <<
" track: Pt = " << track->
pt() <<
", eta = " << track->
eta()
189 <<
", phi = " << track->
phi();
190 LogDebug(
"TauQCuts") <<
" vertex: x = " << (*pv)->position().x() <<
", y = " << (*pv)->position().y()
191 <<
", z = " << (*pv)->position().z();
192 LogDebug(
"TauQCuts") <<
"--> trackWeight = " << (*pv)->trackWeight(track) <<
" (cut = " << cut <<
")";
193 return ((*pv)->trackWeight(track) >=
cut);
198 edm::LogError(
"QCutsNoPrimaryVertex") <<
"Primary vertex Ref in " 199 <<
"RecoTauQualityCuts is invalid. - minTrackVertexWeight";
202 LogDebug(
"TauQCuts") <<
" track: Pt = " << track->pt() <<
", eta = " << track->eta()
203 <<
", phi = " << track->phi();
204 LogDebug(
"TauQCuts") <<
" vertex: x = " << (*pv)->position().x() <<
", y = " << (*pv)->position().y()
205 <<
", z = " << (*pv)->position().z();
206 LogDebug(
"TauQCuts") <<
"--> trackWeight = " << (*pv)->trackWeight(track) <<
" (cut = " << cut <<
")";
207 return ((*pv)->trackWeight(track) >=
cut);
212 edm::LogError(
"QCutsNoPrimaryVertex") <<
"Primary vertex Ref in " 213 <<
"RecoTauQualityCuts is invalid. - minPackedCandVertexWeight";
225 LogDebug(
"TauQCuts") <<
" packedCand: Pt = " << pCand.
pt() <<
", eta = " << pCand.
eta()
226 <<
", phi = " << pCand.
phi();
227 LogDebug(
"TauQCuts") <<
" vertex: x = " << (*pv)->position().x() <<
", y = " << (*pv)->position().y()
228 <<
", z = " << (*pv)->position().z();
229 LogDebug(
"TauQCuts") <<
"--> trackWeight from packedCand = " << weight <<
" (cut = " << cut <<
")";
230 return (weight >= cut);
234 auto track = getTrackRef(cand);
235 if (
track.isNonnull()) {
238 auto gsfTrack = getGsfTrackRef(cand);
239 if (gsfTrack.isNonnull()) {
244 if (pCand !=
nullptr && cand.
charge() != 0) {
247 LogDebug(
"TauQCuts") <<
"<minTrackVertexWeight_cand>: weight = N/A, cut = " <<
cut;
259 LogDebug(
"TauQCuts") <<
"<trkChi2_cand>: chi^2 = " <<
track->normalizedChi2() <<
", cut = " <<
cut;
262 LogDebug(
"TauQCuts") <<
"<trkChi2_cand>: chi^2 = N/A, cut = " <<
cut;
269 for (
auto const&
func : cuts) {
277 for (
auto const&
func : cuts) {
287 RecoTauQualityCuts::CandQCutFuncMap::const_iterator
cuts = funcMap.find(
std::abs(cand.
pdgId()));
289 if (cuts == funcMap.end())
291 return AND_cand(cand, cuts->second);
303 std::set<std::string> passedOptionSet;
306 for (
auto const&
option : passedOptions) {
307 passedOptionSet.insert(
option);
310 unsigned int nCuts = 0;
311 auto getDouble = [&qcuts, &passedOptionSet, &nCuts](
const std::string&
name) {
314 passedOptionSet.erase(
name);
319 auto getUint = [&qcuts, &passedOptionSet, &nCuts](
const std::string&
name) ->
unsigned int {
322 passedOptionSet.erase(
name);
329 minTrackPt_ = getDouble(
"minTrackPt");
330 maxTrackChi2_ = getDouble(
"maxTrackChi2");
331 minTrackPixelHits_ = getUint(
"minTrackPixelHits");
332 minTrackHits_ = getUint(
"minTrackHits");
333 maxTransverseImpactParameter_ = getDouble(
"maxTransverseImpactParameter");
334 maxDeltaZ_ = getDouble(
"maxDeltaZ");
335 maxDeltaZToLeadTrack_ = getDouble(
"maxDeltaZToLeadTrack");
337 minTrackVertexWeight_ = getDouble(
"minTrackVertexWeight");
340 checkHitPattern_ = (minTrackHits_ > 0) || (minTrackPixelHits_ > 0);
341 checkPV_ = (maxTransverseImpactParameter_ >= 0) || (maxDeltaZ_ >= 0) || (maxDeltaZToLeadTrack_ >= 0) ||
342 (minTrackVertexWeight_ >= 0);
345 minGammaEt_ = getDouble(
"minGammaEt");
348 minNeutralHadronEt_ = getDouble(
"minNeutralHadronEt");
351 if (!passedOptionSet.empty()) {
353 bool thereIsABadParameter =
false;
354 for (
auto const&
option : passedOptionSet) {
356 if (
option ==
"useTracksInsteadOfPFHadrons") {
358 if (qcuts.
getParameter<
bool>(
"useTracksInsteadOfPFHadrons")) {
359 throw cms::Exception(
"DontUseTracksInQcuts") <<
"The obsolete exception useTracksInsteadOfPFHadrons " 360 <<
"is set to true in the quality cut config." << std::endl;
366 thereIsABadParameter =
true;
368 unParsedOptions +=
option;
369 unParsedOptions +=
"\n";
371 if (thereIsABadParameter) {
372 throw cms::Exception(
"BadQualityCutConfig") <<
" The PSet passed to the RecoTauQualityCuts class had" 373 <<
" the following unrecognized options: " << std::endl
380 throw cms::Exception(
"BadQualityCutConfig") <<
" No options were passed to the quality cut class!" << std::endl;
389 for (
auto const&
cut : inputNames) {
390 if (
cut ==
"minTrackVertexWeight" ||
cut ==
"maxDeltaZ" ||
cut ==
"maxDeltaZToLeadTrack") {
396 return std::make_pair(puCuts, nonPUCuts);
400 if (!filterTrack_(track.
get()))
402 if (minTrackVertexWeight_ >= 0. && !(pv_->trackWeight(convertRef(track)) >= minTrackVertexWeight_))
408 if (!filterTrack_(track.
get()))
410 if (minTrackVertexWeight_ >= 0. && !(pv_->trackWeight(convertRef(track)) >= minTrackVertexWeight_))
418 if (minTrackPt_ >= 0 && !(track->
pt() > minTrackPt_))
420 if (maxTrackChi2_ >= 0 && !(track->
normalizedChi2() <= maxTrackChi2_))
422 if (checkHitPattern_) {
429 if (checkPV_ && pv_.isNull()) {
430 edm::LogError(
"QCutsNoPrimaryVertex") <<
"Primary vertex Ref in " 431 <<
"RecoTauQualityCuts is invalid. - filterTrack";
435 if (maxTransverseImpactParameter_ >= 0 &&
436 !(std::fabs(track->
dxy(pv_->position())) <= maxTransverseImpactParameter_))
438 if (maxDeltaZ_ >= 0 && !(std::fabs(track->
dz(pv_->position())) <= maxDeltaZ_))
440 if (maxDeltaZToLeadTrack_ >= 0) {
442 edm::LogError(
"QCutsNoValidLeadTrack") <<
"Lead track Ref in " 443 <<
"RecoTauQualityCuts is invalid. - filterTrack";
447 if (!(std::fabs(track->
dz(pv_->position()) - leadTrack_->dz(pv_->position())) <= maxDeltaZToLeadTrack_))
458 if (pCand ==
nullptr)
464 if (
track !=
nullptr) {
465 if (!filterTrack(*
track))
468 if (minTrackPt_ >= 0 && !(pCand->
pt() > minTrackPt_))
470 if (checkPV_ && pv_.isNull()) {
471 edm::LogError(
"QCutsNoPrimaryVertex") <<
"Primary vertex Ref in " 472 <<
"RecoTauQualityCuts is invalid. - filterChargedCand";
476 if (maxTransverseImpactParameter_ >= 0 &&
477 !(std::fabs(pCand->
dxy(pv_->position())) <= maxTransverseImpactParameter_))
479 if (maxDeltaZ_ >= 0 && !(std::fabs(pCand->
dz(pv_->position())) <= maxDeltaZ_))
481 if (maxDeltaZToLeadTrack_ >= 0) {
482 if (leadTrack_ ==
nullptr) {
483 edm::LogError(
"QCutsNoValidLeadTrack") <<
"Lead track Ref in " 484 <<
"RecoTauQualityCuts is invalid. - filterChargedCand";
488 if (!(std::fabs(pCand->
dz(pv_->position()) - leadTrack_->dz(pv_->position())) <= maxDeltaZToLeadTrack_))
499 if (minGammaEt_ >= 0 && !(cand.
et() > minGammaEt_))
505 if (minNeutralHadronEt_ >= 0 && !(cand.
et() > minNeutralHadronEt_))
513 return filterGammaCand(cand);
515 return filterNeutralHadronCand(cand);
530 auto trackRef = getTrackRef(cand);
533 if (trackRef.isNonnull()) {
534 result = filterTrack(trackRef);
536 auto gsfTrackRef = getGsfTrackRef(cand);
537 if (gsfTrackRef.isNonnull())
538 result = filterTrack(gsfTrackRef);
539 else if (cand.
charge() != 0) {
540 result = filterChargedCand(cand);
545 result = filterCandByType(cand);
559 leadTrack_ =
nullptr;
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
std::map< int, CandQCutFuncCollection > CandQCutFuncMap
value_type const * get() const
T getParameter(std::string const &) const
bool minTrackVertexWeight(const TrackBaseRef &track, const reco::VertexRef *pv, double cut)
bool isNonnull() const
Checks for non-null.
bool AND_cand(const Candidate &cand, const RecoTauQualityCuts::CandQCutFuncCollection &cuts)
bool trkLongitudinalImpactParameterWrtTrack(const Track *track, const Track *leadTrack, const reco::VertexRef *pv, double cut)
DZ cut, with respect to the current lead rack.
RecoTauQualityCuts(const edm::ParameterSet &qcuts)
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
int numberOfValidHits() const
bool exists(std::string const ¶meterName) const
checks if a parameter exists
double phi() const
azimuthal angle of momentum vector
key_type key() const
Accessor for product key.
bool filterCand(const reco::Candidate &cand) const
Filter a single Candidate.
const reco::VertexRef vertexRef() const
InputIterator leadCand(InputIterator begin, InputIterator end)
bool trkPixelHits_cand(const Candidate &cand, int cut)
static std::string const input
std::vector< CandQCutFunc > CandQCutFuncCollection
virtual double et() const =0
transverse energy
void copyFrom(ParameterSet const &from, std::string const &name)
double eta() const
pseudorapidity of momentum vector
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
const PVAssociationQuality pvAssociationQuality() const
virtual int pdgId() const =0
PDG identifier.
bool trkTrackerHits_cand(const Candidate &cand, int cut)
bool filterCandByType(const reco::Candidate &cand) const
double pt() const
track transverse momentum
bool ptMin_cand(const Candidate &cand, double cut)
Abs< T >::type abs(const T &t)
bool trkChi2_cand(const Candidate &cand, double cut)
virtual const reco::Track & pseudoTrack() const
bool trkChi2(const Track *track, double cut)
double pt() const override
transverse momentum
T const * get() const
Returns C++ pointer to the item.
std::pair< edm::ParameterSet, edm::ParameterSet > factorizePUQCuts(const edm::ParameterSet &inputSet)
bool trkLongitudinalImpactParameter_cand(const Candidate &cand, const reco::VertexRef *pv, double cut)
std::vector< TrackQCutFunc > TrackQCutFuncCollection
std::vector< std::string > getParameterNames() const
bool etMin_cand(const Candidate &cand, double cut)
bool ptMin(const TrackBaseRef &track, double cut)
bool isNull() const
Checks for null.
bool filterTrack_(const reco::Track *track) const
bool mapAndCutByType(const Candidate &cand, const RecoTauQualityCuts::CandQCutFuncMap &funcMap)
bool hasTrackDetails() const
Return true if a bestTrack can be extracted from this Candidate.
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
double eta() const override
momentum pseudorapidity
double phi() const override
momentum azimuthal angle
static const TrackGhostTrackState * getTrack(const BasicGhostTrackState *basic)
bool trkTransverseImpactParameter(const Track *track, const reco::VertexRef *pv, double cut)
bool filterChargedCand(const reco::Candidate &cand) const
or a single charged candidate
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
virtual double pt() const =0
transverse momentum
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
bool filterNeutralHadronCand(const reco::Candidate &cand) const
bool trkTrackerHits(const Track *track, int cut)
virtual int charge() const =0
electric charge
bool trkLongitudinalImpactParameterWrtTrack_cand(const Candidate &cand, const reco::Track *leadTrack, const reco::VertexRef *pv, double cut)
bool trkPixelHits(const Track *track, int cut)
bool AND(const TrackBaseRef &track, const RecoTauQualityCuts::TrackQCutFuncCollection &cuts)
int numberOfValidPixelHits() const
bool filterGammaCand(const reco::Candidate &cand) const
void setLeadTrack(const reco::Track &leadTrack)
Update the leading track.
virtual float dxy() const
dxy with respect to the PV ref
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
bool trkLongitudinalImpactParameter(const TrackBase *track, const reco::VertexRef *pv, double cut)
bool minPackedCandVertexWeight(const pat::PackedCandidate &pCand, const reco::VertexRef *pv, double cut)
bool filterTrack(const reco::TrackBaseRef &track) const
Filter a single Track.
bool minTrackVertexWeight_cand(const Candidate &cand, const reco::VertexRef *pv, double cut)
bool trkTransverseImpactParameter_cand(const Candidate &cand, const reco::VertexRef *pv, double cut)