14 This file tests the functionality of sampling needed to train the flavor tagger.
19 from basf2
import set_random_seed, create_path, process
20 import modularAnalysis
as ma
21 import flavorTagger
as ft
28 set_random_seed(
"1337")
33 testpath = create_path()
34 testpath.add_module(
'RootInput', inputFileNames=testinput)
36 ma.fillParticleListFromMC(
'nu_tau',
'', path=testpath)
37 ma.reconstructMCDecay(decayString=
'B0:sig -> nu_tau anti-nu_tau', cut=
'', path=testpath)
40 ma.buildRestOfEvent(
'B0:sig', path=testpath)
43 ma.applyCuts(
'B0:sig',
' abs(isRelatedRestOfEventB0Flavor) == 1', path=testpath)
47 roe_path = create_path()
48 deadEndPath = create_path()
50 ma.signalSideParticleListsFilter(
52 'nROE_Charged(all, 0) > 0 and abs(qrCombined) == 1',
57 ma.fillParticleList(
'e+:inRoe',
'isInRestOfEvent > 0.5 and passesROEMask() > 0.5 and ' +
58 'isNAN(p) !=1 and isInfinity(p) != 1', path=roe_path)
61 methodPrefixEventLevel =
"FlavorTagger_Belle2_B2nunuBGx1EventLevelElectronFBDT"
62 targetVariable =
'isRightCategory(Electron)'
63 ma.applyCuts(
'e+:inRoe',
'isRightCategory(mcAssociated) > 0', path=roe_path)
66 eventLevelpath = create_path()
67 SkipEmptyParticleList = basf2.register_module(
"SkimFilter")
68 SkipEmptyParticleList.set_name(
'SkimFilter_EventLevelElectron')
69 SkipEmptyParticleList.param(
'particleLists',
'e+:inRoe')
70 SkipEmptyParticleList.if_true(eventLevelpath, basf2.AfterConditionPath.CONTINUE)
71 roe_path.add_module(SkipEmptyParticleList)
73 ntuple = basf2.register_module(
'VariablesToNtuple')
74 ntuple.param(
'fileName', methodPrefixEventLevel +
"sampled0.root")
75 ntuple.param(
'treeName', methodPrefixEventLevel +
"_tree")
78 ft.set_FlavorTagger_pid_aliases()
80 variablesToBeSaved = [
'useCMSFrame(p)',
89 'BtagToWBosonVariables(recoilMassSqrd)',
90 'BtagToWBosonVariables(pMissCMS)',
91 'BtagToWBosonVariables(cosThetaMissCMS)',
92 'BtagToWBosonVariables(EW90)',
95 'hasHighestProbInCat(e+:inRoe, isRightTrack(Electron))',
96 targetVariable,
'ancestorHasWhichFlavor',
97 'isSignal',
'mcPDG',
'mcErrors',
'genMotherPDG',
98 'nMCMatches',
'B0mcErrors'
100 ntuple.param(
'variables', variablesToBeSaved)
101 ntuple.param(
'particleList',
'e+:inRoe')
102 eventLevelpath.add_module(ntuple)
104 testpath.for_each(
'RestOfEvent',
'RestOfEvents', roe_path)
112 assert os.path.isfile(methodPrefixEventLevel +
"sampled0.root"), methodPrefixEventLevel +
"sampled0.root" +
" wasn't created"
113 f = ROOT.TFile(methodPrefixEventLevel +
"sampled0.root")
114 t1 = f.Get(methodPrefixEventLevel +
"_tree")
115 assert bool(t1), methodPrefixEventLevel +
"_tree" +
" isn't contained in file"
116 assert t1.GetEntries() > 0, methodPrefixEventLevel +
"_tree" +
"contains zero entries"
117 for iVariable
in variablesToBeSaved:
118 iROOTVariable = str(ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(iVariable))
119 assert t1.GetListOfBranches().Contains(iROOTVariable), iROOTVariable +\
120 " branch is missing from " + methodPrefixEventLevel +
"_tree"
122 assert t1.GetEntries() == 40,
"40 entries should be saved in the test training ntuple, otherwise some problem happened."
125 211.0, 211.0, 211.0, 211.0, 211.0, 321.0, 13.0, 11.0,
126 211.0, 211.0, 211.0, 11.0, 211.0, 211.0, 211.0, 211.0,
127 211.0, 11.0, 211.0, 211.0, 211.0, 211.0, 211.0, 211.0, 211.0,
128 2212.0, 211.0, 211.0, 2212.0, 211.0, 13.0, 211.0, 211.0,
129 211.0, 211.0, 211.0, 211.0, 321.0, 321.0, 211.0]
131 for iEntry
in range(t1.GetEntries()):
133 assert abs(t1.useCMSFrame__bop__bc) > 0,
" p* should be greater than 0"
134 assert abs(t1.useCMSFrame__bopt__bc) > 0,
" pt* should be greater than 0"
135 assert abs(t1.p) > 0,
" p should be greater than 0"
136 assert abs(t1.pt) > 0,
" pt should be greater than 0"
137 assert abs(t1.cosTheta) > 0,
" cosTheta should be greater than 0"
138 assert abs(t1.electronID) > 0,
" electronID should be greater than 0"
139 assert abs(t1.eid_TOP) > 0,
" eid_TOP should be greater than 0"
140 assert abs(t1.eid_ARICH) > 0,
" eid_ARICH should be greater than 0"
141 assert abs(t1.eid_ECL) > 0,
"eid_ECL should be greater than 0"
142 assert abs(t1.BtagToWBosonVariables__borecoilMassSqrd__bc) > 0,
" recoilMassSqrd should be greater than 0"
143 assert abs(t1.BtagToWBosonVariables__bopMissCMS__bc) > 0,
" pMissCMS should be greater than 0"
144 assert abs(t1.BtagToWBosonVariables__bocosThetaMissCMS__bc) > 0,
" cosThetaMissCMS should be greater than 0"
145 assert abs(t1.BtagToWBosonVariables__boEW90__bc) > 0,
" EW90 should be greater than 0"
146 assert abs(t1.cosTPTO) > 0,
" cosTPTO should be greater than 0"
147 assert abs(t1.chiProb) > 0,
" chiProb should be greater than 0"
149 t1.hasHighestProbInCat__boe__pl__clinRoe__cm__spisRightTrack__boElectron__bc__bc
151 basf2.B2FATAL(
" hasHighestProbInCat Electron should not be nan")
152 if math.isnan(t1.isRightCategory__boElectron__bc):
153 basf2.B2FATAL(
" isRightCategory Electron should not be nan ")
154 if math.isnan(t1.ancestorHasWhichFlavor):
155 basf2.B2FATAL(
" ancestorHasWhichFlavor should not be nan")
156 if math.isnan(t1.isSignal):
157 basf2.B2FATAL(
" isSignal should not be nan")
158 assert abs(t1.mcPDG) == mcPDGCodes[iEntry],
" Some mismatch between PDG codes happened in entry " + iEntry
159 if math.isnan(t1.mcErrors):
160 basf2.B2FATAL(
" mcErrors should not be equal to nan")
161 assert abs(t1.genMotherPDG) > 0,
" genMotherPDG should be greater than 0"
162 assert abs(t1.nMCMatches) > 0,
" nMCMatches should be greater than 0"
def configure_logging_for_tests(user_replacements=None)
def require_file(filename, data_type="", py_case=None)
def clean_working_directory()