CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CosmicSplitterValidation.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: CosmicSplitterValidation
4 // Class: CosmicSplitterValidation
5 //
13 //
14 // Original Author: Nhan Tran
15 // Created: Mon Jul 16m 16:56:34 CDT 2007
16 // $Id: CosmicSplitterValidation.cc,v 1.11 2010/03/29 13:18:43 mussgill Exp $
17 //
18 //
19 
20 // system include files
24 
25 #include <algorithm>
26 
30 
33 
34 
41 
42 
50 
57 
63 
64 #include <TTree.h>
65 
66 //
67 // class decleration
68 //
69 
71 public:
74 
75 
76 private:
77  virtual void beginJob() override;
78  virtual void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override;
79  virtual void endJob() override ;
80 
81  bool is_gold_muon(const edm::Event& e);
82 
87 
91  int goldenCtr;
95 
97  // ----------member data ---------------------------
98  //std::vector<AlignTransform> m_align;
99  // tree
101  // tree vars
103  // split track variables
118  // split track errors
126 
127  // original track variables
129  double dxy_org_, dz_org_;
132  double norchi2_org_;
135  // original track errors
139 
140  // split sta variables
151  // split sta_ errors
159 
160  // split glb_ variables
172  // split glb_ errors
180  // original glb muon variables
182  double dxy_orm_, dz_orm_;
185  double norchi2_orm_;
186  // original glb muon errors
190 
191 };
192 
193 //
194 // constants, enums and typedefs
195 //
196 
197 //
198 // static data member definitions
199 //
200 
201 //
202 // constructors and destructor
203 //
205  splitTracks_(iConfig.getParameter<edm::InputTag>("splitTracks")),
206  splitGlobalMuons_(iConfig.getParameter<edm::InputTag>("splitGlobalMuons")),
207  originalTracks_(iConfig.getParameter<edm::InputTag>("originalTracks")),
208  originalGlobalMuons_(iConfig.getParameter<edm::InputTag>("originalGlobalMuons")),
209  checkIfGolden_(iConfig.getParameter<bool>("checkIfGolden")),
210  splitMuons_(iConfig.getParameter<bool> ("ifSplitMuons")),
211  totalTracksToAnalyzer_(0),
212  goldenCtr(0),
213  twoTracksCtr(0),
214  goldenPlusTwoTracksCtr(0),
215  _passesTracksPlusMuonsCuts(0),
216  splitterTree_(0),
217  runNumber_(0), eventNumber_(0), luminosityBlock_(0),
218  dcaX1_spl_(0), dcaY1_spl_(0), dcaZ1_spl_(0),
219  dcaX2_spl_(0), dcaY2_spl_(0), dcaZ2_spl_(0),
220  dxy1_spl_(0), dxy2_spl_(0), ddxy_spl_(0),
221  dz1_spl_(0), dz2_spl_(0), ddz_spl_(0),
222  theta1_spl_(0), theta2_spl_(0), dtheta_spl_(0),
223  eta1_spl_(0), eta2_spl_(0), deta_spl_(0),
224  phi1_spl_(0), phi2_spl_(0), dphi_spl_(0),
225  pt1_spl_(0), pt2_spl_(0), dpt_spl_(0),
226  p1_spl_(0), p2_spl_(0), dp_spl_(0),
227  qoverpt1_spl_(0), qoverpt2_spl_(0), dqoverpt_spl_(0),
228  nHits1_spl_(0), nHitsPXB1_spl_(0), nHitsPXF1_spl_(0), nHitsTIB1_spl_(0),
229  nHitsTOB1_spl_(0), nHitsTID1_spl_(0), nHitsTEC1_spl_(0),
230  nHits2_spl_(0), nHitsPXB2_spl_(0), nHitsPXF2_spl_(0), nHitsTIB2_spl_(0),
231  nHitsTOB2_spl_(0), nHitsTID2_spl_(0), nHitsTEC2_spl_(0),
232 
233  dxy1Err_spl_(0), dxy2Err_spl_(0),
234  dz1Err_spl_(0), dz2Err_spl_(0),
235  theta1Err_spl_(0), theta2Err_spl_(0),
236  eta1Err_spl_(0), eta2Err_spl_(0),
237  phi1Err_spl_(0), phi2Err_spl_(0),
238  pt1Err_spl_(0), pt2Err_spl_(0),
239  qoverpt1Err_spl_(0), qoverpt2Err_spl_(0),
240 
241  dcaX_org_(0), dcaY_org_(0), dcaZ_org_(0),
242  dxy_org_(0), dz_org_(0),
243  theta_org_(0), eta_org_(0), phi_org_(0),
244  pt_org_(0), p_org_(0), qoverpt_org_(0),
245  norchi2_org_(0),
246  nHits_org_(0), nHitsPXB_org_(0), nHitsPXF_org_(0), nHitsTIB_org_(0),
247  nHitsTOB_org_(0), nHitsTID_org_(0), nHitsTEC_org_(0),
248 
249  dxyErr_org_(0), dzErr_org_(0),
250  thetaErr_org_(0), etaErr_org_(0), phiErr_org_(0),
251  ptErr_org_(0), qoverptErr_org_(0),
252 
253  dcaX1_sta_(0), dcaY1_sta_(0), dcaZ1_sta_(0),
254  dcaX2_sta_(0), dcaY2_sta_(0), dcaZ2_sta_(0),
255  dxy1_sta_(0), dxy2_sta_(0), ddxy_sta_(0),
256  dz1_sta_(0), dz2_sta_(0), ddz_sta_(0),
257  theta1_sta_(0), theta2_sta_(0), dtheta_sta_(0),
258  eta1_sta_(0), eta2_sta_(0), deta_sta_(0),
259  phi1_sta_(0), phi2_sta_(0), dphi_sta_(0),
260  pt1_sta_(0), pt2_sta_(0), dpt_sta_(0),
261  p1_sta_(0), p2_sta_(0), dp_sta_(0),
262  qoverpt1_sta_(0), qoverpt2_sta_(0), dqoverpt_sta_(0),
263 
264  dxy1Err_sta_(0), dxy2Err_sta_(0),
265  dz1Err_sta_(0), dz2Err_sta_(0),
266  theta1Err_sta_(0), theta2Err_sta_(0),
267  eta1Err_sta_(0), eta2Err_sta_(0),
268  phi1Err_sta_(0), phi2Err_sta_(0),
269  pt1Err_sta_(0), pt2Err_sta_(0),
270  qoverpt1Err_sta_(0), qoverpt2Err_sta_(0),
271 
272  dcaX1_glb_(0), dcaY1_glb_(0), dcaZ1_glb_(0),
273  dcaX2_glb_(0), dcaY2_glb_(0), dcaZ2_glb_(0),
274  dxy1_glb_(0), dxy2_glb_(0), ddxy_glb_(0),
275  dz1_glb_(0), dz2_glb_(0), ddz_glb_(0),
276  theta1_glb_(0), theta2_glb_(0), dtheta_glb_(0),
277  eta1_glb_(0), eta2_glb_(0), deta_glb_(0),
278  phi1_glb_(0), phi2_glb_(0), dphi_glb_(0),
279  pt1_glb_(0), pt2_glb_(0), dpt_glb_(0),
280  p1_glb_(0), p2_glb_(0), dp_glb_(0),
281  qoverpt1_glb_(0), qoverpt2_glb_(0), dqoverpt_glb_(0),
282  norchi1_glb_(0), norchi2_glb_(0),
283 
284  dxy1Err_glb_(0), dxy2Err_glb_(0),
285  dz1Err_glb_(0), dz2Err_glb_(0),
286  theta1Err_glb_(0), theta2Err_glb_(0),
287  eta1Err_glb_(0), eta2Err_glb_(0),
288  phi1Err_glb_(0), phi2Err_glb_(0),
289  pt1Err_glb_(0), pt2Err_glb_(0),
290  qoverpt1Err_glb_(0), qoverpt2Err_glb_(0),
291 
292  dcaX_orm_(0), dcaY_orm_(0), dcaZ_orm_(0),
293  dxy_orm_(0), dz_orm_(0),
294  theta_orm_(0), eta_orm_(0), phi_orm_(0),
295  pt_orm_(0), p_orm_(0), qoverpt_orm_(0),
296  norchi2_orm_(0),
297  dxyErr_orm_(0), dzErr_orm_(0),
298  thetaErr_orm_(0), etaErr_orm_(0), phiErr_orm_(0),
299  ptErr_orm_(0), qoverptErr_orm_(0)
300 {
301 
302 }
303 
304 
306 {}
307 
308 
309 //
310 // member functions
311 //
312 
313 // ------------ method called to for each event ------------
315 {
316 
317  // check if golden muon
318  bool isGolden = true;
319  if (checkIfGolden_) isGolden = is_gold_muon( iEvent );
320 
321  // grab collections
324  edm::Handle<reco::MuonCollection> originalGlobalMuons;
325  edm::Handle<std::vector<reco::Track> > originalTracks;
326  iEvent.getByLabel(splitTracks_, tracks);
327  iEvent.getByLabel(originalTracks_, originalTracks);
328  if (splitMuons_){
329  iEvent.getByLabel(splitGlobalMuons_, globalMuons);
330  iEvent.getByLabel(originalGlobalMuons_, originalGlobalMuons);
331  }
332 
335 
336 
338  if (isGolden) goldenCtr++;
339  if (tracks->size() == 2) twoTracksCtr++;
340  if (tracks->size() == 2 && originalTracks->size() == 1 && isGolden){
342 
343  int gmCtr = 0;
344  bool topGlobalMuonFlag = false;
345  bool bottomGlobalMuonFlag = false;
346  int topGlobalMuon = -1;
347  int bottomGlobalMuon = -1;
348  double topGlobalMuonNorchi2 = 1e10;
349  double bottomGlobalMuonNorchi2 = 1e10;
350 
351  if (splitMuons_){
352  // check if split global muons are good
353  for (std::vector<reco::Muon>::const_iterator gmI = globalMuons->begin(); gmI != globalMuons->end(); gmI++){
354 
355  if ( gmI->isTrackerMuon() && gmI->isStandAloneMuon() && gmI->isGlobalMuon() ){
356 
357  reco::TrackRef trackerTrackRef1( tracks, 0 );
358  reco::TrackRef trackerTrackRef2( tracks, 1 );
359 
360  if (gmI->innerTrack() == trackerTrackRef1){
361  if (gmI->globalTrack()->normalizedChi2() < topGlobalMuonNorchi2){
362  topGlobalMuonFlag = true;
363  topGlobalMuonNorchi2 = gmI->globalTrack()->normalizedChi2();
364  topGlobalMuon = gmCtr;
365  }
366  }
367  if (gmI->innerTrack() == trackerTrackRef2){
368  if (gmI->globalTrack()->normalizedChi2() < bottomGlobalMuonNorchi2){
369  bottomGlobalMuonFlag = true;
370  bottomGlobalMuonNorchi2 = gmI->globalTrack()->normalizedChi2();
371  bottomGlobalMuon = gmCtr;
372  }
373  }
374  }
375  gmCtr++;
376  }
377  }
378 
379  if ( (!splitMuons_) || (splitMuons_ && bottomGlobalMuonFlag && topGlobalMuonFlag) ){
380 
382 
383  // split tracks calculations
384  reco::Track track1 = tracks->at(0);
385  reco::Track track2 = tracks->at(1);
386 
387  math::XYZPoint dca1 = track1.referencePoint();
388  math::XYZPoint dca2 = track2.referencePoint();
389 
390  // looping through the hits for track 1
391  int Nrechits1 =0;
392  int nhitinTIB1 =0;
393  int nhitinTOB1 =0;
394  int nhitinTID1 =0;
395  int nhitinTEC1 =0;
396  int nhitinBPIX1 =0;
397  int nhitinFPIX1 =0;
398  for (trackingRecHit_iterator iHit = track1.recHitsBegin(); iHit != track1.recHitsEnd(); ++iHit) {
399 
400  if((*iHit)->isValid()) {
401 
402  Nrechits1++;
403 
404  int type =(*iHit)->geographicalId().subdetId();
405 
406  if(type==int(StripSubdetector::TIB)){++nhitinTIB1;}
407  if(type==int(StripSubdetector::TOB)){++nhitinTOB1;}
408  if(type==int(StripSubdetector::TID)){++nhitinTID1;}
409  if(type==int(StripSubdetector::TEC)){++nhitinTEC1;}
410  if(type==int( kBPIX)){++nhitinBPIX1;}
411  if(type==int( kFPIX)){++nhitinFPIX1;}
412 
413  }
414  }
415  nHits1_spl_ = Nrechits1;
416  nHitsTIB1_spl_ = nhitinTIB1;
417  nHitsTOB1_spl_ = nhitinTOB1;
418  nHitsTID1_spl_ = nhitinTID1;
419  nHitsTEC1_spl_ = nhitinTEC1;
420  nHitsPXB1_spl_ = nhitinBPIX1;
421  nHitsPXF1_spl_ = nhitinFPIX1;
422 
423  // looping through the hits for track 2
424  int Nrechits2 =0;
425  int nhitinTIB2 =0;
426  int nhitinTOB2 =0;
427  int nhitinTID2 =0;
428  int nhitinTEC2 =0;
429  int nhitinBPIX2 =0;
430  int nhitinFPIX2 =0;
431  for (trackingRecHit_iterator iHit = track2.recHitsBegin(); iHit != track2.recHitsEnd(); ++iHit) {
432 
433  if((*iHit)->isValid()) {
434 
435  Nrechits2++;
436 
437  int type =(*iHit)->geographicalId().subdetId();
438 
439  if(type==int(StripSubdetector::TIB)){++nhitinTIB2;}
440  if(type==int(StripSubdetector::TOB)){++nhitinTOB2;}
441  if(type==int(StripSubdetector::TID)){++nhitinTID2;}
442  //\\if(type==int(StripSubdetector::TEC)){++nhitinTEC2;}
443  if(type==int( kBPIX)){++nhitinBPIX2;}
444  if(type==int( kFPIX)){++nhitinFPIX2;}
445 
446  }
447  }
448  nHits2_spl_ = Nrechits2;
449  nHitsTIB2_spl_ = nhitinTIB2;
450  nHitsTOB2_spl_ = nhitinTOB2;
451  nHitsTID2_spl_ = nhitinTID2;
452  nHitsTEC2_spl_ = nhitinTEC2;
453  nHitsPXB2_spl_ = nhitinBPIX2;
454  nHitsPXF2_spl_ = nhitinFPIX2;
455 
456 
457  double ddxy_Val = track1.d0() - track2.d0();
458  double ddz_Val = track1.dz() - track2.dz();
459  double dtheta_Val = track1.theta() - track2.theta();
460  double deta_Val = track1.eta() - track2.eta();
461  double dphi_Val = track1.phi() - track2.phi();
462  double dpt_Val = track1.pt() - track2.pt();
463  double dp_Val = track1.p() - track2.p();
464  double dqoverpt_Val = track1.charge() / track1.pt() - track2.charge() / track2.pt();
465 
466  // original tracks calculations
467  reco::Track origTrack = originalTracks->at(0);
468  math::XYZPoint dca_org = origTrack.referencePoint();
469 
470  // looping through the hits for the original track
471  int Nrechitsorg =0;
472  int nhitinTIBorg =0;
473  int nhitinTOBorg =0;
474  int nhitinTIDorg =0;
475  int nhitinTECorg =0;
476  int nhitinBPIXorg =0;
477  int nhitinFPIXorg =0;
478  for (trackingRecHit_iterator iHit = origTrack.recHitsBegin(); iHit != origTrack.recHitsEnd(); ++iHit) {
479 
480  if((*iHit)->isValid()) {
481 
482  Nrechitsorg++;
483 
484  int type =(*iHit)->geographicalId().subdetId();
485 
486  if(type==int(StripSubdetector::TIB)){++nhitinTIBorg;}
487  if(type==int(StripSubdetector::TOB)){++nhitinTOBorg;}
488  if(type==int(StripSubdetector::TID)){++nhitinTIDorg;}
489  //\\if(type==int(StripSubdetector::TEC)){++nhitinTECorg;}
490  if(type==int( kBPIX)){++nhitinBPIXorg;}
491  if(type==int( kFPIX)){++nhitinFPIXorg;}
492 
493  }
494  }
495  nHits_org_ = Nrechitsorg;
496  nHitsTIB_org_ = nhitinTIBorg;
497  nHitsTOB_org_ = nhitinTOBorg;
498  nHitsTID_org_ = nhitinTIDorg;
499  nHitsTEC_org_ = nhitinTECorg;
500  nHitsPXB_org_ = nhitinBPIXorg;
501  nHitsPXF_org_ = nhitinFPIXorg;
502 
503  // fill tree
504  runNumber_ = iEvent.id().run();
505  luminosityBlock_ = iEvent.id().luminosityBlock();
506  eventNumber_ = iEvent.id().event();
507  // split tracks
508  dcaX1_spl_ = dca1.x();
509  dcaY1_spl_ = dca1.y();
510  dcaZ1_spl_ = dca1.z();
511  dcaX2_spl_ = dca2.x();
512  dcaY2_spl_ = dca2.y();
513  dcaZ2_spl_ = dca2.z();
514  dxy1_spl_ = track1.d0();
515  dxy2_spl_ = track2.d0();
516  ddxy_spl_ = ddxy_Val;
517  dz1_spl_ = track1.dz();
518  dz2_spl_ = track2.dz();
519  ddz_spl_ = ddz_Val;
520  theta1_spl_ = track1.theta();
521  theta2_spl_ = track2.theta();
522  dtheta_spl_ = dtheta_Val;
523  eta1_spl_ = track1.eta();
524  eta2_spl_ = track2.eta();
525  deta_spl_ = deta_Val;
526  phi1_spl_ = track1.phi();
527  phi2_spl_ = track2.phi();
528  dphi_spl_ = dphi_Val;
529  pt1_spl_ = track1.pt();
530  pt2_spl_ = track2.pt();
531  dpt_spl_ = dpt_Val;
532  p1_spl_ = track1.p();
533  p2_spl_ = track2.p();
534  dp_spl_ = dp_Val;
535  qoverpt1_spl_ = track1.charge() / track1.pt();
536  qoverpt2_spl_ = track2.charge() / track2.pt();
537  dqoverpt_spl_ = dqoverpt_Val;
538  dxy1Err_spl_ = track1.d0Error();
539  dxy2Err_spl_ = track2.d0Error();
540  dz1Err_spl_ = track1.dzError();
541  dz2Err_spl_ = track2.dzError();
542  theta1Err_spl_ = track1.thetaError();
543  theta2Err_spl_ = track2.thetaError();
544  eta1Err_spl_ = track1.etaError();
545  eta2Err_spl_ = track2.etaError();
546  phi1Err_spl_ = track1.phiError();
547  phi2Err_spl_ = track2.phiError();
548  pt1Err_spl_ = track1.ptError();
549  pt2Err_spl_ = track2.ptError();
552 
553  // original tracks
554  dcaX_org_ = dca_org.x();
555  dcaY_org_ = dca_org.y();
556  dcaZ_org_ = dca_org.z();
557  dxy_org_ = origTrack.d0();
558  dz_org_ = origTrack.dz();
559  theta_org_ = origTrack.theta();
560  eta_org_ = origTrack.eta();
561  phi_org_ = origTrack.phi();
562  pt_org_ = origTrack.pt();
563  p_org_ = origTrack.p();
564  qoverpt_org_ = origTrack.charge() / origTrack.pt();
565  norchi2_org_ = origTrack.normalizedChi2();
566 
567  dxyErr_org_ = origTrack.d0Error();
568  dzErr_org_ = origTrack.dzError();
569  thetaErr_org_ = origTrack.thetaError();
570  etaErr_org_ = origTrack.etaError();
571  phiErr_org_ = origTrack.phiError();
572  ptErr_org_ = origTrack.ptError();
574 
575  // split muons calculations
576  if (splitMuons_){
577 
578  reco::Muon muonTop = globalMuons->at( topGlobalMuon );
579  reco::Muon muonBottom = globalMuons->at( bottomGlobalMuon );
580 
581  reco::TrackRef glb1 = muonTop.globalTrack();
582  reco::TrackRef glb2 = muonBottom.globalTrack();
583  reco::TrackRef sta1 = muonTop.outerTrack();
584  reco::TrackRef sta2 = muonBottom.outerTrack();
585 
586  // standalone muon variables
587  dcaX1_sta_ = sta1->referencePoint().x();
588  dcaY1_sta_ = sta1->referencePoint().y();
589  dcaZ1_sta_ = sta1->referencePoint().z();
590  dcaX2_sta_ = sta2->referencePoint().x();
591  dcaY2_sta_ = sta2->referencePoint().y();
592  dcaZ2_sta_ = sta2->referencePoint().z();
593  dxy1_sta_ = sta1->d0();
594  dxy2_sta_ = sta2->d0();
595  ddxy_sta_ = sta1->d0() - sta2->d0();
596  dz1_sta_ = sta1->dz();
597  dz2_sta_ = sta2->dz();
598  ddz_sta_ = sta1->dz() - sta2->dz();
599  theta1_sta_ = sta1->theta();
600  theta2_sta_ = sta2->theta();
601  dtheta_sta_ = sta1->theta() - sta2->theta();
602  eta1_sta_ = sta1->eta();
603  eta2_sta_ = sta2->eta();
605  phi1_sta_ = sta1->phi();
606  phi2_sta_ = sta2->phi();
607  dphi_sta_ = sta1->phi() - sta2->phi();
608  pt1_sta_ = sta1->pt();
609  pt2_sta_ = sta2->pt();
610  dpt_sta_ = sta1->pt() - sta2->pt();
611  p1_sta_ = sta1->p();
612  p2_sta_ = sta2->p();
613  dp_sta_ = sta1->p() - sta2->p();
614  qoverpt1_sta_ = sta1->charge() / sta1->pt();
615  qoverpt2_sta_ = sta2->charge() / sta2->pt();
617  dxy1Err_sta_ = sta1->dxyError();
618  dxy2Err_sta_ = sta2->dxyError();
619  dz1Err_sta_ = sta1->dzError();
620  dz2Err_sta_ = sta2->dzError();
621  theta1Err_sta_ = sta1->thetaError();
622  theta2Err_sta_ = sta2->thetaError();
623  eta1Err_sta_ = sta1->etaError();
624  eta2Err_sta_ = sta2->etaError();
625  phi1Err_sta_ = sta1->phiError();
626  phi2Err_sta_ = sta2->phiError();
627  pt1Err_sta_ = sta1->ptError();
628  pt2Err_sta_ = sta2->ptError();
630  qoverpt2Err_sta_ = qoverpt2_sta_ * pt2Err_sta_ / pt2_sta_;
631 
632  // global muon variables
633  dcaX1_glb_ = glb1->referencePoint().x();
634  dcaY1_glb_ = glb1->referencePoint().y();
635  dcaZ1_glb_ = glb1->referencePoint().z();
636  dcaX2_glb_ = glb2->referencePoint().x();
637  dcaY2_glb_ = glb2->referencePoint().y();
638  dcaZ2_glb_ = glb2->referencePoint().z();
639  dxy1_glb_ = glb1->d0();
640  dxy2_glb_ = glb2->d0();
641  ddxy_glb_ = glb1->d0() - glb2->d0();
642  dz1_glb_ = glb1->dz();
643  dz2_glb_ = glb2->dz();
644  ddz_glb_ = glb1->dz() - glb2->dz();
645  theta1_glb_ = glb1->theta();
646  theta2_glb_ = glb2->theta();
647  dtheta_glb_ = glb1->theta() - glb2->theta();
648  eta1_glb_ = glb1->eta();
649  eta2_glb_ = glb2->eta();
651  phi1_glb_ = glb1->phi();
652  phi2_glb_ = glb2->phi();
653  dphi_glb_ = glb1->phi() - glb2->phi();
654  pt1_glb_ = glb1->pt();
655  pt2_glb_ = glb2->pt();
656  dpt_glb_ = glb1->pt() - glb2->pt();
657  p1_glb_ = glb1->p();
658  p2_glb_ = glb2->p();
659  dp_glb_ = glb1->p() - glb2->p();
660  qoverpt1_glb_ = glb1->charge() / glb1->pt();
661  qoverpt2_glb_ = glb2->charge() / glb2->pt();
663  norchi1_glb_ = glb1->normalizedChi2();
664  norchi2_glb_ = glb2->normalizedChi2();
665 
666  dxy1Err_glb_ = glb1->d0Error();
667  dxy2Err_glb_ = glb2->d0Error();
668  dz1Err_glb_ = glb1->dzError();
669  dz2Err_glb_ = glb2->dzError();
670  theta1Err_glb_ = glb1->thetaError();
671  theta2Err_glb_ = glb2->thetaError();
672  eta1Err_glb_ = glb1->etaError();
673  eta2Err_glb_ = glb2->etaError();
674  phi1Err_glb_ = glb1->phiError();
675  phi2Err_glb_ = glb2->phiError();
676  pt1Err_glb_ = glb1->ptError();
677  pt2Err_glb_ = glb2->ptError();
679  qoverpt2Err_glb_ = qoverpt2_glb_ * pt2Err_glb_ / pt2_glb_;
680 
681  }
682 
683 
684  splitterTree_->Fill();
685  }
686  }
687 
688 
689 }
690 
691 
692 // ------------ method called once each job just before starting event loop ------------
694 {
695  edm::LogInfo("beginJob") << "Begin Job" << std::endl;
696 
697  splitterTree_ = tfile->make<TTree>("splitterTree","splitterTree");
698 
699  splitterTree_->Branch("runNumber", &runNumber_, "runNumber/I");
700  splitterTree_->Branch("eventNumber", &eventNumber_, "eventNumber/I");
701  splitterTree_->Branch("luminosityBlock", &luminosityBlock_, "luminosityBlock/I");
702 
703  // split track variables
704  splitterTree_->Branch("dcaX1_spl", &dcaX1_spl_, "dcaX1_spl/D");
705  splitterTree_->Branch("dcaY1_spl", &dcaY1_spl_, "dcaY1_spl/D");
706  splitterTree_->Branch("dcaZ1_spl", &dcaZ1_spl_, "dcaZ1_spl/D");
707  splitterTree_->Branch("dcaX2_spl", &dcaX2_spl_, "dcaX2_spl/D");
708  splitterTree_->Branch("dcaY2_spl", &dcaY2_spl_, "dcaY2_spl/D");
709  splitterTree_->Branch("dcaZ2_spl", &dcaZ2_spl_, "dcaZ2_spl/D");
710  splitterTree_->Branch("dxy1_spl", &dxy1_spl_, "dxy1_spl/D");
711  splitterTree_->Branch("dxy2_spl", &dxy2_spl_, "dxy2_spl/D");
712  splitterTree_->Branch("dz1_spl", &dz1_spl_, "dz1_spl/D");
713  splitterTree_->Branch("dz2_spl", &dz2_spl_, "dz2_spl/D");
714  splitterTree_->Branch("theta1_spl", &theta1_spl_, "theta1_spl/D");
715  splitterTree_->Branch("theta2_spl", &theta2_spl_, "theta2_spl/D");
716  splitterTree_->Branch("eta1_spl", &eta1_spl_, "eta1_spl/D");
717  splitterTree_->Branch("eta2_spl", &eta2_spl_, "eta2_spl/D");
718  splitterTree_->Branch("phi1_spl", &phi1_spl_, "phi1_spl/D");
719  splitterTree_->Branch("phi2_spl", &phi2_spl_, "phi2_spl/D");
720  splitterTree_->Branch("pt1_spl", &pt1_spl_, "pt1_spl/D");
721  splitterTree_->Branch("pt2_spl", &pt2_spl_, "pt2_spl/D");
722  splitterTree_->Branch("p1_spl", &p1_spl_, "p1_spl/D");
723  splitterTree_->Branch("p2_spl", &p2_spl_, "p2_spl/D");
724  splitterTree_->Branch("qoverpt1_spl", &qoverpt1_spl_, "qoverpt1_spl/D");
725  splitterTree_->Branch("qoverpt2_spl", &qoverpt2_spl_, "qoverpt2_spl/D");
726  splitterTree_->Branch("nHits1_spl", &nHits1_spl_, "nHits1_spl/I");
727  splitterTree_->Branch("nHitsPXB1_spl", &nHitsPXB1_spl_, "nHitsPXB1_spl/I");
728  splitterTree_->Branch("nHitsPXF1_spl", &nHitsPXF1_spl_, "nHitsPXF1_spl/I");
729  splitterTree_->Branch("nHitsTIB1_spl", &nHitsTIB1_spl_, "nHitsTIB1_spl/I");
730  splitterTree_->Branch("nHitsTOB1_spl", &nHitsTOB1_spl_, "nHitsTOB1_spl/I");
731  splitterTree_->Branch("nHitsTID1_spl", &nHitsTID1_spl_, "nHitsTID1_spl/I");
732  splitterTree_->Branch("nHitsTEC1_spl", &nHitsTEC1_spl_, "nHitsTEC1_spl/I");
733  splitterTree_->Branch("nHits2_spl", &nHits2_spl_, "nHits2_spl/I");
734  splitterTree_->Branch("nHitsPXB2_spl", &nHitsPXB2_spl_, "nHitsPXB2_spl/I");
735  splitterTree_->Branch("nHitsPXF2_spl", &nHitsPXF2_spl_, "nHitsPXF2_spl/I");
736  splitterTree_->Branch("nHitsTIB2_spl", &nHitsTIB2_spl_, "nHitsTIB2_spl/I");
737  splitterTree_->Branch("nHitsTOB2_spl", &nHitsTOB2_spl_, "nHitsTOB2_spl/I");
738  splitterTree_->Branch("nHitsTID2_spl", &nHitsTID2_spl_, "nHitsTID2_spl/I");
739  splitterTree_->Branch("nHitsTEC2_spl", &nHitsTEC2_spl_, "nHitsTEC2_spl/I");
740 
741 
742  splitterTree_->Branch("dxy1Err_spl", &dxy1Err_spl_, "dxy1Err_spl/D");
743  splitterTree_->Branch("dxy2Err_spl", &dxy2Err_spl_, "dxy2Err_spl/D");
744  splitterTree_->Branch("dz1Err_spl", &dz1Err_spl_, "dz1Err_spl/D");
745  splitterTree_->Branch("dz2Err_spl", &dz2Err_spl_, "dz2Err_spl/D");
746  splitterTree_->Branch("theta1Err_spl", &theta1Err_spl_, "theta1Err_spl/D");
747  splitterTree_->Branch("theta2Err_spl", &theta2Err_spl_, "theta2Err_spl/D");
748  splitterTree_->Branch("eta1Err_spl", &eta1Err_spl_, "eta1Err_spl/D");
749  splitterTree_->Branch("eta2Err_spl", &eta2Err_spl_, "eta2Err_spl/D");
750  splitterTree_->Branch("phi1Err_spl", &phi1Err_spl_, "phi1Err_spl/D");
751  splitterTree_->Branch("phi2Err_spl", &phi2Err_spl_, "phi2Err_spl/D");
752  splitterTree_->Branch("pt1Err_spl", &pt1Err_spl_, "pt1Err_spl/D");
753  splitterTree_->Branch("pt2Err_spl", &pt2Err_spl_, "pt2Err_spl/D");
754  splitterTree_->Branch("qoverpt1Err_spl", &qoverpt1Err_spl_, "qoverpt1Err_spl/D");
755  splitterTree_->Branch("qoverpt2Err_spl", &qoverpt2Err_spl_, "qoverpt2Err_spl/D");
756 
757  splitterTree_->Branch("dcaX_org", &dcaX_org_, "dcaX_org/D");
758  splitterTree_->Branch("dcaY_org", &dcaY_org_, "dcaY_org/D");
759  splitterTree_->Branch("dcaZ_org", &dcaZ_org_, "dcaZ_org/D");
760  splitterTree_->Branch("dxy_org", &dxy_org_, "dxy_org/D");
761  splitterTree_->Branch("dz_org", &dz_org_, "dz_org/D");
762  splitterTree_->Branch("theta_org", &theta_org_, "theta_org/D");
763  splitterTree_->Branch("eta_org", &eta_org_, "eta_org/D");
764  splitterTree_->Branch("phi_org", &phi_org_, "phi_org/D");
765  splitterTree_->Branch("pt_org", &pt_org_, "pt_org/D");
766  splitterTree_->Branch("p_org", &p_org_, "p_org/D");
767  splitterTree_->Branch("qoverpt_org", &qoverpt_org_, "qoverpt_org/D");
768  splitterTree_->Branch("norchi2_org", &norchi2_org_, "norchi2_org/D");
769 
770  splitterTree_->Branch("nHits_org", &nHits_org_, "nHits_org/I");
771  splitterTree_->Branch("nHitsPXB_org", &nHitsPXB_org_, "nHitsPXB_org/I");
772  splitterTree_->Branch("nHitsPXF_org", &nHitsPXF_org_, "nHitsPXF_org/I");
773  splitterTree_->Branch("nHitsTIB_org", &nHitsTIB_org_, "nHitsTIB_org/I");
774  splitterTree_->Branch("nHitsTOB_org", &nHitsTOB_org_, "nHitsTOB_org/I");
775  splitterTree_->Branch("nHitsTID_org", &nHitsTID_org_, "nHitsTID_org/I");
776  splitterTree_->Branch("nHitsTEC_org", &nHitsTEC_org_, "nHitsTEC_org/I");
777 
778  splitterTree_->Branch("dxyErr_org", &dxyErr_org_, "dxyErr_org/D");
779  splitterTree_->Branch("dzErr_org", &dzErr_org_, "dzErr_org/D");
780  splitterTree_->Branch("thetaErr_org", &thetaErr_org_, "thetaErr_org/D");
781  splitterTree_->Branch("etaErr_org", &etaErr_org_, "etaErr_org/D");
782  splitterTree_->Branch("phiErr_org", &phiErr_org_, "phiErr_org/D");
783  splitterTree_->Branch("ptErr_org", &ptErr_org_, "ptErr_org/D");
784  splitterTree_->Branch("qoverptErr_org", &qoverptErr_org_, "qoverptErr_org/D");
785 
786  //put the Deltas at the end of the tree, since they're the focus of the validation.
787  //this way, if you use splitterTree->Show(), they are immediately visible
788  splitterTree_->Branch("Delta_dxy", &ddxy_spl_, "Delta_dxy/D");
789  splitterTree_->Branch("Delta_dz", &ddz_spl_, "Delta_dz/D");
790  splitterTree_->Branch("Delta_theta", &dtheta_spl_, "Delta_theta/D");
791  splitterTree_->Branch("Delta_eta", &deta_spl_, "Delta_eta/D");
792  splitterTree_->Branch("Delta_phi", &dphi_spl_, "Delta_phi/D");
793  splitterTree_->Branch("Delta_pt", &dpt_spl_, "Delta_pt/D");
794  splitterTree_->Branch("Delta_p", &dp_spl_, "Delta_p/D");
795  splitterTree_->Branch("Delta_qoverpt", &dqoverpt_spl_, "Delta_qoverpt/D");
796 
797  if (splitMuons_){
798 
799  // standalone split
800  splitterTree_->Branch("dcaX1_sta", &dcaX1_sta_, "dcaX1_sta/D");
801  splitterTree_->Branch("dcaY1_sta", &dcaY1_sta_, "dcaY1_sta/D");
802  splitterTree_->Branch("dcaZ1_sta", &dcaZ1_sta_, "dcaZ1_sta/D");
803  splitterTree_->Branch("dcaX2_sta", &dcaX2_sta_, "dcaX2_sta/D");
804  splitterTree_->Branch("dcaY2_sta", &dcaY2_sta_, "dcaY2_sta/D");
805  splitterTree_->Branch("dcaZ2_sta", &dcaZ2_sta_, "dcaZ2_sta/D");
806  splitterTree_->Branch("dxy1_sta", &dxy1_sta_, "dxy1_sta/D");
807  splitterTree_->Branch("dxy2_sta", &dxy2_sta_, "dxy2_sta/D");
808  splitterTree_->Branch("ddxy_sta", &ddxy_sta_, "ddxy_sta/D");
809  splitterTree_->Branch("dz1_sta", &dz1_sta_, "dz1_sta/D");
810  splitterTree_->Branch("dz2_sta", &dz2_sta_, "dz2_sta/D");
811  splitterTree_->Branch("ddz_sta", &ddz_sta_, "ddz_sta/D");
812  splitterTree_->Branch("theta1_sta", &theta1_sta_, "theta1_sta/D");
813  splitterTree_->Branch("theta2_sta", &theta2_sta_, "theta2_sta/D");
814  splitterTree_->Branch("dtheta_sta", &dtheta_sta_, "dtheta_sta/D");
815  splitterTree_->Branch("eta1_sta", &eta1_sta_, "eta1_sta/D");
816  splitterTree_->Branch("eta2_sta", &eta2_sta_, "eta2_sta/D");
817  splitterTree_->Branch("deta_sta", &deta_sta_, "deta_sta/D");
818  splitterTree_->Branch("phi1_sta", &phi1_sta_, "phi1_sta/D");
819  splitterTree_->Branch("phi2_sta", &phi2_sta_, "phi2_sta/D");
820  splitterTree_->Branch("dphi_sta", &dphi_sta_, "dphi_sta/D");
821  splitterTree_->Branch("pt1_sta", &pt1_sta_, "pt1_sta/D");
822  splitterTree_->Branch("pt2_sta", &pt2_sta_, "pt2_sta/D");
823  splitterTree_->Branch("dpt_sta", &dpt_sta_, "dpt_sta/D");
824  splitterTree_->Branch("p1_sta", &p1_sta_, "p1_sta/D");
825  splitterTree_->Branch("p2_sta", &p2_sta_, "p2_sta/D");
826  splitterTree_->Branch("dp_sta", &dp_sta_, "dp_sta/D");
827 
828  splitterTree_->Branch("dxy1Err_sta", &dxy1Err_sta_, "dxy1Err_sta/D");
829  splitterTree_->Branch("dxy2Err_sta", &dxy2Err_sta_, "dxy2Err_sta/D");
830  splitterTree_->Branch("dz1Err_sta", &dz1Err_sta_, "dz1Err_sta/D");
831  splitterTree_->Branch("dz2Err_sta", &dz2Err_sta_, "dz2Err_sta/D");
832  splitterTree_->Branch("theta1Err_sta", &theta1Err_sta_, "theta1Err_sta/D");
833  splitterTree_->Branch("theta2Err_sta", &theta2Err_sta_, "theta2Err_sta/D");
834  splitterTree_->Branch("eta1Err_sta", &eta1Err_sta_, "eta1Err_sta/D");
835  splitterTree_->Branch("eta2Err_sta", &eta2Err_sta_, "eta2Err_sta/D");
836  splitterTree_->Branch("phi1Err_sta", &phi1Err_sta_, "phi1Err_sta/D");
837  splitterTree_->Branch("phi2Err_sta", &phi2Err_sta_, "phi2Err_sta/D");
838  splitterTree_->Branch("pt1Err_sta", &pt1Err_sta_, "pt1Err_sta/D");
839  splitterTree_->Branch("pt2Err_sta", &pt2Err_sta_, "pt2Err_sta/D");
840  splitterTree_->Branch("qoverpt1Err_sta", &qoverpt1Err_sta_, "qoverpt1Err_sta/D");
841  splitterTree_->Branch("qoverpt2Err_sta", &qoverpt2Err_sta_, "qoverpt2Err_sta/D");
842 
843  // global split
844  splitterTree_->Branch("dcaX1_glb", &dcaX1_glb_, "dcaX1_glb/D");
845  splitterTree_->Branch("dcaY1_glb", &dcaY1_glb_, "dcaY1_glb/D");
846  splitterTree_->Branch("dcaZ1_glb", &dcaZ1_glb_, "dcaZ1_glb/D");
847  splitterTree_->Branch("dcaX2_glb", &dcaX2_glb_, "dcaX2_glb/D");
848  splitterTree_->Branch("dcaY2_glb", &dcaY2_glb_, "dcaY2_glb/D");
849  splitterTree_->Branch("dcaZ2_glb", &dcaZ2_glb_, "dcaZ2_glb/D");
850  splitterTree_->Branch("dxy1_glb", &dxy1_glb_, "dxy1_glb/D");
851  splitterTree_->Branch("dxy2_glb", &dxy2_glb_, "dxy2_glb/D");
852  splitterTree_->Branch("ddxy_glb", &ddxy_glb_, "ddxy_glb/D");
853  splitterTree_->Branch("dz1_glb", &dz1_glb_, "dz1_glb/D");
854  splitterTree_->Branch("dz2_glb", &dz2_glb_, "dz2_glb/D");
855  splitterTree_->Branch("ddz_glb", &ddz_glb_, "ddz_glb/D");
856  splitterTree_->Branch("theta1_glb", &theta1_glb_, "theta1_glb/D");
857  splitterTree_->Branch("theta2_glb", &theta2_glb_, "theta2_glb/D");
858  splitterTree_->Branch("dtheta_glb", &dtheta_glb_, "dtheta_glb/D");
859  splitterTree_->Branch("eta1_glb", &eta1_glb_, "eta1_glb/D");
860  splitterTree_->Branch("eta2_glb", &eta2_glb_, "eta2_glb/D");
861  splitterTree_->Branch("deta_glb", &deta_glb_, "deta_glb/D");
862  splitterTree_->Branch("phi1_glb", &phi1_glb_, "phi1_glb/D");
863  splitterTree_->Branch("phi2_glb", &phi2_glb_, "phi2_glb/D");
864  splitterTree_->Branch("dphi_glb", &dphi_glb_, "dphi_glb/D");
865  splitterTree_->Branch("pt1_glb", &pt1_glb_, "pt1_glb/D");
866  splitterTree_->Branch("pt2_glb", &pt2_glb_, "pt2_glb/D");
867  splitterTree_->Branch("dpt_glb", &dpt_glb_, "dpt_glb/D");
868  splitterTree_->Branch("p1_glb", &p1_glb_, "p1_glb/D");
869  splitterTree_->Branch("p2_glb", &p2_glb_, "p2_glb/D");
870  splitterTree_->Branch("dp_glb", &dp_glb_, "dp_glb/D");
871  splitterTree_->Branch("qoverpt1_glb", &qoverpt1_glb_, "qoverpt1_glb/D");
872  splitterTree_->Branch("qoverpt2_glb", &qoverpt2_glb_, "qoverpt2_glb/D");
873  splitterTree_->Branch("dqoverpt_glb", &dqoverpt_glb_, "dqoverpt_glb/D");
874  splitterTree_->Branch("norchi1_glb", &norchi1_glb_, "norchi1_glb/D");
875  splitterTree_->Branch("norchi2_glb", &norchi2_glb_, "norchi2_glb/D");
876 
877  splitterTree_->Branch("dxy1Err_glb", &dxy1Err_glb_, "dxy1Err_glb/D");
878  splitterTree_->Branch("dxy2Err_glb", &dxy2Err_glb_, "dxy2Err_glb/D");
879  splitterTree_->Branch("dz1Err_glb", &dz1Err_glb_, "dz1Err_glb/D");
880  splitterTree_->Branch("dz2Err_glb", &dz2Err_glb_, "dz2Err_glb/D");
881  splitterTree_->Branch("theta1Err_glb", &theta1Err_glb_, "theta1Err_glb/D");
882  splitterTree_->Branch("theta2Err_glb", &theta2Err_glb_, "theta2Err_glb/D");
883  splitterTree_->Branch("eta1Err_glb", &eta1Err_glb_, "eta1Err_glb/D");
884  splitterTree_->Branch("eta2Err_glb", &eta2Err_glb_, "eta2Err_glb/D");
885  splitterTree_->Branch("phi1Err_glb", &phi1Err_glb_, "phi1Err_glb/D");
886  splitterTree_->Branch("phi2Err_glb", &phi2Err_glb_, "phi2Err_glb/D");
887  splitterTree_->Branch("pt1Err_glb", &pt1Err_glb_, "pt1Err_glb/D");
888  splitterTree_->Branch("pt2Err_glb", &pt2Err_glb_, "pt2Err_glb/D");
889  splitterTree_->Branch("qoverpt1Err_glb", &qoverpt1Err_glb_, "qoverpt1Err_glb/D");
890  splitterTree_->Branch("qoverpt2Err_glb", &qoverpt2Err_glb_, "qoverpt2Err_glb/D");
891 
892  }
893 
895  goldenCtr = 0;
896  twoTracksCtr = 0;
899 }
900 
901 
902 // ------------ method called once each job just after ending the event loop ------------
904 
905  //std::cout << "totalTracksToAnalyzer: " << totalTracksToAnalyzer_ << std::endl;
906  std::cout << "golden: " << goldenCtr << ", two tracks: " << twoTracksCtr << ", "
907  << "golden+twotracks: " << goldenPlusTwoTracksCtr << ", "
908  << "tracks+muons cuts: " << _passesTracksPlusMuonsCuts << std::endl;
909 }
910 
912 
914  e.getByLabel("STAMuons", muHandle);
915  const reco::MuonCollection & muons = *(muHandle.product());
916  // make sure there are 2 muons
917  if ( 2 != muons.size() ) return false;
918 
919  double mudd0=0., mudphi=0., muddsz=0., mudeta=0.;
920  for ( unsigned int bindex = 0; bindex < muons.size(); ++bindex ) {
921  reco::Muon mymuon = muons[bindex];
922  // deprecated in 21x (now outerTrack)
923  //reco::TrackRef mutrackref = mymuon.standAloneMuon();
924  reco::TrackRef mutrackref = mymuon.outerTrack();
925  const reco::Track* mutrack = mutrackref.get();
926  if (0 == bindex){
927  mudd0+=mutrack->d0();
928  mudphi+=mutrack->phi();
929  muddsz+=mutrack->dsz();
930  mudeta+=mymuon.eta();
931  }
932  if (1 == bindex){
933  mudd0-=mutrack->d0();
934  mudphi-=mutrack->phi();
935  muddsz-=mutrack->dsz();
936  mudeta-=mymuon.eta();
937  }
938  }
939  if ((fabs(mudd0)<15.0)&&(fabs(mudphi)<0.045)&&(fabs(muddsz)<20.0)&&(fabs(mudeta)<0.060)) return true;
940  return false;
941 }
942 
943 
944 //define this as a plug-in
RunNumber_t run() const
Definition: EventID.h:42
static const char runNumber_[]
double p() const
momentum vector magnitude
Definition: TrackBase.h:127
type
Definition: HCALResponse.h:21
edm::Service< TFileService > tfile
EventNumber_t event() const
Definition: EventID.h:44
double d0Error() const
error on d0
Definition: TrackBase.h:209
double d0() const
dxy parameter in perigee convention (d0 = - dxy)
Definition: TrackBase.h:121
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
Definition: TrackBase.h:109
CosmicSplitterValidation(const edm::ParameterSet &)
virtual void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override
double theta() const
polar angle
Definition: TrackBase.h:115
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
double etaError() const
error on eta
Definition: TrackBase.h:203
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:137
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
const Point & referencePoint() const
Reference point on the track.
Definition: TrackBase.h:151
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:43
double dsz() const
dsz parameter (THIS IS NOT the SZ impact parameter to (0,0,0) if refPoint is far from (0...
Definition: TrackBase.h:123
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
const int kFPIX
int iEvent
Definition: GenABIO.cc:230
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:139
virtual void beginJob() override
virtual float eta() const
momentum pseudorapidity
double pt() const
track transverse momentum
Definition: TrackBase.h:129
double ptError() const
error on Pt (set to 1000 TeV if charge==0 for safety)
Definition: TrackBase.h:192
double phiError() const
error on phi
Definition: TrackBase.h:205
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:63
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:390
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
Definition: Muon.h:51
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:125
double dzError() const
error on dz
Definition: TrackBase.h:213
tuple tracks
Definition: testEve_cfg.py:39
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
T const * product() const
Definition: Handle.h:81
edm::EventID id() const
Definition: EventBase.h:56
tuple muons
Definition: patZpeak.py:38
virtual void endJob() override
bool is_gold_muon(const edm::Event &e)
tuple cout
Definition: gather_cfg.py:121
int charge() const
track electric charge
Definition: TrackBase.h:111
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:242
double thetaError() const
error on theta
Definition: TrackBase.h:199
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54
const int kBPIX
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:65