9import modularAnalysis
as ma
11from variables
import utils
12from basf2
import B2INFO, B2ERROR
20def add_default_lambda_Selector_aliases():
22 This function is used to set up variables aliases
for lambda Selector variables.
24 variables.variables.addAlias('daughtersDeltaZ',
'daughterDiffOf(0, 1, dz)')
25 variables.variables.addAlias(
'cosVertexMomentum',
'cosAngleBetweenMomentumAndVertexVector')
26 variables.variables.addAlias(
'pro_nPXDHits',
'daughter(0,nPXDHits)')
27 variables.variables.addAlias(
'pin_nPXDHits',
'daughter(1,nPXDHits)')
28 variables.variables.addAlias(
'pro_nSVDHits',
'daughter(0,nSVDHits)')
29 variables.variables.addAlias(
'pin_nSVDHits',
'daughter(1,nSVDHits)')
30 variables.variables.addAlias(
'daughterAngleDiffInMother',
'useRestFrame(daughterAngle(0, 1))')
31 variables.variables.addAlias(
'pro_p',
'daughter(0,p)')
32 variables.variables.addAlias(
'pin_p',
'daughter(1,p)')
33 variables.variables.addAlias(
'pro_pt',
'daughter(0,pt)')
34 variables.variables.addAlias(
'pin_pt',
'daughter(1,pt)')
35 variables.variables.addAlias(
'pro_dr',
'daughter(0,dr)')
36 variables.variables.addAlias(
'pin_dr',
'daughter(1,dr)')
37 variables.variables.addAlias(
'pro_cosTheta',
'daughter(0,cosTheta)')
38 variables.variables.addAlias(
'pin_cosTheta',
'daughter(1,cosTheta)')
39 variables.variables.addAlias(
'pro_protonID',
'daughter(0,protonID)')
40 variables.variables.addAlias(
'pin_protonID',
'daughter(1,protonID)')
41 variables.variables.addAlias(
'proPDG',
'daughter(0,mcPDG)')
42 variables.variables.addAlias(
'pinPDG',
'daughter(1,mcPDG)')
43 variables.variables.addAlias(
"Mks_Hypo",
"useAlternativeDaughterHypothesis(M, 0:pi+)")
46def add_variable_collection():
48 Call this function to add variable collection for lambdaSelector.
50 add_default_lambda_Selector_aliases()
51 inputVariablesList = [
55 'significanceOfDistance',
56 'cosHelicityAngleMomentum',
60 'daughterAngleDiffInMother',
62 'pro_nSVDHits',
'pro_nPXDHits',
63 'pin_nSVDHits',
'pin_nPXDHits',
65 'pro_protonID',
'pin_protonID',
68 'pro_cosTheta',
'pin_cosTheta',
70 'ArmenterosDaughter1Qt',
71 'ArmenterosDaughter2Qt',
74 utils.add_collection(inputVariablesList,
'lambda_selector_info')
77def V0Selector_Training(
80 mva_identifier="MVA_LightGBM_V0Selector.root",
81 target_variable="isSignal",
85 Defines the configuration of V0Selector Training.
86 The training data should contain Lambda0 and misreconstructed Lambda0 without KS0.
88 @param train_data Root file containing Lambda information to be trained.
89 @param tree_name Tree name
for variables.
90 @param mva_identifier Name
for output MVA weight file.
91 @param target_variable Target variable
for MVA training.
92 @param parameters hyperparameter
for LGBM
99 'significanceOfDistance',
100 'cosHelicityAngleMomentum',
104 'daughterAngleDiffInMother',
106 'pro_nSVDHits',
'pro_nPXDHits',
107 'pin_nSVDHits',
'pin_nPXDHits',
111 general_options = basf2_mva.GeneralOptions()
112 general_options.m_datafiles = basf2_mva.vector(train_data)
113 general_options.m_treename = tree_name
114 general_options.m_identifier = mva_identifier
115 general_options.m_variables = basf2_mva.vector(*trainVars)
116 general_options.m_target_variable = target_variable
118 python_options = basf2_mva.PythonOptions()
120 python_options.m_framework =
"lightgbm"
121 python_options.m_steering_file =
""
124 param = {
'num_leaves': 256,
125 'objective':
'cross_entropy',
126 'learning_rate': 0.1,
127 'device_type':
"cpu",
128 'deterministic':
True,
132 'path': mva_identifier+
'.txt',
133 'min_data_in_leaf': 1000,
137 'trainFraction': 0.8,
139 if isinstance(parameters, dict):
140 param.update(parameters)
141 config_string = json.dumps(param)
142 print(
"The json config string", config_string)
143 python_options.m_config = config_string
145 python_options.m_training_fraction = 1
146 python_options.m_normalize =
False
147 python_options.m_nIterations = 1
148 python_options.m_mini_batch_size = 0
150 basf2_mva.teacher(general_options, python_options)
156 mva_identifier="MVA_LightGBM_KsVeto.root",
157 target_variable="isSignal",
161 Defines the configuration of KsVeto Training.
162 The training data should contain only Lambda and Ks.
164 @param train_data Root file containing Ks information to be trained.
165 @param tree_name Tree name
for variables.
166 @param mva_identifier Name
for output MVA weight file.
167 @param target_variable Target variable
for MVA training.
168 @param parameters hyperparameter
for LGBM
175 'ArmenterosDaughter1Qt',
176 'ArmenterosDaughter2Qt',
180 'ArmenterosLongitudinalMomentumAsymmetry',
183 general_options = basf2_mva.GeneralOptions()
184 general_options.m_datafiles = basf2_mva.vector(train_data)
185 general_options.m_treename = tree_name
186 general_options.m_identifier = mva_identifier
187 general_options.m_variables = basf2_mva.vector(*trainVars)
188 general_options.m_target_variable = target_variable
190 python_options = basf2_mva.PythonOptions()
192 python_options.m_framework =
"lightgbm"
193 python_options.m_steering_file =
""
196 param = {
'num_leaves': 256,
197 'learning_rate': 0.05,
198 'device_type':
"cpu",
199 'deterministic':
True,
203 'path': mva_identifier+
'.txt',
207 'trainFraction': 0.8,
208 'min_data_in_leaf': 300,
209 'objective':
'cross_entropy',
211 if isinstance(parameters, dict):
212 param.update(parameters)
213 config_string = json.dumps(param)
214 print(
"The json config string", config_string)
215 python_options.m_config = config_string
217 python_options.m_normalize =
False
219 python_options.m_nIterations = 1
220 python_options.m_mini_batch_size = 0
221 basf2_mva.teacher(general_options, python_options)
230 identifier_Lambda="Lambda_LGBM_V0Selector",
231 identifier_vKs="Lambda_LGBM_KsVeto",
232 output_label_name='',
233 extraInfoName_V0Selector='LambdaSelector_V0Selector',
234 extraInfoName_KsVeto='LambdaSelector_KsVeto',
235 useCustomThreshold=False,
236 threshold_V0Selector=0.72,
237 threshold_KsVeto=0.27,
241 This function will apply Lambda0 selection MVA on the given particleList.
242 By default this function appends MVA output as a extraInfo
for the given particleList.
243 You can apply preset cut
or custom cut by giving parameters. In this case,
244 a new particleList
is created
from the original particleList applying cuts on the MVA output.
246 @param particleListName Reconstructed Lambda0 -> p+ pi- list.
247 @param output_label_name Label of the returned Lambda particleList.
248 When empty
'', no cut
is applied
and new particleList
is not created.
249 When custom name, the custom threshold
is used,
and useCustomThreshold
251 When
'standard',
'tight',
or 'loose', a cut
with Ks efficiency
252 90%, 95%,
and 85%
is applied.
253 @param extraInfoName_V0Selector Variable name
for V0Selector MVA output.
254 @param extraInfoName_KsVeto Variable name
for KsVeto MVA output.
255 @param identifier_Lambda Identifier name
for V0Selector weight file.
256 @param identifier_vKs Identifier name
for KsVeto weight file.
257 @param useCustomThreshold Flag whether threshold_V0Selector
and threshold_KsVeto are used.
258 @param threshold_V0Selector Threshold
for V0Selector.
259 @param threshold_KsVeto Threshold
for KsVeto.
260 @param path Basf2 path to execute.
264 add_default_lambda_Selector_aliases()
266 path.add_module('MVAMultipleExperts',
267 listNames=[particleListName],
268 extraInfoNames=[extraInfoName_V0Selector, extraInfoName_KsVeto],
269 identifiers=[identifier_Lambda, identifier_vKs])
271 _effnames = [
'standard',
'tight',
'loose']
274 if useCustomThreshold:
275 if output_label_name
in _effnames:
276 B2ERROR(
'LambdaSelector: Specify label name except for \'standard\', \'tight\', and \'loose\' '
277 'when you use custom threshold.')
278 elif output_label_name ==
'':
279 B2ERROR(
'LambdaSelector: Specify label name when you use custom threshold.')
281 outputListName = particleListName.split(
':')[0] +
':' + output_label_name
282 B2INFO(
'LambdaSelector: Custom Cut is applied on '+outputListName+
'.')
283 V0_thr = threshold_V0Selector
284 Ks_thr = threshold_KsVeto
285 B2INFO(
'LambdaSelector: Threshold is (' + str(V0_thr) +
', ' + str(Ks_thr) +
')')
286 cut_string =
'extraInfo('+extraInfoName_V0Selector+
')>'+str(V0_thr) + \
287 ' and extraInfo('+extraInfoName_KsVeto+
')>'+str(Ks_thr)
288 ma.cutAndCopyLists(outputListName, particleListName, cut=cut_string, path=path)
290 if output_label_name
in _effnames:
291 outputListName = particleListName.split(
':')[0] +
':' + output_label_name
294 if output_label_name ==
'standard':
295 B2INFO(
'LambdaSelector: Standard Cut is applied on '+outputListName+
'.')
298 elif output_label_name ==
'tight':
299 B2INFO(
'LambdaSelector: Tight Cut is applied on '+outputListName+
'.')
302 elif output_label_name ==
'loose':
303 B2INFO(
'LambdaSelector: Loose Cut is applied on '+outputListName+
'.')
306 B2INFO(
'LambdaSelector: Threshold is (' + str(V0_thr) +
', ' + str(Ks_thr) +
')')
307 cut_string =
'extraInfo('+extraInfoName_V0Selector+
')>'+str(V0_thr) + \
308 ' and extraInfo('+extraInfoName_KsVeto+
')>'+str(Ks_thr)
309 ma.cutAndCopyLists(outputListName, particleListName, cut=cut_string, path=path)
310 elif output_label_name ==
'':
311 outputListName = particleListName
313 B2ERROR(
'LambdaSelector: Label should be \'\', \'standard\', \'tight\', or \'loose\' if you do'
314 'not apply custom threshold')
316 B2INFO(
'LambdaSelector: ParticleList '+outputListName+
' is returned.')