Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-02-07 23:29:39

0001 /** measure branch or leaves sizes
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   // clang-format off
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   // clang-format on
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 }