Beamline specific utilities

Nexgen is currently being used for some specific applications at beamlines I19-2 and I24 at DLS.

Time resolved collections on I19-2

Where GDA is not in use, a NXmx format NeXus files writer is available for time-resolved Eiger/Tristan collections.

Example usage

Example I: Rotation scan with Tristan

"""
This example calls the nexus writer for a collection using Tristan detector.

Note that in this case the axes start and end positions need to be passed to the writer.
"""

from nexgen.beamlines.I19_2_nxs import (
    nexus_writer,
    GonioAxisPosition,
    DetAxisPosition,
    DetectorName
)

from datetime import datetime
from pathlib import Path


axes_list = [
    GonioAxisPosition(id="omega", start=0, end=10),
    GonioAxisPosition(id="kappa", start=0, end=0),
    GonioAxisPosition(id="phi", start=-90, end=-90),
    GonioAxisPosition(id="sam_z", start=0, end=0),
    GonioAxisPosition(id="sam_y", start=1, end=1),
    GonioAxisPosition(id="sam_x", start=0, end=0),
]

det_ax_list = [
    DetAxisPosition(id="two_theta", start=90),
    DetAxisPosition(id="det_z", start=100),
]

params = {
    "exposure_time"=60.0,
    "beam_center"=[1000., 1200.],
    "wavelength"=0.6,
    "transmission"=1.0,
    "detector_name"=DetectorName.TRISTAN,
    "metafile"=Path("/path/to/file_meta.h5"),
    "scan_axis"="omega",
    "axes_pos"=axes_list,
    "det_pos"=det_ax_list,
}

master_file=Path("/path/to/file.nxs")


nexus_writer(
    params=params,
    master_file=master_file,
    timestamps=(datetime.now(), None),
)

Example II: Rotation scan with Eiger

"""
This example calls the nexus writer for a collection using Eiger detector.

Note that in this case there's no need to pass the axes positions as those can be read from
the config written to the _meta.h5 file at the arming of the detector. In order to do this
the use_meta flag must be passed as True.
"""

from nexgen.beamlines.I19_2_nxs import nexus_writer, DetectorName

from datetime import datetime
from pathlib import Path

params = {
    "exposure_time"=0.01,
    "beam_center"=[1000., 1200.],
    "wavelength"=0.6,
    "transmission"=1.0,
    "detector_name"=DetectorName.EIGER,
    "metafile"=Path("/path/to/file_meta.h5"),
    "scan_axis"="phi",
}

master_file=Path("/path/to/file.nxs")

nexus_writer(
    params=params,
    master_file=master_file,
    timestamps=(datetime.now(), None),
    use_meta=True,
)

Example III: Serial collection with Eiger

"""
This example calls the nexus writer for a serial collection with a small rotation at each well
using Eiger detector.

Note that in this the use_meta tag will be passed as false and the axes positions given explicitely
to be able to give the correct values for each well.
"""

from nexgen.beamlines.I19_2_nxs import (
    serial_nexus_writer,
    GonioAxisPosition,
    DetAxisPosition,
    DetectorName,
)

from datetime import datetime
from pathlib import Path

well_number = 800

metafile = Path("/path/to/file_meta.h5")
master_template = "/path/to/file_w%0{3}d.nxs"
master_file = Path(master_template % (well_number))

axes_list = [
    GonioAxisPosition(id="phi", start=-2.5, inc=0.2),
    GonioAxisPosition(id="kappa", start=0.005),
    GonioAxisPosition(id="omega", start=-90),
    GonioAxisPosition(id="sam_x", start=0.154),
    GonioAxisPosition(id="sam_y", start=0.0),
    GonioAxisPosition(id="sam_z", start=0.77)
]

det_list = [
    DetAxisPosition(id="two_theta", start=0),
    DetAxisPosition(id="det_z", start=85)
]

