I was trying to left normalize my vcf file using following command:

bcftools norm -f reference.fasta -m -any input.vcf > output.norm.vcf

However this gives the following error:

Non-ACGTN alternate allele at 1:278165 .. VCF:'-3AGG'

It looks like the variant caller returned all deletions and insertions like this:

1   5387285 .   C   +2TG
1   5387316 .   G   -8TGTGTATC

This file format was produced by SCCaller 2.0.0, there are several unconventional output fields produced by this caller but but the repository isn't maintained.

Is this an issue of the vcf format or does this means that there is a non-ACGTN character on position 1:278165 in the fasta reference file? I don't see anyting out of the ordinary at this position using IGV.

What would be the best way forward? I tried the following command to extract non-ACGTN allels but it outputs all alleles:

bcftools view -i 'ALT !~ "^[ACGTN]+$"' input.vcf.gz > errors.vcf

EDIT: including several lines of vcf file

1   89946   .   A   T   68  .   NS=1    GT:SO:AD:BI:GQ:PL   0/1:False:3,18:0.973:68:273,164,49,117
1   286158  .   A   +2TG    78  .   NS=1    GT:SO:AD:BI:GQ:PL   0/0:NA:11,10:0.982:78:154,97,175,456
1   900119  .   A   G   150 .   NS=1    GT:SO:AD:BI:GQ:PL   0/0:False:17,14:0.995:150:214,136,321,657
1   932613  .   G   -4TTTC  62  .   NS=1    GT:SO:AD:BI:GQ:PL   0/1:NA:4,18:0.998:62:274,165,103,173
1   1168310 .   T   +2CA    35  .   NS=1    GT:SO:AD:BI:GQ:PL   0/0:NA:18,5:0.985:35:77,55,91,712```


2 Answers 2


That isn't a valid ALT field according to the VCF standard:

ALT — alternate base(s): Comma-separated list of alternate non-reference alleles. These alleles do not have to be called in any of the samples. Options are base Strings made up of the bases A,C,G,T,N (case insensitive) or the ‘*’ symbol (allele missing due to overlapping deletion) or a MISSING value ‘.’ (no variant) or an angle-bracketed ID String (“”) or a breakend replacement string as described in Section 5.4. If there are no alternative alleles, then the MISSING value must be used. In other words, the ALT field must be a symbolic allele, or a breakend replacement string, or match the regular expression ^([ACGTNacgtn]+|*|.)$. Tools processing VCF files are not required to preserve case in the allele String, except for IDs, which are case sensitive. (String; no whitespace, commas, or angle-brackets are permitted in the ID String itself)

So yes, you can have things other than ACTG, N most commonly or . or *. And you can also have things like <DEL> and <DUP> for structural variants. But a + or a digit make no sense and are not allowed so this is not a valid VCF file.

So, filter them out. You can use something like this:

zcat input.vcf.gz | awk -F'\t' '/^#/ || $5 ~ /^[ACGTNacgtn]+|\*|\.)$/' |
    bgzip > fixed.vcf.gz

I would also report this as a bug to the developers of your variant caller.

  • $\begingroup$ Thank you for your comment. I will remove them for now, but is there a safe way to reformat those variants as insertions or deletions in the correct format? $\endgroup$
    – Macintosh
    Mar 2 at 14:40
  • $\begingroup$ @Macintosh I have absolutely no clue what those things are supposed to be. If I were you, I would use a proper variant caller that knows how to produce valid VCF files. What did you use? $\endgroup$
    – terdon
    Mar 2 at 14:46
  • $\begingroup$ SCCaller 2.0.0. $\endgroup$
    – Macintosh
    Mar 2 at 14:49
  • 2
    $\begingroup$ @Macintosh well that looks like an abandoned project that was last touched 4 years ago (github.com/biosinodx/SCcaller). If you absolutely must use that, you need to go through the tool's documentation, understand what kind of variant represenation format they are using and then you could post a new question askiung how to convert those. I mean, I think that C +2TG should be C TGTG but it might also need to be C CTGTG depending on how they work. And G -8TGTGTATC should be... too long to write here, but 8 x TGTGTATC in the REF field and G in the ALT. $\endgroup$
    – terdon
    Mar 2 at 15:01
  • $\begingroup$ @terdon, in the examples given in this question, the number in the ALT is the length of the string of bases quoted, not the multiplicity, i.e. -8TGTGTATC represents the 8 bases TGTGTATC being deleted, and +2TG would be the 2 bases TG being added. It's still not standard VCF, but this might give a clue as to how to fix the REF/ALT to convert it to the correct format. $\endgroup$
    – user36196
    Mar 2 at 23:17

I would personally use plink2 for this. Nice and simple and unerstandable by all.

plink2 --vcf in.vcf --snps-only just-acgt --export vcf --out out.vcf

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.