[Bioperl-l] FASTQ support in Biopython, BioPerl, and EMBOSS

Chris Fields cjfields at illinois.edu
Sat Jul 25 15:50:13 EDT 2009


On Jul 24, 2009, at 10:12 AM, Peter wrote:

> On Fri, Jul 24, 2009 at 2:53 PM,  
> Peter<biopython at maubp.freeserve.co.uk> wrote:
>> On Fri, Jul 24, 2009 at 2:32 PM, Peter<biopython at maubp.freeserve.co.uk 
>> > wrote:
>>>>
>>>> Don't be surprised if there are still bugs lurking about, just  
>>>> let me
>>>> know and I'll fix 'em.
>>>
>>> I've got a bug report coming up in a second email, but the basics  
>>> work :)
>>
>> I think I have found a bug in BioPerl's conversion from fastq-solexa
>> to fastq-sanger concerning lower quality scores.
>
> Next up is an issue with BioPerl converting from Sanger to Illumina.
> In principle this is simple - the quality strings both use PHRED  
> scores
> just with different offsets. With lower PHRED scores, everything is  
> fine:
>
> $ more sanger_faked.fastq
> @Test PHRED qualities from 40 to 0 inclusive
> ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTN
> +
> IHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
>
> Again, this is an example constructed by hand to cover a broad
> range of valid scores, and can be found in the Biopython
> repository under biopython/Tests/Quality
>
> $ perl bioperl_sanger2illumina.pl < sanger_faked.fastq @Test PHRED
> qualities from 40 to 0 inclusive
> ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTN
> +Test PHRED qualities from 40 to 0 inclusive
> hgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@
>
> $ python biopython_sanger2illumina.py < sanger_faked.fastq
> @Test PHRED qualities from 40 to 0 inclusive
> ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTN
> +
> hgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@
>
> So, BioPerl and Biopython (and EMBOSS) agree - apart from
> the repeating second title on the plus line. I understand that
> EMBOSS will in future omit the repeated title on the plus line:
> http://lists.open-bio.org/pipermail/emboss-dev/2009-July/000598.html

We'll make it optional and default to no header.

> Now, here comes the problem. I believe FASTQ files directly
> from an Illumina 1.3+ pipeline will have PHRED scores in the
> range 0 to 40 (as in this example). However, much higher
> PHRED scores are possible during assembly / contig'ing
> and read mapping. For example, the tool MAQ will output
> Sanger style FASTQ files with PHRED scores in the range
> 0 to 93 inclusive.

Is this behavior documented anywhere, specifically by Illumina (that  
values can exceed 40)?  If Illumina 1.3 is specified as being PHRED  
0-40, and another (non-Illumina) software package pushes that limit  
above the specified range of Illumina values, I would consider that  
unfortunately yet another variant.

We can support it as Illumina 1.3, but my point is this may getting  
into a grey area and may be something that Illumina doesn't/wouldn't  
support.  Reminds me a little of the multiple GFF2 variations (one of  
the main reasons for a GFF3).

> Now, in the Sanger FASTQ format, PHRED scores of 0 to
> 93 map onto ASCII values of 33 to 126 (! to ~). There is a
> reason for stopping at 126, since ASCII 127 is "delete".
>
> However, in the Illumina 1.3+ FASTQ format, PHRED
> scores of 0 to 93 would map to ASCII values of 64 to
> 157, which includes a lot of non printing characters.
> Working with such files at the command line or in an
> editor is a big problem. Clearly, Illumina never intended
> to include such high scores in their FASTQ files!

Exactly.

