10 #include "art/Framework/Core/EDFilter.h"
11 #include "art/Framework/Core/ModuleMacros.h"
12 #include "art/Framework/Principal/Event.h"
13 #include "art/Framework/Principal/Handle.h"
14 #include "art/Framework/Principal/Run.h"
15 #include "art/Framework/Principal/SubRun.h"
16 #include "canvas/Utilities/InputTag.h"
17 #include "fhiclcpp/ParameterSet.h"
19 #include "artdaq/DAQdata/Globals.hh"
27 class RandomDelayFilter;
87 bool filter(art::Event& e)
override;
103 void reconfigure(fhicl::ParameterSet
const& p)
override;
117 std::mt19937 engine_;
118 std::unique_ptr<std::uniform_real_distribution<double>> uniform_distn_;
119 std::unique_ptr<std::normal_distribution<double>> normal_distn_;
120 std::unique_ptr<std::uniform_int_distribution<int>> pass_distn_;
125 : min_ms_(p.get<double>(
"minimum_delay_ms", 0))
126 , max_ms_(p.get<double>(
"maximum_delay_ms", 1000))
127 , mean_ms_(p.get<double>(
"mean_delay_ms", 500))
128 , sigma_ms_(p.get<double>(
"sigma_delay_ms", 100))
129 , pass_factor_(p.get<int>(
"pass_filter_percentage", 100))
130 , load_factor_(p.get<double>(
"cpu_load_ratio", 1.0))
131 , isNormal_(p.get<bool>(
"use_normal_distribution", false))
132 , engine_(p.get<int64_t>(
"random_seed", 271828))
133 , pass_distn_(new std::uniform_int_distribution<int>(0, 100))
136 if (pass_factor_ > 100) pass_factor_ = 100;
137 if (pass_factor_ < 0) pass_factor_ = 0;
138 if (load_factor_ < 0.0) load_factor_ = 0.0;
139 if (load_factor_ > 1.0) load_factor_ = 1.0;
141 if (min_ms_ < 0) min_ms_ = 0;
142 if (min_ms_ > max_ms_) max_ms_ = min_ms_;
143 if (mean_ms_ < 0) mean_ms_ = 0;
144 if (sigma_ms_ < 0) sigma_ms_ = 0;
146 uniform_distn_.reset(
new std::uniform_real_distribution<double>(min_ms_, max_ms_));
147 normal_distn_.reset(
new std::normal_distribution<double>(mean_ms_, sigma_ms_));
152 double delay = isNormal_ ? (*normal_distn_)(engine_) : (*uniform_distn_)(engine_);
153 TLOG_DEBUG(
"RandomDelayFilter") <<
"Simulating processing of event " << e.event() <<
" by delaying " << std::to_string(delay) <<
"ms." << TLOG_ENDL;
155 usleep(1000 * (1 - load_factor_) * delay);
158 auto now = std::chrono::steady_clock::now();
159 while (TimeUtils::GetElapsedTimeMilliseconds(now) < static_cast<size_t>(delay * load_factor_))
161 i = i + 1 % std::numeric_limits<int>::max();
164 return (*pass_distn_)(engine_) < pass_factor_;
169 min_ms_ = p.get<
double>(
"minimum_delay_ms", 0);
170 max_ms_ = p.get<
double>(
"maximum_delay_ms", 1000);
171 mean_ms_ = p.get<
double>(
"mean_delay_ms", 500);
172 sigma_ms_ = p.get<
double>(
"sigma_delay_ms", 100);
173 pass_factor_ = p.get<
int>(
"pass_filter_percentage", 100);
174 load_factor_ = p.get<
double>(
"cpu_load_ratio", 1.0);
175 isNormal_ = p.get<
bool>(
"use_normal_distribution",
false);
176 engine_ = std::mt19937(p.get<int64_t>(
"random_seed", 271828));
179 if (pass_factor_ > 100) pass_factor_ = 100;
180 if (pass_factor_ < 0) pass_factor_ = 0;
181 if (load_factor_ < 0.0) load_factor_ = 0.0;
182 if (load_factor_ > 1.0) load_factor_ = 1.0;
184 if (min_ms_ < 0) min_ms_ = 0;
185 if (min_ms_ > max_ms_) max_ms_ = min_ms_;
186 if (mean_ms_ < 0) mean_ms_ = 0;
187 if (sigma_ms_ < 0) sigma_ms_ = 0;
189 uniform_distn_.reset(
new std::uniform_real_distribution<double>(min_ms_, max_ms_));
190 normal_distn_.reset(
new std::normal_distribution<double>(mean_ms_, sigma_ms_));
RandomDelayFilter(fhicl::ParameterSet const &p)
RandomDelayFilter Constructor.
bool filter(art::Event &e) override
Filter is a required override of art::EDFilter, and is called for each event.
A filter which delays for a random amount of time, then drops a random fraction of events...
void reconfigure(fhicl::ParameterSet const &p) override
Reconfigure the RandomDelayFilter.
RandomDelayFilter & operator=(RandomDelayFilter const &)=delete
Copy Assignment operator is deleted.