Source code for ewoksxrpd.gui.plots

from numbers import Number
from typing import List

import numpy
import pyFAI
import pyFAI.detectors
from numpy.typing import ArrayLike
from silx.gui.colors import Colormap
from silx.gui.plot import PlotWidget
from silx.image.marchingsquares import find_contours

from .. import pyfai_api
from ..pyfai_api import AzimuthalIntegrator
from ..tasks.utils.xrpd_utils import energy_wavelength


[docs] def plot_image(plot: PlotWidget, image: ArrayLike, **kwargs) -> str: return plot.addImage(image, **kwargs)
[docs] def plot_theoretical_rings( plot: PlotWidget, detector: str, calibrant: str, energy: Number, geometry: dict, detector_config=None, max_rings=None, legend=None, **kwargs, ) -> List[str]: """Plot theoretical and detected Debye rings""" detector_object = pyFAI.detectors.detector_factory(detector, config=detector_config) mask = detector_object.mask wavelength = energy_wavelength(energy) ai = AzimuthalIntegrator( detector=detector_object, **geometry, wavelength=wavelength ) calibrant_object = pyFAI.calibrant.get_calibrant(calibrant) if pyfai_api.USE_PROPERTY_API: calibrant_object.wavelength = wavelength else: calibrant_object.set_wavelength(wavelength) levels = calibrant_object.get_2th() if max_rings: if max_rings < 0: max_rings = None else: max_rings = None if max_rings: levels = levels[:max_rings] image = ai.twoThetaArray() legends = list() if not legend: legend = "theory" for i, level in enumerate(levels): polygons = find_contours(image, level, mask=mask) color = None for j, polygon in enumerate(polygons): x = polygon[:, 1] + 0.5 y = polygon[:, 0] + 0.5 s = plot.addCurve( x=x, y=y, legend=f"{legend}-{i}-{j}", linestyle="-", resetzoom=False, color=color, **kwargs, ) legends.append(s) if j == 0: color = plot.getCurve(s).getColor() return legends
[docs] def plot_detected_rings( plot: PlotWidget, rings: dict, legend=None, **kwargs ) -> List[str]: legends = list() if not legend: legend = "detected" cm = Colormap(name="jet", normalization="linear", vmin=0, vmax=len(rings)) for value, (label, points) in enumerate(rings.items()): value = numpy.full_like(points["p1"], value * 100) legend = plot.addScatter( points["p1"], points["p0"], value, legend=f"{legend}_{label}", symbol=".", colormap=cm, **kwargs, ) legends.append(legend) return legends