diff --git a/src/app/ProcessNTuples.C b/src/app/ProcessNTuples.C index 23bf619bb..b439d6d9d 100644 --- a/src/app/ProcessNTuples.C +++ b/src/app/ProcessNTuples.C @@ -31,18 +31,23 @@ #include "XSecAnalyzer/Selections/SelectionBase.hh" #include "XSecAnalyzer/Selections/SelectionFactory.hh" -void analyze( const std::vector< std::string >& in_file_names, - const std::vector< std::string >& selection_names, - const std::string& output_filename ) +struct Arguments { + std::vector input_files; + std::string output_file; + std::vector selection_names; + int nevents = -1; +}; + +void analyze( const Arguments & arguments ) { std::cout << "\nRunning ProcessNTuples with options:\n"; - std::cout << "\toutput_filename: " << output_filename << '\n'; + std::cout << "\toutput_filename: " << arguments.output_file << '\n'; std::cout << "\tinput_file_names:\n"; - for ( size_t i = 0u; i < in_file_names.size(); ++i ) { - std::cout << "\t\t- " << in_file_names[i] << '\n'; + for (const auto & name : arguments.input_files) { + std::cout << "\t\t- " << name << '\n'; } std::cout << "\n\nselection names:\n"; - for ( const auto& sel_name : selection_names ) { + for ( const auto& sel_name : arguments.selection_names ) { std::cout << "\t\t- " << sel_name << '\n'; } @@ -51,14 +56,14 @@ void analyze( const std::vector< std::string >& in_file_names, TChain events_ch( "nuselection/NeutrinoSelectionFilter" ); TChain subruns_ch( "nuselection/SubRun" ); - for ( const auto& f_name : in_file_names ) { + for ( const auto& f_name : arguments.input_files ) { events_ch.Add( f_name.c_str() ); subruns_ch.Add( f_name.c_str() ); } // OUTPUT TTREE // Make an output TTree for plotting (one entry per event) - TFile* out_file = new TFile( output_filename.c_str(), "recreate" ); + TFile* out_file = new TFile( arguments.output_file.c_str(), "recreate" ); out_file->cd(); TTree* out_tree = new TTree( "stv_tree", "STV analysis tree" ); @@ -84,7 +89,7 @@ void analyze( const std::vector< std::string >& in_file_names, std::vector< std::unique_ptr > selections; SelectionFactory sf; - for ( const auto& sel_name : selection_names ) { + for ( const auto& sel_name : arguments.selection_names ) { selections.emplace_back().reset( sf.CreateSelection(sel_name) ); } @@ -102,7 +107,9 @@ void analyze( const std::vector< std::string >& in_file_names, while ( true ) { - //if ( events_entry > 1000) break; + //If not doing all events (-1), break after nevents + if ( (arguments.nevents != -1) && (events_entry > arguments.nevents) ) + break; if ( events_entry % 1000 == 0 ) { std::cout << "Processing event #" << events_entry << '\n'; @@ -152,7 +159,7 @@ void analyze( const std::vector< std::string >& in_file_names, for ( auto& sel : selections ) { sel->summary(); } - std::cout << "Wrote output to:" << output_filename << std::endl; + std::cout << "Wrote output to:" << arguments.output_file << std::endl; for ( auto& sel : selections ) { sel->final_tasks(); @@ -163,34 +170,54 @@ void analyze( const std::vector< std::string >& in_file_names, delete out_file; } -void analyzer( const std::string& in_file_name, - const std::vector< std::string > selection_names, - const std::string& output_filename) +void analyzer( const Arguments & arguments ) { - std::vector< std::string > in_files = { in_file_name }; - analyze( in_files, selection_names, output_filename ); + analyze( arguments ); } -int main( int argc, char* argv[] ) { - - if ( argc != 4 ) { - std::cout << "Usage: " << argv[0] - << " INPUT_PELEE_NTUPLE_FILE SELECTION_NAMES OUTPUT_FILE\n"; - return 1; +bool parse_args( int argc, char* argv[], Arguments & arg_results ) { + for (int iArg = 1; iArg < argc; iArg++) { + if (!strcasecmp(argv[iArg],"-o")) { + arg_results.output_file = argv[++iArg]; + } + if (!strcasecmp(argv[iArg],"-i")) { + arg_results.input_files.push_back(argv[++iArg]); + } + if (!strcasecmp(argv[iArg],"-s")) { + std::stringstream sel_ss(argv[++iArg]); + std::string sel_name; + while ( std::getline(sel_ss, sel_name, ',') ) { + arg_results.selection_names.push_back( sel_name ); + } + } + if (!strcasecmp(argv[iArg],"-n")) { + arg_results.nevents = std::atoi(argv[++iArg]); + if (arg_results.nevents < -1) { + std::cerr << "Error: Must provide -1 for all events or positive number" << + std::endl; + return false; + } + } + if (!strcasecmp(argv[iArg],"-h")) { + std::cout << argv[0] << + "-i -o " << + "-s " << + "-n " << + std::endl; + return false; + } } + return true; +} - std::string input_file_name( argv[1] ); - std::string output_file_name( argv[3] ); - - std::vector< std::string > selection_names; +int main( int argc, char* argv[] ) { - std::stringstream sel_ss( argv[2] ); - std::string sel_name; - while ( std::getline(sel_ss, sel_name, ',') ) { - selection_names.push_back( sel_name ); + Arguments arguments; + if (!parse_args(argc, argv, arguments)) { + return 1; } - analyzer( input_file_name, selection_names, output_file_name ); + analyzer( arguments ); return 0; }