CMS 3D CMS Logo

BPHKinematicFit.h
Go to the documentation of this file.
1 #ifndef HeavyFlavorAnalysis_RecoDecay_BPHKinematicFit_h
2 #define HeavyFlavorAnalysis_RecoDecay_BPHKinematicFit_h
3 
12 //----------------------
13 // Base Class Headers --
14 //----------------------
16 
17 //------------------------------------
18 // Collaborating Class Declarations --
19 //------------------------------------
22 
25 
26 //---------------
27 // C++ Headers --
28 //---------------
29 #include <string>
30 #include <vector>
31 #include <map>
32 #include <set>
33 
34 // ---------------------
35 // -- Class Interface --
36 // ---------------------
37 
38 class BPHKinematicFit : public virtual BPHDecayVertex {
39 public:
43  // deleted copy constructor and assignment operator
44  BPHKinematicFit(const BPHKinematicFit& x) = delete;
45  BPHKinematicFit& operator=(const BPHKinematicFit& x) = delete;
46 
49  ~BPHKinematicFit() override = default;
50 
54  void setConstraint(double mass, double sigma);
57  double constrMass() const;
58  double constrSigma() const;
60  void setIndependentFit(const std::string& name, bool flag = true, double mass = -1.0, double sigma = -1.0);
61 
63  virtual const std::vector<RefCountedKinematicParticle>& kinParticles() const;
64  virtual std::vector<RefCountedKinematicParticle> kinParticles(const std::vector<std::string>& names) const;
65 
67  virtual const RefCountedKinematicTree& kinematicTree() const;
68  virtual const RefCountedKinematicTree& kinematicTree(const std::string& name, double mass, double sigma) const;
69  virtual const RefCountedKinematicTree& kinematicTree(const std::string& name, double mass) const;
70  virtual const RefCountedKinematicTree& kinematicTree(const std::string& name) const;
74 
76  virtual void resetKinematicFit() const;
77 
79  virtual bool isEmpty() const;
80  virtual bool isValidFit() const;
81 
83  virtual const RefCountedKinematicParticle currentParticle() const;
84  virtual const RefCountedKinematicVertex currentDecayVertex() const;
85 
87  virtual const RefCountedKinematicParticle topParticle() const;
88  virtual const RefCountedKinematicVertex topDecayVertex() const;
89  virtual ParticleMass mass() const;
90 
92  virtual const math::XYZTLorentzVector& p4() const;
93 
95  double getMassSigma(const reco::Candidate* cand) const;
96 
98  bool getIndependentFit(const std::string& name, double& mass, double& sigma) const;
99 
100 protected:
101  // constructors
102  BPHKinematicFit(int daugNum = 2, int compNum = 2);
103  // pointer used to retrieve informations from other bases
104  BPHKinematicFit(const BPHKinematicFit* ptr);
105 
106  // add a simple particle giving it a name
107  // particles are cloned, eventually specifying a different mass
108  // and a sigma
109  virtual void addK(const std::string& name, const reco::Candidate* daug, double mass = -1.0, double sigma = -1.0);
110  // add a simple particle and specify a criterion to search for
111  // the associated track
112  virtual void addK(const std::string& name,
113  const reco::Candidate* daug,
114  const std::string& searchList,
115  double mass = -1.0,
116  double sigma = -1.0);
117  // add a previously reconstructed particle giving it a name
118  virtual void addK(const std::string& name, const BPHRecoConstCandPtr& comp);
119 
120  // utility function used to cash reconstruction results
121  void setNotUpdated() const override;
122 
123 private:
124  // mass constraint
125  double massConst;
126  double massSigma;
127 
128  // map linking daughters to mass sigma
129  std::map<const reco::Candidate*, double> dMSig;
130 
131  // map to handle composite daughters as single particles
132  struct FlyingParticle {
133  bool flag = false;
134  double mass = -1.0;
135  double sigma = -1.0;
136  };
137  std::map<const BPHRecoCandidate*, FlyingParticle> cKinP;
138 
139  // temporary particle set
140  mutable std::vector<BPHRecoConstCandPtr> tmpList;
141 
142  // reconstruction results cache
143  mutable bool oldKPs;
144  mutable bool oldFit;
145  mutable bool oldMom;
146  mutable std::map<const reco::Candidate*, RefCountedKinematicParticle> kinMap;
147  mutable std::map<const BPHRecoCandidate*, RefCountedKinematicParticle> kCDMap;
148  mutable std::vector<RefCountedKinematicParticle> allParticles;
151 
152  // build kin particles, perform the fit and compute the total momentum
153  virtual void buildParticles() const;
154  virtual void addParticles(std::vector<RefCountedKinematicParticle>& kl,
155  std::map<const reco::Candidate*, RefCountedKinematicParticle>& km,
156  std::map<const BPHRecoCandidate*, RefCountedKinematicParticle>& cm) const;
157  virtual void getParticles(const std::string& moth,
158  const std::string& daug,
159  std::vector<RefCountedKinematicParticle>& kl,
160  std::set<RefCountedKinematicParticle>& ks,
161  const BPHKinematicFit* curr) const;
162  virtual void getParticles(const std::string& moth,
163  const std::vector<std::string>& daug,
164  std::vector<RefCountedKinematicParticle>& kl,
165  std::set<RefCountedKinematicParticle>& ks,
166  const BPHKinematicFit* curr) const;
167  virtual unsigned int numParticles(const BPHKinematicFit* cand = nullptr) const;
169  std::vector<RefCountedKinematicParticle>& kl,
170  std::set<RefCountedKinematicParticle>& ks);
171  virtual const BPHKinematicFit* splitKP(const std::string& name,
172  std::vector<RefCountedKinematicParticle>* kComp,
173  std::vector<RefCountedKinematicParticle>* kTail = nullptr) const;
174  virtual const RefCountedKinematicTree& kinematicTree(const std::vector<RefCountedKinematicParticle>& kPart,
176  virtual void fitMomentum() const;
177 };
178 
179 #endif
virtual const RefCountedKinematicParticle topParticle() const
get top particle
virtual const RefCountedKinematicTree & kinematicTree() const
perform the kinematic fit and get the result
virtual const BPHKinematicFit * splitKP(const std::string &name, std::vector< RefCountedKinematicParticle > *kComp, std::vector< RefCountedKinematicParticle > *kTail=nullptr) const
virtual void fitMomentum() const
virtual void addK(const std::string &name, const reco::Candidate *daug, double mass=-1.0, double sigma=-1.0)
BPHGenericPtr< const BPHRecoCandidate >::type BPHRecoConstCandPtr
std::map< const BPHRecoCandidate *, RefCountedKinematicParticle > kCDMap
virtual unsigned int numParticles(const BPHKinematicFit *cand=nullptr) const
bool getIndependentFit(const std::string &name, double &mass, double &sigma) const
retrieve independent fit flag
virtual void addParticles(std::vector< RefCountedKinematicParticle > &kl, std::map< const reco::Candidate *, RefCountedKinematicParticle > &km, std::map< const BPHRecoCandidate *, RefCountedKinematicParticle > &cm) const
double ParticleMass
Definition: ParticleMass.h:4
virtual const RefCountedKinematicVertex topDecayVertex() const
~BPHKinematicFit() override=default
virtual const std::vector< RefCountedKinematicParticle > & kinParticles() const
get kinematic particles
const std::string names[nVars_]
BPHKinematicFit(const BPHKinematicFit &x)=delete
std::vector< BPHRecoConstCandPtr > tmpList
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
std::map< const reco::Candidate *, RefCountedKinematicParticle > kinMap
void setNotUpdated() const override
void setIndependentFit(const std::string &name, bool flag=true, double mass=-1.0, double sigma=-1.0)
set a decaying daughter as an unique particle fitted independently
std::map< const reco::Candidate *, double > dMSig
virtual const RefCountedKinematicVertex currentDecayVertex() const
BPHKinematicFit & operator=(const BPHKinematicFit &x)=delete
static void insertParticle(RefCountedKinematicParticle &kp, std::vector< RefCountedKinematicParticle > &kl, std::set< RefCountedKinematicParticle > &ks)
virtual void resetKinematicFit() const
reset the kinematic fit
virtual bool isValidFit() const
std::vector< RefCountedKinematicParticle > allParticles
RefCountedKinematicTree kinTree
std::map< const BPHRecoCandidate *, FlyingParticle > cKinP
virtual const RefCountedKinematicParticle currentParticle() const
get current particle
virtual bool isEmpty() const
get fit status
double constrMass() const
retrieve the constraint
virtual const math::XYZTLorentzVector & p4() const
compute total momentum after the fit
virtual void buildParticles() const
void setConstraint(double mass, double sigma)
apply a mass constraint
math::XYZTLorentzVector totalMomentum
double getMassSigma(const reco::Candidate *cand) const
retrieve particle mass sigma
virtual ParticleMass mass() const
virtual void getParticles(const std::string &moth, const std::string &daug, std::vector< RefCountedKinematicParticle > &kl, std::set< RefCountedKinematicParticle > &ks, const BPHKinematicFit *curr) const
double constrSigma() const