Belle II Software  release-05-02-19
validate.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 """
5 <header>
6  <output>timeDistributions.root</output>
7  <contact>marko.staric@ijs.si</contact>
8  <description>Runs BG mixer and makes validation histograms</description>
9 </header>
10 """
11 
12 from basf2 import *
13 import os
14 import glob
15 import math
16 from ROOT import Belle2
17 from ROOT import TH1F, TFile, TNamed
18 
19 set_random_seed(123452)
20 
21 
22 class BGHistogrammer(Module):
23 
24  '''
25  Make validation histograms for BG mixer.
26  '''
27 
28 
29  simHits = [
30  'PXDSimHits',
31  'SVDSimHits',
32  'CDCSimHits',
33  'TOPSimHits',
34  'ARICHSimHits',
35  'ECLHits',
36  'BKLMSimHits',
37  'EKLMSimHits',
38  ]
39 
40  n = len(simHits)
41 
42  def initialize(self):
43  ''' Initialize the Module: set histogram axis titles, description and check'''
44 
45 
46  self.hist = [TH1F('h' + str(i), self.simHits[i], 400, -20, 20) for i in range(self.n)]
47 
48  for i in range(self.n):
49  self.hist[i].GetXaxis().SetTitle('time [#mus]')
50  self.hist[i].GetYaxis().SetTitle('entries/bin')
51  descr = TNamed('Description', 'Time distribution of ' + self.simHits[i] +
52  ' for mixed background')
53  self.hist[i].GetListOfFunctions().Add(descr)
54  check = TNamed('Check', 'Distribution must be flat in the time window. ' +
55  'Bin statistics is not Poissonian.')
56  self.hist[i].GetListOfFunctions().Add(check)
57  contact = TNamed('Contact', 'marko.staric@ijs.si')
58  self.hist[i].GetListOfFunctions().Add(contact)
59  options = TNamed('MetaOptions', 'shifter')
60  self.hist[i].GetListOfFunctions().Add(options)
61 
62  def event(self):
63  ''' Event processor: fill histograms '''
64 
65  for i in range(self.n):
66  hits = Belle2.PyStoreArray(self.simHits[i])
67  for hit in hits:
68  time = hit.getGlobalTime() / 1000
69  self.hist[i].Fill(time)
70 
71  def setErrors(self, hist):
72  ''' Set bin errors - they are not Poissonian'''
73  hmax = hist.GetMaximum()
74  temp = TH1F('temp', 'temporary', 100, 0, hmax * 1.1)
75  for i in range(hist.GetNbinsX()):
76  h = hist.GetBinContent(i + 1)
77  if h > hmax * 0.2:
78  temp.Fill(h)
79  mean = temp.GetMean()
80  rms = temp.GetStdDev()
81  if mean > 0:
82  for i in range(hist.GetNbinsX()):
83  h = hist.GetBinContent(i + 1)
84  e = 0
85  if h > 0:
86  e = rms * math.sqrt(h / mean)
87  hist.SetBinError(i + 1, e)
88 
89  def terminate(self):
90  """ Write histograms to the file."""
91 
92  tfile = TFile('timeDistributions.root', 'recreate')
93  for i in range(self.n):
94  self.setErrors(self.hist[i])
95  self.hist[i].Write()
96  tfile.Close()
97 
98 
99 # Create path
100 main = create_path()
101 
102 # Set number of events to generate
103 eventinfosetter = register_module('EventInfoSetter')
104 eventinfosetter.param({'evtNumList': [100], 'runList': [1]})
105 main.add_module(eventinfosetter)
106 
107 # Gearbox: access to database (xml files)
108 gearbox = register_module('Gearbox')
109 main.add_module(gearbox)
110 
111 # Geometry
112 geometry = register_module('Geometry')
113 main.add_module(geometry)
114 
115 # mix beam background
116 bg = None
117 if 'BELLE2_BACKGROUND_MIXING_DIR' in os.environ:
118  bg = glob.glob(os.environ['BELLE2_BACKGROUND_MIXING_DIR'] + '/*.root')
119  if bg is None:
120  B2FATAL('No beam background samples found in folder ' +
121  os.environ['BELLE2_BACKGROUND_MIXING_DIR'])
122  B2INFO('Using background samples from ' + os.environ['BELLE2_BACKGROUND_MIXING_DIR'])
123  bkgmixer = register_module('BeamBkgMixer')
124  bkgmixer.param('backgroundFiles', bg)
125  main.add_module(bkgmixer)
126 else:
127  B2FATAL('variable BELLE2_BACKGROUND_MIXING_DIR is not set')
128 
129 # fill validation histograms
130 main.add_module(BGHistogrammer())
131 
132 # Show progress of processing
133 progress = register_module('Progress')
134 main.add_module(progress)
135 
136 # Process events
137 process(main)
138 
139 # Print call statistics
140 print(statistics)
validate.BGHistogrammer.n
n
length of simHits list
Definition: validate.py:40
validate.BGHistogrammer.initialize
def initialize(self)
Definition: validate.py:42
validate.BGHistogrammer.hist
hist
list of histograms
Definition: validate.py:46
validate.BGHistogrammer.event
def event(self)
Definition: validate.py:62
Belle2::PyStoreArray
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:58
validate.BGHistogrammer.simHits
list simHits
list of SimHits to be histogramed
Definition: validate.py:29
validate.BGHistogrammer
Definition: validate.py:22
validate.BGHistogrammer.terminate
def terminate(self)
Definition: validate.py:89
validate.BGHistogrammer.setErrors
def setErrors(self, hist)
Definition: validate.py:71