From Eiger HDF5 to CBF frames#

This tutorial shows the CBF conversion path provided by ewoksscxrd through fabio.app.eiger2cbf, with bundled XDS.INP generation.

1. Choose the bundled workflow#

Use:

  • src/ewoksscxrd/workflows/demo_eiger2cbf.json

2. Inspect task inputs#

ewoks show src/ewoksscxrd/workflows/demo_eiger2cbf.json

The main runtime inputs are:

  • images: list of Eiger or LImA HDF5 files

  • output: CBF filename template such as frame_{index}.cbf

Useful optional inputs include offset, mask, pilatus, energy or wavelength, distance, beam, goniometer angles, and the image transform flags (rotation, transpose, flip_ud, flip_lr).

Because the workflow also runs CreateXDSInp, you must also provide the XDS geometry inputs such as detector, nx, ny, qx, qy, data_range, and oscillation_range. Provide starting_angle only if you want STARTING_ANGLE and STARTING_FRAME written into XDS.INP.

3. Execute the workflow from Python#

import json
from pathlib import Path

from ewoks import execute_graph

workflow_path = Path("src/ewoksscxrd/workflows/demo_eiger2cbf.json")
workflow = json.loads(workflow_path.read_text())

inputs = [
    {
        "name": "images",
        "value": ["/data/.../scan0001/eiger_0000.h5"],
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
    {
        "name": "output",
        "value": "/data/.../scan0001/cbf/frame_{index:04d}.cbf",
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
    {
        "name": "offset",
        "value": 1,
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
    {
        "name": "wavelength",
        "value": 0.2846,
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
    {
        "name": "distance",
        "value": 0.1518,
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
    {
        "name": "beam",
        "value": [1052, 1102],
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
    {
        "name": "rotation",
        "value": 180,
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
    {
        "name": "flip_lr",
        "value": True,
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
    {
        "name": "omega",
        "value": "-36.000000-index*-0.500000",
        "task_identifier": "ewoksscxrd.tasks.eiger2cbf.Eiger2CBF",
    },
]

execute_graph(
    workflow,
    inputs=inputs,
    convert_destination="executed_demo_eiger2cbf.json",
    merge_outputs=False,
)

4. Execute the script#

python run_eiger2cbf.py

5. Validate produced files#

The conversion creates one .cbf file per frame under the directory selected by the output template.