From 838d3e30e9be5b44b671b3116e0ad9d6a3ac99ec Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Mon, 25 Jan 2021 14:10:59 +0100 Subject: [PATCH] main.cpp: CLI revision --- lib/tdm_reaper.cpp | 11 +++ lib/tdm_reaper.hpp | 7 ++ src/main.cpp | 208 +++++++++++++++++++++++++++++++-------------- 3 files changed, 164 insertions(+), 62 deletions(-) diff --git a/lib/tdm_reaper.cpp b/lib/tdm_reaper.cpp index b7c9736..5a47788 100644 --- a/lib/tdm_reaper.cpp +++ b/lib/tdm_reaper.cpp @@ -502,10 +502,21 @@ std::string tdm_reaper::get_overview(format formatter) return summary; } +template std::string tdm_reaper::get_overview(format formatter); template std::string tdm_reaper::get_overview(format formatter); template std::string tdm_reaper::get_overview(format formatter); template std::string tdm_reaper::get_overview(format formatter); +void tdm_reaper::summarize_member(tdm_channelgroup chp, std::string& summary, format& formatter) +{ + for ( std::map::iterator it=this->tdmchannelgroups_.begin(); + it!=this->tdmchannelgroups_.end(); ++it) + { + summary += it->second.get_info(formatter); + summary += std::string("\n"); + } +} + void tdm_reaper::summarize_member(submatrix sbm, std::string& summary, format& formatter) { for ( std::map::iterator it=this->submatrices_.begin(); diff --git a/lib/tdm_reaper.hpp b/lib/tdm_reaper.hpp index 0764bfe..4df92d0 100644 --- a/lib/tdm_reaper.hpp +++ b/lib/tdm_reaper.hpp @@ -148,6 +148,12 @@ public: void process_submatrices(bool showlog); void process_localcolumns(bool showlog); + // get meta-data + tdm_meta get_meta() + { + return meta_data_; + } + // get root element tdm_root get_root() { @@ -161,6 +167,7 @@ public: template std::string get_overview(format formatter); private: + void summarize_member(tdm_channelgroup chp, std::string& summary, format& formatter); void summarize_member(submatrix sbm, std::string& summary, format& formatter); void summarize_member(localcolumn lcc, std::string& summary, format& formatter); void summarize_member(block blk, std::string& summary, format& formatter); diff --git a/src/main.cpp b/src/main.cpp index 7b24242..687868c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,19 +20,32 @@ void show_usage() <<"Decode TDM/TDX files and dump data as *.csv" <<"\n\n" <<"Usage:\n\n" - <<" tdmreaper [options] " + <<" tdmreaper [options]" <<"\n\n" <<"Options:" <<"\n\n" - <<" -d, --output (existing!) output directory (default: current working directory)\n" - <<" -f, --filenames filenaming rule using %C (channel index), %c (channel name),\n" - <<" %G (group index), %g (group name) \n" - <<" (default: --filenames=channel_%G_%C.csv )\n" - <<" -s, --csvsep separator character used in .csv files (default is comma ',')\n" - <<" -g, --listgroups list groups in data\n" - <<" -c, --listchannels list channels in data\n" - <<" -h, --help show this help message \n" - <<" -v, --version display version\n" + <<" -m, --showmeta show meta information about tdm dataset\n" + <<" -r, --showroot show root data of dataset\n" + <<" -g, --listgroups list channelgroups\n" + <<" -c, --listchannels list channels\n" + <<" -b, --listblocks list TDX blocks\n" + <<" -u, --listsubmatrices list submatrices\n" + <<" -l, --listlocalcolumns list localcolumns\n" + // <<"options with arguments must be provided as '--option arg' or '-o arg'\n" + <<" -d, --output (existing) output directory (default: no default)\n" + <<" -f, --filenames If an output directory is provided, all channels\n" + <<" of the dataset will be written to file(s).\n" + <<" The filenaming rule using %C (channel index), %c (channel name),\n" + <<" %G (group index), %g (group name) \n" + <<" determines whether the channels are collected in files according\n" + <<" to their channelgroups (as long as the filenaming rule includes\n" + <<" %G or %g) or written in separate files. For instance, to obtain\n" + <<" files with only one channel each use '--f channel_%C_%c.csv'.\n" + <<" (default: '--filenames channelgroup_%G_%g.csv' )\n" + <<" -s, --csvsep separator character used in .csv files (default is comma '--csvsep ,')\n" + <<" -i, --includemeta include channel(-group) meta-data into files\n" + <<" -h, --help show this help message \n" + <<" -v, --version display version\n" <<"\n"; } @@ -41,7 +54,7 @@ void show_usage() // define type of key-value map object typedef std::map optkeys; -const std::string argmsg = std::string("both .tdm and .tdx file (and maybe any valid option) must be provided!"); +const std::string argmsg = std::string("both .tdm and .tdx file must be provided!"); const std::string arguse = std::string("see $ tdmreaper --help for usage"); optkeys parse_args(int argc, char* argv[], bool showargs = false) @@ -74,70 +87,101 @@ optkeys parse_args(int argc, char* argv[], bool showargs = false) return prsdkeys; } } - else if ( argc > 2 ) // && argc%2 == 1 ) + else if ( argc > 2 ) { // tdm file - if ( std::string(argv[argc-2]).find(std::string(".tdm")) != std::string::npos ) + if ( std::string(argv[1]).find(std::string(".tdm")) != std::string::npos ) { - prsdkeys.insert(std::pair("tdm",argv[argc-2])); + prsdkeys.insert(std::pair("tdm",argv[1])); } else { - std::string tdmerr = std::string(argv[argc-2]) + std::string tdmerr = std::string(argv[1]) + std::string(" does not look like a .tdm file") + std::string(", evtl. add file extension *.tdm") + std::string("\n") + arguse; std::cerr<("invalidoption",argv[argc-2])); + prsdkeys.insert(std::pair("invalidoption",argv[1])); return prsdkeys; } // tdx file - if ( std::string(argv[argc-1]).find(std::string(".tdx")) != std::string::npos ) + if ( std::string(argv[2]).find(std::string(".tdx")) != std::string::npos ) { - prsdkeys.insert(std::pair("tdx",argv[argc-1])); + prsdkeys.insert(std::pair("tdx",argv[2])); } else { - std::string tdxerr = std::string(argv[argc-1]) + std::string tdxerr = std::string(argv[2]) + std::string(" does not look like a .tdx file") + std::string(", evtl. add file extension *.tdx") + std::string("\n") + arguse; std::cerr<("invalidoption",argv[argc-1])); + prsdkeys.insert(std::pair("invalidoption",argv[2])); return prsdkeys; } // options (in any order) - // for ( int i = 1; i < argc-2; i+=2 ) - for ( int i = 1; i < argc-2; i++ ) + for ( int i = 3; i < argc; i++ ) { - if ( std::string(argv[i]) == std::string("--output") - || std::string(argv[i]) == std::string("-d") ) + if ( std::string(argv[i]) == std::string("--showmeta") + || std::string(argv[i]) == std::string("-m") ) + { + prsdkeys.insert(std::pair("showmeta","showmeta")); + } + else if ( std::string(argv[i]) == std::string("--showroot") + || std::string(argv[i]) == std::string("-r") ) + { + prsdkeys.insert(std::pair("showroot","showroot")); + } + else if ( std::string(argv[i]) == std::string("--listgroups") + || std::string(argv[i]) == std::string("-g") ) + { + prsdkeys.insert(std::pair("listgroups","listgroups")); + } + else if ( std::string(argv[i]) == std::string("--listchannels") + || std::string(argv[i]) == std::string("-c") ) + { + prsdkeys.insert(std::pair("listchannels","listchannels")); + } + else if ( std::string(argv[i]) == std::string("--listblocks") + || std::string(argv[i]) == std::string("-b") ) + { + prsdkeys.insert(std::pair("listblocks","listblocks")); + } + else if ( std::string(argv[i]) == std::string("--listsubmatrices") + || std::string(argv[i]) == std::string("-u") ) + { + prsdkeys.insert(std::pair("listsubmatrices","listsubmatrices")); + } + else if ( std::string(argv[i]) == std::string("--listlocalcolumns") + || std::string(argv[i]) == std::string("-l") ) + { + prsdkeys.insert(std::pair("listlocalcolumns","listlocalcolumns")); + } + // + else if ( std::string(argv[i]) == std::string("--output") + || std::string(argv[i]) == std::string("-d") ) { prsdkeys.insert(std::pair("output",argv[i+1])); i += 1; } - else if ( std::string(argv[i]) == std::string("--csvsep") - || std::string(argv[i]) == std::string("-s") ) - { - prsdkeys.insert(std::pair("csvsep",argv[i+1])); - i += 1; - } else if ( std::string(argv[i]) == std::string("--filenames") || std::string(argv[i]) == std::string("-f") ) { prsdkeys.insert(std::pair("filenames",argv[i+1])); i += 1; } - else if ( std::string(argv[i]) == std::string("--listgroups") - || std::string(argv[i]) == std::string("-g") ) + else if ( std::string(argv[i]) == std::string("--csvsep") + || std::string(argv[i]) == std::string("-s") ) { - prsdkeys.insert(std::pair("listgroups",argv[i+1])); + prsdkeys.insert(std::pair("csvsep",argv[i+1])); + i += 1; } - else if ( std::string(argv[i]) == std::string("--listchannels") - || std::string(argv[i]) == std::string("-c") ) + // + else if ( std::string(argv[i]) == std::string("--includemeta") + || std::string(argv[i]) == std::string("-i") ) { - prsdkeys.insert(std::pair("listchannels",argv[i+1])); + prsdkeys.insert(std::pair("includemeta",argv[i+1])); } else { @@ -163,58 +207,98 @@ int main(int argc, char* argv[]) // parse CLI arguments optkeys cfgopts = parse_args(argc,argv); + // show all CLI arguments + if ( false) + { + for ( optkeys::iterator it=cfgopts.begin(); it!=cfgopts.end(); ++it ) + { + std::cout<first<second<<"\n"; + } + } + + // exit on any invalid option if ( cfgopts.count("tdm") == 1 && cfgopts.count("tdx") == 1 && cfgopts.count("invalidoption") == 0 ) { + // get options + bool showmeta = cfgopts.count("showmeta") == 1 ? true : false; + bool showroot = cfgopts.count("showroot") == 1 ? true : false; + bool listgroups = cfgopts.count("listgroups") == 1 ? true : false; + bool listchannels = cfgopts.count("listchannels") == 1 ? true : false; + bool listblocks = cfgopts.count("listblocks") == 1 ? true : false; + bool listsubmatrices = cfgopts.count("listsubmatrices") == 1 ? true : false; + bool listlocalcolumns = cfgopts.count("listlocalcolumns") == 1 ? true : false; + // bool includemeta = cfgopts.count("includemeta") == 1 ? true : false; + // set required option values std::string output = cfgopts.count("output") == 1 ? cfgopts.at("output") - : std::string("./"); - std::string csvsep = cfgopts.count("csvsep") == 1 ? cfgopts.at("csvsep") - : std::string(","); + : std::string(""); std::string files = cfgopts.count("filenames") == 1 ? cfgopts.at("filenames") : std::string("channel_%G_%C.csv"); - // bool listgroups = cfgopts.count("listgroups") == 1 ? true : false; - // bool listchannels = cfgopts.count("listchannels") == 1 ? true : false; + std::string csvsep = cfgopts.count("csvsep") == 1 ? cfgopts.at("csvsep") + : std::string(","); // declare and initialize tdm_reaper instance tdm_reaper jack; try { - jack.submit_files(cfgopts.at("tdm"),cfgopts.at("tdx"),true); + jack.submit_files(cfgopts.at("tdm"),cfgopts.at("tdx"),false); } catch (const std::exception& e) { throw std::runtime_error( std::string("failed to load/parse tdm/tdx files: ") + e.what() ); } - // check available datatypes on machine - // jack.check_local_datatypes(); - // show some meta data of the dataset - std::cout<<"\n"<(grpformatter)<<"\n"; format chformatter(14,false,false,' '); - std::cout<(formatter)<<"\n"; - std::cout<(formatter)<<"\n"; - std::cout<(formatter)<<"\n"; + if (listblocks) std::cout<(formatter)<<"\n"; + if (listsubmatrices) std::cout<(formatter)<<"\n"; + if (listlocalcolumns) std::cout<(formatter)<<"\n"; - std::vector chgrids = jack.get_channelgroup_ids(); - for ( auto id: chgrids ) + // print data to files + if ( !output.empty() ) { - std::string filenam = std::string("channelgroup_") + id + std::string(".dat"); - jack.print_group(id,filenam.c_str(),true); + // declare filesystem path + std::filesystem::path pd = output; + + // check for given directory + if ( std::filesystem::is_directory(pd) ) + { + + } + else + { + std::cerr< chids = jack.get_channel_ids(); - for ( auto id: chids ) - { - std::string filenam = std::string("channel_") + id + std::string(".dat"); - // std::vector chdata = jack.get_channel(id); - jack.print_channel(id,filenam.c_str(),true); - } + // std::vector chgrids = jack.get_channelgroup_ids(); + // for ( auto id: chgrids ) + // { + // std::string filenam = std::string("channelgroup_") + id + std::string(".dat"); + // jack.print_group(id,filenam.c_str(),true); + // } + // + // std::vector chids = jack.get_channel_ids(); + // for ( auto id: chids ) + // { + // std::string filenam = std::string("channel_") + id + std::string(".dat"); + // // std::vector chdata = jack.get_channel(id); + // jack.print_channel(id,filenam.c_str(),true); + // } // print list of groups or channels to stdout // if ( listgroups ) jack.list_groups();