10 #define TRACE_NAME "RandomDelayFilter"
12 #include "art/Framework/Core/EDFilter.h"
13 #include "art/Framework/Core/ModuleMacros.h"
14 #include "art/Framework/Principal/Event.h"
15 #include "art/Framework/Principal/Handle.h"
16 #include "art/Framework/Principal/Run.h"
17 #include "art/Framework/Principal/SubRun.h"
18 #include "canvas/Utilities/InputTag.h"
19 #include "fhiclcpp/ParameterSet.h"
21 #include "artdaq/DAQdata/Globals.hh"
28 class RandomDelayFilter;
90 bool filter(art::Event& e)
override;
103 std::mt19937 engine_;
104 std::unique_ptr<std::uniform_real_distribution<double>> uniform_distn_;
105 std::unique_ptr<std::normal_distribution<double>> normal_distn_;
106 std::unique_ptr<std::exponential_distribution<double>> exponential_distn_;
107 std::unique_ptr<std::uniform_int_distribution<int>> pass_distn_;
116 DistType distribution_type_;
121 #if ART_HEX_VERSION >= 0x30200
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", 0.5))
131 , engine_(p.get<int64_t>(
"random_seed", time(nullptr)))
132 , pass_distn_(new std::uniform_int_distribution<int>(0, 100))
135 if (pass_factor_ > 100)
139 if (pass_factor_ < 0)
143 if (load_factor_ < 0.0)
147 if (load_factor_ > 1.0)
156 if (min_ms_ > max_ms_)
169 auto type = p.get<std::string>(
"distribution_type",
"Uniform");
170 assert(!type.empty());
175 TLOG(TLVL_INFO) <<
"Generating delay times using Normal distribution with mean " << mean_ms_ <<
" ms, std. dev. " << sigma_ms_ <<
" ms, min " << min_ms_ <<
" ms and max " << max_ms_ <<
"ms.";
176 distribution_type_ = DistType::Normal;
177 if (mean_ms_ < min_ms_)
179 TLOG(TLVL_WARNING) <<
"Mean is smaller than min, setting to min";
183 normal_distn_ = std::make_unique<std::normal_distribution<double>>(mean_ms_, sigma_ms_);
187 TLOG(TLVL_INFO) <<
"Generating delay times using Exponential distribution with mean " << mean_ms_ <<
" ms, min " << min_ms_ <<
" ms and max " << max_ms_ <<
" ms.";
188 distribution_type_ = DistType::Exponential;
189 if (mean_ms_ < min_ms_)
191 TLOG(TLVL_WARNING) <<
"Mean is smaller than min, setting to min";
199 exponential_distn_ = std::make_unique<std::exponential_distribution<double>>(1 / mean_ms_);
203 TLOG(TLVL_INFO) <<
"Generating delay times using Uniform distribution with min " << min_ms_ <<
" ms and max " << max_ms_ <<
" ms.";
204 distribution_type_ = DistType::Uniform;
205 uniform_distn_ = std::make_unique<std::uniform_real_distribution<double>>(min_ms_, max_ms_);
210 TLOG(TLVL_INFO) <<
"Delay time set to " << min_ms_ <<
" ms.";
211 distribution_type_ = DistType::Fixed;
218 double delay = min_ms_;
221 switch (distribution_type_)
223 case DistType::Normal:
224 delay += (*normal_distn_)(engine_);
226 case DistType::Exponential:
227 delay += (*exponential_distn_)(engine_);
229 case DistType::Uniform:
230 delay = (*uniform_distn_)(engine_);
232 case DistType::Fixed:
235 }
while (delay > max_ms_ && delay < min_ms_);
236 TLOG(TLVL_DEBUG) <<
"Simulating processing of event " << e.event() <<
" by delaying " << delay <<
"ms.";
238 usleep(static_cast<unsigned>(1000 * (1 - load_factor_) * delay));
241 auto now = std::chrono::steady_clock::now();
242 while (TimeUtils::GetElapsedTimeMilliseconds(now) < static_cast<size_t>(delay * load_factor_))
244 i = i + 1 % std::numeric_limits<int>::max();
247 return (*pass_distn_)(engine_) < pass_factor_;
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...
RandomDelayFilter & operator=(RandomDelayFilter const &)=delete
Copy Assignment operator is deleted.