Skip to content

Commit f9be261

Browse files
committed
Check return status, GT may not be present. Resolves #2426
1 parent d4d8bb1 commit f9be261

File tree

5 files changed

+33
-13
lines changed

5 files changed

+33
-13
lines changed

test/norm.check-ref.1.out

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
##fileformat=VCFv4.2
2+
##FILTER=<ID=PASS,Description="All filters passed">
3+
##contig=<ID=chr1,length=248956422>
4+
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
5+
#CHROM POS ID REF ALT QUAL FILTER INFO
6+
chr1 11 rs7214 T C . . .

test/norm.check-ref.fa

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
>chr1
2+
TATAAATAAATTTCCCTATTA

test/norm.check-ref.vcf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
##fileformat=VCFv4.2
2+
##contig=<ID=chr1,length=248956422>
3+
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
4+
#CHROM POS ID REF ALT QUAL FILTER INFO
5+
chr1 11 rs7214 C T . . .

test/test.pl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@
290290
run_test(\&test_vcf_query,$opts,in=>'query.header',out=>'query.98.2.out',args=>q[-HH -f'%CHROM %POS[ %SAMPLE][ %DP][ %GT]']);
291291
run_test(\&test_vcf_query,$opts,in=>'query.filter-or',out=>'query.filter-or.1.out',args=>q[-f'[%SAMPLE %DP\\n]' -i'DP=1 || DP=2']);
292292
run_test(\&test_vcf_query,$opts,in=>'query.filter-or',out=>'query.filter-or.2.out',args=>q[-f'[%SAMPLE %DP\\n]' -i'DP=1 | DP=2']);
293+
run_test(\&test_vcf_norm,$opts,in=>'norm.check-ref',fai=>'norm.check-ref',out=>'norm.check-ref.1.out',args=>qq[-c s]);
293294
run_test(\&test_vcf_norm,$opts,in=>'norm.filter',out=>'norm.filter.1.out',args=>qq[-m +both -i 'ID=\@{PATH}/norm.filter.txt']);
294295
run_test(\&test_vcf_norm,$opts,in=>'norm.filter',out=>'norm.filter.1.out',args=>qq[-m +both -i 'ALT!="C"']);
295296
run_test(\&test_vcf_norm,$opts,in=>'norm.filter',out=>'norm.filter.2.out',args=>qq[-d both -i 'ID=\@{PATH}/norm.filter.txt']);

vcfnorm.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -315,26 +315,32 @@ static int fix_ref(args_t *args, bcf1_t *line)
315315
// swap genotypes
316316
int ntmp = args->ntmp_arr1 / sizeof(int32_t); // reuse tmp_arr declared as uint8_t
317317
int ngts = bcf_get_genotypes(args->hdr, line, &args->tmp_arr1, &ntmp);
318-
args->ntmp_arr1 = ntmp * sizeof(int32_t);
319-
int32_t *gts = (int32_t*) args->tmp_arr1;
320318
int ni = 0;
321-
for (j=0; j<ngts; j++)
319+
if ( ngts>0 )
322320
{
323-
if ( gts[j]==bcf_gt_unphased(0) ) { gts[j] = bcf_gt_unphased(i); ni++; }
324-
else if ( gts[j]==bcf_gt_phased(0) ) { gts[j] = bcf_gt_phased(i); ni++; }
325-
else if ( gts[j]==bcf_gt_unphased(i) ) gts[j] = bcf_gt_unphased(0);
326-
else if ( gts[j]==bcf_gt_phased(i) ) gts[j] = bcf_gt_phased(0);
321+
args->ntmp_arr1 = ntmp * sizeof(int32_t);
322+
int32_t *gts = (int32_t*) args->tmp_arr1;
323+
for (j=0; j<ngts; j++)
324+
{
325+
if ( gts[j]==bcf_gt_unphased(0) ) { gts[j] = bcf_gt_unphased(i); ni++; }
326+
else if ( gts[j]==bcf_gt_phased(0) ) { gts[j] = bcf_gt_phased(i); ni++; }
327+
else if ( gts[j]==bcf_gt_unphased(i) ) gts[j] = bcf_gt_unphased(0);
328+
else if ( gts[j]==bcf_gt_phased(i) ) gts[j] = bcf_gt_phased(0);
329+
}
330+
bcf_update_genotypes(args->out_hdr,line,gts,ngts);
327331
}
328-
bcf_update_genotypes(args->out_hdr,line,gts,ngts);
329332

330333
// update AC
331334
int nac = bcf_get_info_int32(args->hdr, line, "AC", &args->tmp_arr1, &ntmp);
332-
args->ntmp_arr1 = ntmp * sizeof(int32_t);
333-
if ( i <= nac )
335+
if ( nac>0 )
334336
{
335-
int32_t *ac = (int32_t*)args->tmp_arr1;
336-
ac[i-1] = ni;
337-
bcf_update_info_int32(args->out_hdr, line, "AC", ac, nac);
337+
args->ntmp_arr1 = ntmp * sizeof(int32_t);
338+
if ( i <= nac )
339+
{
340+
int32_t *ac = (int32_t*)args->tmp_arr1;
341+
ac[i-1] = ni;
342+
bcf_update_info_int32(args->out_hdr, line, "AC", ac, nac);
343+
}
338344
}
339345
return 1;
340346
}

0 commit comments

Comments
 (0)