PFTrack

Macros

Line Code
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