CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Classes | Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
dqmservices::DQMFileIterator Class Reference

#include <DQMFileIterator.h>

Classes

struct  EorEntry
 
struct  LumiEntry
 

Public Types

enum  State { OPEN = 0, EOR_CLOSING = 1, EOR = 2 }
 

Public Member Functions

void advanceToLumi (unsigned int lumi, std::string reason)
 
void delay ()
 
 DQMFileIterator (edm::ParameterSet const &pset)
 
void initialise (int run, const std::string &, const std::string &)
 
unsigned int lastLumiFound ()
 
void logFileAction (const std::string &msg, const std::string &fileName="") const
 
void logLumiState (const LumiEntry &lumi, const std::string &msg)
 
bool lumiReady ()
 
std::string make_path (const std::string &fn)
 
LumiEntry open ()
 
void pop ()
 
void reset ()
 
unsigned int runNumber ()
 
State state ()
 
void update_state ()
 
 ~DQMFileIterator ()
 

Static Public Member Functions

static void fillDescription (edm::ParameterSetDescription &d)
 

Private Member Functions

void collect (bool ignoreTimers)
 
void monUpdateLumi (const LumiEntry &lumi)
 

Private Attributes

unsigned int datafnPosition_
 
unsigned long delayMillis_
 
EorEntry eor_
 
std::unordered_set< std::string > filesSeen_
 
long forceFileCheckTimeoutMillis_
 
std::chrono::high_resolution_clock::time_point lastLumiLoad_
 
std::map< unsigned int, LumiEntrylumiSeen_
 
edm::Service
< DQMMonitoringService
mon_
 
unsigned int nextLumiNumber_
 
long nextLumiTimeoutMillis_
 
std::string runInputDir_
 
unsigned int runNumber_
 
std::string runPath_
 
std::chrono::high_resolution_clock::time_point runPathLastCollect_
 
std::time_t runPathMTime_
 
State state_
 
std::string streamLabel_
 

Detailed Description

Definition at line 18 of file DQMFileIterator.h.

Member Enumeration Documentation

Enumerator
OPEN 
EOR_CLOSING 
EOR 

Definition at line 44 of file DQMFileIterator.h.

44  {
45  OPEN = 0,
46  EOR_CLOSING = 1, // EoR file found, but lumis are still pending
47  EOR = 2,
48  };

Constructor & Destructor Documentation

dqmservices::DQMFileIterator::DQMFileIterator ( edm::ParameterSet const &  pset)

Definition at line 63 of file DQMFileIterator.cc.

References datafnPosition_, delayMillis_, forceFileCheckTimeoutMillis_, edm::ParameterSet::getUntrackedParameter(), nextLumiTimeoutMillis_, reset(), runInputDir_, runNumber_, streamLabel_, and AlCaHLTBitMon_QueryRunRegistry::string.

63  : state_(EOR) {
64  runNumber_ = pset.getUntrackedParameter<unsigned int>("runNumber");
65  datafnPosition_ = pset.getUntrackedParameter<unsigned int>("datafnPosition");
66  runInputDir_ = pset.getUntrackedParameter<std::string>("runInputDir");
67  streamLabel_ = pset.getUntrackedParameter<std::string>("streamLabel");
68  delayMillis_ = pset.getUntrackedParameter<uint32_t>("delayMillis");
70  pset.getUntrackedParameter<int32_t>("nextLumiTimeoutMillis");
71 
73  reset();
74 }
dqmservices::DQMFileIterator::~DQMFileIterator ( )

Definition at line 76 of file DQMFileIterator.cc.

76 {}

Member Function Documentation

void dqmservices::DQMFileIterator::advanceToLumi ( unsigned int  lumi,
std::string  reason 
)

Definition at line 127 of file DQMFileIterator.cc.

References asciidump::doc, lastLumiLoad_, fjr2json::lumi, lumiSeen_, mon_, monUpdateLumi(), nextLumiNumber_, and fileCollector::now.

Referenced by open(), dqmservices::DQMStreamerReader::reset_(), and update_state().

