Belle II Software development
TagVertexModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <analysis/modules/TagVertex/TagVertexModule.h>
10
11//to help printing out stuff
12#include<sstream>
13
14// framework aux
15#include <framework/gearbox/Unit.h>
16#include <framework/gearbox/Const.h>
17#include <framework/logging/Logger.h>
18
19// dataobjects
20#include <analysis/dataobjects/RestOfEvent.h>
21#include <analysis/dataobjects/FlavorTaggerInfo.h>
22
23// utilities
24#include <analysis/utility/PCmsLabTransform.h>
25#include <analysis/variables/TrackVariables.h>
26#include <analysis/utility/ParticleCopy.h>
27#include <analysis/utility/CLHEPToROOT.h>
28#include <analysis/utility/ROOTToCLHEP.h>
29#include <analysis/utility/DistanceTools.h>
30#include <analysis/utility/RotationTools.h>
31
32// vertex fitting
33#include <analysis/VertexFitting/KFit/VertexFitKFit.h>
34
35// mdst dataobject
36#include <mdst/dataobjects/HitPatternVXD.h>
37
38// Magnetic field
39#include <framework/geometry/BFieldManager.h>
40
41#include <TVector.h>
42#include <TRotation.h>
43#include <Math/Vector4D.h>
44
45using namespace std;
46using namespace Belle2;
47
49static const double realNaN = std::numeric_limits<double>::quiet_NaN();
50
52static const ROOT::Math::XYZVector vecNaN(realNaN, realNaN, realNaN);
53
55static const double arrayNaN[] = {
56 realNaN, realNaN, realNaN,
57 realNaN, realNaN, realNaN,
58 realNaN, realNaN, realNaN,
59};
60
62static const TMatrixDSym matNaN(3, arrayNaN);
63
64// import tools from RotationTools.h
65using RotationTools::rotateTensor;
66using RotationTools::rotateTensorInv;
67using RotationTools::toSymMatrix;
68using RotationTools::toVec;
69using RotationTools::getUnitOrthogonal;
70
71//-----------------------------------------------------------------
72// Register the Module
73//-----------------------------------------------------------------
75
76//-----------------------------------------------------------------
77// Implementation
78//-----------------------------------------------------------------
79
81 m_Bfield(0), m_fitTruthStatus(0), m_rollbackStatus(0), m_fitPval(0), m_mcTagLifeTime(-1), m_mcPDG(0), m_mcLifeTimeReco(-1),
82 m_deltaT(0), m_deltaTErr(0), m_mcDeltaTau(0), m_mcDeltaT(0),
83 m_FitType(0), m_tagVl(0),
84 m_truthTagVl(0), m_tagVlErr(0), m_tagVol(0), m_truthTagVol(0), m_tagVolErr(0), m_tagVNDF(0), m_tagVChi2(0), m_tagVChi2IP(0),
85 m_kFitReqReducedChi2(5),
86 m_verbose(true)
87{
88 // Set module properties
89 setDescription("Tag side Vertex Fitter for modular analysis");
91
92 // Parameter definitions
93 addParam("listName", m_listName, "name of particle list", string(""));
94 addParam("confidenceLevel", m_confidenceLevel,
95 "required confidence level of fit to keep particles in the list. Note that even with confidenceLevel == 0.0, errors during the fit might discard Particles in the list. confidenceLevel = -1 if an error occurs during the fit",
96 0.001);
97 addParam("MCAssociation", m_useMCassociation,
98 "'': no MC association. breco: use standard Breco MC association. internal: use internal MC association", string("breco"));
99 addParam("constraintType", m_constraintType,
100 "Choose the type of the constraint: noConstraint, IP (tag tracks constrained to be within the beam spot), tube (long tube along the BTag line of flight, only for fully reconstruced B rec), boost (long tube along the Upsilon(4S) boost direction), (breco)",
101 string("tube"));
102 addParam("trackFindingType", m_trackFindingType,
103 "Choose how to reconstruct the tracks on the tag side: standard, standard_PXD",
104 string("standard_PXD"));
105 addParam("maskName", m_roeMaskName,
106 "Choose ROE mask to get particles from ", string(RestOfEvent::c_defaultMaskName));
107 addParam("askMCInformation", m_mcInfo,
108 "TRUE when requesting MC Information from the tracks performing the vertex fit", false);
109 addParam("reqPXDHits", m_reqPXDHits,
110 "Minimum number of PXD hits for a track to be used in the vertex fit", 0);
111 addParam("fitAlgorithm", m_fitAlgo,
112 "Fitter used for the tag vertex fit: Rave or KFit", string("KFit"));
113 addParam("kFitReqReducedChi2", m_kFitReqReducedChi2,
114 "The required chi2/ndf to accept the kFit result, if it is higher, iteration procedure is applied", 5.0);
115 addParam("useTruthInFit", m_useTruthInFit,
116 "Use the true track parameters in the vertex fit", false);
117 addParam("useRollBack", m_useRollBack,
118 "Use rolled back non-primary tracks", false);
119}
120
122{
123 // magnetic field
124 m_Bfield = BFieldManager::getFieldInTesla(ROOT::Math::XYZVector(m_BeamSpotCenter)).Z();
125 // RAVE setup
127 B2INFO("TagVertexModule : magnetic field = " << m_Bfield);
128 // truth fit status will be set to 2 only if the MC info cannot be recovered
130 // roll back status will be set to 2 only if the MC info cannot be recovered
132
133 //input
135 m_plist.isRequired(m_listName);
136 // output
137 m_verArray.registerInDataStore();
139 //check if the fitting algorithm name is set correctly
140 if (m_fitAlgo != "Rave" && m_fitAlgo != "KFit")
141 B2FATAL("TagVertexModule: invalid fitting algorithm (must be set to either Rave or KFit).");
143 B2FATAL("TagVertexModule: invalid fitting option (useRollBack and useTruthInFit cannot be simultaneously set to true).");
144 //temporary while the one track fit is broken
145 if (m_trackFindingType == "singleTrack" || m_trackFindingType == "singleTrack_PXD")
146 B2FATAL("TagVertexModule : the singleTrack option is temporarily broken.");
147}
148
150{
151 //TODO: set magnetic field for each run
152 //m_Bfield = BFieldMap::Instance().getBField(m_BeamSpotCenter).Z();
153}
154
156{
157 if (!m_plist) {
158 B2ERROR("TagVertexModule: ParticleList " << m_listName << " not found");
159 return;
160 }
161
162 // output
164
165 std::vector<unsigned int> toRemove;
166
167 for (unsigned i = 0; i < m_plist->getListSize(); ++i) {
169
170 Particle* particle = m_plist->getParticle(i);
171 if (m_useMCassociation == "breco" || m_useMCassociation == "internal") BtagMCVertex(particle);
172 bool ok = doVertexFit(particle);
173 if (ok) deltaT(particle);
174
177 toRemove.push_back(particle->getArrayIndex());
178 } else {
179 // save information in the Vertex StoreArray
180 TagVertex* ver = m_verArray.appendNew();
181 // create relation: Particle <-> Vertex
182 particle->addRelationTo(ver);
183 // fill Vertex with content
184 if (ok) {
185 ver->setTagVertex(m_tagV);
188 ver->setDeltaT(m_deltaT);
194 ver->setFitType(m_FitType);
195 ver->setNTracks(m_tagParticles.size());
196 ver->setTagVl(m_tagVl);
199 ver->setTagVol(m_tagVol);
202 ver->setTagVNDF(m_tagVNDF);
213 } else {
214 ver->setTagVertex(m_tagV);
215 ver->setTagVertexPval(-1.);
216 ver->setDeltaT(m_deltaT);
219 ver->setMCTagBFlavor(0.);
222 ver->setFitType(m_FitType);
223 ver->setNTracks(m_tagParticles.size());
224 ver->setTagVl(m_tagVl);
227 ver->setTagVol(m_tagVol);
230 ver->setTagVNDF(-1111.);
231 ver->setTagVChi2(-1111.);
232 ver->setTagVChi2IP(-1111.);
241 }
242 }
243 }
244 m_plist->removeParticles(toRemove);
245
246 //free memory allocated by rave. initialize() would be enough, except that we must clean things up before program end...
247 //
249}
250
252{
253 //reset the fit truth status in case it was set to 2 in a previous fit
254
256
257 //reset the roll back status in case it was set to 2 in a previous fit
258
260
261 //set constraint type, reset pVal and B field
262
263 m_fitPval = 1;
264
265 if (!(Breco->getRelatedTo<RestOfEvent>())) {
266 m_FitType = -1;
267 return false;
268 }
269
270 if (m_Bfield == 0) {
271 B2ERROR("TagVertex: No magnetic field");
272 return false;
273 }
274
275 // recover beam spot info
276
277 m_BeamSpotCenter = m_beamSpotDB->getIPPosition();
278 m_BeamSpotCov.ResizeTo(3, 3);
279 m_BeamSpotCov = m_beamSpotDB->getCovVertex();
280
281 //make the beam spot bigger for the standard constraint
282
283 double beta = PCmsLabTransform().getBoostVector().Mag();
284 double bg = beta / sqrt(1 - beta * beta);
285
286 //TODO: What's the origin of these numbers?
287 double tauB = 1.519; //B0 lifetime in ps
288 double c = Const::speedOfLight / 1000.; // cm ps-1
289 double lB0 = tauB * bg * c;
290
291 //tube length here set to 20 * 2 * c tau beta gamma ~= 0.5 cm, should be enough to not bias the decay
292 //time but should still help getting rid of some pions from kshorts
293 m_constraintCov.ResizeTo(3, 3);
295 else if (m_constraintType == "tube") tie(m_constraintCenter, m_constraintCov) = findConstraintBTube(Breco, 200 * lB0);
296 else if (m_constraintType == "boost") tie(m_constraintCenter, m_constraintCov) = findConstraintBoost(200 * lB0);
297 else if (m_constraintType == "breco") tie(m_constraintCenter, m_constraintCov) = findConstraint(Breco, 200 * lB0);
298 else if (m_constraintType == "noConstraint") m_constraintCenter = ROOT::Math::XYZVector(); //zero vector
299 else {
300 B2ERROR("TagVertex: Invalid constraintType selected");
301 return false;
302 }
303
304 if (m_constraintCenter == vecNaN) {
305 B2ERROR("TagVertex: No correct fit constraint");
306 return false;
307 }
308
309 /* Depending on the user's choice, one of the possible algorithms is chosen for the fit. In case the algorithm does not converge, in order to assure
310 high efficiency, the next algorithm less restrictive is used. I.e, if standard_PXD does not work, the program tries with standard.
311 */
312
313 m_FitType = 0;
314 double minPVal = (m_fitAlgo != "KFit") ? 0.001 : 0.;
315 bool ok = false;
316
317 if (m_trackFindingType == "standard_PXD") {
319 if (m_tagParticles.size() > 0) {
320 ok = makeGeneralFit();
321 m_FitType = 3;
322 }
323 }
324
325 if (ok == false || m_fitPval < minPVal || m_trackFindingType == "standard") {
327 ok = m_tagParticles.size() > 0;
328 if (ok) {
329 ok = makeGeneralFit();
330 m_FitType = 4;
331 }
332 }
333
334 if ((ok == false || (m_fitPval <= 0. && m_fitAlgo == "Rave")) && m_constraintType != "noConstraint") {
336 ok = (m_constraintCenter != vecNaN);
337 if (ok) {
339 ok = (m_tagParticles.size() > 0);
340 }
341 if (ok) {
342 ok = makeGeneralFit();
343 m_FitType = 5;
344 }
345 }
346
347 return ok;
348}
349
350pair<ROOT::Math::XYZVector, TMatrixDSym> TagVertexModule::findConstraint(const Particle* Breco, double cut) const
351{
352 if (Breco->getPValue() < 0.) return make_pair(vecNaN, matNaN);
353
354 TMatrixDSym beamSpotCov(3);
355 beamSpotCov = m_beamSpotDB->getCovVertex();
356
358
359 double pmag = Breco->getMomentumMagnitude();
360 double xmag = (Breco->getVertex() - m_BeamSpotCenter).R();
361
362
363 TMatrixDSym TerrMatrix = Breco->getMomentumVertexErrorMatrix();
364 TMatrixDSym PerrMatrix(7);
365
366 for (int i = 0; i < 3; ++i) {
367 for (int j = 0; j < 3; ++j) {
368 if (i == j) {
369 PerrMatrix(i, j) = (beamSpotCov(i, j) + TerrMatrix(i, j)) * pmag / xmag;
370 } else {
371 PerrMatrix(i, j) = TerrMatrix(i, j);
372 }
373 PerrMatrix(i + 4, j + 4) = TerrMatrix(i + 4, j + 4);
374 }
375 }
376
377 PerrMatrix(3, 3) = 0.;
378
379 //Copy Breco, but use errors as are in PerrMatrix
380 Particle* Breco2 = ParticleCopy::copyParticle(Breco);
381 Breco2->setMomentumVertexErrorMatrix(PerrMatrix);
382
383
384 const Particle* BRecoRes = doVertexFitForBTube(Breco2, "kalman");
385 if (BRecoRes->getPValue() < 0) return make_pair(vecNaN, matNaN); //problems
386
387 // Overall error matrix
388 TMatrixDSym errFinal = TMatrixDSym(Breco->getVertexErrorMatrix() + BRecoRes->getVertexErrorMatrix());
389
390 // TODO : to be developed the extraction of the momentum from the rave fitted track
391
392 // Get expected pBtag 4-momentum using transverse-momentum conservation
393 ROOT::Math::XYZVector BvertDiff = pmag * (Breco->getVertex() - BRecoRes->getVertex()).Unit();
394 ROOT::Math::PxPyPzMVector pBrecEstimate(BvertDiff.X(), BvertDiff.Y(), BvertDiff.Z(), Breco->getPDGMass());
395 ROOT::Math::PxPyPzMVector pBtagEstimate = PCmsLabTransform::labToCms(pBrecEstimate);
396 pBtagEstimate.SetPxPyPzE(-pBtagEstimate.px(), -pBtagEstimate.py(), -pBtagEstimate.pz(), pBtagEstimate.E());
397 pBtagEstimate = PCmsLabTransform::cmsToLab(pBtagEstimate);
398
399 // rotate err-matrix such that pBrecEstimate goes to eZ
400 TMatrixD TubeZ = rotateTensorInv(pBrecEstimate.Vect(), errFinal);
401
402 TubeZ(2, 2) = cut * cut;
403 TubeZ(2, 0) = 0; TubeZ(0, 2) = 0;
404 TubeZ(2, 1) = 0; TubeZ(1, 2) = 0;
405
406
407 // rotate err-matrix such that eZ goes to pBtagEstimate
408 TMatrixD Tube = rotateTensor(B2Vector3D(pBtagEstimate.Vect()), TubeZ);
409
410 // Standard algorithm needs no shift
411 return make_pair(m_BeamSpotCenter, toSymMatrix(Tube));
412}
413
414pair<ROOT::Math::XYZVector, TMatrixDSym> TagVertexModule::findConstraintBTube(const Particle* Breco, double cut)
415{
416 //Use Breco as the creator of the B tube.
417 if ((Breco->getVertexErrorMatrix()(2, 2)) == 0.0) {
418 B2WARNING("In TagVertexModule::findConstraintBTube: cannot get a proper vertex for BReco. BTube constraint replaced by Boost.");
419 return findConstraintBoost(cut);
420 }
421
422
423 //vertex fit will give the intersection between the beam spot and the trajectory of the B
424 //(base of the BTube, or primary vtx cov matrix)
425 const Particle* tubecreatorBCopy = doVertexFitForBTube(Breco, "avf");
426 if (tubecreatorBCopy->getPValue() < 0) return make_pair(vecNaN, matNaN); //if problems
427
428
429 //get direction of B tag = opposite direction of B rec in CMF
430 ROOT::Math::PxPyPzEVector pBrec = tubecreatorBCopy->get4Vector();
431
432 //if we want the true info, replace the 4vector by the true one
433 if (m_useTruthInFit) {
434 const MCParticle* mcBr = Breco->getRelated<MCParticle>();
435 if (mcBr)
436 pBrec = mcBr->get4Vector();
437 else
439 }
440 ROOT::Math::PxPyPzEVector pBtag = PCmsLabTransform::labToCms(pBrec);
441 pBtag.SetPxPyPzE(-pBtag.px(), -pBtag.py(), -pBtag.pz(), pBtag.E());
442 pBtag = PCmsLabTransform::cmsToLab(pBtag);
443
444 //To create the B tube, strategy is: take the primary vtx cov matrix, and add to it a cov
445 //matrix corresponding to an very big error in the direction of the B tag
446 TMatrixDSym pv = tubecreatorBCopy->getVertexErrorMatrix();
447
448 //print some stuff if wanted
449 if (m_verbose) {
450 B2DEBUG(10, "Brec decay vertex before fit: " << printVector(Breco->getVertex()));
451 B2DEBUG(10, "Brec decay vertex after fit: " << printVector(tubecreatorBCopy->getVertex()));
452 B2DEBUG(10, "Brec direction before fit: " << printVector(float(1. / Breco->getP()) * Breco->getMomentum()));
453 B2DEBUG(10, "Brec direction after fit: " << printVector(float(1. / tubecreatorBCopy->getP()) * tubecreatorBCopy->getMomentum()));
454 B2DEBUG(10, "IP position: " << printVector(ROOT::Math::XYZVector(m_BeamSpotCenter.X(), m_BeamSpotCenter.Y(),
455 m_BeamSpotCenter.Z())));
456 B2DEBUG(10, "IP covariance: " << printMatrix(m_BeamSpotCov));
457 B2DEBUG(10, "Brec primary vertex: " << printVector(tubecreatorBCopy->getVertex()));
458 B2DEBUG(10, "Brec PV covariance: " << printMatrix(pv));
459 B2DEBUG(10, "BTag direction: " << printVector((1. / pBtag.P())*pBtag.Vect()));
460 }
461
462 //make a long error matrix along BTag direction
463 TMatrixD longerror(3, 3); longerror(2, 2) = cut * cut;
464
465
466 // make rotation matrix from z axis to BTag line of flight
467 TMatrixD longerrorRotated = rotateTensor(B2Vector3D(pBtag.Vect()), longerror);
468
469 //pvNew will correspond to the covariance matrix of the B tube
470 TMatrixD pvNew = TMatrixD(pv) + longerrorRotated;
471
472 //set the constraint
473 ROOT::Math::XYZVector constraintCenter = tubecreatorBCopy->getVertex();
474
475 //if we want the true info, set the centre of the constraint to the primary vertex
476 if (m_useTruthInFit) {
477 const MCParticle* mcBr = Breco->getRelated<MCParticle>();
478 if (mcBr) {
479 constraintCenter = mcBr->getProductionVertex();
480 }
481 }
482
483 if (m_verbose) {
484 B2DEBUG(10, "IPTube covariance: " << printMatrix(pvNew));
485 }
486
487 //The following is done to do the BTube constraint with a virtual track
488 //(ie KFit way)
489
490 m_tagMomentum = pBtag;
491
492 m_pvCov.ResizeTo(pv);
493 m_pvCov = pv;
494
495 return make_pair(constraintCenter, toSymMatrix(pvNew));
496}
497
498pair<ROOT::Math::XYZVector, TMatrixDSym> TagVertexModule::findConstraintBoost(double cut) const
499{
500 double d = 20e-4; //average transverse distance flown by B0
501
502 //make a long error matrix along boost direction
503 TMatrixD longerror(3, 3); longerror(2, 2) = cut * cut;
504 longerror(0, 0) = longerror(1, 1) = d * d;
505
507
508 TMatrixD longerrorRotated = rotateTensor(boostDir, longerror);
509
510 //Extend error of BeamSpotCov matrix in the boost direction
511 TMatrixDSym beamSpotCov = m_beamSpotDB->getCovVertex();
512 TMatrixD Tube = TMatrixD(beamSpotCov) + longerrorRotated;
513
514 // Standard algorithm needs no shift
515 ROOT::Math::XYZVector constraintCenter = m_BeamSpotCenter;
516
517 return make_pair(constraintCenter, toSymMatrix(Tube));
518}
519
521static double getProperLifeTime(const MCParticle* mc)
522{
523 double beta = mc->getMomentum().R() / mc->getEnergy();
524 return 1e3 * mc->getLifetime() * sqrt(1 - pow(beta, 2));
525}
526
528{
529 //fill vector with mcB (intended order: Reco, Tag)
530 vector<const MCParticle*> mcBs;
531 for (const MCParticle& mc : m_mcParticles) {
532 if (abs(mc.getPDG()) == abs(Breco->getPDGCode()))
533 mcBs.push_back(&mc);
534 }
535 //too few Bs
536 if (mcBs.size() < 2) return;
537
538 if (mcBs.size() > 2) {
539 B2WARNING("TagVertexModule:: Too many Bs found in MC");
540 }
541
542 auto isReco = [&](const MCParticle * mc) {
543 return (m_useMCassociation == "breco") ? (mc == Breco->getRelated<MCParticle>())
544 : compBrecoBgen(Breco, mc); //internal association
545 };
546
547 //nothing matched?
548 if (!isReco(mcBs[0]) && !isReco(mcBs[1])) {
549 return;
550 }
551
552 //first is Tag, second Reco -> swap the order
553 if (!isReco(mcBs[0]) && isReco(mcBs[1]))
554 swap(mcBs[0], mcBs[1]);
555
556 //both matched -> use closest vertex dist as Reco
557 if (isReco(mcBs[0]) && isReco(mcBs[1])) {
558 double dist0 = (mcBs[0]->getDecayVertex() - Breco->getVertex()).Mag2();
559 double dist1 = (mcBs[1]->getDecayVertex() - Breco->getVertex()).Mag2();
560 if (dist0 > dist1)
561 swap(mcBs[0], mcBs[1]);
562 }
563
564 m_mcVertReco = mcBs[0]->getDecayVertex();
565 m_mcLifeTimeReco = getProperLifeTime(mcBs[0]);
566 m_mcTagV = mcBs[1]->getDecayVertex();
567 m_mcTagLifeTime = getProperLifeTime(mcBs[1]);
568 m_mcPDG = mcBs[1]->getPDG();
569}
570
571// static
573{
574
575 bool isDecMode = true;
576
577 const std::vector<Belle2::Particle*> recDau = Breco->getDaughters();
578 const std::vector<Belle2::MCParticle*> genDau = Bgen->getDaughters();
579
580 if (recDau.size() > 0 && genDau.size() > 0) {
581 for (auto dauRec : recDau) {
582 bool isDau = false;
583 for (auto dauGen : genDau) {
584 if (dauGen->getPDG() == dauRec->getPDGCode())
585 isDau = compBrecoBgen(dauRec, dauGen) ;
586 }
587 if (!isDau) isDecMode = false;
588 }
589 } else {
590 if (recDau.size() == 0) { //&& genDau.size()==0){
591 if (Bgen->getPDG() != Breco->getPDGCode()) isDecMode = false;;
592 } else {isDecMode = false;}
593 }
594
595 return isDecMode;
596}
597
598// STANDARD FIT ALGORITHM
599/* This algorithm basically takes all the tracks coming from the Rest Of Events and send them to perform a multi-track fit
600 The option to request PXD hits for the tracks can be chosen by the user.
601 */
602std::vector<const Particle*> TagVertexModule::getTagTracks_standardAlgorithm(const Particle* Breco, int reqPXDHits) const
603{
604 std::vector<const Particle*> fitParticles;
605 const RestOfEvent* roe = Breco->getRelatedTo<RestOfEvent>();
606 if (!roe) return fitParticles;
607 //load all particles from the ROE
608 std::vector<const Particle*> ROEParticles = roe->getChargedParticles(m_roeMaskName, 0, false);
609 if (ROEParticles.size() == 0) return fitParticles;
610
611 for (auto& ROEParticle : ROEParticles) {
612 HitPatternVXD roeTrackPattern = ROEParticle->getTrackFitResult()->getHitPatternVXD();
613
614 if (roeTrackPattern.getNPXDHits() >= reqPXDHits) {
615 fitParticles.push_back(ROEParticle);
616 }
617 }
618 return fitParticles;
619}
620
621
622vector<ParticleAndWeight> TagVertexModule::getParticlesAndWeights(const vector<const Particle*>& tagParticles) const
623{
624 vector<ParticleAndWeight> particleAndWeights;
625
626 for (const Particle* particle : tagParticles) {
627 ROOT::Math::PxPyPzEVector mom = particle->get4Vector();
628 if (!isfinite(mom.mag2())) continue;
629
630 ParticleAndWeight particleAndWeight;
631 particleAndWeight.mcParticle = 0;
632 particleAndWeight.weight = -1111.;
633 particleAndWeight.particle = particle;
634
635 if (m_useMCassociation == "breco" || m_useMCassociation == "internal")
636 particleAndWeight.mcParticle = particle->getRelatedTo<MCParticle>();
637
638 particleAndWeights.push_back(particleAndWeight);
639 }
640
641 return particleAndWeights;
642}
643
645{
646 if (m_fitAlgo == "Rave") return makeGeneralFitRave();
647 else if (m_fitAlgo == "KFit") return makeGeneralFitKFit();
648 return false;
649}
650
651void TagVertexModule::fillParticles(vector<ParticleAndWeight>& particleAndWeights)
652{
653 unsigned n = particleAndWeights.size();
654 sort(particleAndWeights.begin(), particleAndWeights.end(),
655 [](const ParticleAndWeight & a, const ParticleAndWeight & b) { return a.weight > b.weight; });
656
657 m_raveParticles.resize(n);
658 m_raveWeights.resize(n);
659 m_raveMCParticles.resize(n);
660
661 for (unsigned i = 0; i < n; ++i) {
662 m_raveParticles.at(i) = particleAndWeights.at(i).particle;
663 m_raveMCParticles.at(i) = particleAndWeights.at(i).mcParticle;
664 m_raveWeights.at(i) = particleAndWeights.at(i).weight;
665 }
666}
667
668void TagVertexModule::fillTagVinfo(const ROOT::Math::XYZVector& tagVpos, const TMatrixDSym& tagVposErr)
669{
670 m_tagV = tagVpos;
671
672 if (m_constraintType != "noConstraint") {
673 TMatrixDSym tubeInv = m_constraintCov;
674 tubeInv.Invert();
675 TVectorD dV = toVec(m_tagV - m_BeamSpotCenter);
676 m_tagVChi2IP = tubeInv.Similarity(dV);
677 }
678
679 m_tagVErrMatrix.ResizeTo(tagVposErr);
680 m_tagVErrMatrix = tagVposErr;
681}
682
684{
685 // apply constraint
687 if (m_constraintType != "noConstraint")
690
691 //feed rave with tracks without Kshorts
692 vector<ParticleAndWeight> particleAndWeights = getParticlesAndWeights(m_tagParticles);
693
694 for (const auto& pw : particleAndWeights) {
695 try {
696 if (m_useTruthInFit) {
697 if (pw.mcParticle) {
699 rFit.addTrack(&tfr);
700 } else
702 } else if (m_useRollBack) {
703 if (pw.mcParticle) {
705 rFit.addTrack(&tfr);
706 } else
708 } else {
709 rFit.addTrack(pw.particle->getTrackFitResult());
710 }
711 } catch (const rave::CheckedFloatException&) {
712 B2ERROR("Exception caught in TagVertexModule::makeGeneralFitRave(): Invalid inputs (nan/inf)?");
713 }
714 }
715
716 //perform fit
717
718 int isGoodFit(-1);
719
720 try {
721 isGoodFit = rFit.fit("avf");
722 // if problems
723 if (isGoodFit < 1) return false;
724 } catch (const rave::CheckedFloatException&) {
725 B2ERROR("Exception caught in TagVertexModule::makeGeneralFitRave(): Invalid inputs (nan/inf)?");
726 return false;
727 }
728
729 //save the track info for later use
730
731 for (unsigned int i(0); i < particleAndWeights.size() && isGoodFit >= 1; ++i)
732 particleAndWeights.at(i).weight = rFit.getWeight(i);
733
734 //Tracks are sorted from highest rave weight to lowest
735
736 fillParticles(particleAndWeights);
737
738 //if the fit is good, save the infos related to the vertex
739 fillTagVinfo(ROOT::Math::XYZVector(rFit.getPos(0)), rFit.getCov(0));
740
741 //fill quality variables
742 m_tagVNDF = rFit.getNdf(0);
743 m_tagVChi2 = rFit.getChi2(0);
744 m_fitPval = rFit.getPValue();
745
746 return true;
747}
748
749
750analysis::VertexFitKFit TagVertexModule::doSingleKfit(vector<ParticleAndWeight>& particleAndWeights)
751{
752 //initialize KFit
754 kFit.setMagneticField(m_Bfield);
755
756 // apply constraint
757 if (m_constraintType != "noConstraint") {
758 if (m_constraintType == "tube") {
759 CLHEP::HepSymMatrix err(7, 0);
760 //copy m_pvCov to the end of err matrix
761 err.sub(5, ROOTToCLHEP::getHepSymMatrix(m_pvCov));
762 kFit.setIpTubeProfile(
763 ROOTToCLHEP::getHepLorentzVector(m_tagMomentum),
764 ROOTToCLHEP::getPoint3DFromB2Vector(m_constraintCenter),
765 err,
766 0.);
767 } else {
768 kFit.setIpProfile(ROOTToCLHEP::getPoint3DFromB2Vector(m_constraintCenter),
769 ROOTToCLHEP::getHepSymMatrix(m_constraintCov));
770 }
771 }
772
773
774 for (auto& pawi : particleAndWeights) {
775 int addedOK = 1;
776 if (m_useTruthInFit) {
777 if (pawi.mcParticle) {
778 addedOK = kFit.addTrack(
779 ROOTToCLHEP::getHepLorentzVector(pawi.mcParticle->get4Vector()),
780 ROOTToCLHEP::getPoint3DFromB2Vector(getTruePoca(pawi)),
781 ROOTToCLHEP::getHepSymMatrix(pawi.particle->getMomentumVertexErrorMatrix()),
782 pawi.particle->getCharge());
783 } else {
785 }
786 } else if (m_useRollBack) {
787 if (pawi.mcParticle) {
788 addedOK = kFit.addTrack(
789 ROOTToCLHEP::getHepLorentzVector(pawi.mcParticle->get4Vector()),
790 ROOTToCLHEP::getPoint3DFromB2Vector(getRollBackPoca(pawi)),
791 ROOTToCLHEP::getHepSymMatrix(pawi.particle->getMomentumVertexErrorMatrix()),
792 pawi.particle->getCharge());
793 } else {
795 }
796 } else {
797 addedOK = kFit.addParticle(pawi.particle);
798 }
799
800 if (addedOK == 0) {
801 pawi.weight = 1.;
802 } else {
803 B2WARNING("TagVertexModule::makeGeneralFitKFit: failed to add a track");
804 pawi.weight = 0.;
805 }
806 }
807
808
809 int nTracksAdded = kFit.getTrackCount();
810
811 //perform fit if there are enough tracks
812 if ((nTracksAdded < 2 && m_constraintType == "noConstraint") || nTracksAdded < 1)
814
815 int isGoodFit = kFit.doFit();
816 if (isGoodFit != 0) return analysis::VertexFitKFit();
817
818 return kFit;
819}
820
821
822static int getLargestChi2ID(const analysis::VertexFitKFit& kFit)
823{
824 int largest_chi2_trackid = -1;
825 double largest_track_chi2 = -1;
826 for (int i = 0; i < kFit.getTrackCount(); ++i) {
827 double track_chi2 = kFit.getTrackCHIsq(i);
828 if (track_chi2 > largest_track_chi2) {
829 largest_track_chi2 = track_chi2;
830 largest_chi2_trackid = i;
831 }
832 }
833 return largest_chi2_trackid;
834}
835
836
837
838//uses m_tagMomentum, m_constraintCenter, m_constraintCov, m_tagParticles
840{
841 //feed KFit with tracks without Kshorts
842 vector<ParticleAndWeight> particleAndWeights = getParticlesAndWeights(m_tagParticles);
843
845
846
847 // iterative procedure which removes tracks with high chi2
848 for (int iteration_counter = 0; iteration_counter < 100; ++iteration_counter) {
849 analysis::VertexFitKFit kFitTemp = doSingleKfit(particleAndWeights);
850 if (!kFitTemp.isFitted() || isnan(kFitTemp.getCHIsq()))
851 return false;
852
853 double reduced_chi2 = kFitTemp.getCHIsq() / kFitTemp.getNDF();
854 int nTracks = kFitTemp.getTrackCount();
855
856 if (nTracks != int(particleAndWeights.size()))
857 B2ERROR("TagVertexModule: Different number of tracks in kFit and particles");
858
859 if (reduced_chi2 <= m_kFitReqReducedChi2 || nTracks <= 1 || (nTracks <= 2 && m_constraintType == "noConstraint")) {
860 kFit = kFitTemp;
861 break;
862 } else { // remove particle with highest chi2/ndf and continue
863 int badTrackID = getLargestChi2ID(kFitTemp);
864 if (0 <= badTrackID && badTrackID < int(particleAndWeights.size()))
865 particleAndWeights.erase(particleAndWeights.begin() + badTrackID);
866 else
867 B2ERROR("TagVertexModule: Obtained badTrackID is not within limits");
868 }
869
870 }
871
872 //save the track info for later use
873 //Tracks are sorted by weight, i.e. pushing the tracks with 0 weight (from KS) to the end of the list
874 fillParticles(particleAndWeights);
875
876 //Save the infos related to the vertex
877 fillTagVinfo(CLHEPToROOT::getXYZVector(kFit.getVertex()),
878 CLHEPToROOT::getTMatrixDSym(kFit.getVertexError()));
879
880 m_tagVNDF = kFit.getNDF();
881 m_tagVChi2 = kFit.getCHIsq();
882 m_fitPval = TMath::Prob(m_tagVChi2, m_tagVNDF);
883
884 return true;
885}
886
888{
889
891 ROOT::Math::XYZVector boostDir = ROOT::Math::XYZVector(boost.Unit());
892 double bg = boost.Mag() / sqrt(1 - boost.Mag2());
893 double c = Const::speedOfLight / 1000.; // cm ps-1
894
895 //Reconstructed DeltaL & DeltaT in the boost direction
896 ROOT::Math::XYZVector dVert = Breco->getVertex() - m_tagV; //reconstructed vtxReco - vtxTag
897 double dl = dVert.Dot(boostDir);
898 m_deltaT = dl / (bg * c);
899
900 //Truth DeltaL & approx DeltaT in the boost direction
901 ROOT::Math::XYZVector MCdVert = m_mcVertReco - m_mcTagV; //truth vtxReco - vtxTag
902 double MCdl = MCdVert.Dot(boostDir);
903 m_mcDeltaT = MCdl / (bg * c);
904
905 // MCdeltaTau=tauRec-tauTag
907 if (m_mcLifeTimeReco == -1 || m_mcTagLifeTime == -1)
909
910 TVectorD bVec = toVec(B2Vector3D(boostDir));
911
912 //TagVertex error in boost dir
913 m_tagVlErr = sqrt(m_tagVErrMatrix.Similarity(bVec));
914
915 //bReco error in boost dir
916 double bRecoErrL = sqrt(Breco->getVertexErrorMatrix().Similarity(bVec));
917
918 //Delta t error
919 m_deltaTErr = hypot(m_tagVlErr, bRecoErrL) / (bg * c);
920
921 m_tagVl = m_tagV.Dot(boostDir);
922 m_truthTagVl = m_mcTagV.Dot(boostDir);
923
924 // calculate tagV component and error in the direction orthogonal to the boost
925 B2Vector3D oboost = getUnitOrthogonal(B2Vector3D(boostDir));
926 TVectorD oVec = toVec(oboost);
927
928 //TagVertex error in boost-orthogonal dir
929 m_tagVolErr = sqrt(m_tagVErrMatrix.Similarity(oVec));
930
931 m_tagVol = m_tagV.Dot(oboost);
932 m_truthTagVol = m_mcTagV.Dot(oboost);
933}
934
935Particle* TagVertexModule::doVertexFitForBTube(const Particle* motherIn, std::string fitType) const
936{
937 //make a copy of motherIn to not modify the original object
938 Particle* mother = ParticleCopy::copyParticle(motherIn);
939
940 //Here rave is used to find the upsilon(4S) vtx as the intersection
941 //between the mother B trajectory and the beam spot
943
945 rsg.addTrack(mother);
946 int nvert = rsg.fit(fitType);
947 if (nvert != 1) {
948 mother->setPValue(-1); //error
949 return mother;
950 } else {
951 rsg.updateDaughters();
952 return mother;
953 }
954}
955
956
957
959{
960 if (!paw.mcParticle) {
961 B2ERROR("In TagVertexModule::getTrackWithTrueCoordinate: no MC particle set");
962 return TrackFitResult();
963 }
964
965 const TrackFitResult* tfr(paw.particle->getTrackFitResult());
966
967 return TrackFitResult(getTruePoca(paw),
968 paw.mcParticle->getMomentum(),
969 tfr->getCovariance6(),
970 tfr->getChargeSign(),
971 tfr->getParticleType(),
972 tfr->getPValue(),
973 m_Bfield, 0, 0, tfr->getNDF());
974}
975
976// static
977ROOT::Math::XYZVector TagVertexModule::getTruePoca(ParticleAndWeight const& paw)
978{
979 if (!paw.mcParticle) {
980 B2ERROR("In TagVertexModule::getTruePoca: no MC particle set");
981 return ROOT::Math::XYZVector(0., 0., 0.);
982 }
983
985 paw.mcParticle->getMomentum(),
987}
988
990{
991 const TrackFitResult* tfr(paw.particle->getTrackFitResult());
992
994 tfr->getMomentum(),
995 tfr->getCovariance6(),
996 tfr->getChargeSign(),
997 tfr->getParticleType(),
998 tfr->getPValue(),
999 m_Bfield, 0, 0, tfr->getNDF());
1000}
1001
1003{
1004 if (!paw.mcParticle) {
1005 B2ERROR("In TagVertexModule::getTruePoca: no MC particle set");
1006 return ROOT::Math::XYZVector(0., 0., 0.);
1007 }
1008
1009 return paw.particle->getTrackFitResult()->getPosition() - paw.mcParticle->getProductionVertex() + ROOT::Math::XYZVector(m_mcTagV);
1010}
1011
1013{
1014 m_raveParticles.resize(0);
1015 m_raveMCParticles.resize(0);
1016 m_tagParticles.resize(0);
1017 m_raveWeights.resize(0);
1018
1020 m_tagV = vecNaN;
1021 m_tagVErrMatrix.ResizeTo(matNaN);
1022 m_tagVErrMatrix = matNaN;
1023 m_mcTagV = vecNaN;
1024 m_mcVertReco = vecNaN;
1025 m_deltaT = realNaN;
1028 m_constraintCov.ResizeTo(matNaN);
1029 m_constraintCov = matNaN;
1030 m_constraintCenter = vecNaN;
1031 m_tagVl = realNaN;
1034 m_tagVol = realNaN;
1040 m_pvCov.ResizeTo(matNaN);
1041 m_pvCov = matNaN;
1042 m_tagMomentum = ROOT::Math::PxPyPzEVector(realNaN, realNaN, realNaN, realNaN);
1043}
1044
1045//The following functions are just here to help printing stuff
1046
1047// static
1048std::string TagVertexModule::printVector(const ROOT::Math::XYZVector& vec)
1049{
1050 std::ostringstream oss;
1051 int w = 14;
1052 oss << "(" << std::setw(w) << vec.X() << ", " << std::setw(w) << vec.Y() << ", " << std::setw(w) << vec.Z() << ")" << std::endl;
1053 return oss.str();
1054}
1055
1056// static
1057std::string TagVertexModule::printMatrix(const TMatrixD& mat)
1058{
1059 std::ostringstream oss;
1060 int w = 14;
1061 for (int i = 0; i < mat.GetNrows(); ++i) {
1062 for (int j = 0; j < mat.GetNcols(); ++j) {
1063 oss << std::setw(w) << mat(i, j) << " ";
1064 }
1065 oss << endl;
1066 }
1067 return oss.str();
1068}
1069
1070// static
1071std::string TagVertexModule::printMatrix(const TMatrixDSym& mat)
1072{
1073 std::ostringstream oss;
1074 int w = 14;
1075 for (int i = 0; i < mat.GetNrows(); ++i) {
1076 for (int j = 0; j < mat.GetNcols(); ++j) {
1077 oss << std::setw(w) << mat(i, j) << " ";
1078 }
1079 oss << endl;
1080 }
1081 return oss.str();
1082}
double R
typedef autogenerated by FFTW
DataType Mag() const
The magnitude (rho in spherical coordinate system).
Definition: B2Vector3.h:159
DataType Mag2() const
The magnitude squared (rho^2 in spherical coordinate system).
Definition: B2Vector3.h:157
B2Vector3< DataType > Unit() const
Unit vector parallel to this.
Definition: B2Vector3.h:269
static ROOT::Math::XYZVector getFieldInTesla(const ROOT::Math::XYZVector &pos)
return the magnetic field at a given position in Tesla.
Definition: BFieldManager.h:60
static const double speedOfLight
[cm/ns]
Definition: Const.h:695
Hit pattern of the VXD within a track.
Definition: HitPatternVXD.h:37
unsigned short getNPXDHits() const
Get total number of hits in the PXD.
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:32
std::vector< Belle2::MCParticle * > getDaughters() const
Get vector of all daughter particles, empty vector if none.
Definition: MCParticle.cc:52
ROOT::Math::XYZVector getProductionVertex() const
Return production vertex position.
Definition: MCParticle.h:178
ROOT::Math::PxPyPzEVector get4Vector() const
Return 4Vector of particle.
Definition: MCParticle.h:196
int getPDG() const
Return PDG code of particle.
Definition: MCParticle.h:101
ROOT::Math::XYZVector getMomentum() const
Return momentum.
Definition: MCParticle.h:187
Base class for Modules.
Definition: Module.h:72
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
Class to hold Lorentz transformations from/to CMS and boost vector.
static ROOT::Math::PxPyPzMVector labToCms(const ROOT::Math::PxPyPzMVector &vec)
Transforms Lorentz vector into CM System.
static ROOT::Math::PxPyPzMVector cmsToLab(const ROOT::Math::PxPyPzMVector &vec)
Transforms Lorentz vector into Laboratory System.
B2Vector3D getBoostVector() const
Returns boost vector (beta=p/E)
Class to store reconstructed particles.
Definition: Particle.h:76
TMatrixFSym getVertexErrorMatrix() const
Returns the 3x3 position error sub-matrix.
Definition: Particle.cc:478
double getPValue() const
Returns chi^2 probability of fit if done or -1.
Definition: Particle.h:687
ROOT::Math::XYZVector getVertex() const
Returns vertex position (POCA for charged, IP for neutral FS particles)
Definition: Particle.h:651
int getPDGCode(void) const
Returns PDG code.
Definition: Particle.h:465
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
Definition: Particle.cc:668
double getPDGMass(void) const
Returns uncertainty on the invariant mass (requires valid momentum error matrix)
Definition: Particle.cc:635
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
Definition: Particle.h:567
void setMomentumVertexErrorMatrix(const TMatrixFSym &errMatrix)
Sets 7x7 error matrix.
Definition: Particle.cc:424
ROOT::Math::XYZVector getMomentum() const
Returns momentum vector.
Definition: Particle.h:580
void setPValue(double pValue)
Sets chi^2 probability of fit.
Definition: Particle.h:377
TMatrixFSym getMomentumVertexErrorMatrix() const
Returns 7x7 error matrix.
Definition: Particle.cc:451
const TrackFitResult * getTrackFitResult() const
Returns the pointer to the TrackFitResult that was used to create this Particle (ParticleType == c_Tr...
Definition: Particle.cc:925
double getMomentumMagnitude() const
Returns momentum magnitude.
Definition: Particle.h:589
double getP() const
Returns momentum magnitude (same as getMomentumMagnitude but with shorter name)
Definition: Particle.h:598
TO * getRelatedTo(const std::string &name="", const std::string &namedRelation="") const
Get the object to which this object has a relation.
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
This is a general purpose class for collecting reconstructed MDST data objects that are not used in r...
Definition: RestOfEvent.h:57
std::vector< const Particle * > getChargedParticles(const std::string &maskName=c_defaultMaskName, unsigned int pdg=0, bool unpackComposite=true) const
Get charged particles from ROE mask.
Definition: RestOfEvent.cc:103
static constexpr const char * c_defaultMaskName
Default mask name.
Definition: RestOfEvent.h:60
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Definition: StoreArray.h:140
int m_fitTruthStatus
Store info about whether the fit was performed with the truth info 0 fit performed with measured para...
TMatrixDSym m_constraintCov
constraint to be used in the tag vertex fit
double m_truthTagVol
MC tagV component in the direction orthogonal to the boost.
std::vector< const Particle * > m_tagParticles
tracks of the rest of the event
double m_tagVl
tagV component in the boost direction
bool doVertexFit(const Particle *Breco)
central method for the tag side vertex fit
std::vector< const Particle * > getTagTracks_standardAlgorithm(const Particle *Breco, int nPXDHits) const
performs the fit using the standard algorithm - using all tracks in RoE The user can specify a reques...
double m_truthTagVl
MC tagV component in the boost direction
std::pair< ROOT::Math::XYZVector, TMatrixDSym > findConstraintBoost(double cut) const
calculate the standard constraint for the vertex fit on the tag side
bool m_useTruthInFit
Set to true if the tag fit is to be made with the TRUE tag track momentum and position.
std::vector< double > m_raveWeights
Store the weights used by Rave in the vtx fit so that they can be accessed later.
TrackFitResult getTrackWithRollBackCoordinates(ParticleAndWeight const &paw)
If the fit has to be done with the rolled back tracks, Rave or KFit is fed with a track where the pos...
virtual void initialize() override
Initialize the Module.
void fillTagVinfo(const ROOT::Math::XYZVector &tagVpos, const TMatrixDSym &tagVposErr)
Fill tagV vertex info.
ROOT::Math::XYZVector m_mcVertReco
generated Breco decay vertex
TMatrixDSym m_pvCov
covariance matrix of the PV (useful with tube and KFit)
double m_mcDeltaT
generated DeltaT with boost-direction approximation
static std::string printVector(const ROOT::Math::XYZVector &vec)
Print a XYZVector (useful for debugging)
ROOT::Math::XYZVector m_tagV
tag side fit result
virtual void event() override
Event processor.
std::pair< ROOT::Math::XYZVector, TMatrixDSym > findConstraintBTube(const Particle *Breco, double cut)
calculate constraint for the vertex fit on the tag side using the B tube (cylinder along the expected...
Particle * doVertexFitForBTube(const Particle *mother, std::string fitType) const
it returns an intersection between B rec and beam spot (= origin of BTube)
std::string m_listName
Breco particle list name.
std::vector< ParticleAndWeight > getParticlesAndWeights(const std::vector< const Particle * > &tagParticles) const
Get a list of particles with attached weight and associated MC particle.
bool m_useRollBack
Set to true if the tag fit is to be made with the tag track position rolled back to mother B.
double m_tagVlErr
Error of the tagV component in the boost direction
std::string m_roeMaskName
ROE particles from this mask will be used for vertex fitting.
double m_tagVChi2
chi^2 value of the tag vertex fit result
static ROOT::Math::XYZVector getTruePoca(ParticleAndWeight const &paw)
This finds the point on the true particle trajectory closest to the measured track position.
void BtagMCVertex(const Particle *Breco)
get the vertex of the MC B particle associated to Btag.
std::pair< ROOT::Math::XYZVector, TMatrixDSym > findConstraint(const Particle *Breco, double cut) const
calculate the constraint for the vertex fit on the tag side using Breco information
bool m_mcInfo
true if user wants to retrieve MC information out from the tracks used in the fit
double m_kFitReqReducedChi2
The required chi2/ndf to accept the kFit result, if it is higher, iteration procedure is applied.
std::string m_useMCassociation
No MC association or standard Breco particle or internal MCparticle association.
ROOT::Math::XYZVector m_constraintCenter
centre position of the constraint for the tag Vertex fit
double m_tagVolErr
Error of the tagV component in the direction orthogonal to the boost.
double m_mcTagLifeTime
generated tag side life time of B-decay
ROOT::Math::XYZVector m_BeamSpotCenter
Beam spot position.
double m_tagVNDF
Number of degrees of freedom in the tag vertex fit.
double m_deltaTErr
reconstructed DeltaT error
std::string m_fitAlgo
Algorithm used for the tag fit (Rave or KFit)
bool makeGeneralFit()
TO DO: tag side vertex fit in the case of semileptonic tag side decay.
ROOT::Math::XYZVector getRollBackPoca(ParticleAndWeight const &paw)
This shifts the position of tracks by the vector difference of mother B and production point of track...
virtual void beginRun() override
Called when entering a new run.
double m_mcDeltaTau
generated DeltaT
double m_fitPval
P value of the tag side fit result.
StoreArray< TagVertex > m_verArray
StoreArray of TagVertexes.
DBObjPtr< BeamSpot > m_beamSpotDB
Beam spot database object.
void deltaT(const Particle *Breco)
calculate DeltaT and MC-DeltaT (rec - tag) in ps from Breco and Btag vertices DT = Dl / gamma beta c ...
std::vector< const Particle * > m_raveParticles
tracks given to rave for the track fit (after removing Kshorts
void fillParticles(std::vector< ParticleAndWeight > &particleAndWeights)
Fill sorted list of particles into external variable.
TagVertexModule()
Constructor.
int m_reqPXDHits
N of PXD hits for a track to be used.
double m_confidenceLevel
required fit confidence level
double m_tagVChi2IP
IP component of the chi^2 of the tag vertex fit result.
double m_tagVol
tagV component in the direction orthogonal to the boost
analysis::VertexFitKFit doSingleKfit(std::vector< ParticleAndWeight > &particleAndWeights)
performs single KFit on particles stored in particleAndWeights this function can be iterated several ...
std::string m_constraintType
Choose constraint: noConstraint, IP, tube, boost, (breco)
void resetReturnParams()
Reset all parameters that are computed in each event and then used to compute tuple variables.
ROOT::Math::PxPyPzEVector m_tagMomentum
B tag momentum computed from fully reconstructed B sig.
bool makeGeneralFitRave()
make the vertex fit on the tag side: RAVE AVF tracks coming from Ks removed all other tracks used
TrackFitResult getTrackWithTrueCoordinates(ParticleAndWeight const &paw) const
If the fit has to be done with the truth info, Rave is fed with a track where the momentum is replace...
StoreArray< MCParticle > m_mcParticles
StoreArray of MCParticles.
double m_mcLifeTimeReco
generated Breco life time
static bool compBrecoBgen(const Particle *Breco, const MCParticle *Bgen)
compare Breco with the two MC B particles
double m_Bfield
magnetic field from data base
TMatrixDSym m_tagVErrMatrix
Error matrix of the tag side fit result.
int m_mcPDG
generated tag side B flavor
StoreObjPtr< ParticleList > m_plist
input particle list
static std::string printMatrix(const TMatrixD &mat)
Print a TMatrix (useful for debugging)
ROOT::Math::XYZVector m_mcTagV
generated tag side vertex
int m_rollbackStatus
Store info about whether the fit was performed with the rolled back tracks 0 fit performed with measu...
std::string m_trackFindingType
Choose how to find the tag tracks: standard, standard_PXD.
bool m_verbose
choose if you want to print extra infos
int m_FitType
fit algo used
bool makeGeneralFitKFit()
make the vertex fit on the tag side: KFit tracks coming from Ks removed all other tracks used
std::vector< const MCParticle * > m_raveMCParticles
Store the MC particles corresponding to each track used by Rave in the vtx fit.
TMatrixDSym m_BeamSpotCov
size of the beam spot == covariance matrix on the beam spot position
double m_deltaT
reconstructed DeltaT
TagVertex data object: contains Btag Vertex and DeltaT.
Definition: TagVertex.h:33
void setConstraintType(const std::string &constraintType)
Set the type of the constraint for the tag fit.
Definition: TagVertex.cc:314
void setTagVlErr(float TagVlErr)
Set the error of the tagV component in the boost direction.
Definition: TagVertex.cc:252
void setTruthTagVl(float TruthTagVl)
Set the MC tagV component in the boost direction.
Definition: TagVertex.cc:247
void setTagVertex(const B2Vector3D &TagVertex)
Set BTag Vertex.
Definition: TagVertex.cc:187
void setConstraintCenter(const B2Vector3D &constraintCenter)
Set the centre of the constraint for the tag fit.
Definition: TagVertex.cc:303
void setTruthTagVol(float TruthTagVol)
Set the tagV component in the direction orthogonal to the boost.
Definition: TagVertex.cc:262
void setMCTagBFlavor(int mcTagBFlavor)
Set generated Btag PDG code.
Definition: TagVertex.cc:217
void setTagVolErr(float TagVolErr)
Set the error of the tagV component in the direction orthogonal to the boost.
Definition: TagVertex.cc:267
void setMCTagVertex(const B2Vector3D &mcTagVertex)
Set generated BTag Vertex.
Definition: TagVertex.cc:212
void setTagVNDF(float TagVNDF)
Set the number of degrees of freedom in the tag vertex fit.
Definition: TagVertex.cc:272
void setDeltaTErr(float DeltaTErr)
Set DeltaTErr.
Definition: TagVertex.cc:207
void setNTracks(int nTracks)
Set number of tracks used in the fit.
Definition: TagVertex.cc:237
void setTagVChi2(float TagVChi2)
Set the chi^2 value of the tag vertex fit result.
Definition: TagVertex.cc:277
void setMCDeltaT(float mcDeltaT)
Set generated DeltaT (in kin.
Definition: TagVertex.cc:227
void setRollBackStatus(int backStatus)
Set the status of the fit performed with the rolled back tracks.
Definition: TagVertex.cc:338
void setVertexFitMCParticles(const std::vector< const MCParticle * > &vtxFitMCParticles)
Set a vector of pointers to the MC p'cles corresponding to the tracks in the tag vtx fit.
Definition: TagVertex.cc:293
void setTagVol(float TagVol)
Set the tagV component in the direction orthogonal to the boost.
Definition: TagVertex.cc:257
void setDeltaT(float DeltaT)
Set DeltaT.
Definition: TagVertex.cc:202
void setRaveWeights(const std::vector< double > &raveWeights)
Set the weights used by Rave in the tag vtx fit.
Definition: TagVertex.cc:298
void setTagVertexPval(float TagVertexPval)
Set BTag Vertex P value.
Definition: TagVertex.cc:197
void setMCDeltaTau(float mcDeltaTau)
Set generated DeltaT.
Definition: TagVertex.cc:222
void setTagVl(float TagVl)
Set the tagV component in the boost direction.
Definition: TagVertex.cc:242
void setTagVertexErrMatrix(const TMatrixDSym &TagVertexErrMatrix)
Set BTag Vertex (3x3) error matrix.
Definition: TagVertex.cc:192
void setConstraintCov(const TMatrixDSym &constraintCov)
Set the covariance matrix of the constraint for the tag fit.
Definition: TagVertex.cc:308
void setFitType(float FitType)
Set fit algo type.
Definition: TagVertex.cc:232
void setVertexFitParticles(const std::vector< const Particle * > &vtxFitParticles)
Set a vector of pointers to the tracks used in the tag vtx fit.
Definition: TagVertex.cc:287
void setTagVChi2IP(float TagVChi2IP)
Set the IP component of the chi^2 value of the tag vertex fit result.
Definition: TagVertex.cc:282
void setFitTruthStatus(int truthStatus)
Set the status of the fit performed with the truth info of the tracks.
Definition: TagVertex.cc:333
Values of the result of a track fit with a given particle hypothesis.
float getNDF() const
Getter for number of degrees of freedom of the track fit.
short getChargeSign() const
Return track charge (1 or -1).
double getPValue() const
Getter for Chi2 Probability of the track fit.
TMatrixDSym getCovariance6() const
Position and Momentum Covariance Matrix.
Const::ParticleType getParticleType() const
Getter for ParticleType of the mass hypothesis of the track fit.
ROOT::Math::XYZVector getMomentum() const
Getter for vector of momentum at closest approach of track in r/phi projection.
ROOT::Math::XYZVector getPosition() const
Getter for vector of position at closest approach of track in r/phi projection.
The Unit class.
Definition: Unit.h:40
virtual int getNDF(void) const
Get an NDF of the fit.
Definition: KFitBase.cc:114
bool isFitted(void) const
Return false if fit is not performed yet or performed fit is failed; otherwise true.
Definition: KFitBase.cc:728
int getTrackCount(void) const
Get the number of added tracks.
Definition: KFitBase.cc:107
void unsetBeamSpot()
unset beam spot constraint
Definition: RaveSetup.cc:80
static void initialize(int verbosity=1, double MagneticField=1.5)
Set everything up so everything needed for vertex fitting is there.
Definition: RaveSetup.cc:33
static RaveSetup * getInstance()
get the pointer to the instance to get/set any of options stored in RaveSetup
Definition: RaveSetup.h:43
void setBeamSpot(const B2Vector3D &beamSpot, const TMatrixDSym &beamSpotCov)
The beam spot position and covariance is known you can set it here so that and a vertex in the beam s...
Definition: RaveSetup.cc:72
void reset()
frees memory allocated by initialize().
Definition: RaveSetup.cc:58
The RaveVertexFitter class is part of the RaveInterface together with RaveSetup.
TMatrixDSym getCov(VecSize vertexId=0) const
get the covariance matrix (3x3) of the of the fitted vertex position.
int fit(std::string options="default")
do the vertex fit with all tracks previously added with the addTrack or addMother function.
void addTrack(const Particle *const aParticlePtr)
add a track (in the format of a Belle2::Particle) to set of tracks that should be fitted to a vertex
double getNdf(VecSize vertexId=0) const
get the number of degrees of freedom (NDF) of the fitted vertex.
double getChi2(VecSize vertexId=0) const
get the χ² of the fitted vertex.
B2Vector3D getPos(VecSize vertexId=0) const
get the position of the fitted vertex.
void updateDaughters()
update the Daughters particles
double getWeight(int trackId, VecSize vertexId=0) const
get the weight Rave assigned to a specific input track.
double getPValue(VecSize vertexId=0) const
get the p value of the fitted vertex.
VertexFitKFit is a derived class from KFitBase to perform vertex-constraint kinematical fit.
Definition: VertexFitKFit.h:34
double getCHIsq(void) const override
Get a chi-square of the fit.
static const double realNaN
This collects the B-meson properties in the hadronic B-decays It is used for the Ecms calibration in ...
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:649
B2Vector3< double > B2Vector3D
typedef for common usage with double
Definition: B2Vector3.h:516
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
ROOT::Math::XYZVector poca(ROOT::Math::XYZVector const &trackPos, ROOT::Math::XYZVector const &trackP, ROOT::Math::XYZVector const &vtxPos)
Returns the Point Of Closest Approach of a track to a vertex.
Particle * copyParticle(const Particle *original)
Function takes argument Particle and creates a copy of it and copies of all its (grand-)^n-daughters.
Definition: ParticleCopy.cc:17
Abstract base class for different kinds of events.
STL namespace.
this struct is used to store and sort the tag tracks
const Particle * particle
tag track fit result with pion mass hypo, for sorting purposes
const MCParticle * mcParticle
mc particle matched to the tag track, for sorting purposes
double weight
rave weight associated to the track, for sorting purposes