Belle II Software  release-05-01-25
muPairAlignment.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
12 
13 import sys
14 import basf2 as b2
15 from modularAnalysis import inputMdst
16 from modularAnalysis import fillParticleList
17 from variables import variables
18 from modularAnalysis import reconstructDecay
19 from modularAnalysis import applyEventCuts
20 from modularAnalysis import variablesToHistogram
21 from modularAnalysis import rankByHighest
22 from modularAnalysis import rankByLowest
23 from modularAnalysis import cutAndCopyList
24 from modularAnalysis import variablesToEventExtraInfo
25 
26 # ..create path
27 mypath = b2.create_path()
28 
29 inputMdst('default', '/group/belle2/dataprod/MC/MC13a_local/mumu/mumu_eph3_2295.root', path=mypath)
30 
31 # ..Muon list. Require that there be two high-p tracks, and none with clusterE>1 GeV
32 fillParticleList('mu-:highp', 'useCMSFrame(p) > 3.5 and abs(d0) < 0.5 and abs(z0) < 4 and nCDCHits>0 and nVXDHits>0', path=mypath)
33 cutAndCopyList('mu-:highE', 'mu-:highp', 'clusterE>1.', path=mypath)
34 
35 variables.addAlias('nhighp', 'nParticlesInList(mu-:highp)')
36 variables.addAlias('nhighE', 'nParticlesInList(mu-:highE)')
37 applyEventCuts('[nhighE==0] and [nhighp==2]', mypath)
38 
39 # ..Combine two muons, requiring back to back and high invariant mass
40 variables.addAlias('deltaPhiCMS', 'formula(57.2957795*abs(daughterDiffOfPhiCMS(0, 1)))')
41 variables.addAlias('sumThetaCMS', 'formula(57.2957795*(daughter(0, useCMSFrame(theta)) + daughter(1, useCMSFrame(theta))))')
42 event_cut = '175 < sumThetaCMS < 185 and deltaPhiCMS > 175 and 9 < M < 11'
43 reconstructDecay('vpho:0 -> mu-:highp mu+:highp', event_cut, path=mypath)
44 
45 # ..Require a good muon pair
46 variables.addAlias('nPair', 'nParticlesInList(vpho:0)')
47 applyEventCuts('nPair==1', mypath)
48 
49 # ..Record the highest and lowest muonID of the two muons in the event
50 cutAndCopyList('mu-:muonID', 'mu-:highp', '', path=mypath)
51 rankByHighest('mu-:muonID', 'muonID', path=mypath)
52 
53 cutAndCopyList('mu-:bestID', 'mu-:muonID', 'extraInfo(muonID_rank)==1', path=mypath)
54 variablesToEventExtraInfo(particleList='mu-:bestID', variables={'muonID': 'bestID'}, path=mypath)
55 variables.addAlias('bestMuonID', 'eventExtraInfo(bestID)')
56 
57 cutAndCopyList('mu-:worstID', 'mu-:muonID', 'extraInfo(muonID_rank)==2', path=mypath)
58 variablesToEventExtraInfo(particleList='mu-:worstID', variables={'muonID': 'worstID'}, path=mypath)
59 variables.addAlias('worstMuonID', 'eventExtraInfo(worstID)')
60 
61 # ..Variables to store (per muon)
62 variables.addAlias('muThetaLab', 'formula(57.2957795*theta)')
63 variables.addAlias('muPhiLab', 'formula(57.2957795*phi)')
64 variables.addAlias('muPcms', 'useCMSFrame(p)')
65 variables.addAlias('muptLab', 'pt')
66 variables.addAlias('e1Uncorr', 'formula(clusterHighestE * clusterUncorrE / clusterE)')
67 variables.addAlias('clustThetaLab', 'formula(57.2957795*clusterTheta)')
68 variables.addAlias('clustPhiLab', 'formula(57.2957795*clusterPhi)')
69 
70 varsToStore = [
71  'charge',
72  'p',
73  'muPcms',
74  'muptLab',
75  'muThetaLab',
76  'muPhiLab',
77  'clusterE',
78  'e1Uncorr',
79  'clustThetaLab',
80  'clustPhiLab',
81  'HighLevelTrigger',
82  'muonID',
83  'bestMuonID',
84  'worstMuonID']
85 
86 # ..store to ntuple
87 outputName = "muPairAlignment.root"
88 narg = len(sys.argv)
89 if(narg == 2):
90  outputName = sys.argv[1]
91 mypath.add_module('VariablesToNtuple', particleList='mu-:highp', variables=varsToStore, fileName=outputName)
92 
93 
94 # ..Process
95 b2.process(mypath)
96 print(b2.statistics)