Source code for ewoksfluo.io.convert
from typing import List
from typing import Optional
from typing import Sequence
from typing import Tuple
from typing import Union
from .nexus import save_as_bliss_scan
from .spec import SpecFile
[docs]
def spec_to_bliss(
spec_filename: str,
bliss_filename: str,
scan_numbers: Union[int, Sequence[int], None] = None,
subscan_numbers: Union[int, Sequence[int], None] = None,
mode: str = "a",
**openargs,
) -> None:
include_scans = _parse_scan_arguments(scan_numbers, subscan_numbers)
with SpecFile(spec_filename) as specfile:
if include_scans is None:
include_scans = specfile.get_scans()
for scannb, subscan in include_scans:
n = specfile.get_number_of_subsubscans(scannb, subscan)
for i, (scannb, subscan) in enumerate(zip([scannb] * n, [subscan] * n)):
subsubscan = i + 1
osubscan = subscan + i
save_as_bliss_scan(
bliss_filename,
f"{scannb}.{osubscan}",
specfile.iter_data(scannb, subscan=subscan, subsubscan=subsubscan),
positioners=specfile.get_positioners(scannb, subscan=subscan),
title=specfile.get_title(scannb, subscan=subscan),
mode=mode,
**openargs,
)
if mode == "w":
mode = "a"
def _parse_scan_arguments(
scan_numbers: Union[int, Sequence[int], None],
subscan_numbers: Union[int, Sequence[int], None],
) -> Optional[List[Tuple[int, int]]]:
if scan_numbers is None:
return None
if subscan_numbers is None:
subscan_numbers = 1
if not isinstance(scan_numbers, Sequence):
scan_numbers = [scan_numbers]
if not isinstance(subscan_numbers, Sequence):
subscan_numbers = [subscan_numbers]
if len(scan_numbers) == 1:
scan_numbers = scan_numbers * len(subscan_numbers)
if len(subscan_numbers) == 1:
subscan_numbers = subscan_numbers * len(scan_numbers)
if len(scan_numbers) != len(subscan_numbers):
raise ValueError("number of 'scan_numbers' and 'subscan_numbers' is not equal")
return list(zip(scan_numbers, subscan_numbers))