21 #include "HepMC3/ReaderFactory.h"
31 #ifdef HEPMCCONVERT_EXTENSION_ROOTTREEOPAL
33 #warning "HEPMCCONVERT_EXTENSION_ROOTTREEOPAL requires compilation with of HepMC with ROOT, i.e. HEPMC3_ROOTIO.This extension will be disabled."
34 #undef HEPMCCONVERT_EXTENSION_ROOTTREEOPAL
39 #ifdef HEPMCCONVERT_EXTENSION_HEPEVTZEUS
42 #ifdef HEPMCCONVERT_EXTENSION_DOT
45 #ifdef HEPMCCONVERT_EXTENSION_GZ
48 #ifdef HEPMCCONVERT_EXTENSION_UPROOTTREEREADER
49 #include "ReaderuprootTree.h"
55 enum formats {autodetect, hepmc2, hepmc3, hpe ,root, treeroot ,treerootopal, hpezeus, lhef, dump, dot, gz, uproot, plugin, none};
56 int main(
int argc,
char** argv)
58 gengetopt_args_info ai;
59 if (cmdline_parser (argc, argv, &ai) != 0) {
64 printf(
"Exactly two arguments are requred: the name of input and output files\n");
67 std::map<std::string,formats> format_map;
68 format_map.insert(std::pair<std::string,formats> (
"auto", autodetect ));
69 format_map.insert(std::pair<std::string,formats> (
"hepmc2", hepmc2 ));
70 format_map.insert(std::pair<std::string,formats> (
"hepmc3", hepmc3 ));
71 format_map.insert(std::pair<std::string,formats> (
"hpe", hpe ));
72 format_map.insert(std::pair<std::string,formats> (
"root", root ));
73 format_map.insert(std::pair<std::string,formats> (
"treeroot", treeroot ));
74 format_map.insert(std::pair<std::string,formats> (
"treerootopal", treerootopal ));
75 format_map.insert(std::pair<std::string,formats> (
"hpezeus", hpezeus ));
76 format_map.insert(std::pair<std::string,formats> (
"lhef", lhef ));
77 format_map.insert(std::pair<std::string,formats> (
"dump", dump ));
78 format_map.insert(std::pair<std::string,formats> (
"dot", dot ));
79 format_map.insert(std::pair<std::string,formats> (
"gz", gz ));
80 format_map.insert(std::pair<std::string,formats> (
"uproot", uproot ));
81 format_map.insert(std::pair<std::string,formats> (
"plugin", plugin ));
82 format_map.insert(std::pair<std::string,formats> (
"none", none ));
83 std::map<std::string, std::string> options;
84 for (
size_t i=0; i<ai.extensions_given; i++)
86 std::string optarg=std::string(ai.extensions_arg[i]);
87 size_t pos=optarg.find_first_of(
'=');
88 if (pos<optarg.length())
89 options[std::string(optarg,0,pos)]=std::string(optarg,pos+1,optarg.length());
91 long int events_parsed = 0;
92 long int events_limit = ai.events_limit_arg;
93 long int first_event_number = ai.first_event_number_arg;
94 long int last_event_number = ai.last_event_number_arg;
95 long int print_each_events_parsed = ai.print_every_events_parsed_arg;
96 std::string InputPluginLibrary;
97 std::string InputPluginName;
99 std::string OutputPluginLibrary;
100 std::string OutputPluginName;
102 std::shared_ptr<Reader> input_file;
103 bool input_is_stdin=(std::string(ai.inputs[0])==std::string(
"-"));
104 if (input_is_stdin) std::ios_base::sync_with_stdio(
false);
105 bool ignore_writer=
false;
106 switch (format_map.at(std::string(ai.input_format_arg)))
112 input_is_stdin?printf(
"Input format detection for std input has failed\n"):printf(
"Input format detection for file %s has failed\n",ai.inputs[0]);
117 input_file=(input_is_stdin?std::make_shared<ReaderAsciiHepMC2>(std::cin):std::make_shared<
ReaderAsciiHepMC2>(ai.inputs[0]));
120 input_file=(input_is_stdin?std::make_shared<ReaderAscii>(std::cin):std::make_shared<
ReaderAscii>(ai.inputs[0]));
123 input_file=(input_is_stdin?std::make_shared<ReaderHEPEVT>(std::cin):std::make_shared<
ReaderHEPEVT>(ai.inputs[0]));
126 input_file=(input_is_stdin?std::make_shared<ReaderLHEF>(std::cin):std::make_shared<
ReaderLHEF>(ai.inputs[0]));
129 #ifdef HEPMCCONVERT_EXTENSION_GZ
130 input_file=std::make_shared<ReaderGZ>(ai.inputs[0]);
133 printf(
"Input format %s is not supported\n",ai.input_format_arg);
137 #ifdef HEPMCCONVERT_EXTENSION_UPROOTTREEREADER
138 input_file=std::make_shared<ReaderuprootTree>(ai.inputs[0]);
141 printf(
"Input format %s is not supported\n",ai.input_format_arg);
146 input_file=std::make_shared<ReaderRootTree>(ai.inputs[0]);
149 printf(
"Input format %s is not supported\n",ai.input_format_arg);
154 input_file=std::make_shared<ReaderRoot>(ai.inputs[0]);
157 printf(
"Input format %s is not supported\n",ai.input_format_arg);
161 if (options.find(
"InputPluginLibrary")==options.end()) { printf(
"InputPluginLibrary option required\n"); exit(2);}
else InputPluginLibrary=options.at(
"InputPluginLibrary");
162 if (options.find(
"InputPluginName")==options.end()) { printf(
"InputPluginName option required\n"); exit(2);}
else InputPluginName=options.at(
"InputPluginName");
163 input_file=std::make_shared<ReaderPlugin>(std::string(ai.inputs[0]),InputPluginLibrary,InputPluginName);
164 if (input_file->
failed()) { printf(
"Plugin initialization failed\n"); exit(2);}
167 printf(
"Input format %s is not known\n",ai.input_format_arg);
171 std::shared_ptr<Writer> output_file;
172 switch (format_map.at(std::string(ai.output_format_arg)))
175 output_file=std::make_shared<WriterAsciiHepMC2>(ai.inputs[1]);
178 output_file=std::make_shared<WriterAscii>(ai.inputs[1]);
181 output_file=std::make_shared<WriterHEPEVT>(ai.inputs[1]);
185 output_file=std::make_shared<WriterRoot>(ai.inputs[1]);
188 printf(
"Output format %s is not supported\n",ai.output_format_arg);
193 output_file=std::make_shared<WriterRootTree>(ai.inputs[1]);
196 printf(
"Output format %s is not supported\n",ai.output_format_arg);
201 #ifdef HEPMCCONVERT_EXTENSION_ROOTTREEOPAL
202 output_file=std::make_shared<WriterRootTreeOPAL>(ai.inputs[1]);
203 (std::dynamic_pointer_cast<WriterRootTreeOPAL>(output_file))->init_branches();
204 if (options.find(
"Run")!=options.end()) (std::dynamic_pointer_cast<WriterRootTreeOPAL>(output_file))->set_run_number(std::atoi(options.at(
"Run").c_str()));
207 printf(
"Output format %s is not supported\n",ai.output_format_arg);
212 #ifdef HEPMCCONVERT_EXTENSION_HEPEVTZEUS
213 output_file=std::make_shared<WriterHEPEVTZEUS>(ai.inputs[1]);
216 printf(
"Output format %s is not supported\n",ai.output_format_arg);
220 #ifdef HEPMCCONVERT_EXTENSION_DOT
221 output_file=std::make_shared<WriterDOT>(ai.inputs[1]);
222 if (options.find(
"Style")!=options.end()) (std::dynamic_pointer_cast<WriterDOT>(output_file))->set_style(std::atoi(options.at(
"Style").c_str()));
225 printf(
"Output format %s is not supported\n",ai.output_format_arg);
230 if (options.find(
"OutputPluginLibrary")==options.end()) { printf(
"OutputPluginLibrary option required, e.g. OutputPluginLibrary=libAnalysis.so\n"); exit(2);}
else OutputPluginLibrary=options.at(
"OutputPluginLibrary");
231 if (options.find(
"OutputPluginName")==options.end()) { printf(
"OutputPluginName option required, e.g. OutputPluginName=newAnalysisExamplefile\n"); exit(2);}
else OutputPluginName=options.at(
"OutputPluginName");
232 output_file=std::make_shared<WriterPlugin>(std::string(ai.inputs[1]),OutputPluginLibrary,OutputPluginName);
233 if (output_file->
failed()) { printf(
"Plugin initialization failed\n"); exit(2);}
243 printf(
"Output format %s is not known\n",ai.output_format_arg);
247 while( !input_file->
failed() )
251 if( input_file->
failed() ) {
252 printf(
"End of file reached. Exit.\n");
255 if (evt.event_number()<first_event_number)
continue;
256 if (evt.event_number()>last_event_number)
continue;
257 evt.set_run_info(input_file->
run_info());
272 if( events_parsed%print_each_events_parsed == 0 ) printf(
"Events parsed: %li\n",events_parsed);
273 if( events_parsed >= events_limit ) {
274 printf(
"Event limit reached:->events_parsed(%li) >= events_limit(%li)<-. Exit.\n",events_parsed , events_limit);
279 if (input_file) input_file->
close();
280 if (output_file) output_file->
close();
281 cmdline_parser_free(&ai);