127  {
128  using boost::property_tree::ptree;
129  using boost::str;
130 
131  unsigned int currentLumi = nextLumiNumber_;
132 
135 
136  auto iter = lumiSeen_.lower_bound(currentLumi);
137 
138  while ((iter != lumiSeen_.end()) && ((iter->first) < nextLumiNumber_)) {
139  iter->second.state = reason;
140  monUpdateLumi(iter->second);
141 
142  ++iter;
143  }
144 
145  if (mon_.isAvailable()) {
146  // report the successful lumi file open
147  ptree doc;
148  doc.put("next_lumi", nextLumiNumber_);
149  mon_->outputUpdate(doc);
150  }
151 }
edm::Service< DQMMonitoringService > mon_
tuple lumi
Definition: fjr2json.py:35
std::map< unsigned int, LumiEntry > lumiSeen_
tuple doc
Definition: asciidump.py:381
std::chrono::high_resolution_clock::time_point lastLumiLoad_
void monUpdateLumi(const LumiEntry &lumi)
void dqmservices::DQMFileIterator::collect ( bool  ignoreTimers)
private

Definition at line 170 of file DQMFileIterator.cc.

References prof2calltree::count, datafnPosition_, alignCSCRings::e, eor_, cppFunctionSkipper::exception, lut2db_cfg::filename, filesSeen_, personalPlayback::fn, forceFileCheckTimeoutMillis_, diffTwoXMLs::label, dqmservices::DQMFileIterator::LumiEntry::load_json(), dqmservices::DQMFileIterator::EorEntry::loaded, logFileAction(), fjr2json::lumi, lumiSeen_, monUpdateLumi(), visualization-live-secondInstance_cfg::msg, dqmservices::DQMFileIterator::EorEntry::n_lumi, fileCollector::now, query::result, DTTTrigCorrFirst::run, runNumber_, runPath_, runPathLastCollect_, runPathMTime_, streamLabel_, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by reset(), and update_state().

