picard_cpp/src/common/utils/global_arg.cpp

124 lines
4.3 KiB
C++

/*
Description: 全局参数,所有模块都可能用到的参数
Copyright : All right reserved by NCIC.ICT
Author : Zhang Zhonghai
Date : 2023/10/23
*/
#include "global_arg.h"
#include "util.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)
if (true)
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;
}
}
string GlobalArg::GetArgValueString() {
printf("--INPUT = %s\n", in_fn.c_str());
printf("--OUTPUT = %s\n", out_fn.c_str());
printf("--num_threads = %d\n", num_threads);
printf("--max_mem = %ld\n", max_mem);
printf("--verbosity = %d\n", verbosity);
printf("--asyncio = %d\n", use_asyncio);
vector<string> argVals;
argVals.push_back("--INPUT"); argVals.push_back(in_fn);
argVals.push_back("--OUTPUT"); argVals.push_back(out_fn);
argVals.push_back("--num_threads"); argVals.push_back(StringUtil::Format(num_threads));
argVals.push_back("--asyncio"); argVals.push_back(use_asyncio ? "true" : "false");
string argValStr;
StringUtil::Join(argVals, argValStr, ' ');
cout << argValStr << endl;
return argValStr;
}