From e8c4d64f6251260f9c2f7cbdbf2e532166965639 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Fri, 15 May 2026 13:15:58 +0100 Subject: [PATCH 1/2] Emit some frames as vetoed --- src/howl.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/howl.rs b/src/howl.rs index 76589cd..2b1cd45 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -133,7 +133,7 @@ fn produce_messages( match producer.send( BaseRecord::to(conf.event_topic) .key("") - .payload(generate_fake_metadata(fbb, now_nanos)) + .payload(generate_fake_metadata(rng, fbb, now_nanos)) .timestamp(now_nanos / 1_000_000), ) { Ok(_) => {} @@ -238,14 +238,19 @@ fn generate_fake_events<'a>( fbb.finished_data() } -fn generate_fake_metadata<'a>(fbb: &'a mut FlatBufferBuilder<'_>, timestamp_ns: i64) -> &'a [u8] { +fn generate_fake_metadata<'a>( + rng: &mut ThreadRng, + fbb: &'a mut FlatBufferBuilder<'_>, + timestamp_ns: i64 +) -> &'a [u8] { fbb.reset(); + let vetos = rng.random_range(0..=1); let args = Pu00MessageArgs { reference_time: timestamp_ns, message_id: 0, source_name: Some(fbb.create_string("saluki")), period_number: Some(0), - vetos: Some(0), + vetos: Some(vetos), proton_charge: Some(0.1), }; let pu00 = Pu00Message::create(fbb, &args); @@ -281,7 +286,7 @@ pub fn howl(conf: &HowlConfig) { as u32; debug!("ev44 size is {ev44_size} bytes"); - let pu00_size = generate_fake_metadata(&mut fbb, now_nanos).len() as u32; + let pu00_size = generate_fake_metadata(&mut rng, &mut fbb, now_nanos).len() as u32; debug!("pu00 size is {pu00_size} bytes"); // calculate overall rate (with both ev44 and pu00) From b61d4cd510e038d29441c789accef0fd6cbb96d3 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Fri, 15 May 2026 13:31:42 +0100 Subject: [PATCH 2/2] do it properly --- src/howl.rs | 18 +++++++++++++----- src/main.rs | 5 +++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/howl.rs b/src/howl.rs index 2b1cd45..d4a9cff 100644 --- a/src/howl.rs +++ b/src/howl.rs @@ -133,7 +133,12 @@ fn produce_messages( match producer.send( BaseRecord::to(conf.event_topic) .key("") - .payload(generate_fake_metadata(rng, fbb, now_nanos)) + .payload(generate_fake_metadata( + rng, + fbb, + now_nanos, + conf.veto_probability, + )) .timestamp(now_nanos / 1_000_000), ) { Ok(_) => {} @@ -241,16 +246,17 @@ fn generate_fake_events<'a>( fn generate_fake_metadata<'a>( rng: &mut ThreadRng, fbb: &'a mut FlatBufferBuilder<'_>, - timestamp_ns: i64 + timestamp_ns: i64, + veto_probability: f64, ) -> &'a [u8] { fbb.reset(); - let vetos = rng.random_range(0..=1); + let is_vetoed = rng.random_range(0.0..1.0) < veto_probability; let args = Pu00MessageArgs { reference_time: timestamp_ns, message_id: 0, source_name: Some(fbb.create_string("saluki")), period_number: Some(0), - vetos: Some(vetos), + vetos: Some(if is_vetoed { 1 } else { 0 }), proton_charge: Some(0.1), }; let pu00 = Pu00Message::create(fbb, &args); @@ -265,6 +271,7 @@ pub struct HowlConfig<'a> { pub messages_per_frame: u32, pub frames_per_second: u32, pub frames_per_run: u32, + pub veto_probability: f64, // 1 = always vetoed, 0 = never vetoed pub event_message_config: &'a EventMessageConfig, pub kafka_config: Option>, } @@ -286,7 +293,8 @@ pub fn howl(conf: &HowlConfig) { as u32; debug!("ev44 size is {ev44_size} bytes"); - let pu00_size = generate_fake_metadata(&mut rng, &mut fbb, now_nanos).len() as u32; + let pu00_size = + generate_fake_metadata(&mut rng, &mut fbb, now_nanos, conf.veto_probability).len() as u32; debug!("pu00 size is {pu00_size} bytes"); // calculate overall rate (with both ev44 and pu00) diff --git a/src/main.rs b/src/main.rs index a79973c..9d30b17 100644 --- a/src/main.rs +++ b/src/main.rs @@ -87,6 +87,9 @@ enum Commands { /// Maximum detector ID #[arg(long, default_value = "1000")] det_max: i32, + /// Veto probability (0 = never vetoed; 1 = always vetoed) + #[arg(long, default_value = "0.0")] + veto_probability: f64, // Additonal command line arguments #[arg(short = 'X', long)] kafka_config: Option>, @@ -147,6 +150,7 @@ async fn main() { tof_sigma, det_min, det_max, + veto_probability, kafka_config, } => howl(&HowlConfig { kafka_config, @@ -163,6 +167,7 @@ async fn main() { det_min, det_max, }, + veto_probability, }), Commands::Count { topic,