Belle II Software  release-06-02-00
copylists.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 import unittest
13 import root_pandas
14 import basf2 as b2
15 import b2test_utils as b2tu
16 import modularAnalysis as ma
17 from stdPi0s import stdPi0s
18 from stdV0s import stdKshorts
19 from variables import variables as vm
20 
21 
22 def dump_3_v2nts(names_of_three_lists, path):
23  """Dump each of the three vpho lists into a VariablesToNtuple on path"""
24  first, second, third = names_of_three_lists
25  vs = ['d0_mdstIndex', 'd0_p']
26  ma.variablesToNtuple("vpho:" + first, vs, treename=first, path=path)
27  ma.variablesToNtuple("vpho:" + second, vs, treename=second, path=path)
28  ma.variablesToNtuple("vpho:" + third, vs, treename=third, path=path)
29 
30 
31 def run_copylists():
32  """A simple basf2 analysis job to do some list copying"""
33 
34  # aliases for useful for manual debugging
35  vm.addAlias("d0_mdstIndex", "daughter(0, mdstIndex)")
36  vm.addAlias("d0_p", "daughter(0, p)")
37 
38  # analysis input
39  pa = b2.Path()
40  ma.inputMdst("default", b2.find_file("analysis/tests/mdst.root"), path=pa)
41  ma.fillParticleList("pi+", "", path=pa)
42  ma.fillParticleList("K+", "", path=pa)
43  stdPi0s('all', path=pa)
44  stdKshorts(path=pa)
45 
46  # first test: check that merging two lists with
47  # identical daughters removes duplicates
48  ma.reconstructDecay("vpho:a -> K+", "", path=pa, allowChargeViolation=True)
49  ma.reconstructDecay("vpho:b -> K+", "", path=pa, allowChargeViolation=True)
50  ma.copyLists("vpho:ab", ["vpho:a", "vpho:b"], path=pa)
51  dump_3_v2nts(["a", "b", "ab"], path=pa)
52 
53  # second test: check that two lists with different daughters (but from the
54  # same underlying mdst object) are included twice (as expected)
55  ma.reconstructDecay("vpho:c -> K+", "", path=pa, allowChargeViolation=True)
56  ma.reconstructDecay("vpho:d -> pi-", "", path=pa, allowChargeViolation=True)
57  ma.copyLists("vpho:cd", ["vpho:c", "vpho:d"], path=pa)
58  dump_3_v2nts(["c", "d", "cd"], path=pa)
59 
60  # third test: check that two lists with the same daughers in different
61  # orders doesn't double count
62  # (they are different Belle2::Particles but we should match them)
63  ma.reconstructDecay("vpho:e -> K+ pi-", "", path=pa)
64  ma.reconstructDecay("vpho:f -> pi- K+", "", path=pa)
65  ma.copyLists("vpho:ef", ["vpho:e", "vpho:f"], path=pa)
66  dump_3_v2nts(["e", "f", "ef"], path=pa)
67 
68  # fourth test: check that it is considered whose daughter a pi0 is when
69  # there are two charge-conjugated daughters
70  ma.reconstructDecay("tau+:pi -> pi+", "", dmID=0, path=pa)
71  ma.reconstructDecay("tau+:pipi0 -> pi+ pi0:all", "", dmID=1, path=pa)
72  # the pi0 is the daughter of the tau-
73  ma.reconstructDecay("vpho:g -> tau+:pi tau-:pipi0", "", path=pa, chargeConjugation=False)
74  # the pi0 is the daughter of the tau+
75  ma.reconstructDecay("vpho:h -> tau-:pi tau+:pipi0", "", path=pa, chargeConjugation=False)
76  # charge-conjugation has been turned off for the vpho lists above so the
77  # merged list should just be the sum
78  ma.copyLists("vpho:gh", ["vpho:g", "vpho:h"], path=pa)
79  dump_3_v2nts(["g", "h", "gh"], path=pa)
80 
81  # fifth test: check that it is considered whose daughter self-conjugated
82  # particles are if there are two charge-conjugated daughters
83  ma.reconstructDecay("tau+:KS0 -> pi+ K_S0:merged", "", dmID=0, path=pa)
84  ma.reconstructDecay("tau+:pi0 -> pi+ pi0:all", "", dmID=1, path=pa)
85  # the pi0 is the daughter of the tau-
86  ma.reconstructDecay("vpho:KS -> tau+:KS0 tau-:pi0", "", path=pa, chargeConjugation=False)
87  # the pi0 is the daughter of the tau+
88  ma.reconstructDecay("vpho:pi0 -> tau-:KS0 tau+:pi0", "", path=pa, chargeConjugation=False)
89  # charge-conjugation has been turned off for the vpho lists above so the
90  # merged list should just be the sum
91  ma.copyLists("vpho:KSpi0", ["vpho:KS", "vpho:pi0"], path=pa)
92  dump_3_v2nts(["KS", "pi0", "KSpi0"], path=pa)
93 
94  b2tu.safe_process(pa, 1)
95 
96 
97 class TestCopyLists(unittest.TestCase):
98  """Analyse the output of ``run_copylists``"""
99 
100  def _count(self, listname):
101  """Open the ntuple output and count the number of entries in the list."""
102  df = root_pandas.read_root("ntuple.root", listname)
103  return len(df)
104 
106  """Merging two lists with identical daughters should not double count."""
107  self.assertEqual(self._count_count("a"), self._count_count("b"))
108  self.assertEqual(self._count_count("a"), self._count_count("ab"))
109  self.assertEqual(self._count_count("b"), self._count_count("ab"))
110 
112  """Merging two lists with different daughters but with the same mdst
113  object should include each of them twice."""
114  self.assertEqual(self._count_count("c"), self._count_count("d"))
115  self.assertEqual(self._count_count("c") + self._count_count("d"), self._count_count("cd"))
116 
118  """Merging two lists with daughters in a different order should not double count."""
119  self.assertEqual(self._count_count("e"), self._count_count("e"))
120  self.assertEqual(self._count_count("e"), self._count_count("ef"))
121 
123  """Self-conjugated particles can be daughters of both charge-conjugated mother particles.
124  Those multiple candidates are no duplicates and copying the particle list should not remove them."""
125  self.assertEqual(self._count_count("g") + self._count_count("h"), self._count_count("gh"))
126 
128  """Different self-conjugated particles are daughters of charge-conjugated mother particles.
129  The two mother particles have the same amount of daughters."""
130  self.assertEqual(self._count_count("KS") + self._count_count("pi0"), self._count_count("KSpi0"))
131 
132 
133 if __name__ == "__main__":
134  with b2tu.clean_working_directory():
135  run_copylists()
136  unittest.main()
def test_different_association_of_neutrals_same_number_of_daughters(self)
Definition: copylists.py:127
def test_neutrals_in_decays_to_charge_conjugated_daughters(self)
Definition: copylists.py:122
def test_different_daughter_order(self)
Definition: copylists.py:117
def test_merge_two_lists_with_different_mdst_objects(self)
Definition: copylists.py:111
def _count(self, listname)
Definition: copylists.py:100
def test_merge_two_lists_with_identical_daughters(self)
Definition: copylists.py:105