10 #include <analysis/variables/TimeDependentVariables.h>
12 #include <framework/dbobjects/BeamParameters.h>
15 #include <analysis/dataobjects/Particle.h>
16 #include <analysis/dataobjects/TagVertex.h>
17 #include <mdst/dataobjects/MCParticle.h>
20 #include <analysis/utility/DistanceTools.h>
21 #include <analysis/utility/PCmsLabTransform.h>
22 #include <analysis/utility/RotationTools.h>
23 #include <analysis/utility/ReferenceFrame.h>
26 #include <framework/gearbox/Const.h>
27 #include <framework/geometry/B2Vector3.h>
45 using RotationTools::getUnitOrthogonal;
46 using RotationTools::toVec;
48 static const B2Vector3D vecNaN(Const::doubleNaN, Const::doubleNaN, Const::doubleNaN);
53 double particleTagVx(
const Particle* particle)
55 auto* vert = particle->getRelatedTo<TagVertex>();
56 if (!vert)
return Const::doubleNaN;
57 return vert->getTagVertex().X();
60 double particleTagVy(
const Particle* particle)
62 auto* vert = particle->getRelatedTo<TagVertex>();
63 if (!vert)
return Const::doubleNaN;
64 return vert->getTagVertex().Y();
67 double particleTagVz(
const Particle* particle)
69 auto* vert = particle->getRelatedTo<TagVertex>();
70 if (!vert)
return Const::doubleNaN;
71 return vert->getTagVertex().Z();
74 double particleTruthTagVx(
const Particle* particle)
76 auto* vert = particle->getRelatedTo<TagVertex>();
77 if (!vert)
return Const::doubleNaN;
78 return vert->getMCTagVertex().X();
81 double particleTruthTagVy(
const Particle* particle)
83 auto* vert = particle->getRelatedTo<TagVertex>();
84 if (!vert)
return Const::doubleNaN;
85 return vert->getMCTagVertex().Y();
88 double particleTruthTagVz(
const Particle* particle)
90 auto* vert = particle->getRelatedTo<TagVertex>();
91 if (!vert)
return Const::doubleNaN;
92 return vert->getMCTagVertex().Z();
95 double particleTagVxErr(
const Particle* particle)
97 auto* vert = particle->getRelatedTo<TagVertex>();
98 if (!vert)
return Const::doubleNaN;
99 TMatrixDSym TagVErr = vert->getTagVertexErrMatrix();
100 return sqrt(TagVErr(0, 0));
103 double particleTagVyErr(
const Particle* particle)
105 auto* vert = particle->getRelatedTo<TagVertex>();
106 if (!vert)
return Const::doubleNaN;
107 TMatrixDSym TagVErr = vert->getTagVertexErrMatrix();
108 return sqrt(TagVErr(1, 1));
111 double particleTagVzErr(
const Particle* particle)
113 auto* vert = particle->getRelatedTo<TagVertex>();
114 if (!vert)
return Const::doubleNaN;
115 TMatrixDSym TagVErr = vert->getTagVertexErrMatrix();
116 return sqrt(TagVErr(2, 2));
119 double particleTagVpVal(
const Particle* particle)
121 auto* vert = particle->getRelatedTo<TagVertex>();
122 if (!vert)
return Const::doubleNaN;
123 return vert->getTagVertexPval();
126 double particleTagVNTracks(
const Particle* particle)
128 auto* vert = particle->getRelatedTo<TagVertex>();
129 if (!vert)
return Const::doubleNaN;
130 return vert->getNTracks();
133 double particleTagVNFitTracks(
const Particle* particle)
135 auto* vert = particle->getRelatedTo<TagVertex>();
136 if (!vert)
return Const::doubleNaN;
137 return vert->getNFitTracks();
140 double particleTagVType(
const Particle* particle)
142 auto* vert = particle->getRelatedTo<TagVertex>();
143 if (!vert)
return Const::doubleNaN;
144 return vert->getFitType();
147 double particleTagVNDF(
const Particle* particle)
149 auto* vert = particle->getRelatedTo<TagVertex>();
150 if (!vert)
return Const::doubleNaN;
151 return vert->getTagVNDF();
154 double particleTagVChi2(
const Particle* particle)
156 auto* vert = particle->getRelatedTo<TagVertex>();
157 if (!vert)
return Const::doubleNaN;
158 return vert->getTagVChi2();
161 double particleTagVChi2IP(
const Particle* particle)
163 auto* vert = particle->getRelatedTo<TagVertex>();
164 if (!vert)
return Const::doubleNaN;
165 return vert->getTagVChi2IP();
170 double particleDeltaT(
const Particle* particle)
172 auto* vert = particle->getRelatedTo<TagVertex>();
173 if (!vert)
return Const::doubleNaN;
174 return vert->getDeltaT();
177 double particleDeltaTErr(
const Particle* particle)
179 auto* vert = particle->getRelatedTo<TagVertex>();
180 if (!vert)
return Const::doubleNaN;
181 return vert->getDeltaTErr();
184 double particleDeltaTRes(
const Particle* particle)
186 return particleDeltaT(particle) - particleMCDeltaT(particle);
189 double particleDeltaTBelle(
const Particle* particle)
191 double beta = PCmsLabTransform().getBoostVector().Mag();
192 double bg = beta /
sqrt(1 - beta * beta);
193 double c = Const::speedOfLight / 1000.;
194 return particleDeltaZ(particle) / bg / c;
197 double particleMCDeltaTau(
const Particle* particle)
199 auto* vert = particle->getRelatedTo<TagVertex>();
200 if (!vert)
return Const::doubleNaN;
201 return vert->getMCDeltaTau();
204 double particleMCDeltaT(
const Particle* particle)
206 auto* vert = particle->getRelatedTo<TagVertex>();
207 if (!vert)
return Const::doubleNaN;
208 return vert->getMCDeltaT();
211 double particleMCDeltaBoost(
const Particle* particle)
213 auto* vert = particle->getRelatedTo<TagVertex>();
214 if (!vert)
return Const::doubleNaN;
216 double beta = PCmsLabTransform().getBoostVector().Mag();
217 double bg = beta /
sqrt(1 - beta * beta);
218 double c = Const::speedOfLight / 1000.;
219 return vert->getMCDeltaT() * bg * c;
222 double particleDeltaZ(
const Particle* particle)
224 auto* vert = particle->getRelatedTo<TagVertex>();
225 if (!vert)
return Const::doubleNaN;
226 return particle->getZ() - vert->getTagVertex().Z();
229 double particleDeltaZErr(
const Particle* particle)
231 auto* vert = particle->getRelatedTo<TagVertex>();
232 if (!vert)
return Const::doubleNaN;
234 double zVariance = particle->getVertexErrorMatrix()(2, 2);
235 double TagVZVariance = vert->getTagVertexErrMatrix()(2, 2);
236 double result =
sqrt(zVariance + TagVZVariance);
237 if (!std::isfinite(result))
return Const::doubleNaN;
242 double particleDeltaB(
const Particle* particle)
244 auto* vert = particle->getRelatedTo<TagVertex>();
245 if (!vert)
return Const::doubleNaN;
247 double beta = PCmsLabTransform().getBoostVector().Mag();
248 double bg = beta /
sqrt(1 - beta * beta);
249 double c = Const::speedOfLight / 1000.;
250 return vert->getDeltaT() * bg * c;
253 double particleDeltaBErr(
const Particle* particle)
255 auto* vert = particle->getRelatedTo<TagVertex>();
256 if (!vert)
return Const::doubleNaN;
258 double beta = PCmsLabTransform().getBoostVector().Mag();
259 double bg = beta /
sqrt(1 - beta * beta);
260 double c = Const::speedOfLight / 1000.;
261 return vert->getDeltaTErr() * bg * c;
266 double vertexBoostDirection(
const Particle* part)
270 return pos.Dot(boostDir);
273 double vertexOrthogonalBoostDirection(
const Particle* part)
275 B2Vector3D boost = PCmsLabTransform().getBoostVector();
276 B2Vector3D orthBoostDir = getUnitOrthogonal(boost);
279 return pos.Dot(orthBoostDir);
282 double vertexTruthBoostDirection(
const Particle* part)
284 static DBObjPtr<BeamParameters> beamParamsDB;
285 B2Vector3D boostDir = -(beamParamsDB->getHER() + beamParamsDB->getLER()).BoostToCM().
Unit();
287 const MCParticle* mcPart = part->getMCParticle();
288 if (!mcPart)
return Const::doubleNaN;
290 return pos.Dot(boostDir);
293 double vertexTruthOrthogonalBoostDirection(
const Particle* part)
295 static DBObjPtr<BeamParameters> beamParamsDB;
296 B2Vector3D boost = -(beamParamsDB->getHER() + beamParamsDB->getLER()).BoostToCM();
297 B2Vector3D orthBoostDir = getUnitOrthogonal(boost);
299 const MCParticle* mcPart = part->getMCParticle();
300 if (!mcPart)
return Const::doubleNaN;
302 return pos.Dot(orthBoostDir);
305 double vertexErrBoostDirection(
const Particle* part)
307 TVectorD bDir = toVec(PCmsLabTransform().getBoostVector().Unit());
309 return sqrt(part->getVertexErrorMatrix().Similarity(bDir));
312 double vertexErrOrthBoostDirection(
const Particle* part)
314 TVectorD oDir = toVec(getUnitOrthogonal(PCmsLabTransform().getBoostVector()));
316 return sqrt(part->getVertexErrorMatrix().Similarity(oDir));
321 double tagVBoostDirection(
const Particle* part)
323 auto* vert = part->getRelatedTo<TagVertex>();
324 if (!vert)
return Const::doubleNaN;
325 return vert->getTagVl();
328 double tagVOrthogonalBoostDirection(
const Particle* part)
330 auto* vert = part->getRelatedTo<TagVertex>();
331 if (!vert)
return Const::doubleNaN;
332 return vert->getTagVol();
335 double tagVTruthBoostDirection(
const Particle* part)
337 auto* vert = part->getRelatedTo<TagVertex>();
338 if (!vert)
return Const::doubleNaN;
339 return vert->getTruthTagVl();
342 double tagVTruthOrthogonalBoostDirection(
const Particle* part)
344 auto* vert = part->getRelatedTo<TagVertex>();
345 if (!vert)
return Const::doubleNaN;
346 return vert->getTruthTagVol();
349 double tagVErrBoostDirection(
const Particle* part)
351 auto* vert = part->getRelatedTo<TagVertex>();
352 if (!vert)
return Const::doubleNaN;
353 return vert->getTagVlErr();
356 double tagVErrOrthogonalBoostDirection(
const Particle* part)
358 auto* vert = part->getRelatedTo<TagVertex>();
359 if (!vert)
return Const::doubleNaN;
360 return vert->getTagVolErr();
365 double particleCosThetaBoostDirection(
const Particle* part)
367 const auto& frame = ReferenceFrame::GetCurrent();
368 B2Vector3D boost = PCmsLabTransform().getBoostVector();
369 ROOT::Math::PxPyPzEVector pxpypze = frame.getMomentum(part);
370 B2Vector3D momentum(pxpypze.Px(), pxpypze.Py(), pxpypze.Pz());
371 return cos(momentum.Angle(boost));
374 double particleInternalTagVMCFlavor(
const Particle* part)
376 auto* vert = part->getRelatedTo<TagVertex>();
377 if (!vert)
return Const::doubleNaN;
378 return vert->getMCTagBFlavor();
381 double tagTrackMomentum(
const Particle* part,
const std::vector<double>& trackIndex)
383 auto* vert = part->getRelatedTo<TagVertex>();
384 if (!vert)
return Const::doubleNaN;
386 if (trackIndex.size() != 1)
return Const::doubleNaN;
387 unsigned trackIndexInt = trackIndex.at(0);
389 return vert->getVtxFitTrackP(trackIndexInt).R();
392 double tagTrackMomentumX(
const Particle* part,
const std::vector<double>& trackIndex)
394 auto* vert = part->getRelatedTo<TagVertex>();
395 if (!vert)
return Const::doubleNaN;
397 if (trackIndex.size() != 1)
return Const::doubleNaN;
398 unsigned trackIndexInt = trackIndex.at(0);
400 return vert->getVtxFitTrackP(trackIndexInt).X();
403 double tagTrackMomentumY(
const Particle* part,
const std::vector<double>& trackIndex)
405 auto* vert = part->getRelatedTo<TagVertex>();
406 if (!vert)
return Const::doubleNaN;
408 if (trackIndex.size() != 1)
return Const::doubleNaN;
409 unsigned trackIndexInt = trackIndex.at(0);
411 return vert->getVtxFitTrackP(trackIndexInt).Y();
414 double tagTrackMomentumZ(
const Particle* part,
const std::vector<double>& trackIndex)
416 auto* vert = part->getRelatedTo<TagVertex>();
417 if (!vert)
return Const::doubleNaN;
419 if (trackIndex.size() != 1)
return Const::doubleNaN;
420 unsigned trackIndexInt = trackIndex.at(0);
422 return vert->getVtxFitTrackP(trackIndexInt).Z();
425 double tagTrackZ0(
const Particle* part,
const std::vector<double>& trackIndex)
427 auto* vert = part->getRelatedTo<TagVertex>();
428 if (!vert)
return Const::doubleNaN;
430 if (trackIndex.size() != 1)
return Const::doubleNaN;
431 unsigned trackIndexInt = trackIndex.at(0);
433 return vert->getVtxFitTrackZ0(trackIndexInt);
436 double tagTrackD0(
const Particle* part,
const std::vector<double>& trackIndex)
438 auto* vert = part->getRelatedTo<TagVertex>();
439 if (!vert)
return Const::doubleNaN;
441 if (trackIndex.size() != 1)
return Const::doubleNaN;
442 unsigned trackIndexInt = trackIndex.at(0);
444 return vert->getVtxFitTrackD0(trackIndexInt);
447 double tagTrackRaveWeight(
const Particle* part,
const std::vector<double>& trackIndex)
449 auto* vert = part->getRelatedTo<TagVertex>();
450 if (!vert)
return Const::doubleNaN;
452 if (trackIndex.size() != 1)
return Const::doubleNaN;
453 unsigned trackIndexInt = trackIndex.at(0);
455 return vert->getRaveWeight(trackIndexInt);
458 double tagTrackDistanceToConstraint(
const Particle* part,
const std::vector<double>& trackIndex)
460 auto* vert = part->getRelatedTo<TagVertex>();
461 if (!vert)
return Const::doubleNaN;
463 if (trackIndex.size() != 1)
return Const::doubleNaN;
464 unsigned trackIndexInt = trackIndex.at(0);
466 if (vert->getConstraintType() ==
"noConstraint")
return Const::doubleNaN;
467 const Particle* tagParticle(vert->getVtxFitParticle(trackIndexInt));
468 if (!tagParticle)
return Const::doubleNaN;
470 return DistanceTools::trackToVtxDist(tagParticle->getTrackFitResult()->getPosition(),
471 tagParticle->getMomentum(),
472 vert->getConstraintCenter());
475 double tagTrackDistanceToConstraintErr(
const Particle* part,
const std::vector<double>& trackIndex)
477 auto* vert = part->getRelatedTo<TagVertex>();
478 if (!vert)
return Const::doubleNaN;
480 if (trackIndex.size() != 1)
return Const::doubleNaN;
481 unsigned trackIndexInt = trackIndex.at(0);
483 if (vert->getConstraintType() ==
"noConstraint")
return Const::doubleNaN;
484 const Particle* tagParticle(vert->getVtxFitParticle(trackIndexInt));
485 if (!tagParticle)
return Const::doubleNaN;
488 TMatrixDSym trackPosCovMat = tagParticle->getVertexErrorMatrix();
490 return DistanceTools::trackToVtxDistErr(tagParticle->getTrackFitResult()->getPosition(),
491 tagParticle->getMomentum(),
492 vert->getConstraintCenter(),
494 vert->getConstraintCov());
497 double tagTrackDistanceToConstraintSignificance(
const Particle* part,
const std::vector<double>& trackIndex)
499 double val = tagTrackDistanceToConstraint(part, trackIndex);
500 if (isinf(val) || isnan(val))
return Const::doubleNaN;
501 double err = tagTrackDistanceToConstraintErr(part, trackIndex);
502 if (isinf(err) || isnan(err))
return Const::doubleNaN;
507 double tagVDistanceToConstraint(
const Particle* part)
509 auto* vert = part->getRelatedTo<TagVertex>();
510 if (!vert)
return Const::doubleNaN;
512 if (vert->getConstraintType() ==
"noConstraint")
return Const::doubleNaN;
514 return DistanceTools::vtxToVtxDist(vert->getConstraintCenter(),
515 vert->getTagVertex());
518 double tagVDistanceToConstraintErr(
const Particle* part)
520 auto* vert = part->getRelatedTo<TagVertex>();
521 if (!vert)
return Const::doubleNaN;
523 if (vert->getConstraintType() ==
"noConstraint")
return Const::doubleNaN;
528 TMatrixDSym emptyMat(3);
530 return DistanceTools::vtxToVtxDistErr(vert->getConstraintCenter(),
531 vert->getTagVertex(),
532 vert->getConstraintCov(),
536 double tagVDistanceToConstraintSignificance(
const Particle* part)
538 double val = tagVDistanceToConstraint(part);
539 if (isinf(val) || isnan(val))
return Const::doubleNaN;
540 double err = tagVDistanceToConstraintErr(part);
541 if (isinf(err) || isnan(err))
return Const::doubleNaN;
546 double tagTrackDistanceToTagV(
const Particle* part,
const std::vector<double>& trackIndex)
548 auto* vert = part->getRelatedTo<TagVertex>();
549 if (!vert)
return Const::doubleNaN;
551 if (trackIndex.size() != 1)
return Const::doubleNaN;
552 unsigned trackIndexInt = trackIndex.at(0);
554 const Particle* particle = vert->getVtxFitParticle(trackIndexInt);
555 if (!particle)
return Const::doubleNaN;
557 return DistanceTools::trackToVtxDist(particle->getTrackFitResult()->getPosition(),
558 particle->getMomentum(),
559 vert->getTagVertex());
562 double tagTrackDistanceToTagVErr(
const Particle* part,
const std::vector<double>& trackIndex)
564 auto* vert = part->getRelatedTo<TagVertex>();
565 if (!vert)
return Const::doubleNaN;
567 if (trackIndex.size() != 1)
return Const::doubleNaN;
568 unsigned trackIndexInt = trackIndex.at(0);
570 const Particle* tagParticle(vert->getVtxFitParticle(trackIndexInt));
571 if (!tagParticle)
return Const::doubleNaN;
574 TMatrixDSym trackPosCovMat = tagParticle->getVertexErrorMatrix();
580 TMatrixDSym emptyMat(3);
582 return DistanceTools::trackToVtxDistErr(tagParticle->getTrackFitResult()->getPosition(),
583 tagParticle->getMomentum(),
584 vert->getTagVertex(),
590 double tagTrackDistanceToTagVSignificance(
const Particle* part,
const std::vector<double>& trackIndex)
592 double val = tagTrackDistanceToTagV(part, trackIndex);
593 if (isinf(val) || isnan(val))
return Const::doubleNaN;
594 double err = tagTrackDistanceToTagVErr(part, trackIndex);
595 if (isinf(err) || isnan(err))
return Const::doubleNaN;
600 double tagTrackTrueDistanceToTagV(
const Particle* part,
const std::vector<double>& trackIndex)
602 auto* vert = part->getRelatedTo<TagVertex>();
603 if (!vert)
return Const::doubleNaN;
605 if (trackIndex.size() != 1)
return Const::doubleNaN;
606 unsigned trackIndexInt = trackIndex.at(0);
608 const MCParticle* mcParticle(vert->getVtxFitMCParticle(trackIndexInt));
609 if (!mcParticle)
return Const::doubleNaN;
612 if (mcTagV(0) == Const::doubleNaN)
return Const::doubleNaN;
613 if (mcTagV(0) == 0 && mcTagV(1) == 0 && mcTagV(2) == 0)
return Const::doubleNaN;
615 return DistanceTools::trackToVtxDist(mcParticle->getProductionVertex(),
616 mcParticle->getMomentum(),
620 B2Vector3D tagTrackTrueVecToTagV(
const Particle* part,
const std::vector<double>& trackIndex)
622 auto* vert = part->getRelatedTo<TagVertex>();
623 if (!vert)
return vecNaN;
625 if (trackIndex.size() != 1)
return vecNaN;
626 unsigned trackIndexInt = trackIndex.
at(0);
628 const MCParticle* mcParticle(vert->getVtxFitMCParticle(trackIndexInt));
629 if (!mcParticle)
return vecNaN;
632 if (mcTagV(0) == Const::doubleNaN)
return vecNaN;
633 if (mcTagV(0) == 0 && mcTagV(1) == 0 && mcTagV(2) == 0)
return vecNaN;
635 return DistanceTools::trackToVtxVec(mcParticle->getProductionVertex(),
636 mcParticle->getMomentum(),
640 double tagTrackTrueVecToTagVX(
const Particle* part,
const std::vector<double>& trackIndex)
642 B2Vector3D result = tagTrackTrueVecToTagV(part, trackIndex);
646 double tagTrackTrueVecToTagVY(
const Particle* part,
const std::vector<double>& trackIndex)
648 B2Vector3D result = tagTrackTrueVecToTagV(part, trackIndex);
652 double tagTrackTrueVecToTagVZ(
const Particle* part,
const std::vector<double>& trackIndex)
654 B2Vector3D result = tagTrackTrueVecToTagV(part, trackIndex);
658 B2Vector3D tagTrackTrueMomentum(
const Particle* part,
const std::vector<double>& trackIndex)
660 auto* vert = part->getRelatedTo<TagVertex>();
661 if (!vert)
return vecNaN;
663 if (trackIndex.size() != 1)
return vecNaN;
664 unsigned trackIndexInt = trackIndex.
at(0);
666 const MCParticle* mcParticle(vert->getVtxFitMCParticle(trackIndexInt));
667 if (!mcParticle)
return vecNaN;
669 return mcParticle->getMomentum();
672 double tagTrackTrueMomentumX(
const Particle* part,
const std::vector<double>& trackIndex)
674 B2Vector3D pTrue = tagTrackTrueMomentum(part, trackIndex);
678 double tagTrackTrueMomentumY(
const Particle* part,
const std::vector<double>& trackIndex)
680 B2Vector3D pTrue = tagTrackTrueMomentum(part, trackIndex);
684 double tagTrackTrueMomentumZ(
const Particle* part,
const std::vector<double>& trackIndex)
686 B2Vector3D pTrue = tagTrackTrueMomentum(part, trackIndex);
690 B2Vector3D tagTrackTrueOrigin(
const Particle* part,
const std::vector<double>& trackIndex)
692 auto* vert = part->getRelatedTo<TagVertex>();
693 if (!vert)
return vecNaN;
695 if (trackIndex.size() != 1)
return vecNaN;
696 unsigned trackIndexInt = trackIndex.
at(0);
698 const MCParticle* mcParticle(vert->getVtxFitMCParticle(trackIndexInt));
699 if (!mcParticle)
return vecNaN;
701 return mcParticle->getProductionVertex();
704 double tagTrackTrueOriginX(
const Particle* part,
const std::vector<double>& trackIndex)
706 B2Vector3D origin = tagTrackTrueOrigin(part, trackIndex);
710 double tagTrackTrueOriginY(
const Particle* part,
const std::vector<double>& trackIndex)
712 B2Vector3D origin = tagTrackTrueOrigin(part, trackIndex);
716 double tagTrackTrueOriginZ(
const Particle* part,
const std::vector<double>& trackIndex)
718 B2Vector3D origin = tagTrackTrueOrigin(part, trackIndex);
722 int fitTruthStatus(
const Particle* part)
724 auto* vert = part->getRelatedTo<TagVertex>();
725 if (!vert)
return -1;
726 return vert->getFitTruthStatus();
729 int rollbackStatus(
const Particle* part)
731 auto* vert = part->getRelatedTo<TagVertex>();
732 if (!vert)
return -1;
733 return vert->getRollBackStatus();
745 TagTrFPtr getTagTrackFunctionFromName(
string const& name)
747 if (name ==
"TagTrackMomentum")
return tagTrackMomentum;
748 else if (name ==
"TagTrackMomentumX")
return tagTrackMomentumX;
749 else if (name ==
"TagTrackMomentumY")
return tagTrackMomentumY;
750 else if (name ==
"TagTrackMomentumZ")
return tagTrackMomentumZ;
751 else if (name ==
"TagTrackZ0")
return tagTrackZ0;
752 else if (name ==
"TagTrackD0")
return tagTrackD0;
753 else if (name ==
"TagTrackRaveWeight")
return tagTrackRaveWeight;
754 else if (name ==
"TagTrackDistanceToConstraint")
return tagTrackDistanceToConstraint;
755 else if (name ==
"TagTrackDistanceToConstraintErr")
return tagTrackDistanceToConstraintErr;
756 else if (name ==
"TagTrackDistanceToConstraintSignificance")
return tagTrackDistanceToConstraintSignificance;
757 else if (name ==
"TagTrackDistanceToTagV")
return tagTrackDistanceToTagV;
758 else if (name ==
"TagTrackDistanceToTagVErr")
return tagTrackDistanceToTagVErr;
759 else if (name ==
"TagTrackDistanceToTagVSignificance")
return tagTrackDistanceToTagVSignificance;
760 else if (name ==
"TagTrackTrueDistanceToTagV")
return tagTrackTrueDistanceToTagV;
761 else if (name ==
"TagTrackTrueVecToTagVX")
return tagTrackTrueVecToTagVX;
762 else if (name ==
"TagTrackTrueVecToTagVY")
return tagTrackTrueVecToTagVY;
763 else if (name ==
"TagTrackTrueVecToTagVZ")
return tagTrackTrueVecToTagVZ;
764 else if (name ==
"TagTrackTrueMomentumX")
return tagTrackTrueMomentumX;
765 else if (name ==
"TagTrackTrueMomentumY")
return tagTrackTrueMomentumY;
766 else if (name ==
"TagTrackTrueMomentumZ")
return tagTrackTrueMomentumZ;
767 else if (name ==
"TagTrackTrueOriginX")
return tagTrackTrueOriginX;
768 else if (name ==
"TagTrackTrueOriginY")
return tagTrackTrueOriginY;
769 else if (name ==
"TagTrackTrueOriginZ")
return tagTrackTrueOriginZ;
771 B2ERROR(
"From TimeDependentVariables: Trying to access unknown tagTrack function");
775 double cumulate(
const Particle* part,
const std::vector<std::string>& variable,
double start,
776 std::function<
double(
double,
double,
double)> fun)
778 TagTrFPtr fptr(getTagTrackFunctionFromName(variable.at(0)));
779 auto* vert = part->getRelatedTo<TagVertex>();
780 if (!vert)
return Const::doubleNaN;
781 int nTracks = vert->getNFitTracks();
785 for (
int i = 0; i < nTracks; ++i) {
786 vector<double> indx(1, i);
787 double w = tagTrackRaveWeight(part, indx);
788 double f = (*fptr)(part, indx);
790 acum = fun(acum, f, w);
796 Manager::FunctionPtr tagTrackAverage(
const std::vector<std::string>& variable)
798 if (variable.size() != 1) {
799 B2FATAL(
"Wrong number of arguments for meta function tagTrackAverage");
803 return [variable](
const Particle * part) ->
double {
804 double sum = cumulate(part, variable, 0, [](
double s,
double f,
double) {
return s + f;});
805 double tot = cumulate(part, variable, 0, [](
double s,
double,
double) {
return s + 1;});
806 return (tot > 0) ? sum / tot : Const::doubleNaN;
810 Manager::FunctionPtr tagTrackAverageSquares(
const std::vector<std::string>& variable)
812 if (variable.size() != 1) {
813 B2FATAL(
"Wrong number of arguments for meta function tagTrackAverageSquares");
817 return [variable](
const Particle * part) ->
double {
818 double sum = cumulate(part, variable, 0, [](
double s,
double f,
double) {
return s + f * f;});
819 double tot = cumulate(part, variable, 0, [](
double s,
double,
double) {
return s + 1;});
820 return (tot > 0) ? sum / tot : Const::doubleNaN;
825 Manager::FunctionPtr tagTrackMax(
const std::vector<std::string>& variable)
827 if (variable.size() != 1) {
828 B2FATAL(
"Wrong number of arguments for meta function tagTrackMax");
832 return [variable](
const Particle * part) ->
double {
833 double Max = cumulate(part, variable, -DBL_MAX, [](
double s,
double f,
double) {
return std::max(s, f);});
834 return (Max != -DBL_MAX) ? Max : Const::doubleNaN;
838 Manager::FunctionPtr tagTrackMin(
const std::vector<std::string>& variable)
840 if (variable.size() != 1) {
841 B2FATAL(
"Wrong number of arguments for meta function tagTrackMin");
845 return [variable](
const Particle * part) ->
double {
846 double Min = cumulate(part, variable, +DBL_MAX, [](
double s,
double f,
double) {
return std::min(s, f);});
847 return (Min != DBL_MAX) ? Min : Const::doubleNaN;
851 Manager::FunctionPtr tagTrackWeightedAverage(
const std::vector<std::string>& variable)
853 if (variable.size() != 1) {
854 B2FATAL(
"Wrong number of arguments for meta function tagTrackWeightedAverage");
858 return [variable](
const Particle * part) ->
double {
859 double num = cumulate(part, variable, 0, [](
double s,
double f,
double w) {
return s + w * f;});
860 double den = cumulate(part, variable, 0, [](
double s,
double,
double w) {
return s + w;});
861 return (den > 0) ? num / den : Const::doubleNaN;
865 Manager::FunctionPtr tagTrackWeightedAverageSquares(
const std::vector<std::string>& variable)
867 if (variable.size() != 1) {
868 B2FATAL(
"Wrong number of arguments for meta function tagTrackWeightedAverageSquares");
872 return [variable](
const Particle * part) ->
double {
873 double num = cumulate(part, variable, 0, [](
double s,
double f,
double w) {
return s + w * f * f;});
874 double den = cumulate(part, variable, 0, [](
double s,
double,
double w) {
return s + w;});
875 return (den > 0) ? num / den : Const::doubleNaN;
879 Manager::FunctionPtr tagTrackSum(
const std::vector<std::string>& variable)
881 if (variable.size() != 1) {
882 B2FATAL(
"Wrong number of arguments for meta function tagTrackSum");
886 return [variable](
const Particle * part) ->
double {
887 return cumulate(part, variable, 0, [](
double s,
double f,
double) {
return s + f;});
895 VARIABLE_GROUP(
"Time Dependent CPV Analysis Variables");
897 REGISTER_VARIABLE(
"TagVx", particleTagVx,
"Tag vertex X component\n\n",
"cm");
898 REGISTER_VARIABLE(
"TagVy", particleTagVy,
"Tag vertex Y component\n\n",
"cm");
899 REGISTER_VARIABLE(
"TagVz", particleTagVz,
"Tag vertex Z component\n\n",
"cm");
900 REGISTER_VARIABLE(
"mcTagVx", particleTruthTagVx,
"Generated Tag vertex X component\n\n",
"cm");
901 REGISTER_VARIABLE(
"mcTagVy", particleTruthTagVy,
"Generated Tag vertex Y component\n\n",
"cm");
902 REGISTER_VARIABLE(
"mcTagVz", particleTruthTagVz,
"Generated Tag vertex Z component\n\n",
"cm");
903 REGISTER_VARIABLE(
"TagVxErr", particleTagVxErr,
"Tag vertex X component uncertainty\n\n",
"cm");
904 REGISTER_VARIABLE(
"TagVyErr", particleTagVyErr,
"Tag vertex Y component uncertainty\n\n",
"cm");
905 REGISTER_VARIABLE(
"TagVzErr", particleTagVzErr,
"Tag vertex Z component uncertainty\n\n",
"cm");
906 REGISTER_VARIABLE(
"TagVpVal", particleTagVpVal,
"Tag vertex p-Value");
907 REGISTER_VARIABLE(
"TagVNTracks", particleTagVNTracks,
"Number of tracks in the tag vertex");
908 REGISTER_VARIABLE(
"TagVType", particleTagVType,
909 R
"DOC(Type of algorithm for the tag vertex. -1: failed (1,2: single track, deprecated), 3: standard, 4: standard_PXD, 5: no constraint)DOC");
910 REGISTER_VARIABLE("TagVNDF", particleTagVNDF,
"Number of degrees of freedom in the tag vertex fit");
911 REGISTER_VARIABLE(
"TagVChi2", particleTagVChi2,
"chi2 value of the tag vertex fit");
912 REGISTER_VARIABLE(
"TagVChi2IP", particleTagVChi2IP,
"IP component of chi2 value of the tag vertex fit");
914 REGISTER_VARIABLE(
"DeltaT", particleDeltaT, R
"DOC(
915 Proper decay time difference :math:`\Delta t` between signal B-meson :math:`(B_{rec})` and tag B-meson :math:`(B_{tag})`.
918 REGISTER_VARIABLE(
"DeltaTErr", particleDeltaTErr, R
"DOC(
919 Proper decay time difference :math:`\Delta t` uncertainty
922 REGISTER_VARIABLE(
"DeltaTRes", particleDeltaTRes, R
"DOC(
923 :math:`\Delta t` residual, to be used for resolution function studies
926 REGISTER_VARIABLE(
"DeltaTBelle", particleDeltaTBelle, R
"DOC(
927 [Legacy] :math:`\Delta t`, as it was used in Belle
930 REGISTER_VARIABLE(
"mcDeltaTau", particleMCDeltaTau,
931 R
"DOC(Generated proper decay time difference :math:`\Delta t`: :math:`\tau(B_{\rm rec})-\tau(B_{\rm tag})`
934 REGISTER_VARIABLE(
"mcDeltaT", particleMCDeltaT,
935 R
"DOC(Generated proper decay time difference (in z-difference approximation) :math:`\Delta t`:
936 :math:`(l(B_{\rm rec}) - l(B_{\rm tag}))/\beta_{\Upsilon(4S)}\gamma_{\Upsilon(4S)}`
939 REGISTER_VARIABLE("mcDeltaBoost", particleMCDeltaBoost,
940 R"DOC(True difference of decay vertex boost-direction components between signal B-meson :math:`(B_{rec})` and tag B-meson :math:`(B_{tag})`:
941 :math:`\Delta l = l(B_{rec}) - l(B_{tag})`
944 REGISTER_VARIABLE(
"DeltaZ", particleDeltaZ,
945 R
"DOC(Difference of decay vertex longitudinal components between signal B-meson :math:`(B_{rec})` and tag B-meson :math:`(B_{tag})`:
946 :math:`\Delta z = z(B_{rec}) - z(B_{tag})`
949 REGISTER_VARIABLE(
"DeltaZErr", particleDeltaZErr,
950 R
"DOC(Uncertainty of the difference :math:`z(B_{rec}) - z(B_{tag})`
953 REGISTER_VARIABLE(
"DeltaBoost", particleDeltaB, R
"DOC(:math:`\Delta z` in the boost direction
956 REGISTER_VARIABLE(
"DeltaBoostErr", particleDeltaBErr, R
"DOC(Uncertainty of :math:`\Delta z` in the boost direction
960 REGISTER_VARIABLE(
"LBoost", vertexBoostDirection,
961 "Returns the vertex component in the boost direction\n\n",
"cm");
962 REGISTER_VARIABLE(
"OBoost", vertexOrthogonalBoostDirection,
963 "Returns the vertex component in the direction orthogonal to the boost\n\n",
"cm");
964 REGISTER_VARIABLE(
"mcLBoost", vertexTruthBoostDirection,
965 "Returns the MC vertex component in the boost direction\n\n",
"cm");
966 REGISTER_VARIABLE(
"mcOBoost", vertexTruthOrthogonalBoostDirection,
967 "Returns the MC vertex component in the direction orthogonal to the boost\n\n",
"cm");
968 REGISTER_VARIABLE(
"LBoostErr", vertexErrBoostDirection,
969 "Returns the error of the vertex in the boost direction\n\n",
"cm");
970 REGISTER_VARIABLE(
"OBoostErr", vertexErrOrthBoostDirection,
971 "Returns the error of the vertex in the direction orthogonal to the boost\n\n",
"cm");
973 REGISTER_VARIABLE(
"TagVLBoost", tagVBoostDirection,
974 "Returns the TagV component in the boost direction\n\n",
"cm");
975 REGISTER_VARIABLE(
"TagVOBoost", tagVOrthogonalBoostDirection,
976 "Returns the TagV component in the direction orthogonal to the boost\n\n",
"cm");
977 REGISTER_VARIABLE(
"mcTagVLBoost", tagVTruthBoostDirection,
978 "Returns the MC TagV component in the boost direction\n\n",
"cm");
979 REGISTER_VARIABLE(
"mcTagVOBoost", tagVTruthOrthogonalBoostDirection,
980 "Returns the MC TagV component in the direction orthogonal to the boost\n\n",
"cm");
981 REGISTER_VARIABLE(
"TagVLBoostErr", tagVErrBoostDirection,
982 "Returns the error of TagV in the boost direction\n\n",
"cm");
983 REGISTER_VARIABLE(
"TagVOBoostErr", tagVErrOrthogonalBoostDirection,
984 "Returns the error of TagV in the direction orthogonal to the boost\n\n",
"cm");
986 REGISTER_VARIABLE(
"cosAngleBetweenMomentumAndBoostVector", particleCosThetaBoostDirection,
987 "cosine of the angle between momentum and boost vector");
989 REGISTER_VARIABLE(
"internalTagVMCFlavor", particleInternalTagVMCFlavor,
990 "[Expert] [Debugging] This variable is only for internal checks of the TagV module by developers. \n"
991 "It returns the internal mc flavor information of the tag-side B provided by the TagV module.");
993 REGISTER_VARIABLE(
"TagTrackMomentum(i) ", tagTrackMomentum,
994 "Returns the magnitude of the momentum of the ith track used in the tag vtx fit.\n\n",
"GeV/c");
995 REGISTER_VARIABLE(
"TagTrackMomentumX(i) ", tagTrackMomentumX,
996 "Returns the X component of the momentum of the ith track used in the tag vtx fit.\n\n",
"GeV/c");
997 REGISTER_VARIABLE(
"TagTrackMomentumY(i) ", tagTrackMomentumY,
998 "Returns the Y component of the momentum of the ith track used in the tag vtx fit.\n\n",
"GeV/c");
999 REGISTER_VARIABLE(
"TagTrackMomentumZ(i) ", tagTrackMomentumZ,
1000 "Returns the Z component of the momentum of the ith track used in the tag vtx fit.\n\n",
"GeV/c");
1002 REGISTER_VARIABLE(
"TagTrackZ0(i)", tagTrackZ0,
"Returns the z0 parameter of the ith track used in the tag vtx fit\n\n",
"cm");
1003 REGISTER_VARIABLE(
"TagTrackD0(i)", tagTrackD0,
"Returns the d0 parameter of the ith track used in the tag vtx fit\n\n",
"cm");
1006 REGISTER_VARIABLE(
"TagTrackRaveWeight(i)", tagTrackRaveWeight,
"Returns the weight assigned by Rave to track i");
1008 REGISTER_VARIABLE(
"TagVNFitTracks", particleTagVNFitTracks,
1009 "returns the number of tracks used by rave to fit the vertex (not counting the ones coming from Kshorts)");
1011 REGISTER_VARIABLE(
"TagTrackDistanceToConstraint(i)", tagTrackDistanceToConstraint,
1012 "Returns the measured distance between the ith tag track and the centre of the constraint.\n\n",
"cm");
1014 REGISTER_VARIABLE(
"TagTrackDistanceToConstraintErr(i)", tagTrackDistanceToConstraintErr,
1015 "Returns the estimated error on the distance between the ith tag track and the centre of the constraint.\n\n",
"cm");
1017 REGISTER_VARIABLE(
"TagTrackDistanceToConstraintSignificance(i)", tagTrackDistanceToConstraintSignificance,
1018 "Returns the significance of the distance between the centre of the constraint and the tag track indexed by track index (computed as distance / uncertainty)");
1021 REGISTER_VARIABLE(
"TagVDistanceToConstraint", tagVDistanceToConstraint,
1022 "returns the measured distance between the tag vtx and the centre of the constraint.\n\n",
"cm");
1024 REGISTER_VARIABLE(
"TagVDistanceToConstraintErr", tagVDistanceToConstraintErr,
1025 "returns the estimated error on the distance between the tag vtx and the centre of the constraint.\n\n",
"cm");
1027 REGISTER_VARIABLE(
"TagVDistanceToConstraintSignificance", tagVDistanceToConstraintSignificance,
1028 "returns the significance of the distance between the tag vtx and the centre of the constraint (computed as distance / uncertainty)");
1030 REGISTER_VARIABLE(
"TagTrackDistanceToTagV(i)", tagTrackDistanceToTagV,
1031 "Returns the measured distance between the ith tag track and the tag vtx.\n\n",
"cm");
1033 REGISTER_VARIABLE(
"TagTrackDistanceToTagVErr(i)", tagTrackDistanceToTagVErr, R
"DOC(
1034 Returns the estimated error on the distance between the ith tag track and the tag vtx.
1036 .. warning:: Only the uncertainties on the track position parameters are taken into account.
1040 REGISTER_VARIABLE(
"TagTrackDistanceToTagVSignificance(i)", tagTrackDistanceToTagVSignificance,
1041 "Returns the significance of the distance between the tag vtx and the tag track indexed by trackIndex (computed as distance / uncertainty)");
1043 REGISTER_VARIABLE(
"TagTrackTrueDistanceToTagV(i)", tagTrackTrueDistanceToTagV,
1044 "Returns the true distance between the true B Tag decay vertex and the particle corresponding to the ith tag vtx track.\n\n",
"cm");
1046 REGISTER_VARIABLE(
"TagTrackTrueVecToTagVX(i)", tagTrackTrueVecToTagVX,
1047 "Returns the X coordinate of the vector between the mc particle corresponding to the ith tag vtx track and the true tag B decay vertex.\n\n",
1050 REGISTER_VARIABLE(
"TagTrackTrueVecToTagVY(i)", tagTrackTrueVecToTagVY,
1051 "Returns the Y coordinate of the vector between the mc particle corresponding to the ith tag vtx track and the true tag B decay vertex.\n\n",
1054 REGISTER_VARIABLE(
"TagTrackTrueVecToTagVZ(i)", tagTrackTrueVecToTagVZ,
1055 "Returns the Z coordinate of the vector between the mc particle corresponding to the ith tag vtx track and the true tag B decay vertex.\n\n",
1058 REGISTER_VARIABLE(
"TagTrackTrueMomentumX(i)", tagTrackTrueMomentumX,
1059 "Returns the X component of the true momentum of the MC particle corresponding to the ith tag vtx track.\n\n",
"GeV/c");
1061 REGISTER_VARIABLE(
"TagTrackTrueMomentumY(i)", tagTrackTrueMomentumY,
1062 "Returns the Y component of the true momentum of the MC particle corresponding to the ith tag vtx track.\n\n",
"GeV/c");
1064 REGISTER_VARIABLE(
"TagTrackTrueMomentumZ(i)", tagTrackTrueMomentumZ,
1065 "Returns the Z component of the true momentum of the MC particle corresponding to the ith tag vtx track.\n\n",
"GeV/c");
1067 REGISTER_VARIABLE(
"TagTrackTrueOriginX(i)", tagTrackTrueOriginX,
1068 "Returns the X component of the true origin of the MC particle corresponding to the ith tag vtx track.\n\n",
"cm");
1070 REGISTER_VARIABLE(
"TagTrackTrueOriginY(i)", tagTrackTrueOriginY,
1071 "Returns the Y component of the true origin of the MC particle corresponding to the ith tag vtx track.\n\n",
"cm");
1073 REGISTER_VARIABLE(
"TagTrackTrueOriginZ(i)", tagTrackTrueOriginZ,
1074 "Returns the Z component of the true origin of the MC particle corresponding to the ith tag vtx track.\n\n",
"cm");
1076 REGISTER_VARIABLE(
"TagVFitTruthStatus", fitTruthStatus, R
"DOC(
1077 Returns the status of the fit performed with the truth info. Possible values are:
1079 - -1: no related TagVertex found
1080 - 0: fit performed with measured parameters
1081 - 1: fit performed with true parameters
1082 - 2: unable to recover truth parameters
1085 REGISTER_VARIABLE("TagVRollBackStatus", rollbackStatus, R
"DOC(
1086 Returns the status of the fit performed with rolled back tracks. Possible values are:
1088 - -1: no related TagVertex found
1089 - 0: fit performed with measured parameters
1090 - 1: fit performed with true parameters
1091 - 2: unable to recover truth parameters
1094 REGISTER_METAVARIABLE("TagTrackMax(var)", tagTrackMax,
1095 "return the maximum value of the variable ``var`` evaluated for each tag track. ``var`` must be one of the TagTrackXXX variables, for example: ``TagTrackMax(TagTrackDistanceToConstraint)``. The tracks that are assigned a zero weight are ignored.",
1096 Manager::VariableDataType::c_double);
1098 REGISTER_METAVARIABLE(
"TagTrackMin(var)", tagTrackMin,
1099 "return the minimum value of the variable ``var`` evaluated for each tag track. ``var`` must be one of the TagTrackXXX variables, for example: ``TagTrackMin(TagTrackDistanceToConstraint)``. The tracks that are assigned a zero weight are ignored.",
1100 Manager::VariableDataType::c_double);
1102 REGISTER_METAVARIABLE(
"TagTrackAverage(var)", tagTrackAverage,
1103 "return the average over the tag tracks of the variable ``var``. ``var`` must be one of the TagTrackXXX variables, for example: ``TagTrackAverage(TagTrackDistanceToConstraint)``. The tracks that are assigned a zero weight are ignored.",
1104 Manager::VariableDataType::c_double);
1106 REGISTER_METAVARIABLE(
"TagTrackAverageSquares(var)", tagTrackAverageSquares,
1107 "return the average over the tag tracks of the square of the variable ``var``. ``var`` must be one of the TagTrackXXX variables, for example: ``TagTrackAverageSquares(TagTrackDistanceToConstraint)``. The tracks that are assigned a zero weight are ignored.",
1108 Manager::VariableDataType::c_double);
1110 REGISTER_METAVARIABLE(
"TagTrackWeightedAverage(var)", tagTrackWeightedAverage,
1111 "return the average over the tag tracks of the variable ``var``, weighted by weights of the tag vertex fitter. ``var`` must be one of the TagTrackXXX variables, for example: ``TagTrackWeightedAverage(TagTrackDistanceToConstraint)``.",
1112 Manager::VariableDataType::c_double);
1114 REGISTER_METAVARIABLE(
"TagTrackWeightedAverageSquares(var)", tagTrackWeightedAverageSquares,
1115 "return the average over the tag tracks of the variable ``var``, weighted by weights of the tag vertex fitter. ``var`` must be one of the TagTrackXXX variables, for example: ``TagTrackWeightedAverageSquares(TagTrackDistanceToConstraint)``.",
1116 Manager::VariableDataType::c_double);
1118 REGISTER_METAVARIABLE(
"TagTrackSum(var)", tagTrackSum,
1119 "Returns the sum of the provided variable for all tag tracks. The variable must be one of the TagTrackXXX variables, "
1120 "for example ``TagTrackSum(TagTrackD0)``. The tracks that are assigned a zero weight are ignored.",
1121 Manager::VariableDataType::c_double);
B2Vector3< DataType > Unit() const
Unit vector parallel to this.
B2Vector3< float > B2Vector3F
typedef for common usage with float
B2Vector3< double > B2Vector3D
typedef for common usage with double
DataType at(unsigned i) const
safe member access (with boundary check!)
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.