Belle II Software  light-2303-iriomote
test_reconstructmcdecay.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 import unittest
13 import tempfile
14 from basf2 import create_path, register_module
15 import b2test_utils
16 from modularAnalysis import fillParticleListFromMC, reconstructMCDecay, inputMdst, findMCDecay
17 from ROOT import TFile
18 
19 
20 class TestNewMCDecayFinder(unittest.TestCase):
21  """The unit test"""
22 
24  """Reconstruct/search for an MC decay chain using the reconstructMCDecay tool."""
25 
26  testFile = tempfile.NamedTemporaryFile()
27 
28  main = create_path()
29 
30  inputfile = b2test_utils.require_file(
31  'analysis/1000_B_DstD0Kpi_skimmed.root', 'validation', py_case=self)
32  inputMdst(inputfile, path=main)
33 
34  fillParticleListFromMC('gamma:primaryMC', 'mcPrimary', path=main)
35  fillParticleListFromMC('K+:primaryMC', 'mcPrimary', path=main)
36  fillParticleListFromMC('pi+:primaryMC', 'mcPrimary', path=main)
37 
39  'B0:DstD0Kpi =direct=> [D*+:MC =direct=> [D0:MC =direct=> K-:primaryMC pi+:primaryMC ] pi+:primaryMC] pi-:primaryMC',
40  '',
41  path=main)
42 
43  ntupler = register_module('VariablesToNtuple')
44  ntupler.param('fileName', testFile.name)
45  ntupler.param('treeName', 'ntuple')
46  ntupler.param('variables', ['isSignal'])
47  ntupler.param('particleList', 'B0:DstD0Kpi')
48  main.add_module(ntupler)
49 
51 
52  ntuplefile = TFile(testFile.name)
53  ntuple = ntuplefile.Get('ntuple')
54 
55  self.assertFalse(ntuple.GetEntries() == 0, "Ntuple is empty.")
56 
57  allBkg = ntuple.GetEntries("isSignal == 0")
58  allSig = ntuple.GetEntries("isSignal > 0")
59 
60  print(f"True candidates {allSig}")
61  print(f"False candidates {allBkg}")
62 
63  sig_expected = 406
64 
65  self.assertTrue(
66  allSig == sig_expected,
67  f"n_sig expected: {sig_expected} found: {sig_expected}.")
68  self.assertTrue(allBkg == 0, f"n_bkg expected 0, found: {allBkg}.")
69 
70  print("Test passed, cleaning up.")
71 
73  """Reconstruct/search for an MC decay chain using the reconstructMCDecay tool."""
74 
75  testFile = tempfile.NamedTemporaryFile()
76 
77  main = create_path()
78 
79  inputfile = b2test_utils.require_file('Bdto3Ks_MC13aBG1_train.root', 'examples', py_case=self)
80  inputMdst(inputfile, path=main)
81 
82  fillParticleListFromMC('pi+:primaryMC', 'mcPrimary', path=main)
83  reconstructMCDecay('K_S0:MC =direct=> pi+:primaryMC pi-:primaryMC', '', path=main)
84  reconstructMCDecay('B0:3KS =direct=> K_S0:MC K_S0:MC K_S0:MC', '', path=main)
85 
86  ntuplerKS = register_module('VariablesToNtuple')
87  ntuplerKS.param('fileName', testFile.name)
88  ntuplerKS.param('treeName', 'ntuple')
89  ntuplerKS.param('variables', ['isSignal'])
90  ntuplerKS.param('particleList', 'B0:3KS')
91  main.add_module(ntuplerKS)
92 
94 
95  ntuplefile = TFile(testFile.name)
96  ntuple = ntuplefile.Get('ntuple')
97 
98  self.assertFalse(ntuple.GetEntries() == 0, "Ntuple is empty.")
99 
100  allBkg = ntuple.GetEntries("isSignal == 0")
101  allSig = ntuple.GetEntries("isSignal > 0")
102 
103  print(f"True candidates {allSig}")
104  print(f"False candidates {allBkg}")
105 
106  sig_expected = 10
107 
108  self.assertTrue(
109  allSig == sig_expected,
110  f"n_sig expected: {sig_expected} found: {sig_expected}.")
111  self.assertTrue(allBkg == 0, f"n_bkg expected 0, found: {allBkg}.")
112 
113  print("Test passed, cleaning up.")
114 
115  def testMCDecayFinder(self):
116  """Reconstruct/search for an MC decay chain using the findMCDecay tool."""
117 
118  testFile = tempfile.NamedTemporaryFile()
119 
120  main = create_path()
121 
122  inputfile = b2test_utils.require_file(
123  'analysis/1000_B_DstD0Kpi_skimmed.root', 'validation', py_case=self)
124  inputMdst(inputfile, path=main)
125 
126  findMCDecay(
127  'B0:DstD0Kpi',
128  'B0 =direct=> [D*+ =direct=> [D0 =direct=> K- pi+ ] pi+] pi-',
129  path=main)
130 
131  ntupler = register_module('VariablesToNtuple')
132  ntupler.param('fileName', testFile.name)
133  ntupler.param('variables', ['isSignal'])
134  ntupler.param('particleList', 'B0:DstD0Kpi')
135  main.add_module(ntupler)
136 
138 
139  ntuplefile = TFile(testFile.name)
140  ntuple = ntuplefile.Get('ntuple')
141 
142  self.assertFalse(ntuple.GetEntries() == 0, "Ntuple is empty.")
143 
144  allBkg = ntuple.GetEntries("isSignal == 0")
145  allSig = ntuple.GetEntries("isSignal > 0")
146 
147  print(f"True candidates {allSig}")
148  print(f"False candidates {allBkg}")
149 
150  sig_expected = 406
151 
152  self.assertTrue(
153  allSig == sig_expected,
154  f"n_sig expected: {sig_expected} found: {sig_expected}.")
155  self.assertTrue(allBkg == 0, f"n_bkg expected 0, found: {allBkg}.")
156 
157  print("Test passed, cleaning up.")
158 
160  """Reconstruct/search for an MC decay chain using the findMCDecay tool."""
161 
162  testFile = tempfile.NamedTemporaryFile()
163 
164  main = create_path()
165 
166  inputfile = b2test_utils.require_file('Bdto3Ks_MC13aBG1_train.root', 'examples', py_case=self)
167  inputMdst(inputfile, path=main)
168 
169  findMCDecay(
170  'B0:3KS',
171  'B0 -> [K_S0 -> pi+ pi-] [K_S0 -> pi+ pi-] [K_S0 -> pi+ pi-]',
172  path=main)
173 
174  ntupler = register_module('VariablesToNtuple')
175  ntupler.param('fileName', testFile.name)
176  ntupler.param('variables', ['isSignal'])
177  ntupler.param('particleList', 'B0:3KS')
178  main.add_module(ntupler)
179 
181 
182  ntuplefile = TFile(testFile.name)
183  ntuple = ntuplefile.Get('ntuple')
184 
185  self.assertFalse(ntuple.GetEntries() == 0, "Ntuple is empty.")
186 
187  allBkg = ntuple.GetEntries("isSignal == 0")
188  allSig = ntuple.GetEntries("isSignal > 0")
189 
190  print(f"True candidates {allSig}")
191  print(f"False candidates {allBkg}")
192 
193  sig_expected = 10
194 
195  self.assertTrue(
196  allSig == sig_expected,
197  f"n_sig expected: {sig_expected} found: {sig_expected}.")
198  self.assertTrue(allBkg == 0, f"n_bkg expected 0, found: {allBkg}.")
199 
200  print("Test passed, cleaning up.")
201 
202 
203 if __name__ == '__main__':
205  unittest.main()
def require_file(filename, data_type="", py_case=None)
Definition: __init__.py:54
def clean_working_directory()
Definition: __init__.py:185
def safe_process(*args, **kwargs)
Definition: __init__.py:233