170  {
171  // search filesystem to find available lumi section files
172  // or the end of run files
173 
175  auto last_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
177 
178  // don't refresh if it's too soon
179  if ((!ignoreTimers) && (last_ms >= 0) && (last_ms < 100)) {
180  return;
181  }
182 
183  // check if directory changed
184  std::time_t mtime_now = boost::filesystem::last_write_time(runPath_);
185 
186  if ((!ignoreTimers) && (last_ms < forceFileCheckTimeoutMillis_) &&
187  (mtime_now == runPathMTime_)) {
188  // logFileAction("Directory hasn't changed.");
189  return;
190  } else {
191  // logFileAction("Directory changed, updating.");
192  }
193 
194  runPathMTime_ = mtime_now;
196 
197  using boost::filesystem::directory_iterator;
198  using boost::filesystem::directory_entry;
199 
200  std::string fn_eor;
201 
202  directory_iterator dend;
203  for (directory_iterator di(runPath_); di != dend; ++di) {
204  const boost::regex fn_re("run(\\d+)_ls(\\d+)_([a-zA-Z0-9]+)(_.*)?\\.jsn");
205 
206  const std::string filename = di->path().filename().string();
207  const std::string fn = di->path().string();
208 
209  if (filesSeen_.find(filename) != filesSeen_.end()) {
210  continue;
211  }
212 
213  boost::smatch result;
214  if (boost::regex_match(filename, result, fn_re)) {
215  unsigned int run = std::stoi(result[1]);
216  unsigned int lumi = std::stoi(result[2]);
217  std::string label = result[3];
218 
219  filesSeen_.insert(filename);
220 
221  if (run != runNumber_) continue;
222 
223  // check if this is EoR
224  // for various reasons we have to load it after all other files
225  if ((lumi == 0) && (label == "EoR") && (!eor_.loaded)) {
226  fn_eor = fn;
227  continue;
228  }
229 
230  // check if lumi is loaded
231  if (lumiSeen_.find(lumi) != lumiSeen_.end()) {
232  continue; // already loaded
233  }
234 
235  // check if this belongs to us
236  if (label != streamLabel_) {
237  std::string msg("Found and skipped json file (stream label mismatch, ");
238  msg += label + " [files] != " + streamLabel_ + " [config]";
239  msg += "): ";
240  logFileAction(msg, fn);
241  continue;
242  }
243 
244  try {
245  LumiEntry lumi_jsn = LumiEntry::load_json(fn, lumi, datafnPosition_);
246  lumiSeen_.emplace(lumi, lumi_jsn);
247  logFileAction("Found and loaded json file: ", fn);
248 
249  monUpdateLumi(lumi_jsn);
250  } catch (const std::exception& e) {
251  // don't reset the mtime, keep it waiting
252  filesSeen_.erase(filename);
253 
254  std::string msg("Found, tried to load the json, but failed (");
255  msg += e.what();
256  msg += "): ";
257  logFileAction(msg, fn);
258  }
259  }
260  }
261 
262  if (!fn_eor.empty()) {
263  logFileAction("EoR file found: ", fn_eor);
264 
265  // @TODO load EoR files correctly
266  // eor_ = EorEntry::load_json(fn_eor);
267  // logFileAction("Loaded eor file: ", fn_eor);
268 
269  // for now , set n_lumi to the highest _found_ lumi
270  eor_.loaded = true;
271 
272  if (lumiSeen_.empty()) {
273  eor_.n_lumi = 0;
274  } else {
275  eor_.n_lumi = lumiSeen_.rbegin()->first;
276  }
277  }
278 }
tuple lumi
Definition: fjr2json.py:35
std::map< unsigned int, LumiEntry > lumiSeen_
tuple result
Definition: query.py:137
void logFileAction(const std::string &msg, const std::string &fileName="") const
static LumiEntry load_json(const std::string &filename, int lumiNumber, int datafn_position)
tuple filename
Definition: lut2db_cfg.py:20
void monUpdateLumi(const LumiEntry &lumi)
std::chrono::high_resolution_clock::time_point runPathLastCollect_
std::unordered_set< std::string > filesSeen_
void dqmservices::DQMFileIterator::delay ( )

Definition at line 356 of file DQMFileIterator.cc.

References delayMillis_, and mon_.

Referenced by dqmservices::DQMProtobufReader::getNextItemType(), dqmservices::DQMStreamerReader::prepareNextEvent(), and dqmservices::DQMStreamerReader::reset_().

356  {
357  if (mon_.isAvailable()) mon_->keepAlive();
358 
359  usleep(delayMillis_ * 1000);
360 }
edm::Service< DQMMonitoringService > mon_
void dqmservices::DQMFileIterator::fillDescription ( edm::ParameterSetDescription d)
static

Definition at line 362 of file DQMFileIterator.cc.

