From 029b046f6666b39fe019cbc4b1f1a49a87a76e85 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Thu, 1 Oct 2026 15:50:20 +0100 Subject: [PATCH 1/2] fill out default nexus structure using streamed events as a sensible default --- src/howl.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/src/howl.rs b/src/howl.rs index f01575d..60895fb 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -24,6 +24,7 @@ use rand::prelude::ThreadRng; use rand_distr::{Distribution, Normal}; use rdkafka::ClientConfig; use rdkafka::producer::{BaseRecord, DefaultProducerContext, ThreadedProducer}; +use serde_json::json; use uuid::Uuid; fn generate_run_start<'a>( @@ -55,7 +56,7 @@ fn generate_run_start<'a>( }); fbb.create_string(&json_structure.to_string()) }) - .unwrap_or_else(|| fbb.create_string("{}")); + .unwrap_or_else(|| fbb.create_string(generate_default_nexus_structure(config).as_str())); let det_spec_map_buf = SpectraDetectorMapping::create(fbb, &args); let file_name = format!("{}.nxs", Uuid::new_v4()); @@ -87,6 +88,38 @@ fn generate_run_start<'a>( fbb.finished_data() } +fn generate_default_nexus_structure(config: &HowlConfig) -> String { + json!( + { + "children": [ + { + "type": "group", + "name": "raw_data_1", + "children": [ + { + "type": "group", + "name": "events", + "children": [ + { + "type": "stream", + "stream": { + "topic": config.event_topic, + "source": "saluki_howl", + "writer_module": "ev44", + }, + }, + ], + "attributes": [{"name": "NX_class", "values": "NXentry"}], + }, + ], + "attributes": [{"name": "NX_class", "values": "NXentry"}], + } + ] + } + ) + .to_string() +} + fn generate_run_stop<'a>(fbb: &'a mut FlatBufferBuilder<'_>, job_id: &str) -> &'a [u8] { fbb.reset(); let stop_time = SystemTime::now() @@ -379,3 +412,43 @@ pub fn howl(conf: &HowlConfig) { } } } + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::Value; + + #[test] + fn test_generate_default_nexus_structure_substitutes_topic_correctly() { + let event_topic = "myevents"; + let conf = HowlConfig { + broker: "blah", + event_topic, + run_info_topic: "blah", + messages_per_frame: 1, + frames_per_second: 1, + frames_per_run: 1, + veto_probability: 0.5, + event_message_config: &EventMessageConfig { + events_per_message: 0, + tof_peak: 0.0, + tof_sigma: 0.0, + det_min: 0, + det_max: 0, + }, + + fast: false, + kafka_config: None, + nexus_structure_path: None, + }; + + let out = generate_default_nexus_structure(&conf); + + let j: Value = serde_json::from_str(&out).unwrap(); + + assert_eq!( + j["children"][0]["children"][0]["children"][0]["stream"]["topic"], + event_topic + ) + } +} From 8fcb7512bfa95c9959c96e33be3dff015e84790b Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Thu, 1 Oct 2026 17:18:46 +0100 Subject: [PATCH 2/2] make default nexus structure match new fw --- src/howl.rs | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/howl.rs b/src/howl.rs index 60895fb..679d6a8 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -90,33 +90,33 @@ fn generate_run_start<'a>( fn generate_default_nexus_structure(config: &HowlConfig) -> String { json!( + { + "children": [ { - "children": [ + "type": "group", + "name": "raw_data_1", + "attributes": { + "NX_class": "NXentry" + }, + "children": [ { - "type": "group", - "name": "raw_data_1", - "children": [ - { - "type": "group", - "name": "events", - "children": [ - { - "type": "stream", - "stream": { - "topic": config.event_topic, - "source": "saluki_howl", - "writer_module": "ev44", - }, - }, - ], - "attributes": [{"name": "NX_class", "values": "NXentry"}], - }, - ], - "attributes": [{"name": "NX_class", "values": "NXentry"}], + "type": "group", + "name": "detector_1_events", + "children": [ + { + "module": "NXevent_data", + "config": { + "topic": config.event_topic + } + } + ] } - ] + ] + } + ] } - ) + + ) .to_string() } @@ -447,7 +447,7 @@ mod tests { let j: Value = serde_json::from_str(&out).unwrap(); assert_eq!( - j["children"][0]["children"][0]["children"][0]["stream"]["topic"], + j["children"][0]["children"][0]["children"][0]["config"]["topic"], event_topic ) }