17 #include <sys/types.h>
27 #include <boost/property_tree/json_parser.hpp>
28 #include <boost/property_tree/ptree.hpp>
29 #include <boost/filesystem.hpp>
30 #include <boost/format.hpp>
41 if (value < 1 && value != -1)
43 <<
"Invalid '" << name <<
"' parameter '" << value
44 <<
"'. Must be -1 or >= 1.";
67 wflow.reserve(workflow.size() + 3);
69 while ((pos = wflow.find(
'/', pos)) != std::string::npos)
70 wflow.replace(pos++, 1,
"__");
80 sprintf(suffix,
"R%09d", run);
89 sprintf(suffix,
"R%09d", run);
93 sprintf(rewrite,
"\\1Run %d/\\2/Run summary", run);
95 sprintf(rewrite,
"\\1Run %d/\\2/By Lumi Section %d-%d", run, lumi, lumi);
103 dbe_->setCurrentFolder(
"Info/ProvInfo");
109 me =
dbe_->get(
"Info/ProvInfo/runIsComplete");
110 if (!me) me =
dbe_->bookFloat(
"runIsComplete");
122 "^(Reference/)?([^/]+)",
132 std::vector<std::string> systems = (
dbe_->cd(),
dbe_->getSubdirs());
135 msg <<
"DQMFileSaver: storing EventInfo folders for Run: "
136 << run <<
", Lumi Section: " << lumi <<
", Subsystems: " ;
138 for (
size_t i = 0,
e = systems.size();
i !=
e; ++
i) {
139 if (systems[
i] !=
"Reference") {
141 msg << systems[
i] <<
" " ;
144 systems[
i]+
"/EventInfo",
"^(Reference/)?([^/]+)",
162 bool enableMultiThread,
175 store->save(filename,
179 enableMultiThread ? run : 0,
184 store->savePB(filename,
186 enableMultiThread ? run : 0);
199 "",
"^(Reference/)?([^/]+)",
"\\1\\2",
209 std::vector<std::string> systems = (
dbe_->cd(),
dbe_->getSubdirs());
211 for (
size_t i = 0,
e = systems.size();
i !=
e; ++
i)
213 if (systems[
i] !=
"Reference")
220 "",
"^(Reference/)?([^/]+)", rewrite,
230 for (
size_t i = 0,
e = systems.size();
i !=
e; ++
i)
231 if (systems[
i] !=
"Reference")
234 std::vector<MonitorElement*> pNamesVector =
dbe_->getMatchingContents(
"^" + systems[
i] +
"/.*/EventInfo/processName",lat::Regexp::Perl);
235 if (pNamesVector.size() > 0){
238 "",
"^(Reference/)?([^/]+)", rewrite,
242 pNamesVector.clear();
248 for (
size_t i = 0,
e = systems.size();
i !=
e; ++
i)
249 if (systems[
i] !=
"Reference")
252 systems[
i],
"^(Reference/)?([^/]+)", rewrite,
259 boost::property_tree::ptree
262 namespace bpt = boost::property_tree;
263 namespace bfs = boost::filesystem;
269 hostnameReturn = gethostname(host ,
sizeof(host));
270 if (hostnameReturn == -1)
272 <<
"Internal error, cannot get host name";
275 std::ostringstream oss_pid;
279 struct stat dataFileStat;
280 if (stat(dataFilePathName.c_str(), &dataFileStat) != 0)
282 <<
"Internal error, cannot get data file: "
288 bpt::ptree processedEvents, acceptedEvents, errorEvents, bitmask, fileList, fileSize,
inputFiles, fileAdler32, transferDestination;
293 errorEvents.put(
"", 0);
295 fileList.put(
"", dataFileName);
296 fileSize.put(
"", dataFileStat.st_size);
297 inputFiles.put(
"",
"");
298 fileAdler32.put(
"", -1);
299 transferDestination.put(
"", transferDestinationStr);
301 data.push_back(std::make_pair(
"", processedEvents));
302 data.push_back(std::make_pair(
"", acceptedEvents));
303 data.push_back(std::make_pair(
"", errorEvents));
304 data.push_back(std::make_pair(
"", bitmask));
305 data.push_back(std::make_pair(
"", fileList));
306 data.push_back(std::make_pair(
"", fileSize));
307 data.push_back(std::make_pair(
"", inputFiles));
308 data.push_back(std::make_pair(
"", fileAdler32));
309 data.push_back(std::make_pair(
"", transferDestination));
311 pt.add_child(
"data", data);
313 if (fms ==
nullptr) {
314 pt.put(
"definition",
"/fakeDefinition.jsn");
319 pt.put(
"definition", outJsonDefName.string());
323 sprintf(sourceInfo,
"%s_%d", host, pid);
324 pt.put(
"source", sourceInfo);
333 namespace bpt = boost::property_tree;
345 boost::filesystem::create_directories(runDir);
347 jsonFilePathName = baseName +
".jsn";
348 openJsonFilePathName = jsonFilePathName +
".open";
351 openHistoFilePathName = histoFilePathName +
".open";
356 if (fileFormat ==
ROOT) {
359 }
else if (fileFormat ==
PB) {
365 if (fileFormat ==
ROOT)
371 dbe_->save(openHistoFilePathName,
373 "^(Reference/)?([^/]+)",
382 else if (fileFormat ==
PB)
385 dbe_->savePB(openHistoFilePathName,
393 <<
"Internal error, can save files"
394 <<
" only in ROOT or ProtocolBuffer format.";
397 rename(openHistoFilePathName.c_str(), histoFilePathName.c_str());
401 write_json(openJsonFilePathName, pt);
402 rename(openJsonFilePathName.c_str(), jsonFilePathName.c_str());
413 std::map<std::string, std::string>
info;
414 info[
"Source"] =
"DQMStore";
415 info[
"FileClass"] =
"DQM";
423 : convention_ (Offline),
432 runIsComplete_ (
false),
433 enableMultiThread_ (
false),
434 saveByLumiSection_ (-1),
436 saveAtJobEnd_ (
false),
437 saveReference_ (
DQMStore::SaveWithReference),
438 saveReferenceQMin_ (dqm::qstatus::
STATUS_OK),
439 forceRunNumber_ (-1),
452 if (convention ==
"Offline")
454 else if (convention ==
"Online")
456 else if (convention ==
"FilterUnit")
460 <<
"Invalid 'convention' parameter '" << convention <<
"'."
461 <<
" Expected one of 'Online' or 'Offline' or 'FilterUnit'.";
472 ||
workflow_.find_first_not_of(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
473 "abcdefghijklmnopqrstuvwxyz"
475 "-_/") != std::string::npos)
477 <<
"Invalid 'workflow' parameter '" <<
workflow_
478 <<
"'. Expected '/A/B/C'.";
482 <<
"The 'workflow' parameter must be empty in 'Online' and 'FilterUnit' conventions.";
490 if (fileFormat ==
"ROOT")
492 else if (fileFormat ==
"PB")
496 <<
"Invalid 'fileFormat' parameter '" << fileFormat <<
"'."
497 <<
" Expected one of 'ROOT' or 'PB'.";
510 <<
"Invalid 'producer' parameter '" <<
producer_
511 <<
"'. Expected 'DQM', 'HLTDQM' or 'Playback'.";
518 <<
"Invalid 'producer' parameter '" <<
producer_
519 <<
"'. Expected 'DQM'.";
531 if (refsave ==
"default")
533 else if (refsave ==
"skip")
538 else if (refsave ==
"all")
543 else if (refsave ==
"qtests")
550 <<
"Invalid 'referenceHandling' parameter '" << refsave
551 <<
"'. Expected 'default', 'skip', 'all' or 'qtests'.";
559 if (dirName_.empty() || stat(dirName_.c_str(), &
s) == -1)
561 <<
"Invalid 'dirName' parameter '" << dirName_ <<
"'.";
592 sprintf(version,
"_V%04d_",
int(
version_));
596 else if (fakeFilterUnitMode_)
599 <<
"Fake FU mode, files are saved under <dirname>/runXXXXXX/runXXXXXX_lsXXXX_<stream_Label>.pb.\n";
605 <<
"The base dir provided in the configuration '" << dirName_ <<
"'\n"
606 <<
" will not be considered: for FU, the DAQ2 services will handle directories\n";
611 if (!(
fms_ && daqDirector))
613 <<
"Internal error, cannot initialize DAQ services.";
618 <<
"DQM file saving settings:\n"
622 <<
" saving every " <<
saveByRun_ <<
" run(s)\n"
623 <<
" saving at job end: " << (
saveAtJobEnd_ ?
"yes" :
"no") <<
"\n";
641 std::shared_ptr<saverDetails::NoCache>
654 std::ofstream
file(initFileName);
661 std::shared_ptr<saverDetails::NoCache>
679 int irun = iLS.
id().
run();
684 <<
"Internal error, can save files at end of lumi block"
685 <<
" only in Online, FilterUnit or Offline mode.";
691 sprintf(suffix,
"_R%09d_L%06d", irun, ilumi);
692 sprintf(rewrite,
"\\1Run %d/\\2/By Lumi Section %d-%d", irun, ilumi-
nlumi_, ilumi);
699 <<
"Internal error, can save files"
700 <<
" only in ROOT or ProtocolBuffer format.";
714 sprintf(rewrite,
"\\1Run %d/\\2/By Lumi Section %d-%d", irun, ilumi, ilumi);
725 <<
"Internal error, can save files"
726 <<
" only in ROOT format.";
737 int irun = iRun.
id().
run();
744 sprintf(suffix,
"_R%09d", irun);
746 sprintf(rewrite,
"\\1Run %d/\\2/Run summary", irun);
753 <<
"Internal error, can save files"
754 <<
" only in ROOT or ProtocolBuffer format.";
762 <<
"Internal error. Can only save files in endRun()"
763 <<
" in Online and Offline modes.";
769 <<
"Producing fake EoR file.\n";
773 std::string openJsonFilePathName = jsonFilePathName +
".open";
775 boost::filesystem::create_directories(runDir);
777 using namespace boost::property_tree;
781 ptree child1, child2, child3;
787 data.push_back(std::make_pair(
"", child1));
788 data.push_back(std::make_pair(
"", child2));
789 data.push_back(std::make_pair(
"", child3));
791 pt.add_child(
"data",
data);
792 pt.put(
"definition",
"/non-existant/");
793 pt.put(
"source",
"--hostname--");
795 std::ofstream
file(jsonFilePathName);
796 write_json(file,
pt,
true);
799 rename(openJsonFilePathName.c_str(), jsonFilePathName.c_str());
814 <<
"Internal error. Can only save files at the end of the"
815 <<
" job in Offline mode.";
820 sprintf(suffix,
"R%09d",
irun_.load());
829 unsigned int digits = 0;
830 while (numberOfChildren != 0) {
832 numberOfChildren /= 10;
839 char buffer[digits + 2];
840 snprintf(buffer, digits + 2,
"_%0*d", digits, childIndex);
LuminosityBlockID id() const
T getUntrackedParameter(std::string const &, T const &) const
DQMFileSaver(const edm::ParameterSet &ps)
void saveForOffline(const std::string &workflow, int run, int lumi) const
static std::string dataFileExtension(DQMFileSaver::FileFormat fileFormat)
virtual void globalEndRun(const edm::Run &, const edm::EventSetup &) const
std::string getInitFilePath(std::string const &stream) const
static boost::property_tree::ptree fillJson(int run, int lumi, const std::string &dataFilePathName, const std::string transferDestinationStr, evf::FastMonitoringService *fms)
evf::FastMonitoringService * fms_
string format
Some error handling for the usage.
std::atomic< int > nlumi_
std::string fileBaseName_
virtual void globalEndLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) const
unsigned int getEventsProcessedForLumi(unsigned int lumi)
std::string transferDestination_
tuple path
else: Piece not in the list, fine.
void saveJobReport(const std::string &filename) const
static void getAnInt(const edm::ParameterSet &ps, int &value, const std::string &name)
static std::string onlineOfflineFileName(const std::string &fileBaseName, const std::string &suffix, const std::string &workflow, const std::string &child, DQMFileSaver::FileFormat fileFormat)
void saveForOnline(int run, const std::string &suffix, const std::string &rewrite) const
std::string stream_label_
static const std::string streamPrefix_
virtual std::shared_ptr< saverDetails::NoCache > globalBeginRun(const edm::Run &, const edm::EventSetup &) const
std::string getReleaseVersion()
void saveForOnlinePB(int run, const std::string &suffix) const
std::atomic< int > fileUpdate_
LuminosityBlockNumber_t luminosityBlock() const
virtual void analyze(edm::StreamID, const edm::Event &e, const edm::EventSetup &) const
virtual std::shared_ptr< saverDetails::NoCache > globalBeginLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) const
void saveForOfflinePB(const std::string &workflow, int run) const
char data[epos_bytes_allocation]
void reportAnalysisFile(std::string const &fileName, std::map< std::string, std::string > const &fileData)
static void doSaveForOnline(DQMStore *store, int run, bool enableMultiThread, const std::string &filename, const std::string &directory, const std::string &rxpat, const std::string &rewrite, DQMStore::SaveReferenceTag saveref, int saveRefQMin, const std::string &filterName, DQMFileSaver::FileFormat fileFormat)
static const int STATUS_OK
virtual void postForkReacquireResources(unsigned int childIndex, unsigned int numberOfChildren)
volatile std::atomic< bool > shutdown_flag false
virtual void beginJob(void)
virtual void endJob(void)
static const std::string streamSuffix_
void saveForFilterUnit(const std::string &rewrite, int run, int lumi, const FileFormat fileFormat) const