DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TriggerRecordBuilderData.hpp
Go to the documentation of this file.
1
12#ifndef DFMODULES_SRC_DFMODULES_TRIGGERRECORDBUILDERDATA_HPP_
13#define DFMODULES_SRC_DFMODULES_TRIGGERRECORDBUILDERDATA_HPP_
14
18
19#include "ers/Issue.hpp"
20#include "nlohmann/json.hpp"
22#include "logging/Logging.hpp" // NOTE: if ISSUES ARE DECLARED BEFORE include logging/Logging.hpp, TLOG_DEBUG<<issue wont work.
23
24#include <atomic>
25#include <chrono>
26#include <functional>
27#include <limits>
28#include <list>
29#include <memory>
30#include <mutex>
31#include <string>
32#include <utility>
33
34namespace dunedaq {
35// Disable coverage checking LCOV_EXCL_START
37 DFOThresholdsNotConsistent,
38 "Busy threshold (" << busy << ") is smaller than free threshold (" << free << ')',
39 ((size_t)busy)((size_t)free))
40ERS_DECLARE_ISSUE(dfmodules,
42 "The Trigger Decision with trigger number "
43 << trigger_number << " was not found for dataflow application at " << connection_name,
44 ((daqdataformats::trigger_number_t)trigger_number)((std::string)connection_name))
45ERS_DECLARE_ISSUE(dfmodules,
46 NoSlotsAvailable,
47 "The Trigger Decision with trigger number "
48 << trigger_number << " could not be assigned to the dataflow application at " << connection_name
49 << " because no slots were available.",
50 ((daqdataformats::trigger_number_t)trigger_number)((std::string)connection_name))
51// Re-enable coverage checking LCOV_EXCL_STOP
52
53namespace dfmodules {
54struct AssignedTriggerDecision
55{
57 std::chrono::steady_clock::time_point assigned_time;
58 std::string connection_name;
59
60 AssignedTriggerDecision(dfmessages::TriggerDecision dec, std::string conn_name)
61 : decision(dec)
62 , assigned_time(std::chrono::steady_clock::now())
63 , connection_name(conn_name)
64 {}
65};
66
67class TriggerRecordBuilderData : public opmonlib::MonitorableObject
68{
69public:
70 TriggerRecordBuilderData() = default;
71 TriggerRecordBuilderData(std::string connection_name, size_t busy_threshold);
72 TriggerRecordBuilderData(std::string connection_name, size_t busy_threshold, size_t free_threshold);
73
74 TriggerRecordBuilderData(TriggerRecordBuilderData const&) = delete;
75 TriggerRecordBuilderData(TriggerRecordBuilderData&&) = delete;
76 TriggerRecordBuilderData& operator=(TriggerRecordBuilderData const&) = delete;
77 TriggerRecordBuilderData& operator=(TriggerRecordBuilderData&&) = delete;
78
79 ~TriggerRecordBuilderData() = default;
80
81 bool is_busy() const { return m_in_error || m_is_busy; }
82 size_t used_slots() const { return m_assigned_trigger_decisions.size(); }
83
84 size_t busy_threshold() const { return m_busy_threshold.load(); }
85 size_t free_threshold() const { return m_free_threshold.load(); }
86
87 std::shared_ptr<AssignedTriggerDecision> get_assignment(daqdataformats::trigger_number_t trigger_number) const;
88 std::shared_ptr<AssignedTriggerDecision> extract_assignment(daqdataformats::trigger_number_t trigger_number);
89 std::shared_ptr<AssignedTriggerDecision> make_assignment(dfmessages::TriggerDecision decision);
90 void add_assignment(std::shared_ptr<AssignedTriggerDecision> assignment);
91 std::shared_ptr<AssignedTriggerDecision> complete_assignment(
93 std::function<void(nlohmann::json&)> metadata_fun = nullptr);
94 std::list<std::shared_ptr<AssignedTriggerDecision>> flush();
95
96 void generate_opmon_data() override;
97
98 std::chrono::microseconds average_latency(std::chrono::steady_clock::time_point since) const;
99
100 bool is_in_error() const { return m_in_error.load(); }
101 void set_in_error(bool err) { m_in_error = err; }
102
103private:
104 std::atomic<size_t> m_busy_threshold{ 0 };
105 std::atomic<size_t> m_free_threshold{ std::numeric_limits<size_t>::max() };
106 std::atomic<bool> m_is_busy{ false };
107 std::list<std::shared_ptr<AssignedTriggerDecision>> m_assigned_trigger_decisions;
108 mutable std::mutex m_assigned_trigger_decisions_mutex;
109
110 // TODO: Eric Flumerfelt <eflumerf@github.com> Dec-03-2021: Replace with circular buffer
111 std::list<std::pair<std::chrono::steady_clock::time_point, std::chrono::microseconds>> m_latency_info;
112 mutable std::mutex m_latency_info_mutex;
113
114 std::atomic<bool> m_in_error{ true };
115
116 nlohmann::json m_metadata;
117 std::string m_connection_name{ "" };
118
119 // monitoring
121 using const_time_counter_t = std::invoke_result<decltype(&metric_t::min_time_since_assignment),
122 metric_t>::type;
123 using time_counter_t = std::remove_const<const_time_counter_t>::type;
124 std::atomic<uint32_t> m_complete_counter{ 0 };
125 std::atomic<time_counter_t> m_min_complete_time{ std::numeric_limits<time_counter_t>::max() }, m_max_complete_time{ 0 }; // in us
126 double m_last_average_time{0.};
127};
128} // namespace dfmodules
129} // namespace dunedaq
130
131#endif // DFMODULES_SRC_DFMODULES_TRIGGERRECORDBUILDERDATA_HPP_
#define ERS_DECLARE_ISSUE(namespace_name, class_name, message, attributes)
uint64_t trigger_number_t
Type used to represent trigger number.
Definition Types.hpp:24
Including Qt Headers.
A message containing information about a Trigger from Data Selection (or a TriggerDecisionEmulator)