main.cpp: CLI revision
This commit is contained in:
parent
7b8c27b6af
commit
838d3e30e9
@ -502,10 +502,21 @@ std::string tdm_reaper::get_overview(format formatter)
|
||||
return summary;
|
||||
}
|
||||
|
||||
template std::string tdm_reaper::get_overview<tdm_channelgroup>(format formatter);
|
||||
template std::string tdm_reaper::get_overview<submatrix>(format formatter);
|
||||
template std::string tdm_reaper::get_overview<localcolumn>(format formatter);
|
||||
template std::string tdm_reaper::get_overview<block>(format formatter);
|
||||
|
||||
void tdm_reaper::summarize_member(tdm_channelgroup chp, std::string& summary, format& formatter)
|
||||
{
|
||||
for ( std::map<std::string,tdm_channelgroup>::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<std::string,submatrix>::iterator it=this->submatrices_.begin();
|
||||
|
@ -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<typename tdmelement>
|
||||
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);
|
||||
|
208
src/main.cpp
208
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] <tdm-file> <tdx-file>"
|
||||
<<" tdmreaper <tdm-file> <tdx-file> [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<std::string,std::string> 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<std::string,std::string>("tdm",argv[argc-2]));
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("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<<tdmerr + std::string("\n");
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("invalidoption",argv[argc-2]));
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("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<std::string,std::string>("tdx",argv[argc-1]));
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("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<<tdxerr + std::string("\n");
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("invalidoption",argv[argc-1]));
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("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<std::string,std::string>("showmeta","showmeta"));
|
||||
}
|
||||
else if ( std::string(argv[i]) == std::string("--showroot")
|
||||
|| std::string(argv[i]) == std::string("-r") )
|
||||
{
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("showroot","showroot"));
|
||||
}
|
||||
else if ( std::string(argv[i]) == std::string("--listgroups")
|
||||
|| std::string(argv[i]) == std::string("-g") )
|
||||
{
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("listgroups","listgroups"));
|
||||
}
|
||||
else if ( std::string(argv[i]) == std::string("--listchannels")
|
||||
|| std::string(argv[i]) == std::string("-c") )
|
||||
{
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("listchannels","listchannels"));
|
||||
}
|
||||
else if ( std::string(argv[i]) == std::string("--listblocks")
|
||||
|| std::string(argv[i]) == std::string("-b") )
|
||||
{
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("listblocks","listblocks"));
|
||||
}
|
||||
else if ( std::string(argv[i]) == std::string("--listsubmatrices")
|
||||
|| std::string(argv[i]) == std::string("-u") )
|
||||
{
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("listsubmatrices","listsubmatrices"));
|
||||
}
|
||||
else if ( std::string(argv[i]) == std::string("--listlocalcolumns")
|
||||
|| std::string(argv[i]) == std::string("-l") )
|
||||
{
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("listlocalcolumns","listlocalcolumns"));
|
||||
}
|
||||
//
|
||||
else if ( std::string(argv[i]) == std::string("--output")
|
||||
|| std::string(argv[i]) == std::string("-d") )
|
||||
{
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("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<std::string,std::string>("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<std::string,std::string>("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<std::string,std::string>("listgroups",argv[i+1]));
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("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<std::string,std::string>("listchannels",argv[i+1]));
|
||||
prsdkeys.insert(std::pair<std::string,std::string>("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<<std::setw(20)<<std::left<<it->first<<it->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"<<jack.get_root().get_info()<<"\n\n";
|
||||
if ( showmeta ) std::cout<<"\n"<<jack.get_meta().get_info()<<"\n";
|
||||
if ( showroot ) std::cout<<"\n"<<jack.get_root().get_info()<<"\n";
|
||||
|
||||
// get complete channel overview
|
||||
// get complete channel(-group) overview
|
||||
format grpformatter(26,false,false,' ');
|
||||
if (listgroups) std::cout<<"\n"<<jack.get_overview<tdm_channelgroup>(grpformatter)<<"\n";
|
||||
format chformatter(14,false,false,' ');
|
||||
std::cout<<jack.get_channel_overview(chformatter)<<"\n";
|
||||
if (listchannels) std::cout<<"\n"<<jack.get_channel_overview(chformatter)<<"\n";
|
||||
|
||||
// get complete submatrix/localcolumns overview
|
||||
format formatter(18,false,false,' ');
|
||||
std::cout<<jack.get_overview<submatrix>(formatter)<<"\n";
|
||||
std::cout<<jack.get_overview<localcolumn>(formatter)<<"\n";
|
||||
std::cout<<jack.get_overview<block>(formatter)<<"\n";
|
||||
if (listblocks) std::cout<<jack.get_overview<block>(formatter)<<"\n";
|
||||
if (listsubmatrices) std::cout<<jack.get_overview<submatrix>(formatter)<<"\n";
|
||||
if (listlocalcolumns) std::cout<<jack.get_overview<localcolumn>(formatter)<<"\n";
|
||||
|
||||
std::vector<std::string> 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<<std::string("directory '") + output
|
||||
+ std::string("' does not exist") + std::string("\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( cfgopts.size() == 2 ) std::cerr<<"no output directory given\n";
|
||||
}
|
||||
|
||||
std::vector<std::string> chids = jack.get_channel_ids();
|
||||
for ( auto id: chids )
|
||||
{
|
||||
std::string filenam = std::string("channel_") + id + std::string(".dat");
|
||||
// std::vector<tdmdatatype> chdata = jack.get_channel(id);
|
||||
jack.print_channel(id,filenam.c_str(),true);
|
||||
}
|
||||
// std::vector<std::string> 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<std::string> chids = jack.get_channel_ids();
|
||||
// for ( auto id: chids )
|
||||
// {
|
||||
// std::string filenam = std::string("channel_") + id + std::string(".dat");
|
||||
// // std::vector<tdmdatatype> 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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user