5 #include <boost/regex.hpp> 6 #include <boost/format.hpp> 7 #include <boost/range.hpp> 8 #include <boost/filesystem.hpp> 9 #include <boost/algorithm/string/predicate.hpp> 14 #include <boost/property_tree/json_parser.hpp> 15 #include <boost/property_tree/ptree.hpp> 16 #include <boost/algorithm/string.hpp> 23 int datafn_position) {
24 boost::property_tree::ptree
pt;
25 read_json(filename, pt);
37 if (datafn_position >= 0) {
45 if (boost::starts_with(
datafn,
"/"))
59 boost::property_tree::ptree
pt;
60 read_json(filename, pt);
94 std::vector<std::string> tokens;
97 for (
auto token : tokens) {
112 if (
mon_.isAvailable()) {
116 doc.put(
"fi_state", std::to_string(
state_));
117 mon_->outputUpdate(doc);
149 using boost::property_tree::ptree;
156 auto iter =
lumiSeen_.lower_bound(currentLumi);
159 iter->second.state =
reason;
165 if (
mon_.isAvailable()) {
169 mon_->outputUpdate(doc);
174 if (!
mon_.isAvailable())
179 mon_->outputUpdate(doc);
183 std::time_t mtime_now = 0;
186 if (!boost::filesystem::exists(
path))
189 mtime_now = mtime_now ^ boost::filesystem::last_write_time(
path);
203 if ((!ignoreTimers) && (last_ms >= 0) && (last_ms < 100)) {
220 using boost::filesystem::directory_entry;
221 using boost::filesystem::directory_iterator;
226 if (!boost::filesystem::exists(runPath)) {
232 directory_iterator dend;
233 for (directory_iterator di(runPath); di != dend; ++di) {
234 const boost::regex fn_re(
"run(\\d+)_ls(\\d+)_([a-zA-Z0-9]+)(_.*)?\\.jsn");
244 if (boost::regex_match(filename, result, fn_re)) {
245 unsigned int run = std::stoi(result[1]);
246 unsigned int lumi = std::stoi(result[2]);
256 if ((lumi == 0) && (label ==
"EoR") && (!
eor_.
loaded)) {
268 std::string msg(
"Found and skipped json file (stream label mismatch, ");
269 msg += label +
" [files] != " +
streamLabel_ +
" [config]";
295 if (!fn_eor.empty()) {
315 using std::chrono::duration_cast;
316 using std::chrono::high_resolution_clock;
317 using std::chrono::milliseconds;
328 state_ = State::EOR_CLOSING;
337 auto elapsed_ms = duration_cast<milliseconds>(elapsed).
count();
341 msg += std::to_string(
nextLumiNumber_) +
" .. " + std::to_string(iter->first - 1);
342 msg +=
", nextLumiNumber_ is now " + std::to_string(iter->first);
350 if (
state_ == State::EOR_CLOSING) {
362 if (
state_ != old_state) {
363 logFileAction(
"Streamer state changed: ", std::to_string(old_state) +
"->" + std::to_string(
state_));
367 doc.put(
"fi_state", std::to_string(
state_));
368 mon_->outputUpdate(doc);
384 logFileAction(
"Internal error: referenced lumi is not the map.");
389 if (
mon_.isAvailable())
396 desc.
addUntracked<
unsigned int>(
"runNumber")->setComment(
"Run number passed via configuration file.");
400 "Data filename position in the positional arguments array 'data' in " 405 desc.
addUntracked<uint32_t>(
"delayMillis")->setComment(
"Number of milliseconds to wait between file checks.");
409 "Number of milliseconds to wait before switching to the next lumi " 410 "section if the current is missing, -1 to disable.");
414 "Don't repeat file scans: use what was found during the initial scan. " 415 "EOR file is ignored and the state is set to 'past end of run'.");
std::vector< std::string_view > split(std::string_view, const char *)
T getUntrackedParameter(std::string const &, T const &) const
unsigned long delayMillis_
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
unsigned int lastLumiFound()
edm::Service< DQMMonitoringService > mon_
void logLumiState(const LumiEntry &lumi, const std::string &msg)
std::map< unsigned int, LumiEntry > lumiSeen_
std::string get_json_path() const
std::size_t n_events_accepted
static LumiEntry load_json(const std::string &run_path, const std::string &filename, int lumiNumber, int datafn_position)
U second(std::pair< T, U > const &p)
DQMFileIterator(edm::ParameterSet const &pset)
std::size_t n_events_processed
long nextLumiTimeoutMillis_
std::string get_data_path() const
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
std::vector< std::string > runPath_
void logFileAction(const std::string &msg, const std::string &fileName="") const
std::chrono::high_resolution_clock::time_point lastLumiLoad_
static EorEntry load_json(const std::string &run_path, const std::string &filename)
unsigned int nextLumiNumber_
unsigned int datafnPosition_
long forceFileCheckTimeoutMillis_
void monUpdateLumi(const LumiEntry &lumi)
std::chrono::high_resolution_clock::time_point runPathLastCollect_
std::unordered_set< std::string > filesSeen_
std::time_t runPathMTime_
std::time_t mtimeHash() const
void advanceToLumi(unsigned int lumi, std::string reason)
static void fillDescription(edm::ParameterSetDescription &d)
void collect(bool ignoreTimers)