|
||||
File indexing completed on 2024-04-06 12:04:56
0001 #ifndef DataFormats_PatCandidates_interface_Vertexing_h 0002 #define DataFormats_PatCandidates_interface_Vertexing_h 0003 0004 #include "DataFormats/VertexReco/interface/VertexFwd.h" 0005 #include "DataFormats/VertexReco/interface/Vertex.h" 0006 #include "DataFormats/TrackReco/interface/Track.h" 0007 #include "DataFormats/Common/interface/Ptr.h" 0008 #include "DataFormats/GeometryCommonDetAlgo/interface/Measurement1DFloat.h" 0009 #include "DataFormats/GeometryCommonDetAlgo/interface/Measurement1D.h" 0010 0011 /** 0012 \class pat::VertexAssociation VertexAssociation.h "DataFormats/PatCandidates/interface/Vertexing.h" 0013 \brief Analysis-level structure for vertex-related information 0014 0015 pat::VertexAssociation holds a reference to a vertex and extended information like the distance between the object and the vertex. 0016 0017 For convenience, pat::VertexAssociation behaves like a VertexRef, that is (*assoc) is a reco::Vertex. 0018 0019 The original proposal is at https://hypernews.cern.ch/HyperNews/CMS/get/physTools/587.html 0020 0021 \author Giovanni Petrucciani 0022 */ 0023 0024 namespace pat { 0025 class VertexAssociation { 0026 public: 0027 //! Create a null vertx association 0028 VertexAssociation() {} 0029 //! Create a vertex association given a ref to a vertex 0030 VertexAssociation(const reco::VertexRef &vertex) : vertex_(vertex) {} 0031 //! Create a vertex association given a ref to a vertex and a reference to a track object 0032 /// Note: you also have to set the distances, they can be computed by the VertexAssociation itself 0033 /// because it requires access to the magnetic field and other condition data. 0034 VertexAssociation(const reco::VertexRef &vertex, const reco::TrackBaseRef &tk) : vertex_(vertex), track_(tk) {} 0035 // --- Methods to mimick VertexRef 0036 //! Return 'true' if this is a null association (that is, no vertex) 0037 bool isNull() const { return vertex_.isNull(); } 0038 //! Return 'true' unless this is a null association (that is, no vertex) 0039 bool isNonnull() const { return vertex_.isNonnull(); } 0040 //! Return 'true' if the reco::Vertex is available in the file, false if it has been dropped. 0041 bool isAvailable() const { return vertex_.isAvailable(); } 0042 //! Return the vertex (that is, you can do "const reco::Vertex &vtx = *assoc") 0043 const reco::Vertex &operator*() const { return *operator->(); } 0044 //! Allows VertexAssociation to behave like a vertex ref (e.g. to do "assoc->position()") 0045 const reco::Vertex *operator->() const { return vertex_.isNull() ? nullptr : vertex_.get(); } 0046 // --- Methods to get the Vertex and track 0047 //! Returns the reference to the vertex (can be a null reference) 0048 const reco::VertexRef &vertexRef() const { return vertex_; } 0049 //! Returns a pointer to the vertex, or a null pointer if there is no vertex (null association) 0050 const reco::Vertex *vertex() const { return vertex_.isNull() ? nullptr : vertex_.get(); } 0051 //! Returns 'true' if a reference to a track was stored in this VertexAssociation 0052 bool hasTrack() const { return !track_.isNull(); } 0053 //! Returns a reference to the track stored in this vertex (can be null) 0054 const reco::TrackBaseRef &trackRef() const { return track_; } 0055 //! Returns a C++ pointer to the track stored in this vertex (can be a null pointer) 0056 const reco::Track *track() const { return hasTrack() ? track_.get() : nullptr; } 0057 // --- Methods to return distances 0058 //! Distance between the object and the vertex along the Z axis, and it's error. 0059 /// Note 1: if the BeamSpot was used as Vertex, the error includes the BeamSpot spread! 0060 const Measurement1DFloat &dz() const { return dz_; } 0061 //! Distance between the object and the vertex in the transverse plane, and it's error. 0062 const Measurement1DFloat &dr() const { return dr_; } 0063 //! True if the transverse distance was computed for this VertexAssociation 0064 bool hasTransverseIP() const { return (dr_.value() != 0); } 0065 //! True if the errors on dr and dz have been set, false if they're nulls 0066 bool hasErrors() const { return (dz_.error() != 0) && (!hasTransverseIP() || dr_.error() != 0); } 0067 // ---- Methods to set distances 0068 void setDz(const Measurement1DFloat &dz) { dz_ = dz; } 0069 void setDr(const Measurement1DFloat &dr) { dr_ = dr; } 0070 void setDz(const Measurement1D &dz) { dz_ = Measurement1DFloat(dz.value(), dz.error()); } 0071 void setDr(const Measurement1D &dr) { dr_ = Measurement1DFloat(dr.value(), dr.error()); } 0072 //! Set dz and dr given the distance and the 3x3 total covariance matrix of the distance 0073 void setDistances(const AlgebraicVector3 &dist, const AlgebraicSymMatrix33 &err); 0074 //! Set dz and dr given the two points (object and vertex) and the 3x3 total covariance matrix of the distance 0075 /// The covariance matrix must already include the covariance matrix of the vertex 0076 /// 'p1', 'p2' can be anything that has methods .x(), .y(), .z() (e.g. GlobalPoint, Vertex, ...) 0077 template <typename T1, typename T2> 0078 void setDistances(const T1 &p1, const T2 &p2, const AlgebraicSymMatrix33 &err) { 0079 AlgebraicVector3 dist(p1.x() - p2.x(), p1.y() - p2.y(), p1.z() - p2.z()); 0080 setDistances(dist, err); 0081 } 0082 // ---- 3D significance of the impact parameter 0083 // float signif3d() const { return signif3d_; } 0084 // bool hasSignif3d() const { return signif3d_ != 0; } 0085 // void setSignif3d(float signif3d) { signif3d_ = signif3d; } 0086 private: 0087 // basic information 0088 reco::VertexRef vertex_; 0089 Measurement1DFloat dz_, dr_; 0090 // float signif3d_; 0091 // extended info 0092 reco::TrackBaseRef track_; 0093 // fixme: add refitted momentum 0094 }; 0095 } // namespace pat 0096 0097 #endif
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.2.1 LXR engine. The LXR team |