23 from ROOT
import Belle2
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()))
39 Print the parts of the pathes which are different
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()):
47 if n.values != m.values:
48 print(n.values, m.values)
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',
59 fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.01))
60 pion.addChannel([
'pi+:FSP'])
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',
69 fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.01))
70 kaon.addChannel([
'K+:FSP'])
73 fei.config.MVAConfiguration(variables=[
'M',
'p'],
75 fei.config.PreCutConfiguration(userCut=
'1.7 < M < 1.95',
76 bestCandidateMode=
'lowest',
77 bestCandidateVariable=
'abs(dM)',
79 fei.config.PostCutConfiguration(bestCandidateCut=10, value=0.001))
80 D0.addChannel([
'K-',
'pi+'])
81 D0.addChannel([
'pi-',
'pi+'])
83 particles = [pion, kaon, D0]
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)
108 class TestTrainingDataInformation(unittest.TestCase):
111 if os.path.isfile(
'mcParticlesCount.root'):
112 os.remove(
'mcParticlesCount.root')
114 def test_reconstruct(self):
115 particles = fei.get_unittest_channels()
116 x = fei.core.TrainingDataInformation(particles)
118 path = basf2.create_path()
119 path.add_module(
'VariablesToHistogram', fileName=
'mcParticlesCount.root',
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)]
128 print_path(path, x.reconstruct())
129 self.assertEqual(x.reconstruct(), path)
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)
138 def test_get_mc_counts(self):
139 f = ROOT.TFile(
'mcParticlesCount.root',
'RECREATE')
141 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo211__bc",
"NumberOfMCParticlesInEvent__bo211__bc", 11, -0.5, 10.5)
148 f.Write(
"NumberOfMCParticlesInEvent__bo211__bc")
150 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo321__bc",
"NumberOfMCParticlesInEvent__bo321__bc", 11, -0.5, 10.5)
157 f.Write(
"NumberOfMCParticlesInEvent__bo321__bc")
159 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo13__bc",
"NumberOfMCParticlesInEvent__bo13__bc", 11, -0.5, 10.5)
162 f.Write(
"NumberOfMCParticlesInEvent__bo13__bc")
164 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo22__bc",
"NumberOfMCParticlesInEvent__bo222__bc", 11, -0.5, 10.5)
167 f.Write(
"NumberOfMCParticlesInEvent__bo22__bc")
169 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo111__bc",
"NumberOfMCParticlesInEvent__bo111__bc", 11, -0.5, 10.5)
176 f.Write(
"NumberOfMCParticlesInEvent__bo111__bc")
178 hist = ROOT.TH1F(
"NumberOfMCParticlesInEvent__bo421__bc",
"NumberOfMCParticlesInEvent__bo421__bc", 11, -0.5, 10.5)
185 f.Write(
"NumberOfMCParticlesInEvent__bo421__bc")
187 particles = fei.get_unittest_channels()
188 x = fei.core.TrainingDataInformation(particles)
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},
198 self.assertDictEqual(x.get_mc_counts(), mcCounts)
201 class TestFSPLoader(unittest.TestCase):
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)
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',
'')],
213 path.add_module(
'ParticleLoader', decayStringsWithCuts=[(
'K_S0:V0 -> pi+ pi-',
'')],
215 path.add_module(
'ParticleLoader', decayStringsWithCuts=[(
'Lambda0:V0 -> p+ pi-',
'')],
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)
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)
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',
'')],
231 path.add_module(
'ParticleLoader', decayStringsWithCuts=[(
'K_S0:V0 -> pi+ pi-',
'')],
233 path.add_module(
'ParticleLoader', decayStringsWithCuts=[(
'Lambda0:V0 -> p+ pi-',
'')],
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)
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)
250 path = basf2.create_path()
251 path.add_module(
'ParticleLoader', decayStringsWithCuts=[(
'K+:FSP',
''), (
'pi+:FSP',
''), (
'e+:FSP',
''),
252 (
'mu+:FSP',
''), (
'p+:FSP',
'')],
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)
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)
276 path = basf2.create_path()
277 path.add_module(
'ParticleLoader', decayStringsWithCuts=[(
'K+:FSP',
''), (
'pi+:FSP',
''), (
'e+:FSP',
''),
278 (
'mu+:FSP',
''), (
'p+:FSP',
'')],
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)
302 class TestTrainingData(unittest.TestCase):
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},
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)
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)
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)
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)
370 class TestPreReconstruction(unittest.TestCase):
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)
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')
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')
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')
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')
404 print_path(path, x.reconstruct())
405 self.assertEqual(x.reconstruct(), path)
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)
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',
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')
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'})
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'),
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'),
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',
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')
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',
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')
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',
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')
536 print_path(path, x.reconstruct())
537 self.assertEqual(x.reconstruct(), path)
540 class TestPostReconstruction(unittest.TestCase):
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)
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)
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>
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)
579 self.assertEqual(x.get_missing_channels(), [
'pi+:unittest ==> pi+:FSP',
580 'D0:unittest ==> pi-:unittest pi+:unittest'])
581 self.assertEqual(x.available(),
False)
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)
588 self.assertEqual(x.get_missing_channels(), [
'pi+:unittest ==> pi+:FSP'])
589 self.assertEqual(x.available(),
False)
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)
596 self.assertEqual(x.get_missing_channels(), [])
597 self.assertEqual(x.available(),
True)
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')
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)
612 path = basf2.create_path()
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'],
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')
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'],
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')
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')
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')
644 path.add_module(
'ParticleListManipulator', outputListName=
'D0:generic',
645 inputListNames=[
'D0:generic_0',
'D0:generic_1'],
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')
651 print_path(path, x.reconstruct())
652 self.assertEqual(x.reconstruct(), path)
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)
659 path = basf2.create_path()
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'],
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')
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'],
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')
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')
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')
691 path.add_module(
'ParticleListManipulator', outputListName=
'D0:generic',
692 inputListNames=[
'D0:generic_0',
'D0:generic_1'],
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')
698 print_path(path, x.reconstruct())
699 self.assertEqual(x.reconstruct(), path)
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)
706 path = basf2.create_path()
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')
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'],
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')
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'],
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')
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')
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')
851 path.add_module(
'ParticleListManipulator', outputListName=
'D0:generic',
852 inputListNames=[
'D0:generic_0',
'D0:generic_1'],
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')
890 print_path(path, x.reconstruct())
891 self.assertEqual(x.reconstruct(), path)
894 class TestTeacher(unittest.TestCase):
896 fei.core.Teacher.MaximumNumberOfMVASamples = int(1e7)
897 fei.core.Teacher.MinimumNumberOfMVASamples = int(10)
899 f = ROOT.TFile(
'pi+:generic ==> pi+:FSP.root',
'RECREATE')
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):
916 f = ROOT.TFile(
'K+:generic ==> K+:FSP.root',
'RECREATE')
918 f = ROOT.TFile(
'D0:generic ==> K-:generic pi+:generic.root',
'RECREATE')
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')
935 f = ROOT.TFile(
'D0:generic ==> pi-:generic pi+:generic.root',
'RECREATE')
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):
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')
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)
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'))
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)
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)
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)
1007 class TestConvertLegacyTraining(unittest.TestCase):
1012 class TestGetPath(unittest.TestCase):
1015 particles = fei.get_unittest_channels()
1017 f = ROOT.TFile(
'mcParticlesCount.root',
'RECREATE')
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)
1025 f.Write(
"NumberOfMCParticlesInEvent__bo{}__bc".format(pdgnumber))
1028 if os.path.isfile(
'mcParticlesCount.root'):
1029 os.remove(
'mcParticlesCount.root')
1030 if os.path.isfile(
'Summary.pickle'):
1031 os.remove(
'Summary.pickle')
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)
1040 feistate = fei.core.get_path(particles, config)
1041 self.assertEqual(feistate.stage, 0)
1045 config = fei.config.FeiConfiguration(training=
True)
1046 feistate = fei.core.get_path(particles, config)
1047 self.assertEqual(feistate.stage, 1)
1051 config = fei.config.FeiConfiguration(training=
True)
1052 feistate = fei.core.get_path(particles, config)
1053 self.assertEqual(feistate.stage, 1)
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')
1064 config = fei.config.FeiConfiguration(training=
True)
1065 feistate = fei.core.get_path(particles, config)
1066 self.assertEqual(feistate.stage, 2)
1070 config = fei.config.FeiConfiguration(training=
True)
1071 feistate = fei.core.get_path(particles, config)
1072 self.assertEqual(feistate.stage, 2)
1075 fei.core.Teacher.create_fake_weightfile(
'pi0:generic ==> gamma:generic gamma:generic')
1079 config = fei.config.FeiConfiguration(training=
True)
1080 feistate = fei.core.get_path(particles, config)
1081 self.assertEqual(feistate.stage, 4)
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')
1092 config = fei.config.FeiConfiguration(training=
True)
1093 feistate = fei.core.get_path(particles, config)
1094 self.assertEqual(feistate.stage, 7)
1098 config = fei.config.FeiConfiguration(cache=0, training=
True)
1099 feistate = fei.core.get_path(particles, config)
1100 self.assertEqual(feistate.stage, 7)
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')
1116 config = fei.config.FeiConfiguration(cache=0, training=
False)
1117 feistate = fei.core.get_path(particles, config)
1118 self.assertEqual(feistate.stage, 7)
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)
1127 feistate = fei.core.get_path(particles, config)
1128 self.assertEqual(feistate.stage, 0)
1132 config = fei.config.FeiConfiguration(cache=0, training=
True)
1133 feistate = fei.core.get_path(particles, config)
1134 self.assertEqual(feistate.stage, 1)
1138 config = fei.config.FeiConfiguration(cache=1, training=
True)
1139 feistate = fei.core.get_path(particles, config)
1140 self.assertEqual(feistate.stage, 1)
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')
1151 config = fei.config.FeiConfiguration(cache=1, training=
True)
1152 feistate = fei.core.get_path(particles, config)
1153 self.assertEqual(feistate.stage, 2)
1157 config = fei.config.FeiConfiguration(cache=2, training=
True)
1158 feistate = fei.core.get_path(particles, config)
1159 self.assertEqual(feistate.stage, 2)
1164 config = fei.config.FeiConfiguration(cache=4, training=
True)
1165 feistate = fei.core.get_path(particles, config)
1166 self.assertEqual(feistate.stage, 2)
1169 fei.core.Teacher.create_fake_weightfile(
'pi0:generic ==> gamma:generic gamma:generic')
1173 config = fei.config.FeiConfiguration(cache=2, training=
True)
1174 feistate = fei.core.get_path(particles, config)
1175 self.assertEqual(feistate.stage, 4)
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')
1186 config = fei.config.FeiConfiguration(cache=4, training=
True)
1187 feistate = fei.core.get_path(particles, config)
1188 self.assertEqual(feistate.stage, 7)
1192 config = fei.config.FeiConfiguration(cache=0, training=
True)
1193 feistate = fei.core.get_path(particles, config)
1194 self.assertEqual(feistate.stage, 7)
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')
1210 config = fei.config.FeiConfiguration(cache=0, training=
False)
1211 feistate = fei.core.get_path(particles, config)
1212 self.assertEqual(feistate.stage, 7)
1215 if __name__ ==
'__main__':
1218 basf2_mva.loadRootDictionary()
1219 tempdir = tempfile.mkdtemp()
1221 basf2.conditions.testing_payloads = [
'localdb/database.txt']
1223 atexit.register(shutil.rmtree, tempdir)