Skip to content

Commit d5d280b

Browse files
committed
Replace semicolons with commas
When multiple FILTER or ID values are copied to an INFO tag, semicolons must be replaced with a comma or else the subsequent values are interpreted as tag names
1 parent 43d954e commit d5d280b

File tree

10 files changed

+37
-44
lines changed

10 files changed

+37
-44
lines changed

test/annotate19.1.out

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
##FILTER=<ID=PASS,Description="All filters passed">
33
##contig=<ID=1,assembly=b37,length=249250621>
44
##reference=file:///lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta
5-
##FILTER=<ID=ori_filter,Description="Test">
5+
##FILTER=<ID=ori_filter1,Description="Test">
6+
##FILTER=<ID=ori_filter2,Description="Test">
67
##INFO=<ID=ID,Number=1,Type=String,Description="Transferred ID column">
78
##INFO=<ID=INFO_ID,Number=1,Type=String,Description="Test">
89
#CHROM POS ID REF ALT QUAL FILTER INFO
9-
1 3000001 id_id;info_id C T . ori_filter ID=id_id;INFO_ID=info_id
10+
1 3000001 id_id1;id_id2;info_id C T . ori_filter1;ori_filter2 ID=id_id1,id_id2;INFO_ID=info_id

test/annotate19.2.out

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
##FILTER=<ID=PASS,Description="All filters passed">
33
##contig=<ID=1,assembly=b37,length=249250621>
44
##reference=file:///lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta
5-
##FILTER=<ID=ori_filter,Description="Test">
5+
##FILTER=<ID=ori_filter1,Description="Test">
6+
##FILTER=<ID=ori_filter2,Description="Test">
67
##FILTER=<ID=filter_filter,Description="Test">
78
##INFO=<ID=FILTER,Number=1,Type=String,Description="Transferred FILTER column">
89
##INFO=<ID=INFO_FILTER,Number=1,Type=String,Description="Test">

test/annotate19.3.out

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
##FILTER=<ID=PASS,Description="All filters passed">
33
##contig=<ID=1,assembly=b37,length=249250621>
44
##reference=file:///lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta
5-
##FILTER=<ID=ori_filter,Description="Test">
5+
##FILTER=<ID=ori_filter1,Description="Test">
6+
##FILTER=<ID=ori_filter2,Description="Test">
67
##INFO=<ID=FILTER,Number=1,Type=String,Description="Transferred FILTER column">
78
##INFO=<ID=INFO_FILTER,Number=1,Type=String,Description="Test">
89
#CHROM POS ID REF ALT QUAL FILTER INFO
9-
1 3000001 ori_id C T . ori_filter FILTER=filter_filter;INFO_FILTER=info_filter
10+
1 3000001 ori_id C T . ori_filter1;ori_filter2 FILTER=filter_filter;INFO_FILTER=info_filter

test/annotate19.4.out

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
##FILTER=<ID=PASS,Description="All filters passed">
33
##contig=<ID=1,assembly=b37,length=249250621>
44
##reference=file:///lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta
5-
##FILTER=<ID=ori_filter,Description="Test">
5+
##FILTER=<ID=ori_filter1,Description="Test">
6+
##FILTER=<ID=ori_filter2,Description="Test">
67
##INFO=<ID=FILTER,Number=1,Type=String,Description="Transferred FILTER column">
78
#CHROM POS ID REF ALT QUAL FILTER INFO
8-
1 3000001 ori_id C T . ori_filter FILTER=ori_filter
9+
1 3000001 ori_id C T . ori_filter1;ori_filter2 FILTER=ori_filter1,ori_filter2

test/annotate19.5.out

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
##FILTER=<ID=PASS,Description="All filters passed">
33
##contig=<ID=1,assembly=b37,length=249250621>
44
##reference=file:///lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta
5-
##FILTER=<ID=ori_filter,Description="Test">
5+
##FILTER=<ID=ori_filter1,Description="Test">
6+
##FILTER=<ID=ori_filter2,Description="Test">
67
##INFO=<ID=FILTER,Number=1,Type=String,Description="Transferred FILTER column">
78
#CHROM POS ID REF ALT QUAL FILTER INFO
8-
1 3000001 ori_id C T . ori_filter FILTER=filter_filter
9+
1 3000001 ori_id C T . ori_filter1;ori_filter2 FILTER=filter_filter

test/annotate19.6.out

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
##FILTER=<ID=PASS,Description="All filters passed">
33
##contig=<ID=1,assembly=b37,length=249250621>
44
##reference=file:///lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta
5-
##FILTER=<ID=ori_filter,Description="Test">
5+
##FILTER=<ID=ori_filter1,Description="Test">
6+
##FILTER=<ID=ori_filter2,Description="Test">
67
##INFO=<ID=FILTER,Number=1,Type=String,Description="Transferred FILTER column">
78
##FILTER=<ID=filter_filter,Description="Test">
89
#CHROM POS ID REF ALT QUAL FILTER INFO
9-
1 3000001 ori_id C T . filter_filter FILTER=ori_filter
10+
1 3000001 ori_id C T . filter_filter FILTER=ori_filter1,ori_filter2

