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