File indexing completed on 2025-05-08 02:18:42
0001 #ifndef PhysicsTools_BPHNano_KinVtxFitter
0002 #define PhysicsTools_BPHNano_KinVtxFitter
0003
0004 #include <vector>
0005
0006 #include "CommonTools/Statistics/interface/ChiSquaredProbability.h"
0007 #include "RecoVertex/KinematicFitPrimitives/interface/KinematicState.h"
0008 #include "RecoVertex/KinematicFitPrimitives/interface/RefCountedKinematicParticle.h"
0009 #include "RecoVertex/KinematicFitPrimitives/interface/RefCountedKinematicVertex.h"
0010 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
0011
0012 class KinVtxFitter {
0013 public:
0014 KinVtxFitter() : fitted_vtx_{}, fitted_state_{}, fitted_particle_{}, fitted_children_{}, fitted_track_{} {};
0015
0016 KinVtxFitter(const std::vector<reco::TransientTrack> tracks,
0017 const std::vector<double> masses,
0018 std::vector<float> sigmas);
0019
0020 KinVtxFitter(const std::vector<reco::TransientTrack> tracks,
0021 const std::vector<double> masses,
0022 std::vector<float> sigmas,
0023 ParticleMass dilep_mass);
0024
0025 ~KinVtxFitter() {};
0026
0027 bool success() const { return success_; }
0028 float chi2() const { return success_ ? fitted_vtx_->chiSquared() : 999; }
0029 float dof() const { return success_ ? fitted_vtx_->degreesOfFreedom() : -1; }
0030 float prob() const { return success_ ? ChiSquaredProbability(chi2(), dof()) : 0.; }
0031 float kin_chi2() const { return kin_chi2_; }
0032 float kin_ndof() const { return kin_ndof_; }
0033
0034 const KinematicState fitted_daughter(size_t i) const { return fitted_children_.at(i)->currentState(); }
0035
0036 const math::PtEtaPhiMLorentzVector daughter_p4(size_t i) const {
0037 const auto& state = fitted_children_.at(i)->currentState();
0038 return math::PtEtaPhiMLorentzVector(
0039 state.globalMomentum().perp(), state.globalMomentum().eta(), state.globalMomentum().phi(), state.mass());
0040 }
0041
0042 const KinematicState fitted_candidate() const { return fitted_state_; }
0043
0044 const RefCountedKinematicVertex fitted_refvtx() const { return fitted_vtx_; }
0045
0046 const math::PtEtaPhiMLorentzVector fitted_p4() const {
0047 return math::PtEtaPhiMLorentzVector(fitted_state_.globalMomentum().perp(),
0048 fitted_state_.globalMomentum().eta(),
0049 fitted_state_.globalMomentum().phi(),
0050 fitted_state_.mass());
0051 }
0052
0053 const reco::TransientTrack& fitted_candidate_ttrk() const { return fitted_track_; }
0054
0055 GlobalPoint fitted_vtx() const { return fitted_vtx_->position(); }
0056
0057 GlobalError fitted_vtx_uncertainty() const { return fitted_vtx_->error(); }
0058
0059 private:
0060 float kin_chi2_ = 0.;
0061 float kin_ndof_ = 0.;
0062 size_t n_particles_ = 0;
0063 bool success_ = false;
0064
0065 RefCountedKinematicVertex fitted_vtx_;
0066 KinematicState fitted_state_;
0067 RefCountedKinematicParticle fitted_particle_;
0068 std::vector<RefCountedKinematicParticle> fitted_children_;
0069 reco::TransientTrack fitted_track_;
0070 };
0071 #endif