Source code for ewoksxrpd.tasks.multi_geometry_integrate
from typing import Any
from typing import Dict
from typing import Tuple
from ewoksdata.data.bliss import get_image
from pyFAI.goniometer import Goniometer
from pyFAI.goniometer import GoniometerRefinement
try:
from pyFAI.integrator.azimuthal import AzimuthalIntegrator
except ImportError:
from pyFAI import AzimuthalIntegrator
from pyFAI.units import Unit
from .base_integrate import BaseIntegrate
from .utils import integrate_utils
from .utils import pyfai_utils
[docs]
class Integrate2DMultiGeometry(
BaseIntegrate,
input_names=["goniometer_file", "positions", "images"],
output_names=[
"info",
"radial",
"azimuthal",
"intensity",
"intensity_error",
"radial_units",
"azimuthal_units",
],
):
[docs]
def run(self):
positions: list[float] = self.inputs.positions
raw_integration_options = self._get_ewoks_pyfai_options()
multi_geometry_options, integrate2d_options = (
pyfai_utils.split_multi_geom_and_integration_options(
raw_integration_options
)
)
retry_timeout = self.get_input_value("retry_timeout", None)
retry_period = self.get_input_value("retry_period", None)
goniometer = Goniometer.sload(self.inputs.goniometer_file)
mg_ai = goniometer.get_mg(positions, **multi_geometry_options)
images = get_image(
self.inputs.images, retry_timeout=retry_timeout, retry_period=retry_period
)
result = mg_ai.integrate2d(images, **integrate2d_options)
first_position = pyfai_utils.pyfai_to_goniometer(positions[0])
first_position_ai = goniometer.get_ai(first_position)
self.outputs.radial = result.radial
self.outputs.azimuthal = result.azimuthal
self.outputs.intensity = result.intensity
self.outputs.intensity_error = integrate_utils.get_intensity_error(result)
result_unit: Tuple[Unit, Unit] = result.unit
radial_unit, azim_unit = result_unit
self.outputs.radial_units = radial_unit.name
self.outputs.azimuthal_units = azim_unit.name
self.outputs.info = self._build_integration_info(
raw_integration_options, goniometer, first_position_ai
)
def _build_integration_info(
self,
raw_integration_options,
goniometer: GoniometerRefinement,
first_position_ai: AzimuthalIntegrator,
) -> Dict[str, Any]:
info = pyfai_utils.compile_integration_info(raw_integration_options)
info["goniometer"] = goniometer.to_dict()
info[pyfai_utils.MULTIGEOMETRY_FIRST_PONI] = pyfai_utils.ai_to_poni(
first_position_ai
)
return info