From 25402246e2d75ba7b5f85cf3df40575fe37eed03 Mon Sep 17 00:00:00 2001 From: sam-fogarty Date: Tue, 4 Nov 2025 10:45:59 -0800 Subject: [PATCH 1/2] Add fix for repeated ext trig packets in 2x2 run2 --- src/proto_nd_flow/reco/charge/raw_event_builder.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/proto_nd_flow/reco/charge/raw_event_builder.py b/src/proto_nd_flow/reco/charge/raw_event_builder.py index 768fc3a7..7d8512e3 100644 --- a/src/proto_nd_flow/reco/charge/raw_event_builder.py +++ b/src/proto_nd_flow/reco/charge/raw_event_builder.py @@ -514,8 +514,13 @@ def build_events(self, packets, unix_ts, mc_assn=None): if self.trig_io_grp != [-1]: iog_masks = [packets['io_group'] == iog for iog in self.trig_io_grp] trig_mask &= np.logical_or.reduce(iog_masks) - trigger_idcs = np.where(trig_mask)[0] - + + trig_ts = ts[trig_mask] + if np.any(np.diff(trig_ts) == 3): # account for repeated triggers caused by 2x2 run2 trigger issue per-10/28/25 + trigger_idcs = np.concatenate(([0], np.where(np.diff(trig_ts) != 3)[0]+1)) + else: + trigger_idcs = np.where(trig_mask)[0] + events = [] event_unix_ts = [] event_mc_assn = [] if mc_assn is not None else None From 34c221699e8c48e53326e356502521717db9a1a3 Mon Sep 17 00:00:00 2001 From: sam-fogarty Date: Tue, 4 Nov 2025 20:52:27 -0800 Subject: [PATCH 2/2] Implement repeat trigger fix in raw_event_generator --- src/proto_nd_flow/reco/charge/raw_event_builder.py | 6 +----- src/proto_nd_flow/reco/charge/raw_event_generator.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/proto_nd_flow/reco/charge/raw_event_builder.py b/src/proto_nd_flow/reco/charge/raw_event_builder.py index 7d8512e3..f087099b 100644 --- a/src/proto_nd_flow/reco/charge/raw_event_builder.py +++ b/src/proto_nd_flow/reco/charge/raw_event_builder.py @@ -515,11 +515,7 @@ def build_events(self, packets, unix_ts, mc_assn=None): iog_masks = [packets['io_group'] == iog for iog in self.trig_io_grp] trig_mask &= np.logical_or.reduce(iog_masks) - trig_ts = ts[trig_mask] - if np.any(np.diff(trig_ts) == 3): # account for repeated triggers caused by 2x2 run2 trigger issue per-10/28/25 - trigger_idcs = np.concatenate(([0], np.where(np.diff(trig_ts) != 3)[0]+1)) - else: - trigger_idcs = np.where(trig_mask)[0] + trigger_idcs = np.where(trig_mask)[0] events = [] event_unix_ts = [] diff --git a/src/proto_nd_flow/reco/charge/raw_event_generator.py b/src/proto_nd_flow/reco/charge/raw_event_generator.py index 45b8a055..2001ee9d 100644 --- a/src/proto_nd_flow/reco/charge/raw_event_generator.py +++ b/src/proto_nd_flow/reco/charge/raw_event_generator.py @@ -447,6 +447,16 @@ def next(self): if self.is_mc: mc_assn = mc_assn[mask] + pkts_indices = np.arange(len(packet_buffer)) + trig_mask = packet_buffer['packet_type'] == 7 + trig_ts = packet_buffer['timestamp'][trig_mask] + + # handle when there are duplicate triggers -- specifically designed to handle the 2x2 run2 problem where repeat pulses have precisely 3 ticks between them + ts_diff = np.diff(trig_ts) + if np.any(ts_diff == 3): + trigger_idcs = np.concatenate(([0], np.where(ts_diff != 3)[0]+1)) + packet_buffer = packet_buffer[(packet_buffer['packet_type'] != 7) | np.isin(pkts_indices, pkts_indices[trig_mask][trigger_idcs])] + # find unix timestamp groups ts_mask = packet_buffer['packet_type'] == 4 ts_grps = np.split(packet_buffer, np.argwhere(ts_mask).ravel())