Source code for ewoksfluo.io.convert

from typing import Sequence, Union, Optional, List, Tuple

from .spec import SpecFile
from .nexus import save_as_bliss_scan


[docs] def spec_to_bliss( spec_filename: str, bliss_filename: str, scans: Union[int, Sequence[int], None] = None, subscans: Union[int, Sequence[int]] = 1, mode: str = "a", **openargs, ) -> None: include_scans = _parse_scan_arguments(scans, subscans) 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( scans: Union[int, Sequence[int], None], subscans: Union[int, Sequence[int]] ) -> Optional[List[Tuple[int, int]]]: if scans is None: return None if not isinstance(scans, Sequence): scans = [scans] if not isinstance(subscans, Sequence): subscans = [subscans] if len(scans) == 1: scans = scans * len(subscans) if len(subscans) == 1: subscans = subscans * len(scans) if len(scans) != len(subscans): raise ValueError("number of 'scans' and 'subscans' is not equal") return list(zip(scans, subscans))