1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include "Calibration/IsolatedParticles/interface/TrackSelection.h"
#include "DataFormats/TrackReco/interface/HitPattern.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include <sstream>
namespace spr {
bool goodTrack(const reco::Track* pTrack,
math::XYZPoint leadPV,
spr::trackSelectionParameters parameters,
bool debug) {
bool select = pTrack->quality(parameters.minQuality);
double dxy = pTrack->dxy(leadPV);
double dz = pTrack->dz(leadPV);
double dpbyp = 999;
if (std::abs(pTrack->qoverp()) > 0.0000001)
dpbyp = std::abs(pTrack->qoverpError() / pTrack->qoverp());
if (debug)
edm::LogVerbatim("IsoTrack") << "Track:: Pt " << pTrack->pt() << " dxy " << dxy << " dz " << dz << " Chi2 "
<< pTrack->normalizedChi2() << " dpbyp " << dpbyp << " Quality " << select;
if (pTrack->pt() < parameters.minPt)
select = false;
if (dxy > parameters.maxDxyPV || dz > parameters.maxDzPV)
select = false;
if (pTrack->normalizedChi2() > parameters.maxChi2)
select = false;
if (dpbyp > parameters.maxDpOverP)
select = false;
if (parameters.minLayerCrossed > 0 || parameters.minOuterHit > 0) {
const reco::HitPattern& hitp = pTrack->hitPattern();
if (parameters.minLayerCrossed > 0 && hitp.trackerLayersWithMeasurement() < parameters.minLayerCrossed)
select = false;
if (parameters.minOuterHit > 0 &&
(hitp.stripTOBLayersWithMeasurement() + hitp.stripTECLayersWithMeasurement()) < parameters.minOuterHit)
select = false;
if (debug) {
edm::LogVerbatim("IsoTrack") << "Default Hit Pattern with "
<< hitp.numberOfAllHits(reco::HitPattern::TRACK_HITS) << " hits";
for (int i = 0; i < hitp.numberOfAllHits(reco::HitPattern::TRACK_HITS); i++) {
std::ostringstream st1;
hitp.printHitPattern(reco::HitPattern::TRACK_HITS, i, st1);
edm::LogVerbatim("IsoTrack") << st1.str();
}
}
}
if (parameters.maxInMiss >= 0) {
const reco::HitPattern& hitp = pTrack->hitPattern();
if (hitp.trackerLayersWithoutMeasurement(reco::HitPattern::MISSING_INNER_HITS) > parameters.maxInMiss)
select = false;
if (debug) {
edm::LogVerbatim("IsoTrack") << "Inner Hit Pattern with "
<< hitp.numberOfAllHits(reco::HitPattern::MISSING_INNER_HITS) << " hits";
for (int i = 0; i < hitp.numberOfAllHits(reco::HitPattern::MISSING_INNER_HITS); i++) {
std::ostringstream st1;
hitp.printHitPattern(reco::HitPattern::MISSING_INNER_HITS, i, st1);
edm::LogVerbatim("IsoTrack") << st1.str();
}
}
}
if (parameters.maxOutMiss >= 0) {
const reco::HitPattern& hitp = pTrack->hitPattern();
if (hitp.trackerLayersWithoutMeasurement(reco::HitPattern::MISSING_OUTER_HITS) > parameters.maxOutMiss)
select = false;
if (debug) {
edm::LogVerbatim("IsoTrack") << "Outer Hit Pattern with "
<< hitp.numberOfAllHits(reco::HitPattern::MISSING_OUTER_HITS) << " hits";
for (int i = 0; i < hitp.numberOfAllHits(reco::HitPattern::MISSING_OUTER_HITS); i++) {
std::ostringstream st1;
hitp.printHitPattern(reco::HitPattern::MISSING_OUTER_HITS, i, st1);
edm::LogVerbatim("IsoTrack") << st1.str();
}
}
}
if (debug)
edm::LogVerbatim("IsoTrack") << "Final Selection Result " << select;
return select;
}
} // namespace spr
|