12 #include <b2bii/modules/BelleMCOutput/BelleMCOutputModule.h>
15 #include <framework/gearbox/Unit.h>
16 #include <framework/logging/Logger.h>
19 #include <belle_legacy/tables/belletdf.h>
20 #include <belle_legacy/tables/hepevt.h>
21 #include <belle_legacy/tables/filespec.h>
33 setDescription(
"Output of MC particle list in Belle format.");
35 addParam(
"outputFileName", m_OutputFileName,
36 "Output file name.", std::string(
"belle_mc.mdst"));
37 addParam(
"decayKsInGenerator", m_DecayKsInGenerator,
38 "Decay K_S0 in generator.",
false);
39 addParam(
"decayLambdaInGenerator", m_DecayLambdaInGenerator,
40 "Decay Lambda in generator.",
false);
56 "************ ATTENTION! ************\n"
58 " Belle MC generation differs from Belle II. In order to generate MC "
59 "correctly, you must do the following:\n"
61 " 1. Enable vertex and beam-momentum smearing by adding the module "
62 "\"OverrideGenerationFlags\" before the generator.\n"
63 " 2. Disable smearing in Belle simulation by removing the module "
64 "\"bpsmear\" from basf gsim scripts.\n"
66 "It is also necessary to consider the following differences:\n"
68 " 1. When converting the simulation result back to Belle II format, "
69 "it is recommended to disable conversion of beam parameters "
70 "(convertBeamParameters = False). Since the format of the table "
71 "BELLE_NOMINAL_BEAM is not sufficient to store an arbitrary covariance "
72 "matrix, the covariance matrix of IP position (BeamSpot) is not guaranteed "
73 "to be exactly the same after conversion.\n"
74 " 2. By default, decays of long-lived particles are removed and particles "
75 "are declared to be stable in generator (ISTHEP == 1 in basf) because "
76 "such decays are simulated by GEANT3 in basf. However, you may choose "
77 "to decay such particles via module parameters. This results in direct "
78 "passing of the decay products to simulation, i.e. material effects are "
79 "ignored. In this case, you may need to perform an additional study "
80 "of the difference between data and MC.\n"
82 "************************************\n"
88 Belle::Belle_file_specification_Manager& fileManager =
89 Belle::Belle_file_specification_Manager::get_manager();
94 Belle::Belle_file_specification& file = fileManager.add();
99 Belle::Belle_runhead_Manager& runheadManager =
100 Belle::Belle_runhead_Manager::get_manager();
101 runheadManager.remove();
102 Belle::Belle_runhead& runhead = runheadManager.add();
106 runhead.Time(time(
nullptr));
110 runhead.ELER(momentumLER.E());
111 runhead.EHER(momentumHER.E());
112 Belle::Belle_nominal_beam_Manager& beamManager =
113 Belle::Belle_nominal_beam_Manager::get_manager();
114 beamManager.remove();
115 Belle::Belle_nominal_beam& beam = beamManager.add();
116 beam.px_high(momentumHER.X());
117 beam.py_high(momentumHER.Y());
118 beam.pz_high(momentumHER.Z());
119 beam.px_low(momentumLER.X());
120 beam.py_low(momentumLER.Y());
121 beam.pz_low(momentumLER.Z());
123 beam.sigma_p_high(sqrt(herCovariance[0][0]));
125 beam.sigma_p_low(sqrt(lerCovariance[0][0]));
131 beam.ip_x(vertex.X());
132 beam.ip_y(vertex.Y());
133 beam.ip_z(vertex.Z());
135 beam.cang_high(momentumHER.Vect().Theta());
136 beam.cang_low(M_PI - momentumLER.Vect().Theta());
137 double angleIPZX = momentumHER.Vect().Theta() / 2;
138 beam.angle_ip_zx(angleIPZX);
144 rotationY.RotateY(-angleIPZX);
145 TMatrixD rotationMatrix(3, 3);
146 rotationMatrix[0][0] = rotationY.XX();
147 rotationMatrix[0][1] = rotationY.XY();
148 rotationMatrix[0][2] = rotationY.XZ();
149 rotationMatrix[1][0] = rotationY.YX();
150 rotationMatrix[1][1] = rotationY.YY();
151 rotationMatrix[1][2] = rotationY.YZ();
152 rotationMatrix[2][0] = rotationY.ZX();
153 rotationMatrix[2][1] = rotationY.ZY();
154 rotationMatrix[2][2] = rotationY.ZZ();
155 TMatrixDSym vertexCovariance2 = vertexCovariance.Similarity(rotationMatrix);
156 beam.sigma_ip_x(sqrt(vertexCovariance2[0][0]));
157 beam.sigma_ip_y(sqrt(vertexCovariance2[1][1]));
158 beam.sigma_ip_z(sqrt(vertexCovariance2[2][2]));
167 if (mother !=
nullptr)
168 part.comesFrom(*mother);
169 int pdg = abs(particle->getPDG());
185 std::vector<MCParticle*> daughters = particle->getDaughters();
192 Belle::Gen_hepevt_Manager& hepevtManager =
193 Belle::Gen_hepevt_Manager::get_manager();
194 hepevtManager.remove();
211 if (particle.getMother() ==
nullptr)
218 Belle::Gen_hepevt& hepevt = hepevtManager.add();
225 hepevt.idhep(particle.getPDG());
226 hepevt.reset_mother();
227 const MCParticle* mother = particle.getMother();
229 if (mother !=
nullptr)
230 motherIndex = mother->getIndex();
231 hepevt.moFirst(motherIndex);
232 hepevt.moLast(motherIndex);
233 hepevt.daFirst(particle.getFirstDaughter());
234 hepevt.daLast(particle.getLastDaughter());
235 TLorentzVector momentum = particle.get4Vector();
236 hepevt.PX(momentum.Px());
237 hepevt.PY(momentum.Py());
238 hepevt.PZ(momentum.Pz());
239 hepevt.E(momentum.E());
240 hepevt.M(particle.getMass());
241 TVector3 vertex = particle.getVertex();