test/annotate19.7.out

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
##FILTER=<ID=PASS,Description="All filters passed">
33
##contig=<ID=1,assembly=b37,length=249250621>
44
##reference=file:///lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta
5-
##FILTER=<ID=ori_filter,Description="Test">
5+
##FILTER=<ID=ori_filter1,Description="Test">
6+
##FILTER=<ID=ori_filter2,Description="Test">
67
##FILTER=<ID=filter_filter,Description="Test">
78
##INFO=<ID=FILTER,Number=1,Type=String,Description="Transferred FILTER column">
89
#CHROM POS ID REF ALT QUAL FILTER INFO

test/annotate19.dst.vcf

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
##fileformat=VCFv4.1
22
##contig=<ID=1,assembly=b37,length=249250621>
33
##reference=file:///lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta
4-
##FILTER=<ID=ori_filter,Description="Test">
4+
##FILTER=<ID=ori_filter1,Description="Test">
5+
##FILTER=<ID=ori_filter2,Description="Test">
56
#CHROM POS ID REF ALT QUAL FILTER INFO
6-
1 3000001 ori_id C T . ori_filter .
7+
1 3000001 ori_id C T . ori_filter1;ori_filter2 .

test/annotate19.src.vcf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66
##INFO=<ID=QUAL,Number=1,Type=Float,Description="Test">
77
##FILTER=<ID=filter_filter,Description="Test">
88
#CHROM POS ID REF ALT QUAL FILTER INFO
9-
1 3000001 id_id C T 11 filter_filter FILTER=info_filter;ID=info_id;QUAL=99
9+
1 3000001 id_id1;id_id2 C T 11 filter_filter FILTER=info_filter;ID=info_id;QUAL=99

vcfannotate.c

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -511,20 +511,21 @@ static int vcf_getter_info_str2str(args_t *args, bcf1_t *rec, annot_col_t *col,
511511
static int vcf_getter_id2str(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr)
512512
{
513513
char *str = *((char**)ptr);
514-
int len = strlen(rec->d.id);
514+
int i, len = strlen(rec->d.id);
515515
if ( len >= *mptr ) str = realloc(str, len+1);
516-
strcpy(str, rec->d.id);
516+
for (i=0; i<len; i++)
517+
str[i] = rec->d.id[i]==';' ? ',' : rec->d.id[i];
518+
str[len] = 0;
517519
*((char**)ptr) = str;
518520
*mptr = len+1;
519521
return len;
520522
}
521-
static int vcf_getter_filter2str_local(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr)
523+
inline static int vcf_getter_filter2str_core(bcf_hdr_t *hdr, bcf1_t *rec, char **ptr, int *mptr)
522524
{
523-
rec = args->current_rec;
524525
if ( !(rec->unpacked & BCF_UN_FLT) ) bcf_unpack(rec, BCF_UN_FLT);
525526

526527
kstring_t str;
527-
str.s = *((char**)ptr);
528+
str.s = *ptr;
528529
str.m = *mptr;
529530
str.l = 0;
530531

@@ -533,39 +534,23 @@ static int vcf_getter_filter2str_local(args_t *args, bcf1_t *rec, annot_col_t *c
533534
{
534535
for (i=0; i<rec->d.n_flt; i++)
535536
{
536-
if (i) kputc(';', &str);
537-
kputs(bcf_hdr_int2id(args->hdr_out,BCF_DT_ID,rec->d.flt[i]), &str);
537+
if (i) kputc(',', &str);
538+
kputs(bcf_hdr_int2id(hdr,BCF_DT_ID,rec->d.flt[i]), &str);
538539
}
539540
}
540541
else kputc('.', &str);
541542

542-
*((char**)ptr) = str.s;
543+
*ptr = str.s;
543544
*mptr = str.m;
544545
return str.l;
545546
}
547+
static int vcf_getter_filter2str_local(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr)
548+
{
549+
return vcf_getter_filter2str_core(args->hdr_out, args->current_rec, (char**)ptr, mptr);
550+
}
546551
static int vcf_getter_filter2str(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr)
547552
{
548-
if ( !(rec->unpacked & BCF_UN_FLT) ) bcf_unpack(rec, BCF_UN_FLT);
549-
550-
kstring_t str;
551-
str.s = *((char**)ptr);
552-
str.m = *mptr;
553-
str.l = 0;
554-
555-
int i;
556-
if ( rec->d.n_flt )
557-
{
558-
for (i=0; i<rec->d.n_flt; i++)
559-
{
560-
if (i) kputc(';', &str);
561-
kputs(bcf_hdr_int2id(args->tgts_hdr,BCF_DT_ID,rec->d.flt[i]), &str);
562-
}
563-
}
564-
else kputc('.', &str);
565-
566-
*((char**)ptr) = str.s;
567-
*mptr = str.m;
568-
return str.l;
553+
return vcf_getter_filter2str_core(args->tgts_hdr, rec, (char**)ptr, mptr);
569554
}
570555
static int setter_filter(args_t *args, bcf1_t *line, annot_col_t *col, void *data)
571556
{

0 commit comments

Comments
 (0)