Belle II Software  release-05-02-19
ConvertAndReconstruct.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 import os
5 import sys
6 
7 import basf2
8 import modularAnalysis as ma
9 import variables as va
10 import variables.collections as vc
11 import variables.utils as vu
12 from vertex import kFit
13 from b2biiConversion import convertBelleMdstToBelleIIMdst
14 from b2biiMonitors import addBeamParamsConversionMonitors
15 from b2biiMonitors import addTrackConversionMonitors
16 from b2biiMonitors import addNeutralsConversionMonitors
17 
18 os.environ['USE_GRAND_REPROCESS_DATA'] = '1'
19 os.environ['PGUSER'] = 'g0db'
20 
21 # If you want to create the monitoring histograms (recommended in the beginning of your analysis), just provide any argument
22 monitoring = False
23 if len(sys.argv) == 1:
24  basf2.B2WARNING("In the beginning of an analysis it is recommended to study the monitoring histograms.\n"
25  "These tell you if the conversion works as expected.\n"
26  "If you want to create them, just provide any argument to this script.")
27 else:
28  monitoring = True
29 
30 print('BELLE2_EXTERNALS_DIR = ' + str(os.getenv('BELLE2_EXTERNALS_DIR')))
31 print('BELLE2_EXTERNALS_SUBDIR = ' + str(os.getenv('BELLE2_EXTERNALS_SUBDIR')))
32 print('BELLE2_EXTERNALS_OPTION = ' + str(os.getenv('BELLE2_EXTERNALS_OPTION')))
33 print('BELLE2_EXTERNALS_VERSION = ' + str(os.getenv('BELLE2_EXTERNALS_VERSION')))
34 print('BELLE2_LOCAL_DIR = ' + str(os.getenv('BELLE2_LOCAL_DIR')))
35 print('BELLE2_RELEASE = ' + str(os.getenv('BELLE2_RELEASE')))
36 print('BELLE2_OPTION = ' + str(os.getenv('BELLE2_OPTION')))
37 print('BELLE_POSTGRES_SERVER = ' + str(os.getenv('BELLE_POSTGRES_SERVER')))
38 print('USE_GRAND_REPROCESS_DATA = ' + str(os.getenv('USE_GRAND_REPROCESS_DATA')))
39 print('PANTHER_TABLE_DIR = ' + str(os.getenv('PANTHER_TABLE_DIR')))
40 print('PGUSER = ' + str(os.getenv('PGUSER')))
41 
42 # Convert
43 mypath = basf2.create_path()
44 inputfile = basf2.find_file('b2bii_input_evtgen_exp_07_BptoD0pip-D0toKpipi0-0.mdst', 'examples', False)
45 convertBelleMdstToBelleIIMdst(inputfile, path=mypath)
46 
47 # Reconstruct
48 if monitoring:
49  # Create monitoring histograms if requested
50  addBeamParamsConversionMonitors(path=mypath)
51  addTrackConversionMonitors(path=mypath)
52  addNeutralsConversionMonitors(path=mypath)
53 
54 # Only charged final state particles need to be loaded. The neutral particles
55 # gamma, pi0, K_S0, K_L0, and Lambda0 are already loaded to the 'gamma:mdst',
56 # 'pi0:mdst', 'K_S0:mdst', 'K_L0:mdst', and 'Lambda0:mdst' particle lists,
57 # respectively.
58 ma.fillParticleList('pi+:all', '', path=mypath)
59 ma.fillParticleList('K+:all', '', path=mypath)
60 ma.fillParticleList('mu+:all', '', path=mypath)
61 ma.fillParticleList('e+:all', '', path=mypath)
62 
63 # Let's have a look at the pi0 candidates in 'pi0:mdst' and print the values of some variables
64 # In order to access the MC information we need to run the MC matching first
65 ma.matchMCTruth('pi0:mdst', path=mypath)
66 ma.printVariableValues('gamma:mdst', ['mcPDG', 'E', 'clusterE9E25'], path=mypath)
67 ma.printVariableValues('pi0:mdst', ['mcPDG', 'p', 'M', 'InvM'], path=mypath)
68 
69 # The advantage of the pre-loaded V0s (which are the only ones that you should
70 # use in B2BII analyses) is that the momenta and the position of the daughter
71 # tracks are determined wrt. a pivot at the decay vertex of the V0. In
72 # addition, K_S0:mdst (Lambda0:mdst) has goodKs (goodLambda) and nisKsFinder
73 # outputs attached as extra info. It can be used to select good candidates.
74 ma.cutAndCopyList('K_S0:good', 'K_S0:mdst', cut='goodBelleKshort', path=mypath)
75 
76 # It makes sense to perform a vertex fit of the K_S0 candidates and accept
77 # only those candidates where the vertex fit converged
78 kFit('K_S0:good', 0, path=mypath)
79 
80 # Again, let's print a few variable values:
81 ma.matchMCTruth('K_S0:good', path=mypath)
82 ma.printVariableValues('K_S0:good', ['mcPDG', 'M', 'InvM', 'p', 'px', 'py', 'pz',
83  'extraInfo(goodKs)', 'extraInfo(ksnbVLike)', 'extraInfo(ksnbNoLam)'], path=mypath)
84 
85 # The Belle PID variables are: atcPIDBelle(sigHyp, bkgHyp), muIDBelle, and eIDBelle
86 va.variables.addAlias('Lkpi', 'atcPIDBelle(3,2)')
87 va.variables.addAlias('Lppi', 'atcPIDBelle(4,2)')
88 va.variables.addAlias('Lpk', 'atcPIDBelle(4,3)')
89 
90 # Since we did not apply any PID requirement the 'pi+:all' particle list
91 # contains all type of charged final state particles. Have a look at the
92 # printOut and notice how the true identity correlates with the corresponding
93 # PID values.
94 ma.printVariableValues('pi+:all', ['mcPDG', 'p', 'Lkpi', 'Lppi', 'muIDBelle',
95  'muIDBelleQuality', 'eIDBelle', 'nSVDHits'], path=mypath)
96 
97 # Now, let's really reconstruct a B decay with an intermediate D meson:
98 ma.reconstructDecay('D0:Kpipi0 -> K-:all pi+:all pi0:mdst', '1.7 < M < 2.0', path=mypath)
99 ma.reconstructDecay('B+:D0pi -> anti-D0:Kpipi0 pi+:all', '4.8 < M < 5.5', path=mypath)
100 
101 ma.matchMCTruth('B+:D0pi', path=mypath)
102 
103 # create and fill flat Ntuple with MCTruth and kinematic information
104 kinematics_and_truth = vc.kinematics + vc.mc_truth
105 variables = vu.create_aliases_for_selected(kinematics_and_truth, '^B+ -> [ ^D0 -> ^K- ^pi+ ^pi0] ^pi+')
106 
107 belle1pid = ['eIDBelle', 'muIDBelleQuality', 'muIDBelle', 'Lkpi', 'Lppi', 'Lpk']
108 variables += vu.create_aliases_for_selected(belle1pid, 'B+ -> [ D0 -> ^K- ^pi+ pi0] ^pi+')
109 
110 ma.variablesToNtuple('B+:D0pi', variables, filename='B2BII_ConvertAndReconstruct_Example.root', path=mypath)
111 
112 # progress
113 mypath.add_module('Progress')
114 
115 basf2.process(mypath)
116 
117 # Print call statistics
118 print(basf2.statistics)
basf2.process
def process(path, max_event=0)
Definition: __init__.py:25
variables.utils
Definition: utils.py:1
variables.collections
Definition: collections.py:1