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