Belle II Software  release-05-01-25
test_fei.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 import basf2
5 import unittest
6 import unittest.mock
7 import os
8 import tempfile
9 import atexit
10 import shutil
11 import contextlib
12 import subprocess
13 import ROOT
14 
15 import b2bii
16 
17 import fei
18 from fei.config import Particle
19 
20 import numpy as np
21 
22 import ROOT
23 from ROOT import Belle2
24 import basf2_mva
25 import pdg
26 
27 # @cond
28 
29 # Define equality operators for a bunch of pybasf2 classes
30 import pybasf2
31 pybasf2.Module.__eq__ = lambda a, b: a.type() == b.type() and\
32  all(x == y for x, y in zip(a.available_params(), b.available_params()))
33 pybasf2.ModuleParamInfo.__eq__ = lambda a, b: a.name == b.name and a.values == b.values
34 pybasf2.Path.__eq__ = lambda a, b: all(x == y for x, y in zip(a.modules(), b.modules()))
35 
36 
37 def print_path(a, b):
38  """
39  Print the parts of the pathes which are different
40  """
41  for x, y in zip(a.modules(), b.modules()):
42  if x.type() != y.type():
43  print(x.type(), y.type())
44  for n, m in zip(x.available_params(), y.available_params()):
45  if n.name != m.name:
46  print(n.name, m.name)
47  if n.values != m.values:
48  print(n.values, m.values)
49 
50 
51 def get_small_unittest_channels():
52  pion = Particle('pi+',
53  fei.config.MVAConfiguration(variables=['p', 'dr'],
54  target='isPrimarySignal'),
55  fei.config.PreCutConfiguration(userCut='[dr < 2] and [abs(dz) < 4]',
56  bestCandidateMode='highest',
57  bestCandidateVariable='piid',
58  bestCandidateCut=20),
59  fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.01))
60  pion.addChannel(['pi+:FSP'])
61 
62  kaon = Particle('K+',
63  fei.config.MVAConfiguration(variables=['p', 'dr'],
64  target='isPrimarySignal'),
65  fei.config.PreCutConfiguration(userCut='[dr < 2] and [abs(dz) < 4]',
66  bestCandidateMode='highest',
67  bestCandidateVariable='Kid',
68  bestCandidateCut=20),
69  fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.01))
70  kaon.addChannel(['K+:FSP'])
71 
72  D0 = Particle('D0',
73  fei.config.MVAConfiguration(variables=['M', 'p'],
74  target='isSignal'),
75  fei.config.PreCutConfiguration(userCut='1.7 < M < 1.95',
76  bestCandidateMode='lowest',
77  bestCandidateVariable='abs(dM)',
78  bestCandidateCut=20),
79  fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.001))
80  D0.addChannel(['K-', 'pi+'])
81  D0.addChannel(['pi-', 'pi+'])
82 
83  particles = [pion, kaon, D0]
84  return particles
85 
86 
87 class TestGetStagesFromParticles(unittest.TestCase):
88  def test_get_stages_from_particles(self):
89  particles = fei.get_unittest_channels()
90  stages = fei.core.get_stages_from_particles(particles)
91  self.assertEqual(len(stages), 7)
92  self.assertEqual(len(stages[0]), 4)
93  self.assertEqual(stages[0][0].identifier, 'gamma:generic')
94  self.assertEqual(stages[0][1].identifier, 'mu+:generic')
95  self.assertEqual(stages[0][2].identifier, 'pi+:generic')
96  self.assertEqual(stages[0][3].identifier, 'K+:generic')
97  self.assertEqual(len(stages[1]), 1)
98  self.assertEqual(stages[1][0].identifier, 'pi0:generic')
99  self.assertEqual(len(stages[2]), 0)
100  self.assertEqual(len(stages[3]), 2)
101  self.assertEqual(stages[3][0].identifier, 'D0:generic')
102  self.assertEqual(stages[3][1].identifier, 'D0:semileptonic')
103  self.assertEqual(len(stages[4]), 0)
104  self.assertEqual(len(stages[5]), 0)
105  self.assertEqual(len(stages[6]), 0)
106 
107 
108 class TestTrainingDataInformation(unittest.TestCase):
109 
110  def tearDown(self):
111  if os.path.isfile('mcParticlesCount.root'):
112  os.remove('mcParticlesCount.root')
113 
114  def test_reconstruct(self):
115  particles = fei.get_unittest_channels()
116  x = fei.core.TrainingDataInformation(particles)
117 
118  path = basf2.create_path()
119  path.add_module('VariablesToHistogram', fileName='mcParticlesCount.root',
120  variables=[
121  ('NumberOfMCParticlesInEvent(321)', 100, -0.5, 99.5),
122  ('NumberOfMCParticlesInEvent(421)', 100, -0.5, 99.5),
123  ('NumberOfMCParticlesInEvent(13)', 100, -0.5, 99.5),
124  ('NumberOfMCParticlesInEvent(111)', 100, -0.5, 99.5),
125  ('NumberOfMCParticlesInEvent(211)', 100, -0.5, 99.5),
126  ('NumberOfMCParticlesInEvent(22)', 100, -0.5, 99.5)]
127  )
128  print_path(path, x.reconstruct())
129  self.assertEqual(x.reconstruct(), path)
130 
131  def test_available(self):
132  particles = fei.get_unittest_channels()
133  x = fei.core.TrainingDataInformation(particles)
134  self.assertEqual(x.available(), False)
135  f = ROOT.TFile('mcParticlesCount.root', 'RECREATE')
136  self.assertEqual(x.available(), True)
137 
138  def test_get_mc_counts(self):
139  f = ROOT.TFile('mcParticlesCount.root', 'RECREATE')
140  f.cd()
141  hist = ROOT.TH1F("NumberOfMCParticlesInEvent__bo211__bc", "NumberOfMCParticlesInEvent__bo211__bc", 11, -0.5, 10.5)
142  for i in range(10):
143  hist.Fill(5)
144  for i in range(5):
145  hist.Fill(4)
146  for i in range(3):
147  hist.Fill(3)
148  f.Write("NumberOfMCParticlesInEvent__bo211__bc")
149 
150  hist = ROOT.TH1F("NumberOfMCParticlesInEvent__bo321__bc", "NumberOfMCParticlesInEvent__bo321__bc", 11, -0.5, 10.5)
151  for i in range(8):
152  hist.Fill(4)
153  for i in range(5):
154  hist.Fill(2)
155  for i in range(5):
156  hist.Fill(7)
157  f.Write("NumberOfMCParticlesInEvent__bo321__bc")
158 
159  hist = ROOT.TH1F("NumberOfMCParticlesInEvent__bo13__bc", "NumberOfMCParticlesInEvent__bo13__bc", 11, -0.5, 10.5)
160  for i in range(18):
161  hist.Fill(5)
162  f.Write("NumberOfMCParticlesInEvent__bo13__bc")
163 
164  hist = ROOT.TH1F("NumberOfMCParticlesInEvent__bo22__bc", "NumberOfMCParticlesInEvent__bo222__bc", 11, -0.5, 10.5)
165  for i in range(18):
166  hist.Fill(0)
167  f.Write("NumberOfMCParticlesInEvent__bo22__bc")
168 
169  hist = ROOT.TH1F("NumberOfMCParticlesInEvent__bo111__bc", "NumberOfMCParticlesInEvent__bo111__bc", 11, -0.5, 10.5)
170  for i in range(5):
171  hist.Fill(5)
172  for i in range(10):
173  hist.Fill(4)
174  for i in range(3):
175  hist.Fill(3)
176  f.Write("NumberOfMCParticlesInEvent__bo111__bc")
177 
178  hist = ROOT.TH1F("NumberOfMCParticlesInEvent__bo421__bc", "NumberOfMCParticlesInEvent__bo421__bc", 11, -0.5, 10.5)
179  for i in range(10):
180  hist.Fill(9)
181  for i in range(5):
182  hist.Fill(0)
183  for i in range(3):
184  hist.Fill(1)
185  f.Write("NumberOfMCParticlesInEvent__bo421__bc")
186 
187  particles = fei.get_unittest_channels()
188  x = fei.core.TrainingDataInformation(particles)
189 
190  mcCounts = {
191  211: {'max': 5.0, 'min': 3.0, 'sum': 79.0, 'avg': 4.3888888888888893, 'std': 0.7556372504852998},
192  321: {'max': 7.0, 'min': 2.0, 'sum': 77.0, 'avg': 4.2777777777777777, 'std': 1.8798804795209585},
193  13: {'max': 5.0, 'min': 5.0, 'sum': 90.0, 'avg': 5.0, 'std': 0.0},
194  22: {'max': 0.0, 'min': 0.0, 'sum': 0.0, 'avg': 0.0, 'std': 0.0},
195  111: {'max': 5.0, 'min': 3.0, 'sum': 74.0, 'avg': 4.1111111111111107, 'std': 0.6573421981221816},
196  421: {'max': 9.0, 'min': 0.0, 'sum': 93.0, 'avg': 5.166666666666667, 'std': 4.2979323194092087},
197  0: {'sum': 18.0}}
198  self.assertDictEqual(x.get_mc_counts(), mcCounts)
199 
200 
201 class TestFSPLoader(unittest.TestCase):
202 
203  def test_belle2_without_monitoring(self):
204  particles = get_small_unittest_channels()
205  config = fei.config.FeiConfiguration(monitor=False)
206  x = fei.core.FSPLoader(particles, config)
207 
208  path = basf2.create_path()
209  path.add_module('ParticleLoader', decayStringsWithCuts=[('K+:FSP', ''), ('pi+:FSP', ''), ('e+:FSP', ''),
210  ('mu+:FSP', ''), ('gamma:FSP', ''),
211  ('p+:FSP', ''), ('K_L0:FSP', '')],
212  writeOut=True)
213  path.add_module('ParticleLoader', decayStringsWithCuts=[('K_S0:V0 -> pi+ pi-', '')],
214  writeOut=True)
215  path.add_module('ParticleLoader', decayStringsWithCuts=[('Lambda0:V0 -> p+ pi-', '')],
216  writeOut=True)
217  path.add_module('ParticleLoader', decayStringsWithCuts=[('gamma:V0 -> e+ e-', '')], addDaughters=True, writeOut=True)
218  print_path(path, x.reconstruct())
219  self.assertEqual(x.reconstruct(), path)
220 
221  def test_belle2_with_monitoring(self):
222  particles = get_small_unittest_channels()
223  config = fei.config.FeiConfiguration(monitor=True)
224  x = fei.core.FSPLoader(particles, config)
225 
226  path = basf2.create_path()
227  path.add_module('ParticleLoader', decayStringsWithCuts=[('K+:FSP', ''), ('pi+:FSP', ''), ('e+:FSP', ''),
228  ('mu+:FSP', ''), ('gamma:FSP', ''),
229  ('p+:FSP', ''), ('K_L0:FSP', '')],
230  writeOut=True)
231  path.add_module('ParticleLoader', decayStringsWithCuts=[('K_S0:V0 -> pi+ pi-', '')],
232  writeOut=True)
233  path.add_module('ParticleLoader', decayStringsWithCuts=[('Lambda0:V0 -> p+ pi-', '')],
234  writeOut=True)
235  path.add_module('ParticleLoader', decayStringsWithCuts=[('gamma:V0 -> e+ e-', '')], addDaughters=True, writeOut=True)
236  hist_variables = [('NumberOfMCParticlesInEvent({i})'.format(i=pdgcode), 100, -0.5, 99.5)
237  for pdgcode in set([11, 321, 211, 13, 22, 310, 2212, 130, 3122, 111])]
238  path.add_module('VariablesToHistogram', particleList='',
239  variables=hist_variables,
240  fileName='Monitor_FSPLoader.root')
241  print_path(path, x.reconstruct())
242  self.assertEqual(x.reconstruct(), path)
243 
244  def test_belle1_without_monitoring(self):
245  particles = get_small_unittest_channels()
247  config = fei.config.FeiConfiguration(monitor=False)
248  x = fei.core.FSPLoader(particles, config)
249 
250  path = basf2.create_path()
251  path.add_module('ParticleLoader', decayStringsWithCuts=[('K+:FSP', ''), ('pi+:FSP', ''), ('e+:FSP', ''),
252  ('mu+:FSP', ''), ('p+:FSP', '')],
253  writeOut=True)
254  path.add_module('ParticleListManipulator', outputListName='gamma:FSP', inputListNames=['gamma:mdst'], writeOut=True)
255  path.add_module('ParticleCopier', inputListNames=['gamma:FSP'])
256  path.add_module('ParticleListManipulator', outputListName='K_S0:V0', inputListNames=['K_S0:mdst'], writeOut=True)
257  path.add_module('ParticleCopier', inputListNames=['K_S0:V0'])
258  path.add_module('ParticleListManipulator', outputListName='Lambda0:V0', inputListNames=['Lambda0:mdst'], writeOut=True)
259  path.add_module('ParticleCopier', inputListNames=['Lambda0:V0'])
260  path.add_module('ParticleListManipulator', outputListName='K_L0:FSP', inputListNames=['K_L0:mdst'], writeOut=True)
261  path.add_module('ParticleCopier', inputListNames=['K_L0:FSP'])
262  path.add_module('ParticleListManipulator', outputListName='pi0:FSP', inputListNames=['pi0:mdst'], writeOut=True)
263  path.add_module('ParticleCopier', inputListNames=['pi0:FSP'])
264  path.add_module('ParticleListManipulator', outputListName='gamma:V0', inputListNames=['gamma:v0mdst'], writeOut=True)
265  path.add_module('ParticleCopier', inputListNames=['gamma:V0'])
266  print_path(path, x.reconstruct())
267  self.assertEqual(x.reconstruct(), path)
269 
270  def test_belle1_with_monitoring(self):
271  particles = get_small_unittest_channels()
273  config = fei.config.FeiConfiguration(monitor=True)
274  x = fei.core.FSPLoader(particles, config)
275 
276  path = basf2.create_path()
277  path.add_module('ParticleLoader', decayStringsWithCuts=[('K+:FSP', ''), ('pi+:FSP', ''), ('e+:FSP', ''),
278  ('mu+:FSP', ''), ('p+:FSP', '')],
279  writeOut=True)
280  path.add_module('ParticleListManipulator', outputListName='gamma:FSP', inputListNames=['gamma:mdst'], writeOut=True)
281  path.add_module('ParticleCopier', inputListNames=['gamma:FSP'])
282  path.add_module('ParticleListManipulator', outputListName='K_S0:V0', inputListNames=['K_S0:mdst'], writeOut=True)
283  path.add_module('ParticleCopier', inputListNames=['K_S0:V0'])
284  path.add_module('ParticleListManipulator', outputListName='Lambda0:V0', inputListNames=['Lambda0:mdst'], writeOut=True)
285  path.add_module('ParticleCopier', inputListNames=['Lambda0:V0'])
286  path.add_module('ParticleListManipulator', outputListName='K_L0:FSP', inputListNames=['K_L0:mdst'], writeOut=True)
287  path.add_module('ParticleCopier', inputListNames=['K_L0:FSP'])
288  path.add_module('ParticleListManipulator', outputListName='pi0:FSP', inputListNames=['pi0:mdst'], writeOut=True)
289  path.add_module('ParticleCopier', inputListNames=['pi0:FSP'])
290  path.add_module('ParticleListManipulator', outputListName='gamma:V0', inputListNames=['gamma:v0mdst'], writeOut=True)
291  path.add_module('ParticleCopier', inputListNames=['gamma:V0'])
292  hist_variables = [('NumberOfMCParticlesInEvent({i})'.format(i=pdgcode), 100, -0.5, 99.5)
293  for pdgcode in set([11, 321, 211, 13, 22, 310, 2212, 130, 3122, 111])]
294  path.add_module('VariablesToHistogram', particleList='',
295  variables=hist_variables,
296  fileName='Monitor_FSPLoader.root')
297  print_path(path, x.reconstruct())
298  self.assertEqual(x.reconstruct(), path)
300 
301 
302 class TestTrainingData(unittest.TestCase):
303 
304  def setUp(self):
305  self.mc_counts = {
306  211: {'sum': 79, 'avg': 4.3888888888888893, 'max': 5, 'min': 3, 'std': 0.75563725048530228},
307  321: {'sum': 77, 'avg': 4.2777777777777777, 'max': 7, 'min': 2, 'std': 1.8798804795209592},
308  421: {'sum': 93, 'avg': 5.166666666666667, 'max': 9, 'min': 0, 'std': 4.2979323194092087},
309  0: {'sum': 18}}
310 
311  def test_without_monitoring(self):
312  particles = get_small_unittest_channels()
313  config = fei.config.FeiConfiguration(monitor=False)
314  x = fei.core.TrainingData(particles, config, self.mc_counts)
315 
316  path = basf2.create_path()
317  path.add_module('VariablesToNtuple', fileName='pi+:generic ==> pi+:FSP.root', treeName='variables',
318  variables=['p', 'dr', 'isPrimarySignal'],
319  particleList='pi+:generic_0', sampling=('isPrimarySignal', {}))
320  path.add_module('VariablesToNtuple', fileName='K+:generic ==> K+:FSP.root', treeName='variables',
321  variables=['p', 'dr', 'isPrimarySignal'],
322  particleList='K+:generic_0', sampling=('isPrimarySignal', {}))
323  path.add_module('VariablesToNtuple', fileName='D0:generic ==> K-:generic pi+:generic.root', treeName='variables',
324  variables=['M', 'p', 'isSignal'],
325  particleList='D0:generic_0', sampling=('isSignal', {}))
326  path.add_module('VariablesToNtuple', fileName='D0:generic ==> pi-:generic pi+:generic.root', treeName='variables',
327  variables=['M', 'p', 'isSignal'],
328  particleList='D0:generic_1', sampling=('isSignal', {}))
329  print_path(path, x.reconstruct())
330  self.assertEqual(x.reconstruct(), path)
331 
332  def test_with_monitoring(self):
333  particles = get_small_unittest_channels()
334  config = fei.config.FeiConfiguration(monitor=True)
335  x = fei.core.TrainingData(particles, config, self.mc_counts)
336 
337  path = basf2.create_path()
338  path.add_module('VariablesToHistogram', particleList='pi+:generic_0',
339  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'p', 'dr', 'isPrimarySignal']),
340  variables_2d=fei.config.variables2binnings_2d([('p', 'isPrimarySignal'), ('dr', 'isPrimarySignal')]),
341  fileName='Monitor_TrainingData_pi+:generic ==> pi+:FSP.root')
342  path.add_module('VariablesToNtuple', fileName='pi+:generic ==> pi+:FSP.root', treeName='variables',
343  variables=['p', 'dr', 'isPrimarySignal'],
344  particleList='pi+:generic_0', sampling=('isPrimarySignal', {}))
345  path.add_module('VariablesToHistogram', particleList='K+:generic_0',
346  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'p', 'dr', 'isPrimarySignal']),
347  variables_2d=fei.config.variables2binnings_2d([('p', 'isPrimarySignal'), ('dr', 'isPrimarySignal')]),
348  fileName='Monitor_TrainingData_K+:generic ==> K+:FSP.root')
349  path.add_module('VariablesToNtuple', fileName='K+:generic ==> K+:FSP.root', treeName='variables',
350  variables=['p', 'dr', 'isPrimarySignal'],
351  particleList='K+:generic_0', sampling=('isPrimarySignal', {}))
352  path.add_module('VariablesToHistogram', particleList='D0:generic_0',
353  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'M', 'p', 'isSignal']),
354  variables_2d=fei.config.variables2binnings_2d([('M', 'isSignal'), ('p', 'isSignal')]),
355  fileName='Monitor_TrainingData_D0:generic ==> K-:generic pi+:generic.root')
356  path.add_module('VariablesToNtuple', fileName='D0:generic ==> K-:generic pi+:generic.root', treeName='variables',
357  variables=['M', 'p', 'isSignal'],
358  particleList='D0:generic_0', sampling=('isSignal', {}))
359  path.add_module('VariablesToHistogram', particleList='D0:generic_1',
360  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'M', 'p', 'isSignal']),
361  variables_2d=fei.config.variables2binnings_2d([('M', 'isSignal'), ('p', 'isSignal')]),
362  fileName='Monitor_TrainingData_D0:generic ==> pi-:generic pi+:generic.root')
363  path.add_module('VariablesToNtuple', fileName='D0:generic ==> pi-:generic pi+:generic.root', treeName='variables',
364  variables=['M', 'p', 'isSignal'],
365  particleList='D0:generic_1', sampling=('isSignal', {}))
366  print_path(path, x.reconstruct())
367  self.assertEqual(x.reconstruct(), path)
368 
369 
370 class TestPreReconstruction(unittest.TestCase):
371 
372  def test_without_monitoring(self):
373  particles = get_small_unittest_channels()
374  config = fei.config.FeiConfiguration(monitor=False)
375  x = fei.core.PreReconstruction(particles, config)
376 
377  path = basf2.create_path()
378  path.add_module('ParticleListManipulator', inputListNames=['pi+:FSP'], outputListName='pi+:generic_0',
379  cut='[dr < 2] and [abs(dz) < 4]', writeOut=True)
380  path.add_module('VariablesToExtraInfo', particleList='pi+:generic_0', variables={'constant(0)': 'decayModeID'})
381  path.add_module('BestCandidateSelection', particleList='pi+:generic_0', variable='piid', selectLowest=False,
382  numBest=20, outputVariable='preCut_rank')
383 
384  path.add_module('ParticleListManipulator', inputListNames=['K+:FSP'], outputListName='K+:generic_0',
385  cut='[dr < 2] and [abs(dz) < 4]', writeOut=True)
386  path.add_module('VariablesToExtraInfo', particleList='K+:generic_0', variables={'constant(0)': 'decayModeID'})
387  path.add_module('BestCandidateSelection', particleList='K+:generic_0', variable='Kid', selectLowest=False,
388  numBest=20, outputVariable='preCut_rank')
389 
390  path.add_module('ParticleCombiner', decayString='D0:generic_0 -> K-:generic pi+:generic', writeOut=True,
391  decayMode=0, cut='1.7 < M < 1.95')
392  path.add_module('BestCandidateSelection', particleList='D0:generic_0',
393  variable='abs(dM)', selectLowest=True, numBest=20, outputVariable='preCut_rank')
394  path.add_module('ParticleVertexFitter', listName='D0:generic_0', confidenceLevel=-2.0,
395  vertexFitter='KFit', fitType='vertex')
396 
397  path.add_module('ParticleCombiner', decayString='D0:generic_1 -> pi-:generic pi+:generic', writeOut=True,
398  decayMode=1, cut='1.7 < M < 1.95')
399  path.add_module('BestCandidateSelection', particleList='D0:generic_1',
400  variable='abs(dM)', selectLowest=True, numBest=20, outputVariable='preCut_rank')
401  path.add_module('ParticleVertexFitter', listName='D0:generic_1', confidenceLevel=-2.0,
402  vertexFitter='KFit', fitType='vertex')
403 
404  print_path(path, x.reconstruct())
405  self.assertEqual(x.reconstruct(), path)
406 
407  def test_with_monitoring(self):
408  particles = get_small_unittest_channels()
409  config = fei.config.FeiConfiguration(monitor=True)
410  x = fei.core.PreReconstruction(particles, config)
411 
412  path = basf2.create_path()
413  path.add_module('ParticleListManipulator', inputListNames=['pi+:FSP'], outputListName='pi+:generic_0',
414  cut='[dr < 2] and [abs(dz) < 4]', writeOut=True)
415  path.add_module('VariablesToExtraInfo', particleList='pi+:generic_0', variables={'constant(0)': 'decayModeID'})
416  path.add_module('MCMatcherParticles', listName='pi+:generic_0')
417  path.add_module('VariablesToHistogram', particleList='pi+:generic_0',
418  variables=fei.config.variables2binnings(['piid', 'mcErrors', 'mcParticleStatus', 'isPrimarySignal']),
419  variables_2d=fei.config.variables2binnings_2d([('piid', 'isPrimarySignal'),
420  ('piid', 'mcErrors'),
421  ('piid', 'mcParticleStatus')]),
422  fileName='Monitor_PreReconstruction_BeforeRanking_pi+:generic ==> pi+:FSP.root')
423  path.add_module('BestCandidateSelection', particleList='pi+:generic_0', variable='piid', selectLowest=False,
424  numBest=20, outputVariable='preCut_rank')
425  path.add_module('VariablesToHistogram', particleList='pi+:generic_0',
426  variables=fei.config.variables2binnings(['piid', 'mcErrors', 'mcParticleStatus',
427  'isPrimarySignal', 'extraInfo(preCut_rank)']),
428  variables_2d=fei.config.variables2binnings_2d([('piid', 'isPrimarySignal'),
429  ('piid', 'mcErrors'),
430  ('piid', 'mcParticleStatus'),
431  ('extraInfo(preCut_rank)', 'isPrimarySignal'),
432  ('extraInfo(preCut_rank)', 'mcErrors'),
433  ('extraInfo(preCut_rank)', 'mcParticleStatus')]),
434  fileName='Monitor_PreReconstruction_AfterRanking_pi+:generic ==> pi+:FSP.root')
435  path.add_module('VariablesToHistogram', particleList='pi+:generic_0',
436  variables=fei.config.variables2binnings(['chiProb', 'mcErrors', 'mcParticleStatus',
437  'isPrimarySignal']),
438  variables_2d=fei.config.variables2binnings_2d([('chiProb', 'isPrimarySignal'),
439  ('chiProb', 'mcErrors'),
440  ('chiProb', 'mcParticleStatus')]),
441  fileName='Monitor_PreReconstruction_AfterVertex_pi+:generic ==> pi+:FSP.root')
442 
443  path.add_module('ParticleListManipulator', inputListNames=['K+:FSP'], outputListName='K+:generic_0',
444  cut='[dr < 2] and [abs(dz) < 4]', writeOut=True)
445  path.add_module('VariablesToExtraInfo', particleList='K+:generic_0', variables={'constant(0)': 'decayModeID'})
446 
447  path.add_module('MCMatcherParticles', listName='K+:generic_0')
448  path.add_module('VariablesToHistogram', particleList='K+:generic_0',
449  variables=fei.config.variables2binnings(['Kid', 'mcErrors', 'mcParticleStatus', 'isPrimarySignal']),
450  variables_2d=fei.config.variables2binnings_2d([('Kid', 'isPrimarySignal'),
451  ('Kid', 'mcErrors'),
452  ('Kid', 'mcParticleStatus')]),
453  fileName='Monitor_PreReconstruction_BeforeRanking_K+:generic ==> K+:FSP.root')
454  path.add_module('BestCandidateSelection', particleList='K+:generic_0', variable='Kid', selectLowest=False,
455  numBest=20, outputVariable='preCut_rank')
456  path.add_module('VariablesToHistogram', particleList='K+:generic_0',
457  variables=fei.config.variables2binnings(['Kid', 'mcErrors', 'mcParticleStatus',
458  'isPrimarySignal', 'extraInfo(preCut_rank)']),
459  variables_2d=fei.config.variables2binnings_2d([('Kid', 'isPrimarySignal'),
460  ('Kid', 'mcErrors'),
461  ('Kid', 'mcParticleStatus'),
462  ('extraInfo(preCut_rank)', 'isPrimarySignal'),
463  ('extraInfo(preCut_rank)', 'mcErrors'),
464  ('extraInfo(preCut_rank)', 'mcParticleStatus')]),
465  fileName='Monitor_PreReconstruction_AfterRanking_K+:generic ==> K+:FSP.root')
466  path.add_module('VariablesToHistogram', particleList='K+:generic_0',
467  variables=fei.config.variables2binnings(['chiProb', 'mcErrors', 'mcParticleStatus',
468  'isPrimarySignal']),
469  variables_2d=fei.config.variables2binnings_2d([('chiProb', 'isPrimarySignal'),
470  ('chiProb', 'mcErrors'),
471  ('chiProb', 'mcParticleStatus')]),
472  fileName='Monitor_PreReconstruction_AfterVertex_K+:generic ==> K+:FSP.root')
473 
474  path.add_module('ParticleCombiner', decayString='D0:generic_0 -> K-:generic pi+:generic', writeOut=True,
475  decayMode=0, cut='1.7 < M < 1.95')
476  path.add_module('MCMatcherParticles', listName='D0:generic_0')
477  path.add_module('VariablesToHistogram', particleList='D0:generic_0',
478  variables=fei.config.variables2binnings(['abs(dM)', 'mcErrors', 'mcParticleStatus', 'isSignal']),
479  variables_2d=fei.config.variables2binnings_2d([('abs(dM)', 'isSignal'),
480  ('abs(dM)', 'mcErrors'),
481  ('abs(dM)', 'mcParticleStatus')]),
482  fileName='Monitor_PreReconstruction_BeforeRanking_D0:generic ==> K-:generic pi+:generic.root')
483  path.add_module('BestCandidateSelection', particleList='D0:generic_0',
484  variable='abs(dM)', selectLowest=True, numBest=20, outputVariable='preCut_rank')
485  path.add_module('VariablesToHistogram', particleList='D0:generic_0',
486  variables=fei.config.variables2binnings(['abs(dM)', 'mcErrors', 'mcParticleStatus',
487  'isSignal', 'extraInfo(preCut_rank)']),
488  variables_2d=fei.config.variables2binnings_2d([('abs(dM)', 'isSignal'),
489  ('abs(dM)', 'mcErrors'),
490  ('abs(dM)', 'mcParticleStatus'),
491  ('extraInfo(preCut_rank)', 'isSignal'),
492  ('extraInfo(preCut_rank)', 'mcErrors'),
493  ('extraInfo(preCut_rank)', 'mcParticleStatus')]),
494  fileName='Monitor_PreReconstruction_AfterRanking_D0:generic ==> K-:generic pi+:generic.root')
495  path.add_module('ParticleVertexFitter', listName='D0:generic_0', confidenceLevel=-2.0,
496  vertexFitter='KFit', fitType='vertex')
497  path.add_module('VariablesToHistogram', particleList='D0:generic_0',
498  variables=fei.config.variables2binnings(['chiProb', 'mcErrors', 'mcParticleStatus',
499  'isSignal']),
500  variables_2d=fei.config.variables2binnings_2d([('chiProb', 'isSignal'),
501  ('chiProb', 'mcErrors'),
502  ('chiProb', 'mcParticleStatus')]),
503  fileName='Monitor_PreReconstruction_AfterVertex_D0:generic ==> K-:generic pi+:generic.root')
504 
505  path.add_module('ParticleCombiner', decayString='D0:generic_1 -> pi-:generic pi+:generic', writeOut=True,
506  decayMode=1, cut='1.7 < M < 1.95')
507  path.add_module('MCMatcherParticles', listName='D0:generic_1')
508  path.add_module('VariablesToHistogram', particleList='D0:generic_1',
509  variables=fei.config.variables2binnings(['abs(dM)', 'mcErrors', 'mcParticleStatus', 'isSignal']),
510  variables_2d=fei.config.variables2binnings_2d([('abs(dM)', 'isSignal'),
511  ('abs(dM)', 'mcErrors'),
512  ('abs(dM)', 'mcParticleStatus')]),
513  fileName='Monitor_PreReconstruction_BeforeRanking_D0:generic ==> pi-:generic pi+:generic.root')
514  path.add_module('BestCandidateSelection', particleList='D0:generic_1',
515  variable='abs(dM)', selectLowest=True, numBest=20, outputVariable='preCut_rank')
516  path.add_module('VariablesToHistogram', particleList='D0:generic_1',
517  variables=fei.config.variables2binnings(['abs(dM)', 'mcErrors', 'mcParticleStatus',
518  'isSignal', 'extraInfo(preCut_rank)']),
519  variables_2d=fei.config.variables2binnings_2d([('abs(dM)', 'isSignal'),
520  ('abs(dM)', 'mcErrors'),
521  ('abs(dM)', 'mcParticleStatus'),
522  ('extraInfo(preCut_rank)', 'isSignal'),
523  ('extraInfo(preCut_rank)', 'mcErrors'),
524  ('extraInfo(preCut_rank)', 'mcParticleStatus')]),
525  fileName='Monitor_PreReconstruction_AfterRanking_D0:generic ==> pi-:generic pi+:generic.root')
526  path.add_module('ParticleVertexFitter', listName='D0:generic_1', confidenceLevel=-2.0,
527  vertexFitter='KFit', fitType='vertex')
528  path.add_module('VariablesToHistogram', particleList='D0:generic_1',
529  variables=fei.config.variables2binnings(['chiProb', 'mcErrors', 'mcParticleStatus',
530  'isSignal']),
531  variables_2d=fei.config.variables2binnings_2d([('chiProb', 'isSignal'),
532  ('chiProb', 'mcErrors'),
533  ('chiProb', 'mcParticleStatus')]),
534  fileName='Monitor_PreReconstruction_AfterVertex_D0:generic ==> pi-:generic pi+:generic.root')
535 
536  print_path(path, x.reconstruct())
537  self.assertEqual(x.reconstruct(), path)
538 
539 
540 class TestPostReconstruction(unittest.TestCase):
541 
542  def test_get_missing_channels(self):
543  pion = Particle('pi+:unittest', fei.config.MVAConfiguration(variables=['p', 'dr'], target='isPrimarySignal'))
544  pion.addChannel(['pi+:FSP'])
545  D0 = Particle('D0:unittest', fei.config.MVAConfiguration(variables=['M', 'p'], target='isSignal'))
546  D0.addChannel(['K-:unittest', 'pi+:unittest'])
547  D0.addChannel(['pi-:unittest', 'pi+:unittest'])
548  config = fei.config.FeiConfiguration(monitor=False, prefix="UNITTEST")
549  x = fei.core.PostReconstruction([pion, D0], config)
550 
551  self.assertEqual(x.get_missing_channels(), ['pi+:unittest ==> pi+:FSP', 'D0:unittest ==> K-:unittest pi+:unittest',
552  'D0:unittest ==> pi-:unittest pi+:unittest'])
553  self.assertEqual(x.available(), False)
554 
555  content = """
556  <?xml version="1.0" encoding="utf-8"?>
557  <method>Trivial</method>
558  <weightfile>{channel}.xml</weightfile>
559  <treename>tree</treename>
560  <target_variable>isSignal</target_variable>
561  <weight_variable>__weight__</weight_variable>
562  <signal_class>1</signal_class>
563  <max_events>0</max_events>
564  <number_feature_variables>1</number_feature_variables>
565  <variable0>M</variable0>
566  <number_spectator_variables>0</number_spectator_variables>
567  <number_data_files>1</number_data_files>
568  <datafile0>train.root</datafile0>
569  <Trivial_version>1</Trivial_version>
570  <Trivial_output>0</Trivial_output>
571  <signal_fraction>0.066082567</signal_fraction>
572  """
573 
574  channel = 'D0:unittest ==> K-:unittest pi+:unittest'
575  with open(channel + ".xml", "w") as f:
576  f.write(content.format(channel=channel))
577  basf2_mva.upload(channel + ".xml", 'UNITTEST_' + channel)
578 
579  self.assertEqual(x.get_missing_channels(), ['pi+:unittest ==> pi+:FSP',
580  'D0:unittest ==> pi-:unittest pi+:unittest'])
581  self.assertEqual(x.available(), False)
582 
583  channel = 'D0:unittest ==> pi-:unittest pi+:unittest'
584  with open(channel + ".xml", "w") as f:
585  f.write(content.format(channel=channel))
586  basf2_mva.upload(channel + ".xml", 'UNITTEST_' + channel)
587 
588  self.assertEqual(x.get_missing_channels(), ['pi+:unittest ==> pi+:FSP'])
589  self.assertEqual(x.available(), False)
590 
591  channel = 'pi+:unittest ==> pi+:FSP'
592  with open(channel + ".xml", "w") as f:
593  f.write(content.format(channel=channel))
594  basf2_mva.upload(channel + ".xml", 'UNITTEST_' + channel)
595 
596  self.assertEqual(x.get_missing_channels(), [])
597  self.assertEqual(x.available(), True)
598 
599  def tearDown(self):
600  if os.path.isfile('pi+:unittest ==> pi+:FSP.xml'):
601  os.remove('pi+:unittest ==> pi+:FSP.xml')
602  if os.path.isfile('D0:unittest ==> pi-:unittest pi+:unittest.xml'):
603  os.remove('D0:unittest ==> pi-:unittest pi+:unittest.xml')
604  if os.path.isfile('D0:unittest ==> K-:unittest pi+:unittest.xml'):
605  os.remove('D0:unittest ==> K-:unittest pi+:unittest.xml')
606 
607  def test_without_monitoring(self):
608  particles = get_small_unittest_channels()
609  config = fei.config.FeiConfiguration(monitor=False, prefix='UNITTEST')
610  x = fei.core.PostReconstruction(particles, config)
611 
612  path = basf2.create_path()
613 
614  path.add_module('MVAExpert', identifier='UNITTEST_pi+:generic ==> pi+:FSP', extraInfoName='SignalProbability',
615  listNames=['pi+:generic_0'])
616  path.add_module('TagUniqueSignal', particleList='pi+:generic_0', target='isPrimarySignal',
617  extraInfoName='uniqueSignal')
618  path.add_module('ParticleListManipulator', outputListName='pi+:generic', inputListNames=['pi+:generic_0'],
619  writeOut=True)
620  path.add_module('ParticleSelector', decayString='pi+:generic', cut='0.01 < extraInfo(SignalProbability)')
621  path.add_module('BestCandidateSelection', particleList='pi+:generic', variable='extraInfo(SignalProbability)',
622  selectLowest=False, numBest=10, outputVariable='postCut_rank')
623 
624  path.add_module('MVAExpert', identifier='UNITTEST_K+:generic ==> K+:FSP', extraInfoName='SignalProbability',
625  listNames=['K+:generic_0'])
626  path.add_module('TagUniqueSignal', particleList='K+:generic_0', target='isPrimarySignal',
627  extraInfoName='uniqueSignal')
628  path.add_module('ParticleListManipulator', outputListName='K+:generic', inputListNames=['K+:generic_0'],
629  writeOut=True)
630  path.add_module('ParticleSelector', decayString='K+:generic', cut='0.01 < extraInfo(SignalProbability)')
631  path.add_module('BestCandidateSelection', particleList='K+:generic', variable='extraInfo(SignalProbability)',
632  selectLowest=False, numBest=10, outputVariable='postCut_rank')
633 
634  path.add_module('MVAExpert', identifier='UNITTEST_D0:generic ==> K-:generic pi+:generic',
635  extraInfoName='SignalProbability', listNames=['D0:generic_0'])
636  path.add_module('TagUniqueSignal', particleList='D0:generic_0', target='isSignal',
637  extraInfoName='uniqueSignal')
638 
639  path.add_module('MVAExpert', identifier='UNITTEST_D0:generic ==> pi-:generic pi+:generic',
640  extraInfoName='SignalProbability', listNames=['D0:generic_1'])
641  path.add_module('TagUniqueSignal', particleList='D0:generic_1', target='isSignal',
642  extraInfoName='uniqueSignal')
643 
644  path.add_module('ParticleListManipulator', outputListName='D0:generic',
645  inputListNames=['D0:generic_0', 'D0:generic_1'],
646  writeOut=True)
647  path.add_module('ParticleSelector', decayString='D0:generic', cut='0.001 < extraInfo(SignalProbability)')
648  path.add_module('BestCandidateSelection', particleList='D0:generic', variable='extraInfo(SignalProbability)',
649  selectLowest=False, numBest=10, outputVariable='postCut_rank')
650 
651  print_path(path, x.reconstruct())
652  self.assertEqual(x.reconstruct(), path)
653 
654  def test_without_monitoring_training_mode(self):
655  particles = get_small_unittest_channels()
656  config = fei.config.FeiConfiguration(monitor=False, prefix='UNITTEST', training=True)
657  x = fei.core.PostReconstruction(particles, config)
658 
659  path = basf2.create_path()
660 
661  path.add_module('MVAExpert', identifier='pi+:generic ==> pi+:FSP.xml', extraInfoName='SignalProbability',
662  listNames=['pi+:generic_0'])
663  path.add_module('TagUniqueSignal', particleList='pi+:generic_0', target='isPrimarySignal',
664  extraInfoName='uniqueSignal')
665  path.add_module('ParticleListManipulator', outputListName='pi+:generic', inputListNames=['pi+:generic_0'],
666  writeOut=True)
667  path.add_module('ParticleSelector', decayString='pi+:generic', cut='0.01 < extraInfo(SignalProbability)')
668  path.add_module('BestCandidateSelection', particleList='pi+:generic', variable='extraInfo(SignalProbability)',
669  selectLowest=False, numBest=10, outputVariable='postCut_rank')
670 
671  path.add_module('MVAExpert', identifier='K+:generic ==> K+:FSP.xml', extraInfoName='SignalProbability',
672  listNames=['K+:generic_0'])
673  path.add_module('TagUniqueSignal', particleList='K+:generic_0', target='isPrimarySignal',
674  extraInfoName='uniqueSignal')
675  path.add_module('ParticleListManipulator', outputListName='K+:generic', inputListNames=['K+:generic_0'],
676  writeOut=True)
677  path.add_module('ParticleSelector', decayString='K+:generic', cut='0.01 < extraInfo(SignalProbability)')
678  path.add_module('BestCandidateSelection', particleList='K+:generic', variable='extraInfo(SignalProbability)',
679  selectLowest=False, numBest=10, outputVariable='postCut_rank')
680 
681  path.add_module('MVAExpert', identifier='D0:generic ==> K-:generic pi+:generic.xml',
682  extraInfoName='SignalProbability', listNames=['D0:generic_0'])
683  path.add_module('TagUniqueSignal', particleList='D0:generic_0', target='isSignal',
684  extraInfoName='uniqueSignal')
685 
686  path.add_module('MVAExpert', identifier='D0:generic ==> pi-:generic pi+:generic.xml',
687  extraInfoName='SignalProbability', listNames=['D0:generic_1'])
688  path.add_module('TagUniqueSignal', particleList='D0:generic_1', target='isSignal',
689  extraInfoName='uniqueSignal')
690 
691  path.add_module('ParticleListManipulator', outputListName='D0:generic',
692  inputListNames=['D0:generic_0', 'D0:generic_1'],
693  writeOut=True)
694  path.add_module('ParticleSelector', decayString='D0:generic', cut='0.001 < extraInfo(SignalProbability)')
695  path.add_module('BestCandidateSelection', particleList='D0:generic', variable='extraInfo(SignalProbability)',
696  selectLowest=False, numBest=10, outputVariable='postCut_rank')
697 
698  print_path(path, x.reconstruct())
699  self.assertEqual(x.reconstruct(), path)
700 
701  def test_with_monitoring(self):
702  particles = get_small_unittest_channels()
703  config = fei.config.FeiConfiguration(monitor=True, prefix='UNITTEST')
704  x = fei.core.PostReconstruction(particles, config)
705 
706  path = basf2.create_path()
707 
708  path.add_module('MVAExpert', identifier='UNITTEST_pi+:generic ==> pi+:FSP', extraInfoName='SignalProbability',
709  listNames=['pi+:generic_0'])
710  path.add_module('TagUniqueSignal', particleList='pi+:generic_0', target='isPrimarySignal',
711  extraInfoName='uniqueSignal')
712 
713  path.add_module('VariablesToHistogram', particleList='pi+:generic_0',
714  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
715  'extraInfo(SignalProbability)',
716  'isPrimarySignal', 'extraInfo(decayModeID)']),
717  variables_2d=fei.config.variables2binnings_2d([('extraInfo(SignalProbability)', 'isPrimarySignal'),
718  ('extraInfo(SignalProbability)', 'mcErrors'),
719  ('extraInfo(SignalProbability)', 'mcParticleStatus'),
720  ('extraInfo(decayModeID)', 'isPrimarySignal'),
721  ('extraInfo(decayModeID)', 'mcErrors'),
722  ('extraInfo(decayModeID)', 'extraInfo(uniqueSignal)'),
723  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
724  fileName='Monitor_PostReconstruction_AfterMVA_pi+:generic ==> pi+:FSP.root')
725  path.add_module('ParticleListManipulator', outputListName='pi+:generic', inputListNames=['pi+:generic_0'],
726  writeOut=True)
727  path.add_module('VariablesToHistogram', particleList='pi+:generic',
728  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
729  'extraInfo(SignalProbability)',
730  'isPrimarySignal', 'extraInfo(decayModeID)']),
731  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isPrimarySignal'),
732  ('extraInfo(decayModeID)', 'mcErrors'),
733  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
734  fileName='Monitor_PostReconstruction_BeforePostCut_pi+:generic.root')
735  path.add_module('ParticleSelector', decayString='pi+:generic', cut='0.01 < extraInfo(SignalProbability)')
736  path.add_module('VariablesToHistogram', particleList='pi+:generic',
737  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
738  'extraInfo(SignalProbability)',
739  'isPrimarySignal', 'extraInfo(decayModeID)']),
740  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isPrimarySignal'),
741  ('extraInfo(decayModeID)', 'mcErrors'),
742  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
743  fileName='Monitor_PostReconstruction_BeforeRanking_pi+:generic.root')
744  path.add_module('BestCandidateSelection', particleList='pi+:generic', variable='extraInfo(SignalProbability)',
745  selectLowest=False, numBest=10, outputVariable='postCut_rank')
746  path.add_module('VariablesToHistogram', particleList='pi+:generic',
747  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
748  'extraInfo(SignalProbability)', 'isPrimarySignal',
749  'extraInfo(decayModeID)', 'extraInfo(postCut_rank)']),
750  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isPrimarySignal'),
751  ('extraInfo(decayModeID)', 'mcErrors'),
752  ('extraInfo(decayModeID)', 'mcParticleStatus'),
753  ('extraInfo(decayModeID)', 'extraInfo(postCut_rank)'),
754  ('isPrimarySignal', 'extraInfo(postCut_rank)'),
755  ('mcErrors', 'extraInfo(postCut_rank)'),
756  ('mcParticleStatus', 'extraInfo(postCut_rank)')]),
757  fileName='Monitor_PostReconstruction_AfterRanking_pi+:generic.root')
758  path.add_module('VariablesToNtuple', fileName='Monitor_Final_pi+:generic.root', treeName='variables',
759  variables=['extraInfo(SignalProbability)', 'mcErrors', 'mcParticleStatus', 'isPrimarySignal',
760  'extraInfo(uniqueSignal)', 'extraInfo(decayModeID)'],
761  particleList='pi+:generic')
762 
763  path.add_module('MVAExpert', identifier='UNITTEST_K+:generic ==> K+:FSP', extraInfoName='SignalProbability',
764  listNames=['K+:generic_0'])
765  path.add_module('TagUniqueSignal', particleList='K+:generic_0', target='isPrimarySignal',
766  extraInfoName='uniqueSignal')
767  path.add_module('VariablesToHistogram', particleList='K+:generic_0',
768  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
769  'extraInfo(SignalProbability)',
770  'isPrimarySignal', 'extraInfo(decayModeID)']),
771  variables_2d=fei.config.variables2binnings_2d([('extraInfo(SignalProbability)', 'isPrimarySignal'),
772  ('extraInfo(SignalProbability)', 'mcErrors'),
773  ('extraInfo(SignalProbability)', 'mcParticleStatus'),
774  ('extraInfo(decayModeID)', 'isPrimarySignal'),
775  ('extraInfo(decayModeID)', 'mcErrors'),
776  ('extraInfo(decayModeID)', 'extraInfo(uniqueSignal)'),
777  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
778  fileName='Monitor_PostReconstruction_AfterMVA_K+:generic ==> K+:FSP.root')
779  path.add_module('ParticleListManipulator', outputListName='K+:generic', inputListNames=['K+:generic_0'],
780  writeOut=True)
781  path.add_module('VariablesToHistogram', particleList='K+:generic',
782  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
783  'extraInfo(SignalProbability)',
784  'isPrimarySignal', 'extraInfo(decayModeID)']),
785  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isPrimarySignal'),
786  ('extraInfo(decayModeID)', 'mcErrors'),
787  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
788  fileName='Monitor_PostReconstruction_BeforePostCut_K+:generic.root')
789  path.add_module('ParticleSelector', decayString='K+:generic', cut='0.01 < extraInfo(SignalProbability)')
790  path.add_module('VariablesToHistogram', particleList='K+:generic',
791  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
792  'extraInfo(SignalProbability)',
793  'isPrimarySignal', 'extraInfo(decayModeID)']),
794  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isPrimarySignal'),
795  ('extraInfo(decayModeID)', 'mcErrors'),
796  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
797  fileName='Monitor_PostReconstruction_BeforeRanking_K+:generic.root')
798  path.add_module('BestCandidateSelection', particleList='K+:generic', variable='extraInfo(SignalProbability)',
799  selectLowest=False, numBest=10, outputVariable='postCut_rank')
800  path.add_module('VariablesToHistogram', particleList='K+:generic',
801  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
802  'extraInfo(SignalProbability)', 'isPrimarySignal',
803  'extraInfo(decayModeID)', 'extraInfo(postCut_rank)']),
804  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isPrimarySignal'),
805  ('extraInfo(decayModeID)', 'mcErrors'),
806  ('extraInfo(decayModeID)', 'mcParticleStatus'),
807  ('extraInfo(decayModeID)', 'extraInfo(postCut_rank)'),
808  ('isPrimarySignal', 'extraInfo(postCut_rank)'),
809  ('mcErrors', 'extraInfo(postCut_rank)'),
810  ('mcParticleStatus', 'extraInfo(postCut_rank)')]),
811  fileName='Monitor_PostReconstruction_AfterRanking_K+:generic.root')
812  path.add_module('VariablesToNtuple', fileName='Monitor_Final_K+:generic.root', treeName='variables',
813  variables=['extraInfo(SignalProbability)', 'mcErrors', 'mcParticleStatus', 'isPrimarySignal',
814  'extraInfo(uniqueSignal)', 'extraInfo(decayModeID)'],
815  particleList='K+:generic')
816 
817  path.add_module('MVAExpert', identifier='UNITTEST_D0:generic ==> K-:generic pi+:generic',
818  extraInfoName='SignalProbability', listNames=['D0:generic_0'])
819  path.add_module('TagUniqueSignal', particleList='D0:generic_0', target='isSignal',
820  extraInfoName='uniqueSignal')
821  path.add_module('VariablesToHistogram', particleList='D0:generic_0',
822  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
823  'extraInfo(SignalProbability)',
824  'isSignal', 'extraInfo(decayModeID)']),
825  variables_2d=fei.config.variables2binnings_2d([('extraInfo(SignalProbability)', 'isSignal'),
826  ('extraInfo(SignalProbability)', 'mcErrors'),
827  ('extraInfo(SignalProbability)', 'mcParticleStatus'),
828  ('extraInfo(decayModeID)', 'isSignal'),
829  ('extraInfo(decayModeID)', 'mcErrors'),
830  ('extraInfo(decayModeID)', 'extraInfo(uniqueSignal)'),
831  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
832  fileName='Monitor_PostReconstruction_AfterMVA_D0:generic ==> K-:generic pi+:generic.root')
833 
834  path.add_module('MVAExpert', identifier='UNITTEST_D0:generic ==> pi-:generic pi+:generic',
835  extraInfoName='SignalProbability', listNames=['D0:generic_1'])
836  path.add_module('TagUniqueSignal', particleList='D0:generic_1', target='isSignal',
837  extraInfoName='uniqueSignal')
838  path.add_module('VariablesToHistogram', particleList='D0:generic_1',
839  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
840  'extraInfo(SignalProbability)',
841  'isSignal', 'extraInfo(decayModeID)']),
842  variables_2d=fei.config.variables2binnings_2d([('extraInfo(SignalProbability)', 'isSignal'),
843  ('extraInfo(SignalProbability)', 'mcErrors'),
844  ('extraInfo(SignalProbability)', 'mcParticleStatus'),
845  ('extraInfo(decayModeID)', 'isSignal'),
846  ('extraInfo(decayModeID)', 'mcErrors'),
847  ('extraInfo(decayModeID)', 'extraInfo(uniqueSignal)'),
848  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
849  fileName='Monitor_PostReconstruction_AfterMVA_D0:generic ==> pi-:generic pi+:generic.root')
850 
851  path.add_module('ParticleListManipulator', outputListName='D0:generic',
852  inputListNames=['D0:generic_0', 'D0:generic_1'],
853  writeOut=True)
854  path.add_module('VariablesToHistogram', particleList='D0:generic',
855  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
856  'extraInfo(SignalProbability)',
857  'isSignal', 'extraInfo(decayModeID)']),
858  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isSignal'),
859  ('extraInfo(decayModeID)', 'mcErrors'),
860  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
861  fileName='Monitor_PostReconstruction_BeforePostCut_D0:generic.root')
862  path.add_module('ParticleSelector', decayString='D0:generic', cut='0.001 < extraInfo(SignalProbability)')
863  path.add_module('VariablesToHistogram', particleList='D0:generic',
864  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
865  'extraInfo(SignalProbability)',
866  'isSignal', 'extraInfo(decayModeID)']),
867  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isSignal'),
868  ('extraInfo(decayModeID)', 'mcErrors'),
869  ('extraInfo(decayModeID)', 'mcParticleStatus')]),
870  fileName='Monitor_PostReconstruction_BeforeRanking_D0:generic.root')
871  path.add_module('BestCandidateSelection', particleList='D0:generic', variable='extraInfo(SignalProbability)',
872  selectLowest=False, numBest=10, outputVariable='postCut_rank')
873  path.add_module('VariablesToHistogram', particleList='D0:generic',
874  variables=fei.config.variables2binnings(['mcErrors', 'mcParticleStatus', 'extraInfo(uniqueSignal)',
875  'extraInfo(SignalProbability)', 'isSignal',
876  'extraInfo(decayModeID)', 'extraInfo(postCut_rank)']),
877  variables_2d=fei.config.variables2binnings_2d([('extraInfo(decayModeID)', 'isSignal'),
878  ('extraInfo(decayModeID)', 'mcErrors'),
879  ('extraInfo(decayModeID)', 'mcParticleStatus'),
880  ('extraInfo(decayModeID)', 'extraInfo(postCut_rank)'),
881  ('isSignal', 'extraInfo(postCut_rank)'),
882  ('mcErrors', 'extraInfo(postCut_rank)'),
883  ('mcParticleStatus', 'extraInfo(postCut_rank)')]),
884  fileName='Monitor_PostReconstruction_AfterRanking_D0:generic.root')
885  path.add_module('VariablesToNtuple', fileName='Monitor_Final_D0:generic.root', treeName='variables',
886  variables=['extraInfo(SignalProbability)', 'mcErrors', 'mcParticleStatus', 'isSignal',
887  'extraInfo(uniqueSignal)', 'extraInfo(decayModeID)'],
888  particleList='D0:generic')
889 
890  print_path(path, x.reconstruct())
891  self.assertEqual(x.reconstruct(), path)
892 
893 
894 class TestTeacher(unittest.TestCase):
895  def setUp(self):
896  fei.core.Teacher.MaximumNumberOfMVASamples = int(1e7)
897  fei.core.Teacher.MinimumNumberOfMVASamples = int(10)
898 
899  f = ROOT.TFile('pi+:generic ==> pi+:FSP.root', 'RECREATE')
900  f.cd()
901  tree = ROOT.TTree('variables', 'variables')
902  isSignal = np.zeros(1, dtype=float)
903  p = np.zeros(1, dtype=float)
904  pt = np.zeros(1, dtype=float)
905  tree.Branch('isPrimarySignal', isSignal, 'isPrimarySignal/D')
906  tree.Branch('p', p, 'p/D')
907  tree.Branch('dr', pt, 'dr/D')
908  for i in range(1000):
909  isSignal[0] = i % 2
910  p[0] = i
911  pt[0] = i * 2
912  tree.Fill()
913  f.Write("variables")
914 
915  # Broken file
916  f = ROOT.TFile('K+:generic ==> K+:FSP.root', 'RECREATE')
917 
918  f = ROOT.TFile('D0:generic ==> K-:generic pi+:generic.root', 'RECREATE')
919  f.cd()
920  tree = ROOT.TTree('variables', 'variables')
921  isSignal = np.zeros(1, dtype=float)
922  p = np.zeros(1, dtype=float)
923  pt = np.zeros(1, dtype=float)
924  tree.Branch('isSignal', isSignal, 'isSignal/D')
925  tree.Branch('M', p, 'M/D')
926  tree.Branch('p', pt, 'p/D')
927  # Too few signal events here!
928  for i in range(10):
929  isSignal[0] = i % 2
930  p[0] = i
931  pt[0] = i * 2
932  tree.Fill()
933  f.Write("variables")
934 
935  f = ROOT.TFile('D0:generic ==> pi-:generic pi+:generic.root', 'RECREATE')
936  f.cd()
937  tree = ROOT.TTree('variables', 'variables')
938  isSignal = np.zeros(1, dtype=float)
939  p = np.zeros(1, dtype=float)
940  pt = np.zeros(1, dtype=float)
941  tree.Branch('isSignal', isSignal, 'isSignal/D')
942  tree.Branch('M', p, 'M/D')
943  tree.Branch('p', pt, 'p/D')
944  for i in range(1000):
945  isSignal[0] = i % 2
946  p[0] = i
947  pt[0] = i * 2
948  tree.Fill()
949  f.Write("variables")
950 
951  def tearDown(self):
952  if os.path.isfile('UNITTEST_TEACHER.xml'):
953  os.remove('UNITTEST_TEACHER.xml')
954  if os.path.isfile('pi+:generic ==> pi+:FSP.root'):
955  os.remove('pi+:generic ==> pi+:FSP.root')
956  if os.path.isfile('UNITTEST_pi+:generic ==> pi+:FSP.xml'):
957  os.remove('UNITTEST_pi+:generic ==> pi+:FSP.xml')
958  if os.path.isfile('K+:generic ==> K+:FSP.root'):
959  os.remove('K+:generic ==> K+:FSP.root')
960  if os.path.isfile('UNITTEST_K+:generic ==> K+:FSP.xml'):
961  os.remove('UNITTEST_K+:generic ==> K+:FSP.xml')
962  if os.path.isfile('D0:generic ==> K-:generic pi+:generic.root'):
963  os.remove('D0:generic ==> K-:generic pi+:generic.root')
964  if os.path.isfile('UNITTEST_D0:generic ==> K-:generic pi+:generic.xml'):
965  os.remove('UNITTEST_D0:generic ==> K-:generic pi+:generic.xml')
966  if os.path.isfile('D0:generic ==> pi-:generic pi+:generic.root'):
967  os.remove('D0:generic ==> pi-:generic pi+:generic.root')
968  if os.path.isfile('UNITTEST_D0:generic ==> pi-:generic pi+:generic.xml'):
969  os.remove('UNITTEST_D0:generic ==> pi-:generic pi+:generic.xml')
970 
971  def test_create_fake_weightfile(self):
972  self.assertEqual(os.path.isfile('UNITTEST_pi+:generic ==> pi+:FSP.xml'), False)
973  self.assertEqual(basf2_mva.available('UNITTEST_pi+:generic ==> pi+:FSP.xml'), False)
974  fei.core.Teacher.create_fake_weightfile('UNITTEST_pi+:generic ==> pi+:FSP')
975  self.assertEqual(os.path.isfile('UNITTEST_pi+:generic ==> pi+:FSP.xml'), True)
976  self.assertEqual(basf2_mva.available('UNITTEST_pi+:generic ==> pi+:FSP.xml'), True)
977 
978  def test_upload(self):
979  particles = get_small_unittest_channels()
980  config = fei.config.FeiConfiguration(monitor=False, prefix='UNITTEST', externTeacher='basf2_mva_teacher')
981  x = fei.core.Teacher(particles, config)
982  fei.core.Teacher.create_fake_weightfile('TEACHER')
983  self.assertEqual(basf2_mva.available('UNITTEST_TEACHER'), False)
984  r = x.upload('TEACHER')
985  self.assertEqual(basf2_mva.available('UNITTEST_TEACHER'), True)
986  self.assertEqual(r, ('TEACHER.xml', 'UNITTEST_TEACHER'))
987 
988  def test_without_monitoring(self):
989  particles = get_small_unittest_channels()
990  config = fei.config.FeiConfiguration(monitor=False, prefix='UNITTEST', externTeacher='basf2_mva_teacher')
991  x = fei.core.Teacher(particles, config)
992 
993  self.assertEqual(basf2_mva.available('UNITTEST_pi+:generic ==> pi+:FSP'), False)
994  self.assertEqual(basf2_mva.available('UNITTEST_K+:generic ==> K+:FSP'), False)
995  self.assertEqual(basf2_mva.available('UNITTEST_D0:generic ==> K-:generic pi+:generic'), False)
996  self.assertEqual(basf2_mva.available('UNITTEST_D0:generic ==> pi-:generic pi+:generic'), False)
997 
998  x.do_all_trainings()
999 
1000  self.assertEqual(basf2_mva.available('UNITTEST_pi+:generic ==> pi+:FSP'), True)
1001  self.assertEqual(basf2_mva.available('UNITTEST_K+:generic ==> K+:FSP'), True)
1002  self.assertEqual(basf2_mva.available('UNITTEST_D0:generic ==> K-:generic pi+:generic'), True)
1003  self.assertEqual(basf2_mva.available('UNITTEST_D0:generic ==> pi-:generic pi+:generic'), True)
1004 
1005 
1006 """
1007 class TestConvertLegacyTraining(unittest.TestCase):
1008  pass
1009 """
1010 
1011 
1012 class TestGetPath(unittest.TestCase):
1013 
1014  def setUp(self):
1015  particles = fei.get_unittest_channels()
1016 
1017  f = ROOT.TFile('mcParticlesCount.root', 'RECREATE')
1018  f.cd()
1019 
1020  for pdgnumber in set([abs(pdg.from_name(particle.name)) for particle in particles]):
1021  hist = ROOT.TH1F("NumberOfMCParticlesInEvent__bo{}__bc".format(pdgnumber),
1022  "NumberOfMCParticlesInEvent__bo{}__bc".format(pdgnumber), 11, -0.5, 10.5)
1023  for i in range(10):
1024  hist.Fill(5)
1025  f.Write("NumberOfMCParticlesInEvent__bo{}__bc".format(pdgnumber))
1026 
1027  def tearDown(self):
1028  if os.path.isfile('mcParticlesCount.root'):
1029  os.remove('mcParticlesCount.root')
1030  if os.path.isfile('Summary.pickle'):
1031  os.remove('Summary.pickle')
1032 
1033  def test_get_path_default_cache(self):
1034  particles = fei.get_unittest_channels()
1035  config = fei.config.FeiConfiguration(training=True)
1036  x = fei.core.Teacher(particles, config)
1037 
1038  # Should try to create mcParticlesCount
1039  # -> Returns at stage 0
1040  feistate = fei.core.get_path(particles, config)
1041  self.assertEqual(feistate.stage, 0)
1042 
1043  # Should try to create training data for FSPs
1044  # -> Returns at stage 1
1045  config = fei.config.FeiConfiguration(training=True)
1046  feistate = fei.core.get_path(particles, config)
1047  self.assertEqual(feistate.stage, 1)
1048 
1049  # No weightfiles were created, hence the algorithm
1050  # cannot go forward and tries to create the training data again
1051  config = fei.config.FeiConfiguration(training=True)
1052  feistate = fei.core.get_path(particles, config)
1053  self.assertEqual(feistate.stage, 1)
1054 
1055  # We create the FSP weightfiles by hand
1056  fei.core.Teacher.create_fake_weightfile('pi+:generic ==> pi+:FSP')
1057  fei.core.Teacher.create_fake_weightfile('K+:generic ==> K+:FSP')
1058  fei.core.Teacher.create_fake_weightfile('mu+:generic ==> mu+:FSP')
1059  fei.core.Teacher.create_fake_weightfile('gamma:generic ==> gamma:FSP')
1060  fei.core.Teacher.create_fake_weightfile('gamma:generic ==> gamma:V0')
1061 
1062  # Should try to create training data for pi0
1063  # -> Returns at stage 2
1064  config = fei.config.FeiConfiguration(training=True)
1065  feistate = fei.core.get_path(particles, config)
1066  self.assertEqual(feistate.stage, 2)
1067 
1068  # No weightfiles were created, hence the algorithm
1069  # cannot go forward and tries to create the training data again
1070  config = fei.config.FeiConfiguration(training=True)
1071  feistate = fei.core.get_path(particles, config)
1072  self.assertEqual(feistate.stage, 2)
1073 
1074  # We create the pi0 weightfile by hand
1075  fei.core.Teacher.create_fake_weightfile('pi0:generic ==> gamma:generic gamma:generic')
1076 
1077  # Should try to create training data for D0
1078  # -> Returns stage 4 (stage 3 is skipped because it only contains K_S0)
1079  config = fei.config.FeiConfiguration(training=True)
1080  feistate = fei.core.get_path(particles, config)
1081  self.assertEqual(feistate.stage, 4)
1082 
1083  # We create the D0 weightfiles by hand
1084  fei.core.Teacher.create_fake_weightfile('D0:generic ==> K-:generic pi+:generic')
1085  fei.core.Teacher.create_fake_weightfile('D0:generic ==> K-:generic pi+:generic pi0:generic')
1086  fei.core.Teacher.create_fake_weightfile('D0:generic ==> pi-:generic pi+:generic')
1087  fei.core.Teacher.create_fake_weightfile('D0:semileptonic ==> K-:generic mu+:generic')
1088  fei.core.Teacher.create_fake_weightfile('D0:semileptonic ==> K-:generic pi0:generic mu+:generic')
1089 
1090  # Unittest channels do not contain anymore stages,
1091  # -> Returns last stage + 1
1092  config = fei.config.FeiConfiguration(training=True)
1093  feistate = fei.core.get_path(particles, config)
1094  self.assertEqual(feistate.stage, 7)
1095 
1096  # If we start at 0, we should be get the whole path
1097  # -> Returns last stage + 1
1098  config = fei.config.FeiConfiguration(cache=0, training=True)
1099  feistate = fei.core.get_path(particles, config)
1100  self.assertEqual(feistate.stage, 7)
1101 
1102  # If training is False we should get the whole path without
1103  # checking if weightfiles exist.
1104  os.remove('pi+:generic ==> pi+:FSP.xml')
1105  os.remove('K+:generic ==> K+:FSP.xml')
1106  os.remove('mu+:generic ==> mu+:FSP.xml')
1107  os.remove('gamma:generic ==> gamma:FSP.xml')
1108  os.remove('gamma:generic ==> gamma:V0.xml')
1109  os.remove('pi0:generic ==> gamma:generic gamma:generic.xml')
1110  os.remove('D0:generic ==> K-:generic pi+:generic.xml')
1111  os.remove('D0:generic ==> K-:generic pi+:generic pi0:generic.xml')
1112  os.remove('D0:generic ==> pi-:generic pi+:generic.xml')
1113  os.remove('D0:semileptonic ==> K-:generic mu+:generic.xml')
1114  os.remove('D0:semileptonic ==> K-:generic pi0:generic mu+:generic.xml')
1115 
1116  config = fei.config.FeiConfiguration(cache=0, training=False)
1117  feistate = fei.core.get_path(particles, config)
1118  self.assertEqual(feistate.stage, 7)
1119 
1120  def test_get_path(self):
1121  particles = fei.get_unittest_channels()
1122  config = fei.config.FeiConfiguration(cache=-1, training=True)
1123  x = fei.core.Teacher(particles, config)
1124 
1125  # Should try to create mcParticlesCount
1126  # -> Returns at stage 0
1127  feistate = fei.core.get_path(particles, config)
1128  self.assertEqual(feistate.stage, 0)
1129 
1130  # Should try to create training data for FSPs
1131  # -> Returns at stage 1
1132  config = fei.config.FeiConfiguration(cache=0, training=True)
1133  feistate = fei.core.get_path(particles, config)
1134  self.assertEqual(feistate.stage, 1)
1135 
1136  # No weightfiles were created, hence the algorithm
1137  # cannot go forward and tries to create the training data again
1138  config = fei.config.FeiConfiguration(cache=1, training=True)
1139  feistate = fei.core.get_path(particles, config)
1140  self.assertEqual(feistate.stage, 1)
1141 
1142  # We create the FSP weightfiles by hand
1143  fei.core.Teacher.create_fake_weightfile('pi+:generic ==> pi+:FSP')
1144  fei.core.Teacher.create_fake_weightfile('K+:generic ==> K+:FSP')
1145  fei.core.Teacher.create_fake_weightfile('mu+:generic ==> mu+:FSP')
1146  fei.core.Teacher.create_fake_weightfile('gamma:generic ==> gamma:FSP')
1147  fei.core.Teacher.create_fake_weightfile('gamma:generic ==> gamma:V0')
1148 
1149  # Should try to create training data for pi0
1150  # -> Returns at stage 2
1151  config = fei.config.FeiConfiguration(cache=1, training=True)
1152  feistate = fei.core.get_path(particles, config)
1153  self.assertEqual(feistate.stage, 2)
1154 
1155  # No weightfiles were created, hence the algorithm
1156  # cannot go forward and tries to create the training data again
1157  config = fei.config.FeiConfiguration(cache=2, training=True)
1158  feistate = fei.core.get_path(particles, config)
1159  self.assertEqual(feistate.stage, 2)
1160 
1161  # No weightfiles were created, hence the algorithm
1162  # cannot go forward and tries to create the training data again
1163  # This applies as well if the stage is even bigger
1164  config = fei.config.FeiConfiguration(cache=4, training=True)
1165  feistate = fei.core.get_path(particles, config)
1166  self.assertEqual(feistate.stage, 2)
1167 
1168  # We create the pi0 weightfile by hand
1169  fei.core.Teacher.create_fake_weightfile('pi0:generic ==> gamma:generic gamma:generic')
1170 
1171  # Should try to create training data for D0
1172  # -> Returns stage 4 (stage 3 is skipped because it only contains K_S0)
1173  config = fei.config.FeiConfiguration(cache=2, training=True)
1174  feistate = fei.core.get_path(particles, config)
1175  self.assertEqual(feistate.stage, 4)
1176 
1177  # We create the D0 weightfiles by hand
1178  fei.core.Teacher.create_fake_weightfile('D0:generic ==> K-:generic pi+:generic')
1179  fei.core.Teacher.create_fake_weightfile('D0:generic ==> K-:generic pi+:generic pi0:generic')
1180  fei.core.Teacher.create_fake_weightfile('D0:generic ==> pi-:generic pi+:generic')
1181  fei.core.Teacher.create_fake_weightfile('D0:semileptonic ==> K-:generic mu+:generic')
1182  fei.core.Teacher.create_fake_weightfile('D0:semileptonic ==> K-:generic pi0:generic mu+:generic')
1183 
1184  # Unittest channels do not contain anymore stages,
1185  # -> Returns last stage + 1
1186  config = fei.config.FeiConfiguration(cache=4, training=True)
1187  feistate = fei.core.get_path(particles, config)
1188  self.assertEqual(feistate.stage, 7)
1189 
1190  # If we start at 0, we should be get the whole path
1191  # -> Returns last stage + 1
1192  config = fei.config.FeiConfiguration(cache=0, training=True)
1193  feistate = fei.core.get_path(particles, config)
1194  self.assertEqual(feistate.stage, 7)
1195 
1196  # If training is False we should get the whole path without
1197  # checking if weightfiles exist.
1198  os.remove('pi+:generic ==> pi+:FSP.xml')
1199  os.remove('K+:generic ==> K+:FSP.xml')
1200  os.remove('mu+:generic ==> mu+:FSP.xml')
1201  os.remove('gamma:generic ==> gamma:FSP.xml')
1202  os.remove('gamma:generic ==> gamma:V0.xml')
1203  os.remove('pi0:generic ==> gamma:generic gamma:generic.xml')
1204  os.remove('D0:generic ==> K-:generic pi+:generic.xml')
1205  os.remove('D0:generic ==> K-:generic pi+:generic pi0:generic.xml')
1206  os.remove('D0:generic ==> pi-:generic pi+:generic.xml')
1207  os.remove('D0:semileptonic ==> K-:generic mu+:generic.xml')
1208  os.remove('D0:semileptonic ==> K-:generic pi0:generic mu+:generic.xml')
1209 
1210  config = fei.config.FeiConfiguration(cache=0, training=False)
1211  feistate = fei.core.get_path(particles, config)
1212  self.assertEqual(feistate.stage, 7)
1213 
1214 
1215 if __name__ == '__main__':
1216  # We have to call basf2_mva once, so that ROOT can load the dictionaries
1217  # otherwise it will try to load them later after we changed the directory and it will fail to do so
1218  basf2_mva.loadRootDictionary()
1219  tempdir = tempfile.mkdtemp()
1220  os.chdir(tempdir)
1221  basf2.conditions.testing_payloads = ['localdb/database.txt']
1222  # main() never returns, so install exit handler to do our cleanup
1223  atexit.register(shutil.rmtree, tempdir)
1224  unittest.main()
1225 
1226 # @endcond
pdg.from_name
def from_name(name)
Definition: pdg.py:50
fei.config
Definition: config.py:1
b2bii.unsetB2BII
def unsetB2BII()
Definition: b2bii.py:17
b2bii.setB2BII
def setB2BII()
Definition: b2bii.py:13