/* Description: 全局参数,所有模块都可能用到的参数 Copyright : All right reserved by NCIC.ICT Author : Zhang Zhonghai Date : 2023/10/23 */ #include "global_arg.h" #include #include #include #include using std::vector; /* * GlobalArg 类 */ struct option *GlobalArg::GLOBAL_OPT = nullptr; // 初始化参数 void GlobalArg::initGlobalOptions() { vector 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 Number of threads to allocate to this analysis [1]\n"); vArgInfo.push_back("--max_mem Set maximum memory; suffix K/M/G recognized [2G]\n"); vArgInfo.push_back("--verbosity 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; } }