9 #include <analysis/modules/TauDecayMode/TauDecayModeModule.h>
10 #include <framework/datastore/StoreArray.h>
11 #include <framework/datastore/StoreObjPtr.h>
12 #include <framework/logging/Logger.h>
13 #include <framework/particledb/EvtGenDatabasePDG.h>
17 #include <TParticlePDG.h>
24 std::map<std::string, int> make_map(
const std::string& file,
int chg)
29 B2INFO(
"Missing input mapping file: use mp_file_minus=basf2.find_file('data/analysis/modules/TauDecayMode/map_tauminus.txt') TauDecayMode.param('file_minus', mp_file_minus) to classify with default mapping.");
31 B2INFO(
"Missing input mapping file: use mp_file_plus=basf2.find_file('data/analysis/modules/TauDecayMode/map_tauplus.txt') TauDecayMode.param('file_plus', mp_file_plus) to classify with default mapping.");
42 std::map <std::string, int> map_tau;
45 istringstream ss(line);
62 m_mprong(0), m_pprong(0), tauPair(false), numOfTauMinus(0), numOfTauPlus(0), idOfTauMinus(-1), idOfTauPlus(-1),
63 m_isEtaPizPizPizFromTauMinus(false), m_isEtaPizPizPizFromTauPlus(false),
64 m_isOmegaPimPipFromTauMinus(false), m_isOmegaPimPipFromTauPlus(false)
67 setDescription(
"Module to identify generated tau pair decays, using MCParticle information."
68 "By default, each tau decay is numbered as TauolaBelle2DecayMode [Ref: BELLE2-NOTE-PH-2020-055]");
70 addParam(
"printmode", m_printmode,
"Printout more information from each event", std::string(
"default"));
71 addParam(
"file_minus", m_file_minus,
"Path for an alternative mapping for tau- decays", std::string(
""));
72 addParam(
"file_plus", m_file_plus,
"Path for an alternative mapping for tau+ decays", std::string(
""));
76 void TauDecayModeModule::initialize()
78 mode_decay_minus = make_map(m_file_minus, -1);
79 mode_decay_plus = make_map(m_file_plus, 1);
80 m_tauDecay.registerInDataStore();
81 m_event_metadata.isRequired();
85 void TauDecayModeModule::event()
91 AnalyzeTauPairEvent();
93 if (m_printmode ==
"missing") {
95 B2INFO(
"TauDecayMode:: EventNumber = " << m_event_metadata->getEvent()
96 <<
" Decay: tau- -> " << m_tauminusdecaymode <<
" Mode = " << m_mmode);
99 B2INFO(
"TauDecayMode:: EventNumber = " << m_event_metadata->getEvent()
100 <<
" Decay: tau+ -> " << m_tauplusdecaymode <<
" Mode = " << m_pmode);
104 if (m_printmode ==
"all") {
105 B2INFO(
"TauDecayMode:: EventNumber = " << m_event_metadata->getEvent()
106 <<
" Decay: tau- -> " << m_tauminusdecaymode <<
" Mode = " << m_mmode);
107 B2INFO(
"TauDecayMode:: EventNumber = " << m_event_metadata->getEvent()
108 <<
" Decay: tau+ -> " << m_tauplusdecaymode <<
" Mode = " << m_pmode);
113 m_taum_no = m_taum_no - 1;
117 m_taup_no = m_taup_no - 1;
121 m_pprong = getProngOfDecay(*MCParticles[idOfTauPlus - 1]);
122 m_mprong = getProngOfDecay(*MCParticles[idOfTauMinus - 1]);
131 if (!m_tauDecay) m_tauDecay.create();
132 m_tauDecay->addTauMinusIdMode(m_mmode);
133 m_tauDecay->addTauPlusIdMode(m_pmode);
135 m_tauDecay->addTauPlusMcProng(m_pprong);
136 m_tauDecay->addTauMinusMcProng(m_mprong);
140 void TauDecayModeModule::AnalyzeTauPairEvent()
172 vec_kstar0_br.clear();
178 vec_a00_1450.clear();
179 vec_a0m_1450.clear();
180 vec_a0p_1450.clear();
190 map<int, std::vector<int>> map_vec;
192 map_vec[11] = vec_em;
193 map_vec[-11] = vec_ep;
194 map_vec[12] = vec_nue;
195 map_vec[-12] = vec_anue;
196 map_vec[13] = vec_mum;
197 map_vec[-13] = vec_mup;
198 map_vec[14] = vec_numu;
199 map_vec[-14] = vec_anumu;
200 map_vec[16] = vec_nut;
201 map_vec[-16] = vec_anut;
202 map_vec[-211] = vec_pim;
203 map_vec[211] = vec_pip;
204 map_vec[-321] = vec_km;
205 map_vec[321] = vec_kp;
206 map_vec[-2212] = vec_apro;
207 map_vec[2212] = vec_pro;
208 map_vec[111] = vec_pi0;
209 map_vec[310] = vec_k0s;
210 map_vec[130] = vec_k0l;
211 map_vec[221] = vec_eta;
212 map_vec[223] = vec_omega;
213 map_vec[331] = vec_etapr;
214 map_vec[333] = vec_phi;
215 map_vec[-213] = vec_rhom;
216 map_vec[213] = vec_rhop;
217 map_vec[113] = vec_rho0;
218 map_vec[-323] = vec_kstarm;
219 map_vec[323] = vec_kstarp;
220 map_vec[313] = vec_kstar0;
221 map_vec[-313] = vec_kstar0_br;
222 map_vec[-20213] = vec_a1m;
223 map_vec[20213] = vec_a1p;
224 map_vec[-9000211] = vec_a0m_980;
225 map_vec[9000211] = vec_a0p_980;
226 map_vec[9000111] = vec_a00_980;
227 map_vec[-10211] = vec_a0m_1450;
228 map_vec[10211] = vec_a0p_1450;
229 map_vec[10111] = vec_a00_1450;
230 map_vec[-10213] = vec_b1m;
231 map_vec[10213] = vec_b1p;
232 map_vec[20223] = vec_f1;
233 map_vec[9010221] = vec_f0;
234 map_vec[3122] = vec_lambda;
235 map_vec[-3122] = vec_lmb_br;
236 map_vec[94144] = vec_alpha;
237 map_vec[22] = vec_gam;
239 bool elecFirst =
true;
240 bool muonFirst =
true;
242 bool isPiPizGamTauMinusFirst =
true;
243 bool isPiPizGamTauPlusFirst =
true;
245 bool isLFVTauMinus2BodyDecayFirst =
true;
246 bool isLFVTauPlus2BodyDecayFirst =
true;
248 bool isChargedRhoFromTauMinusFirst =
true;
249 bool isChargedRhoFromTauPlusFirst =
true;
251 bool isChargedA1FromTauMinusFirst =
true;
252 bool isChargedA1FromTauPlusFirst =
true;
254 bool isEtaPPGFromTauMinusFirst =
true;
255 bool isEtaPPGFromTauPlusFirst =
true;
257 bool isOmegaPizGamFromTauMinusFirst =
true;
258 bool isOmegaPizGamFromTauPlusFirst =
true;
260 bool isEtaPizPizPizFromTauMinusFirst =
true;
261 bool isEtaPizPizPizFromTauPlusFirst =
true;
263 m_isEtaPizPizPizFromTauMinus =
false;
264 m_isEtaPizPizPizFromTauPlus =
false;
266 bool isOmegaPimPipFromTauMinusFirst =
true;
267 bool isOmegaPimPipFromTauPlusFirst =
true;
269 m_isOmegaPimPipFromTauMinus =
false;
270 m_isOmegaPimPipFromTauPlus =
false;
273 for (
int i = 0; i < MCParticles.getEntries(); i++) {
277 int pdgid = p.getPDG();
279 if (pdgid == -Const::Klong.getPDGCode()) pdgid = Const::Klong.getPDGCode();
281 if (!p.hasStatus(MCParticle::c_PrimaryParticle))
283 if (p.isInitial())
continue;
285 if (pdgid == Const::electron.getPDGCode() && elecFirst) {
288 const vector<MCParticle*> daughters = mother->getDaughters();
291 stringstream elec_ss;
293 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
294 elec_ss << d->getPDG() <<
" ";
295 if (d->getPDG() == Const::electron.getPDGCode()) nElMinus++;
296 if (d->getPDG() == -Const::electron.getPDGCode()) nElPlus++;
298 if (nElMinus == 1 && nElPlus == 1) {
299 B2DEBUG(1,
"Mother of elec pair is = " << mother->getPDG() <<
" which has daughters : " << elec_ss.str());
303 if (pdgid == Const::muon.getPDGCode() && muonFirst) {
306 const vector<MCParticle*> daughters = mother->getDaughters();
309 stringstream muon_ss;
311 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
312 muon_ss << d->getPDG() <<
" ";
313 if (d->getPDG() == Const::muon.getPDGCode()) nMuMinus++;
314 if (d->getPDG() == -Const::muon.getPDGCode()) nMuPlus++;
316 if (nMuMinus == 1 && nMuPlus == 1) {
317 B2DEBUG(1,
"Mother of muon pair is = " << mother->getPDG() <<
" which has daughters : " << muon_ss.str());
322 bool accept_photon =
false;
323 if (pdgid == Const::photon.getPDGCode()) {
325 int mothid = abs(mother->getPDG());
328 bool isRadiationfromFinalStateChargedParticle =
false;
335 isRadiationfromFinalStateChargedParticle =
true;
339 bool isRadiationFromChargedRho =
false;
341 int chg = getRecursiveMotherCharge(mother);
342 if (chg < 0 && isChargedRhoFromTauMinusFirst) {
343 isChargedRhoFromTauMinusFirst =
false;
344 isRadiationFromChargedRho =
true;
346 if (chg > 0 && isChargedRhoFromTauPlusFirst) {
347 isChargedRhoFromTauPlusFirst =
false;
348 isRadiationFromChargedRho =
true;
353 bool isRadiationFromChargedA1 =
false;
354 if (mothid == 20213) {
355 int chg = getRecursiveMotherCharge(mother);
356 if (chg < 0 && isChargedA1FromTauMinusFirst) {
357 isChargedA1FromTauMinusFirst =
false;
358 isRadiationFromChargedA1 =
true;
360 if (chg > 0 && isChargedA1FromTauPlusFirst) {
361 isChargedA1FromTauPlusFirst =
false;
362 isRadiationFromChargedA1 =
true;
367 bool isRadiationfromIntermediateWBoson =
false;
368 if (mothid == 24) isRadiationfromIntermediateWBoson =
true;
373 bool isPiPizGam =
false;
374 if (isRadiationfromIntermediateWBoson) {
375 if (p.get4Vector().E() > 0.050) {
376 const vector<MCParticle*> daughters = mother->getDaughters();
380 int nOtherSisters = 0;
382 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
384 if (abs(d->getPDG()) == 211) {
386 }
else if (abs(d->getPDG()) == 111) {
388 }
else if (abs(d->getPDG()) != 22) {
393 if (nTotSisters >= 3 && nPiSisters == 1 && nPizSisters == 1 && nOtherSisters == 0) {
394 int chg = getRecursiveMotherCharge(mother);
395 if (chg < 0 && isPiPizGamTauMinusFirst) {
396 isPiPizGamTauMinusFirst =
false;
399 if (chg > 0 && isPiPizGamTauPlusFirst) {
400 isPiPizGamTauPlusFirst =
false;
408 bool isRadiationfromTau =
false;
409 if (mothid == 15) isRadiationfromTau =
true;
412 bool isLFVTau2BodyDecay =
false;
413 if (isRadiationfromTau) {
414 bool hasNeutrinoAsSister =
false;
415 int numChargedSister = 0;
416 int numNeutralNonNeutrinoNonPhotonSister = 0;
417 const vector<MCParticle*> daughters = mother->getDaughters();
419 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
420 hasNeutrinoAsSister = find(begin(Neutrinos), end(Neutrinos), abs(d->getPDG())) != end(Neutrinos);
421 if (hasNeutrinoAsSister)
break;
423 if (!hasNeutrinoAsSister) {
425 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
426 bool isChargedFinalState = find(begin(finalStatePDGs), end(finalStatePDGs), abs(d->getPDG())) != end(finalStatePDGs);
427 if (isChargedFinalState) {
429 }
else if (d->getPDG() != 22) {
430 numNeutralNonNeutrinoNonPhotonSister++;
433 if (numChargedSister == 1 && numNeutralNonNeutrinoNonPhotonSister == 0) {
434 if (mother->getPDG() == 15 && isLFVTauMinus2BodyDecayFirst) {
435 isLFVTauMinus2BodyDecayFirst =
false;
436 isLFVTau2BodyDecay =
true;
438 if (mother->getPDG() == -15 && isLFVTauPlus2BodyDecayFirst) {
439 isLFVTauPlus2BodyDecayFirst =
false;
440 isLFVTau2BodyDecay =
true;
444 B2DEBUG(1,
"hasNeutrinoAsSister = " << hasNeutrinoAsSister
445 <<
" numChargedSister = " << numChargedSister
446 <<
" numNeutralNonNeutrinoNonPhotonSister = " << numNeutralNonNeutrinoNonPhotonSister
447 <<
" isLFVTau2BodyDecay = " << isLFVTau2BodyDecay);
450 bool isPi0GG =
false;
451 bool isEtaGG =
false;
452 bool isEtpGG =
false;
453 bool isPi0GEE =
false;
454 bool isEtaPPG =
false;
455 bool isOmPizG =
false;
456 if (mothid == 111 || mothid == 221 || mothid == 331 || mothid == 223) {
457 const vector<MCParticle*> daughters = mother->getDaughters();
458 int numberofTotalDaughters = 0;
459 int numberOfPhotonDaughters = 0;
460 int numberOfElectronDaughters = 0;
461 int numberOfPionDaughters = 0;
462 int numberOfPizDaughters = 0;
464 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
465 numberofTotalDaughters ++;
466 if (abs(d->getPDG()) == 22) numberOfPhotonDaughters++;
467 if (abs(d->getPDG()) == 11) numberOfElectronDaughters++;
468 if (abs(d->getPDG()) == 211) numberOfPionDaughters++;
469 if (abs(d->getPDG()) == 111) numberOfPizDaughters++;
471 if (numberofTotalDaughters == 2 && numberOfPhotonDaughters == 2) {
472 if (mothid == 111) isPi0GG =
true;
473 if (mothid == 221) isEtaGG =
true;
474 if (mothid == 331) isEtpGG =
true;
476 if (numberofTotalDaughters >= 3 && numberOfPhotonDaughters >= 1 && numberOfElectronDaughters == 2 && numberOfPionDaughters == 0
477 && numberOfPizDaughters == 0) {
478 if (mothid == 111) isPi0GEE =
true;
480 if (numberofTotalDaughters >= 3 && numberOfPhotonDaughters >= 1 && numberOfPizDaughters == 0 && numberOfPionDaughters == 2) {
482 int chg = getRecursiveMotherCharge(mother);
483 if (chg < 0 && isEtaPPGFromTauMinusFirst) {
484 isEtaPPGFromTauMinusFirst =
false;
487 if (chg > 0 && isEtaPPGFromTauPlusFirst) {
488 isEtaPPGFromTauPlusFirst =
false;
493 if (numberofTotalDaughters >= 2 && numberOfPhotonDaughters >= 1 && numberOfPizDaughters == 1 && numberOfPionDaughters == 0) {
495 int chg = getRecursiveMotherCharge(mother);
496 if (chg < 0 && isOmegaPizGamFromTauMinusFirst) {
497 isOmegaPizGamFromTauMinusFirst =
false;
500 if (chg > 0 && isOmegaPizGamFromTauPlusFirst) {
501 isOmegaPizGamFromTauPlusFirst =
false;
508 B2DEBUG(1,
"isRadiationfromFinalStateChargedParticle = " << isRadiationfromFinalStateChargedParticle);
509 B2DEBUG(1,
"isRadiationFromChargedRho = " << isRadiationFromChargedRho);
510 B2DEBUG(1,
"isRadiationFromChargedA1 = " << isRadiationFromChargedA1);
511 B2DEBUG(1,
"isRadiationfromIntermediateWBoson = " << isRadiationfromIntermediateWBoson <<
" isPiPizGam = " << isPiPizGam);
512 B2DEBUG(1,
"isRadiationfromTau = " << isRadiationfromTau <<
" isLFVTau2BodyDecay = " << isLFVTau2BodyDecay);
513 B2DEBUG(1,
"isPi0GG = " << isPi0GG <<
" isEtaGG = " << isEtaGG <<
" isEtpGG = " << isEtpGG <<
" isPi0GEE = " << isPi0GEE);
514 B2DEBUG(1,
"isEtaPPG = " << isEtaPPG <<
" isOmPizG = " << isOmPizG);
520 if (isRadiationfromFinalStateChargedParticle) {
521 }
else if (isRadiationFromChargedRho) {
522 accept_photon =
true;
523 }
else if (isRadiationFromChargedA1) {
524 accept_photon =
true;
525 }
else if (isRadiationfromIntermediateWBoson) {
527 accept_photon =
true;
529 }
else if (isRadiationfromTau) {
530 if (isLFVTau2BodyDecay) {
531 accept_photon =
true;
533 }
else if (isPi0GG) {
534 }
else if (isEtaGG) {
535 }
else if (isEtpGG) {
536 }
else if (isPi0GEE) {
537 }
else if (isEtaPPG) {
538 accept_photon =
true;
539 }
else if (isOmPizG) {
540 accept_photon =
true;
548 if (pdgid == 111 && (isEtaPizPizPizFromTauMinusFirst || isEtaPizPizPizFromTauPlusFirst)) {
550 if (mother->getPDG() == 221) {
551 const vector<MCParticle*> daughters = mother->getDaughters();
554 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
555 if (d->getPDG() == 111) nPizSisters++;
557 B2DEBUG(1,
"nPizSisters = " << nPizSisters);
558 if (nPizSisters == 3) {
559 int chg = getRecursiveMotherCharge(mother);
560 if (chg < 0 && isEtaPizPizPizFromTauMinusFirst) {
561 isEtaPizPizPizFromTauMinusFirst =
false;
562 m_isEtaPizPizPizFromTauMinus =
true;
564 if (chg > 0 && isEtaPizPizPizFromTauPlusFirst) {
565 isEtaPizPizPizFromTauPlusFirst =
false;
566 m_isEtaPizPizPizFromTauPlus =
true;
572 "isEtaPizPizPizFromTauMinusFirst = " << isEtaPizPizPizFromTauMinusFirst <<
" "
573 "m_isEtaPizPizPizFromTauMinus = " << m_isEtaPizPizPizFromTauMinus <<
" "
574 "isEtaPizPizPizFromTauPlusFirst = " << isEtaPizPizPizFromTauPlusFirst <<
" "
575 "m_isEtaPizPizPizFromTauPlus = " << m_isEtaPizPizPizFromTauPlus
591 if (pdgid == -211 && (isOmegaPimPipFromTauMinusFirst || isOmegaPimPipFromTauPlusFirst)) {
593 if (mother->getPDG() == 223) {
594 const vector<MCParticle*> daughters = mother->getDaughters();
595 int nOmegaDaughters = 0;
600 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
602 if (d->getPDG() == -211) nPimSisters++;
603 if (d->getPDG() == 211) nPipSisters++;
604 if (d->getPDG() == 111) nPizSisters++;
607 "nOmegaDaughters = " << nOmegaDaughters <<
" "
608 "nPimSisters = " << nPimSisters <<
" "
609 "nPipSisters = " << nPipSisters <<
" "
610 "nPizSisters = " << nPizSisters);
611 if (nOmegaDaughters >= 2 && nPimSisters == 1 && nPipSisters == 1 && nPizSisters == 0) {
612 int chg = getRecursiveMotherCharge(mother);
613 if (chg < 0 && isOmegaPimPipFromTauMinusFirst) {
614 isOmegaPimPipFromTauMinusFirst =
false;
615 m_isOmegaPimPipFromTauMinus =
true;
617 if (chg > 0 && isOmegaPimPipFromTauPlusFirst) {
618 isOmegaPimPipFromTauPlusFirst =
false;
619 m_isOmegaPimPipFromTauPlus =
true;
625 "isOmegaPimPipFromTauMinusFirst = " << isOmegaPimPipFromTauMinusFirst <<
" "
626 "m_isOmegaPimPipFromTauMinus = " << m_isOmegaPimPipFromTauMinus <<
" "
627 "isOmegaPimPipFromTauPlusFirst = " << isOmegaPimPipFromTauPlusFirst <<
" "
628 "m_isOmegaPimPipFromTauPlus = " << m_isEtaPizPizPizFromTauPlus
632 map<int, std::vector<int>>::iterator ite ;
633 for (ite = map_vec.begin(); ite != map_vec.end(); ++ite) {
634 if (pdgid == ite->first) {
637 B2DEBUG(1,
"Photon accepted");
638 ite-> second.push_back(i);
641 ite-> second.push_back(i);
649 vec_dau_tauminus.clear();
650 vec_dau_tauplus.clear();
652 map<int, std::vector<int>>::iterator itr ;
653 for (itr = map_vec.begin(); itr != map_vec.end(); ++itr) {
654 for (
unsigned int i = 0; i < itr-> second.size(); i++) {
655 int ii = itr-> second[i];
656 int chg = getRecursiveMotherCharge(MCParticles[ii]);
657 if (chg < 0) vec_dau_tauminus.push_back(ii);
658 if (chg > 0) vec_dau_tauplus.push_back(ii);
666 m_tauminusdecaymode =
"";
667 for (
unsigned iorder = 0; iorder < 46; ++iorder) {
668 int ii = OrderedList[iorder];
670 for (
unsigned int i = 0; i < vec_dau_tauminus.size(); i++) {
671 MCParticle* p = MCParticles[vec_dau_tauminus[i]];
672 int pdg = p->getPDG();
673 if (pdg == -130) pdg = 130;
674 if (pdg != ii)
continue;
675 m_tauminusdecaymode.append(
".");
679 pdgname = databasePDG->GetParticle(pdg)->GetName();
681 m_tauminusdecaymode.append(pdgname);
685 m_mmode = TauolaBelle2DecayMode(m_tauminusdecaymode, -1);
688 m_tauplusdecaymode =
"";
689 for (
unsigned iorder = 0; iorder < 46; ++iorder) {
690 int ii = OrderedList[iorder];
692 for (
unsigned int i = 0; i < vec_dau_tauplus.size(); i++) {
693 MCParticle* p = MCParticles[vec_dau_tauplus[i]];
694 int pdg = p->getPDG();
695 if (pdg == -130) pdg = 130;
696 if (pdg != ii)
continue;
697 m_tauplusdecaymode.append(
".");
701 pdgname = databasePDG->GetParticle(pdg)->GetName();
703 m_tauplusdecaymode.append(pdgname);
707 m_pmode = TauolaBelle2DecayMode(m_tauplusdecaymode, 1);
712 int TauDecayModeModule::TauolaBelle2DecayMode(
const std::string& state,
int chg)
714 std::map<std::string, int> mode_decay = (chg < 0) ? mode_decay_minus : mode_decay_plus;
715 map<std::string, int>::iterator itr ;
716 for (itr = mode_decay.begin(); itr != mode_decay.end(); ++itr) {
717 if (state == itr-> first) {
718 int mode = itr-> second;
720 if (chg < 0 && m_isEtaPizPizPizFromTauMinus) mode = 42;
721 if (chg > 0 && m_isEtaPizPizPizFromTauPlus) mode = 42;
724 if (chg < 0 && !m_isOmegaPimPipFromTauMinus) mode = 130;
725 if (chg > 0 && !m_isOmegaPimPipFromTauPlus) mode = 130;
728 if (chg < 0 && !m_isOmegaPimPipFromTauMinus) mode = 236;
729 if (chg > 0 && !m_isOmegaPimPipFromTauPlus) mode = 236;
732 if (chg < 0 && !m_isEtaPizPizPizFromTauMinus) mode = 15;
733 if (chg > 0 && !m_isEtaPizPizPizFromTauPlus) mode = 15;
742 int TauDecayModeModule::getRecursiveMotherCharge(
const MCParticle* p)
745 if (mother ==
nullptr) {
747 }
else if (abs(p->getPDG()) == 11 && mother->getPDG() == 111) {
749 }
else if (abs(p->getPDG()) == 11 && mother->getPDG() == 221) {
751 }
else if (abs(p->getPDG()) == 11 && mother->getPDG() == 113) {
753 }
else if (abs(p->getPDG()) == 11 && mother->getPDG() == 223) {
755 }
else if (abs(p->getPDG()) == 11 && mother->getPDG() == 333) {
757 }
else if (abs(p->getPDG()) == 13 && mother->getPDG() == 221) {
759 }
else if (abs(p->getPDG()) == 13 && mother->getPDG() == 113) {
761 }
else if (abs(p->getPDG()) == 13 && mother->getPDG() == 333) {
763 }
else if (mother->getPDG() == 15) {
765 }
else if (mother->getPDG() == -15) {
768 return getRecursiveMotherCharge(mother);
773 void TauDecayModeModule::IdentifyTauPair()
779 for (
int i = 0; i < MCParticles.getEntries(); i++) {
782 if (p.getStatus() == 1 && p.getPDG() == 15) {
784 idOfTauMinus = p.getIndex();
786 if (p.getStatus() == 1 && p.getPDG() == -15) {
788 idOfTauPlus = p.getIndex();
791 if (numOfTauPlus == 1 && numOfTauMinus == 1) {
793 }
else tauPair =
false;
800 const vector<MCParticle*> daughters = p.getDaughters();
801 if (daughters.empty())
return ret;
803 if (!d->hasStatus(MCParticle::c_PrimaryParticle))
continue;
805 bool isChargedFinalState = find(begin(finalStatePDGs),
807 abs(d->getPDG())) != end(finalStatePDGs);
808 if (isChargedFinalState) ret++;
809 else ret += getProngOfDecay(*d);
Replacement for TDatabasePDG that is filled from EvtGen's evt.pdl.
A Class to store the Monte Carlo particle information.
Module to classify tau decay events according to a mapping given by the user or with a default mappin...
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.