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 <analysis/dataobjects/ParticleExtraInfoMap.h>
27 #include <framework/dataobjects/EventMetaData.h>
28 #include <framework/dataobjects/Helix.h>
29 #include <framework/dataobjects/UncertainHelix.h>
32 #include <b2bii/utility/BelleMdstToGenHepevt.h>
35 #include <Math/RotationY.h>
36 #include <Math/Vector3D.h>
37 #include <Math/Vector4D.h>
45 #include "belle_legacy/eid/eid.h"
49 #include "belle_legacy/kid/kid_acc.h"
50 #include "belle_legacy/kid/kid_cdc.h"
54 #include "belle_legacy/findKs/findKs.h"
57 #ifdef HAVE_NISKSFINDER
58 #include "belle_legacy/nisKsFinder/nisKsFinder.h"
61 #ifdef HAVE_GOODLAMBDA
62 #include "belle_legacy/findLambda/findLambda.h"
65 #include "belle_legacy/benergy/BeamEnergy.h"
66 #include "belle_legacy/ip/IpProfile.h"
67 #include "belle_legacy/tables/evtcls.h"
68 #include "belle_legacy/tables/trg.h"
78 bool approximatelyEqual(
float a,
float b,
float epsilon)
80 return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
83 double adjustAngleRange(
double phi)
85 phi = phi - int(phi / TMath::TwoPi()) * TMath::TwoPi();
86 return phi - int(phi / TMath::Pi()) * TMath::TwoPi();
89 void fill7x7ErrorMatrix(
const TrackFitResult* tfr, TMatrixDSym& error7x7,
const double mass,
const double bField)
93 double d0 = tfr->
getD0();
101 double cosPhi0 = TMath::Cos(phi0);
102 double sinPhi0 = TMath::Sin(phi0);
106 rho = 1.0 / alpha / omega;
110 double energy = TMath::Sqrt(mass * mass + (1.0 + tanl * tanl) * rho * rho);
122 const int iOmega = 2;
126 TMatrixD jacobian(7, 5);
129 jacobian(iPx, iPhi0) = - fabs(rho) * sinPhi0;
130 jacobian(iPx, iOmega) = -
charge * rho * rho * cosPhi0 * alpha;
131 jacobian(iPy, iPhi0) = fabs(rho) * cosPhi0;
132 jacobian(iPy, iOmega) = -
charge * rho * rho * sinPhi0 * alpha;
133 jacobian(iPz, iOmega) = -
charge * rho * rho * tanl * alpha;
134 jacobian(iPz, iTanl) = fabs(rho);
135 if (omega != 0 && energy != 0) {
136 jacobian(iE, iOmega) = - (1.0 + tanl * tanl) * rho * rho / omega / energy;
137 jacobian(iE, iTanl) = tanl * rho * rho / energy;
139 jacobian(iE, iOmega) = (DBL_MAX);
140 jacobian(iE, iTanl) = (DBL_MAX);
142 jacobian(iX, iD0) = sinPhi0;
143 jacobian(iX, iPhi0) = d0 * cosPhi0;
144 jacobian(iY, iD0) = - cosPhi0;
145 jacobian(iY, iPhi0) = d0 * sinPhi0;
146 jacobian(iZ, iZ0) = 1.0;
150 error7x7 = error5x5.Similarity(jacobian);
162 m_mcMatchingMode(c_Direct)
165 setDescription(
"Converts Belle mDST objects (Panther tables and records) to Belle II mDST objects.");
168 "Convert beam parameters or use information stored in "
169 "Belle II database.",
true);
171 "Use 6x6 (position, momentum) covariance matrix for charged tracks instead of 5x5 (helix parameters) covariance matrix",
false);
173 "MC matching mode: 'Direct', or 'GeneratorLevel'",
174 std::string(
"Direct"));
176 "clusters with a E9/E25 value above this threshold are classified as neutral even if tracks are matched to their connected region (matchType == 2)",
180 addParam(
"nisKsInfo",
m_nisEnable,
"Flag to switch on conversion of nisKsFinder info",
true);
182 addParam(
"TrkExtra",
m_convertTrkExtra,
" Flag to switch on conversion of first_x,y,z and last_x,y,z from Mdst_trk_fit",
true);
183 addParam(
"convertNbar",
m_convertNbar,
" Flag to switch on conversion of nbar:mdst (copy from gamma:mdst)",
false);
187 B2DEBUG(1,
"B2BIIConvertMdst: Constructor done.");
205 B2INFO(
"B2BIIConvertMdst: initialized.");
207 B2WARNING(
"nisKsFinder output has been disabled. ksnbVLike, ksnbNoLam, ksnbStandard will not be converted.");
212 B2DEBUG(99,
"[B2BIIConvertMdstModule::initializeDataStore] initialization of DataStore started");
219 m_v0s.registerInDataStore();
262 B2DEBUG(99,
"[B2BIIConvertMdstModule::initializeDataStore] initialization of DataStore ended");
268 B2DEBUG(99,
"B2BIIConvertMdst: beginRun called.");
272 Belle::BeamEnergy::begin_run();
274 Belle::BeamEnergy::dump();
277 Belle::IpProfile::begin_run();
279 Belle::IpProfile::dump();
280 bool usableIP = Belle::IpProfile::usable();
281 B2DEBUG(99,
"B2BIIConvertMdst: IpProfile is usable = " << usableIP);
286 Belle::eid::init_data();
287 Belle::eid::show_use(
"ALL");
296 Belle::Belle_event_Manager& evman = Belle::Belle_event_Manager::get_manager();
297 Belle::Belle_event& evt = evman[0];
299 if (evt.ExpMC() == 2)
312 B2INFO(
"No database entry for this run yet, create one");
320 B2ERROR(
"BeamParameters from condition database are different from converted "
321 "ones, overriding database. Did you make sure the globaltag B2BII is used?");
323 B2INFO(
"BeamSpot, BoostVector, and InvariantMass from condition database are different from converted "
324 "ones, overriding database");
327 B2FATAL(
"Cannot reliably override the Database content in parallel processing "
328 "mode, please run the conversion in single processing mode");
383 const double Eher = Belle::BeamEnergy::E_HER();
384 const double Eler = Belle::BeamEnergy::E_LER();
385 const double crossingAngle = Belle::BeamEnergy::Cross_angle();
386 const double angleLer = M_PI;
387 const double angleHer = crossingAngle;
389 TMatrixDSym covariance(0);
390 HepLorentzVector p_beam = Belle::BeamEnergy::p_beam();
393 ROOT::Math::PxPyPzEVector P_her(0.0, 0.0, TMath::Sqrt(Eher * Eher - mass_e * mass_e), Eher);
394 ROOT::Math::RotationY rotateAroundYAxis(angleHer);
395 P_her = rotateAroundYAxis(P_her);
396 ROOT::Math::PxPyPzEVector P_ler(0.0, 0.0, TMath::Sqrt(Eler * Eler - mass_e * mass_e), Eler);
397 rotateAroundYAxis.SetAngle(angleLer);
398 P_ler = rotateAroundYAxis(P_ler);
401 ROOT::Math::PxPyPzEVector P_beam = P_her + P_ler;
406 B2DEBUG(99,
"Beam Energy: E_HER = " << Eher <<
"; E_LER = " << Eler <<
"; angle = " << crossingAngle);
407 B2DEBUG(99,
"Beam Momentum (pre-convert) : P_X = " << p_beam.px() <<
"; P_Y = " << p_beam.py() <<
"; P_Z = " << p_beam.pz());
408 B2DEBUG(99,
"Beam Momentum (post-convert) : P_X = " << P_beam.Px() <<
"; P_Y = " << P_beam.Py() <<
"; P_Z = " << P_beam.Pz());
413 if (!Belle::IpProfile::usable()) {
418 TVector3(std::numeric_limits<double>::quiet_NaN(),
419 std::numeric_limits<double>::quiet_NaN(),
420 std::numeric_limits<double>::quiet_NaN()
421 ), TMatrixTSym<double>()
427 CLHEP::HepSymMatrix ipErr;
430 ip = Belle::IpProfile::position();
431 ipErr = Belle::IpProfile::position_err();
434 Belle::IpProfile::set_evtbin_number();
438 ip = Belle::IpProfile::e_position();
439 ipErr = Belle::IpProfile::e_position_err();
444 TMatrixDSym cov(ipErr.num_col());
445 for (
int i = 0; i < ipErr.num_row(); ++i) {
446 for (
int j = 0; j < ipErr.num_col(); ++j) {
447 cov(i, j) = ipErr(i + 1, j + 1);
459 Belle::Mdst_charged_Manager& m = Belle::Mdst_charged_Manager::get_manager();
460 for (Belle::Mdst_charged_Manager::iterator chargedIterator = m.begin(); chargedIterator != m.end(); ++chargedIterator) {
461 Belle::Mdst_charged belleTrack = *chargedIterator;
475 const Belle::Gen_hepevt& hep0 = get_hepevt(belleTrack);
478 const Belle::Gen_hepevt* hep =
nullptr;
484 hep = &gen_level(hep0);
492 tracksToMCParticles.
add(track->getArrayIndex(), matchedMCParticle);
496 B2DEBUG(99,
"Can not find MCParticle corresponding to this gen_hepevt (Panther ID = " << hep->get_ID() <<
")");
497 B2DEBUG(99,
"Gen_hepevt: Panther ID = " << hep->get_ID() <<
"; idhep = " << hep->idhep() <<
"; isthep = " << hep->isthep());
507 ksPList->initialize(310, ksPList.
getName());
512 lambda0PList->initialize(3122, lambda0PList.
getName());
515 antiLambda0PList.
create();
516 antiLambda0PList->initialize(-3122, antiLambda0PList.
getName());
518 antiLambda0PList->bindAntiParticleList(*lambda0PList);
523 convGammaPList->initialize(22, convGammaPList.
getName());
526 Belle::Mdst_vee2_Manager& m = Belle::Mdst_vee2_Manager::get_manager();
527 for (Belle::Mdst_vee2_Manager::iterator vee2Iterator = m.begin(); vee2Iterator != m.end(); ++vee2Iterator) {
528 Belle::Mdst_vee2 belleV0 = *vee2Iterator;
531 Belle::Mdst_charged belleTrackP = belleV0.chgd(0);
533 Belle::Mdst_charged belleTrackM = belleV0.chgd(1);
541 switch (belleV0.kind()) {
567 B2WARNING(
"Conversion of vee2 candidate of unknown kind! kind = " << belleV0.kind());
571 int trackID[2] = {0, 0};
573 Belle::Mdst_charged_Manager& charged_mag = Belle::Mdst_charged_Manager::get_manager();
574 for (std::vector<Belle::Mdst_charged>::iterator chgIterator = charged_mag.begin(); chgIterator != charged_mag.end();
576 if (belleV0.chgd(0).get_ID() >= 1 && trackID[0] == 0 && belleV0.chgd(0).get_ID() == chgIterator->get_ID()) {
577 trackID[0] = (int)(chgIterator->get_ID());
580 if (belleV0.chgd(1).get_ID() >= 1 && trackID[1] == 0 && belleV0.chgd(1).get_ID() == chgIterator->get_ID()) {
581 trackID[1] = (int)(chgIterator->get_ID());
588 HepPoint3D dauPivot(belleV0.vx(), belleV0.vy(), belleV0.vz());
589 int trackFitPIndex = -1;
590 int trackFitMIndex = -1;
592 CLHEP::HepLorentzVector momentumP;
593 CLHEP::HepSymMatrix error7x7P(7, 0);
594 HepPoint3D positionP;
595 TMatrixFSym errMatrixP(7);
596 CLHEP::HepLorentzVector momentumM;
597 CLHEP::HepSymMatrix error7x7M(7, 0);
598 HepPoint3D positionM;
599 TMatrixFSym errMatrixM(7);
600 CLHEP::HepSymMatrix error5x5(5, 0);
601 if (trackID[0] >= 1) {
602 if (belleV0.daut()) {
603 std::vector<float> helixParam(5);
604 std::vector<float> helixError(15);
607 auto trackFitP =
m_trackFitResults.appendNew(helixParam, helixError, pTypeP, 0.5, -1, -1, 0);
608 trackFitPIndex = trackFitP->getArrayIndex();
615 for (
unsigned i = 0; i < 7; i++)
616 for (
unsigned j = 0; j < 7; j++)
617 errMatrixP(i, j) = error7x7P[i][j];
619 daughterP =
Particle(trackID[0] - 1, tmpTFR, pTypeP);
620 daughterP.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumP.px(), momentumP.py(), momentumP.pz(), momentumP.e()),
621 ROOT::Math::XYZVector(positionP.x(), positionP.y(), positionP.z()),
625 Belle::Mdst_trk_fit& trk_fit = charged_mag[trackID[0] - 1].trk().mhyp(belleHypP);
626 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
628 std::vector<float> helixParam(5);
629 std::vector<float> helixError(15);
630 convertHelix(trk_fit, HepPoint3D(0., 0., 0.), helixParam, helixError);
633 if (helixParam[2] == 0) {
634 B2WARNING(
"Helix parameter for curvature == 0. Skipping Track! The parameter is: " << helixParam[2] <<
"...");
638 auto trackFitP =
m_trackFitResults.appendNew(helixParam, helixError, pTypeP, pValue, -1, -1, 0);
640 trackFitPIndex = trackFitP->getArrayIndex();
642 daughterP =
Particle(trackID[0] - 1, trackFitP, pTypeP);
645 helixParam, error5x5,
646 momentumP, positionP, error7x7P);
648 for (
unsigned i = 0; i < 7; i++)
649 for (
unsigned j = 0; j < 7; j++)
650 errMatrixP(i, j) = error7x7P[i][j];
652 daughterP.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumP.px(), momentumP.py(), momentumP.pz(), momentumP.e()),
653 ROOT::Math::XYZVector(positionP.x(), positionP.y(), positionP.z()),
657 if (trackID[1] >= 1) {
658 if (belleV0.daut()) {
659 std::vector<float> helixParam(5);
660 std::vector<float> helixError(15);
663 auto trackFitM =
m_trackFitResults.appendNew(helixParam, helixError, pTypeM, 0.5, -1, -1, 0);
664 trackFitMIndex = trackFitM->getArrayIndex();
670 for (
unsigned i = 0; i < 7; i++)
671 for (
unsigned j = 0; j < 7; j++)
672 errMatrixM(i, j) = error7x7M[i][j];
674 daughterM =
Particle(trackID[1] - 1, tmpTFR, pTypeM);
675 daughterM.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumM.px(), momentumM.py(), momentumM.pz(), momentumM.e()),
676 ROOT::Math::XYZVector(positionM.x(), positionM.y(), positionM.z()),
680 Belle::Mdst_trk_fit& trk_fit = charged_mag[trackID[1] - 1].trk().mhyp(belleHypM);
681 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
683 std::vector<float> helixParam(5);
684 std::vector<float> helixError(15);
685 convertHelix(trk_fit, HepPoint3D(0., 0., 0.), helixParam, helixError);
688 if (helixParam[2] == 0) {
689 B2WARNING(
"Helix parameter for curvature == 0. Skipping Track! The parameter is: " << helixParam[2] <<
"...");
693 auto trackFitM =
m_trackFitResults.appendNew(helixParam, helixError, pTypeM, pValue, -1, -1, 0);
695 trackFitMIndex = trackFitM->getArrayIndex();
697 daughterM =
Particle(trackID[1] - 1, trackFitM, pTypeM);
700 helixParam, error5x5,
701 momentumM, positionM, error7x7M);
703 for (
unsigned i = 0; i < 7; i++)
704 for (
unsigned j = 0; j < 7; j++)
705 errMatrixM(i, j) = error7x7M[i][j];
707 daughterM.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumM.px(), momentumM.py(), momentumM.pz(), momentumM.e()),
708 ROOT::Math::XYZVector(positionM.x(), positionM.y(), positionM.z()),
719 m_v0s.appendNew(std::make_pair(trackP, trackFitP), std::make_pair(trackM, trackFitM));
729 newDaugP->addRelationTo(pidP);
731 newDaugP->addRelationTo(mcParticleP);
738 ROOT::Math::PxPyPzEVector v0Momentum(belleV0.px(), belleV0.py(), belleV0.pz(), belleV0.energy());
739 ROOT::Math::XYZVector v0Vertex(belleV0.vx(), belleV0.vy(), belleV0.vz());
745 auto appendVertexFitInfo = [](Belle::Mdst_vee2 & _belle_V0,
Particle & _belle2_V0) {
747 _belle2_V0.addExtraInfo(
"chiSquared", _belle_V0.chisq());
749 _belle2_V0.addExtraInfo(
"ndf", 1);
751 double prob = TMath::Prob(_belle_V0.chisq(), 1);
752 _belle2_V0.setPValue(prob);
756 if (belleV0.kind() == 1) {
761 appendVertexFitInfo(belleV0, KS);
763 ksPList->addParticle(newV0);
766 Belle::FindKs belleKSFinder;
767 belleKSFinder.candidates(belleV0, Belle::IpProfile::position(1));
804 }
else if (belleV0.kind() == 2) {
809 appendVertexFitInfo(belleV0, Lambda0);
811 lambda0PList->addParticle(newV0);
814 Belle::FindLambda lambdaFinder;
815 lambdaFinder.candidates(belleV0, Belle::IpProfile::position(1));
816 newV0->
addExtraInfo(
"goodLambda", lambdaFinder.goodLambda());
817 }
else if (belleV0.kind() == 3) {
818 Particle antiLambda0(v0Momentum, -3122);
822 appendVertexFitInfo(belleV0, antiLambda0);
824 antiLambda0PList->addParticle(newV0);
827 Belle::FindLambda lambdaFinder;
828 lambdaFinder.candidates(belleV0, Belle::IpProfile::position(1));
829 newV0->
addExtraInfo(
"goodLambda", lambdaFinder.goodLambda());
830 }
else if (belleV0.kind() == 4) {
835 appendVertexFitInfo(belleV0, gamma);
837 convGammaPList->addParticle(newV0);
841 if (belleV0.kind() <= 3) {
842 Belle::nisKsFinder ksnb;
843 double protIDP =
atcPID(pidP, 2, 4);
844 double protIDM =
atcPID(pidM, 2, 4);
845 ksnb.candidates(belleV0, Belle::IpProfile::position(1), momentumP, protIDP, protIDM);
850 if (belleV0.kind() == 1)
866 Belle::Gen_hepevt_Manager& genMgr = Belle::Gen_hepevt_Manager::get_manager();
867 if (genMgr.count() == 0)
870 typedef std::pair<MCParticleGraph::GraphParticle*, Belle::Gen_hepevt> halfFamily;
871 halfFamily currFamily;
873 std::queue < halfFamily > heritancesQueue;
879 for (Belle::Gen_hepevt_Manager::iterator genIterator = genMgr.begin();
880 genIterator != genMgr.end(); ++genIterator) {
881 Belle::Gen_hepevt hep = *genIterator;
883 if (!(hep.moFirst() == 0 && hep.moLast() == 0))
891 for (
int iDaughter = hep.daFirst(); iDaughter <= hep.daLast();
893 if (iDaughter == 0) {
894 B2DEBUG(95,
"Trying to access generated daughter with Panther ID == 0");
897 currFamily.first = graphParticle;
898 currFamily.second = genMgr(Belle::Panther_ID(iDaughter));
899 heritancesQueue.push(currFamily);
904 while (!heritancesQueue.empty()) {
905 currFamily = heritancesQueue.front();
906 heritancesQueue.pop();
909 Belle::Gen_hepevt& currDaughter = currFamily.second;
912 if (currDaughter.idhep() == 0)
926 int nGrandChildren = currDaughter.daLast() - currDaughter.daFirst() + 1;
928 if (nGrandChildren > 0 && currDaughter.daFirst() != 0) {
929 for (
int igrandchild = currDaughter.daFirst(); igrandchild <= currDaughter.daLast(); ++igrandchild) {
930 if (igrandchild == 0) {
931 B2DEBUG(95,
"Trying to access generated daughter with Panther ID == 0");
935 family.first = graphDaughter;
936 family.second = genMgr(Belle::Panther_ID(igrandchild));
937 heritancesQueue.push(family);
954 Belle::Mdst_ecl_Manager& ecl_manager = Belle::Mdst_ecl_Manager::get_manager();
955 Belle::Mdst_ecl_aux_Manager& ecl_aux_manager = Belle::Mdst_ecl_aux_Manager::get_manager();
957 for (Belle::Mdst_ecl_Manager::iterator eclIterator = ecl_manager.begin(); eclIterator != ecl_manager.end(); ++eclIterator) {
960 Belle::Mdst_ecl mdstEcl = *eclIterator;
961 Belle::Mdst_ecl_aux mdstEclAux(ecl_aux_manager(mdstEcl.get_ID()));
972 B2EclCluster->setConnectedRegionId(B2EclCluster->getArrayIndex() + 1);
973 B2EclCluster->setClusterId(1);
980 const Belle::Gen_hepevt& hep0 = get_hepevt(mdstEcl);
983 const Belle::Gen_hepevt* hep =
nullptr;
989 hep = &gen_level(hep0);
996 eclClustersToMCParticles.
add(B2EclCluster->getArrayIndex(), matchedMCParticleID);
999 B2DEBUG(79,
"Cannot find MCParticle corresponding to this gen_hepevt (Panther ID = " << hep->get_ID() <<
")");
1000 B2DEBUG(79,
"Gen_hepevt: Panther ID = " << hep->get_ID() <<
"; idhep = " << hep->idhep() <<
"; isthep = " << hep->isthep());
1013 Belle::Mdst_klm_cluster_Manager& klm_cluster_manager = Belle::Mdst_klm_cluster_Manager::get_manager();
1015 for (Belle::Mdst_klm_cluster_Manager::iterator klmC_Ite = klm_cluster_manager.begin(); klmC_Ite != klm_cluster_manager.end();
1019 Belle::Mdst_klm_cluster mdstKlm_cluster = *klmC_Ite;
1042 plist->initialize(22,
"gamma:mdst");
1045 Belle::Mdst_gamma_Manager& gamma_manager = Belle::Mdst_gamma_Manager::get_manager();
1047 for (Belle::Mdst_gamma_Manager::iterator gammaIterator = gamma_manager.begin(); gammaIterator != gamma_manager.end();
1051 Belle::Mdst_gamma mdstGamma = *gammaIterator;
1052 Belle::Mdst_ecl mdstEcl = mdstGamma.ecl();
1066 plist->addParticle(B2Gamma);
1073 if (matchedMCParticle)
1084 B2DEBUG(99,
"Getting gamma:mdst in copyNbarFromGamma");
1086 for (
const Particle& gamma : *plist_gamma) {
1087 auto* eclCluster = gamma.getECLCluster();
1090 B2DEBUG(99,
"Copying anti-n0:mdst from gamma:mdst");
1092 plist->addParticle(nbar);
1099 if (matchedMCParticle)
1109 plist->initialize(111,
"pi0:mdst");
1112 Belle::Mdst_pi0_Manager& pi0_manager = Belle::Mdst_pi0_Manager::get_manager();
1113 for (Belle::Mdst_pi0_Manager::iterator pi0Iterator = pi0_manager.begin(); pi0Iterator != pi0_manager.end(); ++pi0Iterator) {
1116 Belle::Mdst_pi0 mdstPi0 = *pi0Iterator;
1117 Belle::Mdst_gamma mdstGamma1 = mdstPi0.gamma(0);
1118 Belle::Mdst_gamma mdstGamma2 = mdstPi0.gamma(1);
1119 if (!mdstGamma1 || !mdstGamma2)
1122 ROOT::Math::PxPyPzEVector p4(mdstPi0.px(), mdstPi0.py(), mdstPi0.pz(), mdstPi0.energy());
1130 if (!B2Gamma1 || !B2Gamma2)
1144 double prob = TMath::Prob(mdstPi0.chisq(), 1);
1148 plist->addParticle(B2Pi0);
1161 plist->initialize(
Const::Klong.getPDGCode(),
"K_L0:mdst");
1163 Belle::Mdst_klong_Manager& klong_manager = Belle::Mdst_klong_Manager::get_manager();
1164 for (Belle::Mdst_klong_Manager::iterator klong_Ite = klong_manager.begin(); klong_Ite != klong_manager.end(); ++klong_Ite) {
1167 Belle::Mdst_klong mdstKlong = *klong_Ite;
1168 Belle::Mdst_klm_cluster mdstKlm = mdstKlong.klmc();
1180 B2KlmCluster->
setClusterPosition(mdstKlong.cos_x(), mdstKlong.cos_y(), mdstKlong.cos_z());
1187 plist->addParticle(B2Klong);
1198 Belle::Gen_hepevt_Manager& GenMgr = Belle::Gen_hepevt_Manager::get_manager();
1199 const double dang(15. / 180.*M_PI);
1201 for (Belle::Gen_hepevt_Manager::iterator klong_hep_it = GenMgr.begin(); klong_hep_it != GenMgr.end(); ++klong_hep_it) {
1205 CLHEP::HepLorentzVector gp4(klong_hep_it->PX(), klong_hep_it->PY(), klong_hep_it->PZ(), klong_hep_it->E());
1207 int bestRecKlongID(0);
1209 for (Belle::Mdst_klong_Manager::iterator klong_rec_it = klong_manager.begin(); klong_rec_it != klong_manager.end();
1213 if ((*klong_rec_it).ecl())
1215 CLHEP::Hep3Vector klp3(klong_rec_it->cos_x(), klong_rec_it->cos_y(), klong_rec_it->cos_z());
1217 if (cos(gp4.theta() - klp3.theta()) > cos(dang) && cos(gp4.phi() - klp3.phi()) > cos(dang)) {
1219 double tmp_sum = cos(gp4.theta() - klp3.theta()) + cos(gp4.phi() - klp3.phi());
1220 if (tmp_sum > sum) {
1229 particlesToMCParticles.
add(bestRecKlongID, matchedMCParticleID);
1244 Belle::Evtcls_flag_Manager& EvtFlagMgr = Belle::Evtcls_flag_Manager::get_manager();
1245 Belle::Evtcls_flag2_Manager& EvtFlag2Mgr = Belle::Evtcls_flag2_Manager::get_manager();
1248 Belle::Evtcls_hadronic_flag_Manager& EvtHadFlagMgr = Belle::Evtcls_hadronic_flag_Manager::get_manager();
1250 std::string name =
"evtcls_flag";
1251 std::string name_had =
"evtcls_hadronic_flag";
1253 std::vector<Belle::Evtcls_flag>::iterator eflagIterator = EvtFlagMgr.begin();
1254 std::vector<Belle::Evtcls_flag2>::iterator eflag2Iterator = EvtFlag2Mgr.begin();
1255 std::vector<Belle::Evtcls_hadronic_flag>::iterator ehadflagIterator = EvtHadFlagMgr.begin();
1258 std::vector<int> flag(20);
1259 for (
int index = 0; index < 20; ++index) {
1261 if (index == 14 || index == 16)
continue;
1262 std::string iVar = name + std::to_string(index);
1265 m_evtInfo->addExtraInfo(iVar, (*eflagIterator).flag(index));
1268 m_evtInfo->addExtraInfo(iVar, (*eflag2Iterator).flag(index - 10));
1270 B2DEBUG(99,
"evtcls_flag(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1274 for (
int index = 0; index < 6; ++index) {
1275 std::string iVar = name_had + std::to_string(index);
1276 m_evtInfo->addExtraInfo(iVar, (*ehadflagIterator).hadronic_flag(index));
1277 B2DEBUG(99,
"evtcls_hadronic_flag(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1292 if (
event->getExperiment() <= 27) {
1294 Belle::Rectrg_summary_Manager& RecTrgSummaryMgr = Belle::Rectrg_summary_Manager::get_manager();
1295 std::vector<Belle::Rectrg_summary>::iterator eflagIterator = RecTrgSummaryMgr.begin();
1296 std::string name_summary =
"rectrg_summary_m_final";
1299 for (
int index = 0; index < 2; ++index) {
1300 std::string iVar = name_summary + std::to_string(index);
1301 m_evtInfo->addExtraInfo(iVar, (*eflagIterator).final(index));
1302 B2DEBUG(99,
"m_final(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1306 Belle::Rectrg_summary3_Manager& RecTrgSummary3Mgr = Belle::Rectrg_summary3_Manager::get_manager();
1308 std::string name_summary3 =
"rectrg_summary3_m_final";
1310 std::vector<Belle::Rectrg_summary3>::iterator eflagIterator3 = RecTrgSummary3Mgr.begin();
1313 for (
int index = 0; index < 3; ++index) {
1314 std::string iVar = name_summary3 + std::to_string(index);
1315 m_evtInfo->addExtraInfo(iVar, (*eflagIterator3).final(index));
1316 B2DEBUG(99,
"m_final(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1330 static Belle::kid_acc acc_pdf(0);
1333 const double pmass[5] = { 0.00051099907, 0.105658389, 0.13956995, 0.493677, 0.93827231 };
1335 CLHEP::Hep3Vector mom(chg.px(), chg.py(), chg.pz());
1336 double cos_theta = mom.cosTheta();
1337 double pval = mom.mag();
1339 double npe = chg.acc().photo_electron();
1340 double beta = pval / sqrt(pval * pval + pmass[idp] * pmass[idp]);
1341 double pdfval = acc_pdf.npe2pdf(cos_theta, beta, npe);
1349 CLHEP::Hep3Vector mom(chg.px(), chg.py(), chg.pz());
1350 double pval = mom.mag();
1352 Belle::kid_cdc kidCdc(5);
1353 float factor0 = kidCdc.factor0();
1354 float factor1 = kidCdc.factor1(idp, pval);
1356 if (factor0 == 1.0 && factor1 == 1.0)
return chg.trk().pid(idp);
1358 double m = chg.trk().dEdx() / factor0;
1359 double e = chg.trk().dEdx_exp(idp) * factor1;
1360 double s = chg.trk().sigma_dEdx(idp);
1361 double val = 1. / sqrt(2.*M_PI) / s * exp(-0.5 * (m - e) * (m - e) / s / s);
1368 bool discard_allzero)
1370 if (discard_allzero) {
1371 const double max_l = *std::max_element(likelihoods, likelihoods +
c_nHyp);
1377 for (
int i = 0; i <
c_nHyp; i++) {
1378 float logl = log(likelihoods[i]);
1388 track->addRelationTo(pid);
1394 double likelihoods[
c_nHyp];
1398 for (
int i = 0; i <
c_nHyp; i++) {
1399 accL[i] = tofL[i] = cdcL[i] = 1.0;
1403 const auto& acc = belleTrack.acc();
1404 if (acc and acc.quality() == 0) {
1405 for (
int i = 0; i <
c_nHyp; i++)
1406 accL[i] = likelihoods[i] =
acc_pid(belleTrack, i);
1413 const Belle::Mdst_tof& tof = belleTrack.tof();
1414 if (tof and tof.quality() == 0) {
1415 for (
int i = 0; i <
c_nHyp; i++)
1416 tofL[i] = likelihoods[i] = tof.pid(i);
1423 const Belle::Mdst_trk& trk = belleTrack.trk();
1424 if (trk.dEdx() > 0) {
1425 for (
int i = 0; i <
c_nHyp; i++) {
1426 likelihoods[i] = trk.pid(i);
1427 cdcL[i] =
cdc_pid(belleTrack, i);
1441 Belle::eid electronID(belleTrack);
1442 float eclID_e_pdf = electronID.pdf_e_ecl();
1443 float eclID_h_pdf = electronID.pdf_h_ecl();
1444 float atcID_e_pdf = electronID.atc_pid_pdf(
true, accL, tofL, cdcL);
1445 float atcID_h_pdf = electronID.atc_pid_pdf(
false, accL, tofL, cdcL);
1448 float eclProb = eclID_e_pdf / (eclID_e_pdf + eclID_h_pdf);
1449 float atcProb = atcID_e_pdf / (atcID_e_pdf + atcID_h_pdf);
1451 if (atcProb > 0.999999) atcProb = 0.999999;
1453 double eidCombinedSig = eclProb * atcProb;
1454 double eidCombinedBkg = (1. - eclProb) * (1. - atcProb);
1456 likelihoods[0] = eidCombinedSig;
1458 likelihoods[2] = eidCombinedBkg;
1472 int muid_trackid = belleTrack.muid_ID();
1476 Belle::Mdst_klm_mu_ex_Manager& ex_mgr = Belle::Mdst_klm_mu_ex_Manager::get_manager();
1477 Belle::Mdst_klm_mu_ex& ex = ex_mgr(Belle::Panther_ID(muid_trackid));
1480 if (ex.Chi_2() > 0) {
1482 likelihoods[1] = ex.Muon_likelihood();
1483 likelihoods[2] = ex.Pion_likelihood();
1484 likelihoods[3] = ex.Kaon_likelihood();
1489 for (
int i = 0; i < 5; i++)
1490 if (likelihoods[i] < 0)
1515 const HepPoint3D& newPivot,
1516 std::vector<float>& helixParams,
1517 CLHEP::HepSymMatrix& error5x5,
1518 CLHEP::HepLorentzVector& momentum,
1519 HepPoint3D& position,
1520 CLHEP::HepSymMatrix& error7x7,
const double dPhi)
1522 const HepPoint3D pivot(trk_fit.pivot_x(),
1526 CLHEP::HepVector a(5);
1527 a[0] = trk_fit.helix(0);
1528 a[1] = trk_fit.helix(1);
1529 a[2] = trk_fit.helix(2);
1530 a[3] = trk_fit.helix(3);
1531 a[4] = trk_fit.helix(4);
1532 CLHEP::HepSymMatrix Ea(5, 0);
1533 Ea[0][0] = trk_fit.error(0);
1534 Ea[1][0] = trk_fit.error(1);
1535 Ea[1][1] = trk_fit.error(2);
1536 Ea[2][0] = trk_fit.error(3);
1537 Ea[2][1] = trk_fit.error(4);
1538 Ea[2][2] = trk_fit.error(5);
1539 Ea[3][0] = trk_fit.error(6);
1540 Ea[3][1] = trk_fit.error(7);
1541 Ea[3][2] = trk_fit.error(8);
1542 Ea[3][3] = trk_fit.error(9);
1543 Ea[4][0] = trk_fit.error(10);
1544 Ea[4][1] = trk_fit.error(11);
1545 Ea[4][2] = trk_fit.error(12);
1546 Ea[4][3] = trk_fit.error(13);
1547 Ea[4][4] = trk_fit.error(14);
1549 Belle::Helix helix(pivot, a, Ea);
1552 if (helix.kappa() > 0)
1557 if (newPivot.x() != 0. || newPivot.y() != 0. || newPivot.z() != 0.) {
1558 helix.pivot(newPivot);
1559 momentum = helix.momentum(dPhi, mass, position, error7x7);
1561 if (pivot.x() != 0. || pivot.y() != 0. || pivot.z() != 0.) {
1562 helix.pivot(HepPoint3D(0., 0., 0.));
1563 momentum = helix.momentum(dPhi, mass, position, error7x7);
1565 momentum = helix.momentum(dPhi, mass, position, error7x7);
1575 const HepPoint3D& newPivot,
1576 std::vector<float>& helixParams, std::vector<float>& helixError)
1578 const HepPoint3D pivot(trk_fit.pivot_x(),
1582 CLHEP::HepVector a(5);
1583 a[0] = trk_fit.helix(0);
1584 a[1] = trk_fit.helix(1);
1585 a[2] = trk_fit.helix(2);
1586 a[3] = trk_fit.helix(3);
1587 a[4] = trk_fit.helix(4);
1588 CLHEP::HepSymMatrix Ea(5, 0);
1589 Ea[0][0] = trk_fit.error(0);
1590 Ea[1][0] = trk_fit.error(1);
1591 Ea[1][1] = trk_fit.error(2);
1592 Ea[2][0] = trk_fit.error(3);
1593 Ea[2][1] = trk_fit.error(4);
1594 Ea[2][2] = trk_fit.error(5);
1595 Ea[3][0] = trk_fit.error(6);
1596 Ea[3][1] = trk_fit.error(7);
1597 Ea[3][2] = trk_fit.error(8);
1598 Ea[3][3] = trk_fit.error(9);
1599 Ea[4][0] = trk_fit.error(10);
1600 Ea[4][1] = trk_fit.error(11);
1601 Ea[4][2] = trk_fit.error(12);
1602 Ea[4][3] = trk_fit.error(13);
1603 Ea[4][4] = trk_fit.error(14);
1605 Belle::Helix helix(pivot, a, Ea);
1607 if (newPivot.x() != 0. || newPivot.y() != 0. || newPivot.z() != 0.) {
1608 helix.pivot(newPivot);
1610 if (pivot.x() != 0. || pivot.y() != 0. || pivot.z() != 0.) {
1611 helix.pivot(HepPoint3D(0., 0., 0.));
1615 CLHEP::HepSymMatrix error5x5(5, 0);
1618 unsigned int size = 5;
1619 unsigned int counter = 0;
1620 for (
unsigned int i = 0; i < size; i++)
1621 for (
unsigned int j = i; j < size; j++)
1622 helixError[counter++] = error5x5[i][j];
1627 CLHEP::HepVector a(5);
1628 CLHEP::HepSymMatrix Ea(5, 0);
1634 helixParams[0] = a[0];
1637 helixParams[1] = adjustAngleRange(a[1] + TMath::Pi() / 2.0);
1643 helixParams[3] = a[3];
1646 helixParams[4] = a[4];
1648 unsigned int size = 5;
1649 for (
unsigned int i = 0; i < size; i++) {
1650 for (
unsigned int j = 0; j < size; j++) {
1651 error5x5[i][j] = Ea[i][j];
1657 if (std::isinf(error5x5[i][j])) {
1658 B2DEBUG(99,
"Helix covariance matrix element found to be infinite. Setting value to DBL_MAX/2.0.");
1659 error5x5[i][j] = DBL_MAX / 2.0;
1667 Belle::Mdst_trk& trk = belleTrack.trk();
1669 for (
int mhyp = 0 ; mhyp <
c_nHyp; ++mhyp) {
1671 double thisMass = pType.
getMass();
1673 Belle::Mdst_trk_fit& trk_fit = trk.mhyp(mhyp);
1676 std::vector<float> helixParam(5);
1678 CLHEP::HepSymMatrix error5x5(5, 0);
1680 CLHEP::HepLorentzVector momentum;
1682 CLHEP::HepSymMatrix error7x7(7, 0);
1684 HepPoint3D position;
1687 helixParam, error5x5,
1688 momentum, position, error7x7, 0.0);
1690 std::vector<float> helixError(15);
1691 unsigned int size = 5;
1692 unsigned int counter = 0;
1693 for (
unsigned int i = 0; i < size; i++)
1694 for (
unsigned int j = i; j < size; j++)
1695 helixError[counter++] = error5x5[i][j];
1697 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
1704 for (
unsigned int i = 0; i < 3; i++)
1705 cdcNHits += trk_fit.nhits(i);
1713 double path_length = 0;
1714 double tof_sigma = 0;
1718 double dedx = trk.dEdx();
1719 short dedx_qual = trk.quality_dedx();
1721 const Belle::Mdst_tof& tof_obj = belleTrack.tof();
1723 tof = tof_obj.tof();
1724 path_length = tof_obj.path_length();
1725 tof_qual = tof_obj.quality();
1726 tof_sigma = tof_obj.sigma_tof();
1729 const Belle::Mdst_acc& acc_obj = belleTrack.acc();
1731 acc_ph = acc_obj.photo_electron();
1732 acc_qual = acc_obj.quality();
1736 auto cdcExtraInfo =
m_belleTrkExtra.appendNew(trk_fit.first_x(), trk_fit.first_y(), trk_fit.first_z(),
1737 trk_fit.last_x(), trk_fit.last_y(), trk_fit.last_z(),
1738 tof, path_length, tof_qual, tof_sigma,
1739 acc_ph, acc_qual, dedx, dedx_qual);
1740 track->addRelationTo(cdcExtraInfo);
1743 int svdHitPattern = trk_fit.hit_svd();
1747 std::bitset<32> svdBitSet(svdHitPattern);
1751 unsigned short svdLayers;
1755 std::bitset<32> svdUMask(
static_cast<std::string
>(
"00000000000000000000000000000011"));
1757 std::bitset<32> svdVMask;
1760 if (
event->getExperiment() <= 27) {
1761 svdVMask = svdUMask << 6;
1764 svdVMask = svdUMask << 8;
1769 for (
unsigned short layerId = 0; layerId < svdLayers; layerId++) {
1770 unsigned short uHits = (svdBitSet & svdUMask).count();
1771 unsigned short vHits = (svdBitSet & svdVMask).count();
1772 patternVxd.
setSVDLayer(layerId + 3, uHits, vHits);
1781 TMatrixDSym cartesianCovariance(6);
1782 for (
unsigned i = 0; i < 7; i++) {
1785 for (
unsigned j = 0; j < 7; j++) {
1793 BFIELD, cartesianCovariance, pValue);
1795 TMatrixDSym helixCovariance = helixFromCartesian.
getCovariance();
1798 for (
unsigned int i = 0; i < 5; ++i)
1799 for (
unsigned int j = i; j < 5; ++j)
1800 helixError[counter++] = helixCovariance(i, j);
1805 track->setTrackFitResultIndex(pType, trackFit->getArrayIndex());
1833 B2WARNING(
"Trying to convert Gen_hepevt with idhep = " << idHep <<
1834 ". This should never happen.");
1837 mcParticle->
setPDG(idHep);
1840 if (genHepevt.isthep() > 0) {
1844 mcParticle->
setMass(genHepevt.M());
1846 ROOT::Math::PxPyPzEVector p4(genHepevt.PX(), genHepevt.PY(), genHepevt.PZ(), genHepevt.E());
1853 if (genHepevt.daFirst() > 0) {
1854 Belle::Gen_hepevt_Manager& genMgr = Belle::Gen_hepevt_Manager::get_manager();
1855 Belle::Gen_hepevt daughterParticle = genMgr(Belle::Panther_ID(genHepevt.daFirst()));
1860 mcParticle->
setDecayTime(std::numeric_limits<float>::infinity());
1877 eclCluster->
setPhi(ecl.phi());
1879 eclCluster->
setR(ecl.r());
1882 double covarianceMatrix[6];
1883 covarianceMatrix[0] = ecl.error(0);
1884 covarianceMatrix[1] = ecl.error(1);
1885 covarianceMatrix[2] = ecl.error(2);
1886 covarianceMatrix[3] = ecl.error(3);
1887 covarianceMatrix[4] = ecl.error(4);
1888 covarianceMatrix[5] = ecl.error(5);
1891 eclCluster->
setLAT(eclAux.width());
1898 float prop2 = eclAux.property(2);
1901 std::memcpy(&property2, &prop2,
sizeof(
int));
1904 tdccount = property2 & 0xffff;
1905 eclCluster->
setTime(tdccount);
1912 klmCluster->
setLayers(klm_cluster.layers());
1925 Belle::Mdst_ecl_trk_Manager& m = Belle::Mdst_ecl_trk_Manager::get_manager();
1926 Belle::Mdst_charged_Manager& chgMg = Belle::Mdst_charged_Manager::get_manager();
1931 std::vector<int> insert_order_types = {1, 2, 0};
1932 for (
auto& insert_type : insert_order_types) {
1933 for (Belle::Mdst_ecl_trk_Manager::iterator ecltrkIterator = m.begin(); ecltrkIterator != m.end(); ++ecltrkIterator) {
1934 Belle::Mdst_ecl_trk mECLTRK = *ecltrkIterator;
1936 if (mECLTRK.type() != insert_type)
1939 Belle::Mdst_ecl mdstEcl = mECLTRK.ecl();
1940 Belle::Mdst_trk mTRK = mECLTRK.trk();
1948 for (Belle::Mdst_charged_Manager::iterator chgIterator = chgMg.begin(); chgIterator != chgMg.end(); ++chgIterator) {
1949 Belle::Mdst_charged mChar = *chgIterator;
1950 Belle::Mdst_trk mTRK_in_charged = mChar.trk();
1952 if (mTRK_in_charged.get_ID() == mTRK.get_ID()) {
1954 tracksToECLClusters.
add(mChar.get_ID() - 1, mdstEcl.get_ID() - 1, 1.0);
1969 Belle::Mdst_klm_cluster_Manager& klm_cluster_manager = Belle::Mdst_klm_cluster_Manager::get_manager();
1972 for (Belle::Mdst_klm_cluster_Manager::iterator klmC_Ite = klm_cluster_manager.begin(); klmC_Ite != klm_cluster_manager.end();
1975 Belle::Mdst_klm_cluster mdstKlm_cluster = *klmC_Ite;
1976 Belle::Mdst_trk mTRK = mdstKlm_cluster.trk();
1977 Belle::Mdst_ecl mECL = mdstKlm_cluster.ecl();
1979 if (mTRK) klmClustersToTracks.
add(mdstKlm_cluster.get_ID() - 1, mTRK.get_ID() - 1);
1980 if (mECL) klmClustersToEclClusters.
add(mdstKlm_cluster.get_ID() - 1, mECL.get_ID() - 1);
1997 const int mask = 0x00f00000;
1998 int high_bits =
id & mask;
1999 if (high_bits == 0 || high_bits == mask)
return id;
2059 int bellePDGCode = belleMC.idhep();
2060 int belleIIPDGCode = mcP->
getPDG();
2062 if (bellePDGCode == 0)
2063 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to Gen_hepevt with idhep = 0.");
2065 if (bellePDGCode != belleIIPDGCode)
2066 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to different MCParticle! " << bellePDGCode <<
" vs. " <<
2069 const double belleMomentum[] = { belleMC.PX(), belleMC.PY(), belleMC.PZ() };
2072 for (
unsigned i = 0; i < 3; i++) {
2073 double relDev = (belle2Momentum[i] - belleMomentum[i]) / belleMomentum[i];
2075 if (relDev > 1e-3) {
2076 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to different MCParticle!");
2077 B2INFO(
" - Gen_hepevt [" << bellePDGCode <<
"] px/py/pz = " << belleMC.PX() <<
"/" << belleMC.PY() <<
"/" << belleMC.PZ());
2078 B2INFO(
" - TrackFitResult [" << belleIIPDGCode <<
"] px/py/pz = " << mcP->
get4Vector().Px() <<
"/" << mcP->
get4Vector().Py() <<
"/"
2086 CLHEP::HepLorentzVector& momentum, HepPoint3D& position, CLHEP::HepSymMatrix& error)
2088 const HepPoint3D pivot(vee.vx(), vee.vy(), vee.vz());
2089 CLHEP::HepVector a(5);
2090 CLHEP::HepSymMatrix Ea(5, 0);
2092 a[0] = vee.daut().helix_p(0); a[1] = vee.daut().helix_p(1);
2093 a[2] = vee.daut().helix_p(2); a[3] = vee.daut().helix_p(3);
2094 a[4] = vee.daut().helix_p(4);
2095 Ea[0][0] = vee.daut().error_p(0); Ea[1][0] = vee.daut().error_p(1);
2096 Ea[1][1] = vee.daut().error_p(2); Ea[2][0] = vee.daut().error_p(3);
2097 Ea[2][1] = vee.daut().error_p(4); Ea[2][2] = vee.daut().error_p(5);
2098 Ea[3][0] = vee.daut().error_p(6); Ea[3][1] = vee.daut().error_p(7);
2099 Ea[3][2] = vee.daut().error_p(8); Ea[3][3] = vee.daut().error_p(9);
2100 Ea[4][0] = vee.daut().error_p(10); Ea[4][1] = vee.daut().error_p(11);
2101 Ea[4][2] = vee.daut().error_p(12); Ea[4][3] = vee.daut().error_p(13);
2102 Ea[4][4] = vee.daut().error_p(14);
2104 a[0] = vee.daut().helix_m(0); a[1] = vee.daut().helix_m(1);
2105 a[2] = vee.daut().helix_m(2); a[3] = vee.daut().helix_m(3);
2106 a[4] = vee.daut().helix_m(4);
2107 Ea[0][0] = vee.daut().error_m(0); Ea[1][0] = vee.daut().error_m(1);
2108 Ea[1][1] = vee.daut().error_m(2); Ea[2][0] = vee.daut().error_m(3);
2109 Ea[2][1] = vee.daut().error_m(4); Ea[2][2] = vee.daut().error_m(5);
2110 Ea[3][0] = vee.daut().error_m(6); Ea[3][1] = vee.daut().error_m(7);
2111 Ea[3][2] = vee.daut().error_m(8); Ea[3][3] = vee.daut().error_m(9);
2112 Ea[4][0] = vee.daut().error_m(10); Ea[4][1] = vee.daut().error_m(11);
2113 Ea[4][2] = vee.daut().error_m(12); Ea[4][3] = vee.daut().error_m(13);
2114 Ea[4][4] = vee.daut().error_m(14);
2117 Belle::Helix helix(pivot, a, Ea);
2120 momentum = helix.momentum(0., pType.
getMass(), position, error);
2124 std::vector<float>& helixError)
2126 const HepPoint3D pivot(vee.vx(), vee.vy(), vee.vz());
2127 CLHEP::HepVector a(5);
2128 CLHEP::HepSymMatrix Ea(5, 0);
2130 a[0] = vee.daut().helix_p(0); a[1] = vee.daut().helix_p(1);
2131 a[2] = vee.daut().helix_p(2); a[3] = vee.daut().helix_p(3);
2132 a[4] = vee.daut().helix_p(4);
2133 Ea[0][0] = vee.daut().error_p(0);
2134 Ea[1][0] = vee.daut().error_p(1);
2135 Ea[1][1] = vee.daut().error_p(2);
2136 Ea[2][0] = vee.daut().error_p(3);
2137 Ea[2][1] = vee.daut().error_p(4);
2138 Ea[2][2] = vee.daut().error_p(5);
2139 Ea[3][0] = vee.daut().error_p(6);
2140 Ea[3][1] = vee.daut().error_p(7);
2141 Ea[3][2] = vee.daut().error_p(8);
2142 Ea[3][3] = vee.daut().error_p(9);
2143 Ea[4][0] = vee.daut().error_p(10);
2144 Ea[4][1] = vee.daut().error_p(11);
2145 Ea[4][2] = vee.daut().error_p(12);
2146 Ea[4][3] = vee.daut().error_p(13);
2147 Ea[4][4] = vee.daut().error_p(14);
2149 a[0] = vee.daut().helix_m(0); a[1] = vee.daut().helix_m(1);
2150 a[2] = vee.daut().helix_m(2); a[3] = vee.daut().helix_m(3);
2151 a[4] = vee.daut().helix_m(4);
2152 Ea[0][0] = vee.daut().error_m(0);
2153 Ea[1][0] = vee.daut().error_m(1);
2154 Ea[1][1] = vee.daut().error_m(2);
2155 Ea[2][0] = vee.daut().error_m(3);
2156 Ea[2][1] = vee.daut().error_m(4);
2157 Ea[2][2] = vee.daut().error_m(5);
2158 Ea[3][0] = vee.daut().error_m(6);
2159 Ea[3][1] = vee.daut().error_m(7);
2160 Ea[3][2] = vee.daut().error_m(8);
2161 Ea[3][3] = vee.daut().error_m(9);
2162 Ea[4][0] = vee.daut().error_m(10);
2163 Ea[4][1] = vee.daut().error_m(11);
2164 Ea[4][2] = vee.daut().error_m(12);
2165 Ea[4][3] = vee.daut().error_m(13);
2166 Ea[4][4] = vee.daut().error_m(14);
2169 Belle::Helix helix(pivot, a, Ea);
2172 helix.pivot(HepPoint3D(0., 0., 0.));
2174 CLHEP::HepSymMatrix error5x5(5, 0);
2177 unsigned int size = 5;
2178 unsigned int counter = 0;
2179 for (
unsigned int i = 0; i < size; i++)
2180 for (
unsigned int j = i; j < size; j++)
2181 helixError[counter++] = error5x5[i][j];
2185 const HepPoint3D& position,
2186 const CLHEP::HepSymMatrix& error,
2187 const short int charge,
2190 const uint64_t hitPatternCDCInitializer,
2191 const uint32_t hitPatternVXDInitializer,
2194 ROOT::Math::XYZVector pos(position.x(), position.y(), position.z());
2195 ROOT::Math::XYZVector mom(momentum.px(), momentum.py(), momentum.pz());
2197 TMatrixDSym errMatrix(6);
2198 for (
unsigned i = 0; i < 7; i++) {
2201 for (
unsigned j = 0; j < 7; j++) {
2212 return TrackFitResult(pos, mom, errMatrix, charge, pType, pValue,
BFIELD, hitPatternCDCInitializer, hitPatternVXDInitializer, ndf);
2217 if (!pid)
return 0.5;
2224 if (acc_sig + acc_bkg > 0.0)
2225 acc = acc_sig / (acc_sig + acc_bkg);
2232 double tof_all = tof_sig + tof_bkg;
2234 tof = tof_sig / tof_all;
2235 if (tof < 0.001) tof = 0.001;
2236 if (tof > 0.999) tof = 0.999;
2244 double cdc_all = cdc_sig + cdc_bkg;
2246 cdc = cdc_sig / cdc_all;
2247 if (cdc < 0.001) cdc = 0.001;
2248 if (cdc > 0.999) cdc = 0.999;
2252 double pid_sig = acc * tof * cdc;
2253 double pid_bkg = (1. - acc) * (1. - tof) * (1. - cdc);
2255 return pid_sig / (pid_sig + pid_bkg);
2261 B2DEBUG(99,
"B2BIIConvertMdst: endRun done.");
2267 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.
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.
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.
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 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).
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.
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).
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).
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 setDecayVertex(const ROOT::Math::XYZVector &vertex)
Set decay vertex.
void setValidVertex(bool valid)
Set indication wether 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.
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]
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.