Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions newsfragments/873.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix `FormatMANDI.get_time_range_for_panel` giving the incorrect range in some cases.
64 changes: 27 additions & 37 deletions src/dxtbx/format/FormatMANDI.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from multiprocessing import Pool, cpu_count
from os.path import join
from sys import argv
from typing import Optional, Tuple

import h5py
import numpy as np
Expand Down Expand Up @@ -88,7 +89,7 @@ def get_experiment_description(self) -> str:
run_number = self.get_experiment_run_number()
return f"{title} ({run_number})"

def get_raw_data(self, index: int) -> tuple[flex.int]:
def get_raw_data(self, index: int) -> Tuple[flex.int]:
raw_data = []
panel_size = self._get_image_size()
for panel_name in self._get_panel_names():
Expand Down Expand Up @@ -234,7 +235,6 @@ def add_histogram_data_to_nxs_file(
) -> None:
tof_bins = FormatMANDI.generate_tof_bins(
nxs_file=nxs_file_path,
panel_size=panel_size,
delta_tof=delta_tof,
padding=tof_padding,
)
Expand Down Expand Up @@ -280,7 +280,7 @@ def delete_event_data(nxs_file, base_dir, panel_name):
output_path = join(output_path, spectra_output_name)
print(f"Writing spectra to {output_path}")
panel_spectra = FormatMANDI.generate_histogram_data_for_panel(
nxs_file, tof_bins, panel_size, panel_name, nproc
nxs_file, tof_bins, panel_size, panel_name
)
nxs_file.create_dataset(output_path, data=panel_spectra, compression="gzip")
if remove_event_data:
Expand Down Expand Up @@ -352,46 +352,37 @@ def generate_histogram_data_for_panel(

@staticmethod
def get_time_range_for_panel(
nxs_file: h5py.File, panel_size: tuple[float, float], panel_name: str
) -> tuple[float, float]:
"""
Returns the range of event times for a given panel
"""
nxs_file: h5py.File, panel_name: str
) -> Optional[Tuple[float, float]]:
event_index = nxs_file[f"entry/{panel_name}/event_index"][:]
event_time_zero = nxs_file[f"entry/{panel_name}/event_time_zero"][:]
event_time_offset = nxs_file[f"entry/{panel_name}/event_time_offset"][:]

def event_data_is_valid(event_id, event_time_offset):
if len(event_id) == 0 or len(event_time_offset) == 0:
return False
return len(event_id) == len(event_time_offset)
tofs_min = []
tofs_max = []

panel_number = FormatMANDI.get_panel_number(panel_name)
event_index = nxs_file[f"entry/{panel_name}/event_index"]
event_id = nxs_file[f"entry/{panel_name}/event_id"]
event_time_zero = nxs_file[f"entry/{panel_name}/event_time_zero"]
event_time_offset = nxs_file[f"entry/{panel_name}/event_time_offset"]
n_pulses = len(event_index) - 1

if not event_data_is_valid(event_id, event_time_offset):
return None, None
for p in range(n_pulses):
start = event_index[p]
stop = event_index[p + 1]

num_pixels = panel_size[0] * panel_size[1]
event_id_offset = panel_number * num_pixels - 1
if start == stop:
continue

raw_event_id = event_id[event_index[0]]
corrected_event_id = raw_event_id - event_id_offset
min_event_time = event_time_zero[0] + event_time_offset[corrected_event_id]
T0 = event_time_zero[p]
offsets = event_time_offset[start:stop]

max_idx = int(event_index[-1] - 1)
raw_event_id = event_id[max_idx]
corrected_event_id = raw_event_id - event_id_offset
max_event_time = (
event_time_zero[max_idx] + event_time_offset[corrected_event_id]
)
tofs_min.append(T0 + np.min(offsets))
tofs_max.append(T0 + np.max(offsets))

if not tofs_min:
return None, None

return min_event_time, max_event_time
return min(tofs_min), max(tofs_max)

@staticmethod
def get_time_range_for_dataset(
nxs_file_path: str, panel_size: tuple[int, int]
) -> tuple[float, float]:
def get_time_range_for_dataset(nxs_file_path: str) -> tuple[float, float]:
"""
Iterates over num_panels to find the overall min/max tof event recorded
"""
Expand All @@ -408,7 +399,7 @@ def get_time_range_for_dataset(
for panel_name in panel_names:
try:
min_event_time, max_event_time = FormatMANDI.get_time_range_for_panel(
nxs_file, panel_size, panel_name
nxs_file, panel_name
)
if min_event_time is None or max_event_time is None:
# Some banks contain no data
Expand All @@ -428,7 +419,6 @@ def get_time_range_for_dataset(
@staticmethod
def generate_tof_bins(
nxs_file: str,
panel_size: tuple[float, float],
delta_tof: float = 50,
padding: float = 100,
) -> np.ndarray:
Expand All @@ -437,7 +427,7 @@ def generate_tof_bins(
padding: float (usec)
"""

min_tof, max_tof = FormatMANDI.get_time_range_for_dataset(nxs_file, panel_size)
min_tof, max_tof = FormatMANDI.get_time_range_for_dataset(nxs_file)
min_tof = min_tof - padding
max_tof = max_tof + padding
print(
Expand Down