params = {
    "exposure_time"=0.1,
    "beam_center"=[1000., 1200.],
    "wavelength"=0.4,
    "transmission"=10,
    "detector_name"=DetectorName.EIGER,
    "metafile"=metafile,
    "tot_num_imgs"=900,
    "scan_axis"="phi",
    "axes_pos"=axes_list,
    "det_pos"=det_list,
}

serial_nexus_writer(
    params,
    master_file,
    (datetime.now(), None),
    use_meta=False,
    vds_offset=800,
    n_frames=25,
)

Serial crystallography

  • I24: serial crystallography with Eiger detector
    • Still shots (or extruder)

    • Fixed target

    • 3D grid scan

Example usage

Example: grid scan on I24

"This example calls the SSX writer for a fixed_target experiment on I24."

from nexgen.beamlines.I24_Eiger_nxs import ssx_eiger_writer
from datetime import datetime

beam_x = 1590.7
beam_y = 1643.7

D = 1.480   # Detector distance passed in mm
t = 0.01    # Exposure time passed in s

# Example of chip_dict (form beamline I24) with minimum required values needed for goniometer computations.
chip_dict = {
    'X_NUM_STEPS':    [11, 20],
    'Y_NUM_STEPS':    [12, 20],
    'X_STEP_SIZE':    [13, 0.125],
    'Y_STEP_SIZE':    [14, 0.125],
    'X_START':        [16, 0],
    'Y_START':        [17, 0],
    'Z_START':        [18, 0],
    'X_NUM_BLOCKS':   [20, 8],
    'Y_NUM_BLOCKS':   [21, 8],
    'X_BLOCK_SIZE':   [24, 3.175],
    'Y_BLOCK_SIZE':   [25, 3.175],
    'N_EXPOSURES':    [30, 1],
    'PUMP_REPEAT':    [32, 0],
}

ssx_eiger_writer(
    "/path/to/dataset",     # visitpath
    "Expt1_00",    # filename root
    "I24",      # beamline
    "fixed_target",     # experiment type
    pump_status=True,
    num_imgs=1600,
    beam_center=[beam_x, beam_y],
    det_dist=D,
    start_time=datetime.strptime("2022-09-09T14:19:27", "%Y-%m-%dT%H:%M:%S"),
    stop_time=datetime.now(),
    exp_time=t,
    transmission=1.,
    wavelength=0.67019,
    flux=None,
    pump_exp=None,
    pump_delay=0.001,
    chip_info=chip_dict,
    chipmap="/path/to/chip.map/file",
)

I19-2 CLI

Example usage

Write a NeXus file for a Tristan collection using a GDA-generated xml file containing the beamline information:

I19_nexus 1 Expt_00_meta.h5 Expt.xml tristan 300 0.649 1590.7 1643.7 --start 2022-09-09T10:26:32Z --stop 2022-09-09T10:31:32Z

Manually generate a NeXus file for a dataset collected on Eiger detector using the metadata recorded inside the meta file:

I19_nexus 2 Expt1_00_meta.h5 eiger 0.02 -tr 100 --use-meta

If the –use-meta flag is not passed, the writer will not look up the axes/beam_center/wavelength information in the meta file. This will then need to be passed from the commang line:

I19_nexus gen Expt1_00_meta.h5 eiger 0.095 -wl 0.485 -bc 989.8 1419 --det-axes det_z --det-start 140 --axes omega phi --ax-start -90 -130.5 --ax-inc 0 0.1 -tr 5 -n 75

Note

Only the goniometer/detector axes that have values and increments different from 0 need to be passed to the command line. If –scan-axis is not passed, it will default to ‘phi’. If -bc (beam_center) is not passed, in the absence of a meta file it will default to (0, 0)

The full options for the I19 command line tool can be visualised by:

I19_nexus 2 --help

SSX CLI

Example usage

Write a NeXus file for a serial collection on Eiger detector on beamline I24 at DLS:

SSX_nexus eiger dummy_00_meta.h5 I24 fixed-target 1600 -det 500 -tr 1.0 -wl 0.649 -bc 1590.7 1643.7 -e 0.002 -p --chipmap testchip.map