diff --git a/broker/gen/model/Rugnux_live_status.h b/broker/gen/model/Rugnux_live_status.h
index 58ccc5a36..45e42dea7 100644
--- a/broker/gen/model/Rugnux_live_status.h
+++ b/broker/gen/model/Rugnux_live_status.h
@@ -210,7 +210,7 @@ public:
bool lastImageToWrittenSIsSet() const;
void unsetLast_image_to_written_s();
///
- /// OK, WARNINGS, UNUSABLE or FAILED; empty until the run is over
+ /// OK, WARNINGS, UNUSABLE, FAILED or CANCELLED; empty until the run is over
///
std::string getVerdict() const;
void setVerdict(std::string const& value);
diff --git a/broker/gen/model/Rugnux_live_stills.h b/broker/gen/model/Rugnux_live_stills.h
index e7021606b..18bed6ef1 100644
--- a/broker/gen/model/Rugnux_live_stills.h
+++ b/broker/gen/model/Rugnux_live_stills.h
@@ -12,7 +12,7 @@
/*
* Rugnux_live_stills.h
*
- * Serial frames converted by the FPGA and analysed on the GPU: the pre-pass on the first images (the beam centre, distance and mask the whole collection is analysed with), and the analysis since.
+ * Serial frames analysed on the GPU: the pre-pass on the first images (the beam centre, distance and mask the whole collection is analysed with), and the analysis since.
*/
#ifndef Rugnux_live_stills_H_
@@ -26,7 +26,7 @@ namespace org::openapitools::server::model
{
///
-/// Serial frames converted by the FPGA and analysed on the GPU: the pre-pass on the first images (the beam centre, distance and mask the whole collection is analysed with), and the analysis since.
+/// Serial frames analysed on the GPU: the pre-pass on the first images (the beam centre, distance and mask the whole collection is analysed with), and the analysis since.
///
class Rugnux_live_stills
{
diff --git a/broker/gen/model/Rugnux_settings.h b/broker/gen/model/Rugnux_settings.h
index def16b489..8719ca61e 100644
--- a/broker/gen/model/Rugnux_settings.h
+++ b/broker/gen/model/Rugnux_settings.h
@@ -12,7 +12,7 @@
/*
* Rugnux_settings.h
*
- * Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux inside the broker while they arrive, and the merged result is sent to the writer. Serial collections converted by the FPGA (JUNGFRAU) are analysed on the GPU after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`).
+ * Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux inside the broker while they arrive, and the merged result is sent to the writer. Serial collections, from a DECTRIS detector or converted by the FPGA (JUNGFRAU), are analysed on the GPU after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`), and merged as they go.
*/
#ifndef Rugnux_settings_H_
@@ -25,7 +25,7 @@ namespace org::openapitools::server::model
{
///
-/// Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux inside the broker while they arrive, and the merged result is sent to the writer. Serial collections converted by the FPGA (JUNGFRAU) are analysed on the GPU after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`).
+/// Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux inside the broker while they arrive, and the merged result is sent to the writer. Serial collections, from a DECTRIS detector or converted by the FPGA (JUNGFRAU), are analysed on the GPU after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`), and merged as they go.
///
class Rugnux_settings
{
@@ -58,7 +58,7 @@ public:
/// Rugnux_settings members
///
- /// Process DECTRIS rotation collections with rugnux live, and FPGA serial collections on the GPU after a pre-pass
+ /// Process DECTRIS rotation collections with rugnux live, and serial collections on the GPU after a pre-pass
///
bool isEnable() const;
void setEnable(bool const value);
diff --git a/broker/jfjoch_api.yaml b/broker/jfjoch_api.yaml
index e9d61485a..744fe36cf 100644
--- a/broker/jfjoch_api.yaml
+++ b/broker/jfjoch_api.yaml
@@ -2803,13 +2803,14 @@ components:
description: |
Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux
inside the broker while they arrive, and the merged result is sent to the writer. Serial
- collections converted by the FPGA (JUNGFRAU) are analysed on the GPU after a pre-pass on their
- first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`).
+ collections, from a DECTRIS detector or converted by the FPGA (JUNGFRAU), are analysed on the GPU
+ after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in
+ `/rugnux/status`), and merged as they go.
properties:
enable:
type: boolean
default: false
- description: Process DECTRIS rotation collections with rugnux live, and FPGA serial collections on the GPU after a pre-pass
+ description: Process DECTRIS rotation collections with rugnux live, and serial collections on the GPU after a pre-pass
reserved_cpus:
type: integer
format: int64
@@ -3070,7 +3071,7 @@ components:
rugnux_live_stills:
type: object
description: |
- Serial frames converted by the FPGA and analysed on the GPU: the pre-pass on the first images (the beam
+ Serial frames analysed on the GPU: the pre-pass on the first images (the beam
centre, distance and mask the whole collection is analysed with), and the analysis since.
required:
- prepass
@@ -3251,7 +3252,7 @@ components:
description: From the last image received to all results written
verdict:
type: string
- description: OK, WARNINGS, UNUSABLE or FAILED; empty until the run is over
+ description: OK, WARNINGS, UNUSABLE, FAILED or CANCELLED; empty until the run is over
verdict_text:
type: string
summary:
diff --git a/docs/python_client/docs/RugnuxLiveStatus.md b/docs/python_client/docs/RugnuxLiveStatus.md
index 420878a72..76648c31d 100644
--- a/docs/python_client/docs/RugnuxLiveStatus.md
+++ b/docs/python_client/docs/RugnuxLiveStatus.md
@@ -30,7 +30,7 @@ Name | Type | Description | Notes
**cut** | **str** | Empty, or why the analysis was cut: `deadline` (`deadline_s` after the last image) or `cancel` (`POST /cancel`). The end message then carried what was established at the cut. | [optional]
**cut_s** | **float** | When the analysis was cut, since the first image | [optional]
**last_image_to_written_s** | **float** | From the last image received to all results written | [optional]
-**verdict** | **str** | OK, WARNINGS, UNUSABLE or FAILED; empty until the run is over |
+**verdict** | **str** | OK, WARNINGS, UNUSABLE, FAILED or CANCELLED; empty until the run is over |
**verdict_text** | **str** | |
**summary** | [**List[RugnuxSummaryRow]**](RugnuxSummaryRow.md) | |
**warnings** | **List[str]** | |
diff --git a/docs/python_client/docs/RugnuxLiveStills.md b/docs/python_client/docs/RugnuxLiveStills.md
index 81ff88590..637a70855 100644
--- a/docs/python_client/docs/RugnuxLiveStills.md
+++ b/docs/python_client/docs/RugnuxLiveStills.md
@@ -1,6 +1,6 @@
# RugnuxLiveStills
-Serial frames converted by the FPGA and analysed on the GPU: the pre-pass on the first images (the beam centre, distance and mask the whole collection is analysed with), and the analysis since.
+Serial frames analysed on the GPU: the pre-pass on the first images (the beam centre, distance and mask the whole collection is analysed with), and the analysis since.
## Properties
diff --git a/docs/python_client/docs/RugnuxSettings.md b/docs/python_client/docs/RugnuxSettings.md
index 9dd894514..24774e9cc 100644
--- a/docs/python_client/docs/RugnuxSettings.md
+++ b/docs/python_client/docs/RugnuxSettings.md
@@ -1,12 +1,12 @@
# RugnuxSettings
-Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux inside the broker while they arrive, and the merged result is sent to the writer. Serial collections converted by the FPGA (JUNGFRAU) are analysed on the GPU after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`).
+Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux inside the broker while they arrive, and the merged result is sent to the writer. Serial collections, from a DECTRIS detector or converted by the FPGA (JUNGFRAU), are analysed on the GPU after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`), and merged as they go.
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
-**enable** | **bool** | Process DECTRIS rotation collections with rugnux live, and FPGA serial collections on the GPU after a pre-pass | [optional] [default to False]
+**enable** | **bool** | Process DECTRIS rotation collections with rugnux live, and serial collections on the GPU after a pre-pass | [optional] [default to False]
**reserved_cpus** | **int** | CPU threads left to the receiver and the image pusher while rugnux runs | [optional] [default to 4]
**deadline_s** | **float** | Fixed cutoff: this long after the last image the analysis is cut, and the collection ends with what it has established (as `POST /cancel` after the last image does). 0 means no cutoff. | [optional] [default to 60.0]
diff --git a/frontend/src/client/types.gen.ts b/frontend/src/client/types.gen.ts
index 4cba588df..bd678725c 100644
--- a/frontend/src/client/types.gen.ts
+++ b/frontend/src/client/types.gen.ts
@@ -2007,13 +2007,14 @@ export type jfjoch_settings = {
/**
* Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux
* inside the broker while they arrive, and the merged result is sent to the writer. Serial
- * collections converted by the FPGA (JUNGFRAU) are analysed on the GPU after a pre-pass on their
- * first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`).
+ * collections, from a DECTRIS detector or converted by the FPGA (JUNGFRAU), are analysed on the GPU
+ * after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in
+ * `/rugnux/status`), and merged as they go.
*
*/
export type rugnux_settings = {
/**
- * Process DECTRIS rotation collections with rugnux live, and FPGA serial collections on the GPU after a pre-pass
+ * Process DECTRIS rotation collections with rugnux live, and serial collections on the GPU after a pre-pass
*/
enable?: boolean;
/**
@@ -2233,7 +2234,7 @@ export type rugnux_live_blob = {
};
/**
- * Serial frames converted by the FPGA and analysed on the GPU: the pre-pass on the first images (the beam
+ * Serial frames analysed on the GPU: the pre-pass on the first images (the beam
* centre, distance and mask the whole collection is analysed with), and the analysis since.
*
*/
@@ -2373,7 +2374,7 @@ export type rugnux_live_status = {
*/
last_image_to_written_s?: number;
/**
- * OK, WARNINGS, UNUSABLE or FAILED; empty until the run is over
+ * OK, WARNINGS, UNUSABLE, FAILED or CANCELLED; empty until the run is over
*/
verdict: string;
verdict_text: string;
diff --git a/frontend/src/client/zod.gen.ts b/frontend/src/client/zod.gen.ts
index b28fd38ca..4b8d10c45 100644
--- a/frontend/src/client/zod.gen.ts
+++ b/frontend/src/client/zod.gen.ts
@@ -846,8 +846,9 @@ export const zBraggIntegrationSettings = z.object({
/**
* Rugnux live mode: rotation collections from a DECTRIS detector are processed by rugnux
* inside the broker while they arrive, and the merged result is sent to the writer. Serial
- * collections converted by the FPGA (JUNGFRAU) are analysed on the GPU after a pre-pass on their
- * first images that decides the beam centre, distance and mask (`stills` in `/rugnux/status`).
+ * collections, from a DECTRIS detector or converted by the FPGA (JUNGFRAU), are analysed on the GPU
+ * after a pre-pass on their first images that decides the beam centre, distance and mask (`stills` in
+ * `/rugnux/status`), and merged as they go.
*
*/
export const zRugnuxSettings = z.object({
@@ -951,7 +952,7 @@ export const zRugnuxLiveModel = z.object({
});
/**
- * Serial frames converted by the FPGA and analysed on the GPU: the pre-pass on the first images (the beam
+ * Serial frames analysed on the GPU: the pre-pass on the first images (the beam
* centre, distance and mask the whole collection is analysed with), and the analysis since.
*
*/
diff --git a/frontend/src/components/RugnuxPage.tsx b/frontend/src/components/RugnuxPage.tsx
index abf3d164a..2322c28af 100644
--- a/frontend/src/components/RugnuxPage.tsx
+++ b/frontend/src/components/RugnuxPage.tsx
@@ -119,13 +119,18 @@ function SummaryTiles({s}: { s: rugnux_live_status }) {
function ModelSection({s}: { s: rugnux_live_status }) {
const m = s.model!;
const mrSeconds = s.steps.find(step => step.title === "Molecular replacement")?.duration_s;
+ // Serial data place the model on each provisional merge while collecting: the viewer reloads when the model
+ // step has a new result, not every time the status is polled.
+ const resultKey = s.stills
+ ? `${m.placement} ${m.r_work} ${m.r_free} ${m.refinement?.r_free} ${s.refined_model}`
+ : `${s.elapsed_s}`;
return (
{s.placed_model &&
Loading viewer...}>
-
@@ -166,7 +171,7 @@ function RugnuxPage({measuring}: { measuring: boolean }) {
- {s.model && s.state !== 'Running' && }
+ {s.model && (s.state !== 'Running' || s.stills) && }
diff --git a/frontend/src/components/RugnuxParts.tsx b/frontend/src/components/RugnuxParts.tsx
index 6a8a9105e..7dfce46b0 100644
--- a/frontend/src/components/RugnuxParts.tsx
+++ b/frontend/src/components/RugnuxParts.tsx
@@ -11,6 +11,8 @@ export const verdictSeverity = (verdict: string) => {
return "success";
case "WARNINGS":
return "warning";
+ case "CANCELLED":
+ return "info";
default:
return "error";
}
diff --git a/frontend/src/components/RugnuxSettings.tsx b/frontend/src/components/RugnuxSettings.tsx
index 8fd76bbca..8c5de7ea0 100644
--- a/frontend/src/components/RugnuxSettings.tsx
+++ b/frontend/src/components/RugnuxSettings.tsx
@@ -50,7 +50,7 @@ function RugnuxSettings({measuring}: { measuring: boolean }) {
onUpload={() => settings.submit({enable, reserved_cpus: cpus, deadline_s: deadline})}
uploadDisabled={measuring || cpusError || deadlineError || settings.pending}
snackbar={settings.snackbar}>
- setEnable(e.target.checked)}/>}/>