Belle II Software  release-06-01-15
BKLMMuonPlot.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 
18 
19 """
20 <header>
21  <input>muon-KLMValidation.root</input>
22  <contact>martina.laurenza@roma3.infn.it</contact>
23  <description>Create validation plots for BKLM</description>
24 </header>
25 """
26 
27 import sys
28 import argparse
29 
30 import ROOT
31 ROOT.gROOT.SetBatch(ROOT.kTRUE) # noqa
32 
33 from ROOT import TFile, TChain, TH1F, TNamed, gStyle, PyConfig # noqa
34 PyConfig.IgnoreCommandLineOptions = True # noqa
35 
36 # contact person information
37 # is added to the plot descriptions
38 CONTACT_PERSON = {'Name': 'Martina Laurenza',
39  'Email': 'martina.laurenza@roma3.infn.it'}
40 
41 
42 def main():
43  """
44  Create validation plots for BKLM.
45  """
46  print('Creating the BKLM validation plots...')
47 
48  parser = argparse.ArgumentParser()
49 
50  parser.add_argument('-i', '--input-file', dest='input_file',
51  default='../muon-KLMValidation.root',
52  help='Root file with Ext/Muid/BKLM/EKLM validation data.'
53  )
54  parser.add_argument('-o', '--output-file', dest='output_file',
55  default='BKLMMuon.root',
56  help='Root file with BKLM validation histograms.')
57 
58  args = parser.parse_args()
59 
60  # load chain of input files
61  file_chain = TChain('tree')
62  file_chain.Add(args.input_file)
63 
64  number_entries = 0
65  try:
66  number_entries = file_chain.GetEntries()
67  except AttributeError:
68  print('Could not load input file(s) %s.' % args.input_file)
69 
70  if number_entries == 0:
71  print('Data tree is empty or does not exist in file(s) %s. Exit.' % args.input_file)
72  sys.exit(0)
73 
74  # open the output root file
75  output_root_file = TFile(args.output_file, 'recreate')
76 
77  # create and draw histograms
78  gStyle.SetOptStat(0)
79  draw_bklmhists(file_chain)
80 
81  # close the output file
82  output_root_file.Write()
83  output_root_file.Close()
84 
85  print('BKLM validation plots created.')
86 
87 
88 # NOTE: *.Draw() must precede *.GetListOfFunctions().Add() or the latter will be discarded!
89 def draw_bklmhists(file_chain):
90  """
91  Draw the BKLMHit2d-related distributions.
92  """
93 
94  contact = 'Martina Laurenza (martina.laurenza@roma3.infn.it)'
95 
96  # Shifter plots
97 
98  inRPC = TH1F('InRPC', 'InRPC for BKLMHit2ds', 2, -0.5, 1.5)
99  file_chain.Draw('BKLMHit2ds.inRPC()>>InRPC', '')
100  inRPC.GetXaxis().SetTitle('0=scintillator 1=RPC')
101  inRPC.GetListOfFunctions().Add(TNamed('Description', 'Flag indicating if a muon hit is in scintillator (0) or RPC (1)'))
102  inRPC.GetListOfFunctions().Add(TNamed('Check', 'Mostly in RPC.'))
103  inRPC.GetListOfFunctions().Add(TNamed('Contact', contact))
104  inRPC.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=0.50,pvalue-error=0.10'))
105  inRPC.SetMinimum(0.0)
106  inRPC.Write()
107 
108  section = TH1F('Forward', 'Section for BKLMHit2ds', 2, -0.5, 1.5)
109  file_chain.Draw('BKLMHit2ds.getSection()>>Forward', '')
110  section.GetXaxis().SetTitle('0=backward 1=forward')
111  section.GetListOfFunctions().Add(TNamed('Description',
112  'Flag indicating if a muon hit is in backward (0) or forward (1) BKLM'))
113  section.GetListOfFunctions().Add(TNamed('Check', 'More hits in the backward.'))
114  section.GetListOfFunctions().Add(TNamed('Contact', contact))
115  section.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=0.50,pvalue-error=0.10'))
116  section.SetMinimum(0.0)
117  section.Write()
118 
119  isOnTrack = TH1F('IsOnTrack', 'IsOnTrack for BKLMHit2ds', 2, -0.5, 1.5)
120  file_chain.Draw('BKLMHit2ds.isOnTrack()>>IsOnTrack', '')
121  isOnTrack.GetXaxis().SetTitle('0=not associated with Track 1=associated with Track')
122  isOnTrack.GetListOfFunctions().Add(TNamed('Description',
123  'Flag indicating if a muon hit is associated with a CDC Track by Muid'))
124  isOnTrack.GetListOfFunctions().Add(TNamed('Check', 'Mostly associated.'))
125  isOnTrack.GetListOfFunctions().Add(TNamed('Contact', contact))
126  isOnTrack.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=0.50,pvalue-error=0.10'))
127  isOnTrack.SetMinimum(0.0)
128  isOnTrack.Write()
129 
130  sector = TH1F('Sector', 'Sector for BKLMHit2ds', 10, -0.5, 9.5)
131  file_chain.Draw('BKLMHit2ds.getSector()>>Sector', '')
132  sector.GetXaxis().SetTitle('Sector #')
133  sector.GetListOfFunctions().Add(TNamed('Description', 'Sector number of muon hit'))
134  sector.GetListOfFunctions().Add(TNamed('Check', 'Roughly flat in sectors 1-8.'))
135  sector.GetListOfFunctions().Add(TNamed('Contact', contact))
136  sector.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=1.00,pvalue-error=0.01'))
137  sector.SetMinimum(0.0)
138  sector.Write()
139 
140  layer = TH1F('Layer', 'Layer for BKLMHit2ds', 17, -0.5, 16.5)
141  file_chain.Draw('BKLMHit2ds.getLayer()>>Layer', '')
142  layer.GetXaxis().SetTitle('Layer #')
143  layer.GetListOfFunctions().Add(TNamed('Description', 'Layer number of muon hit'))
144  layer.GetListOfFunctions().Add(TNamed('Check',
145  'First peak at layer 1 and second (higher) peak at layer 2, with tail above those.'))
146  layer.GetListOfFunctions().Add(TNamed('Contact', contact))
147  layer.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=1.0,pvalue-error=0.01'))
148  layer.SetMinimum(0.0)
149  layer.Write()
150 
151  phistrip = TH1F('PhiStrip', 'PhiStrip for BKLMHit2ds', 50, -0.5, 49.5)
152  file_chain.Draw('BKLMHit2ds.getPhiStripAve()>>PhiStrip', '')
153  phistrip.GetXaxis().SetTitle('Phi strip #')
154  phistrip.GetListOfFunctions().Add(TNamed('Description', 'Strip number in phi plane of muon hit'))
155  phistrip.GetListOfFunctions().Add(TNamed('Check',
156  'Roughly flat for 1-36 (all layers) and then for 37-48 (layers 6-15).'))
157  phistrip.GetListOfFunctions().Add(TNamed('Contact', contact))
158  phistrip.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=1.00,pvalue-error=0.01'))
159  phistrip.SetMinimum(0.0)
160  phistrip.Write()
161 
162  zstrip = TH1F('ZStrip', 'ZStrip for BKLMHit2ds', 60, -0.5, 59.5)
163  file_chain.Draw('BKLMHit2ds.getZStripAve()>>ZStrip', '')
164  zstrip.GetXaxis().SetTitle('Z strip #')
165  zstrip.GetListOfFunctions().Add(TNamed('Description', 'Strip number in z plane of muon hit'))
166  zstrip.GetListOfFunctions().Add(TNamed('Check',
167  'Downward-sloping for 1-48 (all layers), shoulder for 49-54 (layers 1-2).'))
168  zstrip.GetListOfFunctions().Add(TNamed('Contact', contact))
169  zstrip.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=1.00,pvalue-error=0.01'))
170  zstrip.SetMinimum(0.0)
171  zstrip.Write()
172 
173  timeRPC = TH1F('TimeRPC', 'Hit time for BKLMHit2ds in RPCs', 100, -0.5, 1.5)
174  file_chain.Draw('BKLMHit2ds.getTime()>>TimeRPC', 'BKLMHit2ds.inRPC()==1')
175  timeRPC.GetXaxis().SetTitle('t (ns)')
176  timeRPC.GetListOfFunctions().Add(TNamed('Description', 'Time of muon hit in RPCs'))
177  timeRPC.GetListOfFunctions().Add(TNamed('Check', 'Narrow peak at 0 ns.'))
178  timeRPC.GetListOfFunctions().Add(TNamed('Contact', contact))
179  timeRPC.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=1.00,pvalue-error=0.01'))
180  timeRPC.Write()
181 
182  timeSci = TH1F('TimeSci', 'Hit time for BKLMHit2ds in scintillators', 150, 0, 15.0)
183  file_chain.Draw('BKLMHit2ds.getTime()>>TimeSci', 'BKLMHit2ds.inRPC()==0')
184  timeSci.GetXaxis().SetTitle('t (ns)')
185  timeSci.GetListOfFunctions().Add(TNamed('Description', 'Time of muon hit in scintillators'))
186  timeSci.GetListOfFunctions().Add(TNamed('Check',
187  'Broad peak mainly between 2 ns and 8 ns, with the mean around 3.5 ns.'))
188  timeSci.GetListOfFunctions().Add(TNamed('Contact', contact))
189  timeSci.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=1.00,pvalue-error=0.01'))
190  timeSci.Write()
191 
192  nPE = TH1F('nGenPE', 'Generated PE in BKLM', 200, 0.0, 200)
193  file_chain.Draw('KLMDigits.getNGeneratedPhotoelectrons()>>nGenPE', 'KLMDigits.getSubdetector()==1 && KLMDigits.getLayer() < 3')
194  nPE.GetXaxis().SetTitle('# generated PE')
195  nPE.GetListOfFunctions().Add(TNamed('Description', 'Number of generated photoelectrons in BKLM'))
196  nPE.GetListOfFunctions().Add(TNamed('Check', 'Peak around 50.'))
197  nPE.GetListOfFunctions().Add(TNamed('Contact', contact))
198  nPE.GetListOfFunctions().Add(TNamed('MetaOptions', ''))
199  nPE.Write()
200 
201  # Expert plots
202 
203  edep = TH1F('EnergyDeposit', 'Energy deposition for BKLMHit2ds', 260, -1.0, 25.0)
204  file_chain.Draw('BKLMHit2ds.getEnergyDeposit()*1000.0>>EnergyDeposit', '')
205  edep.GetXaxis().SetTitle('E (keV)')
206  edep.GetListOfFunctions().Add(TNamed('Description', 'dE/dx energy deposition of muon hit'))
207  edep.GetListOfFunctions().Add(TNamed('Check', 'Peak near 3 keV.'))
208  edep.GetListOfFunctions().Add(TNamed('Contact', contact))
209  edep.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=1.00,pvalue-error=0.01'))
210  edep.Write()
211 
212 
213 # Entry point of this script: call the main() function
214 if __name__ == '__main__':
215  main()
int main(int argc, char **argv)
Run all tests.
Definition: test_main.cc:75