Source code for ewoksxrpd.tasks.utils.xrpd_utils
import os
from typing import Dict
from typing import Iterable
from typing import List
from typing import Tuple
import pyFAI.calibrant
import pyFAI.units
from ... import pyfai_api
[docs]
def energy_wavelength(x: float) -> float:
"""keV to m and vice versa"""
return pyFAI.units.hc * 1e-10 / x
GEOMETRY_PARAMETERS = {"dist", "poni1", "poni2", "rot1", "rot2", "rot3"}
[docs]
def validate_geometry(geometry: dict):
required = GEOMETRY_PARAMETERS
existing = set(geometry.keys())
missing = required - existing
if missing:
raise ValueError(f"geometry has missing parameters {sorted(missing)}")
unexpected = existing - required
if unexpected:
raise ValueError(f"geometry has unexpected parameters {sorted(unexpected)}")
[docs]
def calibrant_ring_labels(calibrant: pyFAI.calibrant.Calibrant) -> List[str]:
if pyfai_api.USE_PROPERTY_API:
path = calibrant.filename
else:
path = calibrant.get_filename()
try:
# Introduced in pyfai v2023.08
path = calibrant._get_abs_path(path)
except AttributeError:
pass
if not path or not os.path.isfile(path):
raise ValueError(f"No such calibrant file: {path}")
labels = list()
i = 0
with open(path, "r") as fd:
for line in fd:
if line.startswith("#"):
continue
line = line.rstrip()
label = line.rpartition("#")[-1]
if not label or label in labels:
label = f"ring{i}"
label = label.strip()
labels.append(label)
i += 1
return labels
[docs]
def points_to_rings(
points: Iterable[Tuple[float, float, int]], calibrant: pyFAI.calibrant.Calibrant
) -> Dict[int, Dict[str, list]]:
rings = dict()
labels = calibrant_ring_labels(calibrant)
for p0, p1, i in points:
i = int(i)
try:
label = labels[i]
except IndexError:
label = f"ring{i}"
adict = rings.get(label)
if adict:
adict["p0"].append(p0)
adict["p1"].append(p1)
else:
rings[label] = {"p0": [p0], "p1": [p1]}
return rings