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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
#ifndef DataFormats_ParticleFlowReco_PFTrack_h
#define DataFormats_ParticleFlowReco_PFTrack_h
#include "DataFormats/ParticleFlowReco/interface/PFTrajectoryPoint.h"
#include <iostream>
#include <vector>
namespace reco {
/**\class PFTrack
\brief Base class for particle flow input reconstructed tracks
and simulated particles.
A PFTrack contains a vector of PFTrajectoryPoint objects.
These points are stored in a vector to benefit from the
random access. One must take care of storing the points in
the right order, and it might even be necessary to insert dummy points.
For a PFRecTrack, the ordering of the points is the following:
- point 1: Closest approach
- point 2: Beam Pipe
- point 3 to n: Trajectory measurements (from the tracker layers)
- point n+1: Preshower Layer 1, or dummy point if
not in the preshower zone
- point n+2: Preshower Layer 2, or dummy point if
not in the preshower zone
- point n+3: ECAL Entrance
- point n+4: ECAL expected position of the shower maximum,
assuming the track is an electron track.
- point n+5: HCAL Entrance
For a PFSimParticle, the ordering of the points is the following.
- If the particle decays before ECAL:
- point 1: start point
- point 2: end point
- If the particle does not decay before ECAL:
- point 1: start point
- point 2: PS1 or dummy
- point 3: PS2 or dummy
- point 4: ECAL entrance
- point 5: HCAL entrance
\todo Note that some points are missing, and should be added: shower max,
intersection with the tracker layers maybe.
PFRecTracks and PFSimParticles are created in the PFTrackProducer module.
\todo Make this class abstract ?
\author Renaud Bruneliere
\date July 2006
*/
class PFTrack {
public:
PFTrack();
PFTrack(double charge);
PFTrack(const PFTrack& other);
PFTrack& operator=(const PFTrack& other) = default;
/// add a trajectory measurement
/// \todo throw an exception if the number of points is too large
void addPoint(const reco::PFTrajectoryPoint& trajPt);
/// set a trajectory point
void setPoint(unsigned int index, const reco::PFTrajectoryPoint& measurement) {
trajectoryPoints_[index] = measurement;
}
/// \return electric charge
double charge() const { return charge_; }
/// \return number of trajectory points
unsigned int nTrajectoryPoints() const { return trajectoryPoints_.size(); }
/// \return number of trajectory measurements in tracker
unsigned int nTrajectoryMeasurements() const {
return (indexOutermost_ ? indexOutermost_ - indexInnermost_ + 1 : 0);
}
/// \return vector of trajectory points
const std::vector<reco::PFTrajectoryPoint>& trajectoryPoints() const { return trajectoryPoints_; }
/// \return a trajectory point
const reco::PFTrajectoryPoint& trajectoryPoint(unsigned index) const { return trajectoryPoints_[index]; }
/// \return an extrapolated point
/// \todo throw an exception in case of invalid point.
const reco::PFTrajectoryPoint& extrapolatedPoint(unsigned layerid) const;
/// iterator on innermost tracker measurement
std::vector<reco::PFTrajectoryPoint>::const_iterator innermostMeasurement() const {
return trajectoryPoints_.begin() + indexInnermost_;
}
/// iterator on outermost tracker measurement
std::vector<reco::PFTrajectoryPoint>::const_iterator outermostMeasurement() const {
return trajectoryPoints_.begin() + indexOutermost_;
}
protected:
/// maximal number of tracking layers
static const unsigned int nMaxTrackingLayers_;
/// charge
double charge_;
/// vector of trajectory points
std::vector<reco::PFTrajectoryPoint> trajectoryPoints_;
/// index innermost tracker measurement
unsigned int indexInnermost_;
/// index outermost tracker measurement
unsigned int indexOutermost_;
};
std::ostream& operator<<(std::ostream& out, const PFTrack& track);
} // namespace reco
#endif
|