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>
20 #include <framework/gearbox/Unit.h>
21 #include <framework/gearbox/Const.h>
22 #include <analysis/dataobjects/ParticleExtraInfoMap.h>
25 #include <framework/dataobjects/EventMetaData.h>
26 #include <framework/dataobjects/Helix.h>
27 #include <framework/dataobjects/UncertainHelix.h>
30 #include <b2bii/utility/BelleMdstToGenHepevt.h>
33 #include <Math/RotationY.h>
34 #include <Math/Vector3D.h>
35 #include <Math/Vector4D.h>
43 #include "belle_legacy/eid/eid.h"
47 #include "belle_legacy/kid/kid_acc.h"
48 #include "belle_legacy/kid/kid_cdc.h"
52 #include "belle_legacy/findKs/findKs.h"
55 #ifdef HAVE_NISKSFINDER
56 #include "belle_legacy/nisKsFinder/nisKsFinder.h"
59 #ifdef HAVE_GOODLAMBDA
60 #include "belle_legacy/findLambda/findLambda.h"
63 #include "belle_legacy/benergy/BeamEnergy.h"
64 #include "belle_legacy/ip/IpProfile.h"
65 #include "belle_legacy/tables/evtcls.h"
66 #include "belle_legacy/tables/trg.h"
76 bool approximatelyEqual(
float a,
float b,
float epsilon)
78 return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
81 double adjustAngleRange(
double phi)
83 phi = phi - int(phi / TMath::TwoPi()) * TMath::TwoPi();
84 return phi - int(phi / TMath::Pi()) * TMath::TwoPi();
87 void fill7x7ErrorMatrix(
const TrackFitResult* tfr, TMatrixDSym& error7x7,
const double mass,
const double bField)
91 double d0 = tfr->
getD0();
99 double cosPhi0 = TMath::Cos(phi0);
100 double sinPhi0 = TMath::Sin(phi0);
104 rho = 1.0 / alpha / omega;
108 double energy = TMath::Sqrt(mass * mass + (1.0 + tanl * tanl) * rho * rho);
120 const int iOmega = 2;
124 TMatrixD jacobian(7, 5);
127 jacobian(iPx, iPhi0) = - fabs(rho) * sinPhi0;
128 jacobian(iPx, iOmega) = -
charge * rho * rho * cosPhi0 * alpha;
129 jacobian(iPy, iPhi0) = fabs(rho) * cosPhi0;
130 jacobian(iPy, iOmega) = -
charge * rho * rho * sinPhi0 * alpha;
131 jacobian(iPz, iOmega) = -
charge * rho * rho * tanl * alpha;
132 jacobian(iPz, iTanl) = fabs(rho);
133 if (omega != 0 && energy != 0) {
134 jacobian(iE, iOmega) = - (1.0 + tanl * tanl) * rho * rho / omega / energy;
135 jacobian(iE, iTanl) = tanl * rho * rho / energy;
137 jacobian(iE, iOmega) = (DBL_MAX);
138 jacobian(iE, iTanl) = (DBL_MAX);
140 jacobian(iX, iD0) = sinPhi0;
141 jacobian(iX, iPhi0) = d0 * cosPhi0;
142 jacobian(iY, iD0) = - cosPhi0;
143 jacobian(iY, iPhi0) = d0 * sinPhi0;
144 jacobian(iZ, iZ0) = 1.0;
148 error7x7 = error5x5.Similarity(jacobian);
160 m_mcMatchingMode(c_Direct)
163 setDescription(
"Converts Belle mDST objects (Panther tables and records) to Belle II mDST objects.");
166 "Convert beam parameters or use information stored in "
167 "Belle II database.",
true);
169 "Use 6x6 (position, momentum) covariance matrix for charged tracks instead of 5x5 (helix parameters) covariance matrix",
false);
171 "MC matching mode: 'Direct', or 'GeneratorLevel'",
172 std::string(
"Direct"));
174 "clusters with a E9/E25 value above this threshold are classified as neutral even if tracks are matched to their connected region (matchType == 2)",
178 addParam(
"nisKsInfo",
m_nisEnable,
"Flag to switch on conversion of nisKsFinder info",
true);
180 addParam(
"TrkExtra",
m_convertTrkExtra,
" Flag to switch on conversion of first_x,y,z and last_x,y,z from Mdst_trk_fit",
true);
184 B2DEBUG(1,
"B2BIIConvertMdst: Constructor done.");
202 B2INFO(
"B2BIIConvertMdst: initialized.");
204 B2WARNING(
"nisKsFinder output has been disabled. ksnbVLike, ksnbNoLam, ksnbStandard will not be converted.");
209 B2DEBUG(99,
"[B2BIIConvertMdstModule::initializeDataStore] initialization of DataStore started");
216 m_v0s.registerInDataStore();
257 B2DEBUG(99,
"[B2BIIConvertMdstModule::initializeDataStore] initialization of DataStore ended");
263 B2DEBUG(99,
"B2BIIConvertMdst: beginRun called.");
267 Belle::BeamEnergy::begin_run();
269 Belle::BeamEnergy::dump();
272 Belle::IpProfile::begin_run();
274 Belle::IpProfile::dump();
275 bool usableIP = Belle::IpProfile::usable();
276 B2DEBUG(99,
"B2BIIConvertMdst: IpProfile is usable = " << usableIP);
281 Belle::eid::init_data();
282 Belle::eid::show_use(
"ALL");
291 Belle::Belle_event_Manager& evman = Belle::Belle_event_Manager::get_manager();
292 Belle::Belle_event& evt = evman[0];
294 if (evt.ExpMC() == 2)
307 B2INFO(
"No database entry for this run yet, create one");
315 B2ERROR(
"BeamParameters from condition database are different from converted "
316 "ones, overriding database. Did you make sure the globaltag B2BII is used?");
318 B2INFO(
"BeamSpot, BoostVector, and InvariantMass from condition database are different from converted "
319 "ones, overriding database");
322 B2FATAL(
"Cannot reliably override the Database content in parallel processing "
323 "mode, please run the conversion in single processing mode");
375 const double Eher = Belle::BeamEnergy::E_HER();
376 const double Eler = Belle::BeamEnergy::E_LER();
377 const double crossingAngle = Belle::BeamEnergy::Cross_angle();
378 const double angleLer = M_PI;
379 const double angleHer = crossingAngle;
381 TMatrixDSym covariance(0);
382 HepLorentzVector p_beam = Belle::BeamEnergy::p_beam();
385 ROOT::Math::PxPyPzEVector P_her(0.0, 0.0, TMath::Sqrt(Eher * Eher - mass_e * mass_e), Eher);
386 ROOT::Math::RotationY rotateAroundYAxis(angleHer);
387 P_her = rotateAroundYAxis(P_her);
388 ROOT::Math::PxPyPzEVector P_ler(0.0, 0.0, TMath::Sqrt(Eler * Eler - mass_e * mass_e), Eler);
389 rotateAroundYAxis.SetAngle(angleLer);
390 P_ler = rotateAroundYAxis(P_ler);
393 ROOT::Math::PxPyPzEVector P_beam = P_her + P_ler;
398 B2DEBUG(99,
"Beam Energy: E_HER = " << Eher <<
"; E_LER = " << Eler <<
"; angle = " << crossingAngle);
399 B2DEBUG(99,
"Beam Momentum (pre-convert) : P_X = " << p_beam.px() <<
"; P_Y = " << p_beam.py() <<
"; P_Z = " << p_beam.pz());
400 B2DEBUG(99,
"Beam Momentum (post-convert) : P_X = " << P_beam.Px() <<
"; P_Y = " << P_beam.Py() <<
"; P_Z = " << P_beam.Pz());
405 if (!Belle::IpProfile::usable()) {
410 TVector3(std::numeric_limits<double>::quiet_NaN(),
411 std::numeric_limits<double>::quiet_NaN(),
412 std::numeric_limits<double>::quiet_NaN()
413 ), TMatrixTSym<double>()
419 CLHEP::HepSymMatrix ipErr;
422 ip = Belle::IpProfile::position();
423 ipErr = Belle::IpProfile::position_err();
426 Belle::IpProfile::set_evtbin_number();
430 ip = Belle::IpProfile::e_position();
431 ipErr = Belle::IpProfile::e_position_err();
436 TMatrixDSym cov(ipErr.num_col());
437 for (
int i = 0; i < ipErr.num_row(); ++i) {
438 for (
int j = 0; j < ipErr.num_col(); ++j) {
439 cov(i, j) = ipErr(i + 1, j + 1);
451 Belle::Mdst_charged_Manager& m = Belle::Mdst_charged_Manager::get_manager();
452 for (Belle::Mdst_charged_Manager::iterator chargedIterator = m.begin(); chargedIterator != m.end(); ++chargedIterator) {
453 Belle::Mdst_charged belleTrack = *chargedIterator;
467 const Belle::Gen_hepevt& hep0 = get_hepevt(belleTrack);
470 const Belle::Gen_hepevt* hep =
nullptr;
476 hep = &gen_level(hep0);
484 tracksToMCParticles.
add(track->getArrayIndex(), matchedMCParticle);
488 B2DEBUG(99,
"Can not find MCParticle corresponding to this gen_hepevt (Panther ID = " << hep->get_ID() <<
")");
489 B2DEBUG(99,
"Gen_hepevt: Panther ID = " << hep->get_ID() <<
"; idhep = " << hep->idhep() <<
"; isthep = " << hep->isthep());
499 ksPList->initialize(310, ksPList.
getName());
504 lambda0PList->initialize(3122, lambda0PList.
getName());
507 antiLambda0PList.
create();
508 antiLambda0PList->initialize(-3122, antiLambda0PList.
getName());
510 antiLambda0PList->bindAntiParticleList(*lambda0PList);
515 convGammaPList->initialize(22, convGammaPList.
getName());
518 Belle::Mdst_vee2_Manager& m = Belle::Mdst_vee2_Manager::get_manager();
519 for (Belle::Mdst_vee2_Manager::iterator vee2Iterator = m.begin(); vee2Iterator != m.end(); ++vee2Iterator) {
520 Belle::Mdst_vee2 belleV0 = *vee2Iterator;
523 Belle::Mdst_charged belleTrackP = belleV0.chgd(0);
525 Belle::Mdst_charged belleTrackM = belleV0.chgd(1);
533 switch (belleV0.kind()) {
559 B2WARNING(
"Conversion of vee2 candidate of unknown kind! kind = " << belleV0.kind());
563 int trackID[2] = {0, 0};
565 Belle::Mdst_charged_Manager& charged_mag = Belle::Mdst_charged_Manager::get_manager();
566 for (std::vector<Belle::Mdst_charged>::iterator chgIterator = charged_mag.begin(); chgIterator != charged_mag.end();
568 if (belleV0.chgd(0).get_ID() >= 1 && trackID[0] == 0 && belleV0.chgd(0).get_ID() == chgIterator->get_ID()) {
569 trackID[0] = (int)(chgIterator->get_ID());
572 if (belleV0.chgd(1).get_ID() >= 1 && trackID[1] == 0 && belleV0.chgd(1).get_ID() == chgIterator->get_ID()) {
573 trackID[1] = (int)(chgIterator->get_ID());
580 HepPoint3D dauPivot(belleV0.vx(), belleV0.vy(), belleV0.vz());
581 int trackFitPIndex = -1;
582 int trackFitMIndex = -1;
584 CLHEP::HepLorentzVector momentumP;
585 CLHEP::HepSymMatrix error7x7P(7, 0);
586 HepPoint3D positionP;
587 TMatrixFSym errMatrixP(7);
588 CLHEP::HepLorentzVector momentumM;
589 CLHEP::HepSymMatrix error7x7M(7, 0);
590 HepPoint3D positionM;
591 TMatrixFSym errMatrixM(7);
592 CLHEP::HepSymMatrix error5x5(5, 0);
593 if (trackID[0] >= 1) {
594 if (belleV0.daut()) {
595 std::vector<float> helixParam(5);
596 std::vector<float> helixError(15);
599 auto trackFitP =
m_trackFitResults.appendNew(helixParam, helixError, pTypeP, 0.5, -1, -1, 0);
600 trackFitPIndex = trackFitP->getArrayIndex();
607 for (
unsigned i = 0; i < 7; i++)
608 for (
unsigned j = 0; j < 7; j++)
609 errMatrixP(i, j) = error7x7P[i][j];
611 daughterP =
Particle(trackID[0] - 1, tmpTFR, pTypeP);
612 daughterP.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumP.px(), momentumP.py(), momentumP.pz(), momentumP.e()),
613 ROOT::Math::XYZVector(positionP.x(), positionP.y(), positionP.z()),
617 Belle::Mdst_trk_fit& trk_fit = charged_mag[trackID[0] - 1].trk().mhyp(belleHypP);
618 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
620 std::vector<float> helixParam(5);
621 std::vector<float> helixError(15);
622 convertHelix(trk_fit, HepPoint3D(0., 0., 0.), helixParam, helixError);
625 if (helixParam[2] == 0) {
626 B2WARNING(
"Helix parameter for curvature == 0. Skipping Track! The parameter is: " << helixParam[2] <<
"...");
630 auto trackFitP =
m_trackFitResults.appendNew(helixParam, helixError, pTypeP, pValue, -1, -1, 0);
632 trackFitPIndex = trackFitP->getArrayIndex();
634 daughterP =
Particle(trackID[0] - 1, trackFitP, pTypeP);
637 helixParam, error5x5,
638 momentumP, positionP, error7x7P);
640 for (
unsigned i = 0; i < 7; i++)
641 for (
unsigned j = 0; j < 7; j++)
642 errMatrixP(i, j) = error7x7P[i][j];
644 daughterP.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumP.px(), momentumP.py(), momentumP.pz(), momentumP.e()),
645 ROOT::Math::XYZVector(positionP.x(), positionP.y(), positionP.z()),
649 if (trackID[1] >= 1) {
650 if (belleV0.daut()) {
651 std::vector<float> helixParam(5);
652 std::vector<float> helixError(15);
655 auto trackFitM =
m_trackFitResults.appendNew(helixParam, helixError, pTypeM, 0.5, -1, -1, 0);
656 trackFitMIndex = trackFitM->getArrayIndex();
662 for (
unsigned i = 0; i < 7; i++)
663 for (
unsigned j = 0; j < 7; j++)
664 errMatrixM(i, j) = error7x7M[i][j];
666 daughterM =
Particle(trackID[1] - 1, tmpTFR, pTypeM);
667 daughterM.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumM.px(), momentumM.py(), momentumM.pz(), momentumM.e()),
668 ROOT::Math::XYZVector(positionM.x(), positionM.y(), positionM.z()),
672 Belle::Mdst_trk_fit& trk_fit = charged_mag[trackID[1] - 1].trk().mhyp(belleHypM);
673 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
675 std::vector<float> helixParam(5);
676 std::vector<float> helixError(15);
677 convertHelix(trk_fit, HepPoint3D(0., 0., 0.), helixParam, helixError);
680 if (helixParam[2] == 0) {
681 B2WARNING(
"Helix parameter for curvature == 0. Skipping Track! The parameter is: " << helixParam[2] <<
"...");
685 auto trackFitM =
m_trackFitResults.appendNew(helixParam, helixError, pTypeM, pValue, -1, -1, 0);
687 trackFitMIndex = trackFitM->getArrayIndex();
689 daughterM =
Particle(trackID[1] - 1, trackFitM, pTypeM);
692 helixParam, error5x5,
693 momentumM, positionM, error7x7M);
695 for (
unsigned i = 0; i < 7; i++)
696 for (
unsigned j = 0; j < 7; j++)
697 errMatrixM(i, j) = error7x7M[i][j];
699 daughterM.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumM.px(), momentumM.py(), momentumM.pz(), momentumM.e()),
700 ROOT::Math::XYZVector(positionM.x(), positionM.y(), positionM.z()),
711 m_v0s.appendNew(std::make_pair(trackP, trackFitP), std::make_pair(trackM, trackFitM));
721 newDaugP->addRelationTo(pidP);
723 newDaugP->addRelationTo(mcParticleP);
730 ROOT::Math::PxPyPzEVector v0Momentum(belleV0.px(), belleV0.py(), belleV0.pz(), belleV0.energy());
731 ROOT::Math::XYZVector v0Vertex(belleV0.vx(), belleV0.vy(), belleV0.vz());
737 auto appendVertexFitInfo = [](Belle::Mdst_vee2 & _belle_V0,
Particle & _belle2_V0) {
739 _belle2_V0.addExtraInfo(
"chiSquared", _belle_V0.chisq());
741 _belle2_V0.addExtraInfo(
"ndf", 1);
743 double prob = TMath::Prob(_belle_V0.chisq(), 1);
744 _belle2_V0.setPValue(prob);
748 if (belleV0.kind() == 1) {
753 appendVertexFitInfo(belleV0, KS);
755 ksPList->addParticle(newV0);
758 Belle::FindKs belleKSFinder;
759 belleKSFinder.candidates(belleV0, Belle::IpProfile::position(1));
796 }
else if (belleV0.kind() == 2) {
801 appendVertexFitInfo(belleV0, Lambda0);
803 lambda0PList->addParticle(newV0);
806 Belle::FindLambda lambdaFinder;
807 lambdaFinder.candidates(belleV0, Belle::IpProfile::position(1));
808 newV0->
addExtraInfo(
"goodLambda", lambdaFinder.goodLambda());
809 }
else if (belleV0.kind() == 3) {
810 Particle antiLambda0(v0Momentum, -3122);
814 appendVertexFitInfo(belleV0, antiLambda0);
816 antiLambda0PList->addParticle(newV0);
819 Belle::FindLambda lambdaFinder;
820 lambdaFinder.candidates(belleV0, Belle::IpProfile::position(1));
821 newV0->
addExtraInfo(
"goodLambda", lambdaFinder.goodLambda());
822 }
else if (belleV0.kind() == 4) {
827 appendVertexFitInfo(belleV0, gamma);
829 convGammaPList->addParticle(newV0);
833 if (belleV0.kind() <= 3) {
834 Belle::nisKsFinder ksnb;
835 double protIDP =
atcPID(pidP, 2, 4);
836 double protIDM =
atcPID(pidM, 2, 4);
837 ksnb.candidates(belleV0, Belle::IpProfile::position(1), momentumP, protIDP, protIDM);
842 if (belleV0.kind() == 1)
858 Belle::Gen_hepevt_Manager& genMgr = Belle::Gen_hepevt_Manager::get_manager();
859 if (genMgr.count() == 0)
862 typedef std::pair<MCParticleGraph::GraphParticle*, Belle::Gen_hepevt> halfFamily;
863 halfFamily currFamily;
865 std::queue < halfFamily > heritancesQueue;
871 for (Belle::Gen_hepevt_Manager::iterator genIterator = genMgr.begin();
872 genIterator != genMgr.end(); ++genIterator) {
873 Belle::Gen_hepevt hep = *genIterator;
875 if (!(hep.moFirst() == 0 && hep.moLast() == 0))
883 for (
int iDaughter = hep.daFirst(); iDaughter <= hep.daLast();
885 if (iDaughter == 0) {
886 B2DEBUG(95,
"Trying to access generated daughter with Panther ID == 0");
889 currFamily.first = graphParticle;
890 currFamily.second = genMgr(Belle::Panther_ID(iDaughter));
891 heritancesQueue.push(currFamily);
896 while (!heritancesQueue.empty()) {
897 currFamily = heritancesQueue.front();
898 heritancesQueue.pop();
901 Belle::Gen_hepevt& currDaughter = currFamily.second;
904 if (currDaughter.idhep() == 0)
918 int nGrandChildren = currDaughter.daLast() - currDaughter.daFirst() + 1;
920 if (nGrandChildren > 0 && currDaughter.daFirst() != 0) {
921 for (
int igrandchild = currDaughter.daFirst(); igrandchild <= currDaughter.daLast(); ++igrandchild) {
922 if (igrandchild == 0) {
923 B2DEBUG(95,
"Trying to access generated daughter with Panther ID == 0");
927 family.first = graphDaughter;
928 family.second = genMgr(Belle::Panther_ID(igrandchild));
929 heritancesQueue.push(family);
946 Belle::Mdst_ecl_Manager& ecl_manager = Belle::Mdst_ecl_Manager::get_manager();
947 Belle::Mdst_ecl_aux_Manager& ecl_aux_manager = Belle::Mdst_ecl_aux_Manager::get_manager();
949 for (Belle::Mdst_ecl_Manager::iterator eclIterator = ecl_manager.begin(); eclIterator != ecl_manager.end(); ++eclIterator) {
952 Belle::Mdst_ecl mdstEcl = *eclIterator;
953 Belle::Mdst_ecl_aux mdstEclAux(ecl_aux_manager(mdstEcl.get_ID()));
964 B2EclCluster->setConnectedRegionId(B2EclCluster->getArrayIndex() + 1);
965 B2EclCluster->setClusterId(1);
972 const Belle::Gen_hepevt& hep0 = get_hepevt(mdstEcl);
975 const Belle::Gen_hepevt* hep =
nullptr;
981 hep = &gen_level(hep0);
988 eclClustersToMCParticles.
add(B2EclCluster->getArrayIndex(), matchedMCParticleID);
991 B2DEBUG(79,
"Cannot find MCParticle corresponding to this gen_hepevt (Panther ID = " << hep->get_ID() <<
")");
992 B2DEBUG(79,
"Gen_hepevt: Panther ID = " << hep->get_ID() <<
"; idhep = " << hep->idhep() <<
"; isthep = " << hep->isthep());
1005 Belle::Mdst_klm_cluster_Manager& klm_cluster_manager = Belle::Mdst_klm_cluster_Manager::get_manager();
1007 for (Belle::Mdst_klm_cluster_Manager::iterator klmC_Ite = klm_cluster_manager.begin(); klmC_Ite != klm_cluster_manager.end();
1011 Belle::Mdst_klm_cluster mdstKlm_cluster = *klmC_Ite;
1034 plist->initialize(22,
"gamma:mdst");
1037 Belle::Mdst_gamma_Manager& gamma_manager = Belle::Mdst_gamma_Manager::get_manager();
1039 for (Belle::Mdst_gamma_Manager::iterator gammaIterator = gamma_manager.begin(); gammaIterator != gamma_manager.end();
1043 Belle::Mdst_gamma mdstGamma = *gammaIterator;
1044 Belle::Mdst_ecl mdstEcl = mdstGamma.ecl();
1058 plist->addParticle(B2Gamma);
1065 if (matchedMCParticle)
1075 plist->initialize(111,
"pi0:mdst");
1078 Belle::Mdst_pi0_Manager& pi0_manager = Belle::Mdst_pi0_Manager::get_manager();
1079 for (Belle::Mdst_pi0_Manager::iterator pi0Iterator = pi0_manager.begin(); pi0Iterator != pi0_manager.end(); ++pi0Iterator) {
1082 Belle::Mdst_pi0 mdstPi0 = *pi0Iterator;
1083 Belle::Mdst_gamma mdstGamma1 = mdstPi0.gamma(0);
1084 Belle::Mdst_gamma mdstGamma2 = mdstPi0.gamma(1);
1085 if (!mdstGamma1 || !mdstGamma2)
1088 ROOT::Math::PxPyPzEVector p4(mdstPi0.px(), mdstPi0.py(), mdstPi0.pz(), mdstPi0.energy());
1096 if (!B2Gamma1 || !B2Gamma2)
1110 double prob = TMath::Prob(mdstPi0.chisq(), 1);
1114 plist->addParticle(B2Pi0);
1127 plist->initialize(
Const::Klong.getPDGCode(),
"K_L0:mdst");
1129 Belle::Mdst_klong_Manager& klong_manager = Belle::Mdst_klong_Manager::get_manager();
1130 for (Belle::Mdst_klong_Manager::iterator klong_Ite = klong_manager.begin(); klong_Ite != klong_manager.end(); ++klong_Ite) {
1133 Belle::Mdst_klong mdstKlong = *klong_Ite;
1134 Belle::Mdst_klm_cluster mdstKlm = mdstKlong.klmc();
1146 B2KlmCluster->
setClusterPosition(mdstKlong.cos_x(), mdstKlong.cos_y(), mdstKlong.cos_z());
1153 plist->addParticle(B2Klong);
1164 Belle::Gen_hepevt_Manager& GenMgr = Belle::Gen_hepevt_Manager::get_manager();
1165 const double dang(15. / 180.*M_PI);
1167 for (Belle::Gen_hepevt_Manager::iterator klong_hep_it = GenMgr.begin(); klong_hep_it != GenMgr.end(); ++klong_hep_it) {
1171 CLHEP::HepLorentzVector gp4(klong_hep_it->PX(), klong_hep_it->PY(), klong_hep_it->PZ(), klong_hep_it->E());
1173 int bestRecKlongID(0);
1175 for (Belle::Mdst_klong_Manager::iterator klong_rec_it = klong_manager.begin(); klong_rec_it != klong_manager.end();
1179 if ((*klong_rec_it).ecl())
1181 CLHEP::Hep3Vector klp3(klong_rec_it->cos_x(), klong_rec_it->cos_y(), klong_rec_it->cos_z());
1183 if (cos(gp4.theta() - klp3.theta()) > cos(dang) && cos(gp4.phi() - klp3.phi()) > cos(dang)) {
1185 double tmp_sum = cos(gp4.theta() - klp3.theta()) + cos(gp4.phi() - klp3.phi());
1186 if (tmp_sum > sum) {
1195 particlesToMCParticles.
add(bestRecKlongID, matchedMCParticleID);
1210 Belle::Evtcls_flag_Manager& EvtFlagMgr = Belle::Evtcls_flag_Manager::get_manager();
1211 Belle::Evtcls_flag2_Manager& EvtFlag2Mgr = Belle::Evtcls_flag2_Manager::get_manager();
1214 Belle::Evtcls_hadronic_flag_Manager& EvtHadFlagMgr = Belle::Evtcls_hadronic_flag_Manager::get_manager();
1216 std::string name =
"evtcls_flag";
1217 std::string name_had =
"evtcls_hadronic_flag";
1219 std::vector<Belle::Evtcls_flag>::iterator eflagIterator = EvtFlagMgr.begin();
1220 std::vector<Belle::Evtcls_flag2>::iterator eflag2Iterator = EvtFlag2Mgr.begin();
1221 std::vector<Belle::Evtcls_hadronic_flag>::iterator ehadflagIterator = EvtHadFlagMgr.begin();
1224 std::vector<int> flag(20);
1225 for (
int index = 0; index < 20; ++index) {
1227 if (index == 14 || index == 16)
continue;
1228 std::string iVar = name + std::to_string(index);
1231 m_evtInfo->addExtraInfo(iVar, (*eflagIterator).flag(index));
1234 m_evtInfo->addExtraInfo(iVar, (*eflag2Iterator).flag(index - 10));
1236 B2DEBUG(99,
"evtcls_flag(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1240 for (
int index = 0; index < 6; ++index) {
1241 std::string iVar = name_had + std::to_string(index);
1242 m_evtInfo->addExtraInfo(iVar, (*ehadflagIterator).hadronic_flag(index));
1243 B2DEBUG(99,
"evtcls_hadronic_flag(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1258 if (
event->getExperiment() <= 27) {
1260 Belle::Rectrg_summary_Manager& RecTrgSummaryMgr = Belle::Rectrg_summary_Manager::get_manager();
1261 std::vector<Belle::Rectrg_summary>::iterator eflagIterator = RecTrgSummaryMgr.begin();
1262 std::string name_summary =
"rectrg_summary_m_final";
1265 for (
int index = 0; index < 2; ++index) {
1266 std::string iVar = name_summary + std::to_string(index);
1267 m_evtInfo->addExtraInfo(iVar, (*eflagIterator).final(index));
1268 B2DEBUG(99,
"m_final(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1272 Belle::Rectrg_summary3_Manager& RecTrgSummary3Mgr = Belle::Rectrg_summary3_Manager::get_manager();
1274 std::string name_summary3 =
"rectrg_summary3_m_final";
1276 std::vector<Belle::Rectrg_summary3>::iterator eflagIterator3 = RecTrgSummary3Mgr.begin();
1279 for (
int index = 0; index < 3; ++index) {
1280 std::string iVar = name_summary3 + std::to_string(index);
1281 m_evtInfo->addExtraInfo(iVar, (*eflagIterator3).final(index));
1282 B2DEBUG(99,
"m_final(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1296 static Belle::kid_acc acc_pdf(0);
1299 const double pmass[5] = { 0.00051099907, 0.105658389, 0.13956995, 0.493677, 0.93827231 };
1301 CLHEP::Hep3Vector mom(chg.px(), chg.py(), chg.pz());
1302 double cos_theta = mom.cosTheta();
1303 double pval = mom.mag();
1305 double npe = chg.acc().photo_electron();
1306 double beta = pval / sqrt(pval * pval + pmass[idp] * pmass[idp]);
1307 double pdfval = acc_pdf.npe2pdf(cos_theta, beta, npe);
1315 CLHEP::Hep3Vector mom(chg.px(), chg.py(), chg.pz());
1316 double pval = mom.mag();
1318 Belle::kid_cdc kidCdc(5);
1319 float factor0 = kidCdc.factor0();
1320 float factor1 = kidCdc.factor1(idp, pval);
1322 if (factor0 == 1.0 && factor1 == 1.0)
return chg.trk().pid(idp);
1324 double m = chg.trk().dEdx() / factor0;
1325 double e = chg.trk().dEdx_exp(idp) * factor1;
1326 double s = chg.trk().sigma_dEdx(idp);
1327 double val = 1. / sqrt(2.*M_PI) / s * exp(-0.5 * (m - e) * (m - e) / s / s);
1334 bool discard_allzero)
1336 if (discard_allzero) {
1337 const double max_l = *std::max_element(likelihoods, likelihoods +
c_nHyp);
1343 for (
int i = 0; i <
c_nHyp; i++) {
1344 float logl = log(likelihoods[i]);
1354 track->addRelationTo(pid);
1360 double likelihoods[
c_nHyp];
1364 for (
int i = 0; i <
c_nHyp; i++) {
1365 accL[i] = tofL[i] = cdcL[i] = 1.0;
1369 const auto& acc = belleTrack.acc();
1370 if (acc and acc.quality() == 0) {
1371 for (
int i = 0; i <
c_nHyp; i++)
1372 accL[i] = likelihoods[i] =
acc_pid(belleTrack, i);
1379 const Belle::Mdst_tof& tof = belleTrack.tof();
1380 if (tof and tof.quality() == 0) {
1381 for (
int i = 0; i <
c_nHyp; i++)
1382 tofL[i] = likelihoods[i] = tof.pid(i);
1389 const Belle::Mdst_trk& trk = belleTrack.trk();
1390 if (trk.dEdx() > 0) {
1391 for (
int i = 0; i <
c_nHyp; i++) {
1392 likelihoods[i] = trk.pid(i);
1393 cdcL[i] =
cdc_pid(belleTrack, i);
1407 Belle::eid electronID(belleTrack);
1408 float eclID_e_pdf = electronID.pdf_e_ecl();
1409 float eclID_h_pdf = electronID.pdf_h_ecl();
1410 float atcID_e_pdf = electronID.atc_pid_pdf(
true, accL, tofL, cdcL);
1411 float atcID_h_pdf = electronID.atc_pid_pdf(
false, accL, tofL, cdcL);
1414 float eclProb = eclID_e_pdf / (eclID_e_pdf + eclID_h_pdf);
1415 float atcProb = atcID_e_pdf / (atcID_e_pdf + atcID_h_pdf);
1417 if (atcProb > 0.999999) atcProb = 0.999999;
1419 double eidCombinedSig = eclProb * atcProb;
1420 double eidCombinedBkg = (1. - eclProb) * (1. - atcProb);
1422 likelihoods[0] = eidCombinedSig;
1424 likelihoods[2] = eidCombinedBkg;
1438 int muid_trackid = belleTrack.muid_ID();
1442 Belle::Mdst_klm_mu_ex_Manager& ex_mgr = Belle::Mdst_klm_mu_ex_Manager::get_manager();
1443 Belle::Mdst_klm_mu_ex& ex = ex_mgr(Belle::Panther_ID(muid_trackid));
1446 if (ex.Chi_2() > 0) {
1448 likelihoods[1] = ex.Muon_likelihood();
1449 likelihoods[2] = ex.Pion_likelihood();
1450 likelihoods[3] = ex.Kaon_likelihood();
1455 for (
int i = 0; i < 5; i++)
1456 if (likelihoods[i] < 0)
1481 const HepPoint3D& newPivot,
1482 std::vector<float>& helixParams,
1483 CLHEP::HepSymMatrix& error5x5,
1484 CLHEP::HepLorentzVector& momentum,
1485 HepPoint3D& position,
1486 CLHEP::HepSymMatrix& error7x7,
const double dPhi)
1488 const HepPoint3D pivot(trk_fit.pivot_x(),
1492 CLHEP::HepVector a(5);
1493 a[0] = trk_fit.helix(0);
1494 a[1] = trk_fit.helix(1);
1495 a[2] = trk_fit.helix(2);
1496 a[3] = trk_fit.helix(3);
1497 a[4] = trk_fit.helix(4);
1498 CLHEP::HepSymMatrix Ea(5, 0);
1499 Ea[0][0] = trk_fit.error(0);
1500 Ea[1][0] = trk_fit.error(1);
1501 Ea[1][1] = trk_fit.error(2);
1502 Ea[2][0] = trk_fit.error(3);
1503 Ea[2][1] = trk_fit.error(4);
1504 Ea[2][2] = trk_fit.error(5);
1505 Ea[3][0] = trk_fit.error(6);
1506 Ea[3][1] = trk_fit.error(7);
1507 Ea[3][2] = trk_fit.error(8);
1508 Ea[3][3] = trk_fit.error(9);
1509 Ea[4][0] = trk_fit.error(10);
1510 Ea[4][1] = trk_fit.error(11);
1511 Ea[4][2] = trk_fit.error(12);
1512 Ea[4][3] = trk_fit.error(13);
1513 Ea[4][4] = trk_fit.error(14);
1515 Belle::Helix helix(pivot, a, Ea);
1518 if (helix.kappa() > 0)
1523 if (newPivot.x() != 0. || newPivot.y() != 0. || newPivot.z() != 0.) {
1524 helix.pivot(newPivot);
1525 momentum = helix.momentum(dPhi, mass, position, error7x7);
1527 if (pivot.x() != 0. || pivot.y() != 0. || pivot.z() != 0.) {
1528 helix.pivot(HepPoint3D(0., 0., 0.));
1529 momentum = helix.momentum(dPhi, mass, position, error7x7);
1531 momentum = helix.momentum(dPhi, mass, position, error7x7);
1541 const HepPoint3D& newPivot,
1542 std::vector<float>& helixParams, std::vector<float>& helixError)
1544 const HepPoint3D pivot(trk_fit.pivot_x(),
1548 CLHEP::HepVector a(5);
1549 a[0] = trk_fit.helix(0);
1550 a[1] = trk_fit.helix(1);
1551 a[2] = trk_fit.helix(2);
1552 a[3] = trk_fit.helix(3);
1553 a[4] = trk_fit.helix(4);
1554 CLHEP::HepSymMatrix Ea(5, 0);
1555 Ea[0][0] = trk_fit.error(0);
1556 Ea[1][0] = trk_fit.error(1);
1557 Ea[1][1] = trk_fit.error(2);
1558 Ea[2][0] = trk_fit.error(3);
1559 Ea[2][1] = trk_fit.error(4);
1560 Ea[2][2] = trk_fit.error(5);
1561 Ea[3][0] = trk_fit.error(6);
1562 Ea[3][1] = trk_fit.error(7);
1563 Ea[3][2] = trk_fit.error(8);
1564 Ea[3][3] = trk_fit.error(9);
1565 Ea[4][0] = trk_fit.error(10);
1566 Ea[4][1] = trk_fit.error(11);
1567 Ea[4][2] = trk_fit.error(12);
1568 Ea[4][3] = trk_fit.error(13);
1569 Ea[4][4] = trk_fit.error(14);
1571 Belle::Helix helix(pivot, a, Ea);
1573 if (newPivot.x() != 0. || newPivot.y() != 0. || newPivot.z() != 0.) {
1574 helix.pivot(newPivot);
1576 if (pivot.x() != 0. || pivot.y() != 0. || pivot.z() != 0.) {
1577 helix.pivot(HepPoint3D(0., 0., 0.));
1581 CLHEP::HepSymMatrix error5x5(5, 0);
1584 unsigned int size = 5;
1585 unsigned int counter = 0;
1586 for (
unsigned int i = 0; i < size; i++)
1587 for (
unsigned int j = i; j < size; j++)
1588 helixError[counter++] = error5x5[i][j];
1593 CLHEP::HepVector a(5);
1594 CLHEP::HepSymMatrix Ea(5, 0);
1600 helixParams[0] = a[0];
1603 helixParams[1] = adjustAngleRange(a[1] + TMath::Pi() / 2.0);
1609 helixParams[3] = a[3];
1612 helixParams[4] = a[4];
1614 unsigned int size = 5;
1615 for (
unsigned int i = 0; i < size; i++) {
1616 for (
unsigned int j = 0; j < size; j++) {
1617 error5x5[i][j] = Ea[i][j];
1623 if (std::isinf(error5x5[i][j])) {
1624 B2DEBUG(99,
"Helix covariance matrix element found to be infinite. Setting value to DBL_MAX/2.0.");
1625 error5x5[i][j] = DBL_MAX / 2.0;
1633 Belle::Mdst_trk& trk = belleTrack.trk();
1635 for (
int mhyp = 0 ; mhyp <
c_nHyp; ++mhyp) {
1637 double thisMass = pType.
getMass();
1639 Belle::Mdst_trk_fit& trk_fit = trk.mhyp(mhyp);
1642 std::vector<float> helixParam(5);
1644 CLHEP::HepSymMatrix error5x5(5, 0);
1646 CLHEP::HepLorentzVector momentum;
1648 CLHEP::HepSymMatrix error7x7(7, 0);
1650 HepPoint3D position;
1653 helixParam, error5x5,
1654 momentum, position, error7x7, 0.0);
1656 std::vector<float> helixError(15);
1657 unsigned int size = 5;
1658 unsigned int counter = 0;
1659 for (
unsigned int i = 0; i < size; i++)
1660 for (
unsigned int j = i; j < size; j++)
1661 helixError[counter++] = error5x5[i][j];
1663 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
1670 for (
unsigned int i = 0; i < 3; i++)
1671 cdcNHits += trk_fit.nhits(i);
1679 double path_length = 0;
1680 double tof_sigma = 0;
1684 double dedx = trk.dEdx();
1685 short dedx_qual = trk.quality_dedx();
1687 const Belle::Mdst_tof& tof_obj = belleTrack.tof();
1689 tof = tof_obj.tof();
1690 path_length = tof_obj.path_length();
1691 tof_qual = tof_obj.quality();
1692 tof_sigma = tof_obj.sigma_tof();
1695 const Belle::Mdst_acc& acc_obj = belleTrack.acc();
1697 acc_ph = acc_obj.photo_electron();
1698 acc_qual = acc_obj.quality();
1702 auto cdcExtraInfo =
m_belleTrkExtra.appendNew(trk_fit.first_x(), trk_fit.first_y(), trk_fit.first_z(),
1703 trk_fit.last_x(), trk_fit.last_y(), trk_fit.last_z(),
1704 tof, path_length, tof_qual, tof_sigma,
1705 acc_ph, acc_qual, dedx, dedx_qual);
1706 track->addRelationTo(cdcExtraInfo);
1709 int svdHitPattern = trk_fit.hit_svd();
1713 std::bitset<32> svdBitSet(svdHitPattern);
1717 unsigned short svdLayers;
1721 std::bitset<32> svdUMask(
static_cast<std::string
>(
"00000000000000000000000000000011"));
1723 std::bitset<32> svdVMask;
1726 if (
event->getExperiment() <= 27) {
1727 svdVMask = svdUMask << 6;
1730 svdVMask = svdUMask << 8;
1735 for (
unsigned short layerId = 0; layerId < svdLayers; layerId++) {
1736 unsigned short uHits = (svdBitSet & svdUMask).count();
1737 unsigned short vHits = (svdBitSet & svdVMask).count();
1738 patternVxd.
setSVDLayer(layerId + 3, uHits, vHits);
1747 TMatrixDSym cartesianCovariance(6);
1748 for (
unsigned i = 0; i < 7; i++) {
1751 for (
unsigned j = 0; j < 7; j++) {
1759 BFIELD, cartesianCovariance, pValue);
1761 TMatrixDSym helixCovariance = helixFromCartesian.
getCovariance();
1764 for (
unsigned int i = 0; i < 5; ++i)
1765 for (
unsigned int j = i; j < 5; ++j)
1766 helixError[counter++] = helixCovariance(i, j);
1771 track->setTrackFitResultIndex(pType, trackFit->getArrayIndex());
1799 B2WARNING(
"Trying to convert Gen_hepevt with idhep = " << idHep <<
1800 ". This should never happen.");
1803 mcParticle->
setPDG(idHep);
1806 if (genHepevt.isthep() > 0) {
1810 mcParticle->
setMass(genHepevt.M());
1812 ROOT::Math::PxPyPzEVector p4(genHepevt.PX(), genHepevt.PY(), genHepevt.PZ(), genHepevt.E());
1819 if (genHepevt.daFirst() > 0) {
1820 Belle::Gen_hepevt_Manager& genMgr = Belle::Gen_hepevt_Manager::get_manager();
1821 Belle::Gen_hepevt daughterParticle = genMgr(Belle::Panther_ID(genHepevt.daFirst()));
1826 mcParticle->
setDecayTime(std::numeric_limits<float>::infinity());
1841 eclCluster->
setPhi(ecl.phi());
1843 eclCluster->
setR(ecl.r());
1846 double covarianceMatrix[6];
1847 covarianceMatrix[0] = ecl.error(0);
1848 covarianceMatrix[1] = ecl.error(1);
1849 covarianceMatrix[2] = ecl.error(2);
1850 covarianceMatrix[3] = ecl.error(3);
1851 covarianceMatrix[4] = ecl.error(4);
1852 covarianceMatrix[5] = ecl.error(5);
1855 eclCluster->
setLAT(eclAux.width());
1859 eclCluster->
setTime(eclAux.property(0));
1866 klmCluster->
setLayers(klm_cluster.layers());
1879 Belle::Mdst_ecl_trk_Manager& m = Belle::Mdst_ecl_trk_Manager::get_manager();
1880 Belle::Mdst_charged_Manager& chgMg = Belle::Mdst_charged_Manager::get_manager();
1885 std::vector<int> insert_order_types = {1, 2, 0};
1886 for (
auto& insert_type : insert_order_types) {
1887 for (Belle::Mdst_ecl_trk_Manager::iterator ecltrkIterator = m.begin(); ecltrkIterator != m.end(); ++ecltrkIterator) {
1888 Belle::Mdst_ecl_trk mECLTRK = *ecltrkIterator;
1890 if (mECLTRK.type() != insert_type)
1893 Belle::Mdst_ecl mdstEcl = mECLTRK.ecl();
1894 Belle::Mdst_trk mTRK = mECLTRK.trk();
1902 for (Belle::Mdst_charged_Manager::iterator chgIterator = chgMg.begin(); chgIterator != chgMg.end(); ++chgIterator) {
1903 Belle::Mdst_charged mChar = *chgIterator;
1904 Belle::Mdst_trk mTRK_in_charged = mChar.trk();
1906 if (mTRK_in_charged.get_ID() == mTRK.get_ID()) {
1908 tracksToECLClusters.
add(mChar.get_ID() - 1, mdstEcl.get_ID() - 1, 1.0);
1923 Belle::Mdst_klm_cluster_Manager& klm_cluster_manager = Belle::Mdst_klm_cluster_Manager::get_manager();
1926 for (Belle::Mdst_klm_cluster_Manager::iterator klmC_Ite = klm_cluster_manager.begin(); klmC_Ite != klm_cluster_manager.end();
1929 Belle::Mdst_klm_cluster mdstKlm_cluster = *klmC_Ite;
1930 Belle::Mdst_trk mTRK = mdstKlm_cluster.trk();
1931 Belle::Mdst_ecl mECL = mdstKlm_cluster.ecl();
1933 if (mTRK) klmClustersToTracks.
add(mdstKlm_cluster.get_ID() - 1, mTRK.get_ID() - 1);
1934 if (mECL) klmClustersToEclClusters.
add(mdstKlm_cluster.get_ID() - 1, mECL.get_ID() - 1);
1951 const int mask = 0x00f00000;
1952 int high_bits =
id & mask;
1953 if (high_bits == 0 || high_bits == mask)
return id;
2013 int bellePDGCode = belleMC.idhep();
2014 int belleIIPDGCode = mcP->
getPDG();
2016 if (bellePDGCode == 0)
2017 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to Gen_hepevt with idhep = 0.");
2019 if (bellePDGCode != belleIIPDGCode)
2020 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to different MCParticle! " << bellePDGCode <<
" vs. " <<
2023 const double belleMomentum[] = { belleMC.PX(), belleMC.PY(), belleMC.PZ() };
2026 for (
unsigned i = 0; i < 3; i++) {
2027 double relDev = (belle2Momentum[i] - belleMomentum[i]) / belleMomentum[i];
2029 if (relDev > 1e-3) {
2030 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to different MCParticle!");
2031 B2INFO(
" - Gen_hepevt [" << bellePDGCode <<
"] px/py/pz = " << belleMC.PX() <<
"/" << belleMC.PY() <<
"/" << belleMC.PZ());
2032 B2INFO(
" - TrackFitResult [" << belleIIPDGCode <<
"] px/py/pz = " << mcP->
get4Vector().Px() <<
"/" << mcP->
get4Vector().Py() <<
"/"
2040 CLHEP::HepLorentzVector& momentum, HepPoint3D& position, CLHEP::HepSymMatrix& error)
2042 const HepPoint3D pivot(vee.vx(), vee.vy(), vee.vz());
2043 CLHEP::HepVector a(5);
2044 CLHEP::HepSymMatrix Ea(5, 0);
2046 a[0] = vee.daut().helix_p(0); a[1] = vee.daut().helix_p(1);
2047 a[2] = vee.daut().helix_p(2); a[3] = vee.daut().helix_p(3);
2048 a[4] = vee.daut().helix_p(4);
2049 Ea[0][0] = vee.daut().error_p(0); Ea[1][0] = vee.daut().error_p(1);
2050 Ea[1][1] = vee.daut().error_p(2); Ea[2][0] = vee.daut().error_p(3);
2051 Ea[2][1] = vee.daut().error_p(4); Ea[2][2] = vee.daut().error_p(5);
2052 Ea[3][0] = vee.daut().error_p(6); Ea[3][1] = vee.daut().error_p(7);
2053 Ea[3][2] = vee.daut().error_p(8); Ea[3][3] = vee.daut().error_p(9);
2054 Ea[4][0] = vee.daut().error_p(10); Ea[4][1] = vee.daut().error_p(11);
2055 Ea[4][2] = vee.daut().error_p(12); Ea[4][3] = vee.daut().error_p(13);
2056 Ea[4][4] = vee.daut().error_p(14);
2058 a[0] = vee.daut().helix_m(0); a[1] = vee.daut().helix_m(1);
2059 a[2] = vee.daut().helix_m(2); a[3] = vee.daut().helix_m(3);
2060 a[4] = vee.daut().helix_m(4);
2061 Ea[0][0] = vee.daut().error_m(0); Ea[1][0] = vee.daut().error_m(1);
2062 Ea[1][1] = vee.daut().error_m(2); Ea[2][0] = vee.daut().error_m(3);
2063 Ea[2][1] = vee.daut().error_m(4); Ea[2][2] = vee.daut().error_m(5);
2064 Ea[3][0] = vee.daut().error_m(6); Ea[3][1] = vee.daut().error_m(7);
2065 Ea[3][2] = vee.daut().error_m(8); Ea[3][3] = vee.daut().error_m(9);
2066 Ea[4][0] = vee.daut().error_m(10); Ea[4][1] = vee.daut().error_m(11);
2067 Ea[4][2] = vee.daut().error_m(12); Ea[4][3] = vee.daut().error_m(13);
2068 Ea[4][4] = vee.daut().error_m(14);
2071 Belle::Helix helix(pivot, a, Ea);
2074 momentum = helix.momentum(0., pType.
getMass(), position, error);
2078 std::vector<float>& helixError)
2080 const HepPoint3D pivot(vee.vx(), vee.vy(), vee.vz());
2081 CLHEP::HepVector a(5);
2082 CLHEP::HepSymMatrix Ea(5, 0);
2084 a[0] = vee.daut().helix_p(0); a[1] = vee.daut().helix_p(1);
2085 a[2] = vee.daut().helix_p(2); a[3] = vee.daut().helix_p(3);
2086 a[4] = vee.daut().helix_p(4);
2087 Ea[0][0] = vee.daut().error_p(0);
2088 Ea[1][0] = vee.daut().error_p(1);
2089 Ea[1][1] = vee.daut().error_p(2);
2090 Ea[2][0] = vee.daut().error_p(3);
2091 Ea[2][1] = vee.daut().error_p(4);
2092 Ea[2][2] = vee.daut().error_p(5);
2093 Ea[3][0] = vee.daut().error_p(6);
2094 Ea[3][1] = vee.daut().error_p(7);
2095 Ea[3][2] = vee.daut().error_p(8);
2096 Ea[3][3] = vee.daut().error_p(9);
2097 Ea[4][0] = vee.daut().error_p(10);
2098 Ea[4][1] = vee.daut().error_p(11);
2099 Ea[4][2] = vee.daut().error_p(12);
2100 Ea[4][3] = vee.daut().error_p(13);
2101 Ea[4][4] = vee.daut().error_p(14);
2103 a[0] = vee.daut().helix_m(0); a[1] = vee.daut().helix_m(1);
2104 a[2] = vee.daut().helix_m(2); a[3] = vee.daut().helix_m(3);
2105 a[4] = vee.daut().helix_m(4);
2106 Ea[0][0] = vee.daut().error_m(0);
2107 Ea[1][0] = vee.daut().error_m(1);
2108 Ea[1][1] = vee.daut().error_m(2);
2109 Ea[2][0] = vee.daut().error_m(3);
2110 Ea[2][1] = vee.daut().error_m(4);
2111 Ea[2][2] = vee.daut().error_m(5);
2112 Ea[3][0] = vee.daut().error_m(6);
2113 Ea[3][1] = vee.daut().error_m(7);
2114 Ea[3][2] = vee.daut().error_m(8);
2115 Ea[3][3] = vee.daut().error_m(9);
2116 Ea[4][0] = vee.daut().error_m(10);
2117 Ea[4][1] = vee.daut().error_m(11);
2118 Ea[4][2] = vee.daut().error_m(12);
2119 Ea[4][3] = vee.daut().error_m(13);
2120 Ea[4][4] = vee.daut().error_m(14);
2123 Belle::Helix helix(pivot, a, Ea);
2126 helix.pivot(HepPoint3D(0., 0., 0.));
2128 CLHEP::HepSymMatrix error5x5(5, 0);
2131 unsigned int size = 5;
2132 unsigned int counter = 0;
2133 for (
unsigned int i = 0; i < size; i++)
2134 for (
unsigned int j = i; j < size; j++)
2135 helixError[counter++] = error5x5[i][j];
2139 const HepPoint3D& position,
2140 const CLHEP::HepSymMatrix& error,
2141 const short int charge,
2144 const uint64_t hitPatternCDCInitializer,
2145 const uint32_t hitPatternVXDInitializer,
2148 TVector3 pos(position.x(), position.y(), position.z());
2149 TVector3 mom(momentum.px(), momentum.py(), momentum.pz());
2151 TMatrixDSym errMatrix(6);
2152 for (
unsigned i = 0; i < 7; i++) {
2155 for (
unsigned j = 0; j < 7; j++) {
2166 return TrackFitResult(pos, mom, errMatrix, charge, pType, pValue,
BFIELD, hitPatternCDCInitializer, hitPatternVXDInitializer, ndf);
2171 if (!pid)
return 0.5;
2178 if (acc_sig + acc_bkg > 0.0)
2179 acc = acc_sig / (acc_sig + acc_bkg);
2186 double tof_all = tof_sig + tof_bkg;
2188 tof = tof_sig / tof_all;
2189 if (tof < 0.001) tof = 0.001;
2190 if (tof > 0.999) tof = 0.999;
2198 double cdc_all = cdc_sig + cdc_bkg;
2200 cdc = cdc_sig / cdc_all;
2201 if (cdc < 0.001) cdc = 0.001;
2202 if (cdc > 0.999) cdc = 0.999;
2206 double pid_sig = acc * tof * cdc;
2207 double pid_bkg = (1. - acc) * (1. - tof) * (1. - cdc);
2209 return pid_sig / (pid_sig + pid_bkg);
2215 B2DEBUG(99,
"B2BIIConvertMdst: endRun done.");
2221 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 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.
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...
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.
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.
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.
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.
void setIP(const TVector3 &ipPosition, const TMatrixDSym &covariance)
Set the IP position and its error matrix.
This class contains the measured average boost vector vec(beta) = (beta_x, beta_y,...
void setBoost(const TVector3 &boost, const TMatrixDSym &covariance)
Set the boost vector and its error matrix.
This class contains the measured average center-of-mass energy, which is equal to the invariant mass ...
void setMass(double mass, double error, double spread)
Set the CMS energy and its uncertainty.
Provides a type-safe way to pass members of the chargedStableSet set.
The ParticleType class for identifying different particle types.
int getPDGCode() const
PDG code.
double getMass() const
Particle mass.
A class for sets of detector IDs whose content is limited to restricted set of valid detector IDs.
static const ChargedStable muon
muon particle
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 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 setTheta(double theta)
Set Theta of Shower (radian).
void setPhi(double phi)
Set 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 Uncorrect Energy deposited (GeV).
void setTime(double time)
Set time information.
void setCovarianceMatrix(double covArray[6])
Set covariance matrix (3x3), i.e.
void setLAT(double LAT)
Set Lateral distribution parameter.
void setNumberOfCrystals(double noc)
Set number of crystals (sum of weights).
void setEnergy(double energy)
Set Corrected Energy (GeV).
void setIsTrack(bool istrack)
Set m_isTrack true if the cluster matches with a track.
void setR(double r)
Set R (in cm).
static double getAlpha(const double bZ)
Calculates the alpha value for a given magnetic field in Tesla.
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.
size_t size() const
Return the number of particles in the graph.
void generateList(const std::string &name="", int options=c_setNothing)
Generates the MCParticle list and stores it in the StoreArray with the given name.
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 setProductionVertex(const TVector3 &vertex)
Set production vertex position.
void setDecayVertex(const TVector3 &vertex)
Set decay vertex.
void setValidVertex(bool valid)
Set indication wether vertex and time information is valid or just default.
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 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.
void appendDaughter(const Particle *daughter, const bool updateType=true)
Appends index of daughter to daughters index array.
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.
TVector3 getMomentum() const
Getter for vector of momentum at closest approach of track in r/phi projection.
double getD0() const
Getter for d0.
double getTanLambda() const
Getter for tanLambda.
TVector3 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]
REG_MODULE(B2BIIConvertBeamParams)
Register the module.
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.
B2Vector3< double > B2Vector3D
typedef for common usage with double
void clear()
Reset particles and decay information to make the class reusable.
GraphParticle & addParticle()
Add new particle to the graph.
double charge(int pdgCode)
Returns electric charge of a particle with given pdg code.
Abstract base class for different kinds of events.