Belle II Software  release-05-01-25
BelleMdstToGenHepevt.cc
1 // ****************************************************************
2 // Belle MDST objects -> MC Particle relations
3 //
4 // Original file: ${BELLE_TOP_DIR}/src/anal/mdst/src/mdst.cc
5 //
6 // Ported by: A. Zupanc (March 2015)
7 //
8 // ****************************************************************
9 
10 #include <b2bii/utility/BelleMdstToGenHepevt.h>
11 
12 // trace back to isthep>=0 or isthep=-10(decay-in-flight)
13 static const Belle::Gen_hepevt& gen_level_step1(const Belle::Gen_hepevt& gen)
14 {
15  return (gen && gen.mother() && gen.isthep() < 0 && gen.isthep() != -10)
16  ? gen_level_step1(gen.mother()) : gen;
17 }
18 
19 // trace back to isthep>0 level
20 static const Belle::Gen_hepevt& gen_level_step2(const Belle::Gen_hepevt& gen)
21 {
22  return (gen && gen.mother() && gen.isthep() < 0)
23  ? gen_level_step2(gen.mother()) : gen;
24 }
25 
26 const Belle::Gen_hepevt& gen_level(const Belle::Gen_hepevt& gen)
27 {
28  const Belle::Gen_hepevt& level1(gen_level_step1(gen));
29  if (!level1 || level1.isthep() >= 0) {
30  return level1;
31  } else if (level1.isthep() == -10) {
32  const Belle::Gen_hepevt& level2(gen_level_step2(gen));
33  // If "gen" is made by Ks(which is made by generator) daughter, returns daughter
34  if (level2.idhep() == 310 || abs(level2.idhep()) == 3122) return level1;
35  // Otherwize, trace back to generator level
36  else return level2;
37  }
38  return level1;
39 }
40 
41 const Belle::Gen_hepevt& get_hepevt(const Belle::Mdst_trk& trk, int i)
42 {
43  Belle::Mdst_sim_trk_Manager& xrefmgr = Belle::Mdst_sim_trk_Manager::get_manager();
44  Belle::Mdst_sim_trk_Index index(xrefmgr.index("trk"));
45  index.update();
46  Belle::Panther_ID trackID(trk.get_ID());
47  std::vector<Belle::Mdst_sim_trk> point = point_from(trackID, index);
48  if (i >= 0 && i < (int)point.size()) return point[i].hepevt();
49  else return Belle::Gen_hepevt_Manager::get_manager().get_NULL();
50 }
51 
52 const Belle::Gen_hepevt& get_hepevt(const Belle::Mdst_charged& ch, int i)
53 {
54  if (!Belle::Mdst_sim_trk_Manager::get_manager().count()) {
55  // for backward compatibility
56  Belle::Mdst_sim_xref_Manager& xrefmgr = Belle::Mdst_sim_xref_Manager::get_manager();
57  Belle::Mdst_sim_xref_Index index(xrefmgr.index("charged"));
58  index.update();
59  Belle::Panther_ID trackID(ch.get_ID());
60  std::vector<Belle::Mdst_sim_xref> point = point_from(trackID, index);
61  if (i >= 0 && i < (int)point.size()) return point[i].hepevt();
62  else return Belle::Gen_hepevt_Manager::get_manager().get_NULL();
63  }
64  return get_hepevt(ch.trk(), i);
65 }
66 
67 const Belle::Gen_hepevt& get_hepevt(const Belle::Mdst_ecl& ecl, int i)
68 {
69  Belle::Mdst_sim_ecl_Manager& xrefmgr = Belle::Mdst_sim_ecl_Manager::get_manager();
70  Belle::Mdst_sim_ecl_Index index(xrefmgr.index("ecl"));
71  index.update();
72  Belle::Panther_ID eclID(ecl.get_ID());
73  std::vector<Belle::Mdst_sim_ecl> point = point_from(eclID, index);
74  if (i >= 0 && i < (int)point.size()) return point[i].hepevt();
75  else return Belle::Gen_hepevt_Manager::get_manager().get_NULL();
76 }
77 
78 const Belle::Gen_hepevt& get_hepevt(const Belle::Mdst_gamma& gamma, int i)
79 {
80  if (!Belle::Mdst_sim_ecl_Manager::get_manager().count()) {
81  // do NOT support backward compatibility
82  // because the returned "Belle::Gen_hepevt & " may not be correct
83  return Belle::Gen_hepevt_Manager::get_manager().get_NULL();
84  }
85  return get_hepevt(gamma.ecl(), i);
86 }
87