LDMX Software
eventbuilder::FragmentBuffer Class Reference

Public Types

using Timestamp = long long
 

Public Member Functions

void addFragment (DataFragment &&fragment)
 
bool hasExpiredFragments (Timestamp reference_time, long long coherence_window_ns)
 
Timestamp getReferenceTime () const
 
bool tryBuildEvent (long long coherence_window_ns, int min_subsystems, std::vector< DataFragment > &built_fragments)
 

Private Attributes

std::map< Timestamp, std::vector< DataFragment > > m_fragments_
 
Timestamp m_event_reference_time_ = 0
 
std::mutex m_mutex_
 

Detailed Description

Definition at line 13 of file FragmentBuffer.h.

Member Typedef Documentation

◆ Timestamp

using eventbuilder::FragmentBuffer::Timestamp = long long

Definition at line 15 of file FragmentBuffer.h.

Member Function Documentation

◆ addFragment()

void eventbuilder::FragmentBuffer::addFragment ( DataFragment && fragment)
inline

Definition at line 17 of file FragmentBuffer.h.

17 {
18 std::lock_guard<std::mutex> lock(m_mutex_);
19
20 // Set reference time on first fragment
21 if (m_fragments_.empty()) {
22 m_event_reference_time_ = fragment.header_.timestamp_;
23 }
24
25 m_fragments_[fragment.header_.timestamp_].push_back(std::move(fragment));
26 }

◆ getReferenceTime()

Timestamp eventbuilder::FragmentBuffer::getReferenceTime ( ) const
inline

Definition at line 38 of file FragmentBuffer.h.

38 {
39 std::lock_guard<std::mutex> lock(m_mutex_);
40 return m_event_reference_time_;
41 }

◆ hasExpiredFragments()

bool eventbuilder::FragmentBuffer::hasExpiredFragments ( Timestamp reference_time,
long long coherence_window_ns )
inline

Definition at line 28 of file FragmentBuffer.h.

29 {
30 std::lock_guard<std::mutex> lock(m_mutex_);
31 if (m_fragments_.empty()) {
32 return false;
33 }
34 auto it_oldest = m_fragments_.begin();
35 return it_oldest->first < reference_time - coherence_window_ns;
36 }

◆ tryBuildEvent()

bool eventbuilder::FragmentBuffer::tryBuildEvent ( long long coherence_window_ns,
int min_subsystems,
std::vector< DataFragment > & built_fragments )
inline

Definition at line 43 of file FragmentBuffer.h.

44 {
45 std::lock_guard<std::mutex> lock(m_mutex_);
46 if (m_fragments_.empty()) return false;
47
48 // Use the stored reference time from the first fragment in current
49 // collection
50 Timestamp window_ref_time = m_event_reference_time_;
51
52 auto it_begin =
53 m_fragments_.lower_bound(window_ref_time - coherence_window_ns);
54 auto it_end =
55 m_fragments_.upper_bound(window_ref_time + coherence_window_ns);
56
57 if (it_begin == it_end) return false;
58
59 std::set<uint64_t> subsystems_found;
60 std::vector<Timestamp> timestamps_in_window;
61
62 for (auto it = it_begin; it != it_end; ++it) {
63 timestamps_in_window.push_back(it->first);
64 for (const auto& frag : it->second) {
65 subsystems_found.insert(frag.header_.subsystem_id_);
66 }
67 }
68
69 // Require at least min_subsystems distinct subsystems in the window before
70 // assembling, so we don't emit partial events. Configurable.
71 if (subsystems_found.size() < static_cast<size_t>(min_subsystems)) {
72 return false;
73 }
74
75 // Collect fragments and remove them from buffer
76 for (Timestamp ts : timestamps_in_window) {
77 for (auto& frag : m_fragments_[ts]) {
78 built_fragments.push_back(std::move(frag));
79 }
80 m_fragments_.erase(ts);
81 }
82
83 // Reset reference time for next event
84 if (!m_fragments_.empty()) {
85 m_event_reference_time_ = m_fragments_.begin()->first;
86 }
87
88 return true;
89 }

Member Data Documentation

◆ m_event_reference_time_

Timestamp eventbuilder::FragmentBuffer::m_event_reference_time_ = 0
private

Definition at line 93 of file FragmentBuffer.h.

◆ m_fragments_

std::map<Timestamp, std::vector<DataFragment> > eventbuilder::FragmentBuffer::m_fragments_
private

Definition at line 92 of file FragmentBuffer.h.

◆ m_mutex_

std::mutex eventbuilder::FragmentBuffer::m_mutex_
mutableprivate

Definition at line 94 of file FragmentBuffer.h.


The documentation for this class was generated from the following file: