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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#ifndef TRACKINFO_RECOTRACKTOTP_H
#define TRACKINFO_RECOTRACKTOTP_H
#include "DataFormats/TrackReco/interface/TrackFwd.h"
#include "DataFormats/TrackReco/interface/Track.h"
#include "DataFormats/VertexReco/interface/Vertex.h"
#include "DataFormats/VertexReco/interface/VertexFwd.h"
#include "DataFormats/BeamSpot/interface/BeamSpot.h"
#include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
#include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"
#include "SimDataFormats/TrackingAnalysis/interface/TrackingVertex.h"
#include "SimDataFormats/TrackingAnalysis/interface/TrackingVertexContainer.h"
#include "DataFormats/Math/interface/Vector3D.h"
#include "DataFormats/Math/interface/Point3D.h"
#include "DataFormats/GeometryVector/interface/GlobalPoint.h"
#include "DataFormats/GeometryVector/interface/GlobalVector.h"
#include "TMath.h"
//#include <vector>
class RecoTracktoTP {
public:
RecoTracktoTP();
~RecoTracktoTP();
void SetTrackingParticle(TrackingParticleRef tp) { trackingParticle_ = tp; }
void SetRecoTrack(reco::TrackBaseRef track) { recoTrack = track; }
void SetRecoVertex(reco::VertexRef vertex) { recoVertex = vertex; }
void SetBeamSpot(const math::XYZPoint &bs) { beamSpot_ = bs; }
void SetShared(const float &m) { shared_ = m; }
// Interogation Functions
reco::Track RT() const { return recoTrack.isNonnull() ? *recoTrack : reco::Track(); }
TrackingParticle TP() const { return trackingParticle_.isNonnull() ? *trackingParticle_ : TrackingParticle(); }
reco::Vertex RV() const { return recoVertex.isNonnull() ? *recoVertex : reco::Vertex(); }
math::XYZPoint BeamSpot() const { return beamSpot_; }
bool matched() const { return trackingParticle_.isNonnull() && recoTrack.isNonnull(); }
bool hasRV() const {
return recoVertex.isNonnull() && fabs(recoVertex->position().Mag2()) > 0.0;
} // position is ROOT::MATH::Cartesian3D<double>
bool hasPCA() const { return s_pca().mag() < 9999.0; }
bool allmatched() const { return matched() && hasRV(); }
// These members for reco d0 and dz are the TIP and LIP w.r.t the reconstructed BeamSpot (as opposed to (0,0,0) ).
double r_dxy() const { return RT().dxy(BeamSpot()); }
double r_dsz() const { return RT().dsz(BeamSpot()); }
double r_d0() const { return -1.0 * r_dxy(); }
double r_dz() const { return RT().dz(BeamSpot()); }
// These members for reco d0 and dz are the TIP and LIP w.r.t the reconstructed vertex (as opposed to (0,0,0) ).
double r_d02() const { return -1.0 * RT().dxy(RV().position()); }
double r_dz2() const { return RT().dz(RV().position()); }
// These members for sim d0 and dz are not included in the TrackingParticle class and must be included seperately.
void SetTrackingParticleMomentumPCA(const GlobalVector &p) { simMomPCA_ = p; }
void SetTrackingParticlePCA(const GlobalPoint &v) { simPCA_ = v; }
GlobalVector s_p() const { return simMomPCA_; }
GlobalPoint s_pca() const { return simPCA_; }
GlobalPoint s_v() const {
return GlobalPoint(s_pca().x() - BeamSpot().x(), s_pca().y() - BeamSpot().y(), s_pca().z() - BeamSpot().z());
}
double s_qoverp() const { return TP().charge() / s_p().mag(); }
double s_theta() const { return s_p().theta(); }
double s_lambda() const { return M_PI / 2 - s_p().theta(); }
double s_phi() const { return s_p().phi(); }
double s_eta() const { return -1.0 * log(tan(0.5 * s_p().theta())); }
double s_dxy() const { return (-s_v().x() * s_p().y() + s_v().y() * s_p().x()) / s_p().perp(); }
double s_dsz() const {
return s_v().z() * s_p().perp() / s_p().mag() -
((s_v().x() * s_p().x() + s_v().y() * s_p().y()) / s_p().perp()) * s_p().z() / s_p().mag();
}
double s_d0() const { return -1.0 * s_dxy(); }
double s_dz() const {
return s_v().z() - (s_v().x() * s_p().x() + s_v().y() * s_p().y()) / s_p().perp() * s_p().z() / s_p().perp();
}
float GetShared() const { return shared_; }
// Short cut methods to get TP truth info
TrackingParticle TPMother(unsigned short i) const;
TrackingParticle TPMother() const { return numTPMothers() == 1 ? TPMother(0) : TrackingParticle(); }
int numTPSourceTracks() const { return TP().parentVertex()->nSourceTracks(); }
int numTPMothers() const;
bool hasTPMother() const { return numTPMothers() > 0; }
protected:
reco::TrackBaseRef recoTrack;
reco::VertexRef recoVertex;
TrackingParticleRef trackingParticle_;
GlobalVector simMomPCA_; // Momentum at point of closest approach to the beamspot of the trackingParticle.
GlobalPoint simPCA_; // Point of closest approach to the BeamSpot of the TrackingParticle.
math::XYZPoint beamSpot_; // I use type XYZPoint to faciliate the use of the recoTrack memeber dxy(XYZPoint).
float shared_; // Number of shared hits with TP
};
#endif // TRACKINFO_RECOTRACKTOTP_H
|