mirror of
https://github.com/paulscherrerinstitute/sf_daq_buffer.git
synced 2026-05-08 10:32:03 +02:00
Moved python scripts to sf_utils
This commit is contained in:
@@ -1,150 +0,0 @@
|
||||
import numpy
|
||||
import logging
|
||||
from argparse import ArgumentParser
|
||||
from ctypes import *
|
||||
|
||||
FOLDER_MOD = 100000
|
||||
FILE_MOD = 1000
|
||||
FILE_EXTENSION = ".bin"
|
||||
MODULE_X_SIZE = 1024
|
||||
MODULE_Y_SIZE = 512
|
||||
MODULE_N_PIXELS = MODULE_X_SIZE * MODULE_Y_SIZE
|
||||
MODULE_N_BYTES = MODULE_N_PIXELS * 2
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class BufferBinaryFormat(Structure):
|
||||
_pack_ = 1
|
||||
_fields_ = [("FORMAT_MARKER", c_char),
|
||||
("pulse_id", c_uint64),
|
||||
("frame_index", c_uint64),
|
||||
("daq_rec", c_uint64),
|
||||
("n_recv_packets", c_uint64),
|
||||
("module_id", c_uint64),
|
||||
("data", c_byte * MODULE_N_BYTES)]
|
||||
|
||||
|
||||
class BinaryBufferReader(object):
|
||||
def __init__(self, root_folder, n_modules):
|
||||
self.root_folder = root_folder
|
||||
self.n_modules = n_modules
|
||||
|
||||
def read_pulse_id(self, pulse_id):
|
||||
|
||||
index_in_file = get_file_frame_index(pulse_id)
|
||||
n_bytes_offset = int(index_in_file * sizeof(BufferBinaryFormat))
|
||||
n_bytes_to_read = sizeof(BufferBinaryFormat)
|
||||
|
||||
metadata = {"pulse_id": 0,
|
||||
"frame_index": 0,
|
||||
"daq_rec": 0,
|
||||
"is_good_frame": True}
|
||||
|
||||
data = numpy.zeros(shape=[self.n_modules * MODULE_N_BYTES],
|
||||
dtype="byte")
|
||||
|
||||
metadata_init = False
|
||||
|
||||
for i_module in range(self.n_modules):
|
||||
device_name = "M%02d" % i_module
|
||||
|
||||
filename = get_filename(
|
||||
root_folder=self.root_folder,
|
||||
device_name=device_name,
|
||||
pulse_id=pulse_id)
|
||||
|
||||
with open(filename, 'rb') as input_file:
|
||||
input_file.seek(n_bytes_offset)
|
||||
frame_buffer = BufferBinaryFormat.from_buffer_copy(
|
||||
input_file.read(n_bytes_to_read))
|
||||
|
||||
output_prefix = "[pulse_id %s module %d] " % (pulse_id, i_module)
|
||||
|
||||
if frame_buffer.FORMAT_MARKER == b'\xBE':
|
||||
is_good_frame = frame_buffer.n_recv_packets == 128
|
||||
|
||||
if is_good_frame:
|
||||
if not metadata_init:
|
||||
metadata["pulse_id"] = frame_buffer.pulse_id
|
||||
metadata["frame_index"] = frame_buffer.frame_index
|
||||
metadata["daq_rec"] = frame_buffer.daq_rec
|
||||
|
||||
metadata_init = True
|
||||
|
||||
if metadata["is_good_frame"]:
|
||||
if metadata["pulse_id"] != frame_buffer.pulse_id:
|
||||
_logger.debug(output_prefix +
|
||||
"Mismatch pulse_id " +
|
||||
metadata["pulse_id"])
|
||||
|
||||
metadata["is_good_frame"] = False
|
||||
|
||||
if metadata["frame_index"] != frame_buffer.frame_index:
|
||||
metadata["is_good_frame"] = False
|
||||
|
||||
if metadata["daq_rec"] != frame_buffer.daq_rec:
|
||||
_logger.debug(output_prefix +
|
||||
"Mismatch daq_rec " +
|
||||
metadata["daq_rec"])
|
||||
|
||||
metadata["is_good_frame"] = False
|
||||
else:
|
||||
metadata["is_good_frame"] = False
|
||||
_logger.debug(output_prefix +
|
||||
"n_lost_packets " +
|
||||
128 - frame_buffer.n_recv_packets)
|
||||
|
||||
start_byte_image = MODULE_N_BYTES * i_module
|
||||
stop_byte_image = start_byte_image + MODULE_N_BYTES
|
||||
|
||||
frame_data = numpy.array(frame_buffer.data, dtype="bytes")
|
||||
data[start_byte_image:stop_byte_image] = frame_data
|
||||
|
||||
else:
|
||||
metadata["is_good_frame"] = False
|
||||
_logger.debug(output_prefix + "no data in buffer")
|
||||
|
||||
if not metadata_init:
|
||||
metadata["is_good_frame"] = False
|
||||
|
||||
data_shape = [self.n_modules * MODULE_Y_SIZE, MODULE_X_SIZE]
|
||||
return metadata, data.view("uint16").reshape(data_shape)
|
||||
|
||||
|
||||
def get_file_frame_index(pulse_id):
|
||||
file_base = int((pulse_id // FILE_MOD) * FILE_MOD)
|
||||
return pulse_id - file_base
|
||||
|
||||
|
||||
def get_filename(root_folder, device_name, pulse_id):
|
||||
folder_base = int((pulse_id // FOLDER_MOD) * FOLDER_MOD)
|
||||
file_base = int((pulse_id // FILE_MOD) * FILE_MOD)
|
||||
|
||||
return "%s/%s/%s/%s%s" % (root_folder,
|
||||
device_name,
|
||||
folder_base,
|
||||
file_base,
|
||||
FILE_EXTENSION)
|
||||
|
||||
|
||||
def main():
|
||||
parser = ArgumentParser(description='Read DAQ Binary Buffer')
|
||||
parser.add_argument('root_folder', type=str,
|
||||
help="Absolute path to root folder of device.")
|
||||
parser.add_argument('n_modules', type=int,
|
||||
help="Number of modules to read from this device.")
|
||||
parser.add_argument('pulse_id', type=int,
|
||||
help="Pulse_id to retrieve.")
|
||||
|
||||
arguments = parser.parse_args()
|
||||
|
||||
reader = BinaryBufferReader(arguments.root_folder,
|
||||
arguments.n_modules)
|
||||
|
||||
metadata, data = reader.read_pulse_id(arguments.pulse_id)
|
||||
print(metadata)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,62 +0,0 @@
|
||||
from argparse import ArgumentParser
|
||||
from BinaryBufferReader import BinaryBufferReader
|
||||
|
||||
import numpy
|
||||
import h5py
|
||||
|
||||
def main():
|
||||
parser = ArgumentParser(description='Verify final H5 file against buffer.')
|
||||
|
||||
parser.add_argument('h5_filename', type=str,
|
||||
help="Input file to verify.")
|
||||
|
||||
parser.add_argument('--base_folder', type=str,
|
||||
default="/gpfs/photonics/swissfel/buffer",
|
||||
help="Absolute path to root folder of device.")
|
||||
|
||||
arguments = parser.parse_args()
|
||||
|
||||
file = h5py.File(arguments.h5_filename, 'r')
|
||||
detector_name = list(file['data'])[0]
|
||||
n_modules = file["/data/" + detector_name + "/data"][0].shape[0] // 512
|
||||
|
||||
reader = BinaryBufferReader(arguments.base_folder + "/" + detector_name,
|
||||
n_modules)
|
||||
|
||||
input_data = file["/data/" + detector_name + "/data"]
|
||||
input_pulse_id = file["/data/" + detector_name + "/pulse_id"]
|
||||
input_frame_index = file["/data/" + detector_name + "/frame_index"]
|
||||
input_daq_rec = file["/data/" + detector_name + "/daq_rec"]
|
||||
input_is_good_frame = file["/data/" + detector_name + "/is_good_frame"]
|
||||
|
||||
for i in range(input_pulse_id.shape[0]):
|
||||
pulse_id = input_pulse_id[i][0]
|
||||
frame_index = input_frame_index[i][0]
|
||||
daq_rec = input_daq_rec[i][0]
|
||||
is_good_frame = bool(input_is_good_frame[i][0])
|
||||
|
||||
meta, data = reader.read_pulse_id(pulse_id)
|
||||
|
||||
if pulse_id != meta["pulse_id"]:
|
||||
print("pulse_id mismatch",
|
||||
"expected", pulse_id, "got", meta["pulse_id"])
|
||||
|
||||
if frame_index != meta["frame_index"]:
|
||||
print("frame_index mismatch"
|
||||
"expected", frame_index, "got", meta["frame_index"])
|
||||
|
||||
if daq_rec != meta["daq_rec"]:
|
||||
print("daq_rec mismatch"
|
||||
"expected", daq_rec, "got", meta["daq_rec"])
|
||||
|
||||
if is_good_frame != meta["is_good_frame"]:
|
||||
print("is_good_frame mismatch"
|
||||
"expected", is_good_frame, "got", meta["is_good_frame"])
|
||||
|
||||
numpy.testing.assert_array_equal(input_data[i], data)
|
||||
|
||||
print("pulse_id", pulse_id, "verification completed.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user