9 #include <b2bii/modules/B2BIIMdstInput/B2BIIConvertMdstModule.h>
11 #include <framework/datastore/StoreObjPtr.h>
12 #include <framework/datastore/RelationArray.h>
13 #include <framework/database/Database.h>
14 #include <framework/pcore/ProcHandler.h>
16 #include <mdst/dataobjects/HitPatternVXD.h>
17 #include <mdst/dataobjects/HitPatternCDC.h>
18 #include <mdst/dataobjects/ECLCluster.h>
21 #include <framework/gearbox/Unit.h>
22 #include <framework/gearbox/Const.h>
23 #include <framework/geometry/B2Vector3.h>
24 #include <framework/geometry/VectorUtil.h>
25 #include <analysis/dataobjects/ParticleExtraInfoMap.h>
28 #include <framework/dataobjects/EventMetaData.h>
29 #include <framework/dataobjects/Helix.h>
30 #include <framework/dataobjects/UncertainHelix.h>
33 #include <b2bii/utility/BelleMdstToGenHepevt.h>
36 #include <Math/RotationY.h>
37 #include <Math/Vector3D.h>
38 #include <Math/Vector4D.h>
39 #include <Math/Point3D.h>
47 #include "belle_legacy/eid/eid.h"
51 #include "belle_legacy/kid/kid_acc.h"
52 #include "belle_legacy/kid/kid_cdc.h"
56 #include "belle_legacy/findKs/findKs.h"
59 #ifdef HAVE_NISKSFINDER
60 #include "belle_legacy/nisKsFinder/nisKsFinder.h"
63 #ifdef HAVE_GOODLAMBDA
64 #include "belle_legacy/findLambda/findLambda.h"
67 #include "belle_legacy/benergy/BeamEnergy.h"
68 #include "belle_legacy/ip/IpProfile.h"
69 #include "belle_legacy/tables/evtcls.h"
70 #include "belle_legacy/tables/trg.h"
80 bool approximatelyEqual(
float a,
float b,
float epsilon)
82 return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
85 double adjustAngleRange(
double phi)
87 phi = phi - int(phi / TMath::TwoPi()) * TMath::TwoPi();
88 return phi - int(phi / TMath::Pi()) * TMath::TwoPi();
91 void fill7x7ErrorMatrix(
const TrackFitResult* tfr, TMatrixDSym& error7x7,
const double mass,
const double bField)
95 double d0 = tfr->
getD0();
101 double alpha = tfr->
getHelix().getAlpha(bField);
103 double cosPhi0 = TMath::Cos(phi0);
104 double sinPhi0 = TMath::Sin(phi0);
108 rho = 1.0 / alpha / omega;
112 double energy = TMath::Sqrt(mass * mass + (1.0 + tanl * tanl) * rho * rho);
124 const int iOmega = 2;
128 TMatrixD jacobian(7, 5);
131 jacobian(iPx, iPhi0) = - fabs(rho) * sinPhi0;
132 jacobian(iPx, iOmega) = -
charge * rho * rho * cosPhi0 * alpha;
133 jacobian(iPy, iPhi0) = fabs(rho) * cosPhi0;
134 jacobian(iPy, iOmega) = -
charge * rho * rho * sinPhi0 * alpha;
135 jacobian(iPz, iOmega) = -
charge * rho * rho * tanl * alpha;
136 jacobian(iPz, iTanl) = fabs(rho);
137 if (omega != 0 && energy != 0) {
138 jacobian(iE, iOmega) = - (1.0 + tanl * tanl) * rho * rho / omega / energy;
139 jacobian(iE, iTanl) = tanl * rho * rho / energy;
141 jacobian(iE, iOmega) = (DBL_MAX);
142 jacobian(iE, iTanl) = (DBL_MAX);
144 jacobian(iX, iD0) = sinPhi0;
145 jacobian(iX, iPhi0) = d0 * cosPhi0;
146 jacobian(iY, iD0) = - cosPhi0;
147 jacobian(iY, iPhi0) = d0 * sinPhi0;
148 jacobian(iZ, iZ0) = 1.0;
152 error7x7 = error5x5.Similarity(jacobian);
164 m_mcMatchingMode(c_Direct)
167 setDescription(
"Converts Belle mDST objects (Panther tables and records) to Belle II mDST objects.");
170 "Convert beam parameters or use information stored in "
171 "Belle II database.",
true);
173 "Use 6x6 (position, momentum) covariance matrix for charged tracks instead of 5x5 (helix parameters) covariance matrix",
false);
175 "MC matching mode: 'Direct', or 'GeneratorLevel'",
176 std::string(
"Direct"));
178 "clusters with a E9/E25 value above this threshold are classified as neutral even if tracks are matched to their connected region (matchType == 2)",
182 addParam(
"nisKsInfo",
m_nisEnable,
"Flag to switch on conversion of nisKsFinder info",
true);
184 addParam(
"TrkExtra",
m_convertTrkExtra,
" Flag to switch on conversion of first_x,y,z and last_x,y,z from Mdst_trk_fit",
true);
185 addParam(
"convertNbar",
m_convertNbar,
" Flag to switch on conversion of nbar:mdst (copy from gamma:mdst)",
false);
189 B2DEBUG(1,
"B2BIIConvertMdst: Constructor done.");
207 B2INFO(
"B2BIIConvertMdst: initialized.");
209 B2WARNING(
"nisKsFinder output has been disabled. ksnbVLike, ksnbNoLam, ksnbStandard will not be converted.");
214 B2DEBUG(99,
"[B2BIIConvertMdstModule::initializeDataStore] initialization of DataStore started");
221 m_v0s.registerInDataStore();
264 B2DEBUG(99,
"[B2BIIConvertMdstModule::initializeDataStore] initialization of DataStore ended");
270 B2DEBUG(99,
"B2BIIConvertMdst: beginRun called.");
274 Belle::BeamEnergy::begin_run();
276 Belle::BeamEnergy::dump();
279 Belle::IpProfile::begin_run();
281 Belle::IpProfile::dump();
282 bool usableIP = Belle::IpProfile::usable();
283 B2DEBUG(99,
"B2BIIConvertMdst: IpProfile is usable = " << usableIP);
288 Belle::eid::init_data();
289 Belle::eid::show_use(
"ALL");
298 Belle::Belle_event_Manager& evman = Belle::Belle_event_Manager::get_manager();
299 Belle::Belle_event& evt = evman[0];
301 if (evt.ExpMC() == 2)
314 B2INFO(
"No database entry for this run yet, create one");
322 B2ERROR(
"BeamParameters from condition database are different from converted "
323 "ones, overriding database. Did you make sure the globaltag B2BII is used?");
325 B2INFO(
"BeamSpot, BoostVector, and InvariantMass from condition database are different from converted "
326 "ones, overriding database");
329 B2FATAL(
"Cannot reliably override the Database content in parallel processing "
330 "mode, please run the conversion in single processing mode");
385 const double Eher = Belle::BeamEnergy::E_HER();
386 const double Eler = Belle::BeamEnergy::E_LER();
387 const double crossingAngle = Belle::BeamEnergy::Cross_angle();
388 const double angleLer = M_PI;
389 const double angleHer = crossingAngle;
391 TMatrixDSym covariance(0);
392 HepLorentzVector p_beam = Belle::BeamEnergy::p_beam();
395 ROOT::Math::PxPyPzEVector P_her(0.0, 0.0, TMath::Sqrt(Eher * Eher - mass_e * mass_e), Eher);
396 ROOT::Math::RotationY rotateAroundYAxis(angleHer);
397 P_her = rotateAroundYAxis(P_her);
398 ROOT::Math::PxPyPzEVector P_ler(0.0, 0.0, TMath::Sqrt(Eler * Eler - mass_e * mass_e), Eler);
399 rotateAroundYAxis.SetAngle(angleLer);
400 P_ler = rotateAroundYAxis(P_ler);
403 ROOT::Math::PxPyPzEVector P_beam = P_her + P_ler;
408 B2DEBUG(99,
"Beam Energy: E_HER = " << Eher <<
"; E_LER = " << Eler <<
"; angle = " << crossingAngle);
409 B2DEBUG(99,
"Beam Momentum (pre-convert) : P_X = " << p_beam.px() <<
"; P_Y = " << p_beam.py() <<
"; P_Z = " << p_beam.pz());
410 B2DEBUG(99,
"Beam Momentum (post-convert) : P_X = " << P_beam.Px() <<
"; P_Y = " << P_beam.Py() <<
"; P_Z = " << P_beam.Pz());
415 if (!Belle::IpProfile::usable()) {
420 TVector3(std::numeric_limits<double>::quiet_NaN(),
421 std::numeric_limits<double>::quiet_NaN(),
422 std::numeric_limits<double>::quiet_NaN()
423 ), TMatrixTSym<double>()
429 CLHEP::HepSymMatrix ipErr;
432 ip = Belle::IpProfile::position();
433 ipErr = Belle::IpProfile::position_err();
436 Belle::IpProfile::set_evtbin_number();
440 ip = Belle::IpProfile::e_position();
441 ipErr = Belle::IpProfile::e_position_err();
446 TMatrixDSym cov(ipErr.num_col());
447 for (
int i = 0; i < ipErr.num_row(); ++i) {
448 for (
int j = 0; j < ipErr.num_col(); ++j) {
449 cov(i, j) = ipErr(i + 1, j + 1);
461 Belle::Mdst_charged_Manager& m = Belle::Mdst_charged_Manager::get_manager();
462 for (Belle::Mdst_charged_Manager::iterator chargedIterator = m.begin(); chargedIterator != m.end(); ++chargedIterator) {
463 Belle::Mdst_charged belleTrack = *chargedIterator;
477 const Belle::Gen_hepevt& hep0 = get_hepevt(belleTrack);
480 const Belle::Gen_hepevt* hep =
nullptr;
486 hep = &gen_level(hep0);
494 tracksToMCParticles.
add(track->getArrayIndex(), matchedMCParticle);
498 B2DEBUG(99,
"Can not find MCParticle corresponding to this gen_hepevt (Panther ID = " << hep->get_ID() <<
")");
499 B2DEBUG(99,
"Gen_hepevt: Panther ID = " << hep->get_ID() <<
"; idhep = " << hep->idhep() <<
"; isthep = " << hep->isthep());
509 ksPList->initialize(310, ksPList.
getName());
514 lambda0PList->initialize(3122, lambda0PList.
getName());
517 antiLambda0PList.
create();
518 antiLambda0PList->initialize(-3122, antiLambda0PList.
getName());
520 antiLambda0PList->bindAntiParticleList(*lambda0PList);
525 convGammaPList->initialize(22, convGammaPList.
getName());
528 Belle::Mdst_vee2_Manager& m = Belle::Mdst_vee2_Manager::get_manager();
529 for (Belle::Mdst_vee2_Manager::iterator vee2Iterator = m.begin(); vee2Iterator != m.end(); ++vee2Iterator) {
530 Belle::Mdst_vee2 belleV0 = *vee2Iterator;
533 Belle::Mdst_charged belleTrackP = belleV0.chgd(0);
535 Belle::Mdst_charged belleTrackM = belleV0.chgd(1);
543 switch (belleV0.kind()) {
569 B2WARNING(
"Conversion of vee2 candidate of unknown kind! kind = " << belleV0.kind());
573 int trackID[2] = {0, 0};
575 Belle::Mdst_charged_Manager& charged_mag = Belle::Mdst_charged_Manager::get_manager();
576 for (std::vector<Belle::Mdst_charged>::iterator chgIterator = charged_mag.begin(); chgIterator != charged_mag.end();
578 if (belleV0.chgd(0).get_ID() >= 1 && trackID[0] == 0 && belleV0.chgd(0).get_ID() == chgIterator->get_ID()) {
579 trackID[0] = (int)(chgIterator->get_ID());
582 if (belleV0.chgd(1).get_ID() >= 1 && trackID[1] == 0 && belleV0.chgd(1).get_ID() == chgIterator->get_ID()) {
583 trackID[1] = (int)(chgIterator->get_ID());
590 HepPoint3D dauPivot(belleV0.vx(), belleV0.vy(), belleV0.vz());
591 int trackFitPIndex = -1;
592 int trackFitMIndex = -1;
594 CLHEP::HepLorentzVector momentumP;
595 CLHEP::HepSymMatrix error7x7P(7, 0);
597 TMatrixFSym errMatrixP(7);
598 CLHEP::HepLorentzVector momentumM;
599 CLHEP::HepSymMatrix error7x7M(7, 0);
601 TMatrixFSym errMatrixM(7);
602 CLHEP::HepSymMatrix error5x5(5, 0);
603 if (trackID[0] >= 1) {
604 if (belleV0.daut()) {
605 std::vector<float> helixParam(5);
606 std::vector<float> helixError(15);
609 auto trackFitP =
m_trackFitResults.appendNew(helixParam, helixError, pTypeP, 0.5, -1, -1, 0);
610 trackFitPIndex = trackFitP->getArrayIndex();
617 for (
unsigned i = 0; i < 7; i++)
618 for (
unsigned j = 0; j < 7; j++)
619 errMatrixP(i, j) = error7x7P[i][j];
621 daughterP =
Particle(trackID[0] - 1, tmpTFR, pTypeP);
622 daughterP.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumP.px(), momentumP.py(), momentumP.pz(), momentumP.e()),
623 ROOT::Math::XYZVector(positionP.x(), positionP.y(), positionP.z()),
627 Belle::Mdst_trk_fit& trk_fit = charged_mag[trackID[0] - 1].trk().mhyp(belleHypP);
628 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
630 std::vector<float> helixParam(5);
631 std::vector<float> helixError(15);
635 if (helixParam[2] == 0) {
636 B2WARNING(
"Helix parameter for curvature == 0. Skipping Track! The parameter is: " << helixParam[2] <<
"...");
640 auto trackFitP =
m_trackFitResults.appendNew(helixParam, helixError, pTypeP, pValue, -1, -1, 0);
642 trackFitPIndex = trackFitP->getArrayIndex();
644 daughterP =
Particle(trackID[0] - 1, trackFitP, pTypeP);
647 helixParam, error5x5,
648 momentumP, positionP, error7x7P);
650 for (
unsigned i = 0; i < 7; i++)
651 for (
unsigned j = 0; j < 7; j++)
652 errMatrixP(i, j) = error7x7P[i][j];
654 daughterP.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumP.px(), momentumP.py(), momentumP.pz(), momentumP.e()),
655 ROOT::Math::XYZVector(positionP.x(), positionP.y(), positionP.z()),
659 if (trackID[1] >= 1) {
660 if (belleV0.daut()) {
661 std::vector<float> helixParam(5);
662 std::vector<float> helixError(15);
665 auto trackFitM =
m_trackFitResults.appendNew(helixParam, helixError, pTypeM, 0.5, -1, -1, 0);
666 trackFitMIndex = trackFitM->getArrayIndex();
672 for (
unsigned i = 0; i < 7; i++)
673 for (
unsigned j = 0; j < 7; j++)
674 errMatrixM(i, j) = error7x7M[i][j];
676 daughterM =
Particle(trackID[1] - 1, tmpTFR, pTypeM);
677 daughterM.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumM.px(), momentumM.py(), momentumM.pz(), momentumM.e()),
678 ROOT::Math::XYZVector(positionM.x(), positionM.y(), positionM.z()),
682 Belle::Mdst_trk_fit& trk_fit = charged_mag[trackID[1] - 1].trk().mhyp(belleHypM);
683 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
685 std::vector<float> helixParam(5);
686 std::vector<float> helixError(15);
690 if (helixParam[2] == 0) {
691 B2WARNING(
"Helix parameter for curvature == 0. Skipping Track! The parameter is: " << helixParam[2] <<
"...");
695 auto trackFitM =
m_trackFitResults.appendNew(helixParam, helixError, pTypeM, pValue, -1, -1, 0);
697 trackFitMIndex = trackFitM->getArrayIndex();
699 daughterM =
Particle(trackID[1] - 1, trackFitM, pTypeM);
702 helixParam, error5x5,
703 momentumM, positionM, error7x7M);
705 for (
unsigned i = 0; i < 7; i++)
706 for (
unsigned j = 0; j < 7; j++)
707 errMatrixM(i, j) = error7x7M[i][j];
709 daughterM.
updateMomentum(ROOT::Math::PxPyPzEVector(momentumM.px(), momentumM.py(), momentumM.pz(), momentumM.e()),
710 ROOT::Math::XYZVector(positionM.x(), positionM.y(), positionM.z()),
721 m_v0s.appendNew(std::make_pair(trackP, trackFitP), std::make_pair(trackM, trackFitM), belleV0.vx(), belleV0.vy(), belleV0.vz());
731 newDaugP->addRelationTo(pidP);
733 newDaugP->addRelationTo(mcParticleP);
740 ROOT::Math::PxPyPzEVector v0Momentum(belleV0.px(), belleV0.py(), belleV0.pz(), belleV0.energy());
741 ROOT::Math::XYZVector v0Vertex(belleV0.vx(), belleV0.vy(), belleV0.vz());
747 auto appendVertexFitInfo = [](Belle::Mdst_vee2 & _belle_V0,
Particle & _belle2_V0) {
749 _belle2_V0.addExtraInfo(
"chiSquared", _belle_V0.chisq());
751 _belle2_V0.addExtraInfo(
"ndf", 1);
753 double prob = TMath::Prob(_belle_V0.chisq(), 1);
754 _belle2_V0.setPValue(prob);
758 if (belleV0.kind() == 1) {
763 appendVertexFitInfo(belleV0, KS);
765 ksPList->addParticle(newV0);
768 Belle::FindKs belleKSFinder;
769 belleKSFinder.candidates(belleV0, Belle::IpProfile::position(1));
806 }
else if (belleV0.kind() == 2) {
811 appendVertexFitInfo(belleV0, Lambda0);
813 lambda0PList->addParticle(newV0);
816 Belle::FindLambda lambdaFinder;
817 lambdaFinder.candidates(belleV0, Belle::IpProfile::position(1));
818 newV0->
addExtraInfo(
"goodLambda", lambdaFinder.goodLambda());
819 }
else if (belleV0.kind() == 3) {
820 Particle antiLambda0(v0Momentum, -3122);
824 appendVertexFitInfo(belleV0, antiLambda0);
826 antiLambda0PList->addParticle(newV0);
829 Belle::FindLambda lambdaFinder;
830 lambdaFinder.candidates(belleV0, Belle::IpProfile::position(1));
831 newV0->
addExtraInfo(
"goodLambda", lambdaFinder.goodLambda());
832 }
else if (belleV0.kind() == 4) {
834 gamma.appendDaughter(newDaugP);
835 gamma.appendDaughter(newDaugM);
836 gamma.setVertex(v0Vertex);
837 appendVertexFitInfo(belleV0, gamma);
839 convGammaPList->addParticle(newV0);
843 if (belleV0.kind() > 0 and belleV0.kind() <= 3) {
844 Belle::nisKsFinder ksnb;
845 double protIDP =
atcPID(pidP, 2, 4);
846 double protIDM =
atcPID(pidM, 2, 4);
847 ksnb.candidates(belleV0, Belle::IpProfile::position(1), momentumP, protIDP, protIDM);
852 if (belleV0.kind() == 1)
868 Belle::Gen_hepevt_Manager& genMgr = Belle::Gen_hepevt_Manager::get_manager();
869 if (genMgr.count() == 0)
872 typedef std::pair<MCParticleGraph::GraphParticle*, Belle::Gen_hepevt> halfFamily;
873 halfFamily currFamily;
875 std::queue < halfFamily > heritancesQueue;
881 for (Belle::Gen_hepevt_Manager::iterator genIterator = genMgr.begin();
882 genIterator != genMgr.end(); ++genIterator) {
883 Belle::Gen_hepevt hep = *genIterator;
885 if (!(hep.moFirst() == 0 && hep.moLast() == 0))
893 for (
int iDaughter = hep.daFirst(); iDaughter <= hep.daLast();
895 if (iDaughter == 0) {
896 B2DEBUG(95,
"Trying to access generated daughter with Panther ID == 0");
899 currFamily.first = graphParticle;
900 currFamily.second = genMgr(Belle::Panther_ID(iDaughter));
901 heritancesQueue.push(currFamily);
906 while (!heritancesQueue.empty()) {
907 currFamily = heritancesQueue.front();
908 heritancesQueue.pop();
911 Belle::Gen_hepevt& currDaughter = currFamily.second;
914 if (currDaughter.idhep() == 0)
928 int nGrandChildren = currDaughter.daLast() - currDaughter.daFirst() + 1;
930 if (nGrandChildren > 0 && currDaughter.daFirst() != 0) {
931 for (
int igrandchild = currDaughter.daFirst(); igrandchild <= currDaughter.daLast(); ++igrandchild) {
932 if (igrandchild == 0) {
933 B2DEBUG(95,
"Trying to access generated daughter with Panther ID == 0");
937 family.first = graphDaughter;
938 family.second = genMgr(Belle::Panther_ID(igrandchild));
939 heritancesQueue.push(family);
957 Belle::Mdst_ecl_Manager& ecl_manager = Belle::Mdst_ecl_Manager::get_manager();
958 Belle::Mdst_ecl_aux_Manager& ecl_aux_manager = Belle::Mdst_ecl_aux_Manager::get_manager();
960 for (Belle::Mdst_ecl_Manager::iterator eclIterator = ecl_manager.begin(); eclIterator != ecl_manager.end(); ++eclIterator) {
963 Belle::Mdst_ecl mdstEcl = *eclIterator;
964 Belle::Mdst_ecl_aux mdstEclAux(ecl_aux_manager(mdstEcl.get_ID()));
975 B2EclCluster->setConnectedRegionId(B2EclCluster->getArrayIndex() + 1);
976 B2EclCluster->setClusterId(1);
983 const Belle::Gen_hepevt& hep0 = get_hepevt(mdstEcl);
986 const Belle::Gen_hepevt* hep =
nullptr;
992 hep = &gen_level(hep0);
999 eclClustersToMCParticles.
add(B2EclCluster->getArrayIndex(), matchedMCParticleID);
1002 B2DEBUG(79,
"Cannot find MCParticle corresponding to this gen_hepevt (Panther ID = " << hep->get_ID() <<
")");
1003 B2DEBUG(79,
"Gen_hepevt: Panther ID = " << hep->get_ID() <<
"; idhep = " << hep->idhep() <<
"; isthep = " << hep->isthep());
1016 Belle::Mdst_klm_cluster_Manager& klm_cluster_manager = Belle::Mdst_klm_cluster_Manager::get_manager();
1018 for (Belle::Mdst_klm_cluster_Manager::iterator klmC_Ite = klm_cluster_manager.begin(); klmC_Ite != klm_cluster_manager.end();
1022 Belle::Mdst_klm_cluster mdstKlm_cluster = *klmC_Ite;
1046 plist->initialize(22,
"gamma:mdst");
1049 Belle::Mdst_gamma_Manager& gamma_manager = Belle::Mdst_gamma_Manager::get_manager();
1051 for (Belle::Mdst_gamma_Manager::iterator gammaIterator = gamma_manager.begin(); gammaIterator != gamma_manager.end();
1055 Belle::Mdst_gamma mdstGamma = *gammaIterator;
1056 Belle::Mdst_ecl mdstEcl = mdstGamma.ecl();
1070 plist->addParticle(B2Gamma);
1077 if (matchedMCParticle)
1088 B2DEBUG(99,
"Getting gamma:mdst in copyNbarFromGamma");
1090 for (
const Particle& gamma : *plist_gamma) {
1091 auto* eclCluster = gamma.getECLCluster();
1094 B2DEBUG(99,
"Copying anti-n0:mdst from gamma:mdst");
1096 plist->addParticle(nbar);
1103 if (matchedMCParticle)
1113 plist->initialize(111,
"pi0:mdst");
1116 Belle::Mdst_pi0_Manager& pi0_manager = Belle::Mdst_pi0_Manager::get_manager();
1117 for (Belle::Mdst_pi0_Manager::iterator pi0Iterator = pi0_manager.begin(); pi0Iterator != pi0_manager.end(); ++pi0Iterator) {
1120 Belle::Mdst_pi0 mdstPi0 = *pi0Iterator;
1121 Belle::Mdst_gamma mdstGamma1 = mdstPi0.gamma(0);
1122 Belle::Mdst_gamma mdstGamma2 = mdstPi0.gamma(1);
1123 if (!mdstGamma1 || !mdstGamma2)
1126 ROOT::Math::PxPyPzEVector p4(mdstPi0.px(), mdstPi0.py(), mdstPi0.pz(), mdstPi0.energy());
1134 if (!B2Gamma1 || !B2Gamma2)
1148 double prob = TMath::Prob(mdstPi0.chisq(), 1);
1152 plist->addParticle(B2Pi0);
1165 plist->initialize(
Const::Klong.getPDGCode(),
"K_L0:mdst");
1167 Belle::Mdst_klong_Manager& klong_manager = Belle::Mdst_klong_Manager::get_manager();
1168 for (Belle::Mdst_klong_Manager::iterator klong_Ite = klong_manager.begin(); klong_Ite != klong_manager.end(); ++klong_Ite) {
1171 Belle::Mdst_klong mdstKlong = *klong_Ite;
1172 Belle::Mdst_klm_cluster mdstKlm = mdstKlong.klmc();
1184 B2KlmCluster->
setClusterPosition(mdstKlong.cos_x(), mdstKlong.cos_y(), mdstKlong.cos_z());
1191 plist->addParticle(B2Klong);
1202 Belle::Gen_hepevt_Manager& GenMgr = Belle::Gen_hepevt_Manager::get_manager();
1203 const double dang(15. / 180.*M_PI);
1205 for (Belle::Gen_hepevt_Manager::iterator klong_hep_it = GenMgr.begin(); klong_hep_it != GenMgr.end(); ++klong_hep_it) {
1209 CLHEP::HepLorentzVector gp4(klong_hep_it->PX(), klong_hep_it->PY(), klong_hep_it->PZ(), klong_hep_it->E());
1211 int bestRecKlongID(0);
1213 for (Belle::Mdst_klong_Manager::iterator klong_rec_it = klong_manager.begin(); klong_rec_it != klong_manager.end();
1217 if ((*klong_rec_it).ecl())
1219 CLHEP::Hep3Vector klp3(klong_rec_it->cos_x(), klong_rec_it->cos_y(), klong_rec_it->cos_z());
1221 if (cos(gp4.theta() - klp3.theta()) > cos(dang) && cos(gp4.phi() - klp3.phi()) > cos(dang)) {
1223 double tmp_sum = cos(gp4.theta() - klp3.theta()) + cos(gp4.phi() - klp3.phi());
1224 if (tmp_sum > sum) {
1233 particlesToMCParticles.
add(bestRecKlongID, matchedMCParticleID);
1248 Belle::Evtcls_flag_Manager& EvtFlagMgr = Belle::Evtcls_flag_Manager::get_manager();
1249 Belle::Evtcls_flag2_Manager& EvtFlag2Mgr = Belle::Evtcls_flag2_Manager::get_manager();
1252 Belle::Evtcls_hadronic_flag_Manager& EvtHadFlagMgr = Belle::Evtcls_hadronic_flag_Manager::get_manager();
1254 std::string name =
"evtcls_flag";
1255 std::string name_had =
"evtcls_hadronic_flag";
1257 std::vector<Belle::Evtcls_flag>::iterator eflagIterator = EvtFlagMgr.begin();
1258 std::vector<Belle::Evtcls_flag2>::iterator eflag2Iterator = EvtFlag2Mgr.begin();
1259 std::vector<Belle::Evtcls_hadronic_flag>::iterator ehadflagIterator = EvtHadFlagMgr.begin();
1262 std::vector<int> flag(20);
1263 for (
int index = 0; index < 20; ++index) {
1265 if (index == 14 || index == 16)
continue;
1266 std::string iVar = name + std::to_string(index);
1269 m_evtInfo->addExtraInfo(iVar, (*eflagIterator).flag(index));
1272 m_evtInfo->addExtraInfo(iVar, (*eflag2Iterator).flag(index - 10));
1274 B2DEBUG(99,
"evtcls_flag(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1278 for (
int index = 0; index < 6; ++index) {
1279 std::string iVar = name_had + std::to_string(index);
1280 m_evtInfo->addExtraInfo(iVar, (*ehadflagIterator).hadronic_flag(index));
1281 B2DEBUG(99,
"evtcls_hadronic_flag(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1296 if (
event->getExperiment() <= 27) {
1298 Belle::Rectrg_summary_Manager& RecTrgSummaryMgr = Belle::Rectrg_summary_Manager::get_manager();
1299 std::vector<Belle::Rectrg_summary>::iterator eflagIterator = RecTrgSummaryMgr.begin();
1300 std::string name_summary =
"rectrg_summary_m_final";
1303 for (
int index = 0; index < 2; ++index) {
1304 std::string iVar = name_summary + std::to_string(index);
1305 m_evtInfo->addExtraInfo(iVar, (*eflagIterator).final(index));
1306 B2DEBUG(99,
"m_final(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1310 Belle::Rectrg_summary3_Manager& RecTrgSummary3Mgr = Belle::Rectrg_summary3_Manager::get_manager();
1312 std::string name_summary3 =
"rectrg_summary3_m_final";
1314 std::vector<Belle::Rectrg_summary3>::iterator eflagIterator3 = RecTrgSummary3Mgr.begin();
1317 for (
int index = 0; index < 3; ++index) {
1318 std::string iVar = name_summary3 + std::to_string(index);
1319 m_evtInfo->addExtraInfo(iVar, (*eflagIterator3).final(index));
1320 B2DEBUG(99,
"m_final(" << index <<
") = " <<
m_evtInfo->getExtraInfo(iVar));
1334 static Belle::kid_acc acc_pdf(0);
1337 const double pmass[5] = { 0.00051099907, 0.105658389, 0.13956995, 0.493677, 0.93827231 };
1339 CLHEP::Hep3Vector mom(chg.px(), chg.py(), chg.pz());
1340 double cos_theta = mom.cosTheta();
1341 double pval = mom.mag();
1343 double npe = chg.acc().photo_electron();
1344 double beta = pval /
sqrt(pval * pval + pmass[idp] * pmass[idp]);
1345 double pdfval = acc_pdf.npe2pdf(cos_theta, beta, npe);
1353 CLHEP::Hep3Vector mom(chg.px(), chg.py(), chg.pz());
1354 double pval = mom.mag();
1356 Belle::kid_cdc kidCdc(5);
1357 float factor0 = kidCdc.factor0();
1358 float factor1 = kidCdc.factor1(idp, pval);
1360 if (factor0 == 1.0 && factor1 == 1.0)
return chg.trk().pid(idp);
1362 double m = chg.trk().dEdx() / factor0;
1363 double e = chg.trk().dEdx_exp(idp) * factor1;
1364 double s = chg.trk().sigma_dEdx(idp);
1365 double val = 1. /
sqrt(2.*M_PI) / s * exp(-0.5 * (m - e) * (m - e) / s / s);
1372 bool discard_allzero)
1374 if (discard_allzero) {
1375 const double max_l = *std::max_element(likelihoods, likelihoods +
c_nHyp);
1381 for (
int i = 0; i <
c_nHyp; i++) {
1382 float logl = log(likelihoods[i]);
1392 track->addRelationTo(pid);
1398 double likelihoods[
c_nHyp];
1402 for (
int i = 0; i <
c_nHyp; i++) {
1403 accL[i] = tofL[i] = cdcL[i] = 1.0;
1407 const auto& acc = belleTrack.acc();
1408 if (acc and acc.quality() == 0) {
1409 for (
int i = 0; i <
c_nHyp; i++)
1410 accL[i] = likelihoods[i] =
acc_pid(belleTrack, i);
1417 const Belle::Mdst_tof& tof = belleTrack.tof();
1418 if (tof and tof.quality() == 0) {
1419 for (
int i = 0; i <
c_nHyp; i++)
1420 tofL[i] = likelihoods[i] = tof.pid(i);
1427 const Belle::Mdst_trk& trk = belleTrack.trk();
1428 if (trk.dEdx() > 0) {
1429 for (
int i = 0; i <
c_nHyp; i++) {
1430 likelihoods[i] = trk.pid(i);
1431 cdcL[i] =
cdc_pid(belleTrack, i);
1445 Belle::eid electronID(belleTrack);
1446 float eclID_e_pdf = electronID.pdf_e_ecl();
1447 float eclID_h_pdf = electronID.pdf_h_ecl();
1448 float atcID_e_pdf = electronID.atc_pid_pdf(
true, accL, tofL, cdcL);
1449 float atcID_h_pdf = electronID.atc_pid_pdf(
false, accL, tofL, cdcL);
1452 float eclProb = eclID_e_pdf / (eclID_e_pdf + eclID_h_pdf);
1453 float atcProb = atcID_e_pdf / (atcID_e_pdf + atcID_h_pdf);
1455 if (atcProb > 0.999999) atcProb = 0.999999;
1457 double eidCombinedSig = eclProb * atcProb;
1458 double eidCombinedBkg = (1. - eclProb) * (1. - atcProb);
1460 likelihoods[0] = eidCombinedSig;
1462 likelihoods[2] = eidCombinedBkg;
1476 int muid_trackid = belleTrack.muid_ID();
1480 Belle::Mdst_klm_mu_ex_Manager& ex_mgr = Belle::Mdst_klm_mu_ex_Manager::get_manager();
1481 Belle::Mdst_klm_mu_ex& ex = ex_mgr(Belle::Panther_ID(muid_trackid));
1484 if (ex.Chi_2() > 0) {
1486 likelihoods[1] = ex.Muon_likelihood();
1487 likelihoods[2] = ex.Pion_likelihood();
1488 likelihoods[3] = ex.Kaon_likelihood();
1493 for (
int i = 0; i < 5; i++)
1494 if (likelihoods[i] < 0)
1520 std::vector<float>& helixParams,
1521 CLHEP::HepSymMatrix& error5x5,
1522 CLHEP::HepLorentzVector& momentum,
1524 CLHEP::HepSymMatrix& error7x7,
const double dPhi)
1530 CLHEP::HepVector a(5);
1531 a[0] = trk_fit.helix(0);
1532 a[1] = trk_fit.helix(1);
1533 a[2] = trk_fit.helix(2);
1534 a[3] = trk_fit.helix(3);
1535 a[4] = trk_fit.helix(4);
1536 CLHEP::HepSymMatrix Ea(5, 0);
1537 Ea[0][0] = trk_fit.error(0);
1538 Ea[1][0] = trk_fit.error(1);
1539 Ea[1][1] = trk_fit.error(2);
1540 Ea[2][0] = trk_fit.error(3);
1541 Ea[2][1] = trk_fit.error(4);
1542 Ea[2][2] = trk_fit.error(5);
1543 Ea[3][0] = trk_fit.error(6);
1544 Ea[3][1] = trk_fit.error(7);
1545 Ea[3][2] = trk_fit.error(8);
1546 Ea[3][3] = trk_fit.error(9);
1547 Ea[4][0] = trk_fit.error(10);
1548 Ea[4][1] = trk_fit.error(11);
1549 Ea[4][2] = trk_fit.error(12);
1550 Ea[4][3] = trk_fit.error(13);
1551 Ea[4][4] = trk_fit.error(14);
1553 Belle::Helix helix(pivot, a, Ea);
1556 if (helix.kappa() > 0)
1561 if (newPivot.x() != 0. || newPivot.y() != 0. || newPivot.z() != 0.) {
1562 helix.pivot(newPivot);
1563 momentum = helix.momentum(dPhi, mass, position, error7x7);
1565 if (pivot.x() != 0. || pivot.y() != 0. || pivot.z() != 0.) {
1567 momentum = helix.momentum(dPhi, mass, position, error7x7);
1569 momentum = helix.momentum(dPhi, mass, position, error7x7);
1580 std::vector<float>& helixParams, std::vector<float>& helixError)
1586 CLHEP::HepVector a(5);
1587 a[0] = trk_fit.helix(0);
1588 a[1] = trk_fit.helix(1);
1589 a[2] = trk_fit.helix(2);
1590 a[3] = trk_fit.helix(3);
1591 a[4] = trk_fit.helix(4);
1592 CLHEP::HepSymMatrix Ea(5, 0);
1593 Ea[0][0] = trk_fit.error(0);
1594 Ea[1][0] = trk_fit.error(1);
1595 Ea[1][1] = trk_fit.error(2);
1596 Ea[2][0] = trk_fit.error(3);
1597 Ea[2][1] = trk_fit.error(4);
1598 Ea[2][2] = trk_fit.error(5);
1599 Ea[3][0] = trk_fit.error(6);
1600 Ea[3][1] = trk_fit.error(7);
1601 Ea[3][2] = trk_fit.error(8);
1602 Ea[3][3] = trk_fit.error(9);
1603 Ea[4][0] = trk_fit.error(10);
1604 Ea[4][1] = trk_fit.error(11);
1605 Ea[4][2] = trk_fit.error(12);
1606 Ea[4][3] = trk_fit.error(13);
1607 Ea[4][4] = trk_fit.error(14);
1609 Belle::Helix helix(pivot, a, Ea);
1611 if (newPivot.x() != 0. || newPivot.y() != 0. || newPivot.z() != 0.) {
1612 helix.pivot(newPivot);
1614 if (pivot.x() != 0. || pivot.y() != 0. || pivot.z() != 0.) {
1619 CLHEP::HepSymMatrix error5x5(5, 0);
1622 unsigned int size = 5;
1623 unsigned int counter = 0;
1624 for (
unsigned int i = 0; i < size; i++)
1625 for (
unsigned int j = i; j < size; j++)
1626 helixError[counter++] = error5x5[i][j];
1631 CLHEP::HepVector a(5);
1632 CLHEP::HepSymMatrix Ea(5, 0);
1638 helixParams[0] = a[0];
1641 helixParams[1] = adjustAngleRange(a[1] + TMath::Pi() / 2.0);
1647 helixParams[3] = a[3];
1650 helixParams[4] = a[4];
1652 unsigned int size = 5;
1653 for (
unsigned int i = 0; i < size; i++) {
1654 for (
unsigned int j = 0; j < size; j++) {
1655 error5x5[i][j] = Ea[i][j];
1661 if (std::isinf(error5x5[i][j])) {
1662 B2DEBUG(99,
"Helix covariance matrix element found to be infinite. Setting value to DBL_MAX/2.0.");
1663 error5x5[i][j] = DBL_MAX / 2.0;
1671 Belle::Mdst_trk& trk = belleTrack.trk();
1673 for (
int mhyp = 0 ; mhyp <
c_nHyp; ++mhyp) {
1675 double thisMass = pType.
getMass();
1677 Belle::Mdst_trk_fit& trk_fit = trk.mhyp(mhyp);
1680 std::vector<float> helixParam(5);
1682 CLHEP::HepSymMatrix error5x5(5, 0);
1684 CLHEP::HepLorentzVector momentum;
1686 CLHEP::HepSymMatrix error7x7(7, 0);
1691 helixParam, error5x5,
1692 momentum, position, error7x7, 0.0);
1694 std::vector<float> helixError(15);
1695 unsigned int size = 5;
1696 unsigned int counter = 0;
1697 for (
unsigned int i = 0; i < size; i++)
1698 for (
unsigned int j = i; j < size; j++)
1699 helixError[counter++] = error5x5[i][j];
1701 double pValue = TMath::Prob(trk_fit.chisq(), trk_fit.ndf());
1708 for (
unsigned int i = 0; i < 3; i++)
1709 cdcNHits += trk_fit.nhits(i);
1717 double path_length = 0;
1718 double tof_sigma = 0;
1722 double dedx = trk.dEdx();
1723 short dedx_qual = trk.quality_dedx();
1725 const Belle::Mdst_tof& tof_obj = belleTrack.tof();
1727 tof = tof_obj.tof();
1728 path_length = tof_obj.path_length();
1729 tof_qual = tof_obj.quality();
1730 tof_sigma = tof_obj.sigma_tof();
1733 const Belle::Mdst_acc& acc_obj = belleTrack.acc();
1735 acc_ph = acc_obj.photo_electron();
1736 acc_qual = acc_obj.quality();
1740 auto cdcExtraInfo =
m_belleTrkExtra.appendNew(trk_fit.first_x(), trk_fit.first_y(), trk_fit.first_z(),
1741 trk_fit.last_x(), trk_fit.last_y(), trk_fit.last_z(),
1742 tof, path_length, tof_qual, tof_sigma,
1743 acc_ph, acc_qual, dedx, dedx_qual);
1744 track->addRelationTo(cdcExtraInfo);
1747 int svdHitPattern = trk_fit.hit_svd();
1751 std::bitset<32> svdBitSet(svdHitPattern);
1755 unsigned short svdLayers;
1759 std::bitset<32> svdUMask(
static_cast<std::string
>(
"00000000000000000000000000000011"));
1761 std::bitset<32> svdVMask;
1764 if (
event->getExperiment() <= 27) {
1765 svdVMask = svdUMask << 6;
1768 svdVMask = svdUMask << 8;
1773 for (
unsigned short layerId = 0; layerId < svdLayers; layerId++) {
1774 unsigned short uHits = (svdBitSet & svdUMask).count();
1775 unsigned short vHits = (svdBitSet & svdVMask).count();
1776 patternVxd.
setSVDLayer(layerId + 3, uHits, vHits);
1785 TMatrixDSym cartesianCovariance(6);
1786 for (
unsigned i = 0; i < 7; i++) {
1789 for (
unsigned j = 0; j < 7; j++) {
1797 BFIELD, cartesianCovariance, pValue);
1799 TMatrixDSym helixCovariance = helixFromCartesian.
getCovariance();
1802 for (
unsigned int i = 0; i < 5; ++i)
1803 for (
unsigned int j = i; j < 5; ++j)
1804 helixError[counter++] = helixCovariance(i, j);
1809 track->setTrackFitResultIndex(pType, trackFit->getArrayIndex());
1837 B2WARNING(
"Trying to convert Gen_hepevt with idhep = " << idHep <<
1838 ". This should never happen.");
1841 mcParticle->
setPDG(idHep);
1844 if (genHepevt.isthep() > 0) {
1848 mcParticle->
setMass(genHepevt.M());
1850 ROOT::Math::PxPyPzEVector p4(genHepevt.PX(), genHepevt.PY(), genHepevt.PZ(), genHepevt.E());
1857 if (genHepevt.daFirst() > 0) {
1858 Belle::Gen_hepevt_Manager& genMgr = Belle::Gen_hepevt_Manager::get_manager();
1859 Belle::Gen_hepevt daughterParticle = genMgr(Belle::Panther_ID(genHepevt.daFirst()));
1864 mcParticle->
setDecayTime(std::numeric_limits<float>::infinity());
1881 eclCluster->
setPhi(ecl.phi());
1883 eclCluster->
setR(ecl.r());
1886 double covarianceMatrix[6];
1887 covarianceMatrix[0] = ecl.error(0);
1888 covarianceMatrix[1] = ecl.error(1);
1889 covarianceMatrix[2] = ecl.error(2);
1890 covarianceMatrix[3] = ecl.error(3);
1891 covarianceMatrix[4] = ecl.error(4);
1892 covarianceMatrix[5] = ecl.error(5);
1895 eclCluster->
setLAT(eclAux.width());
1902 float prop2 = eclAux.property(2);
1905 std::memcpy(&property2, &prop2,
sizeof(
int));
1908 tdccount = property2 & 0xffff;
1909 eclCluster->
setTime(tdccount);
1917 const double m_extRadius(125.0);
1918 const double m_extZFWD(196.0);
1919 const double m_extZBWD(-102.2);
1920 double minDist(10000);
1924 double eclClusterR_surface = m_extRadius / sin(eclCluster->
getTheta());
1925 if (reg == 1) {eclClusterR_surface = m_extZFWD / cos(eclCluster->
getTheta());}
1926 else if (reg == 3) {eclClusterR_surface = m_extZBWD / cos(eclCluster->
getTheta());}
1928 ROOT::Math::XYZVector eclCluster_surface_position(0, 0, 0);
1929 VectorUtil::setMagThetaPhi(eclCluster_surface_position, eclClusterR_surface, eclCluster->
getTheta(), eclCluster->
getPhi());
1931 for (
const auto& track :
m_tracks) {
1934 if (trackFit == NULL) {
continue;}
1936 const double z0 = trackFit->
getZ0();
1943 const double lHelixRadius = h.getArcLength2DAtCylindricalR(m_extRadius) > 0 ? h.getArcLength2DAtCylindricalR(m_extRadius) : 999999.;
1946 const double lFWD = (m_extZFWD - z0) / tanlambda > 0 ? (m_extZFWD - z0) / tanlambda : 999999.;
1949 const double lBWD = (m_extZBWD - z0) / tanlambda > 0 ? (m_extZBWD - z0) / tanlambda : 999999.;
1952 const double l = std::min(std::min(lHelixRadius, lFWD), lBWD);
1954 B2DEBUG(50, lHelixRadius <<
" " << lFWD <<
" " << lBWD <<
" -> " << l);
1956 ROOT::Math::XYZVector ext_helix = h.getPositionAtArcLength2D(l);
1957 double helixExtR_surface = m_extRadius / sin(ext_helix.Theta());
1958 if (l == lFWD) { helixExtR_surface = m_extZFWD / cos(ext_helix.Theta());}
1959 else if (l == lBWD) { helixExtR_surface = m_extZBWD / cos(ext_helix.Theta());}
1961 ROOT::Math::XYZVector helixExt_surface_position(0, 0, 0);
1962 VectorUtil::setMagThetaPhi(helixExt_surface_position, helixExtR_surface, ext_helix.Theta(), ext_helix.Phi());
1964 double distance = (eclCluster_surface_position - helixExt_surface_position).
R();
1965 if (distance < minDist) {minDist = distance;}
1967 if (minDist > 9999) minDist = -1;
1974 klmCluster->
setLayers(klm_cluster.layers());
1987 Belle::Mdst_ecl_trk_Manager& m = Belle::Mdst_ecl_trk_Manager::get_manager();
1988 Belle::Mdst_charged_Manager& chgMg = Belle::Mdst_charged_Manager::get_manager();
1993 std::vector<int> insert_order_types = {1, 2, 0};
1994 for (
auto& insert_type : insert_order_types) {
1995 for (Belle::Mdst_ecl_trk_Manager::iterator ecltrkIterator = m.begin(); ecltrkIterator != m.end(); ++ecltrkIterator) {
1996 Belle::Mdst_ecl_trk mECLTRK = *ecltrkIterator;
1998 if (mECLTRK.type() != insert_type)
2001 Belle::Mdst_ecl mdstEcl = mECLTRK.ecl();
2002 Belle::Mdst_trk mTRK = mECLTRK.trk();
2010 for (Belle::Mdst_charged_Manager::iterator chgIterator = chgMg.begin(); chgIterator != chgMg.end(); ++chgIterator) {
2011 Belle::Mdst_charged mChar = *chgIterator;
2012 Belle::Mdst_trk mTRK_in_charged = mChar.trk();
2014 if (mTRK_in_charged.get_ID() == mTRK.get_ID()) {
2016 tracksToECLClusters.
add(mChar.get_ID() - 1, mdstEcl.get_ID() - 1, 1.0);
2031 Belle::Mdst_klm_cluster_Manager& klm_cluster_manager = Belle::Mdst_klm_cluster_Manager::get_manager();
2034 for (Belle::Mdst_klm_cluster_Manager::iterator klmC_Ite = klm_cluster_manager.begin(); klmC_Ite != klm_cluster_manager.end();
2037 Belle::Mdst_klm_cluster mdstKlm_cluster = *klmC_Ite;
2038 Belle::Mdst_trk mTRK = mdstKlm_cluster.trk();
2039 Belle::Mdst_ecl mECL = mdstKlm_cluster.ecl();
2041 if (mTRK) klmClustersToTracks.
add(mdstKlm_cluster.get_ID() - 1, mTRK.get_ID() - 1);
2042 if (mECL) klmClustersToEclClusters.
add(mdstKlm_cluster.get_ID() - 1, mECL.get_ID() - 1);
2059 const int mask = 0x00f00000;
2060 int high_bits =
id & mask;
2061 if (high_bits == 0 || high_bits == mask)
return id;
2121 int bellePDGCode = belleMC.idhep();
2122 int belleIIPDGCode = mcP->
getPDG();
2124 if (bellePDGCode == 0)
2125 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to Gen_hepevt with idhep = 0.");
2127 if (bellePDGCode != belleIIPDGCode)
2128 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to different MCParticle! " << bellePDGCode <<
" vs. " <<
2131 const double belleMomentum[] = { belleMC.PX(), belleMC.PY(), belleMC.PZ() };
2134 for (
unsigned i = 0; i < 3; i++) {
2135 double relDev = (belle2Momentum[i] - belleMomentum[i]) / belleMomentum[i];
2137 if (relDev > 1e-3) {
2138 B2WARNING(
"[B2BIIConvertMdstModule] " << objectName <<
" matched to different MCParticle!");
2139 B2INFO(
" - Gen_hepevt [" << bellePDGCode <<
"] px/py/pz = " << belleMC.PX() <<
"/" << belleMC.PY() <<
"/" << belleMC.PZ());
2140 B2INFO(
" - TrackFitResult [" << belleIIPDGCode <<
"] px/py/pz = " << mcP->
get4Vector().Px() <<
"/" << mcP->
get4Vector().Py() <<
"/"
2148 CLHEP::HepLorentzVector& momentum,
HepPoint3D& position, CLHEP::HepSymMatrix& error)
2150 const HepPoint3D pivot(vee.vx(), vee.vy(), vee.vz());
2151 CLHEP::HepVector a(5);
2152 CLHEP::HepSymMatrix Ea(5, 0);
2154 a[0] = vee.daut().helix_p(0); a[1] = vee.daut().helix_p(1);
2155 a[2] = vee.daut().helix_p(2); a[3] = vee.daut().helix_p(3);
2156 a[4] = vee.daut().helix_p(4);
2157 Ea[0][0] = vee.daut().error_p(0); Ea[1][0] = vee.daut().error_p(1);
2158 Ea[1][1] = vee.daut().error_p(2); Ea[2][0] = vee.daut().error_p(3);
2159 Ea[2][1] = vee.daut().error_p(4); Ea[2][2] = vee.daut().error_p(5);
2160 Ea[3][0] = vee.daut().error_p(6); Ea[3][1] = vee.daut().error_p(7);
2161 Ea[3][2] = vee.daut().error_p(8); Ea[3][3] = vee.daut().error_p(9);
2162 Ea[4][0] = vee.daut().error_p(10); Ea[4][1] = vee.daut().error_p(11);
2163 Ea[4][2] = vee.daut().error_p(12); Ea[4][3] = vee.daut().error_p(13);
2164 Ea[4][4] = vee.daut().error_p(14);
2166 a[0] = vee.daut().helix_m(0); a[1] = vee.daut().helix_m(1);
2167 a[2] = vee.daut().helix_m(2); a[3] = vee.daut().helix_m(3);
2168 a[4] = vee.daut().helix_m(4);
2169 Ea[0][0] = vee.daut().error_m(0); Ea[1][0] = vee.daut().error_m(1);
2170 Ea[1][1] = vee.daut().error_m(2); Ea[2][0] = vee.daut().error_m(3);
2171 Ea[2][1] = vee.daut().error_m(4); Ea[2][2] = vee.daut().error_m(5);
2172 Ea[3][0] = vee.daut().error_m(6); Ea[3][1] = vee.daut().error_m(7);
2173 Ea[3][2] = vee.daut().error_m(8); Ea[3][3] = vee.daut().error_m(9);
2174 Ea[4][0] = vee.daut().error_m(10); Ea[4][1] = vee.daut().error_m(11);
2175 Ea[4][2] = vee.daut().error_m(12); Ea[4][3] = vee.daut().error_m(13);
2176 Ea[4][4] = vee.daut().error_m(14);
2179 Belle::Helix helix(pivot, a, Ea);
2182 momentum = helix.momentum(0., pType.
getMass(), position, error);
2186 std::vector<float>& helixError)
2188 const HepPoint3D pivot(vee.vx(), vee.vy(), vee.vz());
2189 CLHEP::HepVector a(5);
2190 CLHEP::HepSymMatrix Ea(5, 0);
2192 a[0] = vee.daut().helix_p(0); a[1] = vee.daut().helix_p(1);
2193 a[2] = vee.daut().helix_p(2); a[3] = vee.daut().helix_p(3);
2194 a[4] = vee.daut().helix_p(4);
2195 Ea[0][0] = vee.daut().error_p(0);
2196 Ea[1][0] = vee.daut().error_p(1);
2197 Ea[1][1] = vee.daut().error_p(2);
2198 Ea[2][0] = vee.daut().error_p(3);
2199 Ea[2][1] = vee.daut().error_p(4);
2200 Ea[2][2] = vee.daut().error_p(5);
2201 Ea[3][0] = vee.daut().error_p(6);
2202 Ea[3][1] = vee.daut().error_p(7);
2203 Ea[3][2] = vee.daut().error_p(8);
2204 Ea[3][3] = vee.daut().error_p(9);
2205 Ea[4][0] = vee.daut().error_p(10);
2206 Ea[4][1] = vee.daut().error_p(11);
2207 Ea[4][2] = vee.daut().error_p(12);
2208 Ea[4][3] = vee.daut().error_p(13);
2209 Ea[4][4] = vee.daut().error_p(14);
2211 a[0] = vee.daut().helix_m(0); a[1] = vee.daut().helix_m(1);
2212 a[2] = vee.daut().helix_m(2); a[3] = vee.daut().helix_m(3);
2213 a[4] = vee.daut().helix_m(4);
2214 Ea[0][0] = vee.daut().error_m(0);
2215 Ea[1][0] = vee.daut().error_m(1);
2216 Ea[1][1] = vee.daut().error_m(2);
2217 Ea[2][0] = vee.daut().error_m(3);
2218 Ea[2][1] = vee.daut().error_m(4);
2219 Ea[2][2] = vee.daut().error_m(5);
2220 Ea[3][0] = vee.daut().error_m(6);
2221 Ea[3][1] = vee.daut().error_m(7);
2222 Ea[3][2] = vee.daut().error_m(8);
2223 Ea[3][3] = vee.daut().error_m(9);
2224 Ea[4][0] = vee.daut().error_m(10);
2225 Ea[4][1] = vee.daut().error_m(11);
2226 Ea[4][2] = vee.daut().error_m(12);
2227 Ea[4][3] = vee.daut().error_m(13);
2228 Ea[4][4] = vee.daut().error_m(14);
2231 Belle::Helix helix(pivot, a, Ea);
2236 CLHEP::HepSymMatrix error5x5(5, 0);
2239 unsigned int size = 5;
2240 unsigned int counter = 0;
2241 for (
unsigned int i = 0; i < size; i++)
2242 for (
unsigned int j = i; j < size; j++)
2243 helixError[counter++] = error5x5[i][j];
2248 const CLHEP::HepSymMatrix& error,
2249 const short int charge,
2252 const uint64_t hitPatternCDCInitializer,
2253 const uint32_t hitPatternVXDInitializer,
2256 ROOT::Math::XYZVector pos(position.x(), position.y(), position.z());
2257 ROOT::Math::XYZVector mom(momentum.px(), momentum.py(), momentum.pz());
2259 TMatrixDSym errMatrix(6);
2260 for (
unsigned i = 0; i < 7; i++) {
2263 for (
unsigned j = 0; j < 7; j++) {
2274 return TrackFitResult(pos, mom, errMatrix, charge, pType, pValue,
BFIELD, hitPatternCDCInitializer, hitPatternVXDInitializer, ndf);
2279 if (!pid)
return 0.5;
2286 if (acc_sig + acc_bkg > 0.0)
2287 acc = acc_sig / (acc_sig + acc_bkg);
2294 double tof_all = tof_sig + tof_bkg;
2296 tof = tof_sig / tof_all;
2297 if (tof < 0.001) tof = 0.001;
2298 if (tof > 0.999) tof = 0.999;
2306 double cdc_all = cdc_sig + cdc_bkg;
2308 cdc = cdc_sig / cdc_all;
2309 if (cdc < 0.001) cdc = 0.001;
2310 if (cdc > 0.999) cdc = 0.999;
2314 double pid_sig = acc * tof * cdc;
2315 double pid_bkg = (1. - acc) * (1. - tof) * (1. - cdc);
2317 return pid_sig / (pid_sig + pid_bkg);
2323 B2DEBUG(99,
"B2BIIConvertMdst: endRun done.");
2329 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.
double computeTrkMinDistanceBelle(ECLCluster *eclCluster)
calculate the minimal distance between a cluster and a set of tracks on the ECL surface.
virtual void endRun() override
Called when the current run is finished.
bool m_nisEnable
Flag to switch on conversion of nisKsFinder info.
StoreArray< TrackFitResult > m_trackFitResults
Track fir results.
BeamSpot m_beamSpot
Interaction Point of the beam.
StoreArray< Particle > m_particles
Particles.
virtual void terminate() override
Terminates the module.
OptionalDBObjPtr< CollisionInvariantMass > m_collisionInvMDB
CollisionInvariantMass for Invariant Mass of Beam.
void convertHelix(Belle::Helix &helix, std::vector< float > &helixParams, CLHEP::HepSymMatrix &error5x5)
Converts Belle's Helix parameters and it's covariance matrix to Belle II's version.
void convertMdstPi0Table()
Reads all entries of Mdst_Pi0 Panther table, creates a particle list 'pi0:mdst' and adds them to Stor...
std::map< int, int > genHepevtToMCParticle
map of Gen_hepevt Panther IDs and corresponding MCParticle StoreArray indices
void testMCRelation(const Belle::Gen_hepevt &belleMC, const MCParticle *mcP, const std::string &objectName)
Checks if the reconstructed object (Track, ECLCluster, ...) was matched to the same MCParticle.
bool m_convertNbar
Flag to create anti-n0:mdst list from gamma:mdst.
void convertIPProfile(bool beginRun=false)
Stores the IPProfiles in BeamSpot (currently in DataStore)
void convertMdstECLObject(const Belle::Mdst_ecl &ecl, const Belle::Mdst_ecl_aux &eclAux, ECLCluster *eclCluster)
Converts Mdst_ecl(_aux) record to ECLCluster object.
CollisionInvariantMass m_collisionInvM
CollisionInvariantMass for the invariant mass of the beam.
bool m_convertBeamParameters
Convert beam parameters or use information stored in Belle II database.
static double acc_pid(const Belle::Mdst_charged &chg, int idp)
Returns ACC likelihood for given hypothesis idp.
virtual void beginRun() override
Module functions to be called from event process.
StoreArray< Track > m_tracks
Tracks.
void convertBeamEnergy()
Stores beam parameters (energy, angles) in CollisionInvariantMass and CollisionBoostVector (currently...
void convertPIDData(const Belle::Mdst_charged &belleTrack, const Track *track)
Get PID information for belleTrack and add it to PIDLikelihood (with relation from track).
void convertMdstKLMObject(const Belle::Mdst_klm_cluster &klm, KLMCluster *klmCluster)
Converts Mdst_klm_cluster record to KLMCluster object.
Belle2::MCParticleGraph m_particleGraph
MCParticle Graph to build Belle2 MC Particles.
void convertMdstKLongTable()
Reads all entries of Mdst_Klong Panther table, creates a particle list 'K_L0:mdst' and adds them to S...
OptionalDBObjPtr< BeamSpot > m_beamSpotDB
BeamSpot for IP.
bool m_realData
flag that tells whether given data sample is for real data or MC
StoreArray< ECLCluster > m_eclClusters
ECL clusters.
void convertGenHepevtObject(const Belle::Gen_hepevt &genHepevt, MCParticleGraph::GraphParticle *mcParticle)
Converts Gen_hepevt record to MCParticleGraph object.
void initializeDataStore()
Initializes Belle II DataStore.
void convertMdstECLTable()
Reads and converts all entries of Mdst_ecl(_aux) Panther table to ECLCluster dataobjects and adds the...
CollisionBoostVector m_collisionBoostVector
CollisionBoostVector for bosst vector of the beam.
std::string m_mcMatchingModeString
MC matching mode.
int m_lastIPProfileBin
variable to tell us which IPProfile bin was active last time we looked
void convertMdstKLMTable()
Reads and converts all entries of Mdst_klm_cluster Panther table to KLMCluster dataobjects and adds t...
bool m_convertRecTrg
Flag to switch on conversion of rectrg_summary3.
std::map< int, int > mdstGammaToParticle
map of gamma Panther IDs and corresponding Particle StoreArray indices
static const Const::ChargedStable c_belleHyp_to_chargedStable[c_nHyp]
maps Belle hypotheses to Const::ChargedStable (from http://belle.kek.jp/secured/wiki/doku....
std::map< int, int > mdstKlongToParticle
map of Klong Panther IDs and corresponding Particle StoreArray indices
double m_matchType2E9oE25Threshold
E9/E25 threshold value clusters with a value above this threshold are classified as neutral even if t...
void convertMdstChargedObject(const Belle::Mdst_charged &belleTrack, Track *track)
Converts Mdst_charged (Mdst_trk(_fit)) record to Track (TrackFitResult) object.
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).
double getPhi() const
Return Corrected Phi of Shower (radian).
void setdeltaL(double deltaL)
Set deltaL for shower shape.
void setEnergyHighestCrystal(double energyhighestcrystal)
Set energy of highest energetic crystal (GeV).
void setEnergyRaw(double energyraw)
Set Uncorrect Energy deposited (GeV).
void setTime(double time)
Set time information.
void setCovarianceMatrix(double covArray[6])
Set covariance matrix (3x3), i.e.
void setMinTrkDistance(double distance)
Set distance between cluster COG and track extrapolation to ECL.
int getDetectorRegion() const
Return detector region: 0: below acceptance, 1: FWD, 2: BRL, 3: BWD, 11: FWDGAP, 13: BWDGAP.
void setLAT(double LAT)
Set Lateral distribution parameter.
double getEnergy(EHypothesisBit hypothesis) const
Return Energy (GeV).
void setNumberOfCrystals(double noc)
Set number of crystals (sum of weights).
void setEnergy(double energy)
Set Corrected Energy (GeV).
double getTheta() const
Return Corrected Theta of Shower (radian).
void setIsTrack(bool istrack)
Set m_isTrack true if the cluster matches with a track.
@ c_nPhotons
CR is split into n photons (N1)
@ c_neutralHadron
CR is reconstructed as a neutral hadron (N2)
void setR(double r)
Set R (in cm).
Hit pattern of CDC hits within a track.
void setNHits(unsigned short nHits)
Sets the 8 MSBs to the total number of hits in the CDC.
ULong64_t getInteger() const
Getter for underlying integer type.
Hit pattern of the VXD within a track.
unsigned int getInteger() const
Getter for the underlying integer.
void setSVDLayer(const unsigned short layerId, unsigned short uHits, unsigned short vHits)
Set the number of hits in a specific layer of the SVD.
A class that describes the interval of experiments/runs for which an object in the database is valid.
void setLayers(int layers)
Set number of layers with hits.
void setClusterPosition(float globalX, float globalY, float globalZ)
Set global position.
void setInnermostLayer(int innermostLayer)
Set number of the innermost layer with hits.
Class to represent Particle data in graph.
void decaysInto(GraphParticle &daughter)
Tells the graph that this particle decays into daughter.
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.
double getZ0() const
Getter for z0.
ROOT::Math::XYZVector getMomentum() const
Getter for vector of momentum at closest approach of track in r/phi projection.
ROOT::Math::XYZVector getPosition() const
Getter for vector of position at closest approach of track in r/phi projection.
double getPhi0() const
Getter for phi0.
Class that bundles various TrackFitResults.
This class represents an ideal helix in perigee parameterization including the covariance matrix of t...
const TMatrixDSym & getCovariance() const
Getter for covariance matrix of perigee parameters in matrix form.
static const double mm
[millimeters]
REG_MODULE(arichBtest)
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
double sqrt(double a)
sqrt for 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.