39 template <
typename S,
typename T>
41 tinyxml2::XMLDocument doc;
42 if (f.fileHasBeenClosed) {
43 os <<
"\n<State Value=\"closed\"/>";
45 os <<
"\n<State Value=\"open\"/>";
47 os <<
"\n<LFN>" << doc.NewText(f.logicalFileName.c_str())->
Value() <<
"</LFN>";
48 os <<
"\n<PFN>" << doc.NewText(f.physicalFileName.c_str())->
Value() <<
"</PFN>";
49 os <<
"\n<Catalog>" << doc.NewText(f.catalog.c_str())->
Value() <<
"</Catalog>";
50 os <<
"\n<ModuleLabel>" << doc.NewText(f.moduleLabel.c_str())->
Value() <<
"</ModuleLabel>";
51 os <<
"\n<GUID>" << f.guid <<
"</GUID>";
53 for (
auto const& branch : f.branchNames) {
54 os <<
"\n <Branch>" << doc.NewText(branch.c_str())->
Value() <<
"</Branch>";
57 os <<
"\n</Branches>";
67 tinyxml2::XMLDocument doc;
68 os <<
"\n<InputFile>";
70 os <<
"\n<InputType>" << f.
inputType <<
"</InputType>";
78 tinyxml2::XMLDocument doc;
82 os <<
"\n<DataType>" << doc.NewText(f.
dataType.c_str())->
Value() <<
"</DataType>\n";
83 os <<
"\n<BranchHash>" << doc.NewText(f.
branchHash.c_str())->
Value() <<
"</BranchHash>\n";
89 os <<
"\n<Run ID=\"" << rep.
runNumber <<
"\">\n";
93 os <<
" <LumiSection ID=\"" << il.first <<
"\"/>\n";
96 os <<
" <LumiSection ID=\"" << il.first <<
"\" NEvents=\"" << il.second <<
"\"/>\n";
112 << t <<
" but no matching input file is found\n";
118 <<
"Access reported for input file with token " << t <<
" but no matching input file is found\n";
124 <<
"Access reported for input file with token " << t <<
" after this file has been closed.\n"
125 <<
"File record follows:\n"
126 << *inputFile <<
'\n';
132 if (t >= outputFiles_.size()) {
134 <<
"Access reported for output file with token " << t <<
" but no matching output file is found\n";
136 if (outputFiles_[t].fileHasBeenClosed) {
138 <<
"Access reported for output file with token " << t <<
" after this file has been closed.\n"
139 <<
"File record follows:\n"
140 << outputFiles_[
t] <<
'\n';
142 return outputFiles_[
t];
155 outputFile.contributingInputsSecSource.push_back(t);
172 for (
auto const& runReport : f.runReports) {
173 *ost_ << runReport.second;
175 *ost_ <<
"\n</Runs>\n";
176 *ost_ <<
"</InputFile>\n";
196 tinyxml2::XMLDocument doc;
202 for (
auto const& runReport : f.runReports) {
203 *ost_ << runReport.second;
205 *ost_ <<
"\n</Runs>\n";
207 *ost_ <<
"\n<Inputs>";
208 for (
auto token : f.contributingInputs) {
210 *ost_ <<
"\n<Input>";
215 *ost_ <<
"\n</Input>";
216 doc.DeleteChildren();
218 for (
auto token : f.contributingInputsSecSource) {
220 *ost_ <<
"\n<Input>";
225 *ost_ <<
"\n</Input>";
226 doc.DeleteChildren();
228 *ost_ <<
"\n</Inputs>";
229 *ost_ <<
"\n</File>\n";
238 for (
auto const&
inputFile : inputFiles_) {
243 for (
auto const&
inputFile : inputFilesSecSource_) {
256 auto& theMap = outputFiles_.at(token).runReports;
257 std::map<RunNumber, RunReport>::iterator iter(theMap.lower_bound(runNumber));
258 if (iter == theMap.end() || runNumber < iter->first) {
266 std::map<RunNumber, RunReport>& theMap =
inputFile.runReports;
267 std::map<RunNumber, RunReport>::iterator iter(theMap.lower_bound(runNumber));
268 if (iter == theMap.end() || runNumber < iter->first) {
277 unsigned int lumiSect,
279 auto& theMap = outputFiles_.at(token).runReports;
280 std::map<RunNumber, RunReport>::iterator iter(theMap.lower_bound(runNumber));
281 if (iter == theMap.end() || runNumber < iter->first) {
284 iter->second.lumiSectionsToNEvents[lumiSect] +=
nEvents;
291 std::map<RunNumber, RunReport>& theMap =
inputFile.runReports;
292 std::map<RunNumber, RunReport>::iterator iter(theMap.lower_bound(runNumber));
293 if (iter == theMap.end() || runNumber < iter->first) {
308 *(
impl_->ost_) <<
"</FrameworkJobReport>\n" << std::flush;
316 *(
impl_->ost_) <<
"<FrameworkJobReport>\n";
332 if (inputType ==
"mixingFiles") {
336 newToken = itr -
impl_->inputFilesSecSource_.begin();
338 if (inputType ==
"secondaryFiles") {
341 impl_->inputFiles_.emplace_back();
342 newFile = &
impl_->inputFiles_.back();
343 newToken =
impl_->inputFiles_.size() - 1;
347 impl_->lastOpenedPrimaryInputFile_ =
impl_->inputFiles_.size() - 1;
355 newFile->
guid = guid;
362 impl_->insertInputForOutputs(theInputType, newToken);
380 impl_->writeInputFile(f);
384 impl_->writeInputFile(f);
398 auto itr =
impl_->outputFiles_.emplace_back();
416 if (!
impl_->inputFiles_[
i].fileHasBeenClosed) {
422 if (!
impl_->inputFilesSecSource_[
i].fileHasBeenClosed) {
426 return itr -
impl_->outputFiles_.begin();
437 impl_->writeOutputFile(f);
445 msg <<
"<SkippedEvent Run=\"" << run <<
"\"";
446 msg <<
" Event=\"" <<
event <<
"\" />\n";
461 unsigned int lumiSectId,
463 impl_->associateLumiSection(token, run, lumiSectId, nEvents);
467 impl_->associateInputLumiSection(run, lumiSectId);
475 tinyxml2::XMLDocument doc;
480 msg <<
"<AnalysisFile>\n"
481 <<
" <FileName>" << doc.NewText(fileName.c_str())->
Value() <<
"</FileName>\n";
483 typedef std::map<std::string, std::string>::const_iterator const_iterator;
484 for (const_iterator pos = fileData.begin(), posEnd = fileData.end(); pos != posEnd; ++pos) {
485 msg <<
" <" << pos->first <<
" Value=\"" << pos->second <<
"\" />"
488 msg <<
"</AnalysisFile>\n";
499 msg <<
"<FrameworkError ExitStatus=\"" << exitCode <<
"\" Type=\"" << shortDesc <<
"\" >\n";
500 msg <<
"<![CDATA[\n" << longDesc <<
"\n]]>\n";
501 msg <<
"</FrameworkError>\n";
510 tinyxml2::XMLDocument doc;
511 tinyxml2::XMLPrinter printer;
512 tinyxml2::XMLElement* skipped = doc.NewElement(
"SkippedFile");
513 skipped->SetAttribute(
"Pfn", pfn.c_str());
514 skipped->SetAttribute(
"Lfn", lfn.c_str());
517 skipped->Accept(&printer);
518 msg << printer.CStr();
527 tinyxml2::XMLDocument doc;
528 tinyxml2::XMLPrinter printer;
529 tinyxml2::XMLElement* fallback = doc.NewElement(
"FallbackAttempt");
530 fallback->SetAttribute(
"Pfn", pfn.c_str());
531 fallback->SetAttribute(
"Lfn", lfn.c_str());
534 fallback->Accept(&printer);
535 msg << printer.CStr();
536 msg <<
"<![CDATA[\n" << err <<
"\n]]>\n";
545 msg <<
"<MemoryService>\n";
547 typedef std::vector<std::string>::const_iterator const_iterator;
548 for (const_iterator pos = memoryData.begin(), posEnd = memoryData.end(); pos != posEnd; ++pos) {
551 msg <<
"</MemoryService>\n";
559 msg <<
"<MessageSummary>\n";
560 typedef std::map<std::string, double>::const_iterator const_iterator;
561 for (const_iterator pos = messageData.begin(), posEnd = messageData.end(); pos != posEnd; ++pos) {
562 msg <<
" <" << pos->first <<
" Value=\"" << pos->second <<
"\" />"
565 msg <<
"</MessageSummary>\n";
571 bool expected =
false;
572 if (not
impl_->printedReadBranches_.compare_exchange_strong(expected,
true))
575 std::ostream& ost = *(
impl_->ost_);
576 ost <<
"<ReadBranches>\n";
577 tinyxml2::XMLDocument doc;
578 tinyxml2::XMLPrinter printer;
579 for (
auto const& iBranch :
impl_->readBranches_) {
580 tinyxml2::XMLElement* branch = doc.NewElement(
"Branch");
581 branch->SetAttribute(
"Name", iBranch.first.c_str());
582 branch->SetAttribute(
"ReadCount", int64_t(iBranch.second));
583 branch->Accept(&printer);
584 ost << printer.CStr();
585 printer.ClearBuffer();
587 for (
auto const& iBranch :
impl_->readBranchesSecFile_) {
588 tinyxml2::XMLElement* branch = doc.NewElement(
"Branch");
589 branch->SetAttribute(
"Name", iBranch.first.c_str());
590 branch->SetAttribute(
"ReadCount", int64_t(iBranch.second));
591 branch->Accept(&printer);
592 ost << printer.CStr();
593 printer.ClearBuffer();
595 ost <<
"</ReadBranches>\n";
596 if (!
impl_->readBranchesSecSource_.empty()) {
597 ost <<
"<SecondarySourceReadBranches>\n";
598 for (
auto const& iBranch :
impl_->readBranchesSecSource_) {
599 tinyxml2::XMLElement* branch = doc.NewElement(
"Branch");
600 branch->SetAttribute(
"Name", iBranch.first.c_str());
601 branch->SetAttribute(
"ReadCount", int64_t(iBranch.second.value().load()));
602 branch->Accept(&printer);
603 ost << printer.CStr();
604 printer.ClearBuffer();
606 ost <<
"</SecondarySourceReadBranches>\n";
615 std::set<std::string>
const& clonedBranches =
616 impl_->inputFiles_.at(
impl_->lastOpenedPrimaryInputFile_).fastClonedBranches;
617 if (clonedBranches.find(branchName) == clonedBranches.end()) {
618 ++
impl_->readBranches_[branchName];
621 ++
impl_->readBranchesSecFile_[branchName];
623 ++
impl_->readBranchesSecSource_[branchName].value();
628 std::set<std::string>& clonedBranches =
629 impl_->inputFiles_.at(
impl_->lastOpenedPrimaryInputFile_).fastClonedBranches;
630 for (std::set<std::string>::const_iterator it = fastClonedBranches.begin(), itEnd = fastClonedBranches.end();
633 if (clonedBranches.insert(*it).second) {
640 tinyxml2::XMLDocument doc;
645 msg <<
"<RandomServiceStateFile>\n"
646 << doc.NewText(name.c_str())->
Value() <<
"\n"
647 <<
"</RandomServiceStateFile>\n";
654 std::map<std::string, std::string>
const&
metrics) {
657 msg <<
"<PerformanceReport>\n"
658 <<
" <PerformanceSummary Metric=\"" << metricClass <<
"\">\n";
660 typedef std::map<std::string, std::string>::const_iterator const_iterator;
661 for (const_iterator iter = metrics.begin(), iterEnd = metrics.end(); iter != iterEnd; ++iter) {
662 msg <<
" <Metric Name=\"" << iter->first <<
"\" "
663 <<
"Value=\"" << iter->second <<
"\"/>\n";
666 msg <<
" </PerformanceSummary>\n"
667 <<
"</PerformanceReport>\n";
674 std::map<std::string, std::string>
const&
metrics) {
677 msg <<
"<PerformanceReport>\n"
678 <<
" <PerformanceModule Metric=\"" << metricClass <<
"\" "
679 <<
" Module=\"" << moduleName <<
"\" >\n";
681 typedef std::map<std::string, std::string>::const_iterator const_iterator;
682 for (const_iterator iter = metrics.begin(), iterEnd = metrics.end(); iter != iterEnd; ++iter) {
683 msg <<
" <Metric Name=\"" << iter->first <<
"\" "
684 <<
"Value=\"" << iter->second <<
"\"/>\n";
687 msg <<
" </PerformanceModule>\n"
688 <<
"</PerformanceReport>\n";
694 std::ostringstream
msg;
696 tinyxml2::XMLDocument doc;
697 for (
auto const&
f :
impl_->outputFiles_) {
701 msg <<
"\n<LumiSections>";
703 typedef std::vector<JobReport::Token>::iterator iterator;
704 for (
auto const& iInput : f.contributingInputs) {
705 auto const& inpFile =
impl_->inputFiles_[iInput];
707 msg <<
"\n <LFN>" << doc.NewText(inpFile.logicalFileName.c_str())->
Value() <<
"</LFN>";
708 msg <<
"\n <PFN>" << doc.NewText(inpFile.physicalFileName.c_str())->
Value() <<
"</PFN>";
709 msg <<
"\n <FastCopying>" <<
findOrDefault(f.fastCopyingInputs, inpFile.physicalFileName) <<
"</FastCopying>";
711 doc.DeleteChildren();
713 msg <<
"\n</Inputs>";
void reportSkippedFile(std::string const &pfn, std::string const &lfn)
std::string outputModuleClassName
std::string physicalFileName
void associateRun(JobReport::Token token, unsigned int runNumber)
void reportMemoryInfo(std::vector< std::string > const &memoryData)
void reportInputRunNumber(unsigned int run)
void eventReadFromFile(InputType inputType, Token fileToken)
void reportFallbackAttempt(std::string const &pfn, std::string const &lfn, std::string const &err)
unsigned long long EventNumber_t
std::map< std::string, bool > fastCopyingInputs
std::string logicalFileName
void reportFastCopyingStatus(Token t, std::string const &inputFileName, bool fastCopying)
void reportRunNumber(JobReport::Token token, unsigned int run)
void reportRandomStateFile(std::string const &name)
S & print(S &os, JobReport::InputFile const &f)
edm::propagate_const< std::unique_ptr< JobReportImpl > > impl_
Token inputFileOpened(std::string const &physicalFileName, std::string const &logicalFileName, std::string const &catalog, std::string const &inputType, std::string const &inputSourceClassName, std::string const &moduleLabel, std::string const &guid, std::vector< std::string > const &branchNames)
std::vector< InputFile > inputFiles_
void reportPerformanceForModule(std::string const &metricClass, std::string const &moduleName, std::map< std::string, std::string > const &metrics)
std::vector< Token > contributingInputs
tuple InputFile
Open Root file and provide MEs ############.
void reportSkippedEvent(RunNumber_t run, EventNumber_t event)
void insertInputForOutputs(InputType inputType, Token t)
void writeInputFile(InputFile const &f)
void reportInputLumiSection(unsigned int run, unsigned int lumiSectId)
void reportPerformanceSummary(std::string const &metricClass, std::map< std::string, std::string > const &metrics)
reco::JetExtendedAssociation::JetExtendedData Value
Token outputFileOpened(std::string const &physicalFileName, std::string const &logicalFileName, std::string const &catalog, std::string const &outputModuleClassName, std::string const &moduleLabel, std::string const &guid, std::string const &dataType, std::string const &branchHash, std::vector< std::string > const &branchNames)
void reportError(std::string const &shortDesc, std::string const &longDesc, int const &exitCode)
void associateInputRun(unsigned int runNumber)
S & formatFile(T const &f, S &os)
void reportReadBranch(InputType inputType, std::string const &branchName)
Inform the job report that a branch has been read.
std::size_t numEventsWritten
void reportFastClonedBranches(std::set< std::string > const &fastClonedBranches, long long nEvents)
Inform the job report that branches have been fast Cloned.
Value const & findOrDefault(std::map< Key, Value > const &m, Key const &k, Value const &defaultValue)
void eventWrittenToFile(Token fileToken, RunNumber_t run, EventNumber_t event)
void reportMessageInfo(std::map< std::string, double > const &messageData)
void associateLumiSection(JobReport::Token token, unsigned int runNumber, unsigned int lumiSection, unsigned long nEvents)
std::string dumpFiles(void)
debug/test util
std::string moduleName(StableProvenance const &provenance, ProcessHistory const &history)
void reportAnalysisFile(std::string const &fileName, std::map< std::string, std::string > const &fileData)
void outputFileClosed(Token fileToken)
std::map< unsigned int, unsigned long > lumiSectionsToNEvents
void writeOutputFile(OutputFile const &f)
InputFile & getInputFileForToken(InputType inputType, Token t)
void reportDataType(Token fileToken, std::string const &dataType)
oneapi::tbb::concurrent_vector< Token > contributingInputsSecSource
std::ostream & operator<<(std::ostream &ost, const HLTGlobalStatus &hlt)
Formatted printout of trigger tbale.
void inputFileClosed(InputType inputType, Token fileToken)
void associateInputLumiSection(unsigned int runNumber, unsigned int lumiSection)
void reportReadBranches()
OutputFile & getOutputFileForToken(Token t)
oneapi::tbb::concurrent_vector< InputFile > inputFilesSecSource_
void reportLumiSection(JobReport::Token token, unsigned int run, unsigned int lumiSectId, unsigned long nEvents=0)