CMS 3D CMS Logo

BDHadronTrackMonitoringAnalyzer.cc
Go to the documentation of this file.
2 
3 using namespace reco;
4 using namespace edm;
5 using namespace std;
6 
8  const reco::PFCandidate *pfcand = dynamic_cast<const reco::PFCandidate *>(cnd.get());
9 
10  if ((std::abs(pfcand->pdgId()) == 11 || pfcand->pdgId() == 22) && pfcand->gsfTrackRef().isNonnull() &&
11  pfcand->gsfTrackRef().isAvailable())
12  return reco::TrackBaseRef(pfcand->gsfTrackRef());
13  else if (pfcand->trackRef().isNonnull() && pfcand->trackRef().isAvailable())
14  return reco::TrackBaseRef(pfcand->trackRef());
15  else
16  return reco::TrackBaseRef();
17 }
18 
19 // ---------- Static member declaration -----------
20 const std::vector<std::string> BDHadronTrackMonitoringAnalyzer::TrkHistCat = {
21  "BCWeakDecay", "BWeakDecay", "CWeakDecay", "PU", "Other", "Fake"};
22 
23 // ---------- Constructor -----------
25  : distJetAxis_(pSet.getParameter<double>("distJetAxisCut")),
26  decayLength_(pSet.getParameter<double>("decayLengthCut")),
27  minJetPt_(pSet.getParameter<double>("minJetPt")),
28  maxJetEta_(pSet.getParameter<double>("maxJetEta")),
29  ipTagInfos_(pSet.getParameter<std::string>("ipTagInfos")),
30  PatJetSrc_(pSet.getParameter<InputTag>("PatJetSource")),
31  TrackSrc_(pSet.getParameter<InputTag>("TrackSource")),
32  PVSrc_(pSet.getParameter<InputTag>("PrimaryVertexSource")),
33  ClusterTPMapSrc_(pSet.getParameter<InputTag>("clusterTPMap")),
34  classifier_(pSet, consumesCollector())
35 
36 {
37  PatJetCollectionTag_ = consumes<pat::JetCollection>(PatJetSrc_);
38  TrackCollectionTag_ = consumes<reco::TrackCollection>(TrackSrc_);
39  PrimaryVertexColl_ = consumes<reco::VertexCollection>(PVSrc_);
40  clusterTPMapToken_ = consumes<ClusterTPAssociation>(ClusterTPMapSrc_);
41  ttrackToken_ = esConsumes(edm::ESInputTag("", "TransientTrackBuilder"));
42  // TrkHistCat = {"BCWeakDecay", "BWeakDecay", "CWeakDecay", "PU", "Other",
43  // "Fake"};
44 }
45 
46 // ---------- BookHistograms -----------
47 
49  edm::Run const &run,
50  edm::EventSetup const &es) {
51  ibook.setCurrentFolder("BDHadronTracks/JetContent");
52  //
53  // Book all histograms.
54  //
56 
57  nTrkAll_bjet = ibook.book1D(
58  "nTrkAll_bjet", "Number of selected tracks in b jets;number of selected tracks;jets", 16, -0.5, 15.5);
59 
60  nTrkAll_cjet = ibook.book1D(
61  "nTrkAll_cjet", "Number of selected tracks in c jets;number of selected tracks;jets", 16, -0.5, 15.5);
62 
63  nTrkAll_dusgjet = ibook.book1D(
64  "nTrkAll_dusgjet", "Number of selected tracks in dusg jets;number of selected tracks;jets", 16, -0.5, 15.5);
65 
66  // Loop over different Track History Categories
67  for (unsigned int i = 0; i < TrkHistCat.size(); i++) {
68  ibook.setCurrentFolder("BDHadronTracks/JetContent");
69  // b jets
70  nTrk_bjet[i] = ibook.book1D("nTrk_bjet_" + TrkHistCat[i],
71  "Number of selected tracks in b jets (" + TrkHistCat[i] +
72  ");number of selected tracks (" + TrkHistCat[i] + ");jets",
73  16,
74  -0.5,
75  15.5);
76 
77  // c jets
78  nTrk_cjet[i] = ibook.book1D("nTrk_cjet_" + TrkHistCat[i],
79  "Number of selected tracks in c jets (" + TrkHistCat[i] +
80  ");number of selected tracks (" + TrkHistCat[i] + ");jets",
81  16,
82  -0.5,
83  15.5);
84 
85  // dusg jets
86  nTrk_dusgjet[i] = ibook.book1D("nTrk_dusgjet_" + TrkHistCat[i],
87  "Number of selected tracks in dusg jets (" + TrkHistCat[i] +
88  ");number of selected tracks (" + TrkHistCat[i] + ");jets",
89  16,
90  -0.5,
91  15.5);
92 
93  ibook.setCurrentFolder("BDHadronTracks/TrackInfo");
94  // track properties for all flavours combined
95  TrkPt_alljets[i] = ibook.book1D("TrkPt_" + TrkHistCat[i],
96  "Track pT (" + TrkHistCat[i] + ");track p_{T} (" + TrkHistCat[i] + ");tracks",
97  30,
98  0,
99  100);
100  TrkEta_alljets[i] = ibook.book1D("TrkEta_" + TrkHistCat[i],
101  "Track #eta (" + TrkHistCat[i] + ");track #eta (" + TrkHistCat[i] + ");tracks",
102  30,
103  -2.5,
104  2.5);
105  TrkPhi_alljets[i] = ibook.book1D("TrkPhi_" + TrkHistCat[i],
106  "Track #phi (" + TrkHistCat[i] + ");track #phi (" + TrkHistCat[i] + ");tracks",
107  30,
108  -3.15,
109  3.15);
110  TrkDxy_alljets[i] = ibook.book1D("TrkDxy_" + TrkHistCat[i],
111  "Track dxy (" + TrkHistCat[i] + ");track dxy (" + TrkHistCat[i] + ");tracks",
112  30,
113  -0.1,
114  0.1);
115  TrkDz_alljets[i] = ibook.book1D("TrkDz_" + TrkHistCat[i],
116  "Track dz (" + TrkHistCat[i] + ");track dz (" + TrkHistCat[i] + ");tracks",
117  30,
118  -0.1,
119  0.1);
120  TrkHitAll_alljets[i] = ibook.book1D(
121  "TrkHitAll_" + TrkHistCat[i],
122  "Number of tracker hits (" + TrkHistCat[i] + ");track number of all hits (" + TrkHistCat[i] + ");tracks",
123  31,
124  -0.5,
125  30.5);
126  TrkHitStrip_alljets[i] = ibook.book1D(
127  "TrkHitStrip_" + TrkHistCat[i],
128  "Number of strip hits (" + TrkHistCat[i] + ");track number of strip hits (" + TrkHistCat[i] + ");tracks",
129  31,
130  -0.5,
131  30.5);
132  TrkHitPixel_alljets[i] = ibook.book1D(
133  "TrkHitPixel_" + TrkHistCat[i],
134  "Number of pixel hits (" + TrkHistCat[i] + ");track number of pixel hits (" + TrkHistCat[i] + ");tracks",
135  9,
136  -0.5,
137  8.5);
138 
139  ibook.setCurrentFolder("BDHadronTracks/TrackTruthInfo");
140  if (i < 5) { // Fakes (i == 5) have no truth by definition!
142  ibook.book1D("TrkTruthPt_" + TrkHistCat[i],
143  "Track pT (" + TrkHistCat[i] + " Truth);track p_{T} (" + TrkHistCat[i] + " Truth);tracks",
144  30,
145  0,
146  100);
148  ibook.book1D("TrkTruthEta_" + TrkHistCat[i],
149  "Track #eta (" + TrkHistCat[i] + " Truth);track #eta (" + TrkHistCat[i] + " Truth);tracks",
150  30,
151  -2.5,
152  2.5);
154  ibook.book1D("TrkTruthPhi_" + TrkHistCat[i],
155  "Track #phi (" + TrkHistCat[i] + " Truth);track #phi (" + TrkHistCat[i] + " Truth);tracks",
156  30,
157  -3.15,
158  3.15);
160  ibook.book1D("TrkTruthDxy_" + TrkHistCat[i],
161  "Track dxy (" + TrkHistCat[i] + " Truth);track dxy (" + TrkHistCat[i] + " Truth);tracks",
162  30,
163  -0.1,
164  0.1);
166  ibook.book1D("TrkTruthDz_" + TrkHistCat[i],
167  "Track dz (" + TrkHistCat[i] + " Truth);track dz (" + TrkHistCat[i] + " Truth);tracks",
168  30,
169  -0.1,
170  0.1);
172  ibook.book1D("TrkTruthHitAll_" + TrkHistCat[i],
173  "Number of tracker hits (" + TrkHistCat[i] + " Truth);track number of all hits (" +
174  TrkHistCat[i] + " Truth);tracks",
175  31,
176  -0.5,
177  30.5);
179  ibook.book1D("TrkTruthHitStrip_" + TrkHistCat[i],
180  "Number of strip hits (" + TrkHistCat[i] + " Truth);track number of strip hits (" +
181  TrkHistCat[i] + " Truth);tracks",
182  31,
183  -0.5,
184  30.5);
186  ibook.book1D("TrkTruthHitPixel_" + TrkHistCat[i],
187  "Number of pixel hits (" + TrkHistCat[i] + " Truth);track number of pixel hits (" +
188  TrkHistCat[i] + " Truth);tracks",
189  9,
190  -0.5,
191  8.5);
192  }
193  }
194 }
195 
196 // ---------- Destructor -----------
197 
199 
200 // ---------- Analyze -----------
201 // This is needed to get a TrackingParticle --> Cluster match (instead of
202 // Cluster-->TP)
203 using P = std::pair<OmniClusterRef, TrackingParticleRef>;
204 bool compare(const P &i, const P &j) { return i.second.index() > j.second.index(); }
205 
208  iEvent.getByToken(PatJetCollectionTag_, patJetsColl);
209 
211  iEvent.getByToken(TrackCollectionTag_, tracksHandle);
212 
213  edm::Handle<ClusterTPAssociation> pCluster2TPListH;
214  iEvent.getByToken(clusterTPMapToken_, pCluster2TPListH);
215  const ClusterTPAssociation &clusterToTPMap = *pCluster2TPListH;
216 
217  //edm::ESHandle<TransientTrackBuilder>
218  const auto &trackBuilder = iSetup.getHandle(ttrackToken_);
219 
220  classifier_.newEvent(iEvent, iSetup);
221 
222  // -----Primary Vertex-----
223  const reco::Vertex *pv;
224 
227 
228  bool pvFound = (!primaryVertex->empty());
229  if (pvFound) {
230  pv = &(*primaryVertex->begin());
231  } else {
233  e(0, 0) = 0.0015 * 0.0015;
234  e(1, 1) = 0.0015 * 0.0015;
235  e(2, 2) = 15. * 15.;
236  reco::Vertex::Point p(0, 0, 0);
237  pv = new reco::Vertex(p, e, 1, 1, 1);
238  }
239  // -----------------------
240 
241  // -------- Loop Over Jets ----------
242  for (pat::JetCollection::const_iterator jet = patJetsColl->begin(); jet != patJetsColl->end(); ++jet) {
243  if (jet->pt() < minJetPt_ || std::fabs(jet->eta()) > maxJetEta_)
244  continue;
245 
246  unsigned int flav = abs(jet->hadronFlavour());
247 
248  // std::cout << "patJet collection has pfImpactParameterTagInfo?: " <<
249  // jet->hasTagInfo("pfImpactParameter") << std::endl;
250  const CandIPTagInfo *trackIpTagInfo = jet->tagInfoCandIP(ipTagInfos_);
251  const std::vector<edm::Ptr<reco::Candidate>> &selectedTracks(trackIpTagInfo->selectedTracks());
252 
253  unsigned int nseltracks = 0;
254  std::vector<int> nseltracksCat(TrkHistCat.size(),
255  0); // following the order of TrkHistCat
256 
257  unsigned int nTrackSize = selectedTracks.size(); // number of tracks from IPInfos to loop over
258  // -------- Loop Over (selected) Tracks ----------
259  for (unsigned int itt = 0; itt < nTrackSize; ++itt) {
260  const TrackBaseRef ptrackRef = toTrackRef(selectedTracks[itt]);
261  const reco::Track *ptrackPtr = reco::btag::toTrack(ptrackRef);
262  const reco::Track &ptrack = *ptrackPtr;
263 
264  reco::TransientTrack transientTrack = trackBuilder->build(ptrackPtr);
265  GlobalVector direction(jet->px(), jet->py(), jet->pz());
266 
267  Double_t distJetAxis = IPTools::jetTrackDistance(transientTrack, direction, *pv).second.value();
268 
269  Double_t decayLength = 999;
271  IPTools::closestApproachToJet(transientTrack.impactPointState(), *pv, direction, transientTrack.field());
272  if (closest.isValid())
273  decayLength = (closest.globalPosition() - RecoVertex::convertPos(pv->position())).mag();
274  else
275  decayLength = 999;
276 
277  // extra cut ons the tracks
278  if (std::fabs(distJetAxis) > distJetAxis_ || decayLength > decayLength_) {
279  continue;
280  }
281  nseltracks += 1; // if it passed these cuts, nselectedtracks +1
282 
284 
285  double TrkPt = ptrack.pt();
286  double TrkEta = ptrack.eta();
287  double TrkPhi = ptrack.phi();
288  double TrkDxy = ptrack.dxy(pv->position());
289  double TrkDz = ptrack.dz(pv->position());
290  int TrknHitAll = ptrack.numberOfValidHits();
291  int TrknHitPixel = ptrack.hitPattern().numberOfValidPixelHits();
292  int TrknHitStrip = ptrack.hitPattern().numberOfValidStripHits();
293 
294  double TrkTruthPt = -99;
295  double TrkTruthEta = -99;
296  double TrkTruthPhi = -99;
297  double TrkTruthDxy = -1;
298  double TrkTruthDz = -1;
299  int TrkTruthnHitAll = -1;
300  int TrkTruthnHitPixel = -1;
301  int TrkTruthnHitStrip = -1;
302 
303  // Get corresponding Trackingparticle
304  std::pair<TrackingParticleRef, double> res = classifier_.history().getMatchedTrackingParticle();
305  TrackingParticleRef tpr = res.first;
306  double quality_tpr = res.second;
307 
308  // Match TP to hit-cluster (re-ordering according to TP rather than
309  // clusters and look for equal_range of a given tpr)
310  auto clusterTPmap = clusterToTPMap.map();
311  std::sort(clusterTPmap.begin(), clusterTPmap.end(), compare);
312  auto clusterRange =
313  std::equal_range(clusterTPmap.begin(), clusterTPmap.end(), std::make_pair(OmniClusterRef(), tpr), compare);
314  if (quality_tpr != 0) {
315  TrkTruthPt = tpr->pt();
316  TrkTruthEta = tpr->eta();
317  TrkTruthPhi = tpr->phi();
318 
319  const TrackingParticle::Point &vertex_pv = pv->position();
320  TrackingParticle::Point vertex_tpr = tpr->vertex();
321  TrackingParticle::Vector momentum_tpr = tpr->momentum();
322  TrkTruthDxy = (-(vertex_tpr.x() - vertex_pv.x()) * momentum_tpr.y() +
323  (vertex_tpr.y() - vertex_pv.y()) * momentum_tpr.x()) /
324  tpr->pt();
325  TrkTruthDz = (vertex_tpr.z() - vertex_pv.z()) - ((vertex_tpr.x() - vertex_pv.x()) * momentum_tpr.x() +
326  (vertex_tpr.y() - vertex_pv.y()) * momentum_tpr.y()) /
327  sqrt(momentum_tpr.perp2()) * momentum_tpr.z() /
328  sqrt(momentum_tpr.perp2());
329 
330  TrkTruthnHitAll = 0;
331  TrkTruthnHitPixel = 0;
332  TrkTruthnHitStrip = 0;
333  if (clusterRange.first != clusterRange.second) {
334  for (auto ip = clusterRange.first; ip != clusterRange.second; ++ip) {
335  const OmniClusterRef &cluster = ip->first;
336  if (cluster.isPixel() && cluster.isValid()) {
337  TrkTruthnHitPixel += 1;
338  }
339  if (cluster.isStrip() && cluster.isValid()) {
340  TrkTruthnHitStrip += 1;
341  }
342  }
343  }
344  TrkTruthnHitAll = TrkTruthnHitPixel + TrkTruthnHitStrip;
345  }
346 
347  // ----------- Filling the correct histograms based on jet flavour and
348  // Track history Category --------
349 
350  // BCWeakDecay
352  theFlag[TrackCategories::CWeakDecay]) {
362  if (quality_tpr != 0) {
371  }
372  }
373  // BWeakDecay
374  else if (theFlag[TrackCategories::SignalEvent] && theFlag[TrackCategories::BWeakDecay] &&
375  !theFlag[TrackCategories::CWeakDecay]) {
385  if (quality_tpr != 0) {
394  }
395  }
396  // CWeakDecay
397  else if (theFlag[TrackCategories::SignalEvent] && !theFlag[TrackCategories::BWeakDecay] &&
398  theFlag[TrackCategories::CWeakDecay]) {
408  if (quality_tpr != 0) {
417  }
418  }
419  // PU
420  else if (!theFlag[TrackCategories::SignalEvent] && !theFlag[TrackCategories::Fake]) {
421  nseltracksCat[BDHadronTrackMonitoringAnalyzer::PU] += 1;
430  if (quality_tpr != 0) {
439  }
440  }
441  // Other
442  else if (theFlag[TrackCategories::SignalEvent] && !theFlag[TrackCategories::BWeakDecay] &&
443  !theFlag[TrackCategories::CWeakDecay]) {
444  nseltracksCat[BDHadronTrackMonitoringAnalyzer::Other] += 1;
453  if (quality_tpr != 0) {
462  }
463  }
464  // Fake
465  else if (!theFlag[TrackCategories::SignalEvent] && theFlag[TrackCategories::Fake]) {
466  nseltracksCat[BDHadronTrackMonitoringAnalyzer::Fake] += 1;
475  // NO TRUTH FOR FAKES!!!
476  }
477  }
478  // -------- END Loop Over (selected) Tracks ----------
479  // Still have to fill some jet-flavour specific variables
480  if (flav == 5) {
481  nTrkAll_bjet->Fill(nseltracks);
482  for (unsigned int i = 0; i < TrkHistCat.size(); i++) {
483  nTrk_bjet[i]->Fill(nseltracksCat[i]);
484  }
485  } else if (flav == 4) {
486  nTrkAll_cjet->Fill(nseltracks);
487  for (unsigned int i = 0; i < TrkHistCat.size(); i++) {
488  nTrk_cjet[i]->Fill(nseltracksCat[i]);
489  }
490  } else {
491  nTrkAll_dusgjet->Fill(nseltracks);
492  for (unsigned int i = 0; i < TrkHistCat.size(); i++) {
493  nTrk_dusgjet[i]->Fill(nseltracksCat[i]);
494  }
495  }
496  }
497  // -------- END Loop Over Jets ----------
498 
499  if (!pvFound) {
500  delete pv;
501  }
502 }
503 
504 // define this as a plug-in
int numberOfValidPixelHits() const
Definition: HitPattern.h:831
reco::Vertex::Point convertPos(const GlobalPoint &p)
bool compare(const P &i, const P &j)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
bool isStrip() const
bool isPixel() const
edm::EDGetTokenT< ClusterTPAssociation > clusterTPMapToken_
unsigned short numberOfValidHits() const
number of valid hits found
Definition: TrackBase.h:798
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
TStyle * setTDRStyle()
Definition: Tools.cc:343
int closest(std::vector< int > const &vec, int value)
edm::EDGetTokenT< reco::TrackCollection > TrackCollectionTag_
edm::EDGetTokenT< reco::VertexCollection > PrimaryVertexColl_
edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > ttrackToken_
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:45
TrajectoryStateOnSurface closestApproachToJet(const TrajectoryStateOnSurface &state, const reco::Vertex &vertex, const GlobalVector &aJetDirection, const MagneticField *field)
Definition: IPTools.cc:182
BDHadronTrackMonitoringAnalyzer(const edm::ParameterSet &pSet)
const reco::Track * toTrack(const reco::TrackBaseRef &t)
Definition: IPTagInfo.h:24
Definition: Electron.h:6
std::pair< double, Measurement1D > jetTrackDistance(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:206
int numberOfValidStripHits() const
Definition: HitPattern.h:843
edm::EDGetTokenT< pat::JetCollection > PatJetCollectionTag_
void Fill(long long x)
math::XYZPointD Point
point in the space
double pt() const
track transverse momentum
Definition: TrackBase.h:637
TrackHistory const & history() const
Returns a reference to the track history used in the classification.
const Flags & flags() const
Returns flags with the category descriptions.
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...
Definition: TrackBase.h:622
bool isValid() const
int iEvent
Definition: GenABIO.cc:224
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
Definition: TrackFwd.h:35
T sqrt(T t)
Definition: SSEVec.h:19
const MagneticField * field() const
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
def pv(vc)
Definition: MetAnalyzer.py:7
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:649
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static const std::vector< std::string > TrkHistCat
void newEvent(edm::Event const &, edm::EventSetup const &)
Pre-process event information (for accessing reconstraction information)
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:139
const std::pair< TrackingParticleRef, double > getMatchedTrackingParticle() const
Definition: TrackHistory.h:58
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
TrackClassifier const & evaluate(reco::TrackBaseRef const &)
Classify the RecoTrack in categories.
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:504
const map_type & map() const
std::pair< OmniClusterRef, TrackingParticleRef > P
const reco::TrackBaseRef toTrackRef(const edm::Ptr< reco::Candidate > &cnd)
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:41
fixed size matrix
HLT enums.
std::vector< bool > Flags
Main types associated to the class.
math::XYZVectorD Vector
point in the space
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
primaryVertex
hltOfflineBeamSpot for HLTMON
TrajectoryStateOnSurface impactPointState() const
Definition: Run.h:45
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Definition: TrackBase.h:608
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override