9 #include <analysis/VariableManager/Manager.h>
10 #include <analysis/variables/MCParticleTag.h>
13 #include <analysis/utility/GenBplusTag.h>
14 #include <analysis/utility/GenB0Tag.h>
15 #include <analysis/utility/GenBsTag.h>
16 #include <analysis/utility/GenDTag.h>
17 #include <analysis/utility/GenTauTag.h>
20 #include <mdst/dataobjects/MCParticle.h>
23 #include <framework/datastore/StoreArray.h>
24 #include <framework/gearbox/Const.h>
25 #include <framework/logging/Logger.h>
39 double BplusMode(
const Particle*)
42 StoreArray<MCParticle> MC_Particle_list;
43 if (!MC_Particle_list) {
44 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
45 return std::numeric_limits<double>::quiet_NaN();
49 for (
const auto& iMCParticle : MC_Particle_list) {
50 if (iMCParticle.getPDG() != 521)
continue;
52 std::vector<int> DauPDG;
53 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
54 DauPDG.push_back(mcDaughter->getPDG());
56 modeB = gBtag.Mode_B_plus(DauPDG);
63 double BminusMode(
const Particle*)
66 StoreArray<MCParticle> MC_Particle_list;
67 if (!MC_Particle_list) {
68 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
69 return std::numeric_limits<double>::quiet_NaN();
73 for (
const auto& iMCParticle : MC_Particle_list) {
74 if (iMCParticle.getPDG() != -521)
continue;
76 std::vector<int> DauPDG;
77 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
78 DauPDG.push_back(mcDaughter->getPDG());
80 modeB = gBtag.Mode_B_minus(DauPDG);
87 double B0Mode(
const Particle*)
90 StoreArray<MCParticle> MC_Particle_list;
91 if (!MC_Particle_list) {
92 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
93 return std::numeric_limits<double>::quiet_NaN();
95 int modeB1 = -99, modeB2 = -99, modeB = -99, nb1 = 0, nb2 = 0;
97 for (
const auto& iMCParticle : MC_Particle_list) {
98 if (iMCParticle.getPDG() == 511) {
101 std::vector<int> DauPDG1;
102 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
103 DauPDG1.push_back(mcDaughter->getPDG());
105 modeB1 = gBtag.Mode_B0(DauPDG1);
109 if (iMCParticle.getPDG() == -511) {
112 std::vector<int> DauPDG2;
113 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
114 DauPDG2.push_back(mcDaughter->getPDG());
116 modeB2 = gBtag.Mode_anti_B0(DauPDG2);
122 if (modeB1 != -99) { modeB = modeB1;}
123 else if (modeB2 != -99) { modeB = modeB2;}
128 double Bbar0Mode(
const Particle*)
131 StoreArray<MCParticle> MC_Particle_list;
132 if (!MC_Particle_list) {
133 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
134 return std::numeric_limits<double>::quiet_NaN();
136 int modeB1 = -99, modeB2 = -99, modeB = -99, nb1 = 0, nb2 = 0;
138 for (
const auto& iMCParticle : MC_Particle_list) {
139 if (iMCParticle.getPDG() == -511) {
142 std::vector<int> DauPDG1;
143 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
144 DauPDG1.push_back(mcDaughter->getPDG());
146 modeB1 = gBtag.Mode_anti_B0(DauPDG1);
150 if (iMCParticle.getPDG() == 511) {
153 std::vector<int> DauPDG2;
154 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
155 DauPDG2.push_back(mcDaughter->getPDG());
157 modeB2 = gBtag.Mode_B0(DauPDG2);
163 if (modeB1 != -99) { modeB = modeB1;}
164 else if (modeB2 != -99) { modeB = modeB2;}
169 double Bs0Mode(
const Particle*)
172 StoreArray<MCParticle> MC_Particle_list;
173 if (!MC_Particle_list) {
174 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
175 return std::numeric_limits<double>::quiet_NaN();
177 int modeB1 = -99, modeB2 = -99, modeB = -99, nb1 = 0, nb2 = 0;
179 for (
const auto& iMCParticle : MC_Particle_list) {
180 if (iMCParticle.getPDG() == 531) {
183 std::vector<int> DauPDG1;
184 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
185 DauPDG1.push_back(mcDaughter->getPDG());
187 modeB1 = gBtag.Mode_Bs0(DauPDG1);
191 if (iMCParticle.getPDG() == -531) {
194 std::vector<int> DauPDG2;
195 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
196 DauPDG2.push_back(mcDaughter->getPDG());
198 modeB2 = gBtag.Mode_anti_Bs0(DauPDG2);
204 if (modeB1 != -99) { modeB = modeB1;}
205 else if (modeB2 != -99) { modeB = modeB2;}
210 double Bsbar0Mode(
const Particle*)
213 StoreArray<MCParticle> MC_Particle_list;
214 if (!MC_Particle_list) {
215 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
216 return std::numeric_limits<double>::quiet_NaN();
218 int modeB1 = -99, modeB2 = -99, modeB = -99, nb1 = 0, nb2 = 0;
220 for (
const auto& iMCParticle : MC_Particle_list) {
221 if (iMCParticle.getPDG() == -531) {
224 std::vector<int> DauPDG1;
225 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
226 DauPDG1.push_back(mcDaughter->getPDG());
228 modeB1 = gBtag.Mode_anti_Bs0(DauPDG1);
232 if (iMCParticle.getPDG() == 531) {
235 std::vector<int> DauPDG2;
236 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
237 DauPDG2.push_back(mcDaughter->getPDG());
239 modeB2 = gBtag.Mode_Bs0(DauPDG2);
245 if (modeB1 != -99) { modeB = modeB1;}
246 else if (modeB2 != -99) { modeB = modeB2;}
251 double DstplusMode(
const Particle*)
254 StoreArray<MCParticle> MC_Particle_list;
255 if (!MC_Particle_list) {
256 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
257 return std::numeric_limits<double>::quiet_NaN();
261 for (
const auto& iMCParticle : MC_Particle_list) {
262 if (iMCParticle.getPDG() != 413)
continue;
264 std::vector<int> DauPDG;
265 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
266 DauPDG.push_back(mcDaughter->getPDG());
268 modeD = gDtag.Mode_Dst_plus(DauPDG);
275 double DstminusMode(
const Particle*)
278 StoreArray<MCParticle> MC_Particle_list;
279 if (!MC_Particle_list) {
280 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
281 return std::numeric_limits<double>::quiet_NaN();
285 for (
const auto& iMCParticle : MC_Particle_list) {
286 if (iMCParticle.getPDG() != -413)
continue;
288 std::vector<int> DauPDG;
289 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
290 DauPDG.push_back(mcDaughter->getPDG());
292 modeD = gDtag.Mode_Dst_minus(DauPDG);
299 double DsplusMode(
const Particle*)
302 StoreArray<MCParticle> MC_Particle_list;
303 if (!MC_Particle_list) {
304 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
305 return std::numeric_limits<double>::quiet_NaN();
309 for (
const auto& iMCParticle : MC_Particle_list) {
310 if (iMCParticle.getPDG() != 431)
continue;
312 std::vector<int> DauPDG;
313 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
314 DauPDG.push_back(mcDaughter->getPDG());
316 modeD = gDtag.Mode_Ds_plus(DauPDG);
323 double DsminusMode(
const Particle*)
326 StoreArray<MCParticle> MC_Particle_list;
327 if (!MC_Particle_list) {
328 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
329 return std::numeric_limits<double>::quiet_NaN();
333 for (
const auto& iMCParticle : MC_Particle_list) {
334 if (iMCParticle.getPDG() != -431)
continue;
336 std::vector<int> DauPDG;
337 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
338 DauPDG.push_back(mcDaughter->getPDG());
340 modeD = gDtag.Mode_Ds_minus(DauPDG);
347 double DplusMode(
const Particle*)
350 StoreArray<MCParticle> MC_Particle_list;
351 if (!MC_Particle_list) {
352 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
353 return std::numeric_limits<double>::quiet_NaN();
357 for (
const auto& iMCParticle : MC_Particle_list) {
358 if (iMCParticle.getPDG() != 411)
continue;
360 std::vector<int> DauPDG;
361 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
362 DauPDG.push_back(mcDaughter->getPDG());
364 modeD = gDtag.Mode_D_plus(DauPDG);
371 double DminusMode(
const Particle*)
374 StoreArray<MCParticle> MC_Particle_list;
375 if (!MC_Particle_list) {
376 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
377 return std::numeric_limits<double>::quiet_NaN();
381 for (
const auto& iMCParticle : MC_Particle_list) {
382 if (iMCParticle.getPDG() != -411)
continue;
384 std::vector<int> DauPDG;
385 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
386 DauPDG.push_back(mcDaughter->getPDG());
388 modeD = gDtag.Mode_D_minus(DauPDG);
395 double D0Mode(
const Particle*)
398 StoreArray<MCParticle> MC_Particle_list;
399 if (!MC_Particle_list) {
400 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
401 return std::numeric_limits<double>::quiet_NaN();
405 for (
const auto& iMCParticle : MC_Particle_list) {
406 if (iMCParticle.getPDG() != 421)
continue;
408 std::vector<int> DauPDG;
409 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
410 DauPDG.push_back(mcDaughter->getPDG());
412 modeD = gDtag.Mode_D0(DauPDG);
419 double Dbar0Mode(
const Particle*)
422 StoreArray<MCParticle> MC_Particle_list;
423 if (!MC_Particle_list) {
424 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
425 return std::numeric_limits<double>::quiet_NaN();
429 for (
const auto& iMCParticle : MC_Particle_list) {
430 if (iMCParticle.getPDG() != -421)
continue;
432 std::vector<int> DauPDG;
433 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
434 DauPDG.push_back(mcDaughter->getPDG());
436 modeD = gDtag.Mode_anti_D0(DauPDG);
443 double TauplusMode(
const Particle*)
446 StoreArray<MCParticle> MC_Particle_list;
447 if (!MC_Particle_list) {
448 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
449 return std::numeric_limits<double>::quiet_NaN();
453 for (
const auto& iMCParticle : MC_Particle_list) {
454 if (iMCParticle.getPDG() != -15)
continue;
456 std::vector<int> DauPDG;
457 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
458 if (mcDaughter->getPDG() == 24) {
459 for (
auto const& WDaughter : mcDaughter->getDaughters()) {
460 DauPDG.push_back(WDaughter->getPDG());
462 }
else DauPDG.push_back(mcDaughter->getPDG());
464 modeTau = gTKtag.Mode_tau_plus(DauPDG);
471 double TauminusMode(
const Particle*)
474 StoreArray<MCParticle> MC_Particle_list;
475 if (!MC_Particle_list) {
476 B2WARNING(
"GenMCTagTool::eval - missing MCParticles array");
477 return std::numeric_limits<double>::quiet_NaN();
481 for (
const auto& iMCParticle : MC_Particle_list) {
482 if (iMCParticle.getPDG() != 15)
continue;
484 std::vector<int> DauPDG;
485 for (
auto const& mcDaughter : iMCParticle.getDaughters()) {
486 if (mcDaughter->getPDG() == -24) {
487 for (
auto const& WDaughter : mcDaughter->getDaughters()) {
488 DauPDG.push_back(WDaughter->getPDG());
490 }
else DauPDG.push_back(mcDaughter->getPDG());
492 modeTau = gTKtag.Mode_tau_minus(DauPDG);
499 VARIABLE_GROUP(
"MCParticle tag variables");
500 REGISTER_VARIABLE(
"BplusMode", BplusMode,
"[Eventbased] It will return the decays mode of B+ particles");
501 REGISTER_VARIABLE(
"BminusMode", BminusMode,
"[Eventbased] It will return the decays mode of B- particles");
502 REGISTER_VARIABLE(
"B0Mode", B0Mode,
"[Eventbased] It will return the decays mode of B0 particles");
503 REGISTER_VARIABLE(
"Bbar0Mode", Bbar0Mode,
"[Eventbased] It will return the decays mode of anti-B0 particles");
504 REGISTER_VARIABLE(
"Bs0Mode", Bs0Mode,
"[Eventbased] It will return the decays mode of B_s0 particles");
505 REGISTER_VARIABLE(
"Bsbar0Mode", Bsbar0Mode,
"[Eventbased] It will return the decays mode of anti-B_s0 particles");
506 REGISTER_VARIABLE(
"DstplusMode", DstplusMode,
"[Eventbased] It will return the decays mode of D*+ particles");
507 REGISTER_VARIABLE(
"DstminusMode", DstminusMode,
"[Eventbased] It will return the decays mode of D*- particles");
508 REGISTER_VARIABLE(
"DsplusMode", DsplusMode,
"[Eventbased] It will return the decays mode of D_s+ particles");
509 REGISTER_VARIABLE(
"DsminusMode", DsminusMode,
"[Eventbased] It will return the decays mode of D_s- particles");
510 REGISTER_VARIABLE(
"DplusMode", DplusMode,
"[Eventbased] It will return the decays mode of D+ particles");
511 REGISTER_VARIABLE(
"DminusMode", DminusMode,
"[Eventbased] It will return the decays mode of D- particles");
512 REGISTER_VARIABLE(
"D0Mode", D0Mode,
"[Eventbased] It will return the decays mode of D0 particles");
513 REGISTER_VARIABLE(
"Dbar0Mode", Dbar0Mode,
"[Eventbased] It will return the decays mode of anti-D0 particles");
514 REGISTER_VARIABLE(
"TauplusMode", TauplusMode,
"[Eventbased] It will return the decays mode of tau+ particles");
515 REGISTER_VARIABLE(
"TauminusMode", TauminusMode,
"[Eventbased] It will return the decays mode of tau- particles");
Abstract base class for different kinds of events.