23 class TestFeiConfiguration(unittest.TestCase):
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)
35 class TestMVAConfiguration(unittest.TestCase):
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')
42 self.assertEqual(config.variables,
None)
43 self.assertEqual(config.target,
'isSignal')
44 self.assertEqual(config.sPlotVariable,
None)
47 class TestPreCutConfiguration(unittest.TestCase):
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')
58 class TestPostCutConfiguration(unittest.TestCase):
60 def test_Defaults(self):
61 config = fei.config.PostCutConfiguration()
62 self.assertEqual(config.value, 0.0)
63 self.assertEqual(config.bestCandidateCut, 0)
66 class TestDecayChannel(unittest.TestCase):
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'),
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)
83 class TestParticle(unittest.TestCase):
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)
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, [])
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)
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, [])
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')
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'))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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+'])
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',
194 preCutConfig=fei.config.PreCutConfiguration(userCut=
'test'),
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',
203 'daughterAngle(0, 1)']),
204 preCutConfig=fei.config.PreCutConfiguration(userCut=
'alternative'),
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',
214 'daughterAngle(0, 1)',
215 'daughterAngle(0, 2)',
216 'daughterAngle(1, 2)']),
217 preCutConfig=fei.config.PreCutConfiguration(userCut=
'test'),
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',
226 'daughterAngle(0, 1)']),
227 preCutConfig=fei.config.PreCutConfiguration(userCut=
'test'),
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']))
234 class TestVariables2MonitoringBinning(unittest.TestCase):
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)])
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)])
248 if __name__ ==
'__main__':
249 tempdir = tempfile.mkdtemp()
252 atexit.register(shutil.rmtree, tempdir)