9#include <alignment/modules/MillepedeCollector/MillepedeCollectorModule.h>
11#include <alignment/dataobjects/MilleData.h>
12#include <alignment/GblMultipleScatteringController.h>
13#include <alignment/GlobalDerivatives.h>
14#include <alignment/GlobalLabel.h>
15#include <alignment/GlobalParam.h>
16#include <alignment/GlobalTimeLine.h>
17#include <alignment/Manager.h>
18#include <alignment/reconstruction/AlignableCDCRecoHit.h>
19#include <alignment/reconstruction/AlignablePXDRecoHit.h>
20#include <alignment/reconstruction/AlignableSVDRecoHit.h>
21#include <alignment/reconstruction/AlignableSVDRecoHit2D.h>
22#include <alignment/reconstruction/AlignableBKLMRecoHit.h>
23#include <alignment/reconstruction/AlignableEKLMRecoHit.h>
24#include <analysis/dataobjects/ParticleList.h>
25#include <analysis/utility/ReferenceFrame.h>
26#include <framework/core/FileCatalog.h>
27#include <framework/database/DBObjPtr.h>
28#include <framework/dataobjects/FileMetaData.h>
29#include <framework/datastore/StoreArray.h>
30#include <framework/dbobjects/BeamParameters.h>
31#include <framework/particledb/EvtGenDatabasePDG.h>
32#include <framework/pcore/ProcHandler.h>
33#include <mdst/dbobjects/BeamSpot.h>
34#include <mdst/dataobjects/Track.h>
35#include <tracking/trackFitting/fitter/base/TrackFitter.h>
36#include <tracking/trackFitting/measurementCreator/adder/MeasurementAdder.h>
38#include <genfit/FullMeasurement.h>
39#include <genfit/GblFitter.h>
40#include <genfit/KalmanFitterInfo.h>
41#include <genfit/PlanarMeasurement.h>
42#include <genfit/Track.h>
47#include <TDecompSVD.h>
51using namespace alignment;
65 setDescription(
"Calibration data collector for Millepede Algorithm");
68 addParam(
"tracks",
m_tracks,
"Names of collections of RecoTracks (already fitted with DAF) for calibration", vector<string>({
""}));
69 addParam(
"particles",
m_particles,
"Names of particle list of single particles", vector<string>());
71 "Name of particle list of (mother) particles with daughters for calibration using vertex constraint", vector<string>());
73 "Name of particle list of (mother) particles with daughters for calibration using vertex + IP profile constraint",
76 "Name of particle list of (mother) particles with daughters for calibration using vertex + mass constraint",
79 "Name of particle list of (mother) particles with daughters for calibration using vertex + IP profile + kinematics constraint",
82 "Name of particle list of (mother) particles with daughters for calibration using vertex + mass constraint",
85 "Name of particle list of (mother) particles with daughters for calibration using vertex + IP profile + mass constraint",
89 "Width (in GeV/c/c) to use for invariant mass constraint for 'stable' particles (like K short). Temporary until proper solution is found.",
92 addParam(
"doublePrecision",
m_doublePrecision,
"Use double (=true) or single/float (=false) precision for writing binary files",
94 addParam(
"useGblTree",
m_useGblTree,
"Store GBL trajectories in a tree instead of output to binary files",
96 addParam(
"absFilePaths",
m_absFilePaths,
"Use absolute paths to remember binary files. Only applies if useGblTree=False",
101 "Specify which DB objects are calibrated, like ['BeamSpot', 'CDCTimeWalks'] or leave empty to use all components available.",
104 "For primary vertices / two body decays, beam spot vertex calibration derivatives are added",
107 "For primary two body decays, beam spot kinematics calibration derivatives are added",
115 addParam(
"recalcJacobians",
m_recalcJacobians,
"Up to which external iteration propagation Jacobians should be re-calculated",
118 addParam(
"minPValue",
m_minPValue,
"Minimum p-value to write out a (combined) trajectory. Set <0 to write out all.",
131 addParam(
"hierarchyType",
m_hierarchyType,
"Type of (VXD only now) hierarchy: 0 = None, 1 = Flat, 2 = Half-Shells, 3 = Full",
145 "List of (event, run, exp) with event numbers at which payloads can change for timedep calibration.",
149 "list{ {list{param1, param2, ...}, list{(ev1, run1, exp1), ...}}, ... }.",
154 "dict{ list_name: (mass, width), ... } with custom mass and width to use as external measurement.",
170 B2ERROR(
"You have to specify either arrays of single tracks or particle lists of single single particles or mothers with vertex constrained daughters.");
206 auto gblDataTree =
new TTree(
"GblDataTree",
"GblDataTree");
207 gblDataTree->Branch<std::vector<gbl::GblData>>(
"GblData", &
m_currentGblData, 32000, 99);
208 registerObject<TTree>(
"GblDataTree", gblDataTree);
210 registerObject<TH1I>(
"ndf",
new TH1I(
"ndf",
"ndf", 200, 0, 200));
211 registerObject<TH1F>(
"chi2_per_ndf",
new TH1F(
"chi2_per_ndf",
"chi2 divided by ndf", 200, 0., 50.));
212 registerObject<TH1F>(
"pval",
new TH1F(
"pval",
"pval", 100, 0., 1.));
214 registerObject<TH1F>(
"cdc_hit_fraction",
new TH1F(
"cdc_hit_fraction",
"cdc_hit_fraction", 100, 0., 1.));
215 registerObject<TH1F>(
"evt0",
new TH1F(
"evt0",
"evt0", 400, -100., 100.));
230 std::vector<EventMetaData> events;
232 events.push_back(
EventMetaData(std::get<0>(ev_run_exp), std::get<1>(ev_run_exp), std::get<2>(ev_run_exp)));
237 auto autoEvents = Belle2::alignment::timeline::setupTimedepGlobalLabels(
m_timedepConfig);
244 B2ERROR(
"Cannot set both, event list and timedep config.");
260 auto mille = getObjectPtr<MilleData>(
"mille");
261 if (!mille->isOpen())
265 std::shared_ptr<genfit::GblFitter> gbl(
new genfit::GblFitter());
267 double lostWeight = -1.;
276 for (
auto& recoTrack : recoTracks) {
282 if (!track.hasFitStatus())
284 genfit::GblFitStatus* fs =
dynamic_cast<genfit::GblFitStatus*
>(track.getFitStatus());
288 if (!fs->isFittedWithReferenceTrack())
292 GblTrajectory trajectory(gbl->collectGblPoints(&track, track.getCardinalRep()), fs->hasCurvature());
294 trajectory.fit(chi2, ndf, lostWeight);
295 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
296 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
297 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
300 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
314 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
316 auto gblfs =
dynamic_cast<genfit::GblFitStatus*
>(track->getFitStatus());
318 gbl::GblTrajectory trajectory(gbl->collectGblPoints(track, track->getCardinalRep()), gblfs->hasCurvature());
320 trajectory.fit(chi2, ndf, lostWeight);
321 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
322 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
323 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
326 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
340 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
341 auto mother = list->getParticle(iParticle);
342 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
345 daughters.push_back({
346 gbl->collectGblPoints(track, track->getCardinalRep()),
350 if (daughters.size() > 1) {
351 gbl::GblTrajectory combined(daughters);
353 combined.fit(chi2, ndf, lostWeight);
354 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
355 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
356 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
359 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
365 B2RESULT(
"Vertex-constrained fit NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
376 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
377 auto mother = list->getParticle(iParticle);
378 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
380 TMatrixD extProjection(5, 3);
381 TMatrixD locProjection(3, 5);
384 TMatrixD innerTrafo(5, 3 + 3 * mother->getDaughters().size());
385 unsigned int iCol(3);
398 innerTrafo[0][iCol++] = 1.;
399 innerTrafo[1][iCol++] = 1.;
400 innerTrafo[2][iCol++] = 1.;
403 daughters.push_back({
404 gbl->collectGblPoints(track, track->getCardinalRep()),
409 if (daughters.size() > 1) {
412 TMatrixDSym vertexCov(get<TMatrixDSym>(beam));
413 TMatrixDSym vertexPrec(get<TMatrixDSym>(beam).Invert());
416 TVectorD extMeasurements(3);
417 extMeasurements[0] = vertexResidual[0];
418 extMeasurements[1] = vertexResidual[1];
419 extMeasurements[2] = vertexResidual[2];
421 TMatrixD extDeriv(3, 9);
429 TMatrixD derivatives(3, 3);
431 derivatives(0, 0) = 1.;
432 derivatives(1, 1) = 1.;
433 derivatives(2, 2) = 1.;
435 std::vector<int> labels;
436 GlobalLabel label = GlobalLabel::construct<BeamSpot>(0, 0);
437 labels.push_back(label.setParameterId(1));
438 labels.push_back(label.setParameterId(2));
439 labels.push_back(label.setParameterId(3));
446 std::vector<int> lab(globals); TMatrixD der(globals);
472 TMatrixD dLocal_dExt = extProjection;
473 TMatrixD dExt_dLocal = locProjection;
475 TVectorD locRes = dLocal_dExt * extMeasurements;
477 TMatrixD locCov = dLocal_dExt * vertexCov * dExt_dLocal;
479 TMatrixD locPrec = locCov.GetSub(3, 4, 3, 4).Invert();
480 TMatrixDSym locPrec2D(2); locPrec2D.Zero();
481 for (
int i = 0; i < 2; ++i)
482 for (
int j = 0; j < 2; ++j)
483 locPrec2D(i, j) = locPrec(i, j);
488 TVectorD locRes2D = locRes.GetSub(3, 4);
489 TMatrixD locDerivs2D = (extProjection * der).GetSub(3, 4, 0, 2);
493 daughters[0].first[0].addMeasurement(locRes2D, locPrec2D);
495 daughters[0].first[0].addGlobals(lab, locDerivs2D);
498 gbl::GblTrajectory combined(daughters);
502 combined.fit(chi2, ndf, lostWeight);
503 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
504 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
505 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
508 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
512 B2RESULT(
"Beam vertex constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
516 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, vertexPrec);
518 combined.fit(chi2, ndf, lostWeight);
519 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
520 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
521 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
524 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
529 B2RESULT(
"Beam vertex constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
541 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
543 auto mother = list->getParticle(iParticle);
545 if (track12.size() != 2) {
546 B2ERROR(
"Did not get 2 fitted tracks. Skipping this mother.");
551 double motherMass = mother->getPDGMass();
552 double motherWidth = pdgdb->GetParticle(mother->getPDGCode())->Width();
557 if (motherWidth == 0.) {
559 B2WARNING(
"Using artificial width for " << pdgdb->GetParticle(mother->getPDGCode())->GetName() <<
" : " << motherWidth <<
" GeV");
563 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
565 daughters.push_back({gbl->collectGblPoints(track12[0], track12[0]->getCardinalRep()), dfdextPlusMinus.first});
566 daughters.push_back({gbl->collectGblPoints(track12[1], track12[1]->getCardinalRep()), dfdextPlusMinus.second});
568 TMatrixDSym massPrec(1); massPrec(0, 0) = 1. / motherWidth / motherWidth;
569 TVectorD massResidual(1); massResidual = - (mother->getMass() - motherMass);
571 TVectorD extMeasurements(1);
572 extMeasurements[0] = massResidual[0];
574 TMatrixD extDeriv(1, 9);
578 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, massPrec);
580 combined.fit(chi2, ndf, lostWeight);
583 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
584 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
585 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
588 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
592 B2RESULT(
"Mass(PDG) + vertex constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
606 double motherMass = beam->getMass();
607 double motherWidth =
sqrt((beam->getCovHER() + beam->getCovLER())(0, 0));
611 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
613 auto mother = list->getParticle(iParticle);
615 if (track12.size() != 2) {
616 B2ERROR(
"Did not get 2 fitted tracks. Skipping this mother.");
621 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
623 daughters.push_back({gbl->collectGblPoints(track12[0], track12[0]->getCardinalRep()), dfdextPlusMinus.first});
624 daughters.push_back({gbl->collectGblPoints(track12[1], track12[1]->getCardinalRep()), dfdextPlusMinus.second});
626 TMatrixDSym massPrec(1); massPrec(0, 0) = 1. / motherWidth / motherWidth;
627 TVectorD massResidual(1); massResidual = - (mother->getMass() - motherMass);
629 TVectorD extMeasurements(1);
630 extMeasurements[0] = massResidual[0];
632 TMatrixD extDeriv(1, 9);
636 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, massPrec);
638 combined.fit(chi2, ndf, lostWeight);
639 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
640 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
641 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
644 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
648 B2RESULT(
"Mass constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
662 double motherMass = beam->getMass();
663 double motherWidth =
sqrt((beam->getCovHER() + beam->getCovLER())(0, 0));
667 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
669 auto mother = list->getParticle(iParticle);
671 if (track12.size() != 2) {
672 B2ERROR(
"Did not get 2 fitted tracks. Skipping this mother.");
677 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
679 daughters.push_back({gbl->collectGblPoints(track12[0], track12[0]->getCardinalRep()), dfdextPlusMinus.first});
680 daughters.push_back({gbl->collectGblPoints(track12[1], track12[1]->getCardinalRep()), dfdextPlusMinus.second});
685 TMatrixDSym massPrec(1); massPrec(0, 0) = 1. / motherWidth / motherWidth;
686 TVectorD massResidual(1); massResidual = - (mother->getMass() - motherMass);
688 TMatrixDSym extPrec(4); extPrec.Zero();
689 extPrec.SetSub(0, 0, vertexPrec);
690 extPrec(3, 3) = massPrec(0, 0);
692 TVectorD extMeasurements(4);
693 extMeasurements[0] = vertexResidual[0];
694 extMeasurements[1] = vertexResidual[1];
695 extMeasurements[2] = vertexResidual[2];
696 extMeasurements[3] = massResidual[0];
698 TMatrixD extDeriv(4, 9);
705 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, extPrec);
707 combined.fit(chi2, ndf, lostWeight);
708 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
709 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
710 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
713 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
719 B2RESULT(
"Mass + vertex constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
725 B2WARNING(
"This should NOT be used for production of calibration constants for the real detector (yet)!");
734 double M = beam->getMass();
735 double E_HER = beam->getHER().E();
736 double E_LER = beam->getLER().E();
738 double pz = beam->getHER().Pz() + beam->getLER().Pz();
739 double E = (beam->getHER() + beam->getLER()).
E();
741 double motherMass = beam->getMass();
742 double motherWidth =
sqrt((E_HER / M) * (E_HER / M) * beam->getCovLER()(0, 0) + (E_LER / M) * (E_LER / M) * beam->getCovHER()(0,
747 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
749 B2WARNING(
"Two body decays with full kinematic constraint not yet correct - need to resolve strange covariance provided by BeamParameters!");
751 auto mother = list->getParticle(iParticle);
754 if (track12.size() != 2) {
755 B2ERROR(
"Did not get exactly 2 fitted tracks. Skipping this mother in list " << listName);
760 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
762 daughters.push_back({gbl->collectGblPoints(track12[0], track12[0]->getCardinalRep()), dfdextPlusMinus.first});
763 daughters.push_back({gbl->collectGblPoints(track12[1], track12[1]->getCardinalRep()), dfdextPlusMinus.second});
765 TMatrixDSym extCov(7); extCov.Zero();
774 TMatrixD dBoost_dVect(3, 3);
775 dBoost_dVect(0, 0) = 0.; dBoost_dVect(0, 1) = 1. / pz; dBoost_dVect(0, 2) = 0.;
776 dBoost_dVect(1, 0) = 0.; dBoost_dVect(1, 1) = 0.; dBoost_dVect(1, 2) = 1. / pz;
777 dBoost_dVect(2, 0) = pz /
E; dBoost_dVect(2, 1) = 0.; dBoost_dVect(2, 2) = 0.;
779 TMatrixD dVect_dBoost(3, 3);
780 dVect_dBoost(0, 0) = 0.; dVect_dBoost(0, 1) = 0.; dVect_dBoost(0, 2) =
E / pz;
781 dVect_dBoost(1, 0) = pz; dVect_dBoost(1, 1) = 0.; dVect_dBoost(1, 2) = 0.;
782 dVect_dBoost(2, 0) = 0.; dVect_dBoost(2, 1) = pz; dVect_dBoost(2, 2) = 0.;
784 TMatrixD covBoost(3, 3);
785 for (
int i = 0; i < 3; ++i) {
786 for (
int j = i; j < 3; ++j) {
787 covBoost(j, i) = covBoost(i, j) = (beam->getCovHER() + beam->getCovLER())(i, j);
793 if (covBoost(1, 1) == 0.) covBoost(1, 1) = 1.e-4;
794 if (covBoost(2, 2) == 0.) covBoost(2, 2) = 1.e-4;
796 TMatrixD covVect = dBoost_dVect * covBoost * dVect_dBoost;
798 extCov.SetSub(3, 3, covVect);
800 extCov(6, 6) = motherWidth * motherWidth;
801 auto extPrec = extCov; extPrec.Invert();
803 TVectorD extMeasurements(7);
807 extMeasurements[3] = - (
B2Vector3D(mother->getMomentum()) - (beam->getHER().Vect() + beam->getLER().Vect()))[0];
808 extMeasurements[4] = - (
B2Vector3D(mother->getMomentum()) - (beam->getHER().Vect() + beam->getLER().Vect()))[1];
809 extMeasurements[5] = - (
B2Vector3D(mother->getMomentum()) - (beam->getHER().Vect() + beam->getLER().Vect()))[2];
810 extMeasurements[6] = - (mother->getMass() - motherMass);
812 B2INFO(
"mother mass = " << mother->getMass() <<
" and beam mass = " << beam->getMass());
814 TMatrixD extDeriv(7, 9);
828 B2WARNING(
"Primary vertex+kinematics calibration not (yet?) fully implemented!");
829 B2WARNING(
"This code is highly experimental and has (un)known issues!");
832 TMatrixD derivatives(9, 6);
833 std::vector<int> labels;
837 derivatives(0, 0) = 1.;
838 derivatives(1, 1) = 1.;
839 derivatives(2, 2) = 1.;
840 GlobalLabel label = GlobalLabel::construct<BeamSpot>(0, 0);
841 labels.push_back(label.setParameterId(1));
842 labels.push_back(label.setParameterId(2));
843 labels.push_back(label.setParameterId(3));
851 derivatives(3, 3) = mother->getMomentumMagnitude();
852 derivatives(4, 4) = mother->getMomentumMagnitude();
853 derivatives(8, 5) = (beam->getLER().E() + beam->getHER().E()) / beam->getMass();
855 GlobalLabel label = GlobalLabel::construct<BeamSpot>(0, 0);
856 labels.push_back(label.setParameterId(4));
857 labels.push_back(label.setParameterId(5));
858 labels.push_back(label.setParameterId(6));
872 std::vector<int> lab(globals); TMatrixD der(globals);
875 TMatrixD dTwoBody_dExt(9, 7);
876 dTwoBody_dExt.Zero();
878 dTwoBody_dExt(0, 0) = 1.;
879 dTwoBody_dExt(1, 1) = 1.;
880 dTwoBody_dExt(2, 2) = 1.;
882 dTwoBody_dExt(3, 3) = 1.;
883 dTwoBody_dExt(4, 4) = 1.;
884 dTwoBody_dExt(5, 5) = 1.;
886 dTwoBody_dExt(8, 6) = 1.;
888 const TMatrixD dLocal_dExt = dfdextPlusMinus.first * dTwoBody_dExt;
889 TMatrixD dLocal_dExt_T = dLocal_dExt; dLocal_dExt_T.T();
898 TDecompSVD svd(dLocal_dExt_T);
899 TMatrixD dExt_dLocal = svd.Invert().T();
916 for (
int i = 0; i < 7; ++i) {
917 for (
int j = 0; j < 5; ++j) {
918 if (fabs(dExt_dLocal(i, j)) < 1.e-6)
919 dExt_dLocal(i, j) = 0.;
922 const TVectorD locRes = dLocal_dExt * extMeasurements;
923 const TMatrixD locPrec = dLocal_dExt * extPrec * dExt_dLocal;
925 TMatrixDSym locPrecSym(5); locPrecSym.Zero();
926 for (
int i = 0; i < 5; ++i) {
927 for (
int j = i; j < 5; ++j) {
929 locPrecSym(j, i) = locPrecSym(i, j) = (fabs(locPrec(i, j)) > 1.e-6) ? locPrec(i, j) : 0.;
933 daughters[0].first[0].addMeasurement(locRes, locPrecSym);
935 daughters[0].first[0].addGlobals(lab, dfdextPlusMinus.first * der);
943 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, extPrec);
947 combined.fit(chi2, ndf, lostWeight);
948 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
949 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
950 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
953 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
957 B2RESULT(
"Full kinematic-constrained fit (calibration version) results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
963 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, extPrec);
967 combined.fit(chi2, ndf, lostWeight);
968 getObjectPtr<TH1I>(
"ndf")->Fill(ndf);
969 getObjectPtr<TH1F>(
"chi2_per_ndf")->Fill(chi2 /
double(ndf));
970 getObjectPtr<TH1F>(
"pval")->Fill(TMath::Prob(chi2, ndf));
973 getObjectPtr<TH1F>(
"evt0")->Fill(evt0);
977 B2RESULT(
"Full kinematic-constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
990 auto mille = getObjectPtr<MilleData>(
"mille");
1000 if (!fileMetaData.
isValid()) {
1001 B2ERROR(
"Cannot register binaries in FileCatalog.");
1006 const std::vector<string> parents = {fileMetaData->getLfn()};
1007 for (
auto binary : getObjectPtr<MilleData>(
"mille")->getFiles()) {
1010 milleMetaData.
setLfn(
"");
1020 if (trajectory.isValid())
1026 getObjectPtr<TTree>(
"GblDataTree")->Fill();
1028 getObjectPtr<MilleData>(
"mille")->fill(trajectory);
1056 auto relatedRecoHitInformation =
1061 if (recoHitInformation.getFlag() == RecoHitInformation::c_pruned) {
1062 B2FATAL(
"Found pruned point in RecoTrack. Pruned tracks cannot be used in MillepedeCollector.");
1065 if (recoHitInformation.getTrackingDetector() != RecoHitInformation::c_CDC)
continue;
1071 auto kalmanFitterInfo =
dynamic_cast<genfit::KalmanFitterInfo*
>(trackPoint->getFitterInfo());
1072 if (not kalmanFitterInfo) {
1075 std::vector<double> weights = kalmanFitterInfo->getWeights();
1076 if (weights.size() == 2) {
1077 if (weights.at(0) > weights.at(1))
1078 recoHitInformation.setRightLeftInformation(RecoHitInformation::c_left);
1079 else if (weights.at(0) < weights.at(1))
1080 recoHitInformation.setRightLeftInformation(RecoHitInformation::c_right);
1082 double weightLR = weights.at(0) + weights.at(1);
1084 sumCDCWeights += weightLR - 1.;
1091 getObjectPtr<TH1F>(
"cdc_hit_fraction")->Fill(usedCDCHitFraction);
1096 B2ERROR(
"Error in checking DAF weights from previous fit to resolve hit ambiguity. Why? Failed fit points in DAF? Skip track to be sure.");
1100 std::shared_ptr<genfit::GblFitter> gbl(
new genfit::GblFitter());
1114 genfit::MeasurementFactory<genfit::AbsMeasurement> genfitMeasurementFactory;
1118 genfit::MeasurementProducer <RecoHitInformation::UsedPXDHit, AlignablePXDRecoHit>* PXDProducer =
new genfit::MeasurementProducer
1120 genfitMeasurementFactory.addProducer(Const::PXD, PXDProducer);
1124 genfit::MeasurementProducer <RecoHitInformation::UsedSVDHit, AlignableSVDRecoHit>* SVDProducer =
new genfit::MeasurementProducer
1126 genfitMeasurementFactory.addProducer(Const::SVD, SVDProducer);
1130 genfit::MeasurementProducer <RecoHitInformation::UsedCDCHit, AlignableCDCRecoHit>* CDCProducer =
new genfit::MeasurementProducer
1132 genfitMeasurementFactory.addProducer(Const::CDC, CDCProducer);
1136 genfit::MeasurementProducer <RecoHitInformation::UsedBKLMHit, AlignableBKLMRecoHit>* BKLMProducer =
new genfit::MeasurementProducer
1138 genfitMeasurementFactory.addProducer(Const::BKLM, BKLMProducer);
1142 genfit::MeasurementProducer <RecoHitInformation::UsedEKLMHit, AlignableEKLMRecoHit>* EKLMProducer =
new genfit::MeasurementProducer
1144 genfitMeasurementFactory.addProducer(Const::EKLM, EKLMProducer);
1149 std::vector<std::shared_ptr<PXDBaseMeasurementCreator>> pxdMeasurementCreators = { std::shared_ptr<PXDBaseMeasurementCreator>(
new PXDCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1150 std::vector<std::shared_ptr<SVDBaseMeasurementCreator>> svdMeasurementCreators = { std::shared_ptr<SVDBaseMeasurementCreator>(
new SVDCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1153 std::vector<std::shared_ptr<CDCBaseMeasurementCreator>> cdcMeasurementCreators = { std::shared_ptr<CDCBaseMeasurementCreator>(
new CDCCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1154 std::vector<std::shared_ptr<BKLMBaseMeasurementCreator>> bklmMeasurementCreators = { std::shared_ptr<BKLMBaseMeasurementCreator>(
new BKLMCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1155 std::vector<std::shared_ptr<EKLMBaseMeasurementCreator>> eklmMeasurementCreators = { std::shared_ptr<EKLMBaseMeasurementCreator>(
new EKLMCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1158 std::vector<std::shared_ptr<BaseMeasurementCreator>> additionalMeasurementCreators = {};
1159 factory.
resetMeasurementCreators(pxdMeasurementCreators, svdMeasurementCreators, cdcMeasurementCreators, bklmMeasurementCreators,
1160 eklmMeasurementCreators, additionalMeasurementCreators);
1167 currentPdgCode = particle->getPDGCode();
1170 gfTrack.setCardinalRep(gfTrack.getIdForRep(trackRep));
1173 B2Vector3D vertexPos = particle->getVertex();
1174 B2Vector3D vertexMom = particle->getMomentum();
1175 gfTrack.setStateSeed(vertexPos, vertexMom);
1177 genfit::StateOnPlane vertexSOP(gfTrack.getCardinalRep());
1178 B2Vector3D vertexRPhiDir(vertexPos[0], vertexPos[1], 0);
1183 genfit::SharedPlanePtr vertexPlane(
new genfit::DetPlane(vertexPos, vertexMom));
1185 vertexSOP.setPlane(vertexPlane);
1186 vertexSOP.setPosMom(vertexPos, vertexMom);
1187 TMatrixDSym vertexCov(5);
1188 vertexCov.UnitMatrix();
1192 genfit::MeasuredStateOnPlane mop(vertexSOP, vertexCov);
1193 genfit::FullMeasurement* vertex =
new genfit::FullMeasurement(mop, Const::IR);
1194 gfTrack.insertMeasurement(vertex, 0);
1198 for (
unsigned int i = 0; i < gfTrack.getNumPoints() - 1; ++i) {
1201 genfit::PlanarMeasurement* planarMeas1 =
dynamic_cast<genfit::PlanarMeasurement*
>(gfTrack.getPointWithMeasurement(
1202 i)->getRawMeasurement(0));
1203 genfit::PlanarMeasurement* planarMeas2 =
dynamic_cast<genfit::PlanarMeasurement*
>(gfTrack.getPointWithMeasurement(
1204 i + 1)->getRawMeasurement(0));
1206 if (planarMeas1 != NULL && planarMeas2 != NULL &&
1207 planarMeas1->getDetId() == planarMeas2->getDetId() &&
1208 planarMeas1->getPlaneId() != -1 &&
1209 planarMeas1->getPlaneId() == planarMeas2->getPlaneId()) {
1216 if (hit1->
isU() && !hit2->
isU()) {
1219 }
else if (!hit1->
isU() && hit2->
isU()) {
1227 gfTrack.insertMeasurement(hit, i);
1229 gfTrack.deletePoint(i + 1);
1230 gfTrack.deletePoint(i + 1);
1234 }
catch (std::exception& e) {
1236 B2ERROR(
"SVD Cluster combination failed. This is symptomatic of pruned tracks. MillepedeCollector cannot process pruned tracks.");
1241 gbl->processTrackWithRep(&gfTrack, gfTrack.getCardinalRep(),
true);
1242 }
catch (genfit::Exception& e) {
1246 B2ERROR(
"GBL fit failed.");
1255 std::vector< genfit::Track* > tracks;
1256 for (
auto particle : particles) {
1257 auto belle2Track = particle->getTrack();
1259 B2WARNING(
"No Belle2::Track for particle (particle->X");
1268 auto recoTrack = belle2Track->getRelatedTo<
RecoTrack>();
1271 B2WARNING(
"No related RecoTrack for Belle2::Track (particle->Track->X)");
1276 if (!
fitRecoTrack(*recoTrack, (addVertexPoint) ? particle :
nullptr))
1281 if (!track.hasFitStatus()) {
1282 B2WARNING(
"Track has no fit status");
1285 genfit::GblFitStatus* fs =
dynamic_cast<genfit::GblFitStatus*
>(track.getFitStatus());
1287 B2WARNING(
"Track FitStatus is not GblFitStatus.");
1290 if (!fs->isFittedWithReferenceTrack()) {
1291 B2WARNING(
"Track is not fitted with reference track.");
1295 tracks.push_back(&track);
1304 std::vector<TMatrixD> result;
1306 double px = mother.
getPx();
1307 double py = mother.
getPy();
1308 double pz = mother.
getPz();
1309 double pt =
sqrt(px * px + py * py);
1311 double M = motherMass;
1315 || m != mother.
getDaughter(1)->
getPDGMass()) B2FATAL(
"Only two same-mass daughters (V0->f+f- decays) allowed.");
1318 TMatrixD mother2lab(3, 3);
1319 mother2lab(0, 0) = px * pz / pt / p; mother2lab(0, 1) = - py / pt; mother2lab(0, 2) = px / p;
1320 mother2lab(1, 0) = py * pz / pt / p; mother2lab(1, 1) = px / pt; mother2lab(1, 2) = py / p;
1321 mother2lab(2, 0) = - pt / p; mother2lab(2, 1) = 0; mother2lab(2, 2) = pz / p;
1322 ROOT::Math::Rotation3D lab2mother;
1323 lab2mother.SetRotationMatrix(mother2lab); lab2mother.Invert();
1331 auto mom1 = lab2mother * boostedFrame.
getMomentum(fourVector1).Vect();
1332 auto mom2 = lab2mother * boostedFrame.
getMomentum(fourVector2).Vect();
1335 auto avgMom = 0.5 * (mom1 - mom2);
1336 if (avgMom.Z() < 0.) {
1342 double theta = atan2(avgMom.rho(), avgMom.Z());
1343 double phi = atan2(avgMom.Y(), avgMom.X());
1344 if (phi < 0.) phi += 2. * TMath::Pi();
1346 double alpha = M / 2. / m;
1347 double c1 = m *
sqrt(alpha * alpha - 1.);
1348 double c2 = 0.5 *
sqrt((alpha * alpha - 1.) / alpha / alpha * (p * p + M * M));
1350 double p3 = p * p * p;
1351 double pt3 = pt * pt * pt;
1357 TMatrixD
R = mother2lab;
1358 B2Vector3D P(sign * c1 * sin(theta) * cos(phi),
1359 sign * c1 * sin(theta) * sin(phi),
1360 p / 2. + sign * c2 * cos(theta));
1362 TMatrixD dRdpx(3, 3);
1363 dRdpx(0, 0) = - pz * (pow(px, 4.) - pow(py, 4.) - py * py * pz * pz) / pt3 / p3;
1364 dRdpx(0, 1) = px * py / pt3;
1365 dRdpx(0, 2) = (py * py + pz * pz) / p3;
1367 dRdpx(1, 0) = - px * py * pz * (2. * px * px + 2. * py * py + pz * pz) / pt3 / p3;
1368 dRdpx(1, 1) = - py * py / pt3;
1369 dRdpx(1, 2) = px * py / p3;
1371 dRdpx(2, 0) = - px * pz * pz / pt / p3;
1373 dRdpx(2, 2) = - px * pz / p3;
1375 TMatrixD dRdpy(3, 3);
1376 dRdpy(0, 0) = - px * py * pz * (2. * px * px + 2. * py * py + pz * pz) / pt3 / p3;
1377 dRdpy(0, 1) = - px * px / pt3;
1378 dRdpy(0, 2) = px * pz / p3;
1380 dRdpy(1, 0) = - pz * (- pow(px, 4.) - px * px * pz * pz + pow(py, 4.)) / pt3 / p3;
1381 dRdpy(1, 1) = px * py / pt3;
1382 dRdpy(1, 2) = (px * px + pz * pz) / p3;
1384 dRdpy(2, 0) = - py * pz * pz / pt / p3;
1386 dRdpy(2, 2) = - py * pz / p3;
1388 TMatrixD dRdpz(3, 3);
1389 dRdpz(0, 0) = px * pt / p3;
1391 dRdpz(0, 2) = - px * pz / p3;
1393 dRdpz(1, 0) = py * pt / p3;
1395 dRdpz(1, 2) = py * pz / p3;
1397 dRdpz(2, 0) = pz * pt / p3;
1399 dRdpz(2, 2) = (px * px + py * py) / p3;
1401 auto K = 1. / 2. / p + sign * cos(theta) * m * m * (M * M / 4. / m / m - 1.) / M / M /
sqrt(m * m * (M * M / 4. / m / m - 1.) *
1402 (M * M + p * p) / M / M);
1409 sign * c1 * cos(theta) * sin(phi),
1410 sign * c2 * (- sin(theta)));
1414 sign * c1 * sin(theta) * cos(phi),
1417 double dc1dM = m * M / (2. *
sqrt(M * M - 4. * m * m));
1418 double dc2dM = M * (4. * m * m * p * p + pow(M, 4)) / (2 * M * M * M *
sqrt((M * M - 4. * m * m) * (p * p + M * M)));
1421 sign * sin(theta) * sin(phi) * dc1dM,
1422 sign * cos(theta) * dc2dM);
1424 TMatrixD dpdz(3, 6);
1425 dpdz(0, 0) = dpdpx(0); dpdz(0, 1) = dpdpy(0); dpdz(0, 2) = dpdpz(0); dpdz(0, 3) = dpdtheta(0); dpdz(0, 4) = dpdphi(0);
1426 dpdz(0, 5) = dpdM(0);
1427 dpdz(1, 0) = dpdpx(1); dpdz(1, 1) = dpdpy(1); dpdz(1, 2) = dpdpz(1); dpdz(1, 3) = dpdtheta(1); dpdz(1, 4) = dpdphi(1);
1428 dpdz(1, 5) = dpdM(1);
1429 dpdz(2, 0) = dpdpx(2); dpdz(2, 1) = dpdpy(2); dpdz(2, 2) = dpdpz(2); dpdz(2, 3) = dpdtheta(2); dpdz(2, 4) = dpdphi(2);
1430 dpdz(2, 5) = dpdM(2);
1434 TMatrixD dfdvz(5, 9);
1435 dfdvz.SetSub(0, 0, dqdv);
1436 dfdvz.SetSub(0, 3, dqdp * dpdz);
1438 result.push_back(dfdvz);
1444 return {result[0], result[1]};
1450 const B2Vector3D& U(state.getPlane()->getU());
1451 const B2Vector3D& V(state.getPlane()->getV());
1452 const B2Vector3D& O(state.getPlane()->getO());
1453 const B2Vector3D& W(state.getPlane()->getNormal());
1455 const double* state5 = state.getState().GetMatrixArray();
1459 const TVectorD& auxInfo = state.getAuxInfo();
1460 if (auxInfo.GetNrows() == 2
1461 || auxInfo.GetNrows() == 1)
1462 spu = state.getAuxInfo()(0);
1466 state7[0] = O.
X() + state5[3] * U.
X() + state5[4] * V.
X();
1467 state7[1] = O.
Y() + state5[3] * U.
Y() + state5[4] * V.
Y();
1468 state7[2] = O.
Z() + state5[3] * U.
Z() + state5[4] * V.
Z();
1470 state7[3] = spu * (W.X() + state5[1] * U.
X() + state5[2] * V.
X());
1471 state7[4] = spu * (W.Y() + state5[1] * U.
Y() + state5[2] * V.
Y());
1472 state7[5] = spu * (W.Z() + state5[1] * U.
Z() + state5[2] * V.
Z());
1475 double norm = 1. /
sqrt(state7[3] * state7[3] + state7[4] * state7[4] + state7[5] * state7[5]);
1476 for (
unsigned int i = 3; i < 6; ++i) state7[i] *= norm;
1478 state7[6] = state5[0];
1480 const double AtU = state7[3] * U.
X() + state7[4] * U.
Y() + state7[5] * U.
Z();
1481 const double AtV = state7[3] * V.
X() + state7[4] * V.
Y() + state7[5] * V.
Z();
1482 const double AtW = state7[3] * W.X() + state7[4] * W.Y() + state7[5] * W.Z();
1486 const double qop = state7[6];
1487 const double p = state.getCharge() / qop;
1489 TMatrixD J_Mp_6x5(6, 5);
1493 J_Mp_6x5(0, 3) = U.
X();
1494 J_Mp_6x5(1, 3) = U.
Y();
1495 J_Mp_6x5(2, 3) = U.
Z();
1497 J_Mp_6x5(0, 4) = V.
X();
1498 J_Mp_6x5(1, 4) = V.
Y();
1499 J_Mp_6x5(2, 4) = V.
Z();
1502 double fact = (-1.) * qop / p;
1503 J_Mp_6x5(3, 0) = fact * state7[3];
1504 J_Mp_6x5(4, 0) = fact * state7[4];
1505 J_Mp_6x5(5, 0) = fact * state7[5];
1507 fact = 1. / (p * AtW * AtW);
1508 J_Mp_6x5(3, 1) = fact * (U.
X() * AtW - W.X() * AtU);
1509 J_Mp_6x5(4, 1) = fact * (U.
Y() * AtW - W.Y() * AtU);
1510 J_Mp_6x5(5, 1) = fact * (U.
Z() * AtW - W.Z() * AtU);
1512 J_Mp_6x5(3, 2) = fact * (V.
X() * AtW - W.X() * AtV);
1513 J_Mp_6x5(4, 2) = fact * (V.
Y() * AtW - W.Y() * AtV);
1514 J_Mp_6x5(5, 2) = fact * (V.
Z() * AtW - W.Z() * AtV);
1516 return J_Mp_6x5.T();
1523 const B2Vector3D& U(state.getPlane()->getU());
1524 const B2Vector3D& V(state.getPlane()->getV());
1525 const B2Vector3D& W(state.getPlane()->getNormal());
1527 const TVectorD& state5(state.getState());
1530 const TVectorD& auxInfo = state.getAuxInfo();
1531 if (auxInfo.GetNrows() == 2
1532 || auxInfo.GetNrows() == 1)
1533 spu = state.getAuxInfo()(0);
1536 pTilde[0] = spu * (W.X() + state5(1) * U.
X() + state5(2) * V.
X());
1537 pTilde[1] = spu * (W.Y() + state5(1) * U.
Y() + state5(2) * V.
Y());
1538 pTilde[2] = spu * (W.Z() + state5(1) * U.
Z() + state5(2) * V.
Z());
1540 const double pTildeMag =
sqrt(pTilde[0] * pTilde[0] + pTilde[1] * pTilde[1] + pTilde[2] * pTilde[2]);
1541 const double pTildeMag2 = pTildeMag * pTildeMag;
1543 const double utpTildeOverpTildeMag2 = (U.
X() * pTilde[0] + U.
Y() * pTilde[1] + U.
Z() * pTilde[2]) / pTildeMag2;
1544 const double vtpTildeOverpTildeMag2 = (V.
X() * pTilde[0] + V.
Y() * pTilde[1] + V.
Z() * pTilde[2]) / pTildeMag2;
1548 const double qop = state5(0);
1549 const double p = state.getCharge() / qop;
1551 TMatrixD J_pM_5x6(5, 6);
1555 double fact = -1. * p / (pTildeMag * qop);
1556 J_pM_5x6(0, 3) = fact * pTilde[0];
1557 J_pM_5x6(0, 4) = fact * pTilde[1];
1558 J_pM_5x6(0, 5) = fact * pTilde[2];
1560 fact = p * spu / pTildeMag;
1561 J_pM_5x6(1, 3) = fact * (U.
X() - pTilde[0] * utpTildeOverpTildeMag2);
1562 J_pM_5x6(1, 4) = fact * (U.
Y() - pTilde[1] * utpTildeOverpTildeMag2);
1563 J_pM_5x6(1, 5) = fact * (U.
Z() - pTilde[2] * utpTildeOverpTildeMag2);
1565 J_pM_5x6(2, 3) = fact * (V.
X() - pTilde[0] * vtpTildeOverpTildeMag2);
1566 J_pM_5x6(2, 4) = fact * (V.
Y() - pTilde[1] * vtpTildeOverpTildeMag2);
1567 J_pM_5x6(2, 5) = fact * (V.
Z() - pTilde[2] * vtpTildeOverpTildeMag2);
1569 J_pM_5x6(3, 0) = U.
X();
1570 J_pM_5x6(3, 1) = U.
Y();
1571 J_pM_5x6(3, 2) = U.
Z();
1573 J_pM_5x6(4, 0) = V.
X();
1574 J_pM_5x6(4, 1) = V.
Y();
1575 J_pM_5x6(4, 2) = V.
Z();
1577 return J_pM_5x6.T();
1584 return {beam->getIPPosition(), beam->getSizeCovMatrix()};
1591 mass = std::get<0>(massWidth);
1592 width = std::get<1>(massWidth);
This class is used to transfer CDC information to the track fit and Millepede.
static bool s_enableWireSaggingGlobalDerivative
Static enabling(true) or disabling(false) addition of global derivative for wire sagging coefficient ...
static bool s_enableWireByWireAlignmentGlobalDerivatives
Static enabling(true) or disabling(false) addition of global derivatives for wire-by-wire alignment.
static bool s_enableTrackT0LocalDerivative
Static enabling(true) or disabling(false) addition of local derivative for track T0.
This class is used to transfer PXD information to the track fit.
This class is used to transfer SVD information to the track fit.
This class is used to transfer SVD information to the track fit.
DataType Z() const
access variable Z (= .at(2) without boundary check)
DataType X() const
access variable X (= .at(0) without boundary check)
DataType Y() const
access variable Y (= .at(1) without boundary check)
Calibration collector module base class.
static const ChargedStable muon
muon particle
Class for accessing objects in the database.
@ c_Persistent
Object is available during entire execution time.
static EvtGenDatabasePDG * Instance()
Instance method that loads the EvtGen table.
static FileCatalog & Instance()
Static method to get a reference to the FileCatalog instance.
virtual bool registerFile(const std::string &fileName, FileMetaData &metaData, const std::string &oldLFN="")
Register a file in the (local) file catalog.
TrackSegmentController for use with GblFitter in Belle2.
Class to convert to/from global labels for Millepede II to/from detector & parameter identificators.
Algorithm class to translate the added detector hits (e.g.
void resetMeasurementCreators(const std::vector< std::shared_ptr< PXDBaseMeasurementCreator > > &pxdMeasurementCreators, const std::vector< std::shared_ptr< SVDBaseMeasurementCreator > > &svdMeasurementCreators, const std::vector< std::shared_ptr< CDCBaseMeasurementCreator > > &cdcMeasurementCreators, const std::vector< std::shared_ptr< BKLMBaseMeasurementCreator > > &bklmMeasurementCreators, const std::vector< std::shared_ptr< EKLMBaseMeasurementCreator > > &eklmMeasurementCreators, const std::vector< std::shared_ptr< BaseMeasurementCreator > > &additionalMeasurementCreators)
If you want to use non-default settings for the store arrays, you can create your own instances of th...
bool addMeasurements(RecoTrack &recoTrack) const
After you have filled the internal storage with measurement creators (either by providing your own or...
Mergeable class holding list of so far opened mille binaries and providing the binaries.
bool m_updateCDCWeights
Update L/R weights from previous DAF fit result?
std::vector< std::string > m_twoBodyDecays
Name of particle list with mothers of daughters to be used with vertex + mass constraint in calibrati...
TMatrixD getLocalToGlobalTransform(const genfit::MeasuredStateOnPlane &msop)
Compute the transformation matrix d(x,y,z,px,py,pz)/d(q/p,u',v',u,v) from state at first track point ...
std::vector< std::string > m_tracks
Names of arrays with single RecoTracks fitted by GBL.
MillepedeCollectorModule()
Constructor: Sets the description, the properties and the parameters of the module.
StoreObjPtr< EventT0 > m_eventT0
Optional input for EventT0.
std::vector< std::string > m_components
Whether to use VXD alignment hierarchy.
double m_minCDCHitWeight
Minimum CDC hit weight.
std::vector< std::string > m_primaryMassTwoBodyDecays
Name of particle list with mothers of daughters to be used with vertex + IP profile + mass constraint...
double m_minPValue
Minimum p.value for output.
std::string getUniqueMilleName()
Make a name for mille binary (encodes module name + starting exp, run and event + process id)
std::vector< std::tuple< int, int, int > > m_eventNumbers
List of event meta data entries at which payloads can change for timedep calibration.
bool m_absFilePaths
Use absolute path to locate binary files in MilleData.
std::vector< std::string > m_vertices
Name of particle list with mothers of daughters to be used with vertex constraint in calibration.
bool m_fitTrackT0
Add local parameter for track T0 fit in GBL (local derivative)
std::vector< genfit::Track * > getParticlesTracks(std::vector< Particle * > particles, bool addVertexPoint=true)
Get all usable tracks for particles.
std::vector< gbl::GblData > m_currentGblData
Current vector of GBL data from trajectory to be stored in a tree.
bool fitRecoTrack(RecoTrack &recoTrack, Particle *particle=nullptr)
Fit given RecoTrack with GBL.
bool m_enableWireSagging
Enable global derivatives for wire sagging.
TMatrixD getGlobalToLocalTransform(const genfit::MeasuredStateOnPlane &msop)
Compute the transformation matrix d(q/p,u',v',u,v)/d(x,y,z,px,py,pz) from state at first track point ...
std::tuple< B2Vector3D, TMatrixDSym > getPrimaryVertexAndCov() const
Get the primary vertex position estimation and its size from BeamSpot.
std::map< std::string, std::tuple< double, double > > m_customMassConfig
Map of list_name -> (mass, width) for custom mass and width setting.
int m_recalcJacobians
Up to which external iteration propagation Jacobians should be re-calculated.
bool m_useGblTree
Whether to use TTree to accumulate GBL data instead of binary files.
void storeTrajectory(gbl::GblTrajectory &trajectory)
Write down a GBL trajectory (to TTree or binary file)
bool m_doublePrecision
Use double (instead of single/float) precision for binary files.
virtual void collect() override
Data collection.
StoreObjPtr< EventMetaData > m_evtMetaData
Required object pointer to EventMetaData.
std::pair< TMatrixD, TMatrixD > getTwoBodyToLocalTransform(Particle &mother, double motherMass)
Compute the transformation matrices d(q/p,u'v',u,v)/d(vx,vy,vz,px,py,pz,theta,phi,...
bool m_enablePXDHierarchy
enable PXD hierarchy
virtual void closeRun() override
Only for closing mille binaries after each run.
bool m_calibrateKinematics
Add derivatives for beam spot kinematics calibration for primary vertices.
double m_minUsedCDCHitFraction
Minimum CDC used hit fraction.
void updateMassWidthIfSet(std::string listName, double &mass, double &width)
Update mass and width of the particle (mother in list) with user custom-defined values.
virtual void prepare() override
Prepration.
bool m_enableSVDHierarchy
enable SVD hierarchy
std::string m_internalIterations
String defining internal GBL iterations for outlier down-weighting.
std::vector< std::tuple< std::vector< int >, std::vector< std::tuple< int, int, int > > > > m_timedepConfig
Config for time dependence: list( tuple( list( param1, param2, ... ), list( (ev, run,...
std::vector< std::string > m_particles
Names of particle list with single particles.
virtual void finish() override
Register mille binaries in file catalog.
std::vector< std::string > m_primaryVertices
Name of particle list with mothers of daughters to be used with vertex + IP profile (+ optional calib...
int m_externalIterations
Number of external iterations of GBL fitter.
int m_hierarchyType
Type of alignment hierarchy (for VXD only for now): 0 = None, 1 = Flat (only constraints,...
bool m_enableWireByWireAlignment
Enable global derivatives for wire-by-wire alignment.
double m_stableParticleWidth
Width (in GeV/c/c) to use for invariant mass constraint for 'stable' particles (like K short).
std::vector< std::string > m_primaryTwoBodyDecays
Name of particle list with mothers of daughters to be used with vertex + IP profile (+ optional calib...
std::vector< std::string > m_primaryMassVertexTwoBodyDecays
Name of particle list with mothers of daughters to be used with vertex + IP profile + mass constraint...
bool m_calibrateVertex
Add derivatives for beam spot vertex calibration for primary vertices.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
const std::string & getName() const
Returns the name of the module.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Class to store reconstructed particles.
double getPx() const
Returns x component of momentum.
double getPz() const
Returns z component of momentum.
double getPy() const
Returns y component of momentum.
unsigned getNDaughters(void) const
Returns number of daughter particles.
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
double getPDGMass(void) const
Returns uncertainty on the invariant mass (requires valid momentum error matrix)
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
double getMomentumMagnitude() const
Returns momentum magnitude.
const Particle * getDaughter(unsigned i) const
Returns a pointer to the i-th daughter particle.
static int EvtProcID()
Return ID of the current process.
static bool parallelProcessingUsed()
Returns true if multiple processes have been spawned, false in single-core mode.
static genfit::Track & getGenfitTrack(RecoTrack &recoTrack)
Give access to the RecoTrack's genfit::Track.
static genfit::AbsTrackRep * createOrReturnRKTrackRep(RecoTrack &recoTrack, int PDGcode)
Checks if a TrackRap for the PDG id of the RecoTrack (and its charge conjugate) does already exit and...
This is the Reconstruction Event-Data Model Track.
genfit::AbsTrackRep * getCardinalRepresentation() const
Get a pointer to the cardinal track representation. You are not allowed to modify or delete it!
unsigned int getNumberOfCDCHits() const
Return the number of cdc hits.
const std::string & getStoreArrayNameOfRecoHitInformation() const
Name of the store array of the reco hit information.
const genfit::TrackPoint * getCreatedTrackPoint(const RecoHitInformation *recoHitInformation) const
Get a pointer to the TrackPoint that was created from this hit.
const genfit::FitStatus * getTrackFitStatus(const genfit::AbsTrackRep *representation=nullptr) const
Return the track fit status for the given representation or for the cardinal one. You are not allowed...
RelationVector< TO > getRelationsTo(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from this object to another store array.
Rest frame of a particle.
virtual ROOT::Math::PxPyPzEVector getMomentum(const ROOT::Math::PxPyPzEVector &vector) const override
Get Lorentz vector in rest frame System.
bool isU() const
Is the coordinate u or v?
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
Accessor to arrays stored in the data store.
bool isValid() const
Check whether the array was registered.
TClonesArray * getPtr() const
Raw access to the underlying TClonesArray.
Type-safe access to single objects in the data store.
bool isValid() const
Check whether the object was created.
static int createCorrectPDGCodeForChargedStable(const Const::ChargedStable &particleType, const RecoTrack &recoTrack)
Helper function to multiply the PDG code of a charged stable with the charge of the reco track (if ne...
static const double GeV
Standard of [energy, momentum, mass].
void writeConstraints(std::string txtFilename)
Write-out complete hierarchy to a text file.
void initialize(const std::vector< std::string > &components={}, const std::vector< EventMetaData > &timeSlices={})
Initialize the manager with given configuration (from MillepedeCollector)
void preCollect(const EventMetaData &emd)
Notice manager of a coming event (from MillepedeCollector)
static GlobalCalibrationManager & getInstance()
Get instance of the Manager auto& gcm = GlobalCalibrationManager::getInstance();.
Class for easier manipulation with global derivatives (and their labels)
static bool s_enablePXD
Enable PXD in hierarchy?
static bool s_enableSVD
Enable SVD in hierarchy?
static E_VXDHierarchyType s_hierarchyType
What type of hierarchy to use for VXD?
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
B2Vector3< double > B2Vector3D
typedef for common usage with double
double sqrt(double a)
sqrt for double
CoordinateMeasurementCreator< RecoHitInformation::UsedSVDHit, Const::SVD > SVDCoordinateMeasurementCreator
Hit to reco hit measurement creator for the SVD.
CoordinateMeasurementCreator< RecoHitInformation::UsedPXDHit, Const::PXD > PXDCoordinateMeasurementCreator
Hit to reco hit measurement creator for the PXD.
CoordinateMeasurementCreator< RecoHitInformation::UsedBKLMHit, Const::BKLM > BKLMCoordinateMeasurementCreator
Hit to reco hit measurement creator for the BKLM.
CoordinateMeasurementCreator< RecoHitInformation::UsedCDCHit, Const::CDC > CDCCoordinateMeasurementCreator
Needed for templating.
CoordinateMeasurementCreator< RecoHitInformation::UsedEKLMHit, Const::EKLM > EKLMCoordinateMeasurementCreator
Hit to reco hit measurement creator for the EKLM.
Abstract base class for different kinds of events.