File indexing completed on 2025-02-07 23:29:39
0001
0002
0003
0004
0005
0006 #include "PerfTools/EdmEvent/interface/EdmEventSize.h"
0007
0008 #include <boost/program_options.hpp>
0009 #include <string>
0010 #include <iostream>
0011 #include <fstream>
0012
0013 #include <TROOT.h>
0014 #include <TSystem.h>
0015 #include <TError.h>
0016 #include "FWCore/FWLite/interface/FWLiteEnabler.h"
0017
0018 static const char* const kHelpOpt = "help";
0019 static const char* const kHelpCommandOpt = "help,h";
0020 static const char* const kDataFileOpt = "data-file";
0021 static const char* const kDataFileCommandOpt = "data-file,d";
0022 static const char* const kTreeNameOpt = "tree-name";
0023 static const char* const kTreeNameCommandOpt = "tree-name,n";
0024 static const char* const kOutputOpt = "output";
0025 static const char* const kOutputCommandOpt = "output,o";
0026 static const char* const kAutoLoadOpt = "auto-loader";
0027 static const char* const kAutoLoadCommandOpt = "auto-loader,a";
0028 static const char* const kPlotOpt = "plot";
0029 static const char* const kPlotCommandOpt = "plot,p";
0030 static const char* const kSavePlotOpt = "save-plot";
0031 static const char* const kSavePlotCommandOpt = "save-plot,s";
0032 static const char* const kPlotTopOpt = "plot-top";
0033 static const char* const kPlotTopCommandOpt = "plot-top,t";
0034 static const char* const kVerboseOpt = "verbose";
0035 static const char* const kVerboseCommandOpt = "verbose,v";
0036 static const char* const kAlphabeticOrderOpt = "alphabetic-order";
0037 static const char* const kAlphabeticOrderCommandOpt = "alphabetic-order,A";
0038 static const char* const kFormatNamesOpt = "format-names";
0039 static const char* const kFormatNamesCommandOpt = "format-names,F";
0040 static const char* const kOutputFormatOpt = "output-format";
0041 static const char* const kOutputFormatCommandOpt = "output-format,f";
0042 static const char* const kLeavesSizeOpt = "get-leaves-size";
0043 static const char* const kLeavesSizeCommandOpt = "get-leaves-size,L";
0044
0045 template <perftools::EdmEventMode M>
0046 void processRecord(const boost::program_options::variables_map& vm,
0047 const std::string& fileName,
0048 const std::string& treeName,
0049 bool verbose) {
0050 using EventSize = typename perftools::EdmEventSize<M>;
0051 using Error = typename EventSize::Error;
0052 try {
0053 EventSize me(fileName, treeName);
0054
0055 if (vm.count(kFormatNamesOpt))
0056 me.formatNames();
0057
0058 if (vm.count(kAlphabeticOrderOpt))
0059 me.sortAlpha();
0060
0061 if (verbose) {
0062 std::cout << std::endl;
0063 if (vm.count(kOutputFormatOpt) && vm[kOutputFormatOpt].as<std::string>() == "json")
0064 me.dumpJson(std::cout);
0065 else
0066 me.dump(std::cout);
0067 std::cout << std::endl;
0068 }
0069
0070 if (vm.count(kOutputOpt)) {
0071 std::ofstream of(vm[kOutputOpt].as<std::string>().c_str());
0072 if (vm.count(kOutputFormatOpt) && vm[kOutputFormatOpt].as<std::string>() == "json")
0073 me.dumpJson(of);
0074 else
0075 me.dump(of);
0076 of << std::endl;
0077 }
0078
0079 bool plot = (vm.count(kPlotOpt) > 0);
0080 bool save = (vm.count(kSavePlotOpt) > 0);
0081 if (plot || save) {
0082 std::string plotName;
0083 std::string histName;
0084 if (plot)
0085 plotName = vm[kPlotOpt].as<std::string>();
0086 if (save)
0087 histName = vm[kSavePlotOpt].as<std::string>();
0088 int top = 0;
0089 if (vm.count(kPlotTopOpt) > 0)
0090 top = vm[kPlotTopOpt].as<int>();
0091 me.produceHistos(plotName, histName, top);
0092 }
0093 } catch (Error const& error) {
0094 std::cerr << "Error: " << error.descr << std::endl;
0095 exit(error.code);
0096 }
0097 }
0098
0099 int main(int argc, char* argv[]) {
0100 using namespace boost::program_options;
0101
0102 std::string programName(argv[0]);
0103 std::string descString(programName);
0104 descString += " [options] ";
0105 descString += "data_file \nAllowed options";
0106 options_description desc(descString);
0107
0108
0109 desc.add_options()(kHelpCommandOpt, "produce help message")(
0110 kAutoLoadCommandOpt,"automatic library loading (avoid root warnings)")(
0111 kDataFileCommandOpt, value<std::string>(), "data file")(
0112 kTreeNameCommandOpt, value<std::string>(), "tree name (default \"Events\")")(
0113 kOutputCommandOpt, value<std::string>(), "output file")(
0114 kAlphabeticOrderCommandOpt, "sort by alphabetic order (default: sort by size)")(
0115 kFormatNamesCommandOpt, "format product name as \"product:label (type)\" or \"product:label (type) object (object type)\" (default: use full branch name)")(
0116 kPlotCommandOpt, value<std::string>(), "produce a summary plot")(
0117 kPlotTopCommandOpt, value<int>(), "plot only the <arg> top size branches")(
0118 kSavePlotCommandOpt, value<std::string>(), "save plot into root file <arg>")(
0119 kVerboseCommandOpt, "verbose printout")(
0120 kOutputFormatCommandOpt, value<std::string>(), "output file format as text or json (default: text)")(
0121 kLeavesSizeCommandOpt, "get size of every leaf in the tree");
0122
0123
0124 positional_options_description p;
0125
0126 p.add(kDataFileOpt, -1);
0127
0128 variables_map vm;
0129 try {
0130 store(command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
0131 notify(vm);
0132 } catch (const error&) {
0133 return 7000;
0134 }
0135
0136 if (vm.count(kHelpOpt)) {
0137 std::cout << desc << std::endl;
0138 return 0;
0139 }
0140
0141 if (!vm.count(kDataFileOpt)) {
0142 std::cerr << programName << ": no data file given" << std::endl;
0143 return 7001;
0144 }
0145
0146 gROOT->SetBatch();
0147
0148 if (vm.count(kAutoLoadOpt) != 0) {
0149 gSystem->Load("libFWCoreFWLite");
0150 FWLiteEnabler::enable();
0151 } else
0152 gErrorIgnoreLevel = kError;
0153
0154 bool verbose = vm.count(kVerboseOpt) > 0;
0155
0156 std::string fileName = vm[kDataFileOpt].as<std::string>();
0157
0158 std::string treeName = "Events";
0159 if (vm.count(kTreeNameOpt))
0160 treeName = vm[kTreeNameOpt].as<std::string>();
0161
0162 if (vm.count(kLeavesSizeOpt))
0163 processRecord<perftools::EdmEventMode::Leaves>(vm, fileName, treeName, verbose);
0164 else
0165 processRecord<perftools::EdmEventMode::Branches>(vm, fileName, treeName, verbose);
0166
0167 return 0;
0168 }