Source code for arpes.laue

"""Primitive support for loading Laue data from the NorthStar x-ray backscattering DAQ program.

Laue file structure courtesy Jonathan Denlinger, MERLIN endstations at the ALS
16-bit binary Laue histogram (.hs2) file
Format:  2 byte*256*256= 131072 long + header info at the end
Northstar 6.0:  132028 bytes   (956 byte extra)
Northstar 6.2.6.9:  134280 bytes  ( 3208 byte extra)
header includes (offset from start of header):
 byte 65536 / 131072 / 2364   = sample name (character string - read to double space)
 byte 65587 / 131124 / 2416  = operator (character string - read to double space)
 byte 65638 / 131176 / 2468  = date in mm/dd/yy format (8 character string)
 byte 65811 / 131760 / 2984  = dwell time * 10 in seconds (word)
 byte 65821 / 131776 / 3000  = mA
 byte 65823 / 131780 / 3004  = kV
 byte 131664 / 592 = index file name
"""

import xarray
import typing
import numpy as np
from pathlib import Path

from arpes.provenance import provenance_from_file

northstar_62_69_dtype = np.dtype(
    [
        ("pad1", "B", (2364,)),  # unused
        ("sample", "S52"),
        ("user", "S52"),
        ("comment", "S512"),
        ("pad2", "B", (228,)),  # unused
    ]
)


[docs]def load_laue(path: typing.Union[Path, str]): """Loads NorthStart Laue backscattering data.""" if isinstance(path, str): path = Path(path) binary_data = path.read_bytes() table, header = binary_data[:131072], binary_data[131072:] table = np.fromstring(table, dtype=np.uint16).reshape(256, 256) header = np.fromstring(header, dtype=northstar_62_69_dtype).item() arr = xarray.DataArray( table, coords={"x": np.array(range(256)), "y": np.array(range(256))}, dims=[ "x", "y", ], attrs={ "sample": header[1].split(b"\0")[0].decode("ascii"), "user": header[2].split(b"\0")[0].decode("ascii"), "comment": header[3].split(b"\0")[0].decode("ascii"), }, ) provenance_from_file( arr, str(path), {"what": "Loaded Laue dataset from Northstar.", "by": "load_laue"} ) return arr