From fb5273d8daba9122eec252d1ac7a865e4b61e830 Mon Sep 17 00:00:00 2001 From: Bing Li <104096768+bingli621@users.noreply.github.com> Date: Sat, 31 Aug 2024 18:08:58 -0400 Subject: [PATCH] updated scan class --- src/tavi/data/nexus_reader.py | 161 ------------ src/tavi/data/scan.py | 32 ++- src/tavi/data/scan_reader.py | 252 +++++++++++++++++++ src/tavi/data/tavi.py | 22 +- test_data/IPTS32124_CG4C_exp0424/scan0001.h5 | Bin 75016 -> 75016 bytes test_data/IPTS32124_CG4C_exp0424/scan0002.h5 | Bin 108264 -> 108264 bytes test_data/IPTS32124_CG4C_exp0424/scan0003.h5 | Bin 108264 -> 108264 bytes test_data/IPTS32124_CG4C_exp0424/scan0004.h5 | Bin 108264 -> 108264 bytes test_data/IPTS32124_CG4C_exp0424/scan0005.h5 | Bin 87344 -> 87344 bytes test_data/IPTS32124_CG4C_exp0424/scan0006.h5 | Bin 108264 -> 108264 bytes test_data/IPTS32124_CG4C_exp0424/scan0007.h5 | Bin 108264 -> 108264 bytes test_data/IPTS32124_CG4C_exp0424/scan0008.h5 | Bin 87344 -> 87344 bytes test_data/IPTS32124_CG4C_exp0424/scan0009.h5 | Bin 108264 -> 108264 bytes test_data/IPTS32124_CG4C_exp0424/scan0010.h5 | Bin 90768 -> 90768 bytes test_data/IPTS32124_CG4C_exp0424/scan0011.h5 | Bin 84424 -> 84424 bytes test_data/IPTS32124_CG4C_exp0424/scan0012.h5 | Bin 84488 -> 84488 bytes test_data/IPTS32124_CG4C_exp0424/scan0013.h5 | Bin 84488 -> 84488 bytes test_data/IPTS32124_CG4C_exp0424/scan0014.h5 | Bin 84424 -> 84424 bytes test_data/IPTS32124_CG4C_exp0424/scan0015.h5 | Bin 84424 -> 84424 bytes test_data/IPTS32124_CG4C_exp0424/scan0016.h5 | Bin 84488 -> 84488 bytes test_data/IPTS32124_CG4C_exp0424/scan0017.h5 | Bin 84488 -> 84488 bytes test_data/IPTS32124_CG4C_exp0424/scan0018.h5 | Bin 84424 -> 84424 bytes test_data/IPTS32124_CG4C_exp0424/scan0019.h5 | Bin 90768 -> 90768 bytes test_data/IPTS32124_CG4C_exp0424/scan0020.h5 | Bin 90768 -> 90768 bytes test_data/IPTS32124_CG4C_exp0424/scan0021.h5 | Bin 107968 -> 107968 bytes test_data/IPTS32124_CG4C_exp0424/scan0022.h5 | Bin 107968 -> 107968 bytes test_data/IPTS32124_CG4C_exp0424/scan0023.h5 | Bin 107968 -> 107968 bytes test_data/IPTS32124_CG4C_exp0424/scan0024.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0025.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0026.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0027.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0028.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0029.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0030.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0031.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0032.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0033.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0034.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0035.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0036.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0037.h5 | Bin 107864 -> 107864 bytes test_data/IPTS32124_CG4C_exp0424/scan0038.h5 | Bin 107864 -> 107864 bytes test_data/tavi_exp424_test.h5 | Bin 1351 -> 1351 bytes tests/test_scan.py | 5 +- tests/test_tavi_data.py | 4 + 45 files changed, 283 insertions(+), 193 deletions(-) delete mode 100644 src/tavi/data/nexus_reader.py create mode 100644 src/tavi/data/scan_reader.py diff --git a/src/tavi/data/nexus_reader.py b/src/tavi/data/nexus_reader.py deleted file mode 100644 index c9335531..00000000 --- a/src/tavi/data/nexus_reader.py +++ /dev/null @@ -1,161 +0,0 @@ -# -*- coding: utf-8 -*- -from typing import NamedTuple, Optional - -import numpy as np - - -class ScanInfo(NamedTuple): - """Metadata containing scan information""" - - scan_num: Optional[int] = None - time: Optional[str] = None - scan_title: str = "" - preset_type: str = "normal" - preset_channel: str = "time" - preset_value: float = 1.0 - def_y: str = "detector" - def_x: str = "s1" - - -class SampleUBInfo(NamedTuple): - """Metadata about sample and UB matrix""" - - sample_name: Optional[str] = None - lattice_constants: tuple[ - float, - float, - float, - float, - float, - float, - ] = (1.0, 1.0, 1.0, 90.0, 90.0, 90.0) - ub_matrix: Optional[np.ndarray] = None - # mode: int = 0 # mode for UB determination in SPICE - plane_normal: Optional[np.ndarray] = None - in_plane_ref: Optional[np.ndarray] = None - ubconf: Optional[str] = None # path to UB configration file - - -class InstrumentInfo(NamedTuple): - """Metadata about instrument configuration""" - - instrument_name: str = "" - # monochromator: - # analyzer: - # TODO - sense: int = 1 - collimation: tuple[float, float, float, float] = (60, 60, 60, 60) - # TODO vertical collimation?? - - -class ScanData(NamedTuple): - """Data points in a measured scan""" - - # Pt. - detector: Optional[tuple[int, ...]] = None - # monitor - time: Optional[tuple[float, ...]] = None - monitor: Optional[tuple[int, ...]] = None - mcu: Optional[tuple[float, ...]] = None - # monochromator - m1: Optional[tuple[float, ...]] = None - m2: Optional[tuple[float, ...]] = None - ei: Optional[tuple[float, ...]] = None - focal_length: Optional[tuple[float, ...]] = None - mfocus: Optional[tuple[float, ...]] = None - marc: Optional[tuple[float, ...]] = None - mtrans: Optional[tuple[float, ...]] = None - # analyzer - ef: Optional[tuple[float, ...]] = None - a1: Optional[tuple[float, ...]] = None - a2: Optional[tuple[float, ...]] = None - afocus: Optional[tuple[float, ...]] = None - # ctax double-focused analyzer - qm: Optional[ - tuple[ - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - ] - ] = None - xm: Optional[ - tuple[ - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - tuple[float, ...], - ] - ] = None - # goiometer motor angles - s1: Optional[tuple[float, ...]] = None - s2: Optional[tuple[float, ...]] = None - sgl: Optional[tuple[float, ...]] = None - sgu: Optional[tuple[float, ...]] = None - stl: Optional[tuple[float, ...]] = None - stu: Optional[tuple[float, ...]] = None - chi: Optional[tuple[float, ...]] = None - phi: Optional[tuple[float, ...]] = None - # slits - slit_pre_bt: Optional[tuple[float, ...]] = None - slit_pre_tp: Optional[tuple[float, ...]] = None - slit_pre_lf: Optional[tuple[float, ...]] = None - slit_pre_rt: Optional[tuple[float, ...]] = None - slit_aft_bt: Optional[tuple[float, ...]] = None - slit_aft_tp: Optional[tuple[float, ...]] = None - slit_aft_lf: Optional[tuple[float, ...]] = None - slit_aft_rt: Optional[tuple[float, ...]] = None - # Q-E space - q: Optional[tuple[float, ...]] = None - qh: Optional[tuple[float, ...]] = None - qk: Optional[tuple[float, ...]] = None - ql: Optional[tuple[float, ...]] = None - en: Optional[tuple[float, ...]] = None - # temperature - temp: Optional[tuple[float, ...]] = None - temp_a: Optional[tuple[float, ...]] = None - temp_2: Optional[tuple[float, ...]] = None - coldtip: Optional[tuple[float, ...]] = None - tsample: Optional[tuple[float, ...]] = None - sample: Optional[tuple[float, ...]] = None - vti: Optional[tuple[float, ...]] = None - dr_tsample: Optional[tuple[float, ...]] = None - dr_temp: Optional[tuple[float, ...]] = None - lt: Optional[tuple[float, ...]] = None - ht: Optional[tuple[float, ...]] = None - sorb_temp: Optional[tuple[float, ...]] = None - sorb: Optional[tuple[float, ...]] = None - sample_ht: Optional[tuple[float, ...]] = None - # field - persistent_field: Optional[tuple[float, ...]] = None - - -def dataset_to_string(ds): - return str(ds.asstr()[...]) - - -def unpack_nexus(nexus_entry): - scan_name = nexus_entry.filename.split("/")[-1] # e.g. "scan0001" - scan_info = ScanInfo( - scan_num=int(scan_name[4:-3]), - time=dataset_to_string(nexus_entry["start_time"]), - scan_title=dataset_to_string(nexus_entry["title"]), - preset_type="normal", - preset_channel=dataset_to_string(nexus_entry["monitor/mode"]), - preset_value=float(nexus_entry["monitor/preset"][...]), - def_y=nexus_entry["data"].attrs["signal"], - def_x=nexus_entry["data"].attrs["axes"], - ) - sample_ub_info = SampleUBInfo() - instrument_info = InstrumentInfo() - scan_data = ScanData() - - return (scan_info, sample_ub_info, instrument_info, scan_data) diff --git a/src/tavi/data/scan.py b/src/tavi/data/scan.py index 24436e74..7e1d8087 100644 --- a/src/tavi/data/scan.py +++ b/src/tavi/data/scan.py @@ -5,7 +5,14 @@ import matplotlib.pyplot as plt import numpy as np -from tavi.data.nexus_reader import InstrumentInfo, SampleUBInfo, ScanData, ScanInfo, unpack_nexus +from tavi.data.scan_reader import ( + InstrumentInfo, + SampleUBInfo, + ScanData, + ScanInfo, + nexus_entry_to_scan, + spice_entry_to_scan, +) class Scan(object): @@ -31,27 +38,18 @@ def __init__(self, scan_info, sample_ub_info, instrument_info, data) -> None: self.instrument_info: Optional[InstrumentInfo] = instrument_info self.data: Optional[ScanData] = data - # TODO ------------------------------------------------------ @classmethod def from_nexus(cls, nexus_path): with h5py.File(nexus_path, "r") as nexus_entry: - scan_info, sample_ub_info, instrument_info, data = unpack_nexus(nexus_entry) + scan_info, sample_ub_info, instrument_info, data = nexus_entry_to_scan(nexus_entry) return cls(scan_info, sample_ub_info, instrument_info, data) - def load_scan(self, nexus_entry): - """Unpack metadata and data from nexus_entry""" - - # scan_info, sample_ub_info, instrument_info, data = nexus_to_dict(nexus_entry) - ( - scan_info, - sample_ub_info, - instrument_info, - scan_data, - ) = Scan.unpack_nexus(nexus_entry) - self.scan_info = scan_info - self.sample_ub_info = sample_ub_info - self.instrument_info = instrument_info - self.data = scan_data + # TODO + @classmethod + def from_spice(cls, spice_path): + spice_entry = spice_path + scan_info, sample_ub_info, instrument_info, data = spice_entry_to_scan(spice_entry) + return cls(scan_info, sample_ub_info, instrument_info, data) def get_scan_info(self): """Return scan_info in metadata. diff --git a/src/tavi/data/scan_reader.py b/src/tavi/data/scan_reader.py new file mode 100644 index 00000000..afad9dac --- /dev/null +++ b/src/tavi/data/scan_reader.py @@ -0,0 +1,252 @@ +# -*- coding: utf-8 -*- +from typing import NamedTuple, Optional + +import numpy as np + + +class ScanInfo(NamedTuple): + """Metadata containing scan information""" + + scan_num: Optional[int] = None + start_time: Optional[str] = None + end_time: Optional[str] = None + scan_title: str = "" + # preset_type: str = "normal" + preset_channel: str = "time" + preset_value: float = 1.0 + def_y: str = "detector" + def_x: str = "s1" + + +class SampleUBInfo(NamedTuple): + """Metadata about sample and UB matrix""" + + sample_name: Optional[str] = None + lattice_constants: tuple = (1.0, 1.0, 1.0, 90.0, 90.0, 90.0) + ub_matrix: Optional[np.ndarray] = None + # ub_mode: int = 0 # mode for UB determination in SPICE + # angle_mode: int = 0 # mode for goni angle calculation in SPICE + plane_normal: Optional[np.ndarray] = None + # in_plane_ref: Optional[np.ndarray] = None + ubconf: Optional[str] = None # path to UB configration file + + +# TODO +class InstrumentInfo(NamedTuple): + """Metadata about instrument configuration""" + + instrument_name: str = "" + # monochromator: + # analyzer: + + sense: int = 1 + collimation: tuple[float, float, float, float] = (60, 60, 60, 60) + # TODO vertical collimation?? + + +class ScanData(NamedTuple): + """Data points in a measured scan""" + + # Pt. + detector: Optional[tuple[int, ...]] = None + # monitor + time: Optional[tuple[float, ...]] = None + monitor: Optional[tuple[int, ...]] = None + mcu: Optional[tuple[float, ...]] = None + # monochromator + m1: Optional[tuple[float, ...]] = None + m2: Optional[tuple[float, ...]] = None + ei: Optional[tuple[float, ...]] = None + focal_length: Optional[tuple[float, ...]] = None + mfocus: Optional[tuple[float, ...]] = None + marc: Optional[tuple[float, ...]] = None + mtrans: Optional[tuple[float, ...]] = None + # analyzer + ef: Optional[tuple[float, ...]] = None + a1: Optional[tuple[float, ...]] = None + a2: Optional[tuple[float, ...]] = None + afocus: Optional[tuple[float, ...]] = None + # ctax double-focused analyzer + qm: Optional[tuple] = None # 8 blades + xm: Optional[tuple] = None # 8 blades + # goiometer motor angles + s1: Optional[tuple[float, ...]] = None + s2: Optional[tuple[float, ...]] = None + sgl: Optional[tuple[float, ...]] = None + sgu: Optional[tuple[float, ...]] = None + stl: Optional[tuple[float, ...]] = None + stu: Optional[tuple[float, ...]] = None + chi: Optional[tuple[float, ...]] = None + phi: Optional[tuple[float, ...]] = None + # slits + bat: Optional[tuple[float, ...]] = None + bab: Optional[tuple[float, ...]] = None + bal: Optional[tuple[float, ...]] = None + bar: Optional[tuple[float, ...]] = None + bbt: Optional[tuple[float, ...]] = None + bbb: Optional[tuple[float, ...]] = None + bbl: Optional[tuple[float, ...]] = None + bbr: Optional[tuple[float, ...]] = None + slita_bt: Optional[tuple[float, ...]] = None + slita_tp: Optional[tuple[float, ...]] = None + slita_lf: Optional[tuple[float, ...]] = None + slita_rt: Optional[tuple[float, ...]] = None + slitb_bt: Optional[tuple[float, ...]] = None + slitb_tp: Optional[tuple[float, ...]] = None + slitb_lf: Optional[tuple[float, ...]] = None + slitb_rt: Optional[tuple[float, ...]] = None + slit_pre_bt: Optional[tuple[float, ...]] = None + slit_pre_tp: Optional[tuple[float, ...]] = None + slit_pre_lf: Optional[tuple[float, ...]] = None + slit_pre_rt: Optional[tuple[float, ...]] = None + # Q-E space + q: Optional[tuple[float, ...]] = None + qh: Optional[tuple[float, ...]] = None + qk: Optional[tuple[float, ...]] = None + ql: Optional[tuple[float, ...]] = None + en: Optional[tuple[float, ...]] = None + # temperature + temp: Optional[tuple[float, ...]] = None + temp_a: Optional[tuple[float, ...]] = None + temp_2: Optional[tuple[float, ...]] = None + coldtip: Optional[tuple[float, ...]] = None + tsample: Optional[tuple[float, ...]] = None + sample: Optional[tuple[float, ...]] = None + vti: Optional[tuple[float, ...]] = None + dr_tsample: Optional[tuple[float, ...]] = None + dr_temp: Optional[tuple[float, ...]] = None + lt: Optional[tuple[float, ...]] = None + ht: Optional[tuple[float, ...]] = None + sorb_temp: Optional[tuple[float, ...]] = None + sorb: Optional[tuple[float, ...]] = None + sample_ht: Optional[tuple[float, ...]] = None + # field + persistent_field: Optional[tuple[float, ...]] = None + + +def get_string(nexus_entry, entry_string): + try: + return str(nexus_entry[entry_string].asstr()[...]) + except KeyError: + return None + + +def get_data(nexus_entry, entry_string): + try: + return nexus_entry[entry_string][...] + except KeyError: + return None + + +def nexus_entry_to_scan(nexus_entry): + scan_name = nexus_entry.filename.split("/")[-1] # e.g. "scan0001" + scan_info = ScanInfo( + scan_num=int(scan_name[4:-3]), + start_time=get_string(nexus_entry, "start_time"), + end_time=get_string(nexus_entry, "end_time"), + scan_title=get_string(nexus_entry, "title"), + # preset_type="normal", + preset_channel=get_string(nexus_entry, "monitor/mode"), + preset_value=float(nexus_entry["monitor/preset"][...]), + def_y=nexus_entry["data"].attrs["signal"], + def_x=nexus_entry["data"].attrs["axes"], + ) + sample_ub_info = SampleUBInfo( + sample_name=get_string(nexus_entry, "sample/name"), + lattice_constants=np.array(get_data(nexus_entry, "sample/unit_cell")), + ub_matrix=np.array(get_data(nexus_entry, "sample/orientation_matrix")).reshape(3, 3), + # ub_mode=0, + # angle_mode=0, + plane_normal=get_data(nexus_entry, "sample/plane_normal"), + # in_plane_ref=None, + ubconf=get_string(nexus_entry, "sample/ub_conf"), + ) + instrument_info = InstrumentInfo() + + scan_data = ScanData( + detector=get_data(nexus_entry, "instrument/detector/data"), + # monitor + time=get_data(nexus_entry, "monitor/time"), + monitor=get_data(nexus_entry, "monitor/monitor"), + mcu=get_data(nexus_entry, "monitor/mcu"), + # monochromator + m1=get_data(nexus_entry, "instrument/monochromator/m1"), + m2=get_data(nexus_entry, "instrument/monochromator/m2"), + ei=get_data(nexus_entry, "instrument/monochromator/ei"), + focal_length=get_data(nexus_entry, "instrument/monochromator/focal_length"), + mfocus=get_data(nexus_entry, "instrument/monochromator/mfocus"), + marc=get_data(nexus_entry, "instrument/monochromator/marc"), + mtrans=get_data(nexus_entry, "instrument/monochromator/mtrans"), + # analyzer + ef=get_data(nexus_entry, "instrument/analyser/ef"), + a1=get_data(nexus_entry, "instrument/analyser/a1"), + a2=get_data(nexus_entry, "instrument/analyser/a2"), + afocus=get_data(nexus_entry, "instrument/analyser/afocus"), + # ctax double-focused analyzer + qm=np.array([get_data(nexus_entry, f"instrument/analyser/qm{i}") for i in range(1, 9, 1)]), + xm=np.array([get_data(nexus_entry, f"instrument/analyser/xm{i}") for i in range(1, 9, 1)]), + # goiometer motor angles + s1=get_data(nexus_entry, "sample/s1"), + s2=get_data(nexus_entry, "sample/s2"), + sgl=get_data(nexus_entry, "sample/sgl"), + sgu=get_data(nexus_entry, "sample/sgu"), + stl=get_data(nexus_entry, "sample/stl"), + stu=get_data(nexus_entry, "sample/stu"), + chi=get_data(nexus_entry, "sample/chi"), + phi=get_data(nexus_entry, "sample/phi"), + # slits + bat=get_data(nexus_entry, "instrument/slit/bat"), + bab=get_data(nexus_entry, "instrument/slit/bab"), + bal=get_data(nexus_entry, "instrument/slit/bal"), + bar=get_data(nexus_entry, "instrument/slit/bar"), + bbt=get_data(nexus_entry, "instrument/slit/bbt"), + bbb=get_data(nexus_entry, "instrument/slit/bbb"), + bbl=get_data(nexus_entry, "instrument/slit/bbl"), + bbr=get_data(nexus_entry, "instrument/slit/bbr"), + slita_bt=get_data(nexus_entry, "instrument/slit/slita_bt"), + slita_tp=get_data(nexus_entry, "instrument/slit/slita_tp"), + slita_lf=get_data(nexus_entry, "instrument/slit/slita_lf"), + slita_rt=get_data(nexus_entry, "instrument/slit/slita_rt"), + slitb_bt=get_data(nexus_entry, "instrument/slit/slitb_bt"), + slitb_tp=get_data(nexus_entry, "instrument/slit/slitb_tp"), + slitb_lf=get_data(nexus_entry, "instrument/slit/slitb_lf"), + slitb_rt=get_data(nexus_entry, "instrument/slit/slitb_rt"), + slit_pre_bt=get_data(nexus_entry, "instrument/slit/slit_pre_bt"), + slit_pre_tp=get_data(nexus_entry, "instrument/slit/slit_pre_tp"), + slit_pre_lf=get_data(nexus_entry, "instrument/slit/slit_pre_lf"), + slit_pre_rt=get_data(nexus_entry, "instrument/slit/slit_pre_rt"), + # Q-E space + q=get_data(nexus_entry, "sample/q"), + qh=get_data(nexus_entry, "sample/qh"), + qk=get_data(nexus_entry, "sample/qk"), + ql=get_data(nexus_entry, "sample/ql"), + en=get_data(nexus_entry, "sample/en"), + # temperature + temp=get_data(nexus_entry, "sample/temp"), + temp_a=get_data(nexus_entry, "sample/temp_a"), + temp_2=get_data(nexus_entry, "sample/temp_2"), + coldtip=get_data(nexus_entry, "sample/coldtip"), + tsample=get_data(nexus_entry, "sample/tsample"), + sample=get_data(nexus_entry, "sample/sample"), + vti=get_data(nexus_entry, "sample/vti"), + dr_tsample=get_data(nexus_entry, "sample/dr_tsample"), + dr_temp=get_data(nexus_entry, "sample/dr_temp"), + lt=get_data(nexus_entry, "sample/lt"), + ht=get_data(nexus_entry, "sample/ht"), + sorb_temp=get_data(nexus_entry, "sample/sorb_temp"), + sorb=get_data(nexus_entry, "sample/sorb"), + sample_ht=get_data(nexus_entry, "sample/sample_ht"), + # field + persistent_field=get_data(nexus_entry, "sample/persistent_field"), + ) + + return (scan_info, sample_ub_info, instrument_info, scan_data) + + +# TODO +def spice_entry_to_scan(spice_entry): + scan_info = ScanInfo() + sample_ub_info = SampleUBInfo() + instrument_info = InstrumentInfo() + scan_data = ScanData() + return (scan_info, sample_ub_info, instrument_info, scan_data) diff --git a/src/tavi/data/tavi.py b/src/tavi/data/tavi.py index 8d7297d6..77e2b901 100644 --- a/src/tavi/data/tavi.py +++ b/src/tavi/data/tavi.py @@ -26,10 +26,10 @@ class TAVI(object): def __init__(self) -> None: """Initialization""" self.file_path: Optional[str] = None - self.data: Optional[dict] = None - self.processed_data: Optional[dict] = None - self.fits: Optional[dict] = None - self.plots: Optional[dict] = None + self.data: dict = {} + self.processed_data: dict = {} + self.fits: dict = {} + self.plots: dict = {} def new_tavi_file(self, file_path: Optional[str] = None) -> None: """Create a new tavi file @@ -61,27 +61,22 @@ def load_nexus_data_from_disk(self, path_to_hdf5_folder): hdf5 folder must have the strucutre IPTSXXXX_INSTRUMENT_expXXXX """ # validate path - folder_name_parts = path_to_hdf5_folder.split("/")[-1].split("_") + if path_to_hdf5_folder[-1] != "/": + path_to_hdf5_folder += "/" + dataset_name = path_to_hdf5_folder.split("/")[-2] # e.g. IPTS32124_CG4C_exp0424 + folder_name_parts = dataset_name.split("_") if folder_name_parts[0][0:4] != "IPTS" or folder_name_parts[2][0:3] != "exp": print("Unrecogonized nexus folder name. Must be IPTSXXXX_INSTRUMENT_expXXXX.") raise ValueError - if path_to_hdf5_folder[-1] != "/": - path_to_hdf5_folder += "/" - - dataset_name = path_to_hdf5_folder.split("/")[-2] # e.g. IPTS32124_CG4C_exp0424 scan_list = os.listdir(path_to_hdf5_folder) scan_list = [scan for scan in scan_list if scan.startswith("scan")] scan_list.sort() scans = {} - - # TODO ----------------------------------------------------------- - for scan in scan_list: scan_name = scan.split(".")[0] # e.g. "scan0001" scan_path = path_to_hdf5_folder + scan - scan_entry = Scan.from_nexus(scan_path) scans.update({scan_name: scan_entry}) @@ -99,6 +94,7 @@ def load_spice_data_from_disk(self, path_to_spice_folder): pass + # TODO def load_data_from_oncat(self, user_credentials, ipts_info, OVERWRITE=True): """Load data from ONCat based on user_credentials and ipts_info. diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0001.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0001.h5 index 451a40b7a6bdda93b6f60cbb13c67ff114e74408..d9c9942659d16324ff6e1a6f7c94c5b8fca88ebe 100644 GIT binary patch delta 100 zcmeA;#nN$#rC|%B1*@_z0|e-Y7N-^!>sOfM=)2@6m*%GCl@#l{XO?)BCQT1!W%Ls? z3^6pbGBL3-G14RLF_D#Z!VFHY<(>YZb{{sNi Cf-JBA diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0002.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0002.h5 index 6181e5dc1b8081d245738690562755491ab413f0..0ddf5707ea7794175a0788d62dc49e97efdad874 100644 GIT binary patch delta 101 zcmaEHmhHt^wuU8)^~$~s5TGAgoLW?@UtyA??~jQeG+nx$(NEAY z#L&#j#Kg+PNYB91)Y8m+dR0B69a9AF_K)0*^&H!H7|*k87wBcYA;IW7{pC`|{{UDj BAXWeX delta 92 zcmaEHmhHt^wuU8)_0p~k5TKutpPQ;*VUnZolAm0fo0?ZrJYBh-(NEAI#L&db#MsKz sNYBK`#LU8AdQ&~49b>}wgY}I5ywev{G8S*I?q$rCV04}Saw+3~06mT#1poj5 diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0003.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0003.h5 index 6c576bffb5b7633fdb34504e3a03bc3d6c11a8a0..7d15657b6a92ae723c940d0ebeb302604fc23883 100644 GIT binary patch delta 101 zcmaEHmhHt^wuU8)^~$~s5TGAgoLW?@UtyA??~jQeG+nx$(NEAY z#L&#j#Kg+PNYBvR$kfDmdR0B69a9AF_K)0*^&H!H7|*k87wBcYA;IW7{pC`|{{U7- BAV>fJ delta 92 zcmaEHmhHt^wuU8)_0p~k5TKutpPQ;*VUnZolAm0fo0?ZrJYBh-(NEAI#L&db#MsKz sNYBL7%)rcIdQ&~49b>}wgY}I5ywev{G8S*I?q$rCV04}Saw+3~06sDv3IG5A diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0004.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0004.h5 index ce83620e167f66ca13e62230e6042771184e7b61..f7ac0c8e5b64c549143d88b754bc3c7fca18a1d2 100644 GIT binary patch delta 99 zcmaEHmhHt^wuU8)^~$~s5TGAgoLW?@UtyA??~jQeG+nx$(U0FS z#L&#j#Kg+PNYBW`#CUo|J);9t1n>5b+>G@c+jtnyvuqdWWxOH5=sW%8QpW!PAKo9` delta 90 zcmaEHmhHt^wuU8)_0p~k5TKutpPQ;*VUnZolAm0fo0?ZrJYBh-(U0FC#L&db#MsKz qNYBL5z;Jp)J);9-!uEspjQ+gS7gRD9Z?EoU%#~nto&Itu<9`4RLLHd^ diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0005.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0005.h5 index fb2cd2ec71d359c2993dc2db2abe8a1882712396..c6af6334a62e69d632e2c76cd362ea85e12213b5 100644 GIT binary patch delta 97 zcmdn6igm*()`l&N1vbjQ3=p6nTAW%`tY2Z0qwkWRT$-DjS5mC+o>}5inl!!JhS5*Z xFvQTz%EZLV#7NKBz}UpVeEKUJMmwem-tC6AjDEb^8@w1da5DN%HwjQeG+nx$(NEAY z#L&#j#Kg+PNYB{Z%+%6sdR0B69a9AF_K)0*^&H!H7|*k87wBcYA;IW7{pC`|{{UDo BAXWeX delta 92 zcmaEHmhHt^wuU8)_0p~k5TKutpPQ;*VUnZolAm0fo0?ZrJYBh-(NEAI#L&db#MsKz sNYB*N%*euWdQ&~49b>}wgY}I5ywev{G8S*I?q$rCV04}Saw+3~06zU55C8xG diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0007.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0007.h5 index 5fe41df98f75e81049625992e0be16831976dea2..1292470e8944cea037b88fef163fbcb578e2bd42 100644 GIT binary patch delta 100 zcmaEHmhHt^wuU8)^~$~s5TGAgoLW?@UtyA??~jQeG+nx$(NEAY z#L&#j#Kg+PNYBL7%+k_wdR0B69a9AFX2v#lj?DsP?yTDddKqs>F#1k^xs>rg04t6k ASpWb4 delta 92 zcmaEHmhHt^wuU8)_0p~k5TKutpPQ;*VUnZolAm0fo0?ZrJYBh-(NEAI#L&db#MsKz sNYB*5!r0twdQ&~49b>}wgY}I5ywev{G8S*I?q$rCV04}Saw+3~06$P35&!@I diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0008.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0008.h5 index 65723537803948e9925e2a32d7632439b1f6ad91..3dab69da2c2f74f4e16b952d68561406cf467992 100644 GIT binary patch delta 97 zcmdn6igm*()`l&N1vbjQ3=p6nTAW%`tY2Z0qwkWRT$-DjS5mC+o>}5inl!!JhS5*Z xFvQTz%EZLV#7NK7(9FQpVEQW?Mmwem-tC6AjDEb^8@w1da5DN%HwGV%FjCPC(+YN0Q{dp%|;Mm^a#khf!(RI3E2;+YM)8HFB diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0009.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0009.h5 index a0e17b63703bea3b444871596e340f9650edc8f0..17c5965955afd3433c27756bc0444551143d5ac6 100644 GIT binary patch delta 100 zcmaEHmhHt^wuU8)^~$~s5TGAgoLW?@UtyA??~jQeG+nx$(NEAY z#L&#j#Kg+PNYB*5!py*MdR0B69a9AFX2v#lj?DsP?yTDddKqs>F#1k^xs>rg04dfV AO8@`> delta 92 zcmaEHmhHt^wuU8)_0p~k5TKutpPQ;*VUnZolAm0fo0?ZrJYBh-(NEAI#L&db#MsKz sNYBjF(9*(adQ&~49b>}wgY}I5ywev{G8S*I?q$rCV04}Saw+3~06u{p3;+NC diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0010.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0010.h5 index a21df663cb1729723c68e1219dc6a48939323824..c9b3958ec461f54a8a2f3064fc178be652428bf0 100644 GIT binary patch delta 102 zcmbPmly$;U)`l&N2dtER86ZGEv^ce>Siiy~N8cqsximL5ucTPtJ+s84G->*6D@H#- z!w^F=D-#nd6C*t{Q)3eoi|JO@jCM>8yxSYC8O?a7JFqflZCCPS%#&dBojx&<@jn1E CqaE!4 delta 96 zcmbPmly$;U)`l&N2dt!B86ZGEBR@A)zrrL(-z7h}G&eP`qxnf1hE)`l&NFEo{X86ZGEv^ce>Siiy~N8cqsximL5ucTPtJ+s84G-*1s7Neh_ zVThrbm5GU!iIJYUp@D^|;q)XeMmt81?F+RS|MN_5kY~)=E@Z*DO@PsN`biJQ{{Rfy B9$)|f delta 97 zcmX>xnf1hE)`l&NFEpiH86ZGEBR@A)zrrL(-z7h}G&eP`qe)~_(h(RayDF3nBND=F4@&n)pMO`85&k}=sKO#lkqe)~_(h(RayDF3nBND=F4@&n)pMO`85&k}=sKO#lkq}y diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0014.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0014.h5 index b1f061f846845c5f8fe5bb52a4928b574e25d306..e18df43dbafb0091ec5777251cf90498c79583c2 100644 GIT binary patch delta 101 zcmX>xnf1hE)`l&NFEo{X86ZGEv^ce>Siiy~N8cqsximL5ucTPtJ+s84G-*1s7Neh_ zVThrbm5GU!iIJX#g@L7k@$@7uMmt81?F+RS|MN_5kY~)=E@Z*DO@PsN`biJQ{{RiR B9%cXl delta 97 zcmX>xnf1hE)`l&NFEpiH86ZGEBR@A)zrrL(-z7h}G&eP`qxnf1hE)`l&N7c`Z986ZGEv^ce>Siiy~N8cqsximL5ucTPtJ+s84G->*4O-4UK z!w^F=D-#nd6C*uKV{>B*qv>8+jCM>4yxS*gF^cg{Z;)rq+Ad_lxJ`i3clt>W#{U30 C5gtzf delta 96 zcmX>xnf1hE)`l&N7c`|^86ZGEBR@A)zrrL(-z7h}G&eP`qe)~_(h(RayDF3nBND=F4@&n)pMO`85#ke)~_(h(RayDF3nBND=F4@&n)pMO`85#knxbh?ugqaCBd_C_T}ao+6<^cgcG8GWa7dNTe808|1SO#lD@ delta 98 zcmeB}!rC!~wP6e62}NmF1_;p4$j?pHuQ18ccgasK%}vcKDW3jXkxnf1hE)`l&N7c`Z986ZGEv^ce>Siiy~N8cqsximL5ucTPtJ+s84G->*4O-4UK z!w^F=D-#nd6JtF?14~0A^XXn%jCM>4yxS*gF^cg{Z;)rq+Ad_lxJ`i3clt>W#{U2} Cbsj_j delta 96 zcmX>xnf1hE)`l&N7c`|^86ZGEBR@A)zrrL(-z7h}G&eP`qSiiy~N8cqsximL5ucTPtJ+s84G-*1sC8M99 zVThrbm5GU!iLsucxrwQT@$@81Mmwe-JewEJ|IWC1!~7RmiH#TX8K*n2GG=XOa%b$5 MV)UIpF_G~<06VEK(f|Me delta 122 zcmbPmly$;U)`l&NFD#^886ZGEBR@A)zrrL(-z7h}G&eP`qSiiy~N8cqsximL5ucTPtJ+s84G-*1sC8M99 zVThrbm5GU!iLsuMv8jcD;q)X+Mmwe-Jli)~GCt>-c!7Po11n?Jb|!bmJ}E}u=@Szf G{{sM`As|x# delta 97 zcmbPmly$;U)`l&NFD#^886ZGEBR@A)zrrL(-z7h}G&eP`q}5inl#rKh`i_=b3ncWBP_7#;ol|U5tHFjIPrUE@Au+0IDw_VE_OC diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0022.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0022.h5 index 19ec8a6d3ce390b82edf931fa11dad48f1d993e4..887370ed0cd464f6ab919d29f073ae3f1bbfa24b 100644 GIT binary patch delta 109 zcmX?bn(e@8wuUW?1~tmQ3=p6nTAW%`tY2Z0qwkWRT$-DjS5mC+o>}5inl#}5inl#1OqMmxqA+dtMYUgw#3fn)lHBF3!kMqP}3QjD(C4=!Q+4*}5inl#}5inl#}5inl#5)qq{{sNLO&;a| diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0027.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0027.h5 index a4c8fca71a996ec5d65ac2a2ec88694004f4176f..18e7d60f038fd9283c330c7cc21c9c448f8c2093 100644 GIT binary patch delta 106 zcmca{itWZJwuUW?5;e-c3=p6nTAW%`tY2Z0qwkWRT$-DjS5mC+o>}5inl#jc>1gwMmr`3-pvc!w{vVh5Mj?UeM1pr)^?*VMl~r$*XfZ<82}5inl#5)qq{{sNJp&r`+ diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0029.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0029.h5 index d60b0aaeee15493bba3b6949e054b6f6af21940d..da4501db24440365008026839eb9a348dc755b18 100644 GIT binary patch delta 106 zcmca{itWZJwuUW?5;e-c3=p6nTAW%`tY2Z0qwkWRT$-DjS5mC+o>}5inl#1IoMmwe-JewD`Z|B&2Ai|tw`i3ILtnEf!jA~MhzSAR@ HF#ZPs5?~_l delta 98 zcmca{itWZJwuUW?5;fAU3=p87k)NBYUtyA??~DhX!@)gMmr`3-pvc!w{vVh5Mj?UeM1pr)^?*VMl~r$*XfZ<82}5inl#}5inl#}5inl#xc>1gwMmr`3-pw0-w{vVhP?66veM1pr)^?*VMl~r$*XfZ<82}5inl#}5inl#1IoMmwe-Jlh}EFh1v*c!7QTh9btS?M7XUYEq28(<7HK G{s#c?z#_H) delta 97 zcmca{itWZJwuUW?5;fAU3=p87k)NBYUtyA??~5)qq{{sNK-yY)t diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0035.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0035.h5 index d2484d10587aab29a8cf363504c3deb301515f30..331f0c77b5e2f55981b46a333b4be69736b1f712 100644 GIT binary patch delta 106 zcmca{itWZJwuUW?5;e-c3=p6nTAW%`tY2Z0qwkWRT$-DjS5mC+o>}5inl#1IoMmwe-Jewa*Z|B&2pdy`R`i3ILtnEf!jA~MhzSAR@ HF#ZPs8k-|j delta 98 zcmca{itWZJwuUW?5;fAU3=p87k)NBYUtyA??~}5inl#1IoMmwe-Jlh}EFh1v*c!7QTh9btS?M7XUYEq28(<7HK G{s#c?1tPHk delta 97 zcmca{itWZJwuUW?5;fAU3=p87k)NBYUtyA??~aQdtoMmr`3-t7--7@zY@yud$wLlI-vcB3vvH7Q2d>5)qq{{sNJy&l^D diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0037.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0037.h5 index 4cb8b9e3e9e87cc4e78da6bda6785dd4082b9ab3..9425042b014d670b147fdd11dfcc871fc25ace38 100644 GIT binary patch delta 105 zcmca{itWZJwuUW?5;e-c3=p6nTAW%`tY2Z0qwkWRT$-DjS5mC+o>}5inl#en>YS$=h%FpBAsRWh9btS?M7XUYEq28(<7HK G{s#aBTq9oq delta 97 zcmca{itWZJwuUW?5;fAU3=p87k)NBYUtyA??~5)qq{{sNb$RBzD diff --git a/test_data/IPTS32124_CG4C_exp0424/scan0038.h5 b/test_data/IPTS32124_CG4C_exp0424/scan0038.h5 index e10c0534af19570457e2cf8bbacf42be4feee63d..a00ac94d015b808e059cc652df2ac55b7f21e0a7 100644 GIT binary patch delta 105 zcmca{itWZJwuUW?5;e-c3=p6nTAW%`tY2Z0qwkWRT$-DjS5mC+o>}5inl#SMmwe-Jlh}EFh1v*c!7QTh9btS?M7XUYEq28(<7HK G{s#c@&mz45 delta 97 zcmca{itWZJwuUW?5;fAU3=p87k)NBYUtyA??~5)qq{{sNKlOEv! diff --git a/test_data/tavi_exp424_test.h5 b/test_data/tavi_exp424_test.h5 index 291578a4c91ee05608c1d4ae4ba49da12845d0b6..ac5aa8d46018cfc1c7848978eb17571edfbbf691 100644 GIT binary patch delta 165 zcmX@kb)0KLn$-5mm(!5(112Q~5MXART*$0Garp+xTP*X;{5@QPm~@cU0ojuiSsqC) N*t;v8CbBFblL7NmP+kB4 delta 165 zcmX@kb)0KLn$$Y&OKHgX0h1B~2r#ouE@W1pxO{`8a;n}ke-D=+CLLsTK=$NBmPe9b N%6~P}M3x0)G5}ChNXP&H diff --git a/tests/test_scan.py b/tests/test_scan.py index 7446f6e4..29eb4846 100644 --- a/tests/test_scan.py +++ b/tests/test_scan.py @@ -3,7 +3,8 @@ from tavi.data.scan import Scan -def test_load_scan(): - +def test_load_nexus_scan(): nexus_file_name = "./test_data/IPTS32124_CG4C_exp0424/scan0042.h5" scan = Scan.from_nexus(nexus_file_name) + assert scan.scan_info.scan_num == 42 + assert len(scan.data.s1) == 40 diff --git a/tests/test_tavi_data.py b/tests/test_tavi_data.py index fdd7f4c8..8368d10d 100644 --- a/tests/test_tavi_data.py +++ b/tests/test_tavi_data.py @@ -2,6 +2,7 @@ import os import h5py +import numpy as np from tavi.data.tavi import TAVI @@ -47,6 +48,9 @@ def test_load_nexus_data_from_disk(): nexus_data_folder = "./test_data/IPTS32124_CG4C_exp0424" tavi.load_nexus_data_from_disk(nexus_data_folder) + assert len(tavi.data["IPTS32124_CG4C_exp0424"]) == 92 + scan0001 = tavi.data["IPTS32124_CG4C_exp0424"]["scan0001"] + assert np.allclose(scan0001.data.s1, [11.305, 11.1075]) # def test_open_tavi_file():