Belle II Software  release-08-01-10
variablesToNtuple.py
1 #!/usr/bin/env python3
2 
3 
10 
11 # The VariablesToNtuple module saves variables from the VariableManager
12 # to a candidate-based (or event-based) TTree
13 #
14 # For full documentation please refer to https://software.belle2.org
15 # Anything unclear? Ask questions at https://questions.belle2.org
16 
17 import basf2
18 import modularAnalysis as ma # a shorthand for the analysis tools namespace
19 
20 mypath = basf2.Path() # create a new path
21 
22 # add input data and ParticleLoader modules to the path
23 ma.inputMdstList([basf2.find_file('analysis/tests/mdst.root')], path=mypath)
24 ma.fillParticleLists([('K-', 'kaonID > 0.2'), ('pi+', 'pionID > 0.2')], path=mypath)
25 ma.reconstructDecay('D0 -> K- pi+', '1.750 < M < 1.95', path=mypath)
26 ma.matchMCTruth('D0', path=mypath)
27 
28 # Add the VariablesToNtuple module explicitly.
29 # This will write out one row per candidate in the D0 list
30 mypath.add_module('VariablesToNtuple',
31  particleList='D0',
32  variables=['dM', 'isSignal', 'mcErrors', 'p', 'E',
33  'daughter(0, kaonID)', 'daughter(1, pionID)'],
34  fileName='CandidateVariables.root')
35 
36 # Add another instance of the VariablesToNtuple module.
37 # If the particle list is empty one row per event is written to the Ntuple,
38 # but all the variables to specify have to be event-based
39 mypath.add_module('VariablesToNtuple',
40  particleList='',
41  variables=['nTracks', 'isMC', 'year'],
42  fileName='EventVariables.root')
43 
44 # One can also call the VariablesToNtuple module in the roe_path to store the ROE particles' variables.
45 # Build ROE and append a mask for cleanup
46 ma.buildRestOfEvent('D0', path=mypath)
47 cleanMask = ('cleanMask', # mask name
48  'nCDCHits > 0 and useCMSFrame(p)<=3.2', # criteria on tracks
49  'p >= 0.05 and useCMSFrame(p)<=3.2' # criteria on ECL-clusters
50  )
51 ma.appendROEMasks('D0', mask_tuples=[cleanMask], path=mypath)
52 
53 # Make another path that is called in for_each loop over ROE objects
54 roe_path = basf2.Path()
55 ma.fillParticleList('pi+:inRoe', 'isInRestOfEvent > 0 and passesROEMask(cleanMask)', path=roe_path)
56 ma.variablesToNtuple(decayString='pi+:inRoe',
57  variables=['p', 'E'],
58  filename='CandidateVariables.root',
59  treename='roe',
60  signalSideParticleList='D0', # index of D0 is stored in the branch '__signalSideCandidate__'
61  path=roe_path)
62 mypath.for_each('RestOfEvent', 'RestOfEvents', roe_path)
63 
64 
65 # you might also like to uncomment the following, and read the help for the
66 # convenient wrapper function:
67 # print(help(ma.variablesToNtuple))
68 
69 # process the data
70 basf2.process(mypath)
71 print(basf2.statistics)