Belle II Software  release-05-01-25
top_packer_unpacker.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 from basf2 import *
5 from ROOT import Belle2
6 from simulation import add_simulation
7 import os
8 import numpy
9 
10 
11 set_random_seed(12345)
12 
13 
14 class DigitsTest(Module):
15 
16  """
17  module which ckecks if two collections of TOPDigits are equal
18  """
19 
20  def sortDigits(self, unsortedPyStoreArray):
21  """
22  Use some digit information to sort the digits
23  Returns a python-list containing the sorted digits
24  """
25 
26  # first convert to a python-list to be able to sort
27  py_list = [x for x in unsortedPyStoreArray]
28 
29  # sort via a hierachy of sort keys
30  return sorted(
31  py_list,
32  key=lambda x: (
33  x.getModuleID(),
34  x.getChannel(),
35  x.getRawTime())
36  )
37 
38  def event(self):
39  """
40  load original TOPDigits and the packed/unpacked ones, sort and compare them
41  """
42 
43  # direct from simulation
44  digits = Belle2.PyStoreArray("TOPDigits")
45  # processed by packer and unpacker
46  digitsUnpacked = Belle2.PyStoreArray("TOPDigitsUnpacked")
47 
48  # sort digits
49  digits_sorted = self.sortDigits(digits)
50  digitsUnpacked_sorted = self.sortDigits(digitsUnpacked)
51 
52  # check the sizes
53  if not len(digits_sorted) == len(digitsUnpacked_sorted):
54  print('size: ', len(digits_sorted), len(digitsUnpacked_sorted))
55  B2FATAL("TOPDigits: size not equal after packing and unpacking")
56 
57  # check all quantities between the direct and the packed/unpacked
58  precision = 0.0001 # precision for floats (e.g. in [ns])
59  for i in range(len(digits_sorted)):
60 
61  digit = digits_sorted[i]
62  digitUnpacked = digitsUnpacked_sorted[i]
63 
64  # check the content of the digit
65  assert digit.getModuleID() == digitUnpacked.getModuleID()
66  assert digit.getPixelID() == digitUnpacked.getPixelID()
67  assert digit.getChannel() == digitUnpacked.getChannel()
68  assert digit.getRawTime() == digitUnpacked.getRawTime()
69  assert abs(digit.getTime() - digitUnpacked.getTime()) < precision
70  assert abs(digit.getTimeError() - digitUnpacked.getTimeError()) < precision
71  assert digit.getPulseHeight() == digitUnpacked.getPulseHeight()
72  assert abs(digit.getPulseWidth() - digitUnpacked.getPulseWidth()) < precision
73  # assert digit.getIntegral() == digitUnpacked.getIntegral()
74  assert digit.getFirstWindow() == digitUnpacked.getFirstWindow()
75  assert digit.getHitQuality() == digitUnpacked.getHitQuality()
76  assert digit.getStatus() == digitUnpacked.getStatus()
77  assert digit.isChargeShare() == digitUnpacked.isChargeShare()
78  assert digit.isPrimaryChargeShare() == digitUnpacked.isPrimaryChargeShare()
79 
80 
81 class RawDigitsTest(Module):
82 
83  """
84  module which ckecks if two collections of TOPRawDigits are equal
85  """
86 
87  def sortDigits(self, unsortedPyStoreArray):
88  """
89  Use some digit information to sort the digits
90  Returns a python-list containing the sorted digits
91  """
92 
93  # first convert to a python-list to be able to sort
94  py_list = [x for x in unsortedPyStoreArray]
95 
96  # sort via a hierachy of sort keys
97  return sorted(
98  py_list,
99  key=lambda x: (
100  x.getScrodID(),
101  x.getCarrierNumber(),
102  x.getASICNumber(),
103  x.getASICChannel(),
104  x.getSampleRise())
105  )
106 
107  def event(self):
108  """
109  load original TOPRawDigits and the packed/unpacked ones, sort and compare them
110  """
111 
112  # direct from simulation
113  digits = Belle2.PyStoreArray("TOPRawDigits")
114  # processed by packer and unpacker
115  digitsUnpacked = Belle2.PyStoreArray("TOPRawDigitsUnpacked")
116 
117  # sort digits
118  digits_sorted = self.sortDigits(digits)
119  digitsUnpacked_sorted = self.sortDigits(digitsUnpacked)
120 
121  # check the sizes
122  if not len(digits_sorted) == len(digitsUnpacked_sorted):
123  print('size: ', len(digits_sorted), len(digitsUnpacked_sorted))
124  B2FATAL("TOPRawDigits: size not equal after packing and unpacking")
125 
126  # check all quantities between the direct and the packed/unpacked
127  for i in range(len(digits_sorted)):
128 
129  digit = digits_sorted[i]
130  digitUnpacked = digitsUnpacked_sorted[i]
131 
132  # check the content of the digit
133  assert digit.getScrodID() == digitUnpacked.getScrodID()
134  assert digit.getCarrierNumber() == digitUnpacked.getCarrierNumber()
135  assert digit.getASICNumber() == digitUnpacked.getASICNumber()
136  assert digit.getASICChannel() == digitUnpacked.getASICChannel()
137  assert digit.getASICWindow() == digitUnpacked.getASICWindow()
138  assert digit.getTFine() == digitUnpacked.getTFine()
139  assert digit.getSampleRise() == digitUnpacked.getSampleRise()
140  assert digit.getDeltaSamplePeak() == digitUnpacked.getDeltaSamplePeak()
141  assert digit.getDeltaSampleFall() == digitUnpacked.getDeltaSampleFall()
142  assert digit.getValueRise0() == digitUnpacked.getValueRise0()
143  assert digit.getValueRise1() == digitUnpacked.getValueRise1()
144  assert digit.getValuePeak() == digitUnpacked.getValuePeak()
145  assert digit.getValueFall0() == digitUnpacked.getValueFall0()
146  assert digit.getValueFall1() == digitUnpacked.getValueFall1()
147  # assert digit.getIntegral() == digitUnpacked.getIntegral()
148  assert digit.getRevo9Counter() == digitUnpacked.getRevo9Counter()
149  assert digit.getPhase() == digitUnpacked.getPhase()
150  assert digit.getErrorFlags() == digitUnpacked.getErrorFlags()
151  assert digit.getDataType() == digitUnpacked.getDataType()
152 
153 
154 main = create_path()
155 
156 eventinfosetter = register_module('EventInfoSetter')
157 eventinfosetter.param({'evtNumList': [10]})
158 main.add_module(eventinfosetter)
159 
160 particlegun = register_module('ParticleGun')
161 particlegun.param('pdgCodes', [13, -13])
162 particlegun.param('nTracks', 10)
163 main.add_module(particlegun)
164 
165 add_simulation(main, components=['TOP'])
166 set_module_parameters(main, type="Geometry", useDB=False, components=["TOP"])
167 
168 Packer = register_module('TOPPacker')
169 main.add_module(Packer)
170 
171 unPacker = register_module('TOPUnpacker')
172 unPacker.param('outputRawDigitsName', 'TOPRawDigitsUnpacked')
173 unPacker.param('outputDigitsName', 'TOPDigitsUnpacked')
174 main.add_module(unPacker)
175 
176 converter = register_module('TOPRawDigitConverter')
177 converter.param('inputRawDigitsName', 'TOPRawDigitsUnpacked')
178 converter.param('outputDigitsName', 'TOPDigitsUnpacked')
179 converter.param('minPulseWidth', 0.0)
180 converter.param('maxPulseWidth', 1000.0)
181 main.add_module(converter)
182 
183 main.add_module(RawDigitsTest())
184 main.add_module(DigitsTest())
185 
186 progress = register_module('Progress')
187 main.add_module(progress)
188 
189 process(main)
190 print(statistics)
top_packer_unpacker.RawDigitsTest
Definition: top_packer_unpacker.py:81
top_packer_unpacker.DigitsTest
Definition: top_packer_unpacker.py:14
top_packer_unpacker.DigitsTest.event
def event(self)
Definition: top_packer_unpacker.py:38
top_packer_unpacker.RawDigitsTest.event
def event(self)
Definition: top_packer_unpacker.py:107
top_packer_unpacker.DigitsTest.sortDigits
def sortDigits(self, unsortedPyStoreArray)
Definition: top_packer_unpacker.py:20
Belle2::PyStoreArray
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:58
top_packer_unpacker.RawDigitsTest.sortDigits
def sortDigits(self, unsortedPyStoreArray)
Definition: top_packer_unpacker.py:87