Back to home page

Project CMSSW displayed by LXR

 
 

    


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_; }  // should they be merged in a single value?
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