334 char copt = char(opt & 0xFF);
338 all_typed_sites_ =
true;
341 temp_buffer_ = std::size_t(std::atoll(optarg ? optarg :
""));
344 chunk_size_ = std::atoll(optarg ? optarg :
"");
347 emp_out_path_ = optarg ? optarg :
"";
354 fmt_fields_ = split_string_to_vector(optarg ? optarg :
"",
',');
355 std::unordered_set<std::string> allowed = {
"GT",
"GP",
"DS",
"HDS",
"SD"};
356 for (
auto it = fmt_fields_.begin(); it != fmt_fields_.end(); ++it)
358 if (allowed.find(*it) == allowed.end())
359 return std::cerr <<
"Error: Invalid --format option (" << *it <<
")\n",
false;
364 map_path_ = optarg ? optarg :
"";
367 out_path_ = optarg ? optarg :
"";
371 using fmt = savvy::file::format;
372 std::string ot = optarg ? optarg :
"";
375 out_format_ = fmt::vcf;
376 out_compression_ = 0;
378 else if (ot ==
"vcf.gz")
380 out_format_ = fmt::vcf;
382 else if (ot ==
"bcf")
384 out_format_ = fmt::bcf;
386 else if (ot ==
"ubcf")
388 out_format_ = fmt::bcf;
389 out_compression_ = 0;
391 else if (ot ==
"sav")
393 out_format_ = fmt::sav;
395 else if (ot ==
"usav")
397 out_format_ = fmt::sav;
398 out_compression_ = 0;
402 std::cerr <<
"Invalid --output-format: " << ot << std::endl;
411 reg_ = string_to_region(optarg ? optarg :
"");
414 sites_out_path_ = optarg ? optarg :
"";
417 threads_ = atoi(optarg ? optarg :
"");
423 overlap_ = std::atoll(optarg ? optarg :
"");
426 if (std::string(
long_options_[long_index].name) ==
"update-m3vcf")
428 update_m3vcf_ =
true;
431 else if (std::string(
long_options_[long_index].name) ==
"compress-reference")
433 compress_reference_ =
true;
436 else if (std::string(
long_options_[long_index].name) ==
"allTypedSites")
438 std::cerr <<
"Warning: --allTypedSites is deprecated in favor of --all-typed-sites\n";
439 all_typed_sites_ =
true;
442 else if (std::string(
long_options_[long_index].name) ==
"rsid")
444 std::cerr <<
"Warning: --rsid is deprecated (on by default)\n";
447 else if (std::string(
long_options_[long_index].name) ==
"passOnly")
449 std::cerr <<
"Warning: --passOnly is deprecated in favor of --pass-only\n";
453 else if (std::string(
long_options_[long_index].name) ==
"meta")
455 std::cerr <<
"Warning: --meta is deprecated in favor of --empirical-output\n";
459 else if (std::string(
long_options_[long_index].name) ==
"noPhoneHome")
461 std::cerr <<
"Warning: --noPhoneHome is deprecated and ignored\n";
464 else if (std::string(
long_options_[long_index].name) ==
"referenceEstimates")
466 std::cerr <<
"Warning: --referenceEstimates is deprecated and ignored\n";
472 std::string long_opt_str = std::string(
long_options_[long_index].name);
473 if (long_opt_str ==
"decay")
475 decay_ = std::atof(optarg ? optarg :
"");
478 else if (long_opt_str ==
"min-r2")
480 min_r2_ = std::atof(optarg ? optarg :
"");
483 else if (long_opt_str ==
"min-ratio")
485 min_ratio_ = std::min(1., std::max(0., std::atof(optarg ? optarg :
"")));
488 else if (long_opt_str ==
"min-ratio-behavior")
490 fail_min_ratio_ = std::string(optarg ? optarg :
"") ==
"fail";
493 else if (long_opt_str ==
"match-error")
495 error_param_ = std::min(0.5, std::max(0., std::atof(optarg ? optarg :
"")));
498 else if (long_opt_str ==
"min-recom")
500 min_recom_ = std::min(0.5, std::max(0., std::atof(optarg ? optarg :
"")));
503 else if (long_opt_str ==
"prob-threshold")
505 prob_threshold_ = std::min(1., std::max(0., std::atof(optarg ? optarg :
"")));
508 else if (long_opt_str ==
"prob-threshold-s1")
510 prob_threshold_s1_ = std::min(1., std::atof(optarg ? optarg :
""));
513 else if (long_opt_str ==
"temp-prefix")
515 temp_prefix_ = optarg ? optarg :
"";
518 else if (long_opt_str ==
"diff-threshold")
520 diff_threshold_ = std::max(0., std::atof(optarg ? optarg :
""));
523 else if (long_opt_str ==
"sample-ids")
525 auto tmp_ids = split_string_to_vector(optarg ? optarg :
"",
',');
526 sample_ids_.insert(tmp_ids.begin(), tmp_ids.end());
529 else if (long_opt_str ==
"sample-ids-file")
531 std::ifstream ifs(optarg ? optarg :
"");
532 sample_ids_.insert(std::istream_iterator<std::string>(ifs), std::istream_iterator<std::string>());
535 else if (long_opt_str ==
"min-block-size")
537 min_ratio_ = std::max(1ll, std::atoll(optarg ? optarg :
""));
540 else if (long_opt_str ==
"max-block-size")
542 min_ratio_ = std::max(1ll, std::atoll(optarg ? optarg :
""));
545 else if (long_opt_str ==
"slope-unit")
547 min_ratio_ = std::max(1ll, std::atoll(optarg ? optarg :
""));
550 else if (long_opt_str ==
"haps")
552 std::cerr <<
"Warning: --haps is deprecated\n";
553 tar_path_ = optarg ? optarg :
"";
556 else if (long_opt_str ==
"refHaps")
558 std::cerr <<
"Warning: --refHaps is deprecated\n";
559 ref_path_ = optarg ? optarg :
"";
562 else if (long_opt_str ==
"chr")
564 std::cerr <<
"Warning: --chr is deprecated in favor of --region\n";
565 reg_ = savvy::genomic_region(optarg ? optarg :
"", reg_.from(), reg_.to());
568 else if (long_opt_str ==
"start")
570 std::cerr <<
"Warning: --start is deprecated in favor of --region\n";
571 reg_ = savvy::genomic_region(reg_.chromosome(), std::atoll(optarg ? optarg :
""), reg_.to());
574 else if (long_opt_str ==
"end")
576 std::cerr <<
"Warning: --end is deprecated in favor of --region\n";
577 reg_ = savvy::genomic_region(reg_.chromosome(), reg_.from(), std::atoll(optarg ? optarg :
""));
580 else if (long_opt_str ==
"prefix")
582 std::cerr <<
"Warning: --prefix is deprecated in favor of --output, --empirical-output, and --sites\n";
583 prefix_ = optarg ? optarg :
"";
584 out_format_ = savvy::file::format::vcf;
585 out_compression_ = 6;
588 else if (long_opt_str ==
"mapFile")
590 std::cerr <<
"Warning: --mapFile is deprecated in favor of --map\n";
591 map_path_ = optarg ? optarg :
"";
594 else if (long_opt_str ==
"window")
596 std::cerr <<
"Warning: --window is deprecated in favor of --overlap\n";
597 overlap_ = std::atoll(optarg ? optarg :
"");
600 else if (long_opt_str ==
"ChunkLengthMb")
602 std::cerr <<
"Warning: --ChunkLengthMb is deprecated in favor of --chunk\n";
603 chunk_size_ = std::atoll(optarg ? optarg :
"") * 1000000;
606 else if (long_opt_str ==
"ChunkOverlapMb")
608 std::cerr <<
"Warning: --ChunkOverlapMb is deprecated in favor of --overlap\n";
609 overlap_ = std::atoll(optarg ? optarg :
"") * 1000000;
612 else if (long_opt_str ==
"cpus")
614 std::cerr <<
"Warning: --cpus is deprecated in favor of --threads\n";
615 threads_ = atoi(optarg ? optarg :
"");
618 else if (long_opt_str ==
"minRatio")
620 std::cerr <<
"Warning: --minRatio is deprecated in favor of --min-ratio\n";
621 min_ratio_ = std::atof(optarg ? optarg :
"");
631 int remaining_arg_count = argc - optind;
633 if (remaining_arg_count == 2)
635 ref_path_ = argv[optind];
636 tar_path_ = argv[optind + 1];
638 else if ((update_m3vcf_ || compress_reference_) && remaining_arg_count == 1)
640 ref_path_ = argv[optind];
642 else if (remaining_arg_count < 2)
644 if (ref_path_.empty() || tar_path_.empty())
646 std::cerr <<
"Too few arguments\n";
652 std::cerr <<
"Too many arguments\n";
656 if (!prefix_.empty())
658 std::string suffix =
"sav";
659 if (out_format_ == savvy::file::format::bcf)
661 else if (out_format_ == savvy::file::format::vcf)
664 if (out_compression_)
668 out_path_ = prefix_ +
".dose." + suffix;
669 sites_out_path_ = prefix_ +
".sites." + suffix;
671 emp_out_path_ = prefix_ +
".empiricalDose." + suffix;
674 if (temp_prefix_.empty())
676 char* tmpdir = std::getenv(
"TMPDIR");
677 if (tmpdir && strlen(tmpdir))
679 std::string p(tmpdir);
682 temp_prefix_ = p +
"m4_";
686 temp_prefix_ =
"/tmp/m4_";
690 if (!emp_out_path_.empty() && std::find(fmt_fields_.begin(), fmt_fields_.end(),
"HDS") == fmt_fields_.end())
691 fmt_fields_.emplace_back(
"HDS");