Belle II Software  release-06-02-00
test_fei_config.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 import tempfile
13 import os
14 import shutil
15 import atexit
16 import unittest
17 
18 import fei.config
19 
20 # @cond
21 
22 
23 class TestFeiConfiguration(unittest.TestCase):
24 
25  def test_Defaults(self):
26  config = fei.config.FeiConfiguration()
27  self.assertEqual(config.prefix, 'FEI_TEST')
28  self.assertEqual(config.cache, None)
29  self.assertEqual(config.monitor, True)
30  self.assertEqual(config.legacy, None)
31  self.assertEqual(config.externTeacher, 'basf2_mva_teacher')
32  self.assertEqual(config.training, False)
33 
34 
35 class TestMVAConfiguration(unittest.TestCase):
36 
37  def test_Defaults(self):
38  config = fei.config.MVAConfiguration()
39  self.assertEqual(config.method, 'FastBDT')
40  self.assertEqual(config.config, '--nTrees 400 --nCutLevels 10 --nLevels 3 --shrinkage 0.1 --randRatio 0.5')
41  # We want None, because [] can have nasty side effects when used as default parameter!
42  self.assertEqual(config.variables, None)
43  self.assertEqual(config.target, 'isSignal')
44  self.assertEqual(config.sPlotVariable, None)
45 
46 
47 class TestPreCutConfiguration(unittest.TestCase):
48 
49  def test_Defaults(self):
50  config = fei.config.PreCutConfiguration()
51  self.assertEqual(config.userCut, '')
52  self.assertEqual(config.vertexCut, -2)
53  self.assertEqual(config.bestCandidateVariable, None)
54  self.assertEqual(config.bestCandidateCut, 0)
55  self.assertEqual(config.bestCandidateMode, 'lowest')
56 
57 
58 class TestPostCutConfiguration(unittest.TestCase):
59 
60  def test_Defaults(self):
61  config = fei.config.PostCutConfiguration()
62  self.assertEqual(config.value, 0.0)
63  self.assertEqual(config.bestCandidateCut, 0)
64 
65 
66 class TestDecayChannel(unittest.TestCase):
67 
68  def test_Defaults(self):
69  channel = fei.config.DecayChannel(name='D0:23', label='D0 ==> K- pi+',
70  decayString='D0:23 -> K- pi+', daughters=['K-', 'pi+'],
71  mvaConfig=fei.config.MVAConfiguration(variables=['E']),
72  preCutConfig=fei.config.PreCutConfiguration(userCut='test'),
73  decayModeID=23)
74  self.assertEqual(channel.name, 'D0:23')
75  self.assertEqual(channel.label, 'D0 ==> K- pi+')
76  self.assertEqual(channel.decayString, 'D0:23 -> K- pi+')
77  self.assertEqual(channel.daughters, ['K-', 'pi+'])
78  self.assertEqual(channel.mvaConfig, fei.config.MVAConfiguration(variables=['E']))
79  self.assertEqual(channel.preCutConfig, fei.config.PreCutConfiguration(userCut='test'))
80  self.assertEqual(channel.decayModeID, 23)
81 
82 
83 class TestParticle(unittest.TestCase):
84 
85  def test_Defaults(self):
86  mvaConfig = fei.config.MVAConfiguration(variables=['E'])
87  preCutConfig = fei.config.PreCutConfiguration()
88  postCutConfig = fei.config.PostCutConfiguration()
89  particle = fei.config.Particle('D0', mvaConfig)
90 
91  self.assertEqual(particle.identifier, 'D0:generic')
92  self.assertEqual(particle.name, 'D0')
93  self.assertEqual(particle.label, 'generic')
94  self.assertEqual(particle.mvaConfig, mvaConfig)
95  self.assertEqual(particle.preCutConfig, preCutConfig)
96  self.assertEqual(particle.postCutConfig, postCutConfig)
97  self.assertListEqual(particle.channels, [])
98  self.assertListEqual(particle.daughters, [])
99 
100  def test_NonDefaults(self):
101  mvaConfig = fei.config.MVAConfiguration(variables=['E'])
102  preCutConfig = fei.config.PreCutConfiguration(userCut='test')
103  postCutConfig = fei.config.PostCutConfiguration(value=0.1)
104  particle = fei.config.Particle('D0', mvaConfig, preCutConfig, postCutConfig)
105 
106  self.assertEqual(particle.identifier, 'D0:generic')
107  self.assertEqual(particle.name, 'D0')
108  self.assertEqual(particle.label, 'generic')
109  self.assertEqual(particle.mvaConfig, mvaConfig)
110  self.assertEqual(particle.preCutConfig, preCutConfig)
111  self.assertEqual(particle.postCutConfig, postCutConfig)
112  self.assertListEqual(particle.channels, [])
113  self.assertListEqual(particle.daughters, [])
114 
115  def test_Label(self):
116  mvaConfig = fei.config.MVAConfiguration(variables=['E'])
117  particle = fei.config.Particle('D0:specific', mvaConfig)
118  self.assertEqual(particle.identifier, 'D0:specific')
119  self.assertEqual(particle.name, 'D0')
120  self.assertEqual(particle.label, 'specific')
121 
122  def test_Equality(self):
123  a = fei.config.Particle('D0', fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})']),
124  fei.config.PreCutConfiguration(userCut='test'), fei.config.PostCutConfiguration())
125  a.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)']))
126  a.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
127 
128  b = fei.config.Particle('D0', fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})']),
129  fei.config.PreCutConfiguration(userCut='test'), fei.config.PostCutConfiguration())
130  b.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)']))
131  b.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
132  self.assertEqual(a, b)
133 
134  b = fei.config.Particle('D+', fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})']),
135  fei.config.PreCutConfiguration(userCut='test'), fei.config.PostCutConfiguration())
136  b.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)']))
137  b.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
138  self.assertNotEqual(a, b)
139 
140  b = fei.config.Particle('D0', fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})']),
141  fei.config.PreCutConfiguration(userCut='test'), fei.config.PostCutConfiguration())
142  b.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
143  self.assertNotEqual(a, b)
144 
145  b = fei.config.Particle('D0', fei.config.MVAConfiguration(variables=['daughter({}, p)', 'daughterAngle({}, {})']),
146  fei.config.PreCutConfiguration(userCut='test'), fei.config.PostCutConfiguration())
147  b.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)']))
148  b.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
149  self.assertNotEqual(a, b)
150 
151  b = fei.config.Particle('D0', fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})']),
152  fei.config.PreCutConfiguration(userCut='test'), fei.config.PostCutConfiguration())
153  b.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['daughter({}, p)']))
154  b.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
155  self.assertNotEqual(a, b)
156 
157  b = fei.config.Particle('D0', fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})']),
158  fei.config.PreCutConfiguration(userCut='test'), fei.config.PostCutConfiguration())
159  b.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)']))
160  b.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='test'))
161  self.assertNotEqual(a, b)
162 
163  b = fei.config.Particle('D0', fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})']),
164  fei.config.PreCutConfiguration(userCut='test'), fei.config.PostCutConfiguration(value=0.1))
165  b.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)']))
166  b.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
167  self.assertNotEqual(a, b)
168 
169  b = fei.config.Particle('D0', fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})']),
170  fei.config.PreCutConfiguration(userCut='dummy'), fei.config.PostCutConfiguration())
171  b.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)']))
172  b.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
173  self.assertNotEqual(a, b)
174 
175  def test_AddChannel(self):
176  mvaConfig = fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)', 'daughterAngle({}, {})'])
177  preCutConfig = fei.config.PreCutConfiguration(userCut='test')
178  postCutConfig = fei.config.PostCutConfiguration()
179  particle = fei.config.Particle('D0', mvaConfig, preCutConfig, postCutConfig)
180 
181  particle.addChannel(['pi-', 'pi+'], mvaConfig=fei.config.MVAConfiguration(variables=['E', 'daughter({}, p)']))
182  particle.addChannel(['K-', 'pi+'], preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'))
183  particle.addChannel(['K-:specific', 'pi+', 'pi0'])
184  particle.addChannel(['K-', 'K+'])
185 
186  channels = []
187  channels.append(fei.config.DecayChannel(name='D0:generic_0',
188  label='D0:generic ==> pi-:generic pi+:generic',
189  decayString='D0:generic_0 -> pi-:generic pi+:generic',
190  daughters=['pi-:generic', 'pi+:generic'],
191  mvaConfig=fei.config.MVAConfiguration(variables=['E',
192  'daughter(0, p)',
193  'daughter(1, p)']),
194  preCutConfig=fei.config.PreCutConfiguration(userCut='test'),
195  decayModeID=0))
196  channels.append(fei.config.DecayChannel(name='D0:generic_1',
197  label='D0:generic ==> K-:generic pi+:generic',
198  decayString='D0:generic_1 -> K-:generic pi+:generic',
199  daughters=['K-:generic', 'pi+:generic'],
200  mvaConfig=fei.config.MVAConfiguration(variables=['E',
201  'daughter(0, p)',
202  'daughter(1, p)',
203  'daughterAngle(0, 1)']),
204  preCutConfig=fei.config.PreCutConfiguration(userCut='alternative'),
205  decayModeID=1))
206  channels.append(fei.config.DecayChannel(name='D0:generic_2',
207  label='D0:generic ==> K-:specific pi+:generic pi0:generic',
208  decayString='D0:generic_2 -> K-:specific pi+:generic pi0:generic',
209  daughters=['K-:specific', 'pi+:generic', 'pi0:generic'],
210  mvaConfig=fei.config.MVAConfiguration(variables=['E',
211  'daughter(0, p)',
212  'daughter(1, p)',
213  'daughter(2, p)',
214  'daughterAngle(0, 1)',
215  'daughterAngle(0, 2)',
216  'daughterAngle(1, 2)']),
217  preCutConfig=fei.config.PreCutConfiguration(userCut='test'),
218  decayModeID=2))
219  channels.append(fei.config.DecayChannel(name='D0:generic_3',
220  label='D0:generic ==> K-:generic K+:generic',
221  decayString='D0:generic_3 -> K-:generic K+:generic',
222  daughters=['K-:generic', 'K+:generic'],
223  mvaConfig=fei.config.MVAConfiguration(variables=['E',
224  'daughter(0, p)',
225  'daughter(1, p)',
226  'daughterAngle(0, 1)']),
227  preCutConfig=fei.config.PreCutConfiguration(userCut='test'),
228  decayModeID=3))
229  self.assertEqual(particle.channels, channels)
230  self.assertEqual(sorted(particle.daughters), sorted(['K+:generic', 'K-:generic', 'pi+:generic',
231  'pi-:generic', 'pi0:generic', 'K-:specific']))
232 
233 
234 class TestVariables2MonitoringBinning(unittest.TestCase):
235 
236  def test_Variables2MonitoringBinning1D(self):
237  self.assertEqual(fei.config.variables2binnings(['mcErrors']), [('mcErrors', 513, -0.5, 512.5)])
238  self.assertEqual(fei.config.variables2binnings(['default']), [('default', 100, -10.0, 10.0)])
239 
240  def test_Variables2MonitoringBinning2D(self):
241  self.assertEqual(fei.config.variables2binnings_2d([('mcErrors', 'default')]),
242  [('mcErrors', 513, -0.5, 512.5, 'default', 100, -10.0, 10.0)])
243  self.assertEqual(fei.config.variables2binnings_2d([('default', 'default'), ('mcErrors', 'mcErrors')]),
244  [('default', 100, -10.0, 10.0, 'default', 100, -10.0, 10.0),
245  ('mcErrors', 513, -0.5, 512.5, 'mcErrors', 513, -0.5, 512.5)])
246 
247 
248 if __name__ == '__main__':
249  tempdir = tempfile.mkdtemp()
250  os.chdir(tempdir)
251  # main() never returns, so install exit handler to do our cleanup
252  atexit.register(shutil.rmtree, tempdir)
253  unittest.main()
254 
255 # @endcond