Belle II Software  release-08-01-10
top_digits_raw_digits.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 import basf2 as b2
13 from ROOT import Belle2
14 from simulation import add_simulation
15 
16 
17 b2.set_random_seed(12345)
18 
19 
20 class DigitTest(b2.Module):
21 
22  """
23  module which ckecks if two collections of TOPDigits are equal
24  """
25 
26  def sortDigits(self, unsortedPyStoreArray):
27  """
28  Use some digit information to sort the digits
29  Returns a python-list containing the sorted digits
30  """
31 
32  # first convert to a python-list to be able to sort
33  py_list = [x for x in unsortedPyStoreArray]
34 
35  # sort via a hierachy of sort keys
36  return sorted(
37  py_list,
38  key=lambda x: (
39  x.getModuleID(),
40  x.getChannel(),
41  x.getRawTime())
42  )
43 
44  def event(self):
45  """
46  load original TOPDigits and the packed/unpacked ones, sort and compare them
47  """
48 
49  # direct from simulation
50  digits = Belle2.PyStoreArray("TOPDigits")
51  # processed by packer and unpacker
52  digitsUnpacked = Belle2.PyStoreArray("TOPDigitsUnpacked")
53 
54  # sort digits
55  digits_sorted = self.sortDigitssortDigits(digits)
56  digitsUnpacked_sorted = self.sortDigitssortDigits(digitsUnpacked)
57 
58  # check the sizes
59  if not len(digits_sorted) == len(digitsUnpacked_sorted):
60  b2.B2FATAL("TOPDigits: size not equal after packing and unpacking")
61 
62  # check all quantities between the direct and the packed/unpacked
63  precision = 0.0001 # precision for floats (e.g. in [ns])
64  for i in range(len(digits_sorted)):
65  digit = digits_sorted[i]
66  digitUnpacked = digitsUnpacked_sorted[i]
67 
68  # check the content of the digit
69  assert digit.getModuleID() == digitUnpacked.getModuleID()
70  assert digit.getPixelID() == digitUnpacked.getPixelID()
71  assert digit.getChannel() == digitUnpacked.getChannel()
72  assert digit.getRawTime() == digitUnpacked.getRawTime()
73  assert abs(digit.getTime() - digitUnpacked.getTime()) < precision
74  assert abs(digit.getTimeError() - digitUnpacked.getTimeError()) < precision
75  assert digit.getPulseHeight() == digitUnpacked.getPulseHeight()
76  assert abs(digit.getPulseWidth() - digitUnpacked.getPulseWidth()) < precision
77  assert digit.getIntegral() == digitUnpacked.getIntegral()
78  assert digit.getFirstWindow() == digitUnpacked.getFirstWindow()
79  assert digit.getHitQuality() == digitUnpacked.getHitQuality()
80  assert digit.getStatus() == digitUnpacked.getStatus()
81  assert digit.isChargeShare() == digitUnpacked.isChargeShare()
82  assert digit.isPrimaryChargeShare() == digitUnpacked.isPrimaryChargeShare()
83 
84 
85 main = b2.create_path()
86 
87 eventinfosetter = b2.register_module('EventInfoSetter')
88 eventinfosetter.param({'evtNumList': [10]})
89 main.add_module(eventinfosetter)
90 
91 particlegun = b2.register_module('ParticleGun')
92 particlegun.param('pdgCodes', [13, -13])
93 particlegun.param('nTracks', 10)
94 main.add_module(particlegun)
95 
96 add_simulation(main, components=['TOP'])
97 b2.set_module_parameters(main, type="Geometry", useDB=False, components=["TOP"])
98 
99 converter = b2.register_module('TOPRawDigitConverter')
100 converter.param('outputDigitsName', 'TOPDigitsUnpacked')
101 converter.param('minPulseWidth', 0.0)
102 converter.param('maxPulseWidth', 1000.0)
103 main.add_module(converter)
104 
105 main.add_module(DigitTest())
106 
107 progress = b2.register_module('Progress')
108 main.add_module(progress)
109 
110 b2.process(main)
111 print(b2.statistics)
A (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:72
def sortDigits(self, unsortedPyStoreArray)