Belle II Software development
particle_lists.py
1# this script fills particle lists
2
3# imports
4from .categories import get_available_categories
5from .helpers import get_Belle_or_Belle2
6
7
8def fill_particle_lists(maskName='all', categories=[], path=None):
9 """
10 Fills the particle Lists for all categories.
11 """
12 # imports
13 from vertex import kFit
14 import modularAnalysis as ma
15
16 # define the basic cut on each track
17 track_cut = 'isInRestOfEvent > 0.5 and passesROEMask(' + maskName + ') > 0.5 and p >= 0'
18
19 ready_lists = [] # keep track of filled particle lists
20 exp_type = get_Belle_or_Belle2()
21
22 # fill category wise particle lists
23 for category in categories:
24 particle_list = get_available_categories()[category].particleList
25
26 # check if duplicate
27 if particle_list in ready_lists:
28 continue
29
30 # select particles in ROE for different categories according to mass hypothesis.
31 if particle_list == 'Lambda0:inRoe':
32 if 'pi+:inRoe' not in ready_lists:
33 ma.fillParticleList('pi+:inRoe', track_cut, path=path)
34 ready_lists.append('pi+:inRoe')
35
36 ma.fillParticleList('p+:inRoe', track_cut, path=path)
37 ma.reconstructDecay(particle_list + ' -> pi-:inRoe p+:inRoe', '1.00<=M<=1.23', False, path=path)
38 kFit(particle_list, 0.01, path=path)
39 ma.matchMCTruth(particle_list, path=path)
40 ready_lists.append(particle_list)
41
42 else:
43 # Filling particle list for actual category
44 ma.fillParticleList(particle_list, track_cut, path=path)
45 ready_lists.append(particle_list)
46
47 # Additional particleLists for K_S0
48 if exp_type == 'Belle':
49 ma.cutAndCopyList('K_S0:inRoe', 'K_S0:mdst', 'extraInfo(ksnbStandard) == 1 and isInRestOfEvent == 1', path=path)
50 else:
51 if 'pi+:inRoe' not in ready_lists:
52 ma.fillParticleList('pi+:inRoe', track_cut, path=path)
53 ma.reconstructDecay('K_S0:inRoe -> pi+:inRoe pi-:inRoe', '0.40<=M<=0.60', False, path=path)
54 kFit('K_S0:inRoe', 0.01, path=path)
55
56 # Apply BDT-based LID
57 default_list_for_lid_BDT = ['e+:inRoe', 'mu+:inRoe'] if exp_type == 'Belle2' else []
58 list_for_lid_BDT = list(set(default_list_for_lid_BDT) & set(ready_lists))
59
60 if list_for_lid_BDT: # empty check
61 ma.applyChargedPidMVA(particleLists=list_for_lid_BDT, path=path,
62 trainingMode=0, # binary
63 binaryHypoPDGCodes=(11, 211)) # e vs pi
64 ma.applyChargedPidMVA(particleLists=list_for_lid_BDT, path=path,
65 trainingMode=0, # binary
66 binaryHypoPDGCodes=(13, 211)) # mu vs pi
67 ma.applyChargedPidMVA(particleLists=list_for_lid_BDT, path=path,
68 trainingMode=1) # Multiclass