References edm::ParameterSetDescription::addUntracked(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by dqmservices::DQMProtobufReader::fillDescriptions(), and dqmservices::DQMStreamerReader::fillDescriptions().

362  {
363  desc.addUntracked<unsigned int>("runNumber")
364  ->setComment("Run number passed via configuration file.");
365 
366  desc.addUntracked<unsigned int>("datafnPosition", 3)
367  ->setComment(
368  "Data filename position in the positional arguments array 'data' in "
369  "json file.");
370 
371  desc.addUntracked<std::string>("streamLabel")
372  ->setComment("Stream label used in json discovery.");
373 
374  desc.addUntracked<uint32_t>("delayMillis")
375  ->setComment("Number of milliseconds to wait between file checks.");
376 
377  desc.addUntracked<int32_t>("nextLumiTimeoutMillis", -1)
378  ->setComment(
379  "Number of milliseconds to wait before switching to the next lumi "
380  "section if the current is missing, -1 to disable.");
381 
382  desc.addUntracked<std::string>("runInputDir")
383  ->setComment("Directory where the DQM files will appear.");
384 }
void dqmservices::DQMFileIterator::initialise ( int  run,
const std::string &  ,
const std::string &   
)
unsigned int dqmservices::DQMFileIterator::lastLumiFound ( )

Definition at line 119 of file DQMFileIterator.cc.

References lumiSeen_.

Referenced by dqmservices::DQMStreamerReader::reset_().

119  {
120  if (!lumiSeen_.empty()) {
121  return lumiSeen_.rbegin()->first;
122  }
123 
124  return 1;
125 }
std::map< unsigned int, LumiEntry > lumiSeen_
void dqmservices::DQMFileIterator::logFileAction ( const std::string &  msg,
const std::string &  fileName = "" 
) const
void dqmservices::DQMFileIterator::logLumiState ( const LumiEntry lumi,
const std::string &  msg 
)

Definition at line 345 of file DQMFileIterator.cc.

References dqmservices::DQMFileIterator::LumiEntry::file_ls, logFileAction(), lumiSeen_, monUpdateLumi(), and visualization-live-secondInstance_cfg::msg.

Referenced by dqmservices::DQMStreamerReader::closeFile_(), dqmservices::DQMStreamerReader::openNextFile_(), and dqmservices::DQMProtobufReader::readLuminosityBlock_().

346  {
347  if (lumiSeen_.find(lumi.file_ls) != lumiSeen_.end()) {
348  lumiSeen_[lumi.file_ls].state = msg;
349 
350  monUpdateLumi(lumiSeen_[lumi.file_ls]);
351  } else {
352  logFileAction("Internal error: referenced lumi is not the map.");
353  }
354 }
tuple lumi
Definition: fjr2json.py:35
std::map< unsigned int, LumiEntry > lumiSeen_
void logFileAction(const std::string &msg, const std::string &fileName="") const
void monUpdateLumi(const LumiEntry &lumi)
bool dqmservices::DQMFileIterator::lumiReady ( )

Definition at line 109 of file DQMFileIterator.cc.

References lumiSeen_, and nextLumiNumber_.

Referenced by dqmservices::DQMProtobufReader::getNextItemType(), and dqmservices::DQMStreamerReader::prepareNextFile().

109  {
110  if (lumiSeen_.find(nextLumiNumber_) != lumiSeen_.end()) {
111  return true;
112  }
113 
114  return false;
115 }
std::map< unsigned int, LumiEntry > lumiSeen_
std::string dqmservices::DQMFileIterator::make_path ( const std::string &  fn)

Definition at line 162 of file DQMFileIterator.cc.

References personalPlayback::fn, AlCaHLTBitMon_ParallelJobs::p, cmsHarvester::path, and runPath_.

Referenced by dqmservices::DQMStreamerReader::openFile_(), dqmservices::DQMStreamerReader::openNextFile_(), and dqmservices::DQMProtobufReader::readLuminosityBlock_().

162  {
163  if (boost::starts_with(fn, "/")) return fn;
164 
166  p /= fn;
167  return p.string();
168 }
tuple path
else: Piece not in the list, fine.
void dqmservices::DQMFileIterator::monUpdateLumi ( const LumiEntry lumi)
private

Definition at line 153 of file DQMFileIterator.cc.

References asciidump::doc, dqmservices::DQMFileIterator::LumiEntry::file_ls, cmsPerfStripChart::format, mon_, and dqmservices::DQMFileIterator::LumiEntry::state.

Referenced by advanceToLumi(), collect(), and logLumiState().

153  {
154  if (!mon_.isAvailable()) return;
155 
156  ptree doc;
157  doc.put(str(boost::format("extra.lumi_seen.lumi%06d") % lumi.file_ls),
158  lumi.state);
159  mon_->outputUpdate(doc);
160 }
edm::Service< DQMMonitoringService > mon_
tuple lumi
Definition: fjr2json.py:35
string format
Some error handling for the usage.
tuple doc
Definition: asciidump.py:381
DQMFileIterator::LumiEntry dqmservices::DQMFileIterator::open ( )
void dqmservices::DQMFileIterator::pop ( )
void dqmservices::DQMFileIterator::reset ( void  )

Definition at line 78 of file DQMFileIterator.cc.

References collect(), asciidump::doc, eor_, filesSeen_, cmsPerfStripChart::format, lastLumiLoad_, dqmservices::DQMFileIterator::EorEntry::loaded, lumiSeen_, mon_, nextLumiNumber_, fileCollector::now, runInputDir_, runNumber_, runPath_, state_, cond::to_string(), and update_state().

Referenced by DQMFileIterator().

78  {
79  runPath_ = str(boost::format("%s/run%06d") % runInputDir_ % runNumber_);
80 
81  eor_.loaded = false;
82  state_ = State::OPEN;
83  nextLumiNumber_ = 1;
84  lumiSeen_.clear();
85  filesSeen_.clear();
86 
88 
89  collect(true);
90  update_state();
91 
92  if (mon_.isAvailable()) {
93  ptree doc;
94  doc.put("run", runNumber_);
95  doc.put("next_lumi", nextLumiNumber_);
96  doc.put("fi_state", std::to_string(state_));
97  mon_->outputUpdate(doc);
98  }
99 }
edm::Service< DQMMonitoringService > mon_
std::map< unsigned int, LumiEntry > lumiSeen_
string format
Some error handling for the usage.
std::string to_string(const T &t)
Definition: Logger.cc:26
tuple doc
Definition: asciidump.py:381
std::chrono::high_resolution_clock::time_point lastLumiLoad_
std::unordered_set< std::string > filesSeen_
void collect(bool ignoreTimers)
unsigned int dqmservices::DQMFileIterator::runNumber ( )
DQMFileIterator::State dqmservices::DQMFileIterator::state ( )
void dqmservices::DQMFileIterator::update_state ( )

Definition at line 280 of file DQMFileIterator.cc.

References advanceToLumi(), collect(), prof2calltree::count, asciidump::doc, eor_, lastLumiLoad_, dqmservices::DQMFileIterator::EorEntry::loaded, logFileAction(), lumiSeen_, mon_, visualization-live-secondInstance_cfg::msg, dqmservices::DQMFileIterator::EorEntry::n_lumi, nextLumiNumber_, nextLumiTimeoutMillis_, fileCollector::now, state_, AlCaHLTBitMon_QueryRunRegistry::string, and cond::to_string().

Referenced by dqmservices::DQMProtobufReader::getNextItemType(), dqmservices::DQMStreamerReader::prepareNextFile(), reset(), and dqmservices::DQMStreamerReader::reset_().

280  {
281  using std::chrono::high_resolution_clock;
282  using std::chrono::duration_cast;
283  using std::chrono::milliseconds;
284 
285  collect(false);
286 
287  // now update the state
288  State old_state = state_;
289 
290  if ((state_ == State::OPEN) && (eor_.loaded)) {
291  state_ = State::EOR_CLOSING;
292  }
293 
294  // special case for missing lumi files
295  // skip to the next available, but after the timeout
296  if ((state_ != State::EOR) && (nextLumiTimeoutMillis_ >= 0)) {
297  auto iter = lumiSeen_.lower_bound(nextLumiNumber_);
298  if ((iter != lumiSeen_.end()) && iter->first != nextLumiNumber_) {
299  auto elapsed = high_resolution_clock::now() - lastLumiLoad_;
300  auto elapsed_ms = duration_cast<milliseconds>(elapsed).count();
301 
302  if (elapsed_ms >= nextLumiTimeoutMillis_) {
303  std::string msg("Timeout reached, skipping lumisection(s) ");
304  msg += std::to_string(nextLumiNumber_) + " .. " +
305  std::to_string(iter->first - 1);
306  msg += ", nextLumiNumber_ is now " + std::to_string(iter->first);
308 
309  advanceToLumi(iter->first, "skipped: timeout");
310  }
311  }
312  }
313 
314  if (state_ == State::EOR_CLOSING) {
315  // check if we parsed all lumis
316  // n_lumi is both last lumi and the number of lumi
317  // since lumis are indexed from 1
318 
319  // after all lumi have been pop()'ed
320  // current lumi will become larger than the last lumi
321  if (nextLumiNumber_ > eor_.n_lumi) {
322  state_ = State::EOR;
323  }
324  }
325 
326  if (state_ != old_state) {
327  logFileAction("Streamer state changed: ",
328  std::to_string(old_state) + "->" + std::to_string(state_));
329 
330  if (mon_) {
331  ptree doc;
332  doc.put("fi_state", std::to_string(state_));
333  mon_->outputUpdate(doc);
334  }
335  }
336 }
edm::Service< DQMMonitoringService > mon_
std::map< unsigned int, LumiEntry > lumiSeen_
std::string to_string(const T &t)
Definition: Logger.cc:26
void logFileAction(const std::string &msg, const std::string &fileName="") const
tuple doc
Definition: asciidump.py:381
std::chrono::high_resolution_clock::time_point lastLumiLoad_
State
Definition: hltDiff.cc:314
void advanceToLumi(unsigned int lumi, std::string reason)
void collect(bool ignoreTimers)

Member Data Documentation

unsigned int dqmservices::DQMFileIterator::datafnPosition_
private

Definition at line 97 of file DQMFileIterator.h.

Referenced by collect(), and DQMFileIterator().

unsigned long dqmservices::DQMFileIterator::delayMillis_
private

Definition at line 92 of file DQMFileIterator.h.

Referenced by delay(), and DQMFileIterator().

EorEntry dqmservices::DQMFileIterator::eor_
private

Definition at line 100 of file DQMFileIterator.h.

Referenced by collect(), reset(), and update_state().

std::unordered_set<std::string> dqmservices::DQMFileIterator::filesSeen_
private

Definition at line 105 of file DQMFileIterator.h.

Referenced by collect(), and reset().

long dqmservices::DQMFileIterator::forceFileCheckTimeoutMillis_
private

Definition at line 94 of file DQMFileIterator.h.

Referenced by collect(), and DQMFileIterator().

std::chrono::high_resolution_clock::time_point dqmservices::DQMFileIterator::lastLumiLoad_
private

Definition at line 113 of file DQMFileIterator.h.

Referenced by advanceToLumi(), reset(), and update_state().

std::map<unsigned int, LumiEntry> dqmservices::DQMFileIterator::lumiSeen_
private
edm::Service<DQMMonitoringService> dqmservices::DQMFileIterator::mon_
private

Definition at line 119 of file DQMFileIterator.h.

Referenced by advanceToLumi(), delay(), monUpdateLumi(), reset(), and update_state().

unsigned int dqmservices::DQMFileIterator::nextLumiNumber_
private

Definition at line 103 of file DQMFileIterator.h.

Referenced by advanceToLumi(), lumiReady(), open(), reset(), and update_state().

long dqmservices::DQMFileIterator::nextLumiTimeoutMillis_
private

Definition at line 93 of file DQMFileIterator.h.

Referenced by DQMFileIterator(), and update_state().

std::string dqmservices::DQMFileIterator::runInputDir_
private

Definition at line 90 of file DQMFileIterator.h.

Referenced by DQMFileIterator(), and reset().

unsigned int dqmservices::DQMFileIterator::runNumber_
private

Definition at line 89 of file DQMFileIterator.h.

Referenced by collect(), DQMFileIterator(), reset(), and runNumber().

std::string dqmservices::DQMFileIterator::runPath_
private

Definition at line 98 of file DQMFileIterator.h.

Referenced by collect(), make_path(), and reset().

std::chrono::high_resolution_clock::time_point dqmservices::DQMFileIterator::runPathLastCollect_
private

Definition at line 110 of file DQMFileIterator.h.

Referenced by collect().

std::time_t dqmservices::DQMFileIterator::runPathMTime_
private

Definition at line 109 of file DQMFileIterator.h.

Referenced by collect().

State dqmservices::DQMFileIterator::state_
private

Definition at line 101 of file DQMFileIterator.h.

Referenced by reset(), state(), and update_state().

std::string dqmservices::DQMFileIterator::streamLabel_
private

Definition at line 91 of file DQMFileIterator.h.

Referenced by collect(), and DQMFileIterator().