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
52 using namespace HepMC3;
53 enum formats {autodetect, hepmc2, hepmc3, hpe ,root, treeroot ,treerootopal, hpezeus, lhef, dump, dot, gz, plugin,
none};
54 int main(
int argc,
char** argv)
56 gengetopt_args_info ai;
57 if (cmdline_parser (argc, argv, &ai) != 0) {
62 printf(
"Exactly two arguments are requred: the name of input and output files\n");
65 std::map<std::string,formats> format_map;
66 format_map.insert(std::pair<std::string,formats> (
"auto", autodetect ));
67 format_map.insert(std::pair<std::string,formats> (
"hepmc2", hepmc2 ));
68 format_map.insert(std::pair<std::string,formats> (
"hepmc3", hepmc3 ));
69 format_map.insert(std::pair<std::string,formats> (
"hpe", hpe ));
70 format_map.insert(std::pair<std::string,formats> (
"root", root ));
71 format_map.insert(std::pair<std::string,formats> (
"treeroot", treeroot ));
72 format_map.insert(std::pair<std::string,formats> (
"treerootopal", treerootopal ));
73 format_map.insert(std::pair<std::string,formats> (
"hpezeus", hpezeus ));
74 format_map.insert(std::pair<std::string,formats> (
"lhef", lhef ));
75 format_map.insert(std::pair<std::string,formats> (
"dump", dump ));
76 format_map.insert(std::pair<std::string,formats> (
"dot", dot ));
77 format_map.insert(std::pair<std::string,formats> (
"gz", gz ));
78 format_map.insert(std::pair<std::string,formats> (
"plugin", plugin ));
79 format_map.insert(std::pair<std::string,formats> (
"none",
none ));
80 std::map<std::string, std::string>
options;
81 for (
size_t i=0; i<ai.extensions_given; i++)
83 std::string optarg=std::string(ai.extensions_arg[i]);
84 size_t pos=optarg.find_first_of(
'=');
85 if (pos<optarg.length())
86 options[std::string(optarg,0,pos)]=std::string(optarg,pos+1,optarg.length());
88 long int events_parsed = 0;
89 long int events_limit = ai.events_limit_arg;
90 long int first_event_number = ai.first_event_number_arg;
91 long int last_event_number = ai.last_event_number_arg;
92 long int print_each_events_parsed = ai.print_every_events_parsed_arg;
93 std::string InputPluginLibrary;
94 std::string InputPluginName;
96 std::string OutputPluginLibrary;
97 std::string OutputPluginName;
99 std::shared_ptr<Reader> input_file;
100 bool input_is_stdin=(std::string(ai.inputs[0])==std::string(
"-"));
101 if (input_is_stdin) std::ios_base::sync_with_stdio(
false);
102 bool ignore_writer=
false;
103 switch (format_map.at(std::string(ai.input_format_arg)))
106 input_file=(input_is_stdin?
deduce_reader(std::cin):deduce_reader(ai.inputs[0]));
109 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]);
114 input_file=(input_is_stdin?std::make_shared<ReaderAsciiHepMC2>(std::cin):std::make_shared<ReaderAsciiHepMC2>(ai.inputs[0]));
117 input_file=(input_is_stdin?std::make_shared<ReaderAscii>(std::cin):std::make_shared<ReaderAscii>(ai.inputs[0]));
120 input_file=(input_is_stdin?std::make_shared<ReaderHEPEVT>(std::cin):std::make_shared<ReaderHEPEVT>(ai.inputs[0]));
123 input_file=(input_is_stdin?std::make_shared<ReaderLHEF>(std::cin):std::make_shared<ReaderLHEF>(ai.inputs[0]));
126 #ifdef HEPMCCONVERT_EXTENSION_GZ
127 input_file=std::make_shared<ReaderGZ>(ai.inputs[0]);
130 printf(
"Input format %s is not supported\n",ai.input_format_arg);
135 input_file=std::make_shared<ReaderRootTree>(ai.inputs[0]);
138 printf(
"Input format %s is not supported\n",ai.input_format_arg);
143 input_file=std::make_shared<ReaderRoot>(ai.inputs[0]);
146 printf(
"Input format %s is not supported\n",ai.input_format_arg);
150 if (options.find(
"InputPluginLibrary")==options.end()) { printf(
"InputPluginLibrary option required\n"); exit(2);}
else InputPluginLibrary=options.at(
"InputPluginLibrary");
151 if (options.find(
"InputPluginName")==options.end()) { printf(
"InputPluginName option required\n"); exit(2);}
else InputPluginName=options.at(
"InputPluginName");
152 input_file=std::make_shared<ReaderPlugin>(std::string(ai.inputs[0]),InputPluginLibrary,InputPluginName);
153 if (input_file->failed()) { printf(
"Plugin initialization failed\n"); exit(2);}
156 printf(
"Input format %s is not known\n",ai.input_format_arg);
160 std::shared_ptr<Writer> output_file;
161 switch (format_map.at(std::string(ai.output_format_arg)))
164 output_file=std::make_shared<WriterAsciiHepMC2>(ai.inputs[1]);
167 output_file=std::make_shared<WriterAscii>(ai.inputs[1]);
170 output_file=std::make_shared<WriterHEPEVT>(ai.inputs[1]);
174 output_file=std::make_shared<WriterRoot>(ai.inputs[1]);
177 printf(
"Output format %s is not supported\n",ai.output_format_arg);
182 output_file=std::make_shared<WriterRootTree>(ai.inputs[1]);
185 printf(
"Output format %s is not supported\n",ai.output_format_arg);
190 #ifdef HEPMCCONVERT_EXTENSION_ROOTTREEOPAL
191 output_file=std::make_shared<WriterRootTreeOPAL>(ai.inputs[1]);
193 if (options.find(
"Run")!=options.end()) (std::dynamic_pointer_cast<WriterRootTreeOPAL>(output_file))->set_run_number(std::atoi(options.at(
"Run").c_str()));
196 printf(
"Output format %s is not supported\n",ai.output_format_arg);
201 #ifdef HEPMCCONVERT_EXTENSION_HEPEVTZEUS
202 output_file=std::make_shared<WriterHEPEVTZEUS>(ai.inputs[1]);
205 printf(
"Output format %s is not supported\n",ai.output_format_arg);
209 #ifdef HEPMCCONVERT_EXTENSION_DOT
210 output_file=std::make_shared<WriterDOT>(ai.inputs[1]);
211 if (options.find(
"Style")!=options.end()) (std::dynamic_pointer_cast<WriterDOT>(output_file))->set_style(std::atoi(options.at(
"Style").c_str()));
214 printf(
"Output format %s is not supported\n",ai.output_format_arg);
219 if (options.find(
"OutputPluginLibrary")==options.end()) { printf(
"OutputPluginLibrary option required, e.g. OutputPluginLibrary=libAnalysis.so\n"); exit(2);}
else OutputPluginLibrary=options.at(
"OutputPluginLibrary");
220 if (options.find(
"OutputPluginName")==options.end()) { printf(
"OutputPluginName option required, e.g. OutputPluginName=newAnalysisExamplefile\n"); exit(2);}
else OutputPluginName=options.at(
"OutputPluginName");
221 output_file=std::make_shared<WriterPlugin>(std::string(ai.inputs[1]),OutputPluginLibrary,OutputPluginName);
222 if (output_file->failed()) { printf(
"Plugin initialization failed\n"); exit(2);}
232 printf(
"Output format %s is not known\n",ai.output_format_arg);
236 while( !input_file->failed() )
239 input_file->read_event(evt);
240 if( input_file->failed() ) {
241 printf(
"End of file reached. Exit.\n");
244 if (evt.event_number()<first_event_number)
continue;
245 if (evt.event_number()>last_event_number)
continue;
246 evt.set_run_info(input_file->run_info());
252 output_file->write_event(evt);
261 if( events_parsed%print_each_events_parsed == 0 ) printf(
"Events parsed: %li\n",events_parsed);
262 if( events_parsed >= events_limit ) {
263 printf(
"Event limit reached:->events_parsed(%li) >= events_limit(%li)<-. Exit.\n",events_parsed , events_limit);
268 if (input_file) input_file->close();
269 if (output_file) output_file->close();
270 cmdline_parser_free(&ai);
Definition of class WriterHEPEVT.
Definition of class ReaderHEPEVT.
Definition of interface Reader.
GenEvent I/O output to files similar to these produced by OPAL software.
Definition of class WriterRootTree.
Definition of class WriterAscii.
Definition of class ReaderRootTree.
Definition of class ReaderRoot.
std::shared_ptr< Reader > deduce_reader(std::istream &stream)
This function will deduce the type of input stream based on its content and will return appropriate R...
Definition of class ReaderAsciiHepMC2.
Stores event-related information.
Definition of class WriterPlugin.
Definition of class ReaderAscii.
Definition of class WriterAsciiHepMC2.
Definition of class WriterRoot.
Definition of class ReaderPlugin.
Definition of static class Print.
int main(int argc, char **argv)
Definition of class WriterRootTreeOPAL.
Definition of class WriterDOT.
Definition of class GenEvent.
Definition of class WriterHEPEVTZEUS.
Definition of class ReaderLHEF.
Definition of class ReaderGZ.
static void content(std::ostream &os, const GenEvent &event)
Print content of all GenEvent containers.