picard_cpp/src/common/global_arg.cpp

109 lines
3.7 KiB
C++
Raw Normal View History

/*
Description:
Copyright : All right reserved by NCIC.ICT
Author : Zhang Zhonghai
Date : 2023/10/23
*/
#include "global_arg.h"
#include <cstring>
#include <vector>
#include <getopt.h>
#include <iostream>
using std::vector;
/*
* GlobalArg
*/
struct option *GlobalArg::GLOBAL_OPT = nullptr;
// 初始化参数
void GlobalArg::initGlobalOptions()
{
vector<struct option> v;
v.push_back({"INPUT", required_argument, NULL, ns_ga::GlobalOptEnum::OPT_INPUT}); // 输入文件
v.push_back({"OUTPUT", required_argument, NULL, ns_ga::GlobalOptEnum::OPT_OUTPUT}); // 输出文件
v.push_back({"num_threads", required_argument, NULL, ns_ga::GlobalOptEnum::OPT_NUM_THREADS});
v.push_back({"max_mem", required_argument, NULL, ns_ga::GlobalOptEnum::OPT_MAX_MEM});
v.push_back({"verbosity", required_argument, NULL, ns_ga::GlobalOptEnum::OPT_LOG_LEVEL});
v.push_back({"asyncio", required_argument, NULL, ns_ga::GlobalOptEnum::OPT_ASYNCIO});
v.push_back({"version", no_argument, NULL, ns_ga::GlobalOptEnum::OPT_VERSION});
v.push_back({"help", no_argument, NULL, ns_ga::GlobalOptEnum::OPT_HELP});
v.push_back({0, 0, 0, 0});
GLOBAL_OPT = new struct option[GLOBAL_ARG_CNT];
memcpy(GLOBAL_OPT, v.data(), v.size() * sizeof(struct option));
/* 添加帮助信息, 按arg enum顺序进行添加信息 */
vArgInfo.push_back("--INPUT Input file path (bam, vcf ...)\n");
vArgInfo.push_back("--OUTPUT Output file path \n");
vArgInfo.push_back("--num_threads <num_threads> Number of threads to allocate to this analysis [1]\n");
vArgInfo.push_back("--max_mem <max_mem> Set maximum memory; suffix K/M/G recognized [2G]\n");
vArgInfo.push_back("--verbosity <log level> Control verbosity of logging. error/warning/info/debug [info]\n");
vArgInfo.push_back("--asyncio Use async io [true]\n");
vArgInfo.push_back("--version Output version information\n");
vArgInfo.push_back("--help Generate the help message\n");
}
// 解析参数
void GlobalArg::parseArgument(int argNum)
{
using namespace ns_ga;
switch (argNum)
{
case OPT_INPUT:
in_fn = optarg;
break;
case OPT_OUTPUT:
out_fn = optarg;
break;
case OPT_NUM_THREADS:
num_threads = std::stoi(optarg);
break;
case OPT_MAX_MEM:
{
char *q;
size_t mem_arg = strtol(optarg, &q, 0);
if (*q == 'k' || *q == 'K')
mem_arg <<= 10;
else if (*q == 'm' || *q == 'M')
mem_arg <<= 20;
else if (*q == 'g' || *q == 'G')
mem_arg <<= 30;
if (mem_arg >= max_mem)
max_mem = mem_arg;
else
{
std::cerr << "[Warn] Too small mem size, use default" << std::endl;
}
break;
}
case OPT_LOG_LEVEL:
{
if (strcmp("ERROR", optarg) == 0)
verbosity = ns_ga::ERROR;
else if (strcmp("WARNING", optarg) == 0)
verbosity = ns_ga::WARNING;
else if (strcmp("INFO", optarg) == 0)
verbosity = ns_ga::INFO;
else if (strcmp("DEBUG", optarg) == 0)
verbosity = ns_ga::DEBUG;
break;
}
case OPT_ASYNCIO:
{
if (strcmp("true", optarg) == 0)
use_asyncio = true;
else if (strcmp("false", optarg) == 0)
use_asyncio = false;
break;
}
default:
break;
}
}