File indexing completed on 2024-04-06 12:03:49
0001 #ifndef DataFormats_Candidate_VertexCompositePtrCandidate_H
0002 #define DataFormats_Candidate_VertexCompositePtrCandidate_H
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "DataFormats/Candidate/interface/VertexCompositePtrCandidateFwd.h"
0013 #include "DataFormats/Candidate/interface/CompositePtrCandidate.h"
0014
0015 namespace reco {
0016 class VertexCompositePtrCandidate : public CompositePtrCandidate {
0017 public:
0018 enum { dimension4D = 4 };
0019
0020 typedef math::Error<dimension4D>::type CovarianceMatrix4D;
0021
0022 enum { size4D = dimension4D * (dimension4D + 1) / 2 };
0023
0024 VertexCompositePtrCandidate() : CompositePtrCandidate(), chi2_(0), ndof_(0), time_(0) {}
0025
0026 VertexCompositePtrCandidate(
0027 Charge q, const LorentzVector &p4, const Point &vtx, int pdgId = 0, int status = 0, bool integerCharge = true)
0028 : CompositePtrCandidate(q, p4, vtx, pdgId, status, integerCharge), chi2_(0), ndof_(0), time_(0) {}
0029 VertexCompositePtrCandidate(Charge q,
0030 const LorentzVector &p4,
0031 const Point &vtx,
0032 double time,
0033 int pdgId = 0,
0034 int status = 0,
0035 bool integerCharge = true)
0036 : CompositePtrCandidate(q, p4, vtx, pdgId, status, integerCharge), chi2_(0), ndof_(0), time_(time) {}
0037
0038 VertexCompositePtrCandidate(Charge q,
0039 const LorentzVector &p4,
0040 const Point &vtx,
0041 const CovarianceMatrix &err,
0042 double chi2,
0043 double ndof,
0044 int pdgId = 0,
0045 int status = 0,
0046 bool integerCharge = true);
0047 VertexCompositePtrCandidate(Charge q,
0048 const LorentzVector &p4,
0049 const Point &vtx,
0050 double time,
0051 const CovarianceMatrix4D &err,
0052 double chi2,
0053 double ndof,
0054 int pdgId = 0,
0055 int status = 0,
0056 bool integerCharge = true);
0057
0058 explicit VertexCompositePtrCandidate(const Candidate &p) : CompositePtrCandidate(p), chi2_(0), ndof_(0), time_(0) {}
0059
0060 explicit VertexCompositePtrCandidate(const CompositePtrCandidate &p)
0061 : CompositePtrCandidate(p), chi2_(0), ndof_(0), time_(0) {}
0062
0063 ~VertexCompositePtrCandidate() override;
0064
0065 VertexCompositePtrCandidate *clone() const override;
0066
0067
0068 double vertexChi2() const override { return chi2_; }
0069
0070
0071
0072
0073
0074
0075 double vertexNdof() const override { return ndof_; }
0076
0077 double vertexNormalizedChi2() const override { return chi2_ / ndof_; }
0078
0079 double vertexCovariance(int i, int j) const override { return covariance_[idx(i, j)]; }
0080 using reco::LeafCandidate::vertexCovariance;
0081
0082 CovarianceMatrix4D vertexCovariance4D() const {
0083 CovarianceMatrix4D m;
0084 fillVertexCovariance(m);
0085 return m;
0086 }
0087
0088
0089 void fillVertexCovariance(CovarianceMatrix &v) const override;
0090
0091 void fillVertexCovariance(CovarianceMatrix4D &v) const;
0092
0093
0094 void setChi2AndNdof(double chi2, double ndof) {
0095 chi2_ = chi2;
0096 ndof_ = ndof;
0097 }
0098
0099 void setCovariance(const CovarianceMatrix &m);
0100
0101 void setCovariance(const CovarianceMatrix4D &m);
0102
0103
0104 void setTime(double time) { time_ = time; }
0105
0106
0107 typedef math::Error<dimension>::type Error;
0108 typedef math::Error<dimension4D>::type Error4D;
0109 const Point &position() const { return vertex(); }
0110 double t() const { return time_; }
0111 double tError() const { return std::sqrt(vertexCovariance(3, 3)); }
0112 Error error() const {
0113 Error m;
0114 fillVertexCovariance(m);
0115 return m;
0116 }
0117
0118 Error4D error4D() const {
0119 Error4D m;
0120 fillVertexCovariance(m);
0121 return m;
0122 }
0123
0124 private:
0125
0126 Double32_t chi2_;
0127
0128 Double32_t ndof_;
0129
0130 Double32_t covariance_[size4D];
0131
0132 Double32_t time_;
0133
0134 index idx(index i, index j) const {
0135 int a = (i <= j ? i : j), b = (i <= j ? j : i);
0136 return b * (b + 1) / 2 + a;
0137 }
0138 };
0139
0140 }
0141
0142 #endif