9#include <b2bii/modules/B2BIIMdstInput/B2BIIConvertMdstModule.h>
11#include <framework/datastore/StoreObjPtr.h>
12#include <framework/datastore/RelationArray.h>
13#include <framework/database/Database.h>
14#include <framework/pcore/ProcHandler.h>
16#include <mdst/dataobjects/HitPatternVXD.h>
17#include <mdst/dataobjects/HitPatternCDC.h>
18#include <mdst/dataobjects/ECLCluster.h>
21#include <framework/gearbox/Unit.h>
22#include <framework/gearbox/Const.h>
23#include <framework/geometry/B2Vector3.h>
24#include <framework/geometry/VectorUtil.h>
25#include <analysis/dataobjects/ParticleExtraInfoMap.h>
28#include <framework/dataobjects/EventMetaData.h>
29#include <framework/dataobjects/Helix.h>
30#include <framework/dataobjects/UncertainHelix.h>
33#include <b2bii/utility/BelleMdstToGenHepevt.h>
36#include <Math/RotationY.h>
37#include <Math/Vector3D.h>
38#include <Math/Vector4D.h>
39#include <Math/Point3D.h>
40#include <Math/VectorUtil.h>
48#include "belle_legacy/eid/eid.h"
52#include "belle_legacy/kid/kid_acc.h"
53#include "belle_legacy/kid/kid_cdc.h"
57#include "belle_legacy/findKs/findKs.h"
60#ifdef HAVE_NISKSFINDER
61#include "belle_legacy/nisKsFinder/nisKsFinder.h"
65#include "belle_legacy/findLambda/findLambda.h"
68#include "belle_legacy/benergy/BeamEnergy.h"
69#include "belle_legacy/ip/IpProfile.h"
70#include "belle_legacy/tables/evtcls.h"
71#include "belle_legacy/tables/trg.h"
81bool approximatelyEqual(
float a,
float b,
float epsilon)
83 return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
86double adjustAngleRange(
double phi)
88 phi = phi - int(phi / TMath::TwoPi()) * TMath::TwoPi();
89 return phi - int(phi / TMath::Pi()) * TMath::TwoPi();
92void fill7x7ErrorMatrix(
const TrackFitResult* tfr, TMatrixDSym& error7x7,
const double mass,
const double bField)
96 double d0 = tfr->
getD0();
102 double alpha = tfr->
getHelix().getAlpha(bField);
104 double cosPhi0 = TMath::Cos(phi0);
105 double sinPhi0 = TMath::Sin(phi0);
109 rho = 1.0 / alpha / omega;
113 double energy = TMath::Sqrt(mass * mass + (1.0 + tanl * tanl) * rho * rho);
125 const int iOmega = 2;
129 TMatrixD jacobian(7, 5);
132 jacobian(iPx, iPhi0) = - fabs(rho) * sinPhi0;
133 jacobian(iPx, iOmega) = -
charge * rho * rho * cosPhi0 * alpha;
134 jacobian(iPy, iPhi0) = fabs(rho) * cosPhi0;
135 jacobian(iPy, iOmega) = -
charge * rho * rho * sinPhi0 * alpha;
136 jacobian(iPz, iOmega) = -
charge * rho * rho * tanl * alpha;
137 jacobian(iPz, iTanl) = fabs(rho);
138 if (omega != 0 && energy != 0) {
139 jacobian(iE, iOmega) = - (1.0 + tanl * tanl) * rho * rho / omega / energy;
140 jacobian(iE, iTanl) = tanl * rho * rho / energy;
142 jacobian(iE, iOmega) = (DBL_MAX);
143 jacobian(iE, iTanl) = (DBL_MAX);
145 jacobian(iX, iD0) = sinPhi0;
146 jacobian(iX, iPhi0) = d0 * cosPhi0;
147 jacobian(iY, iD0) = - cosPhi0;
148 jacobian(iY, iPhi0) = d0 * sinPhi0;
149 jacobian(iZ, iZ0) = 1.0;
153 error7x7 = error5x5.Similarity(jacobian);
168 setDescription(
"Converts Belle mDST objects (Panther tables and records) to Belle II mDST objects.");
171 "Convert beam parameters or use information stored in "
172 "Belle II database.",
true);
174 "Use 6x6 (position, momentum) covariance matrix for charged tracks instead of 5x5 (helix parameters) covariance matrix",
false);
176 "MC matching mode: 'Direct', or 'GeneratorLevel'",
177 std::string(
"Direct"));
180 "clusters with a E9/E25 value above this threshold are classified as neutral even if tracks are matched to their connected region (matchType == 2)",
184 addParam(
"nisKsInfo",
m_nisEnable,
"Flag to switch on conversion of nisKsFinder info",
true);
186 addParam(
"TrkExtra",
m_convertTrkExtra,
" Flag to switch on conversion of first_x,y,z and last_x,y,z from Mdst_trk_fit",
true);
187 addParam(
"convertNbar",
m_convertNbar,
" Flag to switch on conversion of nbar:mdst (copy from gamma:mdst)",
false);
191 B2DEBUG(1,
"B2BIIConvertMdst: Constructor done.");
209 B2INFO(
"B2BIIConvertMdst: initialized.");
211 B2WARNING(
"nisKsFinder output has been disabled. ksnbVLike, ksnbNoLam, ksnbStandard will not be converted.");
216 B2DEBUG(99,
"[B2BIIConvertMdstModule::initializeDataStore] initialization of DataStore started");
223 m_v0s.registerInDataStore();
266 B2DEBUG(99,
"[B2BIIConvertMdstModule::initializeDataStore] initialization of DataStore ended");
272 B2DEBUG(99,
"B2BIIConvertMdst: beginRun called.");
279 Belle::BeamEnergy::begin_run();
281 Belle::BeamEnergy::dump();
284 Belle::IpProfile::begin_run();
286 Belle::IpProfile::dump();
287 bool usableIP = Belle::IpProfile::usable();
288 B2DEBUG(99,
"B2BIIConvertMdst: IpProfile is usable = " << usableIP);
293 Belle::eid::init_data();
294 Belle::eid::show_use(
"ALL");
303 Belle::Belle_event_Manager& evman = Belle::Belle_event_Manager::get_manager();
304 if (evman.count() == 0) {
308 B2FATAL(
"No event found in the event manager, the input mdst file might be corrupted. "
309 "If you are running on evtgen's output, please set the evtgenProcessing flag to true.");
311 Belle::Belle_event& evt = evman[0];
313 if (evt.ExpMC() == 2)
327 B2INFO(
"No database entry for this run yet, create one");
336 B2ERROR(
"BeamParameters from condition database are different from converted "
337 "ones, overriding database. Did you make sure the globaltag B2BII is used?");
339 B2INFO(
"BeamSpot, BoostVector, and InvariantMass from condition database are different from converted "
340 "ones, overriding database");
343 B2FATAL(
"Cannot reliably override the Database content in parallel processing "
344 "mode, please run the conversion in single processing mode");
357 B2DEBUG(99,
"B2BIIConvertMdst: evtgenProcessing is true, skipping conversion of all reconstruction information");
405 const double Eher = Belle::BeamEnergy::E_HER();
406 const double Eler = Belle::BeamEnergy::E_LER();
407 const double crossingAngle = Belle::BeamEnergy::Cross_angle();
408 const double angleLer = M_PI;
409 const double angleHer = crossingAngle;
411 TMatrixDSym covariance(3);
412 HepLorentzVector p_beam = Belle::BeamEnergy::p_beam();
415 ROOT::Math::PxPyPzEVector P_her(0.0, 0.0, TMath::Sqrt(Eher * Eher - mass_e * mass_e), Eher);
416 ROOT::Math::RotationY rotateAroundYAxis(angleHer);
417 P_her = rotateAroundYAxis(P_her);
418 ROOT::Math::PxPyPzEVector P_ler(0.0, 0.0, TMath::Sqrt(Eler * Eler - mass_e * mass_e), Eler);
419 rotateAroundYAxis.SetAngle(angleLer);
420 P_ler = rotateAroundYAxis(P_ler);
423 ROOT::Math::PxPyPzEVector P_beam = P_her + P_ler;
425 ROOT::Math::PxPyPzEVector momentumHER = P_her;
426 ROOT::Math::VectorUtil::boost(momentumHER, -P_beam.BoostToCM());
427 double angleXZ = std::atan(momentumHER.X() / momentumHER.Z());
428 double angleYZ = std::atan(momentumHER.Y() / momentumHER.Z());
435 B2DEBUG(99,
"Beam Energy: E_HER = " << Eher <<
"; E_LER = " << Eler <<
"; angle = " << crossingAngle);
436 B2DEBUG(99,
"Beam Momentum (pre-convert) : P_X = " << p_beam.px() <<
"; P_Y = " << p_beam.py() <<
"; P_Z = " << p_beam.pz());
437 B2DEBUG(99,
"Beam Momentum (post-convert) : P_X = " << P_beam.Px() <<
"; P_Y = " << P_beam.Py() <<
"; P_Z = " << P_beam.Pz());
443 if (!Belle::IpProfile::usable()) {
448 ROOT::Math::XYZVector(std::numeric_limits<double>::quiet_NaN(),
449 std::numeric_limits<double>::quiet_NaN(),
450 std::numeric_limits<double>::quiet_NaN()
451 ), TMatrixTSym<double>()
457 CLHEP::HepSymMatrix ipErr;
460 ip = Belle::IpProfile::position();
461 ipErr = Belle::IpProfile::position_err();
464 Belle::IpProfile::set_evtbin_number();
468 ip = Belle::IpProfile::e_position();
469 ipErr = Belle::IpProfile::e_position_err();
474 TMatrixDSym cov(ipErr.num_col());
475 for (
int i = 0; i < ipErr.num_row(); ++i) {
476 for (
int j = 0; j < ipErr.num_col(); ++j) {
477 cov(i, j) = ipErr(i + 1, j + 1);
480 m_beamSpot.setIP(ROOT::Math::XYZVector(ip.x(), ip.y(), ip.z()), cov);
489 Belle::Mdst_charged_Manager& m = Belle::Mdst_charged_Manager::get_manager();
490 for (Belle::Mdst_charged_Manager::iterator chargedIterator = m.begin(); chargedIterator != m.end(); ++chargedIterator) {
491 Belle::Mdst_charged belleTrack = *chargedIterator;
493 Belle::Mdst_trk& trk = belleTrack.trk();
494 bool foundValidTrackFitResult =
false;
495 for (
int mhyp = 0 ; mhyp <
c_nHyp; ++mhyp) {
496 Belle::Mdst_trk_fit& trk_fit = trk.mhyp(mhyp);
498 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
499 if (std::isnan(pValue))
continue;
500 foundValidTrackFitResult =
true;
502 if (not foundValidTrackFitResult)
continue;
516 const Belle::Gen_hepevt& hep0 = get_hepevt(belleTrack);
519 const Belle::Gen_hepevt* hep =
nullptr;
525 hep = &gen_level(hep0);
533 tracksToMCParticles.
add(track->getArrayIndex(), matchedMCParticle);
537 B2DEBUG(99,
"Can not find MCParticle corresponding to this gen_hepevt (Panther ID = " << hep->get_ID() <<
")");
538 B2DEBUG(99,
"Gen_hepevt: Panther ID = " << hep->get_ID() <<
"; idhep = " << hep->idhep() <<
"; isthep = " << hep->isthep());
548 ksPList->initialize(310, ksPList.
getName());
553 lambda0PList->initialize(3122, lambda0PList.
getName());
556 antiLambda0PList.
create();
557 antiLambda0PList->initialize(-3122, antiLambda0PList.
getName());
559 antiLambda0PList->bindAntiParticleList(*lambda0PList);
564 convGammaPList->initialize(22, convGammaPList.
getName());
567 Belle::Mdst_vee2_Manager& m = Belle::Mdst_vee2_Manager::get_manager();
568 for (Belle::Mdst_vee2_Manager::iterator vee2Iterator = m.begin(); vee2Iterator != m.end(); ++vee2Iterator) {
569 Belle::Mdst_vee2 belleV0 = *vee2Iterator;
572 Belle::Mdst_charged belleTrackP = belleV0.chgd(0);
574 Belle::Mdst_charged belleTrackM = belleV0.chgd(1);
582 switch (belleV0.kind()) {
608 B2WARNING(
"Conversion of vee2 candidate of unknown kind! kind = " << belleV0.kind());
612 int trackID[2] = {0, 0};
614 Belle::Mdst_charged_Manager& charged_mag = Belle::Mdst_charged_Manager::get_manager();
615 for (std::vector<Belle::Mdst_charged>::iterator chgIterator = charged_mag.begin(); chgIterator != charged_mag.end();
617 if (belleV0.chgd(0).get_ID() >= 1 && trackID[0] == 0 && belleV0.chgd(0).get_ID() == chgIterator->get_ID()) {
618 trackID[0] = (int)(chgIterator->get_ID());
621 if (belleV0.chgd(1).get_ID() >= 1 && trackID[1] == 0 && belleV0.chgd(1).get_ID() == chgIterator->get_ID()) {
622 trackID[1] = (int)(chgIterator->get_ID());
628 if (std::max(trackID[0], trackID[1]) >
m_tracks.getEntries())
continue;
630 HepPoint3D dauPivot(belleV0.vx(), belleV0.vy(), belleV0.vz());
631 int trackFitPIndex = -1;
632 int trackFitMIndex = -1;
634 CLHEP::HepLorentzVector momentumP;
635 CLHEP::HepSymMatrix error7x7P(7, 0);
636 HepPoint3D positionP;
637 TMatrixFSym errMatrixP(7);
638 CLHEP::HepLorentzVector momentumM;
639 CLHEP::HepSymMatrix error7x7M(7, 0);
640 HepPoint3D positionM;
641 TMatrixFSym errMatrixM(7);
642 CLHEP::HepSymMatrix error5x5(5, 0);
643 if (trackID[0] >= 1) {
644 if (belleV0.daut()) {
645 std::vector<float> helixParam(5);
646 std::vector<float> helixError(15);
649 auto trackFitP =
m_trackFitResults.appendNew(helixParam, helixError, pTypeP, 0.5, -1, -1, 0);
650 trackFitPIndex = trackFitP->getArrayIndex();
657 for (
unsigned i = 0; i < 7; i++)
658 for (
unsigned j = 0; j < 7; j++)
659 errMatrixP(i, j) = error7x7P[i][j];
661 daughterP =
Particle(trackID[0] - 1, tmpTFR, pTypeP);
662 daughterP.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumP.px(), momentumP.py(), momentumP.pz(), momentumP.e()),
663 ROOT::Math::XYZVector(positionP.x(), positionP.y(), positionP.z()),
667 Belle::Mdst_trk_fit& trk_fit = charged_mag[trackID[0] - 1].trk().mhyp(belleHypP);
668 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
669 if (std::isnan(pValue))
continue;
671 std::vector<float> helixParam(5);
672 std::vector<float> helixError(15);
673 convertHelix(trk_fit, HepPoint3D(0., 0., 0.), helixParam, helixError);
676 if (helixParam[2] == 0) {
677 B2WARNING(
"Helix parameter for curvature == 0. Skipping Track! The parameter is: " << helixParam[2] <<
"...");
681 auto trackFitP =
m_trackFitResults.appendNew(helixParam, helixError, pTypeP, pValue, -1, -1, 0);
683 trackFitPIndex = trackFitP->getArrayIndex();
685 daughterP =
Particle(trackID[0] - 1, trackFitP, pTypeP);
688 helixParam, error5x5,
689 momentumP, positionP, error7x7P);
691 for (
unsigned i = 0; i < 7; i++)
692 for (
unsigned j = 0; j < 7; j++)
693 errMatrixP(i, j) = error7x7P[i][j];
695 daughterP.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumP.px(), momentumP.py(), momentumP.pz(), momentumP.e()),
696 ROOT::Math::XYZVector(positionP.x(), positionP.y(), positionP.z()),
700 if (trackID[1] >= 1) {
701 if (belleV0.daut()) {
702 std::vector<float> helixParam(5);
703 std::vector<float> helixError(15);
706 auto trackFitM =
m_trackFitResults.appendNew(helixParam, helixError, pTypeM, 0.5, -1, -1, 0);
707 trackFitMIndex = trackFitM->getArrayIndex();
713 for (
unsigned i = 0; i < 7; i++)
714 for (
unsigned j = 0; j < 7; j++)
715 errMatrixM(i, j) = error7x7M[i][j];
717 daughterM =
Particle(trackID[1] - 1, tmpTFR, pTypeM);
718 daughterM.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumM.px(), momentumM.py(), momentumM.pz(), momentumM.e()),
719 ROOT::Math::XYZVector(positionM.x(), positionM.y(), positionM.z()),
723 Belle::Mdst_trk_fit& trk_fit = charged_mag[trackID[1] - 1].trk().mhyp(belleHypM);
724 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
725 if (std::isnan(pValue))
continue;
727 std::vector<float> helixParam(5);
728 std::vector<float> helixError(15);
729 convertHelix(trk_fit, HepPoint3D(0., 0., 0.), helixParam, helixError);
732 if (helixParam[2] == 0) {
733 B2WARNING(
"Helix parameter for curvature == 0. Skipping Track! The parameter is: " << helixParam[2] <<
"...");
737 auto trackFitM =
m_trackFitResults.appendNew(helixParam, helixError, pTypeM, pValue, -1, -1, 0);
739 trackFitMIndex = trackFitM->getArrayIndex();
741 daughterM =
Particle(trackID[1] - 1, trackFitM, pTypeM);
744 helixParam, error5x5,
745 momentumM, positionM, error7x7M);
747 for (
unsigned i = 0; i < 7; i++)
748 for (
unsigned j = 0; j < 7; j++)
749 errMatrixM(i, j) = error7x7M[i][j];
751 daughterM.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumM.px(), momentumM.py(), momentumM.pz(), momentumM.e()),
752 ROOT::Math::XYZVector(positionM.x(), positionM.y(), positionM.z()),
763 m_v0s.appendNew(std::make_pair(trackP, trackFitP), std::make_pair(trackM, trackFitM), belleV0.vx(), belleV0.vy(), belleV0.vz());
773 newDaugP->addRelationTo(pidP);
775 newDaugP->addRelationTo(mcParticleP);
782 ROOT::Math::PxPyPzEVector v0Momentum(belleV0.px(), belleV0.py(), belleV0.pz(), belleV0.energy());
783 ROOT::Math::XYZVector v0Vertex(belleV0.vx(), belleV0.vy(), belleV0.vz());
789 auto appendVertexFitInfo = [](Belle::Mdst_vee2 & _belle_V0,
Particle & _belle2_V0) {
791 _belle2_V0.addExtraInfo(
"chiSquared", _belle_V0.chisq());
793 _belle2_V0.addExtraInfo(
"ndf", 1);
795 double prob = TMath::Prob(_belle_V0.chisq(), 1);
796 _belle2_V0.setPValue(prob);
800 if (belleV0.kind() == 1) {
805 appendVertexFitInfo(belleV0, KS);
807 ksPList->addParticle(newV0);
810 Belle::FindKs belleKSFinder;
811 belleKSFinder.candidates(belleV0, Belle::IpProfile::position(1));
848 }
else if (belleV0.kind() == 2) {
853 appendVertexFitInfo(belleV0, Lambda0);
855 lambda0PList->addParticle(newV0);
858 Belle::FindLambda lambdaFinder;
859 lambdaFinder.candidates(belleV0, Belle::IpProfile::position(1));
860 newV0->
addExtraInfo(
"goodLambda", lambdaFinder.goodLambda());
861 }
else if (belleV0.kind() == 3) {
862 Particle antiLambda0(v0Momentum, -3122);
866 appendVertexFitInfo(belleV0, antiLambda0);
868 antiLambda0PList->addParticle(newV0);
871 Belle::FindLambda lambdaFinder;
872 lambdaFinder.candidates(belleV0, Belle::IpProfile::position(1));
873 newV0->
addExtraInfo(
"goodLambda", lambdaFinder.goodLambda());
874 }
else if (belleV0.kind() == 4) {
879 appendVertexFitInfo(belleV0, gamma);
881 convGammaPList->addParticle(newV0);
885 if (belleV0.kind() > 0 and belleV0.kind() <= 3) {
886 Belle::nisKsFinder ksnb;
887 double protIDP =
atcPID(pidP, 2, 4);
888 double protIDM =
atcPID(pidM, 2, 4);
889 ksnb.candidates(belleV0, Belle::IpProfile::position(1), momentumP, protIDP, protIDM);
894 if (belleV0.kind() == 1)
910 Belle::Gen_hepevt_Manager& genMgr = Belle::Gen_hepevt_Manager::get_manager();
911 if (genMgr.count() == 0)
914 typedef std::pair<MCParticleGraph::GraphParticle*, Belle::Gen_hepevt> halfFamily;
915 halfFamily currFamily;
917 std::queue < halfFamily > heritancesQueue;
923 for (Belle::Gen_hepevt_Manager::iterator genIterator = genMgr.begin();
924 genIterator != genMgr.end(); ++genIterator) {
925 Belle::Gen_hepevt hep = *genIterator;
927 if (!(hep.moFirst() == 0 && hep.moLast() == 0))
935 for (
int iDaughter = hep.daFirst(); iDaughter <= hep.daLast();
937 if (iDaughter == 0) {
938 B2DEBUG(95,
"Trying to access generated daughter with Panther ID == 0");
941 currFamily.first = graphParticle;
942 currFamily.second = genMgr(Belle::Panther_ID(iDaughter));
943 heritancesQueue.push(currFamily);
948 while (!heritancesQueue.empty()) {
949 currFamily = heritancesQueue.front();
950 heritancesQueue.pop();
953 Belle::Gen_hepevt& currDaughter = currFamily.second;
956 if (currDaughter.idhep() == 0)
970 int nGrandChildren = currDaughter.daLast() - currDaughter.daFirst() + 1;
972 if (nGrandChildren > 0 && currDaughter.daFirst() != 0) {
973 for (
int igrandchild = currDaughter.daFirst(); igrandchild <= currDaughter.daLast(); ++igrandchild) {
974 if (igrandchild == 0) {
975 B2DEBUG(95,
"Trying to access generated daughter with Panther ID == 0");
979 family.first = graphDaughter;
980 family.second = genMgr(Belle::Panther_ID(igrandchild));
981 heritancesQueue.push(family);
999 Belle::Mdst_ecl_Manager& ecl_manager = Belle::Mdst_ecl_Manager::get_manager();
1000 Belle::Mdst_ecl_aux_Manager& ecl_aux_manager = Belle::Mdst_ecl_aux_Manager::get_manager();
1002 for (Belle::Mdst_ecl_Manager::iterator eclIterator = ecl_manager.begin(); eclIterator != ecl_manager.end(); ++eclIterator) {
1005 Belle::Mdst_ecl mdstEcl = *eclIterator;
1006 Belle::Mdst_ecl_aux mdstEclAux(ecl_aux_manager(mdstEcl.get_ID()));
1017 B2EclCluster->setConnectedRegionId(B2EclCluster->getArrayIndex() + 1);
1018 B2EclCluster->setClusterId(1);
1025 const Belle::Gen_hepevt& hep0 = get_hepevt(mdstEcl);
1028 const Belle::Gen_hepevt* hep =
nullptr;
1034 hep = &gen_level(hep0);
1041 eclClustersToMCParticles.
add(B2EclCluster->getArrayIndex(), matchedMCParticleID);
1044 B2DEBUG(79,
"Cannot find MCParticle corresponding to this gen_hepevt (Panther ID = " << hep->get_ID() <<
")");
1045 B2DEBUG(79,
"Gen_hepevt: Panther ID = " << hep->get_ID() <<
"; idhep = " << hep->idhep() <<
"; isthep = " << hep->isthep());
1058 Belle::Mdst_klm_cluster_Manager& klm_cluster_manager = Belle::Mdst_klm_cluster_Manager::get_manager();
1060 for (Belle::Mdst_klm_cluster_Manager::iterator klmC_Ite = klm_cluster_manager.begin(); klmC_Ite != klm_cluster_manager.end();
1064 Belle::Mdst_klm_cluster mdstKlm_cluster = *klmC_Ite;
1088 plist->initialize(22,
"gamma:mdst");
1091 Belle::Mdst_gamma_Manager& gamma_manager = Belle::Mdst_gamma_Manager::get_manager();
1093 for (Belle::Mdst_gamma_Manager::iterator gammaIterator = gamma_manager.begin(); gammaIterator != gamma_manager.end();
1097 Belle::Mdst_gamma mdstGamma = *gammaIterator;
1098 Belle::Mdst_ecl mdstEcl = mdstGamma.ecl();
1112 plist->addParticle(B2Gamma);
1119 if (matchedMCParticle)
1130 B2DEBUG(99,
"Getting gamma:mdst in copyNbarFromGamma");
1132 for (
const Particle& gamma : *plist_gamma) {
1133 auto* eclCluster = gamma.getECLCluster();
1136 B2DEBUG(99,
"Copying anti-n0:mdst from gamma:mdst");
1138 plist->addParticle(nbar);
1145 if (matchedMCParticle)
1155 plist->initialize(111,
"pi0:mdst");
1158 Belle::Mdst_pi0_Manager& pi0_manager = Belle::Mdst_pi0_Manager::get_manager();
1159 for (Belle::Mdst_pi0_Manager::iterator pi0Iterator = pi0_manager.begin(); pi0Iterator != pi0_manager.end(); ++pi0Iterator) {
1162 Belle::Mdst_pi0 mdstPi0 = *pi0Iterator;
1163 Belle::Mdst_gamma mdstGamma1 = mdstPi0.gamma(0);
1164 Belle::Mdst_gamma mdstGamma2 = mdstPi0.gamma(1);
1165 if (!mdstGamma1 || !mdstGamma2)
1168 ROOT::Math::PxPyPzEVector p4(mdstPi0.px(), mdstPi0.py(), mdstPi0.pz(), mdstPi0.energy());
1176 if (!B2Gamma1 || !B2Gamma2)
1190 double prob = TMath::Prob(mdstPi0.chisq(), 1);
1194 plist->addParticle(B2Pi0);
1207 plist->initialize(
Const::Klong.getPDGCode(),
"K_L0:mdst");
1209 Belle::Mdst_klong_Manager& klong_manager = Belle::Mdst_klong_Manager::get_manager();
1210 for (Belle::Mdst_klong_Manager::iterator klong_Ite = klong_manager.begin(); klong_Ite != klong_manager.end(); ++klong_Ite) {
1213 Belle::Mdst_klong mdstKlong = *klong_Ite;
1214 Belle::Mdst_klm_cluster mdstKlm = mdstKlong.klmc();
1226 B2KlmCluster->
setClusterPosition(mdstKlong.cos_x(), mdstKlong.cos_y(), mdstKlong.cos_z());
1233 plist->addParticle(B2Klong);
1244 Belle::Gen_hepevt_Manager& GenMgr = Belle::Gen_hepevt_Manager::get_manager();
1245 const double dang(15. / 180.*M_PI);
1247 for (Belle::Gen_hepevt_Manager::iterator klong_hep_it = GenMgr.begin(); klong_hep_it != GenMgr.end(); ++klong_hep_it) {
1249 if (abs((*klong_hep_it).idhep()) ==
Const::Klong.getPDGCode() && klong_hep_it->isthep() > 0) {
1251 CLHEP::HepLorentzVector gp4(klong_hep_it->PX(), klong_hep_it->PY(), klong_hep_it->PZ(), klong_hep_it->E());
1253 int bestRecKlongID(0);
1255 for (Belle::Mdst_klong_Manager::iterator klong_rec_it = klong_manager.begin(); klong_rec_it != klong_manager.end();
1259 if ((*klong_rec_it).ecl())
1261 CLHEP::Hep3Vector klp3(klong_rec_it->cos_x(), klong_rec_it->cos_y(), klong_rec_it->cos_z());
1263 if (cos(gp4.theta() - klp3.theta()) > cos(dang) && cos(gp4.phi() - klp3.phi()) > cos(dang)) {
1265 double tmp_sum = cos(gp4.theta() - klp3.theta()) + cos(gp4.phi() - klp3.phi());
1266 if (tmp_sum > sum) {
1275 particlesToMCParticles.
add(bestRecKlongID, matchedMCParticleID);
1290 Belle::Evtcls_flag_Manager& EvtFlagMgr = Belle::Evtcls_flag_Manager::get_manager();
1291 Belle::Evtcls_flag2_Manager& EvtFlag2Mgr = Belle::Evtcls_flag2_Manager::get_manager();
1294 Belle::Evtcls_hadronic_flag_Manager& EvtHadFlagMgr = Belle::Evtcls_hadronic_flag_Manager::get_manager();
1296 std::string name =
"evtcls_flag";
1297 std::string name_had =
"evtcls_hadronic_flag";
1299 std::vector<Belle::Evtcls_flag>::iterator eflagIterator = EvtFlagMgr.begin();
1300 std::vector<Belle::Evtcls_flag2>::iterator eflag2Iterator = EvtFlag2Mgr.begin();
1301 std::vector<Belle::Evtcls_hadronic_flag>::iterator ehadflagIterator = EvtHadFlagMgr.begin();
1304 std::vector<int> flag(20);
1305 for (
int index = 0; index < 20; ++index) {
1307 if (index == 14 || index == 16)
continue;
1308 std::string iVar = name + std::to_string(index);
1311 m_evtInfo->addExtraInfo(iVar, (*eflagIterator).flag(index));
1314 m_evtInfo->addExtraInfo(iVar, (*eflag2Iterator).flag(index - 10));
1316 B2DEBUG(99,
"evtcls_flag(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1320 for (
int index = 0; index < 6; ++index) {
1321 std::string iVar = name_had + std::to_string(index);
1322 m_evtInfo->addExtraInfo(iVar, (*ehadflagIterator).hadronic_flag(index));
1323 B2DEBUG(99,
"evtcls_hadronic_flag(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1338 if (
event->getExperiment() <= 27) {
1340 Belle::Rectrg_summary_Manager& RecTrgSummaryMgr = Belle::Rectrg_summary_Manager::get_manager();
1341 std::vector<Belle::Rectrg_summary>::iterator eflagIterator = RecTrgSummaryMgr.begin();
1342 std::string name_summary =
"rectrg_summary_m_final";
1345 for (
int index = 0; index < 2; ++index) {
1346 std::string iVar = name_summary + std::to_string(index);
1347 m_evtInfo->addExtraInfo(iVar, (*eflagIterator).final(index));
1348 B2DEBUG(99,
"m_final(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1352 Belle::Rectrg_summary3_Manager& RecTrgSummary3Mgr = Belle::Rectrg_summary3_Manager::get_manager();
1354 std::string name_summary3 =
"rectrg_summary3_m_final";
1356 std::vector<Belle::Rectrg_summary3>::iterator eflagIterator3 = RecTrgSummary3Mgr.begin();
1359 for (
int index = 0; index < 3; ++index) {
1360 std::string iVar = name_summary3 + std::to_string(index);
1361 m_evtInfo->addExtraInfo(iVar, (*eflagIterator3).final(index));
1362 B2DEBUG(99,
"m_final(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1376 static Belle::kid_acc acc_pdf(0);
1379 const double pmass[5] = { 0.00051099907, 0.105658389, 0.13956995, 0.493677, 0.93827231 };
1381 CLHEP::Hep3Vector mom(chg.px(), chg.py(), chg.pz());
1382 double cos_theta = mom.cosTheta();
1383 double pval = mom.mag();
1385 double npe = chg.acc().photo_electron();
1386 double beta = pval /
sqrt(pval * pval + pmass[idp] * pmass[idp]);
1387 double pdfval = acc_pdf.npe2pdf(cos_theta, beta, npe);
1395 CLHEP::Hep3Vector mom(chg.px(), chg.py(), chg.pz());
1396 double pval = mom.mag();
1398 Belle::kid_cdc kidCdc(5);
1399 float factor0 = kidCdc.factor0();
1400 float factor1 = kidCdc.factor1(idp, pval);
1402 if (factor0 == 1.0 && factor1 == 1.0)
return chg.trk().pid(idp);
1404 double m = chg.trk().dEdx() / factor0;
1405 double e = chg.trk().dEdx_exp(idp) * factor1;
1406 double s = chg.trk().sigma_dEdx(idp);
1407 double val = 1. /
sqrt(2.*M_PI) / s * exp(-0.5 * (m - e) * (m - e) / s / s);
1414 bool discard_allzero)
1416 if (discard_allzero) {
1417 const double max_l = *std::max_element(likelihoods, likelihoods +
c_nHyp);
1423 for (
int i = 0; i <
c_nHyp; i++) {
1424 float logl = log(likelihoods[i]);
1434 track->addRelationTo(pid);
1440 double likelihoods[
c_nHyp];
1444 for (
int i = 0; i <
c_nHyp; i++) {
1445 accL[i] = tofL[i] = cdcL[i] = 1.0;
1449 const auto& acc = belleTrack.acc();
1450 if (acc and acc.quality() == 0) {
1451 for (
int i = 0; i <
c_nHyp; i++)
1452 accL[i] = likelihoods[i] =
acc_pid(belleTrack, i);
1459 const Belle::Mdst_tof& tof = belleTrack.tof();
1460 if (tof and tof.quality() == 0) {
1461 for (
int i = 0; i <
c_nHyp; i++)
1462 tofL[i] = likelihoods[i] = tof.pid(i);
1469 const Belle::Mdst_trk& trk = belleTrack.trk();
1470 if (trk.dEdx() > 0) {
1471 for (
int i = 0; i <
c_nHyp; i++) {
1472 likelihoods[i] = trk.pid(i);
1473 cdcL[i] =
cdc_pid(belleTrack, i);
1487 Belle::eid electronID(belleTrack);
1488 float eclID_e_pdf = electronID.pdf_e_ecl();
1489 float eclID_h_pdf = electronID.pdf_h_ecl();
1490 float atcID_e_pdf = electronID.atc_pid_pdf(
true, accL, tofL, cdcL);
1491 float atcID_h_pdf = electronID.atc_pid_pdf(
false, accL, tofL, cdcL);
1494 float eclProb = eclID_e_pdf / (eclID_e_pdf + eclID_h_pdf);
1495 float atcProb = atcID_e_pdf / (atcID_e_pdf + atcID_h_pdf);
1497 if (atcProb > 0.999999) atcProb = 0.999999;
1499 double eidCombinedSig = eclProb * atcProb;
1500 double eidCombinedBkg = (1. - eclProb) * (1. - atcProb);
1502 likelihoods[0] = eidCombinedSig;
1504 likelihoods[2] = eidCombinedBkg;
1518 int muid_trackid = belleTrack.muid_ID();
1522 Belle::Mdst_klm_mu_ex_Manager& ex_mgr = Belle::Mdst_klm_mu_ex_Manager::get_manager();
1523 Belle::Mdst_klm_mu_ex& ex = ex_mgr(Belle::Panther_ID(muid_trackid));
1526 if (ex.Chi_2() > 0) {
1528 likelihoods[1] = ex.Muon_likelihood();
1529 likelihoods[2] = ex.Pion_likelihood();
1530 likelihoods[3] = ex.Kaon_likelihood();
1535 for (
int i = 0; i < 5; i++)
1536 if (likelihoods[i] < 0)
1561 const HepPoint3D& newPivot,
1562 std::vector<float>& helixParams,
1563 CLHEP::HepSymMatrix& error5x5,
1564 CLHEP::HepLorentzVector& momentum,
1565 HepPoint3D& position,
1566 CLHEP::HepSymMatrix& error7x7,
const double dPhi)
1568 const HepPoint3D pivot(trk_fit.pivot_x(),
1572 CLHEP::HepVector a(5);
1573 a[0] = trk_fit.helix(0);
1574 a[1] = trk_fit.helix(1);
1575 a[2] = trk_fit.helix(2);
1576 a[3] = trk_fit.helix(3);
1577 a[4] = trk_fit.helix(4);
1578 CLHEP::HepSymMatrix Ea(5, 0);
1579 Ea[0][0] = trk_fit.error(0);
1580 Ea[1][0] = trk_fit.error(1);
1581 Ea[1][1] = trk_fit.error(2);
1582 Ea[2][0] = trk_fit.error(3);
1583 Ea[2][1] = trk_fit.error(4);
1584 Ea[2][2] = trk_fit.error(5);
1585 Ea[3][0] = trk_fit.error(6);
1586 Ea[3][1] = trk_fit.error(7);
1587 Ea[3][2] = trk_fit.error(8);
1588 Ea[3][3] = trk_fit.error(9);
1589 Ea[4][0] = trk_fit.error(10);
1590 Ea[4][1] = trk_fit.error(11);
1591 Ea[4][2] = trk_fit.error(12);
1592 Ea[4][3] = trk_fit.error(13);
1593 Ea[4][4] = trk_fit.error(14);
1595 Belle::Helix helix(pivot, a, Ea);
1598 if (helix.kappa() > 0)
1603 if (newPivot.x() != 0. || newPivot.y() != 0. || newPivot.z() != 0.) {
1604 helix.pivot(newPivot);
1605 momentum = helix.momentum(dPhi, mass, position, error7x7);
1607 if (pivot.x() != 0. || pivot.y() != 0. || pivot.z() != 0.) {
1608 helix.pivot(HepPoint3D(0., 0., 0.));
1609 momentum = helix.momentum(dPhi, mass, position, error7x7);
1611 momentum = helix.momentum(dPhi, mass, position, error7x7);
1621 const HepPoint3D& newPivot,
1622 std::vector<float>& helixParams, std::vector<float>& helixError)
1624 const HepPoint3D pivot(trk_fit.pivot_x(),
1628 CLHEP::HepVector a(5);
1629 a[0] = trk_fit.helix(0);
1630 a[1] = trk_fit.helix(1);
1631 a[2] = trk_fit.helix(2);
1632 a[3] = trk_fit.helix(3);
1633 a[4] = trk_fit.helix(4);
1634 CLHEP::HepSymMatrix Ea(5, 0);
1635 Ea[0][0] = trk_fit.error(0);
1636 Ea[1][0] = trk_fit.error(1);
1637 Ea[1][1] = trk_fit.error(2);
1638 Ea[2][0] = trk_fit.error(3);
1639 Ea[2][1] = trk_fit.error(4);
1640 Ea[2][2] = trk_fit.error(5);
1641 Ea[3][0] = trk_fit.error(6);
1642 Ea[3][1] = trk_fit.error(7);
1643 Ea[3][2] = trk_fit.error(8);
1644 Ea[3][3] = trk_fit.error(9);
1645 Ea[4][0] = trk_fit.error(10);
1646 Ea[4][1] = trk_fit.error(11);
1647 Ea[4][2] = trk_fit.error(12);
1648 Ea[4][3] = trk_fit.error(13);
1649 Ea[4][4] = trk_fit.error(14);
1651 Belle::Helix helix(pivot, a, Ea);
1653 if (newPivot.x() != 0. || newPivot.y() != 0. || newPivot.z() != 0.) {
1654 helix.pivot(newPivot);
1656 if (pivot.x() != 0. || pivot.y() != 0. || pivot.z() != 0.) {
1657 helix.pivot(HepPoint3D(0., 0., 0.));
1661 CLHEP::HepSymMatrix error5x5(5, 0);
1664 unsigned int size = 5;
1665 unsigned int counter = 0;
1666 for (
unsigned int i = 0; i < size; i++)
1667 for (
unsigned int j = i; j < size; j++)
1668 helixError[counter++] = error5x5[i][j];
1673 CLHEP::HepVector a(5);
1674 CLHEP::HepSymMatrix Ea(5, 0);
1680 helixParams[0] = a[0];
1683 helixParams[1] = adjustAngleRange(a[1] + TMath::Pi() / 2.0);
1689 helixParams[3] = a[3];
1692 helixParams[4] = a[4];
1694 unsigned int size = 5;
1695 for (
unsigned int i = 0; i < size; i++) {
1696 for (
unsigned int j = 0; j < size; j++) {
1697 error5x5[i][j] = Ea[i][j];
1703 if (std::isinf(error5x5[i][j])) {
1704 B2DEBUG(99,
"Helix covariance matrix element found to be infinite. Setting value to DBL_MAX/2.0.");
1705 error5x5[i][j] = DBL_MAX / 2.0;
1713 Belle::Mdst_trk& trk = belleTrack.trk();
1715 for (
int mhyp = 0 ; mhyp <
c_nHyp; ++mhyp) {
1716 Belle::Mdst_trk_fit& trk_fit = trk.mhyp(mhyp);
1718 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
1719 if (std::isnan(pValue))
continue;
1722 double thisMass = pType.
getMass();
1725 std::vector<float> helixParam(5);
1727 CLHEP::HepSymMatrix error5x5(5, 0);
1729 CLHEP::HepLorentzVector momentum;
1731 CLHEP::HepSymMatrix error7x7(7, 0);
1733 HepPoint3D position;
1736 helixParam, error5x5,
1737 momentum, position, error7x7, 0.0);
1739 std::vector<float> helixError(15);
1740 unsigned int size = 5;
1741 unsigned int counter = 0;
1742 for (
unsigned int i = 0; i < size; i++)
1743 for (
unsigned int j = i; j < size; j++)
1744 helixError[counter++] = error5x5[i][j];
1751 for (
unsigned int i = 0; i < 3; i++)
1752 cdcNHits += trk_fit.nhits(i);
1760 double path_length = 0;
1761 double tof_sigma = 0;
1765 double dedx = trk.dEdx();
1766 short dedx_qual = trk.quality_dedx();
1768 const Belle::Mdst_tof& tof_obj = belleTrack.tof();
1770 tof = tof_obj.tof();
1771 path_length = tof_obj.path_length();
1772 tof_qual = tof_obj.quality();
1773 tof_sigma = tof_obj.sigma_tof();
1776 const Belle::Mdst_acc& acc_obj = belleTrack.acc();
1778 acc_ph = acc_obj.photo_electron();
1779 acc_qual = acc_obj.quality();
1783 auto cdcExtraInfo =
m_belleTrkExtra.appendNew(trk_fit.first_x(), trk_fit.first_y(), trk_fit.first_z(),
1784 trk_fit.last_x(), trk_fit.last_y(), trk_fit.last_z(),
1785 tof, path_length, tof_qual, tof_sigma,
1786 acc_ph, acc_qual, dedx, dedx_qual);
1787 track->addRelationTo(cdcExtraInfo);
1790 int svdHitPattern = trk_fit.hit_svd();
1794 std::bitset<32> svdBitSet(svdHitPattern);
1798 unsigned short svdLayers;
1802 std::bitset<32> svdUMask(
static_cast<std::string
>(
"00000000000000000000000000000011"));
1804 std::bitset<32> svdVMask;
1807 if (
event->getExperiment() <= 27) {
1808 svdVMask = svdUMask << 6;
1811 svdVMask = svdUMask << 8;
1816 for (
unsigned short layerId = 0; layerId < svdLayers; layerId++) {
1817 unsigned short uHits = (svdBitSet & svdUMask).count();
1818 unsigned short vHits = (svdBitSet & svdVMask).count();
1819 patternVxd.
setSVDLayer(layerId + 3, uHits, vHits);
1828 TMatrixDSym cartesianCovariance(6);
1829 for (
unsigned i = 0; i < 7; i++) {
1832 for (
unsigned j = 0; j < 7; j++) {
1840 BFIELD, cartesianCovariance, pValue);
1842 TMatrixDSym helixCovariance = helixFromCartesian.
getCovariance();
1845 for (
unsigned int i = 0; i < 5; ++i)
1846 for (
unsigned int j = i; j < 5; ++j)
1847 helixError[counter++] = helixCovariance(i, j);
1852 track->setTrackFitResultIndex(pType, trackFit->getArrayIndex());
1880 B2WARNING(
"Trying to convert Gen_hepevt with idhep = " << idHep <<
1881 ". This should never happen.");
1884 mcParticle->
setPDG(idHep);
1887 if (genHepevt.isthep() > 0) {
1891 mcParticle->
setMass(genHepevt.M());
1893 ROOT::Math::PxPyPzEVector p4(genHepevt.PX(), genHepevt.PY(), genHepevt.PZ(), genHepevt.E());
1900 if (genHepevt.daFirst() > 0) {
1901 Belle::Gen_hepevt_Manager& genMgr = Belle::Gen_hepevt_Manager::get_manager();
1902 Belle::Gen_hepevt daughterParticle = genMgr(Belle::Panther_ID(genHepevt.daFirst()));
1907 mcParticle->
setDecayTime(std::numeric_limits<float>::infinity());
1924 eclCluster->
setPhi(ecl.phi());
1926 eclCluster->
setR(ecl.r());
1929 double covarianceMatrix[6];
1930 covarianceMatrix[0] = ecl.error(0);
1931 covarianceMatrix[1] = ecl.error(1);
1932 covarianceMatrix[2] = ecl.error(2);
1933 covarianceMatrix[3] = ecl.error(3);
1934 covarianceMatrix[4] = ecl.error(4);
1935 covarianceMatrix[5] = ecl.error(5);
1938 eclCluster->
setLAT(eclAux.width());
1945 float prop2 = eclAux.property(2);
1948 std::memcpy(&property2, &prop2,
sizeof(
int));
1951 tdccount = property2 & 0xffff;
1952 eclCluster->
setTime(tdccount);
1960 const double m_extRadius(125.0);
1961 const double m_extZFWD(196.0);
1962 const double m_extZBWD(-102.2);
1963 double minDist(10000);
1967 double eclClusterR_surface = m_extRadius / sin(eclCluster->
getTheta());
1968 if (reg == 1) {eclClusterR_surface = m_extZFWD / cos(eclCluster->
getTheta());}
1969 else if (reg == 3) {eclClusterR_surface = m_extZBWD / cos(eclCluster->
getTheta());}
1971 ROOT::Math::XYZVector eclCluster_surface_position(0, 0, 0);
1972 VectorUtil::setMagThetaPhi(eclCluster_surface_position, eclClusterR_surface, eclCluster->
getTheta(), eclCluster->
getPhi());
1974 for (
const auto& track :
m_tracks) {
1977 if (trackFit == NULL) {
continue;}
1979 const double z0 = trackFit->
getZ0();
1986 const double lHelixRadius = h.getArcLength2DAtCylindricalR(m_extRadius) > 0 ? h.getArcLength2DAtCylindricalR(m_extRadius) : 999999.;
1989 const double lFWD = (m_extZFWD - z0) / tanlambda > 0 ? (m_extZFWD - z0) / tanlambda : 999999.;
1992 const double lBWD = (m_extZBWD - z0) / tanlambda > 0 ? (m_extZBWD - z0) / tanlambda : 999999.;
1995 const double l = std::min(std::min(lHelixRadius, lFWD), lBWD);
1997 B2DEBUG(50, lHelixRadius <<
" " << lFWD <<
" " << lBWD <<
" -> " << l);
1999 ROOT::Math::XYZVector ext_helix = h.getPositionAtArcLength2D(l);
2000 double helixExtR_surface = m_extRadius / sin(ext_helix.Theta());
2001 if (l == lFWD) { helixExtR_surface = m_extZFWD / cos(ext_helix.Theta());}
2002 else if (l == lBWD) { helixExtR_surface = m_extZBWD / cos(ext_helix.Theta());}
2004 ROOT::Math::XYZVector helixExt_surface_position(0, 0, 0);
2005 VectorUtil::setMagThetaPhi(helixExt_surface_position, helixExtR_surface, ext_helix.Theta(), ext_helix.Phi());
2007 double distance = (eclCluster_surface_position - helixExt_surface_position).
R();
2008 if (distance < minDist) {minDist = distance;}
2010 if (minDist > 9999) minDist = -1;
2017 klmCluster->
setLayers(klm_cluster.layers());
2030 Belle::Mdst_ecl_trk_Manager& m = Belle::Mdst_ecl_trk_Manager::get_manager();
2031 Belle::Mdst_charged_Manager& chgMg = Belle::Mdst_charged_Manager::get_manager();
2036 std::vector<int> insert_order_types = {1, 2, 0};
2037 for (
auto& insert_type : insert_order_types) {
2038 for (Belle::Mdst_ecl_trk_Manager::iterator ecltrkIterator = m.begin(); ecltrkIterator != m.end(); ++ecltrkIterator) {
2039 Belle::Mdst_ecl_trk mECLTRK = *ecltrkIterator;
2041 if (mECLTRK.type() != insert_type)
2044 Belle::Mdst_ecl mdstEcl = mECLTRK.ecl();
2045 Belle::Mdst_trk mTRK = mECLTRK.trk();
2053 for (Belle::Mdst_charged_Manager::iterator chgIterator = chgMg.begin(); chgIterator != chgMg.end(); ++chgIterator) {
2054 Belle::Mdst_charged mChar = *chgIterator;
2055 Belle::Mdst_trk mTRK_in_charged = mChar.trk();
2057 if (mTRK_in_charged.get_ID() == mTRK.get_ID()) {
2059 tracksToECLClusters.
add(mChar.get_ID() - 1, mdstEcl.get_ID() - 1, 1.0);
2074 Belle::Mdst_klm_cluster_Manager& klm_cluster_manager = Belle::Mdst_klm_cluster_Manager::get_manager();
2077 for (Belle::Mdst_klm_cluster_Manager::iterator klmC_Ite = klm_cluster_manager.begin(); klmC_Ite != klm_cluster_manager.end();
2080 Belle::Mdst_klm_cluster mdstKlm_cluster = *klmC_Ite;
2081 Belle::Mdst_trk mTRK = mdstKlm_cluster.trk();
2082 Belle::Mdst_ecl mECL = mdstKlm_cluster.ecl();
2084 if (mTRK) klmClustersToTracks.
add(mdstKlm_cluster.get_ID() - 1, mTRK.get_ID() - 1);
2085 if (mECL) klmClustersToEclClusters.
add(mdstKlm_cluster.get_ID() - 1, mECL.get_ID() - 1);
2102 const int mask = 0x00f00000;
2103 int high_bits =
id & mask;
2104 if (high_bits == 0 || high_bits == mask)
return id;
2164 int bellePDGCode = belleMC.idhep();
2165 int belleIIPDGCode = mcP->
getPDG();
2167 if (bellePDGCode == 0)
2168 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to Gen_hepevt with idhep = 0.");
2170 if (bellePDGCode != belleIIPDGCode)
2171 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to different MCParticle! " << bellePDGCode <<
" vs. " <<
2174 const double belleMomentum[] = { belleMC.PX(), belleMC.PY(), belleMC.PZ() };
2177 for (
unsigned i = 0; i < 3; i++) {
2178 double relDev = (belle2Momentum[i] - belleMomentum[i]) / belleMomentum[i];
2180 if (relDev > 1e-3) {
2181 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to different MCParticle!");
2182 B2INFO(
" - Gen_hepevt [" << bellePDGCode <<
"] px/py/pz = " << belleMC.PX() <<
"/" << belleMC.PY() <<
"/" << belleMC.PZ());
2183 B2INFO(
" - TrackFitResult [" << belleIIPDGCode <<
"] px/py/pz = " << mcP->
get4Vector().Px() <<
"/" << mcP->
get4Vector().Py() <<
"/"
2191 CLHEP::HepLorentzVector& momentum, HepPoint3D& position, CLHEP::HepSymMatrix& error)
2193 const HepPoint3D pivot(vee.vx(), vee.vy(), vee.vz());
2194 CLHEP::HepVector a(5);
2195 CLHEP::HepSymMatrix Ea(5, 0);
2197 a[0] = vee.daut().helix_p(0); a[1] = vee.daut().helix_p(1);
2198 a[2] = vee.daut().helix_p(2); a[3] = vee.daut().helix_p(3);
2199 a[4] = vee.daut().helix_p(4);
2200 Ea[0][0] = vee.daut().error_p(0); Ea[1][0] = vee.daut().error_p(1);
2201 Ea[1][1] = vee.daut().error_p(2); Ea[2][0] = vee.daut().error_p(3);
2202 Ea[2][1] = vee.daut().error_p(4); Ea[2][2] = vee.daut().error_p(5);
2203 Ea[3][0] = vee.daut().error_p(6); Ea[3][1] = vee.daut().error_p(7);
2204 Ea[3][2] = vee.daut().error_p(8); Ea[3][3] = vee.daut().error_p(9);
2205 Ea[4][0] = vee.daut().error_p(10); Ea[4][1] = vee.daut().error_p(11);
2206 Ea[4][2] = vee.daut().error_p(12); Ea[4][3] = vee.daut().error_p(13);
2207 Ea[4][4] = vee.daut().error_p(14);
2209 a[0] = vee.daut().helix_m(0); a[1] = vee.daut().helix_m(1);
2210 a[2] = vee.daut().helix_m(2); a[3] = vee.daut().helix_m(3);
2211 a[4] = vee.daut().helix_m(4);
2212 Ea[0][0] = vee.daut().error_m(0); Ea[1][0] = vee.daut().error_m(1);
2213 Ea[1][1] = vee.daut().error_m(2); Ea[2][0] = vee.daut().error_m(3);
2214 Ea[2][1] = vee.daut().error_m(4); Ea[2][2] = vee.daut().error_m(5);
2215 Ea[3][0] = vee.daut().error_m(6); Ea[3][1] = vee.daut().error_m(7);
2216 Ea[3][2] = vee.daut().error_m(8); Ea[3][3] = vee.daut().error_m(9);
2217 Ea[4][0] = vee.daut().error_m(10); Ea[4][1] = vee.daut().error_m(11);
2218 Ea[4][2] = vee.daut().error_m(12); Ea[4][3] = vee.daut().error_m(13);
2219 Ea[4][4] = vee.daut().error_m(14);
2222 Belle::Helix helix(pivot, a, Ea);
2225 momentum = helix.momentum(0., pType.
getMass(), position, error);
2229 std::vector<float>& helixError)
2231 const HepPoint3D pivot(vee.vx(), vee.vy(), vee.vz());
2232 CLHEP::HepVector a(5);
2233 CLHEP::HepSymMatrix Ea(5, 0);
2235 a[0] = vee.daut().helix_p(0); a[1] = vee.daut().helix_p(1);
2236 a[2] = vee.daut().helix_p(2); a[3] = vee.daut().helix_p(3);
2237 a[4] = vee.daut().helix_p(4);
2238 Ea[0][0] = vee.daut().error_p(0);
2239 Ea[1][0] = vee.daut().error_p(1);
2240 Ea[1][1] = vee.daut().error_p(2);
2241 Ea[2][0] = vee.daut().error_p(3);
2242 Ea[2][1] = vee.daut().error_p(4);
2243 Ea[2][2] = vee.daut().error_p(5);
2244 Ea[3][0] = vee.daut().error_p(6);
2245 Ea[3][1] = vee.daut().error_p(7);
2246 Ea[3][2] = vee.daut().error_p(8);
2247 Ea[3][3] = vee.daut().error_p(9);
2248 Ea[4][0] = vee.daut().error_p(10);
2249 Ea[4][1] = vee.daut().error_p(11);
2250 Ea[4][2] = vee.daut().error_p(12);
2251 Ea[4][3] = vee.daut().error_p(13);
2252 Ea[4][4] = vee.daut().error_p(14);
2254 a[0] = vee.daut().helix_m(0); a[1] = vee.daut().helix_m(1);
2255 a[2] = vee.daut().helix_m(2); a[3] = vee.daut().helix_m(3);
2256 a[4] = vee.daut().helix_m(4);
2257 Ea[0][0] = vee.daut().error_m(0);
2258 Ea[1][0] = vee.daut().error_m(1);
2259 Ea[1][1] = vee.daut().error_m(2);
2260 Ea[2][0] = vee.daut().error_m(3);
2261 Ea[2][1] = vee.daut().error_m(4);
2262 Ea[2][2] = vee.daut().error_m(5);
2263 Ea[3][0] = vee.daut().error_m(6);
2264 Ea[3][1] = vee.daut().error_m(7);
2265 Ea[3][2] = vee.daut().error_m(8);
2266 Ea[3][3] = vee.daut().error_m(9);
2267 Ea[4][0] = vee.daut().error_m(10);
2268 Ea[4][1] = vee.daut().error_m(11);
2269 Ea[4][2] = vee.daut().error_m(12);
2270 Ea[4][3] = vee.daut().error_m(13);
2271 Ea[4][4] = vee.daut().error_m(14);
2274 Belle::Helix helix(pivot, a, Ea);
2277 helix.pivot(HepPoint3D(0., 0., 0.));
2279 CLHEP::HepSymMatrix error5x5(5, 0);
2282 unsigned int size = 5;
2283 unsigned int counter = 0;
2284 for (
unsigned int i = 0; i < size; i++)
2285 for (
unsigned int j = i; j < size; j++)
2286 helixError[counter++] = error5x5[i][j];
2290 const HepPoint3D& position,
2291 const CLHEP::HepSymMatrix& error,
2292 const short int charge,
2295 const uint64_t hitPatternCDCInitializer,
2296 const uint32_t hitPatternVXDInitializer,
2299 ROOT::Math::XYZVector pos(position.x(), position.y(), position.z());
2300 ROOT::Math::XYZVector mom(momentum.px(), momentum.py(), momentum.pz());
2302 TMatrixDSym errMatrix(6);
2303 for (
unsigned i = 0; i < 7; i++) {
2306 for (
unsigned j = 0; j < 7; j++) {
2317 return TrackFitResult(pos, mom, errMatrix, charge, pType, pValue,
BFIELD, hitPatternCDCInitializer, hitPatternVXDInitializer, ndf);
2322 if (!pid)
return 0.5;
2329 if (acc_sig + acc_bkg > 0.0)
2330 acc = acc_sig / (acc_sig + acc_bkg);
2337 double tof_all = tof_sig + tof_bkg;
2339 tof = tof_sig / tof_all;
2340 if (tof < 0.001) tof = 0.001;
2341 if (tof > 0.999) tof = 0.999;
2349 double cdc_all = cdc_sig + cdc_bkg;
2351 cdc = cdc_sig / cdc_all;
2352 if (cdc < 0.001) cdc = 0.001;
2353 if (cdc > 0.999) cdc = 0.999;
2357 double pid_sig = acc * tof * cdc;
2358 double pid_bkg = (1. - acc) * (1. - tof) * (1. - cdc);
2360 return pid_sig / (pid_sig + pid_bkg);
2366 B2DEBUG(99,
"B2BIIConvertMdst: endRun done.");
2372 B2DEBUG(99,
"B2BIIConvertMdst: terminate called");
void belleVeeDaughterHelix(const Belle::Mdst_vee2 &vee, const int charge, std::vector< float > &helixParam, std::vector< float > &helixError)
obtains the helix parameters of the vee daughters
double atcPID(const PIDLikelihood *pid, int sigHyp, int bkgHyp)
calculates atc_pid(3,1,5,sigHyp,bkgHyp).prob() from converted PIDLikelihood
void convertMdstGammaTable()
Reads all entries of Mdst_Gamma Panther table, creates a particle list 'gamma:mdst' and adds them to ...
B2BIIConvertMdstModule()
Constructor.
std::map< int, int > mdstKlmToKLMCluster
map of Mdst_klm Panther IDs and corresponding KLMCluster StoreArray indices
void copyNbarFromGamma()
Copies Particles in 'gamma:mdst' with energy > 0.5 GeV to be anti-n0:mdst.
void convertMdstChargedTable()
Reads and converts all entries of Mdst_charged (Mdst_trk and Mdst_trk_fit) Panther table to Track (Tr...
void setTracksToECLClustersRelations()
Sets Track -> ECLCluster relations.
OptionalDBObjPtr< CollisionBoostVector > m_collisionBoostVectorDB
CollisionBoostVector for boost vector.
StoreObjPtr< EventExtraInfo > m_evtInfo
Event Extra Info.
const int ERRMCONV[7]
CONVERSION OF TRACK ERROR MATRIX ELEMENTS.
CollisionAxisCMS m_collisionAxisCMS
CollisionAxisCMS of the beam.
StoreArray< KLMCluster > m_klmClusters
KLM clusters.
void belleVeeDaughterToCartesian(const Belle::Mdst_vee2 &vee, const int charge, const Const::ParticleType &pType, CLHEP::HepLorentzVector &momentum, HepPoint3D &position, CLHEP::HepSymMatrix &error)
Fills 4-momentum, position and 7x7 error matrix from Belle Vee daughter.
@ c_Direct
Direct matching.
@ c_GeneratorLevel
Match to generator-level particles.
virtual void initialize() override
Initialize the module.
void setLikelihoods(PIDLikelihood *pid, Const::EDetector det, double likelihoods[c_nHyp], bool discard_allzero=false)
Add given Belle likelihoods (not log-likelihoods, in Belle hypothesis order) for given detector to pi...
OptionalDBObjPtr< CollisionAxisCMS > m_collisionAxisCMSDB
CollisionAxisCMS.
StoreArray< V0 > m_v0s
V0-particles.
virtual void event() override
Called for each event.
void convertGenHepEvtTable()
Reads and converts all entries of Gen_hepevt Panther table to MCParticle dataobjects and adds them to...
double cdc_pid(const Belle::Mdst_charged &chg, int idp)
Returns CDC likelihood for given hypothesis idp.
void convertRecTrgTable()
Reads and converts m_final from rectrg_summary3.
void setKLMClustersRelations()
Sets KLMCluster -> Track and ECLCluster relations.
bool m_convertEvtcls
Flag to switch on conversion of Evtcls table.
const double KAPPA2OMEGA
Conversion factor for Kappa -> Omega helix parameters.
double computeTrkMinDistanceBelle(ECLCluster *eclCluster)
calculate the minimal distance between a cluster and a set of tracks on the ECL surface.
virtual void endRun() override
Called when the current run is finished.
bool m_nisEnable
Flag to switch on conversion of nisKsFinder info.
StoreArray< TrackFitResult > m_trackFitResults
Track fir results.
BeamSpot m_beamSpot
Interaction Point of the beam.
StoreArray< Particle > m_particles
Particles.
virtual void terminate() override
Terminates the module.
OptionalDBObjPtr< CollisionInvariantMass > m_collisionInvMDB
CollisionInvariantMass for Invariant Mass of Beam.
void convertHelix(Belle::Helix &helix, std::vector< float > &helixParams, CLHEP::HepSymMatrix &error5x5)
Converts Belle's Helix parameters and it's covariance matrix to Belle II's version.
void convertMdstPi0Table()
Reads all entries of Mdst_Pi0 Panther table, creates a particle list 'pi0:mdst' and adds them to Stor...
std::map< int, int > genHepevtToMCParticle
map of Gen_hepevt Panther IDs and corresponding MCParticle StoreArray indices
void testMCRelation(const Belle::Gen_hepevt &belleMC, const MCParticle *mcP, const std::string &objectName)
Checks if the reconstructed object (Track, ECLCluster, ...) was matched to the same MCParticle.
bool m_convertNbar
Flag to create anti-n0:mdst list from gamma:mdst.
void convertIPProfile(bool beginRun=false)
Stores the IPProfiles in BeamSpot (currently in DataStore)
void convertMdstECLObject(const Belle::Mdst_ecl &ecl, const Belle::Mdst_ecl_aux &eclAux, ECLCluster *eclCluster)
Converts Mdst_ecl(_aux) record to ECLCluster object.
CollisionInvariantMass m_collisionInvM
CollisionInvariantMass for the invariant mass of the beam.
bool m_convertBeamParameters
Convert beam parameters or use information stored in Belle II database.
static double acc_pid(const Belle::Mdst_charged &chg, int idp)
Returns ACC likelihood for given hypothesis idp.
virtual void beginRun() override
Module functions to be called from event process.
StoreArray< Track > m_tracks
Tracks.
void convertBeamEnergy()
Stores beam parameters (energy, angles) in CollisionInvariantMass and CollisionBoostVector (currently...
void convertPIDData(const Belle::Mdst_charged &belleTrack, const Track *track)
Get PID information for belleTrack and add it to PIDLikelihood (with relation from track).
void convertMdstKLMObject(const Belle::Mdst_klm_cluster &klm, KLMCluster *klmCluster)
Converts Mdst_klm_cluster record to KLMCluster object.
Belle2::MCParticleGraph m_particleGraph
MCParticle Graph to build Belle2 MC Particles.
void convertMdstKLongTable()
Reads all entries of Mdst_Klong Panther table, creates a particle list 'K_L0:mdst' and adds them to S...
OptionalDBObjPtr< BeamSpot > m_beamSpotDB
BeamSpot for IP.
bool m_realData
flag that tells whether given data sample is for real data or MC
StoreArray< ECLCluster > m_eclClusters
ECL clusters.
void convertGenHepevtObject(const Belle::Gen_hepevt &genHepevt, MCParticleGraph::GraphParticle *mcParticle)
Converts Gen_hepevt record to MCParticleGraph object.
void initializeDataStore()
Initializes Belle II DataStore.
void convertMdstECLTable()
Reads and converts all entries of Mdst_ecl(_aux) Panther table to ECLCluster dataobjects and adds the...
CollisionBoostVector m_collisionBoostVector
CollisionBoostVector for bosst vector of the beam.
std::string m_mcMatchingModeString
MC matching mode.
int m_lastIPProfileBin
variable to tell us which IPProfile bin was active last time we looked
void convertMdstKLMTable()
Reads and converts all entries of Mdst_klm_cluster Panther table to KLMCluster dataobjects and adds t...
bool m_convertRecTrg
Flag to switch on conversion of rectrg_summary3.
std::map< int, int > mdstGammaToParticle
map of gamma Panther IDs and corresponding Particle StoreArray indices
static const Const::ChargedStable c_belleHyp_to_chargedStable[c_nHyp]
maps Belle hypotheses to Const::ChargedStable (from http://belle.kek.jp/secured/wiki/doku....
std::map< int, int > mdstKlongToParticle
map of Klong Panther IDs and corresponding Particle StoreArray indices
double m_matchType2E9oE25Threshold
E9/E25 threshold value clusters with a value above this threshold are classified as neutral even if t...
void convertMdstChargedObject(const Belle::Mdst_charged &belleTrack, Track *track)
Converts Mdst_charged (Mdst_trk(_fit)) record to Track (TrackFitResult) object.
bool m_evtgenProcessing
Flag to switch on only evtgen processing.
StoreArray< MCParticle > m_mcParticles
MC particles.
void convertMdstVee2Table()
Reads and converts all entries of Mdst_vee2 Panther table to V0 dataobjects and adds them to StoreArr...
StoreArray< PIDLikelihood > m_pidLikelihoods
output PIDLikelihood array.
std::map< int, int > mdstEclToECLCluster
map of Mdst_ecl Panther IDs and corresponding ECLCluster StoreArray indices
TrackFitResult createTrackFitResult(const CLHEP::HepLorentzVector &momentum, const HepPoint3D &position, const CLHEP::HepSymMatrix &error, const short int charge, const Const::ParticleType &pType, const float pValue, const uint64_t hitPatternCDCInitializer, const uint32_t hitPatternVXDInitializer, const uint16_t ndf)
Creates TrackFitResult and fills it.
virtual ~B2BIIConvertMdstModule() override
Destructor.
const double BFIELD
B filed in TESLA.
MCMatchingMode m_mcMatchingMode
C matching mode.
StoreArray< BelleTrkExtra > m_belleTrkExtra
Belle CDC extra information.
bool m_use6x6CovarianceMatrix4Tracks
flag that tells which form of covariance matrix should be used in the conversion of charged tracks
int recoverMoreThan24bitIDHEP(int id)
Helper function to recover falsely set idhep info in GenHepEvt list.
bool m_convertTrkExtra
Flag to switch on conversion of first(last)_{x,y,z} of mdst_trk_fit.
int getHelixParameters(const Belle::Mdst_trk_fit &trk_fit, const double mass, const HepPoint3D &newPivot, std::vector< float > &helixParams, CLHEP::HepSymMatrix &error5x5, CLHEP::HepLorentzVector &momentum, HepPoint3D &position, CLHEP::HepSymMatrix &error7x7, const double dPhi=0.0)
Fills Helix parameters (converted to Belle II version), 5x5 error matrix, 4-momentum,...
static const int c_nHyp
Number of Belle track hypotheses (see c_belleHyp_to_chargedStable).
void convertEvtclsTable()
Reads and converts all entries of evtcls Panther table.
This class contains the beam spot position and size modeled as a gaussian distribution in space.
This class contains the measured values of the orientation of the collision axis in the CM system obt...
This class contains the measured average boost vector vec(beta) = (beta_x, beta_y,...
This class contains the measured average center-of-mass energy, which is equal to the invariant mass ...
Provides a type-safe way to pass members of the chargedStableSet set.
The ParticleType class for identifying different particle types.
double getMass() const
Particle mass.
static const ChargedStable muon
muon particle
RestrictedDetectorSet< PIDDetectors > PIDDetectorSet
Typedef for set of PID detectors.
EDetector
Enum for identifying the detector components (detector and subdetector).
static const ChargedStable pion
charged pion particle
static const ParticleType Klong
K^0_L particle.
static const double speedOfLight
[cm/ns]
static const double electronMass
electron mass
static const ChargedStable proton
proton particle
static const ParticleType antiNeutron
Anti-neutron particle.
static const ChargedStable kaon
charged kaon particle
static const ParticleType photon
photon particle
static const ChargedStable electron
electron particle
static const ChargedStable deuteron
deuteron particle
void setE9oE21(double E9oE21)
Set E9/E21 energy ratio.
void addHypothesis(EHypothesisBit bitmask)
Add bitmask to current hypothesis.
void setTheta(double theta)
Set Theta of Shower (radian).
void setPhi(double phi)
Set Phi of Shower (radian).
double getPhi() const
Return Corrected Phi of Shower (radian).
void setdeltaL(double deltaL)
Set deltaL for shower shape.
void setEnergyHighestCrystal(double energyhighestcrystal)
Set energy of highest energetic crystal (GeV).
void setEnergyRaw(double energyraw)
Set Incorrect Energy deposited (GeV).
void setTime(double time)
Set time information.
void setCovarianceMatrix(double covArray[6])
Set covariance matrix (3x3), i.e.
void setMinTrkDistance(double distance)
Set distance between cluster COG and track extrapolation to ECL.
int getDetectorRegion() const
Return detector region: 0: below acceptance, 1: FWD, 2: BRL, 3: BWD, 11: FWDGAP, 13: BWDGAP.
void setLAT(double LAT)
Set Lateral distribution parameter.
double getEnergy(EHypothesisBit hypothesis) const
Return Energy (GeV).
void setNumberOfCrystals(double noc)
Set number of crystals (sum of weights).
void setEnergy(double energy)
Set Corrected Energy (GeV).
double getTheta() const
Return Corrected Theta of Shower (radian).
void setIsTrack(bool istrack)
Set m_isTrack true if the cluster matches with a track.
@ c_nPhotons
CR is split into n photons (N1)
@ c_neutralHadron
CR is reconstructed as a neutral hadron (N2)
void setR(double r)
Set R (in cm).
Hit pattern of CDC hits within a track.
void setNHits(unsigned short nHits)
Sets the 8 MSBs to the total number of hits in the CDC.
ULong64_t getInteger() const
Getter for underlying integer type.
Hit pattern of the VXD within a track.
unsigned int getInteger() const
Getter for the underlying integer.
void setSVDLayer(const unsigned short layerId, unsigned short uHits, unsigned short vHits)
Set the number of hits in a specific layer of the SVD.
A class that describes the interval of experiments/runs for which an object in the database is valid.
void setLayers(int layers)
Set number of layers with hits.
void setClusterPosition(float globalX, float globalY, float globalZ)
Set global position.
void setInnermostLayer(int innermostLayer)
Set number of the innermost layer with hits.
Class to represent Particle data in graph.
void decaysInto(GraphParticle &daughter)
Tells the graph that this particle decays into daughter.
A Class to store the Monte Carlo particle information.
@ c_PrimaryParticle
bit 0: Particle is primary particle.
void setDecayTime(float time)
Set decay time.
void setMass(float mass)
Set particle mass.
void setDecayVertex(const ROOT::Math::XYZVector &vertex)
Set decay vertex.
void setValidVertex(bool valid)
Set indication whether vertex and time information is valid or just default.
void setProductionVertex(const ROOT::Math::XYZVector &vertex)
Set production vertex position.
ROOT::Math::PxPyPzEVector get4Vector() const
Return 4Vector of particle.
void setPDG(int pdg)
Set PDG code of the particle.
int getPDG() const
Return PDG code of particle.
void set4Vector(const ROOT::Math::PxPyPzEVector &p4)
Sets the 4Vector of particle.
void setStatus(unsigned short int status)
Set Status code for the particle.
void setProductionTime(float time)
Set production time.
void setDescription(const std::string &description)
Sets the description of the module.
Class to collect log likelihoods from TOP, ARICH, dEdx, ECL and KLM aimed for output to mdst includes...
Class to store reconstructed particles.
void appendDaughter(const Particle *daughter, const bool updateType=true, const int daughterProperty=c_Ordinary)
Appends index of daughter to daughters index array.
void setVertex(const ROOT::Math::XYZVector &vertex)
Sets position (decay vertex)
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
void setPValue(double pValue)
Sets chi^2 probability of fit.
void updateMomentum(const ROOT::Math::PxPyPzEVector &p4, const ROOT::Math::XYZVector &vertex, const TMatrixFSym &errMatrix, double pValue)
Sets Lorentz vector, position, 7x7 error matrix and p-value.
static bool parallelProcessingUsed()
Returns true if multiple processes have been spawned, false in single-core mode.
Low-level class to create/modify relations between StoreArrays.
void add(index_type from, index_type to, weight_type weight=1.0)
Add a new element to the relation.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
int getArrayIndex() const
Returns this object's array index (in StoreArray), or -1 if not found.
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
const std::string & getName() const
Return name under which the object is saved in the DataStore.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
bool create(bool replace=false)
Create a default object in the data store.
Type-safe access to single objects in the data store.
Values of the result of a track fit with a given particle hypothesis.
Helix getHelix() const
Conversion to framework Helix (without covariance).
TMatrixDSym getCovariance5() const
Getter for covariance matrix of perigee parameters in matrix form.
short getChargeSign() const
Return track charge (1 or -1).
double getOmega() const
Getter for omega.
double getD0() const
Getter for d0.
double getTanLambda() const
Getter for tanLambda.
double getZ0() const
Getter for z0.
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.
double getPhi0() const
Getter for phi0.
Class that bundles various TrackFitResults.
This class represents an ideal helix in perigee parameterization including the covariance matrix of t...
const TMatrixDSym & getCovariance() const
Getter for covariance matrix of perigee parameters in matrix form.
static const double mm
[millimeters]
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
static Database & Instance()
Instance of a singleton Database.
static DBStore & Instance()
Instance of a singleton DBStore.
bool storeData(const std::string &name, TObject *object, const IntervalOfValidity &iov)
Store an object in the database.
void addConstantOverride(const std::string &name, TObject *obj, bool oneRun=false)
Add constant override payload.
#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
double charge(int pdgCode)
Returns electric charge of a particle with given pdg code.
Abstract base class for different kinds of events.