> Nevertheless, it is possible to write a FASTQ format
> following the Illumina 1.3+ encoding with these values.
> Biopython and EMBOSS attempt to do this - although I
> would regard throwing an error as equally acceptable.
>
> So, here is another hand constructed example of a
> Sanger style FASTQ file using the full quality range:
>
> $ more sanger_93.fastq
> @Test PHRED qualities from 93 to 0 inclusive
> ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGAN
> +
> ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;: 
> 9876543210/.-,+*)('&%$#"!
>
> Again, this example is in the Biopython repository under
> biopython/Tests/Quality
>
> Just to check:
>
> $ python biopython_sanger2qual.py < sanger_93.fastq
>> Test PHRED qualities from 93 to 0 inclusive
> 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74
> 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54
> 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34
> 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14
> 13 12 11 10 9 8 7 6 5 4 3 2 1 0
>
> So, here we go - apologies for the expected line mangling:
>
> $ seqret -filter -sformat fastq-sanger -osformat fastq-illumina <
> sanger_93.fastq | hexdump -C -v
> 00000000  40 54 65 73 74 20 50 48  52 45 44 20 71 75 61 6c  |@Test  
> PHRED qual|
> 00000010  69 74 69 65 73 20 66 72  6f 6d 20 39 33 20 74 6f  |ities  
> from 93 to|
> 00000020  20 30 20 69 6e 63 6c 75  73 69 76 65 0a 41 43 54  | 0  
> inclusive.ACT|
> 00000030  47 41 43 54 47 41 43 54  47 41 43 54 47 41 43 54  | 
> GACTGACTGACTGACT|
> 00000040  47 41 43 54 47 41 43 54  47 41 43 54 47 41 43 54  | 
> GACTGACTGACTGACT|
> 00000050  47 41 43 54 47 41 43 54  47 41 43 54 47 41 43 54  | 
> GACTGACTGACTGACT|
> 00000060  47 41 43 54 47 41 43 54  47 0a 41 43 54 47 41 43  | 
> GACTGACTG.ACTGAC|
> 00000070  54 47 41 43 54 47 41 43  54 47 41 43 54 47 41 43  | 
> TGACTGACTGACTGAC|
> 00000080  54 47 41 43 54 47 41 43  54 47 41 4e 0a 2b 54 65  | 
> TGACTGACTGAN.+Te|
> 00000090  73 74 0a 9d 9c 9b 9a 99  98 97 96 95 94 93 92 91  | 
> st..............|
> 000000a0  90 8f 8e 8d 8c 8b 8a 89  88 87 86 85 84 83 82 81   
> |................|
> 000000b0  80 7f 7e 7d 7c 7b 7a 79  78 77 76 75 74 73 72 71  |..~}| 
> {zyxwvutsrq|
> 000000c0  70 6f 6e 6d 6c 6b 6a 69  68 67 66 65 64 63 62 0a  | 
> ponmlkjihgfedcb.|
> 000000d0  61 60 5f 5e 5d 5c 5b 5a  59 58 57 56 55 54 53 52  |a`_^]\ 
> [ZYXWVUTSR|
> 000000e0  51 50 4f 4e 4d 4c 4b 4a  49 48 47 46 45 44 43 42  | 
> QPONMLKJIHGFEDCB|
> 000000f0  41 40 0a                                          |A at .|
> 000000f3
>
> $ python biopython_sanger2illumina.py < sanger_93.fastq | hexdump -C
> -v00000000  40 54 65 73 74 20 50 48  52 45 44 20 71 75 61 6c  |@Test
> PHRED qual|
> 00000010  69 74 69 65 73 20 66 72  6f 6d 20 39 33 20 74 6f  |ities  
> from 93 to|
> 00000020  20 30 20 69 6e 63 6c 75  73 69 76 65 0a 41 43 54  | 0  
> inclusive.ACT|
> 00000030  47 41 43 54 47 41 43 54  47 41 43 54 47 41 43 54  | 
> GACTGACTGACTGACT|
> 00000040  47 41 43 54 47 41 43 54  47 41 43 54 47 41 43 54  | 
> GACTGACTGACTGACT|
> 00000050  47 41 43 54 47 41 43 54  47 41 43 54 47 41 43 54  | 
> GACTGACTGACTGACT|
> 00000060  47 41 43 54 47 41 43 54  47 41 43 54 47 41 43 54  | 
> GACTGACTGACTGACT|
> 00000070  47 41 43 54 47 41 43 54  47 41 43 54 47 41 43 54  | 
> GACTGACTGACTGACT|
> 00000080  47 41 43 54 47 41 43 54  47 41 4e 0a 2b 0a 9d 9c  | 
> GACTGACTGAN.+...|
> 00000090  9b 9a 99 98 97 96 95 94  93 92 91 90 8f 8e 8d 8c   
> |................|
> 000000a0  8b 8a 89 88 87 86 85 84  83 82 81 80 7f 7e 7d 7c   
> |.............~}||
> 000000b0  7b 7a 79 78 77 76 75 74  73 72 71 70 6f 6e 6d 6c  | 
> {zyxwvutsrqponml|
> 000000c0  6b 6a 69 68 67 66 65 64  63 62 61 60 5f 5e 5d 5c  | 
> kjihgfedcba`_^]\|
> 000000d0  5b 5a 59 58 57 56 55 54  53 52 51 50 4f 4e 4d 4c  | 
> [ZYXWVUTSRQPONML|
> 000000e0  4b 4a 49 48 47 46 45 44  43 42 41 40 0a           | 
> KJIHGFEDCBA at .|
> 000000ed
>
> Biopython and EMBOSS 6.1.0 differ regarding the plus line, but agree
> on the quality string which runs from 0x9d to 0x40 (in hex), or 157 to
> 64 in decimal, which after subtracting the Illumina offset of 64,  
> gives
> PHRED scores of 93 to 0 as desired.
>
> Now to BioPerl,
>
> $ perl bioperl_sanger2illumina.pl < sanger_93.fastq
> @Test PHRED qualities from 93 to 0 inclusive
> ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGAN
> +Test PHRED qualities from 93 to 0 inclusive
> hgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@
>
> $ perl bioperl_sanger2illumina.pl < sanger_93.fastq | hexdump -C -v
> ...
>
> BioPerl has output an invalid FASTQ file - it seems to omit the
> quality scores for the top scoring nucleotides at the start. The
> BioPerl quality string runs from just "h" to "@", or 0x68 to 0x40
> (in hex), giving 104 to 64 in decimal, giving PHRED values of
> 40 to 0. I think BioPerl should either throw an error, or output
> the non printing characters as done by Biopython and EMBOSS.
>
> Regards,
>
> Peter C.
> (@Biopython)


If this is accepted as common practice between BioPython and EMBOSS we  
will follow similarly.  I do think it's worth at least a warning for  
the reasons outlined above (e.g. it likely isn't Illumina's intent to  
support qual values outside the specified range).  Might be worth  
checking into.

 From this it could be summarized that converting to sanger format is  
least problematic, as possible issues may be encountered when  
converting to the other variants.  We'll need to fix the solexa  
quality calculations in the BioPerl parser as noted in your previous  
post; I'll work on that.

chris




More information about the Bioperl-l mailing list