Belle II Software light-2609-luna
vars.py
1# this script sets the aliases for different variable sets
2
3# relative imports
4from .categories import get_available_categories
5from .helpers import read_yaml
6
7
8def set_output_vars():
9 """
10 Sets the aliases for FT output vars
11 """
12
13 # imports
14 import basf2
15 from variables import variables as va
16 import variables.utils as vu
17
18 # aliases for FT output vars
19 va.addAlias('FBDT_qrCombined', 'qrOutput(FBDT)')
20 va.addAlias('qrGNN', 'extraInfo(qrGNN)')
21
22 # alias for FT target var
23 va.addAlias('qrMC', 'isRelatedRestOfEventB0Flavor')
24
25 # aliases for FT category info vars
26 for category in get_available_categories():
27 aliasForQp = f'qp{category}'
28 aliasForTrueTarget = f'hasTrueTarget{category}'
29 aliasForIsRightCategory = f'isRightCategory{category}'
30 va.addAlias(aliasForQp, f'qpCategory({category})')
31 va.addAlias(aliasForTrueTarget, f'hasTrueTargets({category})')
32 va.addAlias(aliasForIsRightCategory, f'isTrueFTCategory({category})')
33
34 # get output vars list
35 filepath = basf2.find_file('data/analysis/output_vars.yaml')
36 flavor_tagging_vars = read_yaml(filepath)["output_vars"]
37
38 # add output vars to flavor tagger collection
39 vu.add_collection(flavor_tagging_vars, 'flavor_tagging')
40
41
42def set_FT_pid_aliases(type="Current", exp_type="Belle2"):
43 """
44 This function adds the pid aliases needed by the flavor tagger.
45 """
46 # imports
47 import basf2
48 from variables import variables as va
49
50 # define a function to set alias
51 def set_alias(alias, var): return va.addAlias(alias, var)
52
53 # get list of aliases
54 filepath = basf2.find_file('data/analysis/pid_alias.yaml')
55 alias_list = read_yaml(filepath)[type]
56
57 for alias, var in alias_list["Common"].items():
58 set_alias(alias, var) # common alias
59 for alias, var in alias_list[exp_type].items():
60 set_alias(alias, var) # exp specific alias
61
62
63def set_GFlat_aliases(categories, usePIDNN):
64 """
65 This function adds aliases for the GNN-based flavor tagger.
66 """
67 # imports
68 from variables import variables as va
69
70 # will be used for target variable 0:B0bar, 1:B0
71 va.addAlias('qrCombined_bit', '(qrCombined+1)/2')
72 alias_list = ['qrCombined_bit']
73
74 var_dict = {
75 # position
76 'dx': 'dx',
77 'dy': 'dy',
78 'dz': 'dz',
79 # mask
80 'E': 'E',
81 # charge,
82 'charge': 'charge',
83 # feature
84 'px_c': 'px*charge',
85 'py_c': 'py*charge',
86 'pz_c': 'pz*charge',
87 'electronID_c': 'electronIDNN*charge' if usePIDNN else 'electronID*charge',
88 'muonID_c': 'muonIDNN*charge' if usePIDNN else 'muonID*charge',
89 'pionID_c': 'pionIDNN*charge' if usePIDNN else 'pionID*charge',
90 'kaonID_c': 'kaonIDNN*charge' if usePIDNN else 'kaonID*charge',
91 'protonID_c': 'protonIDNN*charge' if usePIDNN else 'protonID*charge',
92 'deuteronID_c': 'deuteronIDNN*charge' if usePIDNN else 'deuteronID*charge',
93 'electronID_noSVD_noTOP_c': 'electronID_noSVD_noTOP*charge',
94 }
95
96 # 16 charged particles are used at most
97 for rank in range(1, 17):
98
99 for cat in categories:
100 listName = get_available_categories()[cat].particleList
101 varName = f'QpTrack({listName}, isRightCategory({cat}), isRightCategory({cat}))'
102
103 varWithRank = f'ifNANgiveX(getVariableByRank(pi+:inRoe, FT_p, {varName}, {rank}), 0)'
104 aliasWithRank = f'{cat}_rank{rank}'
105
106 va.addAlias(aliasWithRank, varWithRank)
107 alias_list.append(aliasWithRank)
108
109 for alias, var in var_dict.items():
110 varWithRank = f'ifNANgiveX(getVariableByRank(pi+:inRoe, FT_p, {var}, {rank}), 0)'
111 aliasWithRank = f'{alias}_rank{rank}'
112
113 va.addAlias(aliasWithRank, varWithRank)
114 alias_list.append(aliasWithRank)
115
116 return alias_list
117
118
119def set_masked_vars(mask_name="all"):
120 """
121 Returns variables with a certain mask
122 """
123 # imports
124 from variables import variables as va
125
126 masked_var_dict = {
127 'pMissTag_withMask': f'pMissTag({mask_name})',
128 'cosTPTO_withMask': f'cosTPTO({mask_name})',
129 'ptTracksRoe_withMask': f'ptTracksRoe({mask_name})',
130 'pt2TracksRoe_withMask': f'pt2TracksRoe({mask_name})',
131 }
132
133 for key, value in masked_var_dict.items():
134 va.addAlias(key, value)
135
136 return masked_var_dict
137
138
139def set_and_get_aliases(var_dict):
140 """
141 Sets aliases from a dict of alias, var pair and returns a list of aliases.
142 """
143 from variables import variables as va
144
145 for key, value in var_dict.items():
146 va.addAlias(key, value)
147
148 return list(var_dict.keys())