CMS 3D CMS Logo

BPHKinematicFit.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author Paolo Ronchese INFN Padova
5  *
6  */
7 
8 //-----------------------
9 // This Class' Header --
10 //-----------------------
12 
13 //-------------------------------
14 // Collaborating Class Headers --
15 //-------------------------------
26 
27 //---------------
28 // C++ Headers --
29 //---------------
30 #include <iostream>
31 
32 using namespace std;
33 
34 //-------------------
35 // Initializations --
36 //-------------------
37 
38 //----------------
39 // Constructors --
40 //----------------
43  massConst(-1.0),
44  massSigma(-1.0),
45  oldKPs(true),
46  oldFit(true),
47  oldMom(true),
48  kinTree(nullptr) {}
49 
51  : BPHDecayVertex(ptr, nullptr),
52  massConst(-1.0),
53  massSigma(-1.0),
54  oldKPs(true),
55  oldFit(true),
56  oldMom(true),
57  kinTree(nullptr) {
58  map<const reco::Candidate*, const reco::Candidate*> iMap;
59  const vector<const reco::Candidate*>& daug = daughters();
60  const vector<Component>& list = ptr->componentList();
61  int i;
62  int n = daug.size();
63  for (i = 0; i < n; ++i) {
64  const reco::Candidate* cand = daug[i];
65  iMap[originalReco(cand)] = cand;
66  }
67  for (i = 0; i < n; ++i) {
68  const Component& c = list[i];
69  dMSig[iMap[c.cand]] = c.msig;
70  }
71  const vector<BPHRecoConstCandPtr>& dComp = daughComp();
72  int j;
73  int m = dComp.size();
74  for (j = 0; j < m; ++j) {
75  const map<const reco::Candidate*, double>& dMap = dComp[j]->dMSig;
76  dMSig.insert(dMap.begin(), dMap.end());
77  }
78 }
79 
80 //--------------
81 // Destructor --
82 //--------------
84 
85 //--------------
86 // Operations --
87 //--------------
88 void BPHKinematicFit::setConstraint(double mass, double sigma) {
89  oldFit = oldMom = true;
90  massConst = mass;
91  massSigma = sigma;
92  return;
93 }
94 
95 double BPHKinematicFit::constrMass() const { return massConst; }
96 
97 double BPHKinematicFit::constrSigma() const { return massSigma; }
98 
99 const vector<RefCountedKinematicParticle>& BPHKinematicFit::kinParticles() const {
100  if (oldKPs)
101  buildParticles();
102  return allParticles;
103 }
104 
105 vector<RefCountedKinematicParticle> BPHKinematicFit::kinParticles(const vector<string>& names) const {
106  if (oldKPs)
107  buildParticles();
108  const vector<const reco::Candidate*>& daugs = daughFull();
109  vector<RefCountedKinematicParticle> plist;
110  if (allParticles.size() != daugs.size())
111  return plist;
112  set<RefCountedKinematicParticle> pset;
113  int i;
114  int n = names.size();
115  int m = daugs.size();
116  plist.reserve(m);
117  for (i = 0; i < n; ++i) {
118  const string& pname = names[i];
119  if (pname == "*") {
120  int j = m;
121  while (j--) {
123  if (pset.find(kp) != pset.end())
124  continue;
125  plist.push_back(kp);
126  pset.insert(kp);
127  }
128  break;
129  }
130  map<const reco::Candidate*, RefCountedKinematicParticle>::const_iterator iter = kinMap.find(getDaug(pname));
131  map<const reco::Candidate*, RefCountedKinematicParticle>::const_iterator iend = kinMap.end();
132  if (iter != iend) {
133  const RefCountedKinematicParticle& kp = iter->second;
134  if (pset.find(kp) != pset.end())
135  continue;
136  plist.push_back(kp);
137  pset.insert(kp);
138  } else {
139  edm::LogPrint("ParticleNotFound") << "BPHKinematicFit::kinParticles: " << pname << " not found";
140  }
141  }
142  return plist;
143 }
144 
146  if (oldFit)
147  return kinematicTree("", massConst, massSigma);
148  return kinTree;
149 }
150 
151 const RefCountedKinematicTree& BPHKinematicFit::kinematicTree(const string& name, double mass, double sigma) const {
152  if (sigma < 0)
153  return kinematicTree(name, mass);
154  ParticleMass mc = mass;
155  MassKinematicConstraint kinConst(mc, sigma);
156  return kinematicTree(name, &kinConst);
157 }
158 
159 const RefCountedKinematicTree& BPHKinematicFit::kinematicTree(const string& name, double mass) const {
160  if (mass < 0) {
161  kinTree = RefCountedKinematicTree(nullptr);
162  oldFit = false;
163  return kinTree;
164  }
165  int nn = daughFull().size();
166  ParticleMass mc = mass;
167  if (nn == 2) {
168  TwoTrackMassKinematicConstraint kinConst(mc);
169  return kinematicTree(name, &kinConst);
170  } else {
171  MultiTrackMassKinematicConstraint kinConst(mc, nn);
172  return kinematicTree(name, &kinConst);
173  }
174 }
175 
177  kinTree = RefCountedKinematicTree(nullptr);
178  oldFit = false;
179  kinParticles();
180  if (allParticles.size() != daughFull().size())
181  return kinTree;
182  vector<RefCountedKinematicParticle> kComp;
183  vector<RefCountedKinematicParticle> kTail;
184  if (!name.empty()) {
185  const BPHRecoCandidate* comp = getComp(name).get();
186  if (comp == nullptr) {
187  edm::LogPrint("ParticleNotFound") << "BPHKinematicFit::kinematicTree: " << name << " daughter not found";
188  return kinTree;
189  }
190  const vector<string>& names = comp->daugNames();
191  int ns;
192  int nn = ns = names.size();
193  vector<string> nfull(nn + 1);
194  nfull[nn] = "*";
195  while (nn--)
196  nfull[nn] = name + "/" + names[nn];
197  vector<RefCountedKinematicParticle> kPart = kinParticles(nfull);
198  vector<RefCountedKinematicParticle>::const_iterator iter = kPart.begin();
199  vector<RefCountedKinematicParticle>::const_iterator imid = iter + ns;
200  vector<RefCountedKinematicParticle>::const_iterator iend = kPart.end();
201  kComp.insert(kComp.end(), iter, imid);
202  kTail.insert(kTail.end(), imid, iend);
203  } else {
204  kComp = allParticles;
205  }
206  try {
208  RefCountedKinematicTree compTree = vtxFitter.fit(kComp);
209  if (compTree->isEmpty())
210  return kinTree;
211  KinematicParticleFitter kinFitter;
212  compTree = kinFitter.fit(kc, compTree);
213  if (compTree->isEmpty())
214  return kinTree;
215  compTree->movePointerToTheTop();
216  if (!kTail.empty()) {
217  RefCountedKinematicParticle compPart = compTree->currentParticle();
218  if (!compPart->currentState().isValid())
219  return kinTree;
220  kTail.push_back(compPart);
221  kinTree = vtxFitter.fit(kTail);
222  } else {
223  kinTree = compTree;
224  }
225  } catch (std::exception const&) {
226  edm::LogPrint("FitFailed") << "BPHKinematicFit::kinematicTree: "
227  << "kin fit reset";
228  kinTree = RefCountedKinematicTree(nullptr);
229  }
230  return kinTree;
231 }
232 
234  MultiTrackKinematicConstraint* kc) const {
235  kinTree = RefCountedKinematicTree(nullptr);
236  oldFit = false;
237  kinParticles();
238  if (allParticles.size() != daughFull().size())
239  return kinTree;
240  vector<string> nfull;
241  if (!name.empty()) {
242  const BPHRecoCandidate* comp = getComp(name).get();
243  if (comp == nullptr) {
244  edm::LogPrint("ParticleNotFound") << "BPHKinematicFit::kinematicTree: " << name << " daughter not found";
245  return kinTree;
246  }
247  const vector<string>& names = comp->daugNames();
248  int nn = names.size();
249  nfull.resize(nn + 1);
250  nfull[nn] = "*";
251  while (nn--)
252  nfull[nn] = name + "/" + names[nn];
253  } else {
254  nfull.push_back("*");
255  }
256  try {
258  kinTree = cvf.fit(kinParticles(nfull), kc);
259  } catch (std::exception const&) {
260  edm::LogPrint("FitFailed") << "BPHKinematicFit::kinematicTree: "
261  << "kin fit reset";
262  kinTree = RefCountedKinematicTree(nullptr);
263  }
264  return kinTree;
265 }
266 
268  oldKPs = oldFit = oldMom = true;
269  return;
270 }
271 
273  kinematicTree();
274  if (kinTree.get() == nullptr)
275  return true;
276  return kinTree->isEmpty();
277 }
278 
281  if (kPart.get() == nullptr)
282  return false;
283  return kPart->currentState().isValid();
284 }
285 
287  if (isEmpty())
288  return RefCountedKinematicParticle(nullptr);
289  return kinTree->currentParticle();
290 }
291 
293  if (isEmpty())
294  return RefCountedKinematicVertex(nullptr);
295  return kinTree->currentDecayVertex();
296 }
297 
300  if (kPart.get() == nullptr)
301  return -1.0;
302  const KinematicState kStat = kPart->currentState();
303  if (kStat.isValid())
304  return kStat.mass();
305  return -1.0;
306 }
307 
309  if (oldMom)
310  fitMomentum();
311  return totalMomentum;
312 }
313 
314 void BPHKinematicFit::addK(const string& name, const reco::Candidate* daug, double mass, double sigma) {
315  addK(name, daug, "cfhpmig", mass, sigma);
316  return;
317 }
318 
320  const string& name, const reco::Candidate* daug, const string& searchList, double mass, double sigma) {
321  addV(name, daug, searchList, mass);
322  dMSig[daughters().back()] = sigma;
323  return;
324 }
325 
326 void BPHKinematicFit::addK(const string& name, const BPHRecoConstCandPtr& comp) {
327  addV(name, comp);
328  const map<const reco::Candidate*, double>& dMap = comp->dMSig;
329  dMSig.insert(dMap.begin(), dMap.end());
330  return;
331 }
332 
336  return;
337 }
338 
340  kinMap.clear();
341  allParticles.clear();
342  const vector<const reco::Candidate*>& daug = daughFull();
344  int n = daug.size();
345  allParticles.reserve(n);
346  float chi = 0.0;
347  float ndf = 0.0;
348  while (n--) {
349  const reco::Candidate* cand = daug[n];
350  ParticleMass mass = cand->mass();
351  float sigma = dMSig.find(cand)->second;
352  if (sigma < 0)
353  sigma = 1.0e-7;
355  if (tt != nullptr)
356  allParticles.push_back(kinMap[cand] = pFactory.particle(*tt, mass, chi, ndf, sigma));
357  }
358  oldKPs = false;
359  return;
360 }
361 
363  if (isValidFit()) {
364  const KinematicState& ks = currentParticle()->currentState();
365  GlobalVector tm = ks.globalMomentum();
366  double x = tm.x();
367  double y = tm.y();
368  double z = tm.z();
369  double m = ks.mass();
370  double e = sqrt((x * x) + (y * y) + (z * z) + (m * m));
371  totalMomentum.SetPxPyPzE(x, y, z, e);
372  } else {
373  edm::LogPrint("FitNotFound") << "BPHKinematicFit::fitMomentum: "
374  << "simple momentum sum computed";
376  const vector<const reco::Candidate*>& daug = daughters();
377  int n = daug.size();
378  while (n--)
379  tm += daug[n]->p4();
380  const vector<BPHRecoConstCandPtr>& comp = daughComp();
381  int m = comp.size();
382  while (m--)
383  tm += comp[m]->p4();
384  totalMomentum = tm;
385  }
386  oldMom = false;
387  return;
388 }
const reco::Candidate * cand
virtual const math::XYZTLorentzVector & p4() const
compute total momentum after the fit
RefCountedKinematicTree fit(const std::vector< RefCountedKinematicParticle > &part)
bool isValid() const
virtual void buildParticles() 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
int kp
reco::TransientTrack * getTransientTrack(const reco::Candidate *cand) const
get TransientTrack for a daughter
double ParticleMass
Definition: ParticleMass.h:4
#define nullptr
T y() const
Definition: PV3DBase.h:60
virtual bool isEmpty() const
GlobalVector globalMomentum() const
virtual ParticleMass mass() const
std::map< std::string, const reco::Candidate * > dMap
virtual const std::vector< const reco::Candidate * > & daughters() const
const std::string names[nVars_]
virtual const RefCountedKinematicParticle currentParticle() const
std::vector< RefCountedKinematicTree > fit(KinematicConstraint *cs, const std::vector< RefCountedKinematicTree > &trees) const
ParticleMass mass() const
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
double constrSigma() const
std::map< const reco::Candidate *, RefCountedKinematicParticle > kinMap
double constrMass() const
retrieve the constraint
virtual void fitMomentum() const
virtual const RefCountedKinematicTree & kinematicTree() const
perform the kinematic fit and get the result
std::map< const reco::Candidate *, double > dMSig
virtual void addV(const std::string &name, const reco::Candidate *daug, const std::string &searchList, double mass)
T sqrt(T t)
Definition: SSEVec.h:19
virtual const RefCountedKinematicVertex currentDecayVertex() const
virtual const std::vector< RefCountedKinematicParticle > & kinParticles() const
get kinematic particles
void setNotUpdated() const override
T z() const
Definition: PV3DBase.h:61
const std::vector< Component > & componentList() const
RefCountedKinematicTree fit(const std::vector< RefCountedKinematicParticle > &particles) const
virtual const reco::Candidate * originalReco(const reco::Candidate *daug) const
get the original particle from the clone
void setNotUpdated() const override
virtual void resetKinematicFit() const
reset the kinematic fit
ReferenceCountingPointer< KinematicVertex > RefCountedKinematicVertex
ReferenceCountingPointer< KinematicTree > RefCountedKinematicTree
std::vector< RefCountedKinematicParticle > allParticles
virtual bool isValidFit() const
RefCountedKinematicTree kinTree
virtual double mass() const =0
mass
ReferenceCountingPointer< KinematicParticle > RefCountedKinematicParticle
virtual BPHRecoConstCandPtr getComp(const std::string &name) const
virtual const std::vector< BPHRecoConstCandPtr > & daughComp() const
virtual const std::vector< const reco::Candidate * > & daughFull() const
RefCountedKinematicParticle particle(const reco::TransientTrack &initialTrack, const ParticleMass &massGuess, float chiSquared, float degreesOfFr, float &m_sigma) const
void setConstraint(double mass, double sigma)
apply a mass constraint
math::XYZTLorentzVector totalMomentum
virtual const std::vector< std::string > & daugNames() const
virtual const reco::Candidate * getDaug(const std::string &name) const
~BPHKinematicFit() override
T x() const
Definition: PV3DBase.h:59
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run