Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/nexgen/beamlines/i19_2/eiger.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,14 @@ def eiger_writer(
source = Source("I19-2")

# Define Eiger 4M params
overload = (
1834948 if eiger_settings.stream_format == EigerStreamFormat.CBOR else 50649
)
eiger_params = EigerDetector(
"Eiger 2X 4M",
(2162, 2068),
"CdTe",
50649,
overload,
-1,
stream=eiger_settings.stream_format,
)
Expand Down
9 changes: 9 additions & 0 deletions src/nexgen/beamlines/i19_2/parameters.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
"""Define a collection parameter model for I19-2"""

from collections.abc import Sequence
from enum import StrEnum
from pathlib import Path
from typing import NamedTuple

from pydantic import field_validator

from nexgen.beamlines.beamline_utils import GeneralParams
from nexgen.utils import get_iso_timestamp


# Useful axis definitions and parameters
Expand Down Expand Up @@ -74,3 +76,10 @@ def _parse_metafile(cls, metafile: str | Path):
if isinstance(metafile, str):
return Path(metafile)
return metafile

@field_validator("timestamps", mode="before")
@classmethod
def _parse_timestamps(cls, timestamps: Sequence[int | None]):
start = get_iso_timestamp(timestamps[0]) if timestamps[0] else ""
end = get_iso_timestamp(timestamps[1]) if timestamps[1] else ""
return (start, end)
6 changes: 5 additions & 1 deletion src/nexgen/nxs_write/nxclass_writers.py
Original file line number Diff line number Diff line change
Expand Up @@ -781,7 +781,11 @@ def write_NXcollection(
)
if "EIGER" in detector_params.description.upper() and meta:
for field in DETECTOR_SPECIFIC_PARAMS:
grp[field] = h5py.ExternalLink(meta.name, detector_params.constants[field])
if field in detector_params.constants.keys():
# New EIGER cbor format does not have all fields in meta file
grp[field] = h5py.ExternalLink(
meta.name, detector_params.constants[field]
)
elif "TRISTAN" in detector_params.description.upper():
tick = ureg.Quantity(detector_params.constants["detector_tick"])
grp.create_dataset("detector_tick", data=tick.magnitude)
Expand Down
3 changes: 2 additions & 1 deletion src/nexgen/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ def get_iso_timestamp(ts: str | float | None) -> str:
"%Y-%m-%dT%H:%M:%SZ", # ISO8601 formatted string
"%Y-%m-%dT%H:%M:%S",
"%Y-%m-%d %H:%M:%S",
"%Y-%m-%d %H:%M:%S.%f",
"%a %b %d %Y %H:%M:%S",
"%A, %d. %B %Y %I:%M%p",
]
Expand All @@ -255,7 +256,7 @@ def get_iso_timestamp(ts: str | float | None) -> str:
elif isinstance(ts, str):
for fmt in format_list:
if _validate_timestamp_string(ts, fmt) is True:
ts_iso = datetime.strptime(ts, fmt).isoformat()
ts_iso = datetime.strptime(ts, fmt).isoformat(timespec="seconds")
break
if not ts_iso:
raise ValueError(
Expand Down
4 changes: 0 additions & 4 deletions tests/beamlines/i19_2/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,3 @@ def dummy_eiger_collection_params():
metafile="/path/to/somefile_meta.h5",
detector_name=DetectorName.EIGER,
)


# @pytest.fixture
# def dummy_eiger_settings()
14 changes: 14 additions & 0 deletions tests/beamlines/i19_2/test_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,17 @@ def test_collection_parameters(dummy_eiger_collection_params: CollectionParams):
assert not dummy_eiger_collection_params.axes_pos
assert not dummy_eiger_collection_params.det_pos
assert dummy_eiger_collection_params.tot_num_images == 10


def test_collection_parameters_timestamps():
params = CollectionParams(
exposure_time=0.01,
beam_center=(100, 200),
wavelength=0.4,
metafile="/path/to/somefile_meta.h5",
detector_name="eiger",
timestamps=("2026-07-06 17:00:21", None),
)

assert params.timestamps[0] == "2026-07-06T17:00:21Z"
assert params.timestamps[1] == ""
Loading