Belle II Software  release-06-02-00
test_fei_default_channels.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 import unittest
13 import unittest.mock
14 import os
15 import tempfile
16 import atexit
17 import shutil
18 
20 
21 import b2bii
22 
23 # @cond
24 
25 
26 class TestGetDefaultChannels(unittest.TestCase):
27  def test_get_default(self):
29  self.assertEqual([p.identifier for p in particles],
30  ['pi+:generic', 'K+:generic', 'p+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic',
31  'pi0:generic', 'K_S0:generic', 'Lambda0:generic', 'Sigma+:generic', 'J/psi:generic',
32  'D0:generic', 'D+:generic', 'D_s+:generic', 'Lambda_c+:generic',
33  'D*0:generic', 'D*+:generic', 'D_s*+:generic',
34  'B0:generic', 'B+:generic',
35  'D0:semileptonic', 'D+:semileptonic', 'D*0:semileptonic', 'D*+:semileptonic',
36  'B0:semileptonic', 'B+:semileptonic'])
37 
38  def test_get_hadronic(self):
39  particles = fei.default_channels.get_default_channels(hadronic=True, semileptonic=False, baryonic=False)
40  self.assertEqual([p.identifier for p in particles],
41  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
42  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
43  'D_s*+:generic', 'B0:generic', 'B+:generic'])
44 
45  def test_get_semileptonic(self):
46  particles = fei.default_channels.get_default_channels(hadronic=False, semileptonic=True, baryonic=False)
47  self.assertEqual([p.identifier for p in particles],
48  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
49  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
50  'D_s*+:generic', 'D0:semileptonic', 'D+:semileptonic', 'D*0:semileptonic', 'D*+:semileptonic',
51  'B0:semileptonic', 'B+:semileptonic'])
52 
53  def test_get_charged(self):
54  particles = fei.default_channels.get_default_channels(chargedB=True, neutralB=False, baryonic=False)
55  self.assertEqual([p.identifier for p in particles],
56  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
57  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
58  'D_s*+:generic', 'B+:generic', 'D0:semileptonic', 'D+:semileptonic', 'D*0:semileptonic',
59  'D*+:semileptonic', 'B+:semileptonic'])
60 
61  def test_get_neutral(self):
62  particles = fei.default_channels.get_default_channels(chargedB=False, neutralB=True, baryonic=False)
63  self.assertEqual([p.identifier for p in particles],
64  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
65  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
66  'D_s*+:generic', 'B0:generic', 'D0:semileptonic', 'D+:semileptonic', 'D*0:semileptonic',
67  'D*+:semileptonic', 'B0:semileptonic'])
68 
69  def test_get_klong(self):
70  particles = fei.default_channels.get_default_channels(hadronic=False, semileptonic=False, KLong=True, baryonic=False)
71  self.assertEqual([p.identifier for p in particles],
72  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
73  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
74  'D_s*+:generic', 'K_L0:generic', 'D0:KL', 'D+:KL', 'D_s+:KL', 'D*0:KL', 'D*+:KL', 'D_s*+:KL',
75  'B0:KL', 'B+:KL'])
76 
77  def test_B_extra_cut(self):
78  particles = fei.default_channels.get_default_channels(B_extra_cut='nRemainingTracksInROE == 0', KLong=True, baryonic=False)
79  self.assertEqual([p.identifier for p in particles],
80  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
81  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
82  'D_s*+:generic', 'B0:generic', 'B+:generic',
83  'K_L0:generic', 'D0:KL', 'D+:KL', 'D_s+:KL', 'D*0:KL', 'D*+:KL', 'D_s*+:KL', 'B0:KL', 'B+:KL',
84  'D0:semileptonic', 'D+:semileptonic', 'D*0:semileptonic', 'D*+:semileptonic',
85  'B0:semileptonic', 'B+:semileptonic',
86  ])
87  self.assertEqual(particles[14].preCutConfig.userCut, 'Mbc > 5.2 and abs(deltaE) < 0.5 and [nRemainingTracksInROE == 0]')
88  self.assertEqual(particles[15].preCutConfig.userCut, 'Mbc > 5.2 and abs(deltaE) < 0.5 and [nRemainingTracksInROE == 0]')
89  self.assertEqual(particles[23].preCutConfig.userCut, 'nRemainingTracksInROE == 0')
90  self.assertEqual(particles[24].preCutConfig.userCut, 'nRemainingTracksInROE == 0')
91  self.assertEqual(particles[29].preCutConfig.userCut, 'nRemainingTracksInROE == 0')
92  self.assertEqual(particles[30].preCutConfig.userCut, 'nRemainingTracksInROE == 0')
93 
94  def test_get_specific(self):
95  particles = fei.default_channels.get_default_channels(specific=True, KLong=True, baryonic=False)
96  self.assertEqual([p.identifier for p in particles],
97  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
98  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
99  'D_s*+:generic', 'B0:generic', 'B+:generic',
100  'K_L0:generic', 'D0:KL', 'D+:KL', 'D_s+:KL', 'D*0:KL', 'D*+:KL', 'D_s*+:KL', 'B0:KL', 'B+:KL',
101  'D0:semileptonic', 'D+:semileptonic', 'D*0:semileptonic', 'D*+:semileptonic',
102  'B0:semileptonic', 'B+:semileptonic'])
103  self.assertEqual(particles[0].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4] and isInRestOfEvent > 0.5')
104  self.assertEqual(particles[1].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4] and isInRestOfEvent > 0.5')
105  self.assertEqual(particles[2].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4] and isInRestOfEvent > 0.5')
106  self.assertEqual(particles[3].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4] and isInRestOfEvent > 0.5')
107  self.assertEqual(particles[4].preCutConfig.userCut, '[[clusterReg == 1 and E > 0.10] or [clusterReg == 2 and E > 0.09]'
108  ' or [clusterReg == 3 and E > 0.16]] and isInRestOfEvent > 0.5')
109  self.assertEqual(particles[6].preCutConfig.userCut, '0.4 < M < 0.6')
110  self.assertEqual(particles[6].channels[2].preCutConfig.userCut, '0.4 < M < 0.6 and isInRestOfEvent > 0.5')
111  self.assertEqual(particles[16].preCutConfig.userCut, 'isInRestOfEvent > 0.5')
112 
113  def test_get_specific_converted(self):
115  particles = fei.default_channels.get_default_channels(specific=True, KLong=True, baryonic=False)
116  self.assertEqual([p.identifier for p in particles],
117  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
118  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
119  'D_s*+:generic', 'B0:generic', 'B+:generic',
120  'K_L0:generic', 'D0:KL', 'D+:KL', 'D_s+:KL', 'D*0:KL', 'D*+:KL', 'D_s*+:KL', 'B0:KL', 'B+:KL',
121  'D0:semileptonic', 'D+:semileptonic', 'D*0:semileptonic', 'D*+:semileptonic',
122  'B0:semileptonic', 'B+:semileptonic'])
123  self.assertEqual(particles[0].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4] and isInRestOfEvent > 0.5')
124  self.assertEqual(particles[1].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4] and isInRestOfEvent > 0.5')
125  self.assertEqual(particles[2].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4] and isInRestOfEvent > 0.5')
126  self.assertEqual(particles[3].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4] and isInRestOfEvent > 0.5')
127  self.assertEqual(particles[4].preCutConfig.userCut, 'goodBelleGamma == 1 and clusterBelleQuality == 0 '
128  'and isInRestOfEvent > 0.5')
129  self.assertEqual(particles[5].preCutConfig.userCut, '0.08 < InvM < 0.18 and isInRestOfEvent > 0.5')
130  self.assertEqual(particles[6].preCutConfig.userCut, '0.4 < M < 0.6 and isInRestOfEvent > 0.5')
131  self.assertEqual(particles[16].preCutConfig.userCut, 'isInRestOfEvent > 0.5')
133 
134  def test_get_converted(self):
136  particles = fei.default_channels.get_default_channels(baryonic=False)
137  self.assertEqual([p.identifier for p in particles],
138  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
139  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
140  'D_s*+:generic', 'B0:generic', 'B+:generic',
141  'D0:semileptonic', 'D+:semileptonic', 'D*0:semileptonic', 'D*+:semileptonic',
142  'B0:semileptonic', 'B+:semileptonic'])
143 
144  chargedVariables = ['eIDBelle',
145  'atcPIDBelle(3,2)',
146  'atcPIDBelle(4,2)', 'atcPIDBelle(4,3)',
147  'muIDBelle',
148  'p', 'pt', 'pz', 'dr', 'dz', 'chiProb', 'extraInfo(preCut_rank)']
149  self.assertEqual(particles[0].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4]')
150  self.assertEqual(particles[0].mvaConfig.variables, chargedVariables)
151  self.assertEqual(particles[0].preCutConfig.bestCandidateVariable, 'atcPIDBelle(2,3)')
152  self.assertEqual(particles[1].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4]')
153  self.assertEqual(particles[1].mvaConfig.variables, chargedVariables)
154  self.assertEqual(particles[1].preCutConfig.bestCandidateVariable, 'atcPIDBelle(3,2)')
155  self.assertEqual(particles[2].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4]')
156  self.assertEqual(particles[2].mvaConfig.variables, chargedVariables)
157  self.assertEqual(particles[2].preCutConfig.bestCandidateVariable, 'muIDBelle')
158  self.assertEqual(particles[3].preCutConfig.userCut, '[dr < 2] and [abs(dz) < 4]')
159  self.assertEqual(particles[3].mvaConfig.variables, chargedVariables)
160  self.assertEqual(particles[3].preCutConfig.bestCandidateVariable, 'eIDBelle')
161  self.assertEqual(particles[4].preCutConfig.userCut, 'goodBelleGamma == 1 and clusterBelleQuality == 0')
162  self.assertEqual(particles[6].mvaConfig.variables, ['dr', 'dz', 'distance', 'significanceOfDistance', 'chiProb',
163  'M', 'abs(dM)',
164  'useCMSFrame(E)', 'daughterAngle(0,1)',
165  'cosAngleBetweenMomentumAndVertexVector',
166  'extraInfo(preCut_rank)', 'extraInfo(goodKs)', 'extraInfo(ksnbVLike)',
167  'extraInfo(ksnbNoLam)', 'extraInfo(ksnbStandard)'])
169 
170 
171 class TestGetFRChannels(unittest.TestCase):
172  def test_get_default(self):
174  self.assertEqual([p.identifier for p in particles],
175  ['pi+:generic', 'K+:generic', 'mu+:generic', 'e+:generic', 'gamma:generic', 'pi0:generic', 'K_S0:generic',
176  'J/psi:generic', 'D0:generic', 'D+:generic', 'D_s+:generic', 'D*0:generic', 'D*+:generic',
177  'D_s*+:generic', 'B0:generic', 'B+:generic'])
178  self.assertEqual(len(particles[0].channels), 1)
179  self.assertEqual(len(particles[1].channels), 1)
180  self.assertEqual(len(particles[2].channels), 1)
181  self.assertEqual(len(particles[3].channels), 1)
182  self.assertEqual(len(particles[4].channels), 2)
183  self.assertEqual(len(particles[5].channels), 1)
184  self.assertEqual(len(particles[6].channels), 3)
185  self.assertEqual(len(particles[7].channels), 2)
186  self.assertEqual(len(particles[8].channels), 10)
187  self.assertEqual(len(particles[9].channels), 7)
188  self.assertEqual(len(particles[10].channels), 8)
189  self.assertEqual(len(particles[11].channels), 2)
190  self.assertEqual(len(particles[12].channels), 2)
191  self.assertEqual(len(particles[13].channels), 1)
192  self.assertEqual(len(particles[14].channels), 15)
193  self.assertEqual(len(particles[15].channels), 17)
194 
195 
196 if __name__ == '__main__':
197  tempdir = tempfile.mkdtemp()
198  os.chdir(tempdir)
199  # main() never returns, so install exit handler to do our cleanup
200  atexit.register(shutil.rmtree, tempdir)
201  unittest.main()
202 
203 # @endcond
def setB2BII()
Definition: b2bii.py:21
def unsetB2BII()
Definition: b2bii.py:25
def get_fr_channels(convertedFromBelle=False)
def get_default_channels(B_extra_cut=None, hadronic=True, semileptonic=True, KLong=False, baryonic=True, chargedB=True, neutralB=True, specific=False, removeSLD=False, strangeB=False)