|
1 | 1 | /* vcfmerge.c -- Merge multiple VCF/BCF files to create one multi-sample file. |
2 | 2 |
|
3 | | - Copyright (C) 2012-2023 Genome Research Ltd. |
| 3 | + Copyright (C) 2012-2024 Genome Research Ltd. |
4 | 4 |
|
5 | 5 | Author: Petr Danecek <[email protected]> |
6 | 6 |
|
@@ -174,7 +174,7 @@ typedef struct |
174 | 174 | maux_t *maux; |
175 | 175 | regidx_t *regs; // apply regions only after the blocks are expanded |
176 | 176 | regitr_t *regs_itr; |
177 | | - int header_only, collapse, output_type, force_samples, merge_by_id, do_gvcf, filter_logic, missing_to_ref, no_index; |
| 177 | + int header_only, collapse, output_type, force_samples, force_single, merge_by_id, do_gvcf, filter_logic, missing_to_ref, no_index; |
178 | 178 | char *header_fname, *output_fname, *regions_list, *info_rules, *file_list; |
179 | 179 | faidx_t *gvcf_fai; |
180 | 180 | info_rule_t *rules; |
@@ -3465,7 +3465,9 @@ static void usage(void) |
3465 | 3465 | fprintf(stderr, "Usage: bcftools merge [options] <A.vcf.gz> <B.vcf.gz> [...]\n"); |
3466 | 3466 | fprintf(stderr, "\n"); |
3467 | 3467 | fprintf(stderr, "Options:\n"); |
| 3468 | + fprintf(stderr, " --force-no-index Merge unindexed files, synonymous to --no-index\n"); |
3468 | 3469 | fprintf(stderr, " --force-samples Resolve duplicate sample names\n"); |
| 3470 | + fprintf(stderr, " --force-single Run even if there is only one file on input\n"); |
3469 | 3471 | fprintf(stderr, " --print-header Print only the merged header and exit\n"); |
3470 | 3472 | fprintf(stderr, " --use-header FILE Use the provided header\n"); |
3471 | 3473 | fprintf(stderr, " -0 --missing-to-ref Assume genotypes at missing sites are 0/0\n"); |
@@ -3527,6 +3529,8 @@ int main_vcfmerge(int argc, char *argv[]) |
3527 | 3529 | {"missing-rules",required_argument,NULL,'M'}, |
3528 | 3530 | {"no-version",no_argument,NULL,8}, |
3529 | 3531 | {"no-index",no_argument,NULL,10}, |
| 3532 | + {"force-no-index",no_argument,NULL,10}, |
| 3533 | + {"force-single",no_argument,NULL,12}, |
3530 | 3534 | {"filter-logic",required_argument,NULL,'F'}, |
3531 | 3535 | {"write-index",no_argument,NULL,11}, |
3532 | 3536 | {NULL,0,NULL,0} |
@@ -3608,14 +3612,13 @@ int main_vcfmerge(int argc, char *argv[]) |
3608 | 3612 | case 8 : args->record_cmd_line = 0; break; |
3609 | 3613 | case 10 : args->no_index = 1; break; |
3610 | 3614 | case 11 : args->write_index = 1; break; |
| 3615 | + case 12 : args->force_single = 1; break; |
3611 | 3616 | case 'h': |
3612 | 3617 | case '?': usage(); break; |
3613 | 3618 | default: error("Unknown argument: %s\n", optarg); |
3614 | 3619 | } |
3615 | 3620 | } |
3616 | 3621 | if ( argc==optind && !args->file_list ) usage(); |
3617 | | - if ( argc-optind<2 && !args->file_list ) usage(); |
3618 | | - |
3619 | 3622 | if ( args->no_index ) |
3620 | 3623 | { |
3621 | 3624 | if ( args->regions_list ) error("Error: cannot combine --no-index with -r/-R\n"); |
@@ -3656,6 +3659,9 @@ int main_vcfmerge(int argc, char *argv[]) |
3656 | 3659 | for (i=0; i<nfiles; i++) free(files[i]); |
3657 | 3660 | free(files); |
3658 | 3661 | } |
| 3662 | + if ( !args->files->nreaders ) usage(); |
| 3663 | + if ( args->files->nreaders==1 && !args->force_single ) error("Expected two or more files to merge, got only one. Use --force-single to proceed anyway\n"); |
| 3664 | + |
3659 | 3665 | merge_vcf(args); |
3660 | 3666 | bcf_sr_destroy(args->files); |
3661 | 3667 | if ( args->regs ) regidx_destroy(args->regs); |
|
0 commit comments