Files
Jungfraujoch/reader/JFJochStartMessageReader.h
T
leonarski_fandClaude Opus 5.5 3a44779d79 broker: rugnux live - rugnux runs inside the broker while a DECTRIS rotation collection arrives (demo prototype)
A DECTRIS rotation collection, with the mode switched on (PUT /config/rugnux), goes to
JFJochReceiverRugnux instead of JFJochReceiverLite: the images are forwarded as before, without the
per-image analysis, and one rugnux thread reads them back from the image buffer
(JFJochImageBufferReader) as they arrive. END waits for rugnux and carries its lattice, refined
geometry and per-image results. A small second run on the first 60 degrees reports early whether
there is a lattice. The live state, steps and result are at GET /rugnux/status and on a new
"Rugnux live" frontend page.

rugnux: ProcessConfig::fast_live takes every decision where it is first made and does nothing again
once the sweep is in (near-tie re-checks and the run made again, rotation-scale walk, metric-symmetry
arms, geometry walk, the supercell and quality guards, the doubled cell), so the run ends a fixed
time after the last image. A cut (/cancel, or deadline_s after the last image) hands over what is
established. Off by default: the CLI and the battery are unchanged (--fast-live is hidden, with
--simulate-live).

With the mode off the broker is unchanged. Not built yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 12:20:38 +02:00

62 lines
2.6 KiB
C++

// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#include <condition_variable>
#include <mutex>
#include <stdexcept>
#include <string>
#include <vector>
#include "JFJochReader.h"
#include "HDF5ImageSource.h"
// The broker that reported a collection's data files can no longer be heard from, and an image this
// reader was asked for has not been reported: it will never be read.
class LiveCollectionLost : public std::runtime_error {
public:
explicit LiveCollectionLost(const std::string &what) : std::runtime_error(what) {}
};
// The dataset as the start message describes it - the same quantities an HDF5 master states, taken
// from the message the writer wrote it from.
std::shared_ptr<JFJochReaderDataset> DatasetFromStartMessage(const StartMessage &start,
const DiffractionExperiment &defaults);
// Reads a collection while it is being written: the dataset comes from its start message, as the
// broker sends it, and the images straight from the data files - /entry/data/data in each - once the
// broker reports a file closed and renamed into place (FileClosed). A read of an image whose file has
// not been reported waits for it; after Ended it returns false for an image no file holds, and after
// Lost it throws. The master file is never read.
class JFJochStartMessageReader : public JFJochReader {
public:
// master_path: where the collection's master file will be; the data files are next to it.
void Open(const StartMessage &start, const std::string &master_path);
void FileClosed(uint64_t file_number, uint64_t image_count);
void Ended();
void Lost(const std::string &why);
[[nodiscard]] uint64_t GetNumberOfImages() const override;
void Close() override;
bool ReadRawImage(int64_t image_number, JFJochReaderRawImage &image) override;
std::vector<SpotToSave> ReadSpots(int64_t image) const override { return {}; }
private:
bool LoadImage_i(std::shared_ptr<JFJochReaderDataset> &dataset, DataMessage &message,
std::vector<uint8_t> &buffer, int64_t image_number, bool update_dataset) override;
// Waits until the file of this image is reported; false when the collection ended without it.
bool WaitForImage(int64_t image_number);
HDF5ImageSource image_source_;
uint64_t number_of_images_ = 0;
uint64_t images_per_file_ = 1;
std::mutex m_;
std::condition_variable cv_;
std::vector<int64_t> file_images_; // per data file: images it holds, -1 while not reported
bool ended_ = false;
std::string lost_;
};