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()