32pybasf2.Module.__eq__ =
lambda a, b: a.type() == b.type()
and\
33 all(x == y
for x, y
in zip(a.available_params(), b.available_params()))
34pybasf2.ModuleParamInfo.__eq__ =
lambda a, b: a.name == b.name
and a.values == b.values
35pybasf2.Path.__eq__ =
lambda a, b: all(x == y
for x, y
in zip(a.modules(), b.modules()))
40 Print the parts of the paths which are different
42 for x, y
in zip(a.modules(), b.modules()):
43 if x.type() != y.type():
44 print(x.type(), y.type())
45 for n, m
in zip(x.available_params(), y.available_params()):
48 if n.values != m.values:
49 print(n.name, n.values, m.values)
52def get_small_unittest_channels():
53 pion = Particle(
'pi+',
54 fei.config.MVAConfiguration(variables=[
'p',
'dr'],
55 target=
'isPrimarySignal'),
56 fei.config.PreCutConfiguration(userCut=
'[dr < 2] and [abs(dz) < 4]',
57 bestCandidateMode=
'highest',
58 bestCandidateVariable=
'piid',
60 fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.01))
61 pion.addChannel([
'pi+:FSP'])
64 fei.config.MVAConfiguration(variables=[
'p',
'dr'],
65 target=
'isPrimarySignal'),
66 fei.config.PreCutConfiguration(userCut=
'[dr < 2] and [abs(dz) < 4]',
67 bestCandidateMode=
'highest',
68 bestCandidateVariable=
'Kid',
70 fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.01))
71 kaon.addChannel([
'K+:FSP'])
74 fei.config.MVAConfiguration(variables=[
'M',
'p'],
76 fei.config.PreCutConfiguration(userCut=
'1.7 < M < 1.95',
77 bestCandidateMode=
'lowest',
78 bestCandidateVariable=
'abs(dM)',
80 fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.001))
81 D0.addChannel([
'K-',
'pi+'])
82 D0.addChannel([
'pi-',
'pi+'])
84 particles = [pion, kaon, D0]
88class TestGetStagesFromParticles(unittest.TestCase):
89 def test_get_stages_from_particles(self):
90 particles = fei.get_unittest_channels()
91 stages = fei.core.get_stages_from_particles(particles)
92 self.assertEqual(len(stages), 7)
93 self.assertEqual(len(stages[0]), 4)
94 self.assertEqual(stages[0][0].identifier,
'gamma:generic')
95 self.assertEqual(stages[0][1].identifier,
'mu+:generic')
96 self.assertEqual(stages[0][2].identifier,
'pi+:generic')
97 self.assertEqual(stages[0][3].identifier,
'K+:generic')
98 self.assertEqual(len(stages[1]), 1)
99 self.assertEqual(stages[1][0].identifier,
'pi0:generic')
100 self.assertEqual(len(stages[2]), 0)
101 self.assertEqual(len(stages[3]), 2)
102 self.assertEqual(stages[3][0].identifier,
'D0:generic')
103 self.assertEqual(stages[3][1].identifier,
'D0:semileptonic')
104 self.assertEqual(len(stages[4]), 0)
105 self.assertEqual(len(stages[5]), 0)
106 self.assertEqual(len(stages[6]), 0)
109class TestTrainingDataInformation(unittest.TestCase):
112 if os.path.isfile(
'mcParticlesCount.root'):
113 os.remove(
'mcParticlesCount.root')
115 def test_reconstruct(self):
116 particles = fei.get_unittest_channels()
117 x = fei.core.TrainingDataInformation(particles)
119 path = basf2.create_path()
120 path.add_module(
'VariablesToHistogram', fileName=
'mcParticlesCount.root',
121 ignoreCommandLineOverride=
True,
123 (
'NumberOfMCParticlesInEvent(321)', 100, -0.5, 99.5),
124 (
'NumberOfMCParticlesInEvent(421)', 100, -0.5, 99.5),
125 (
'NumberOfMCParticlesInEvent(13)', 100, -0.5, 99.5),
126 (
'NumberOfMCParticlesInEvent(111)', 100, -0.5, 99.5),
127 (
'NumberOfMCParticlesInEvent(211)', 100, -0.5, 99.5),
128 (
'NumberOfMCParticlesInEvent(22)', 100, -0.5, 99.5)]
130 print_path(path, x.reconstruct())
131 self.assertEqual(x.reconstruct(), path)
133 def test_available(self):
134 particles = fei.get_unittest_channels()
135 x = fei.core.TrainingDataInformation(particles)
136 self.assertEqual(x.available(),
False)
137 f = ROOT.TFile(
'mcParticlesCount.root',
'RECREATE')
138 self.assertEqual(x.available(),
True)
140 def test_get_mc_counts(self):
141 f = ROOT.TFile(
'mcParticlesCount.root',
'RECREATE')
143 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo211__bc",
"NumberOfMCParticlesInEvent__bo211__bc", 11, -0.5, 10.5)
150 f.Write(
"NumberOfMCParticlesInEvent__bo211__bc")
152 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo321__bc",
"NumberOfMCParticlesInEvent__bo321__bc", 11, -0.5, 10.5)
159 f.Write(
"NumberOfMCParticlesInEvent__bo321__bc")
161 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo13__bc",
"NumberOfMCParticlesInEvent__bo13__bc", 11, -0.5, 10.5)
164 f.Write(
"NumberOfMCParticlesInEvent__bo13__bc")
166 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo22__bc",
"NumberOfMCParticlesInEvent__bo222__bc", 11, -0.5, 10.5)
169 f.Write(
"NumberOfMCParticlesInEvent__bo22__bc")
171 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo111__bc",
"NumberOfMCParticlesInEvent__bo111__bc", 11, -0.5, 10.5)
178 f.Write(
"NumberOfMCParticlesInEvent__bo111__bc")
180 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo421__bc",
"NumberOfMCParticlesInEvent__bo421__bc", 11, -0.5, 10.5)
187 f.Write(
"NumberOfMCParticlesInEvent__bo421__bc")
189 particles = fei.get_unittest_channels()
190 x = fei.core.TrainingDataInformation(particles)
193 211: {
'max': 5.0,
'min': 3.0,
'sum': 79.0,
'avg': 4.3888888888888893,
'std': 0.7556372504852998},
194 321: {
'max': 7.0,
'min': 2.0,
'sum': 77.0,
'avg': 4.2777777777777777,
'std': 1.8798804795209585},
195 13: {
'max': 5.0,
'min': 5.0,
'sum': 90.0,
'avg': 5.0,
'std': 0.0},
196 22: {
'max': 0.0,
'min': 0.0,
'sum': 0.0,
'avg': 0.0,
'std': 0.0},
197 111: {
'max': 5.0,
'min': 3.0,
'sum': 74.0,
'avg': 4.1111111111111107,
'std': 0.6573421981221816},
198 421: {
'max': 9.0,
'min': 0.0,
'sum': 93.0,
'avg': 5.166666666666667,
'std': 4.2979323194092087},
200 self.assertDictEqual(x.get_mc_counts(), mcCounts)
203class TestFSPLoader(unittest.TestCase):
205 def test_belle2_without_monitoring(self):
206 particles = get_small_unittest_channels()
207 config = fei.config.FeiConfiguration(monitor=
False)
208 x = fei.core.FSPLoader(particles, config)
210 path = basf2.create_path()
211 fsps = [
'K+:FSP',
'pi+:FSP',
'e+:FSP',
'mu+:FSP',
'gamma:FSP',
'p+:FSP',
'K_L0:FSP']
212 path.add_module(
'ParticleLoader', decayStrings=fsps, writeOut=
True)
214 path.add_module(
'ParticleListManipulator', outputListName=fsp,
215 inputListNames=[fsp.split(
':')[0] +
':all'], writeOut=
True)
217 path.add_module(
'ParticleSelector', decayString=
'gamma:FSP', cut=
'isFromECL')
218 path.add_module(
'ParticleLoader', decayStrings=[
'K_S0:V0 -> pi+ pi-'], writeOut=
True)
219 path.add_module(
'ParticleLoader', decayStrings=[
'Lambda0:V0 -> p+ pi-'], writeOut=
True)
220 path.add_module(
'ParticleLoader', decayStrings=[
'gamma:V0 -> e+ e-'], addDaughters=
True, writeOut=
True)
221 print_path(path, x.reconstruct())
222 self.assertEqual(x.reconstruct(), path)
224 def test_belle2_with_monitoring(self):
225 particles = get_small_unittest_channels()
226 config = fei.config.FeiConfiguration(monitor=
True)
227 x = fei.core.FSPLoader(particles, config)
229 path = basf2.create_path()
230 fsps = [
'K+:FSP',
'pi+:FSP',
'e+:FSP',
'mu+:FSP',
'gamma:FSP',
'p+:FSP',
'K_L0:FSP']
231 path.add_module(
'ParticleLoader', decayStrings=fsps, writeOut=
True)
233 path.add_module(
'ParticleListManipulator', outputListName=fsp,
234 inputListNames=[fsp.split(
':')[0] +
':all'], writeOut=
True)
236 path.add_module(
'ParticleSelector', decayString=
'gamma:FSP', cut=
'isFromECL')
237 path.add_module(
'ParticleLoader', decayStrings=[
'K_S0:V0 -> pi+ pi-'], writeOut=
True)
238 path.add_module(
'ParticleLoader', decayStrings=[
'Lambda0:V0 -> p+ pi-'], writeOut=
True)
239 path.add_module(
'ParticleLoader', decayStrings=[
'gamma:V0 -> e+ e-'], addDaughters=
True, writeOut=
True)
240 hist_variables = [(f
'NumberOfMCParticlesInEvent({pdgcode})', 100, -0.5, 99.5)
241 for pdgcode
in {11, 321, 211, 13, 22, 310, 2212, 130, 3122, 111}]
242 path.add_module(
'VariablesToHistogram', particleList=
'',
243 ignoreCommandLineOverride=
True,
244 variables=hist_variables,
245 fileName=
'Monitor_FSPLoader.root')
246 print_path(path, x.reconstruct())
247 self.assertEqual(x.reconstruct(), path)
249 def test_belle1_without_monitoring(self):
250 particles = get_small_unittest_channels()
252 config = fei.config.FeiConfiguration(monitor=
False)
253 x = fei.core.FSPLoader(particles, config)
255 path = basf2.create_path()
256 fsps = [
'K+:FSP',
'pi+:FSP',
'e+:FSP',
'mu+:FSP',
'p+:FSP']
257 path.add_module(
'ParticleLoader', decayStrings=fsps, writeOut=
True)
259 path.add_module(
'ParticleListManipulator', outputListName=fsp,
260 inputListNames=[fsp.split(
':')[0] +
':all'], writeOut=
True)
261 path.add_module(
'ParticleListManipulator', outputListName=
'gamma:FSP', inputListNames=[
'gamma:mdst'], writeOut=
True)
262 path.add_module(
'ParticleCopier', inputListNames=[
'gamma:FSP'])
263 path.add_module(
'ParticleListManipulator', outputListName=
'K_S0:V0', inputListNames=[
'K_S0:mdst'], writeOut=
True)
264 path.add_module(
'ParticleCopier', inputListNames=[
'K_S0:V0'])
265 path.add_module(
'ParticleListManipulator', outputListName=
'Lambda0:V0', inputListNames=[
'Lambda0:mdst'], writeOut=
True)
266 path.add_module(
'ParticleCopier', inputListNames=[
'Lambda0:V0'])
267 path.add_module(
'ParticleListManipulator', outputListName=
'K_L0:FSP', inputListNames=[
'K_L0:mdst'], writeOut=
True)
268 path.add_module(
'ParticleCopier', inputListNames=[
'K_L0:FSP'])
269 path.add_module(
'ParticleListManipulator', outputListName=
'pi0:FSP', inputListNames=[
'pi0:mdst'], writeOut=
True)
270 path.add_module(
'ParticleCopier', inputListNames=[
'pi0:FSP'])
271 path.add_module(
'ParticleListManipulator', outputListName=
'gamma:V0', inputListNames=[
'gamma:v0mdst'], writeOut=
True)
272 path.add_module(
'ParticleCopier', inputListNames=[
'gamma:V0'])
273 print_path(path, x.reconstruct())
274 self.assertEqual(x.reconstruct(), path)
277 def test_belle1_with_monitoring(self):
278 particles = get_small_unittest_channels()
280 config = fei.config.FeiConfiguration(monitor=
True)
281 x = fei.core.FSPLoader(particles, config)
283 path = basf2.create_path()
284 fsps = [
'K+:FSP',
'pi+:FSP',
'e+:FSP',
'mu+:FSP',
'p+:FSP']
285 path.add_module(
'ParticleLoader', decayStrings=fsps, writeOut=
True)
287 path.add_module(
'ParticleListManipulator', outputListName=fsp,
288 inputListNames=[fsp.split(
':')[0] +
':all'], writeOut=
True)
289 path.add_module(
'ParticleListManipulator', outputListName=
'gamma:FSP', inputListNames=[
'gamma:mdst'], writeOut=
True)
290 path.add_module(
'ParticleCopier', inputListNames=[
'gamma:FSP'])
291 path.add_module(
'ParticleListManipulator', outputListName=
'K_S0:V0', inputListNames=[
'K_S0:mdst'], writeOut=
True)
292 path.add_module(
'ParticleCopier', inputListNames=[
'K_S0:V0'])
293 path.add_module(
'ParticleListManipulator', outputListName=
'Lambda0:V0', inputListNames=[
'Lambda0:mdst'], writeOut=
True)
294 path.add_module(
'ParticleCopier', inputListNames=[
'Lambda0:V0'])
295 path.add_module(
'ParticleListManipulator', outputListName=
'K_L0:FSP', inputListNames=[
'K_L0:mdst'], writeOut=
True)
296 path.add_module(
'ParticleCopier', inputListNames=[
'K_L0:FSP'])
297 path.add_module(
'ParticleListManipulator', outputListName=
'pi0:FSP', inputListNames=[
'pi0:mdst'], writeOut=
True)
298 path.add_module(
'ParticleCopier', inputListNames=[
'pi0:FSP'])
299 path.add_module(
'ParticleListManipulator', outputListName=
'gamma:V0', inputListNames=[
'gamma:v0mdst'], writeOut=
True)
300 path.add_module(
'ParticleCopier', inputListNames=[
'gamma:V0'])
301 hist_variables = [(f
'NumberOfMCParticlesInEvent({pdgcode})', 100, -0.5, 99.5)
302 for pdgcode
in {11, 321, 211, 13, 22, 310, 2212, 130, 3122, 111}]
303 path.add_module(
'VariablesToHistogram', particleList=
'',
304 ignoreCommandLineOverride=
True,
305 variables=hist_variables,
306 fileName=
'Monitor_FSPLoader.root')
307 print_path(path, x.reconstruct())
308 self.assertEqual(x.reconstruct(), path)
312class TestTrainingData(unittest.TestCase):
316 211: {
'sum': 79,
'avg': 4.3888888888888893,
'max': 5,
'min': 3,
'std': 0.75563725048530228},
317 321: {
'sum': 77,
'avg': 4.2777777777777777,
'max': 7,
'min': 2,
'std': 1.8798804795209592},
318 421: {
'sum': 93,
'avg': 5.166666666666667,
'max': 9,
'min': 0,
'std': 4.2979323194092087},
321 def test_without_monitoring(self):
322 particles = get_small_unittest_channels()
323 config = fei.config.FeiConfiguration(monitor=
False)
324 x = fei.core.TrainingData(particles, config, self.mc_counts)
326 path = basf2.create_path()
327 path.add_module(
'VariablesToNtuple', fileName=
'training_input.root', treeName=
'pi+:generic ==> pi+:FSP variables',
328 ignoreCommandLineOverride=
True,
329 variables=[
'p',
'dr',
'isPrimarySignal'],
330 particleList=
'pi+:generic_0', sampling=(
'isPrimarySignal', {}))
331 path.add_module(
'VariablesToNtuple', fileName=
'training_input.root', treeName=
'K+:generic ==> K+:FSP variables',
332 ignoreCommandLineOverride=
True,
333 variables=[
'p',
'dr',
'isPrimarySignal'],
334 particleList=
'K+:generic_0', sampling=(
'isPrimarySignal', {}))
335 path.add_module(
'VariablesToNtuple', fileName=
'training_input.root',
336 ignoreCommandLineOverride=
True,
337 treeName=
'D0:generic ==> K-:generic pi+:generic variables',
338 variables=[
'M',
'p',
'isSignal'],
339 particleList=
'D0:generic_0', sampling=(
'isSignal', {}))
340 path.add_module(
'VariablesToNtuple', fileName=
'training_input.root',
341 ignoreCommandLineOverride=
True,
342 treeName=
'D0:generic ==> pi-:generic pi+:generic variables',
343 variables=[
'M',
'p',
'isSignal'],
344 particleList=
'D0:generic_1', sampling=(
'isSignal', {}))
345 print_path(path, x.reconstruct())
346 self.assertEqual(x.reconstruct(), path)
348 def test_with_monitoring(self):
349 particles = get_small_unittest_channels()
350 config = fei.config.FeiConfiguration(monitor=
True)
351 x = fei.core.TrainingData(particles, config, self.mc_counts)
353 path = basf2.create_path()
354 path.add_module(
'VariablesToHistogram', particleList=
'pi+:generic_0',
355 ignoreCommandLineOverride=
True,
356 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
'p',
'dr',
'isPrimarySignal']),
357 variables_2d=fei.config.variables2binnings_2d([(
'p',
'isPrimarySignal'), (
'dr',
'isPrimarySignal')]),
358 fileName=
'Monitor_TrainingData.root', directory=
'pi+:generic ==> pi+:FSP')
359 path.add_module(
'VariablesToNtuple', fileName=
'training_input.root', treeName=
'pi+:generic ==> pi+:FSP variables',
360 ignoreCommandLineOverride=
True,
361 variables=[
'p',
'dr',
'isPrimarySignal'],
362 particleList=
'pi+:generic_0', sampling=(
'isPrimarySignal', {}))
363 path.add_module(
'VariablesToHistogram', particleList=
'K+:generic_0',
364 ignoreCommandLineOverride=
True,
365 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
'p',
'dr',
'isPrimarySignal']),
366 variables_2d=fei.config.variables2binnings_2d([(
'p',
'isPrimarySignal'), (
'dr',
'isPrimarySignal')]),
367 fileName=
'Monitor_TrainingData.root', directory=
'K+:generic ==> K+:FSP')
368 path.add_module(
'VariablesToNtuple', fileName=
'training_input.root', treeName=
'K+:generic ==> K+:FSP variables',
369 ignoreCommandLineOverride=
True,
370 variables=[
'p',
'dr',
'isPrimarySignal'],
371 particleList=
'K+:generic_0', sampling=(
'isPrimarySignal', {}))
372 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_0',
373 ignoreCommandLineOverride=
True,
374 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
'M',
'p',
'isSignal']),
375 variables_2d=fei.config.variables2binnings_2d([(
'M',
'isSignal'), (
'p',
'isSignal')]),
376 fileName=
'Monitor_TrainingData.root', directory=
'D0:generic ==> K-:generic pi+:generic')
377 path.add_module(
'VariablesToNtuple', fileName=
'training_input.root',
378 ignoreCommandLineOverride=
True,
379 treeName=
'D0:generic ==> K-:generic pi+:generic variables',
380 variables=[
'M',
'p',
'isSignal'],
381 particleList=
'D0:generic_0', sampling=(
'isSignal', {}))
382 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_1',
383 ignoreCommandLineOverride=
True,
384 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
'M',
'p',
'isSignal']),
385 variables_2d=fei.config.variables2binnings_2d([(
'M',
'isSignal'), (
'p',
'isSignal')]),
386 fileName=
'Monitor_TrainingData.root', directory=
'D0:generic ==> pi-:generic pi+:generic')
387 path.add_module(
'VariablesToNtuple', fileName=
'training_input.root',
388 ignoreCommandLineOverride=
True,
389 treeName=
'D0:generic ==> pi-:generic pi+:generic variables',
390 variables=[
'M',
'p',
'isSignal'],
391 particleList=
'D0:generic_1', sampling=(
'isSignal', {}))
392 print_path(path, x.reconstruct())
393 self.assertEqual(x.reconstruct(), path)
396class TestPreReconstruction(unittest.TestCase):
398 def test_without_monitoring(self):
399 particles = get_small_unittest_channels()
400 config = fei.config.FeiConfiguration(monitor=
False)
401 x = fei.core.PreReconstruction(particles, config)
403 path = basf2.create_path()
404 path.add_module(
'ParticleListManipulator', inputListNames=[
'pi+:FSP'], outputListName=
'pi+:generic_0',
405 cut=
'[dr < 2] and [abs(dz) < 4]', writeOut=
True)
406 path.add_module(
'VariablesToExtraInfo', particleList=
'pi+:generic_0', variables={
'constant(0)':
'decayModeID'})
407 path.add_module(
'BestCandidateSelection', particleList=
'pi+:generic_0', variable=
'piid', selectLowest=
False,
408 numBest=20, outputVariable=
'preCut_rank')
410 path.add_module(
'ParticleListManipulator', inputListNames=[
'K+:FSP'], outputListName=
'K+:generic_0',
411 cut=
'[dr < 2] and [abs(dz) < 4]', writeOut=
True)
412 path.add_module(
'VariablesToExtraInfo', particleList=
'K+:generic_0', variables={
'constant(0)':
'decayModeID'})
413 path.add_module(
'BestCandidateSelection', particleList=
'K+:generic_0', variable=
'Kid', selectLowest=
False,
414 numBest=20, outputVariable=
'preCut_rank')
416 path.add_module(
'ParticleCombiner', decayString=
'D0:generic_0 -> K-:generic pi+:generic', writeOut=
True,
417 decayMode=0, cut=
'1.7 < M < 1.95')
418 path.add_module(
'BestCandidateSelection', particleList=
'D0:generic_0',
419 variable=
'abs(dM)', selectLowest=
True, numBest=20, outputVariable=
'preCut_rank')
420 path.add_module(
'ParticleVertexFitter', listName=
'D0:generic_0', confidenceLevel=-2.0,
421 vertexFitter=
'KFit', fitType=
'vertex')
423 path.add_module(
'ParticleCombiner', decayString=
'D0:generic_1 -> pi-:generic pi+:generic', writeOut=
True,
424 decayMode=1, cut=
'1.7 < M < 1.95')
425 path.add_module(
'BestCandidateSelection', particleList=
'D0:generic_1',
426 variable=
'abs(dM)', selectLowest=
True, numBest=20, outputVariable=
'preCut_rank')
427 path.add_module(
'ParticleVertexFitter', listName=
'D0:generic_1', confidenceLevel=-2.0,
428 vertexFitter=
'KFit', fitType=
'vertex')
430 print_path(path, x.reconstruct())
431 self.assertEqual(x.reconstruct(), path)
433 def test_with_monitoring(self):
434 particles = get_small_unittest_channels()
435 config = fei.config.FeiConfiguration(monitor=
True)
436 x = fei.core.PreReconstruction(particles, config)
438 path = basf2.create_path()
439 path.add_module(
'ParticleListManipulator', inputListNames=[
'pi+:FSP'], outputListName=
'pi+:generic_0',
440 cut=
'[dr < 2] and [abs(dz) < 4]', writeOut=
True)
441 path.add_module(
'VariablesToExtraInfo', particleList=
'pi+:generic_0', variables={
'constant(0)':
'decayModeID'})
442 path.add_module(
'MCMatcherParticles', listName=
'pi+:generic_0')
443 path.add_module(
'VariablesToHistogram', particleList=
'pi+:generic_0',
444 variables=fei.config.variables2binnings([
'piid',
'mcErrors',
'mcParticleStatus',
'isPrimarySignal']),
445 variables_2d=fei.config.variables2binnings_2d([(
'piid',
'isPrimarySignal'),
446 (
'piid',
'mcErrors'),
447 (
'piid',
'mcParticleStatus')]),
448 fileName=
'Monitor_PreReconstruction_BeforeRanking.root', directory=
'pi+:generic ==> pi+:FSP',
449 ignoreCommandLineOverride=
True)
450 path.add_module(
'BestCandidateSelection', particleList=
'pi+:generic_0', variable=
'piid', selectLowest=
False,
451 numBest=20, outputVariable=
'preCut_rank')
452 path.add_module(
'VariablesToHistogram', particleList=
'pi+:generic_0',
453 variables=fei.config.variables2binnings([
'piid',
'mcErrors',
'mcParticleStatus',
454 'isPrimarySignal',
'extraInfo(preCut_rank)']),
455 variables_2d=fei.config.variables2binnings_2d([(
'piid',
'isPrimarySignal'),
456 (
'piid',
'mcErrors'),
457 (
'piid',
'mcParticleStatus'),
458 (
'extraInfo(preCut_rank)',
'isPrimarySignal'),
459 (
'extraInfo(preCut_rank)',
'mcErrors'),
460 (
'extraInfo(preCut_rank)',
'mcParticleStatus')]),
461 fileName=
'Monitor_PreReconstruction_AfterRanking.root', directory=
'pi+:generic ==> pi+:FSP',
462 ignoreCommandLineOverride=
True)
463 path.add_module(
'VariablesToHistogram', particleList=
'pi+:generic_0',
464 variables=fei.config.variables2binnings([
'chiProb',
'mcErrors',
'mcParticleStatus',
466 variables_2d=fei.config.variables2binnings_2d([(
'chiProb',
'isPrimarySignal'),
467 (
'chiProb',
'mcErrors'),
468 (
'chiProb',
'mcParticleStatus')]),
469 fileName=
'Monitor_PreReconstruction_AfterVertex.root', directory=
'pi+:generic ==> pi+:FSP',
470 ignoreCommandLineOverride=
True)
472 path.add_module(
'ParticleListManipulator', inputListNames=[
'K+:FSP'], outputListName=
'K+:generic_0',
473 cut=
'[dr < 2] and [abs(dz) < 4]', writeOut=
True)
474 path.add_module(
'VariablesToExtraInfo', particleList=
'K+:generic_0', variables={
'constant(0)':
'decayModeID'})
476 path.add_module(
'MCMatcherParticles', listName=
'K+:generic_0')
477 path.add_module(
'VariablesToHistogram', particleList=
'K+:generic_0',
478 variables=fei.config.variables2binnings([
'Kid',
'mcErrors',
'mcParticleStatus',
'isPrimarySignal']),
479 variables_2d=fei.config.variables2binnings_2d([(
'Kid',
'isPrimarySignal'),
481 (
'Kid',
'mcParticleStatus')]),
482 fileName=
'Monitor_PreReconstruction_BeforeRanking.root', directory=
'K+:generic ==> K+:FSP',
483 ignoreCommandLineOverride=
True)
484 path.add_module(
'BestCandidateSelection', particleList=
'K+:generic_0', variable=
'Kid', selectLowest=
False,
485 numBest=20, outputVariable=
'preCut_rank')
486 path.add_module(
'VariablesToHistogram', particleList=
'K+:generic_0',
487 variables=fei.config.variables2binnings([
'Kid',
'mcErrors',
'mcParticleStatus',
488 'isPrimarySignal',
'extraInfo(preCut_rank)']),
489 variables_2d=fei.config.variables2binnings_2d([(
'Kid',
'isPrimarySignal'),
491 (
'Kid',
'mcParticleStatus'),
492 (
'extraInfo(preCut_rank)',
'isPrimarySignal'),
493 (
'extraInfo(preCut_rank)',
'mcErrors'),
494 (
'extraInfo(preCut_rank)',
'mcParticleStatus')]),
495 fileName=
'Monitor_PreReconstruction_AfterRanking.root', directory=
'K+:generic ==> K+:FSP',
496 ignoreCommandLineOverride=
True)
497 path.add_module(
'VariablesToHistogram', particleList=
'K+:generic_0',
498 variables=fei.config.variables2binnings([
'chiProb',
'mcErrors',
'mcParticleStatus',
500 variables_2d=fei.config.variables2binnings_2d([(
'chiProb',
'isPrimarySignal'),
501 (
'chiProb',
'mcErrors'),
502 (
'chiProb',
'mcParticleStatus')]),
503 fileName=
'Monitor_PreReconstruction_AfterVertex.root', directory=
'K+:generic ==> K+:FSP',
504 ignoreCommandLineOverride=
True)
506 path.add_module(
'ParticleCombiner', decayString=
'D0:generic_0 -> K-:generic pi+:generic', writeOut=
True,
507 decayMode=0, cut=
'1.7 < M < 1.95')
508 path.add_module(
'MCMatcherParticles', listName=
'D0:generic_0')
509 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_0',
510 variables=fei.config.variables2binnings([
'abs(dM)',
'mcErrors',
'mcParticleStatus',
'isSignal']),
511 variables_2d=fei.config.variables2binnings_2d([(
'abs(dM)',
'isSignal'),
512 (
'abs(dM)',
'mcErrors'),
513 (
'abs(dM)',
'mcParticleStatus')]),
514 fileName=
'Monitor_PreReconstruction_BeforeRanking.root', directory=
'D0:generic ==> K-:generic pi+:generic',
515 ignoreCommandLineOverride=
True)
516 path.add_module(
'BestCandidateSelection', particleList=
'D0:generic_0',
517 variable=
'abs(dM)', selectLowest=
True, numBest=20, outputVariable=
'preCut_rank')
518 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_0',
519 variables=fei.config.variables2binnings([
'abs(dM)',
'mcErrors',
'mcParticleStatus',
520 'isSignal',
'extraInfo(preCut_rank)']),
521 variables_2d=fei.config.variables2binnings_2d([(
'abs(dM)',
'isSignal'),
522 (
'abs(dM)',
'mcErrors'),
523 (
'abs(dM)',
'mcParticleStatus'),
524 (
'extraInfo(preCut_rank)',
'isSignal'),
525 (
'extraInfo(preCut_rank)',
'mcErrors'),
526 (
'extraInfo(preCut_rank)',
'mcParticleStatus')]),
527 fileName=
'Monitor_PreReconstruction_AfterRanking.root', directory=
'D0:generic ==> K-:generic pi+:generic',
528 ignoreCommandLineOverride=
True)
529 path.add_module(
'ParticleVertexFitter', listName=
'D0:generic_0', confidenceLevel=-2.0,
530 vertexFitter=
'KFit', fitType=
'vertex')
531 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_0',
532 variables=fei.config.variables2binnings([
'chiProb',
'mcErrors',
'mcParticleStatus',
534 variables_2d=fei.config.variables2binnings_2d([(
'chiProb',
'isSignal'),
535 (
'chiProb',
'mcErrors'),
536 (
'chiProb',
'mcParticleStatus')]),
537 fileName=
'Monitor_PreReconstruction_AfterVertex.root', directory=
'D0:generic ==> K-:generic pi+:generic',
538 ignoreCommandLineOverride=
True)
540 path.add_module(
'ParticleCombiner', decayString=
'D0:generic_1 -> pi-:generic pi+:generic', writeOut=
True,
541 decayMode=1, cut=
'1.7 < M < 1.95')
542 path.add_module(
'MCMatcherParticles', listName=
'D0:generic_1')
543 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_1',
544 variables=fei.config.variables2binnings([
'abs(dM)',
'mcErrors',
'mcParticleStatus',
'isSignal']),
545 variables_2d=fei.config.variables2binnings_2d([(
'abs(dM)',
'isSignal'),
546 (
'abs(dM)',
'mcErrors'),
547 (
'abs(dM)',
'mcParticleStatus')]),
548 fileName=
'Monitor_PreReconstruction_BeforeRanking.root', directory=
'D0:generic ==> pi-:generic pi+:generic',
549 ignoreCommandLineOverride=
True)
550 path.add_module(
'BestCandidateSelection', particleList=
'D0:generic_1',
551 variable=
'abs(dM)', selectLowest=
True, numBest=20, outputVariable=
'preCut_rank')
552 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_1',
553 variables=fei.config.variables2binnings([
'abs(dM)',
'mcErrors',
'mcParticleStatus',
554 'isSignal',
'extraInfo(preCut_rank)']),
555 variables_2d=fei.config.variables2binnings_2d([(
'abs(dM)',
'isSignal'),
556 (
'abs(dM)',
'mcErrors'),
557 (
'abs(dM)',
'mcParticleStatus'),
558 (
'extraInfo(preCut_rank)',
'isSignal'),
559 (
'extraInfo(preCut_rank)',
'mcErrors'),
560 (
'extraInfo(preCut_rank)',
'mcParticleStatus')]),
561 fileName=
'Monitor_PreReconstruction_AfterRanking.root', directory=
'D0:generic ==> pi-:generic pi+:generic',
562 ignoreCommandLineOverride=
True)
563 path.add_module(
'ParticleVertexFitter', listName=
'D0:generic_1', confidenceLevel=-2.0,
564 vertexFitter=
'KFit', fitType=
'vertex')
565 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_1',
566 variables=fei.config.variables2binnings([
'chiProb',
'mcErrors',
'mcParticleStatus',
568 variables_2d=fei.config.variables2binnings_2d([(
'chiProb',
'isSignal'),
569 (
'chiProb',
'mcErrors'),
570 (
'chiProb',
'mcParticleStatus')]),
571 fileName=
'Monitor_PreReconstruction_AfterVertex.root', directory=
'D0:generic ==> pi-:generic pi+:generic',
572 ignoreCommandLineOverride=
True)
574 print_path(path, x.reconstruct())
575 self.assertEqual(x.reconstruct(), path)
578class TestPostReconstruction(unittest.TestCase):
580 def test_get_missing_channels(self):
581 pion = Particle(
'pi+:unittest', fei.config.MVAConfiguration(variables=[
'p',
'dr'], target=
'isPrimarySignal'))
582 pion.addChannel([
'pi+:FSP'])
583 D0 = Particle(
'D0:unittest', fei.config.MVAConfiguration(variables=[
'M',
'p'], target=
'isSignal'))
584 D0.addChannel([
'K-:unittest',
'pi+:unittest'])
585 D0.addChannel([
'pi-:unittest',
'pi+:unittest'])
586 config = fei.config.FeiConfiguration(monitor=
False, prefix=
"UNITTEST")
587 x = fei.core.PostReconstruction([pion, D0], config)
589 self.assertEqual(x.get_missing_channels(), [
'pi+:unittest ==> pi+:FSP',
'D0:unittest ==> K-:unittest pi+:unittest',
590 'D0:unittest ==> pi-:unittest pi+:unittest'])
591 self.assertEqual(x.available(),
False)
594 <?xml version="1.0" encoding="utf-8"?>
595 <method>Trivial</method>
596 <weightfile>{channel}.xml</weightfile>
597 <treename>tree</treename>
598 <target_variable>isSignal</target_variable>
599 <weight_variable>__weight__</weight_variable>
600 <signal_class>1</signal_class>
601 <max_events>0</max_events>
602 <number_feature_variables>1</number_feature_variables>
603 <variable0>M</variable0>
604 <number_spectator_variables>0</number_spectator_variables>
605 <number_data_files>1</number_data_files>
606 <datafile0>train.root</datafile0>
607 <Trivial_version>1</Trivial_version>
608 <Trivial_output>0</Trivial_output>
609 <signal_fraction>0.066082567</signal_fraction>
612 channel =
'D0:unittest ==> K-:unittest pi+:unittest'
613 with open(channel +
".xml",
"w")
as f:
614 f.write(content.format(channel=channel))
615 basf2_mva.upload(channel +
".xml",
'UNITTEST_' + channel)
617 self.assertEqual(x.get_missing_channels(), [
'pi+:unittest ==> pi+:FSP',
618 'D0:unittest ==> pi-:unittest pi+:unittest'])
619 self.assertEqual(x.available(),
False)
621 channel =
'D0:unittest ==> pi-:unittest pi+:unittest'
622 with open(channel +
".xml",
"w")
as f:
623 f.write(content.format(channel=channel))
624 basf2_mva.upload(channel +
".xml",
'UNITTEST_' + channel)
626 self.assertEqual(x.get_missing_channels(), [
'pi+:unittest ==> pi+:FSP'])
627 self.assertEqual(x.available(),
False)
629 channel =
'pi+:unittest ==> pi+:FSP'
630 with open(channel +
".xml",
"w")
as f:
631 f.write(content.format(channel=channel))
632 basf2_mva.upload(channel +
".xml",
'UNITTEST_' + channel)
634 self.assertEqual(x.get_missing_channels(), [])
635 self.assertEqual(x.available(),
True)
638 if os.path.isfile(
'pi+:unittest ==> pi+:FSP.xml'):
639 os.remove(
'pi+:unittest ==> pi+:FSP.xml')
640 if os.path.isfile(
'D0:unittest ==> pi-:unittest pi+:unittest.xml'):
641 os.remove(
'D0:unittest ==> pi-:unittest pi+:unittest.xml')
642 if os.path.isfile(
'D0:unittest ==> K-:unittest pi+:unittest.xml'):
643 os.remove(
'D0:unittest ==> K-:unittest pi+:unittest.xml')
645 def test_without_monitoring(self):
646 particles = get_small_unittest_channels()
647 config = fei.config.FeiConfiguration(monitor=
False, prefix=
'UNITTEST')
648 x = fei.core.PostReconstruction(particles, config)
650 path = basf2.create_path()
652 path.add_module(
'MVAExpert', identifier=
'UNITTEST_pi+:generic ==> pi+:FSP', extraInfoName=
'SignalProbability',
653 listNames=[
'pi+:generic_0'])
654 path.add_module(
'ParticleListManipulator', outputListName=
'pi+:generic', inputListNames=[
'pi+:generic_0'],
655 variable=
'particleSource', writeOut=
True)
656 path.add_module(
'ParticleSelector', decayString=
'pi+:generic', cut=
'0.01 < extraInfo(SignalProbability)')
657 path.add_module(
'BestCandidateSelection', particleList=
'pi+:generic', variable=
'extraInfo(SignalProbability)',
658 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
659 path.add_module(
'TagUniqueSignal', particleList=
'pi+:generic', target=
'isPrimarySignal',
660 extraInfoName=
'uniqueSignal')
662 path.add_module(
'MVAExpert', identifier=
'UNITTEST_K+:generic ==> K+:FSP', extraInfoName=
'SignalProbability',
663 listNames=[
'K+:generic_0'])
664 path.add_module(
'ParticleListManipulator', outputListName=
'K+:generic', inputListNames=[
'K+:generic_0'],
665 variable=
'particleSource', writeOut=
True)
666 path.add_module(
'ParticleSelector', decayString=
'K+:generic', cut=
'0.01 < extraInfo(SignalProbability)')
667 path.add_module(
'BestCandidateSelection', particleList=
'K+:generic', variable=
'extraInfo(SignalProbability)',
668 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
669 path.add_module(
'TagUniqueSignal', particleList=
'K+:generic', target=
'isPrimarySignal',
670 extraInfoName=
'uniqueSignal')
672 path.add_module(
'MVAExpert', identifier=
'UNITTEST_D0:generic ==> K-:generic pi+:generic',
673 extraInfoName=
'SignalProbability', listNames=[
'D0:generic_0'])
675 path.add_module(
'MVAExpert', identifier=
'UNITTEST_D0:generic ==> pi-:generic pi+:generic',
676 extraInfoName=
'SignalProbability', listNames=[
'D0:generic_1'])
678 path.add_module(
'ParticleListManipulator', outputListName=
'D0:generic',
679 inputListNames=[
'D0:generic_0',
'D0:generic_1'], variable=
'particleSource',
681 path.add_module(
'ParticleSelector', decayString=
'D0:generic', cut=
'0.001 < extraInfo(SignalProbability)')
682 path.add_module(
'BestCandidateSelection', particleList=
'D0:generic', variable=
'extraInfo(SignalProbability)',
683 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
684 path.add_module(
'TagUniqueSignal', particleList=
'D0:generic', target=
'isSignal',
685 extraInfoName=
'uniqueSignal')
687 print_path(path, x.reconstruct())
688 self.assertEqual(x.reconstruct(), path)
690 def test_without_monitoring_training_mode(self):
691 particles = get_small_unittest_channels()
692 config = fei.config.FeiConfiguration(monitor=
False, prefix=
'UNITTEST', training=
True)
693 x = fei.core.PostReconstruction(particles, config)
695 path = basf2.create_path()
697 path.add_module(
'MVAExpert', identifier=
'pi+:generic ==> pi+:FSP.xml', extraInfoName=
'SignalProbability',
698 listNames=[
'pi+:generic_0'])
699 path.add_module(
'ParticleListManipulator', outputListName=
'pi+:generic', inputListNames=[
'pi+:generic_0'],
700 variable=
'particleSource', writeOut=
True)
701 path.add_module(
'ParticleSelector', decayString=
'pi+:generic', cut=
'0.01 < extraInfo(SignalProbability)')
702 path.add_module(
'BestCandidateSelection', particleList=
'pi+:generic', variable=
'extraInfo(SignalProbability)',
703 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
704 path.add_module(
'TagUniqueSignal', particleList=
'pi+:generic', target=
'isPrimarySignal',
705 extraInfoName=
'uniqueSignal')
707 path.add_module(
'MVAExpert', identifier=
'K+:generic ==> K+:FSP.xml', extraInfoName=
'SignalProbability',
708 listNames=[
'K+:generic_0'])
709 path.add_module(
'ParticleListManipulator', outputListName=
'K+:generic', inputListNames=[
'K+:generic_0'],
710 variable=
'particleSource', writeOut=
True)
711 path.add_module(
'ParticleSelector', decayString=
'K+:generic', cut=
'0.01 < extraInfo(SignalProbability)')
712 path.add_module(
'BestCandidateSelection', particleList=
'K+:generic', variable=
'extraInfo(SignalProbability)',
713 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
714 path.add_module(
'TagUniqueSignal', particleList=
'K+:generic', target=
'isPrimarySignal',
715 extraInfoName=
'uniqueSignal')
717 path.add_module(
'MVAExpert', identifier=
'D0:generic ==> K-:generic pi+:generic.xml',
718 extraInfoName=
'SignalProbability', listNames=[
'D0:generic_0'])
720 path.add_module(
'MVAExpert', identifier=
'D0:generic ==> pi-:generic pi+:generic.xml',
721 extraInfoName=
'SignalProbability', listNames=[
'D0:generic_1'])
723 path.add_module(
'ParticleListManipulator', outputListName=
'D0:generic',
724 inputListNames=[
'D0:generic_0',
'D0:generic_1'], variable=
'particleSource',
726 path.add_module(
'ParticleSelector', decayString=
'D0:generic', cut=
'0.001 < extraInfo(SignalProbability)')
727 path.add_module(
'BestCandidateSelection', particleList=
'D0:generic', variable=
'extraInfo(SignalProbability)',
728 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
729 path.add_module(
'TagUniqueSignal', particleList=
'D0:generic', target=
'isSignal',
730 extraInfoName=
'uniqueSignal')
732 print_path(path, x.reconstruct())
733 self.assertEqual(x.reconstruct(), path)
735 def test_with_monitoring(self):
736 particles = get_small_unittest_channels()
737 config = fei.config.FeiConfiguration(monitor=
True, prefix=
'UNITTEST')
738 x = fei.core.PostReconstruction(particles, config)
740 path = basf2.create_path()
742 path.add_module(
'MVAExpert', identifier=
'UNITTEST_pi+:generic ==> pi+:FSP', extraInfoName=
'SignalProbability',
743 listNames=[
'pi+:generic_0'])
745 path.add_module(
'VariablesToHistogram', particleList=
'pi+:generic_0',
746 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
747 'extraInfo(SignalProbability)',
748 'isPrimarySignal',
'extraInfo(decayModeID)']),
749 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(SignalProbability)',
'isPrimarySignal'),
750 (
'extraInfo(SignalProbability)',
'mcErrors'),
751 (
'extraInfo(SignalProbability)',
'mcParticleStatus'),
752 (
'extraInfo(decayModeID)',
'isPrimarySignal'),
753 (
'extraInfo(decayModeID)',
'mcErrors'),
754 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
755 fileName=
'Monitor_PostReconstruction_AfterMVA.root', directory=
'pi+:generic ==> pi+:FSP',
756 ignoreCommandLineOverride=
True)
757 path.add_module(
'ParticleListManipulator', outputListName=
'pi+:generic', inputListNames=[
'pi+:generic_0'],
758 variable=
'particleSource', writeOut=
True)
759 path.add_module(
'VariablesToHistogram', particleList=
'pi+:generic',
760 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
761 'extraInfo(SignalProbability)',
762 'isPrimarySignal',
'extraInfo(decayModeID)']),
763 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isPrimarySignal'),
764 (
'extraInfo(decayModeID)',
'mcErrors'),
765 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
766 fileName=
'Monitor_PostReconstruction_BeforePostCut.root', directory=
'pi+:generic',
767 ignoreCommandLineOverride=
True)
768 path.add_module(
'ParticleSelector', decayString=
'pi+:generic', cut=
'0.01 < extraInfo(SignalProbability)')
769 path.add_module(
'VariablesToHistogram', particleList=
'pi+:generic',
770 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
771 'extraInfo(SignalProbability)',
772 'isPrimarySignal',
'extraInfo(decayModeID)']),
773 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isPrimarySignal'),
774 (
'extraInfo(decayModeID)',
'mcErrors'),
775 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
776 fileName=
'Monitor_PostReconstruction_BeforeRanking.root', directory=
'pi+:generic',
777 ignoreCommandLineOverride=
True)
778 path.add_module(
'BestCandidateSelection', particleList=
'pi+:generic', variable=
'extraInfo(SignalProbability)',
779 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
780 path.add_module(
'TagUniqueSignal', particleList=
'pi+:generic', target=
'isPrimarySignal',
781 extraInfoName=
'uniqueSignal')
782 path.add_module(
'VariablesToHistogram', particleList=
'pi+:generic',
783 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
784 'extraInfo(SignalProbability)',
'isPrimarySignal',
785 'extraInfo(decayModeID)',
'extraInfo(postCut_rank)']),
786 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isPrimarySignal'),
787 (
'extraInfo(decayModeID)',
'mcErrors'),
788 (
'extraInfo(decayModeID)',
'mcParticleStatus'),
789 (
'extraInfo(decayModeID)',
'extraInfo(postCut_rank)'),
790 (
'isPrimarySignal',
'extraInfo(postCut_rank)'),
791 (
'mcErrors',
'extraInfo(postCut_rank)'),
792 (
'mcParticleStatus',
'extraInfo(postCut_rank)')]),
793 fileName=
'Monitor_PostReconstruction_AfterRanking.root', directory=
'pi+:generic',
794 ignoreCommandLineOverride=
True)
795 path.add_module(
'VariablesToNtuple', fileName=
'Monitor_Final.root', treeName=
'pi+:generic variables',
796 ignoreCommandLineOverride=
True,
797 variables=[
'extraInfo(SignalProbability)',
'mcErrors',
'mcParticleStatus',
'isPrimarySignal',
798 'extraInfo(uniqueSignal)',
'extraInfo(decayModeID)'],
799 particleList=
'pi+:generic')
801 path.add_module(
'MVAExpert', identifier=
'UNITTEST_K+:generic ==> K+:FSP', extraInfoName=
'SignalProbability',
802 listNames=[
'K+:generic_0'])
803 path.add_module(
'VariablesToHistogram', particleList=
'K+:generic_0',
804 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
805 'extraInfo(SignalProbability)',
806 'isPrimarySignal',
'extraInfo(decayModeID)']),
807 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(SignalProbability)',
'isPrimarySignal'),
808 (
'extraInfo(SignalProbability)',
'mcErrors'),
809 (
'extraInfo(SignalProbability)',
'mcParticleStatus'),
810 (
'extraInfo(decayModeID)',
'isPrimarySignal'),
811 (
'extraInfo(decayModeID)',
'mcErrors'),
812 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
813 fileName=
'Monitor_PostReconstruction_AfterMVA.root', directory=
'K+:generic ==> K+:FSP',
814 ignoreCommandLineOverride=
True)
815 path.add_module(
'ParticleListManipulator', outputListName=
'K+:generic', inputListNames=[
'K+:generic_0'],
816 variable=
'particleSource', writeOut=
True)
817 path.add_module(
'VariablesToHistogram', particleList=
'K+:generic',
818 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
819 'extraInfo(SignalProbability)',
820 'isPrimarySignal',
'extraInfo(decayModeID)']),
821 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isPrimarySignal'),
822 (
'extraInfo(decayModeID)',
'mcErrors'),
823 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
824 fileName=
'Monitor_PostReconstruction_BeforePostCut.root', directory=
'K+:generic',
825 ignoreCommandLineOverride=
True)
826 path.add_module(
'ParticleSelector', decayString=
'K+:generic', cut=
'0.01 < extraInfo(SignalProbability)')
827 path.add_module(
'VariablesToHistogram', particleList=
'K+:generic',
828 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
829 'extraInfo(SignalProbability)',
830 'isPrimarySignal',
'extraInfo(decayModeID)']),
831 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isPrimarySignal'),
832 (
'extraInfo(decayModeID)',
'mcErrors'),
833 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
834 fileName=
'Monitor_PostReconstruction_BeforeRanking.root', directory=
'K+:generic',
835 ignoreCommandLineOverride=
True)
836 path.add_module(
'BestCandidateSelection', particleList=
'K+:generic', variable=
'extraInfo(SignalProbability)',
837 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
838 path.add_module(
'TagUniqueSignal', particleList=
'K+:generic', target=
'isPrimarySignal',
839 extraInfoName=
'uniqueSignal')
840 path.add_module(
'VariablesToHistogram', particleList=
'K+:generic',
841 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
842 'extraInfo(SignalProbability)',
'isPrimarySignal',
843 'extraInfo(decayModeID)',
'extraInfo(postCut_rank)']),
844 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isPrimarySignal'),
845 (
'extraInfo(decayModeID)',
'mcErrors'),
846 (
'extraInfo(decayModeID)',
'mcParticleStatus'),
847 (
'extraInfo(decayModeID)',
'extraInfo(postCut_rank)'),
848 (
'isPrimarySignal',
'extraInfo(postCut_rank)'),
849 (
'mcErrors',
'extraInfo(postCut_rank)'),
850 (
'mcParticleStatus',
'extraInfo(postCut_rank)')]),
851 fileName=
'Monitor_PostReconstruction_AfterRanking.root', directory=
'K+:generic',
852 ignoreCommandLineOverride=
True)
853 path.add_module(
'VariablesToNtuple', fileName=
'Monitor_Final.root', treeName=
'K+:generic variables',
854 ignoreCommandLineOverride=
True,
855 variables=[
'extraInfo(SignalProbability)',
'mcErrors',
'mcParticleStatus',
'isPrimarySignal',
856 'extraInfo(uniqueSignal)',
'extraInfo(decayModeID)'],
857 particleList=
'K+:generic')
859 path.add_module(
'MVAExpert', identifier=
'UNITTEST_D0:generic ==> K-:generic pi+:generic',
860 extraInfoName=
'SignalProbability', listNames=[
'D0:generic_0'])
861 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_0',
862 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
863 'extraInfo(SignalProbability)',
864 'isSignal',
'extraInfo(decayModeID)']),
865 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(SignalProbability)',
'isSignal'),
866 (
'extraInfo(SignalProbability)',
'mcErrors'),
867 (
'extraInfo(SignalProbability)',
'mcParticleStatus'),
868 (
'extraInfo(decayModeID)',
'isSignal'),
869 (
'extraInfo(decayModeID)',
'mcErrors'),
870 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
871 fileName=
'Monitor_PostReconstruction_AfterMVA.root', directory=
'D0:generic ==> K-:generic pi+:generic',
872 ignoreCommandLineOverride=
True)
874 path.add_module(
'MVAExpert', identifier=
'UNITTEST_D0:generic ==> pi-:generic pi+:generic',
875 extraInfoName=
'SignalProbability', listNames=[
'D0:generic_1'])
876 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic_1',
877 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
878 'extraInfo(SignalProbability)',
879 'isSignal',
'extraInfo(decayModeID)']),
880 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(SignalProbability)',
'isSignal'),
881 (
'extraInfo(SignalProbability)',
'mcErrors'),
882 (
'extraInfo(SignalProbability)',
'mcParticleStatus'),
883 (
'extraInfo(decayModeID)',
'isSignal'),
884 (
'extraInfo(decayModeID)',
'mcErrors'),
885 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
886 fileName=
'Monitor_PostReconstruction_AfterMVA.root', directory=
'D0:generic ==> pi-:generic pi+:generic',
887 ignoreCommandLineOverride=
True)
889 path.add_module(
'ParticleListManipulator', outputListName=
'D0:generic',
890 inputListNames=[
'D0:generic_0',
'D0:generic_1'], variable=
'particleSource',
892 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic',
893 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
894 'extraInfo(SignalProbability)',
895 'isSignal',
'extraInfo(decayModeID)']),
896 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isSignal'),
897 (
'extraInfo(decayModeID)',
'mcErrors'),
898 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
899 fileName=
'Monitor_PostReconstruction_BeforePostCut.root', directory=
'D0:generic',
900 ignoreCommandLineOverride=
True)
901 path.add_module(
'ParticleSelector', decayString=
'D0:generic', cut=
'0.001 < extraInfo(SignalProbability)')
902 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic',
903 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
904 'extraInfo(SignalProbability)',
905 'isSignal',
'extraInfo(decayModeID)']),
906 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isSignal'),
907 (
'extraInfo(decayModeID)',
'mcErrors'),
908 (
'extraInfo(decayModeID)',
'mcParticleStatus')]),
909 fileName=
'Monitor_PostReconstruction_BeforeRanking.root', directory=
'D0:generic',
910 ignoreCommandLineOverride=
True)
911 path.add_module(
'BestCandidateSelection', particleList=
'D0:generic', variable=
'extraInfo(SignalProbability)',
912 selectLowest=
False, numBest=10, outputVariable=
'postCut_rank')
913 path.add_module(
'TagUniqueSignal', particleList=
'D0:generic', target=
'isSignal',
914 extraInfoName=
'uniqueSignal')
915 path.add_module(
'VariablesToHistogram', particleList=
'D0:generic',
916 variables=fei.config.variables2binnings([
'mcErrors',
'mcParticleStatus',
917 'extraInfo(SignalProbability)',
'isSignal',
918 'extraInfo(decayModeID)',
'extraInfo(postCut_rank)']),
919 variables_2d=fei.config.variables2binnings_2d([(
'extraInfo(decayModeID)',
'isSignal'),
920 (
'extraInfo(decayModeID)',
'mcErrors'),
921 (
'extraInfo(decayModeID)',
'mcParticleStatus'),
922 (
'extraInfo(decayModeID)',
'extraInfo(postCut_rank)'),
923 (
'isSignal',
'extraInfo(postCut_rank)'),
924 (
'mcErrors',
'extraInfo(postCut_rank)'),
925 (
'mcParticleStatus',
'extraInfo(postCut_rank)')]),
926 fileName=
'Monitor_PostReconstruction_AfterRanking.root', directory=
'D0:generic',
927 ignoreCommandLineOverride=
True)
928 path.add_module(
'VariablesToNtuple', fileName=
'Monitor_Final.root', treeName=
'D0:generic variables',
929 ignoreCommandLineOverride=
True,
930 variables=[
'extraInfo(SignalProbability)',
'mcErrors',
'mcParticleStatus',
'isSignal',
931 'extraInfo(uniqueSignal)',
'extraInfo(decayModeID)'],
932 particleList=
'D0:generic')
934 print_path(path, x.reconstruct())
935 self.assertEqual(x.reconstruct(), path)
938class TestTeacher(unittest.TestCase):
940 fei.core.Teacher.MaximumNumberOfMVASamples = int(1e7)
941 fei.core.Teacher.MinimumNumberOfMVASamples = int(10)
943 f = ROOT.TFile(
'training_input.root',
'RECREATE')
945 tree = ROOT.TTree(
'pi+:generic ==> pi+:FSP variables',
'pi+:generic ==> pi+:FSP variables')
946 isSignal = np.zeros(1, dtype=float)
947 p = np.zeros(1, dtype=float)
948 pt = np.zeros(1, dtype=float)
949 tree.Branch(
'isPrimarySignal', isSignal,
'isPrimarySignal/D')
950 tree.Branch(
'p', p,
'p/D')
951 tree.Branch(
'dr', pt,
'dr/D')
952 for i
in range(1000):
957 tree.Write(
"", ROOT.TObject.kOverwrite)
961 tree = ROOT.TTree(
'D0:generic ==> K-:generic pi+:generic variables',
'D0:generic ==> K-:generic pi+:generic variables')
962 isSignal = np.zeros(1, dtype=float)
963 p = np.zeros(1, dtype=float)
964 pt = np.zeros(1, dtype=float)
965 tree.Branch(
'isSignal', isSignal,
'isSignal/D')
966 tree.Branch(
'M', p,
'M/D')
967 tree.Branch(
'p', pt,
'p/D')
974 tree.Write(
"", ROOT.TObject.kOverwrite)
976 tree = ROOT.TTree(
'D0:generic ==> pi-:generic pi+:generic variables',
'D0:generic ==> pi-:generic pi+:generic variables')
977 isSignal = np.zeros(1, dtype=float)
978 p = np.zeros(1, dtype=float)
979 pt = np.zeros(1, dtype=float)
980 tree.Branch(
'isSignal', isSignal,
'isSignal/D')
981 tree.Branch(
'M', p,
'M/D')
982 tree.Branch(
'p', pt,
'p/D')
983 for i
in range(1000):
988 tree.Write(
"", ROOT.TObject.kOverwrite)
991 if os.path.isfile(
'UNITTEST_TEACHER.xml'):
992 os.remove(
'UNITTEST_TEACHER.xml')
993 if os.path.isfile(
'UNITTEST_pi+:generic ==> pi+:FSP.xml'):
994 os.remove(
'UNITTEST_pi+:generic ==> pi+:FSP.xml')
995 if os.path.isfile(
'UNITTEST_K+:generic ==> K+:FSP.xml'):
996 os.remove(
'UNITTEST_K+:generic ==> K+:FSP.xml')
997 if os.path.isfile(
'UNITTEST_D0:generic ==> K-:generic pi+:generic.xml'):
998 os.remove(
'UNITTEST_D0:generic ==> K-:generic pi+:generic.xml')
999 if os.path.isfile(
'UNITTEST_D0:generic ==> pi-:generic pi+:generic.xml'):
1000 os.remove(
'UNITTEST_D0:generic ==> pi-:generic pi+:generic.xml')
1001 if os.path.isfile(
'training_input.root'):
1002 os.remove(
'training_input.root')
1004 def test_create_fake_weightfile(self):
1005 self.assertEqual(os.path.isfile(
'UNITTEST_pi+:generic ==> pi+:FSP.xml'),
False)
1006 self.assertEqual(basf2_mva.available(
'UNITTEST_pi+:generic ==> pi+:FSP.xml'),
False)
1007 fei.core.Teacher.create_fake_weightfile(
'UNITTEST_pi+:generic ==> pi+:FSP')
1008 self.assertEqual(os.path.isfile(
'UNITTEST_pi+:generic ==> pi+:FSP.xml'),
True)
1009 self.assertEqual(basf2_mva.available(
'UNITTEST_pi+:generic ==> pi+:FSP.xml'),
True)
1011 def test_upload(self):
1012 particles = get_small_unittest_channels()
1013 config = fei.config.FeiConfiguration(monitor=
False, prefix=
'UNITTEST', externTeacher=
'basf2_mva_teacher')
1014 x = fei.core.Teacher(particles, config)
1015 fei.core.Teacher.create_fake_weightfile(
'TEACHER')
1016 self.assertEqual(basf2_mva.available(
'UNITTEST_TEACHER'),
False)
1017 r = x.upload(
'TEACHER')
1018 self.assertEqual(basf2_mva.available(
'UNITTEST_TEACHER'),
True)
1019 self.assertEqual(r, (
'TEACHER.xml',
'UNITTEST_TEACHER'))
1021 def test_without_monitoring(self):
1022 particles = get_small_unittest_channels()
1023 config = fei.config.FeiConfiguration(monitor=
False, prefix=
'UNITTEST', externTeacher=
'basf2_mva_teacher')
1024 x = fei.core.Teacher(particles, config)
1026 self.assertEqual(basf2_mva.available(
'UNITTEST_pi+:generic ==> pi+:FSP'),
False)
1027 self.assertEqual(basf2_mva.available(
'UNITTEST_K+:generic ==> K+:FSP'),
False)
1028 self.assertEqual(basf2_mva.available(
'UNITTEST_D0:generic ==> K-:generic pi+:generic'),
False)
1029 self.assertEqual(basf2_mva.available(
'UNITTEST_D0:generic ==> pi-:generic pi+:generic'),
False)
1031 x.do_all_trainings()
1033 self.assertEqual(basf2_mva.available(
'UNITTEST_pi+:generic ==> pi+:FSP'),
True)
1034 self.assertEqual(basf2_mva.available(
'UNITTEST_K+:generic ==> K+:FSP'),
False)
1035 self.assertEqual(basf2_mva.available(
'UNITTEST_D0:generic ==> K-:generic pi+:generic'),
True)
1036 self.assertEqual(basf2_mva.available(
'UNITTEST_D0:generic ==> pi-:generic pi+:generic'),
True)
1040class TestConvertLegacyTraining(unittest.TestCase):
1045class TestGetPath(unittest.TestCase):
1048 particles = fei.get_unittest_channels()
1050 f = ROOT.TFile(
'mcParticlesCount.root',
'RECREATE')
1053 for pdgnumber
in {abs(
pdg.from_name(particle.name))
for particle
in particles}:
1054 hist = ROOT.TH1F(f
"NumberOfMCParticlesInEvent__bo{pdgnumber}__bc",
1055 f
"NumberOfMCParticlesInEvent__bo{pdgnumber}__bc", 11, -0.5, 10.5)
1058 f.Write(f
"NumberOfMCParticlesInEvent__bo{pdgnumber}__bc")
1061 if os.path.isfile(
'mcParticlesCount.root'):
1062 os.remove(
'mcParticlesCount.root')
1063 if os.path.isfile(
'Summary.pickle'):
1064 os.remove(
'Summary.pickle')
1066 def test_get_path_default_cache(self):
1067 particles = fei.get_unittest_channels()
1068 config = fei.config.FeiConfiguration(training=
True)
1069 x = fei.core.Teacher(particles, config)
1073 feistate = fei.core.get_path(particles, config)
1074 self.assertEqual(feistate.stage, 0)
1078 config = fei.config.FeiConfiguration(training=
True)
1079 feistate = fei.core.get_path(particles, config)
1080 self.assertEqual(feistate.stage, 1)
1084 config = fei.config.FeiConfiguration(training=
True)
1085 feistate = fei.core.get_path(particles, config)
1086 self.assertEqual(feistate.stage, 1)
1089 fei.core.Teacher.create_fake_weightfile(
'pi+:generic ==> pi+:FSP')
1090 fei.core.Teacher.create_fake_weightfile(
'K+:generic ==> K+:FSP')
1091 fei.core.Teacher.create_fake_weightfile(
'mu+:generic ==> mu+:FSP')
1092 fei.core.Teacher.create_fake_weightfile(
'gamma:generic ==> gamma:FSP')
1093 fei.core.Teacher.create_fake_weightfile(
'gamma:generic ==> gamma:V0')
1097 config = fei.config.FeiConfiguration(training=
True)
1098 feistate = fei.core.get_path(particles, config)
1099 self.assertEqual(feistate.stage, 2)
1103 config = fei.config.FeiConfiguration(training=
True)
1104 feistate = fei.core.get_path(particles, config)
1105 self.assertEqual(feistate.stage, 2)
1108 fei.core.Teacher.create_fake_weightfile(
'pi0:generic ==> gamma:generic gamma:generic')
1112 config = fei.config.FeiConfiguration(training=
True)
1113 feistate = fei.core.get_path(particles, config)
1114 self.assertEqual(feistate.stage, 4)
1117 fei.core.Teacher.create_fake_weightfile(
'D0:generic ==> K-:generic pi+:generic')
1118 fei.core.Teacher.create_fake_weightfile(
'D0:generic ==> K-:generic pi+:generic pi0:generic')
1119 fei.core.Teacher.create_fake_weightfile(
'D0:generic ==> pi-:generic pi+:generic')
1120 fei.core.Teacher.create_fake_weightfile(
'D0:semileptonic ==> K-:generic mu+:generic')
1121 fei.core.Teacher.create_fake_weightfile(
'D0:semileptonic ==> K-:generic pi0:generic mu+:generic')
1125 config = fei.config.FeiConfiguration(training=
True)
1126 feistate = fei.core.get_path(particles, config)
1127 self.assertEqual(feistate.stage, 7)
1131 config = fei.config.FeiConfiguration(cache=0, training=
True)
1132 feistate = fei.core.get_path(particles, config)
1133 self.assertEqual(feistate.stage, 7)
1137 os.remove(
'pi+:generic ==> pi+:FSP.xml')
1138 os.remove(
'K+:generic ==> K+:FSP.xml')
1139 os.remove(
'mu+:generic ==> mu+:FSP.xml')
1140 os.remove(
'gamma:generic ==> gamma:FSP.xml')
1141 os.remove(
'gamma:generic ==> gamma:V0.xml')
1142 os.remove(
'pi0:generic ==> gamma:generic gamma:generic.xml')
1143 os.remove(
'D0:generic ==> K-:generic pi+:generic.xml')
1144 os.remove(
'D0:generic ==> K-:generic pi+:generic pi0:generic.xml')
1145 os.remove(
'D0:generic ==> pi-:generic pi+:generic.xml')
1146 os.remove(
'D0:semileptonic ==> K-:generic mu+:generic.xml')
1147 os.remove(
'D0:semileptonic ==> K-:generic pi0:generic mu+:generic.xml')
1149 config = fei.config.FeiConfiguration(cache=0, training=
False)
1150 feistate = fei.core.get_path(particles, config)
1151 self.assertEqual(feistate.stage, 7)
1153 def test_get_path(self):
1154 particles = fei.get_unittest_channels()
1155 config = fei.config.FeiConfiguration(cache=-1, training=
True)
1156 x = fei.core.Teacher(particles, config)
1160 feistate = fei.core.get_path(particles, config)
1161 self.assertEqual(feistate.stage, 0)
1165 config = fei.config.FeiConfiguration(cache=0, training=
True)
1166 feistate = fei.core.get_path(particles, config)
1167 self.assertEqual(feistate.stage, 1)
1171 config = fei.config.FeiConfiguration(cache=1, training=
True)
1172 feistate = fei.core.get_path(particles, config)
1173 self.assertEqual(feistate.stage, 1)
1176 fei.core.Teacher.create_fake_weightfile(
'pi+:generic ==> pi+:FSP')
1177 fei.core.Teacher.create_fake_weightfile(
'K+:generic ==> K+:FSP')
1178 fei.core.Teacher.create_fake_weightfile(
'mu+:generic ==> mu+:FSP')
1179 fei.core.Teacher.create_fake_weightfile(
'gamma:generic ==> gamma:FSP')
1180 fei.core.Teacher.create_fake_weightfile(
'gamma:generic ==> gamma:V0')
1184 config = fei.config.FeiConfiguration(cache=1, training=
True)
1185 feistate = fei.core.get_path(particles, config)
1186 self.assertEqual(feistate.stage, 2)
1190 config = fei.config.FeiConfiguration(cache=2, training=
True)
1191 feistate = fei.core.get_path(particles, config)
1192 self.assertEqual(feistate.stage, 2)
1197 config = fei.config.FeiConfiguration(cache=4, training=
True)
1198 feistate = fei.core.get_path(particles, config)
1199 self.assertEqual(feistate.stage, 2)
1202 fei.core.Teacher.create_fake_weightfile(
'pi0:generic ==> gamma:generic gamma:generic')
1206 config = fei.config.FeiConfiguration(cache=2, training=
True)
1207 feistate = fei.core.get_path(particles, config)
1208 self.assertEqual(feistate.stage, 4)
1211 fei.core.Teacher.create_fake_weightfile(
'D0:generic ==> K-:generic pi+:generic')
1212 fei.core.Teacher.create_fake_weightfile(
'D0:generic ==> K-:generic pi+:generic pi0:generic')
1213 fei.core.Teacher.create_fake_weightfile(
'D0:generic ==> pi-:generic pi+:generic')
1214 fei.core.Teacher.create_fake_weightfile(
'D0:semileptonic ==> K-:generic mu+:generic')
1215 fei.core.Teacher.create_fake_weightfile(
'D0:semileptonic ==> K-:generic pi0:generic mu+:generic')
1219 config = fei.config.FeiConfiguration(cache=4, training=
True)
1220 feistate = fei.core.get_path(particles, config)
1221 self.assertEqual(feistate.stage, 7)
1225 config = fei.config.FeiConfiguration(cache=0, training=
True)
1226 feistate = fei.core.get_path(particles, config)
1227 self.assertEqual(feistate.stage, 7)
1231 os.remove(
'pi+:generic ==> pi+:FSP.xml')
1232 os.remove(
'K+:generic ==> K+:FSP.xml')
1233 os.remove(
'mu+:generic ==> mu+:FSP.xml')
1234 os.remove(
'gamma:generic ==> gamma:FSP.xml')
1235 os.remove(
'gamma:generic ==> gamma:V0.xml')
1236 os.remove(
'pi0:generic ==> gamma:generic gamma:generic.xml')
1237 os.remove(
'D0:generic ==> K-:generic pi+:generic.xml')
1238 os.remove(
'D0:generic ==> K-:generic pi+:generic pi0:generic.xml')
1239 os.remove(
'D0:generic ==> pi-:generic pi+:generic.xml')
1240 os.remove(
'D0:semileptonic ==> K-:generic mu+:generic.xml')
1241 os.remove(
'D0:semileptonic ==> K-:generic pi0:generic mu+:generic.xml')
1243 config = fei.config.FeiConfiguration(cache=0, training=
False)
1244 feistate = fei.core.get_path(particles, config)
1245 self.assertEqual(feistate.stage, 7)
1248if __name__ ==
'__main__':
1250 basf2.conditions.testing_payloads = [
'localdb/database.txt']
clean_working_directory()