Mercurial > repos > devteam > short_reads_trim_seq
changeset 0:f17a1585733b draft
Imported from capsule None
author | devteam |
---|---|
date | Mon, 19 May 2014 12:34:17 -0400 |
parents | |
children | 25e6fe525306 |
files | short_reads_trim_seq.py short_reads_trim_seq.xml test-data/454.fasta test-data/454.qual test-data/short_reads_trim_seq_out1.fasta test-data/short_reads_trim_seq_out2.fasta test-data/solexa.fasta test-data/solexa.qual |
diffstat | 8 files changed, 619 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/short_reads_trim_seq.py Mon May 19 12:34:17 2014 -0400 @@ -0,0 +1,234 @@ +#!/usr/bin/env python +""" +trim reads based on the quality scores +input: read file and quality score file +output: trimmed read file +""" + +import os, sys, math, tempfile, re + +assert sys.version_info[:2] >= ( 2, 4 ) + +def stop_err( msg ): + sys.stderr.write( "%s\n" % msg ) + sys.exit() + +def append_to_outfile( outfile_name, seq_title, segments ): + segments = segments.split( ',' ) + if len( segments ) > 1: + outfile = open( outfile_name, 'a' ) + for i in range( len( segments ) ): + outfile.write( "%s_%d\n%s\n" % ( seq_title, i, segments[i] ) ) + outfile.close() + elif segments[0]: + outfile = open( outfile_name, 'a' ) + outfile.write( "%s\n%s\n" % ( seq_title, segments[0] ) ) + outfile.close() + +def trim_seq( seq, score, arg, trim_score, threshold ): + seq_method = '454' + trim_pos = 0 + # trim after a certain position + if arg.isdigit(): + keep_homopolymers = False + trim_pos = int( arg ) + if trim_pos > 0 and trim_pos < len( seq ): + seq = seq[0:trim_pos] + else: + keep_homopolymers = arg=='yes' + + new_trim_seq = '' + max_segment = 0 + + for i in range( len( seq ) ): + if i >= len( score ): + score.append(-1) + if int( score[i] ) >= trim_score: + pass_nuc = seq[ i:( i + 1 ) ] + else: + if keep_homopolymers and ( (i == 0 ) or ( seq[ i:( i + 1 ) ].lower() == seq[ ( i - 1 ):i ].lower() ) ): + pass_nuc = seq[ i:( i + 1 ) ] + else: + pass_nuc = ' ' + new_trim_seq = '%s%s' % ( new_trim_seq, pass_nuc ) + # find the max substrings + segments = new_trim_seq.split() + max_segment = '' + len_max_segment = 0 + if threshold == 0: + for seg in segments: + if len_max_segment < len( seg ): + max_segment = '%s,' % seg + len_max_segment = len( seg ) + elif len_max_segment == len( seg ): + max_segment = '%s%s,' % ( max_segment, seg ) + else: + for seg in segments: + if len( seg ) >= threshold: + max_segment = '%s%s,' % ( max_segment, seg ) + return max_segment[ 0:-1 ] + +def __main__(): + + try: + threshold_trim = int( sys.argv[1].strip() ) + except: + stop_err( "Minimal quality score must be numeric." ) + try: + threshold_report = int( sys.argv[2].strip() ) + except: + stop_err( "Minimal length of trimmed reads must be numeric." ) + outfile_seq_name = sys.argv[3].strip() + infile_seq_name = sys.argv[4].strip() + infile_score_name = sys.argv[5].strip() + arg = sys.argv[6].strip() + + seq_infile_name = infile_seq_name + score_infile_name = infile_score_name + + + # Determine quailty score format: tabular or fasta format within the first 100 lines + seq_method = None + data_type = None + for i, line in enumerate( file( score_infile_name ) ): + line = line.rstrip( '\r\n' ) + if not line or line.startswith( '#' ): + continue + if data_type == None: + if line.startswith( '>' ): + data_type = 'fasta' + continue + elif len( line.split( '\t' ) ) > 0: + fields = line.split() + for score in fields: + try: + int( score ) + data_type = 'tabular' + seq_method = 'solexa' + break + except: + break + elif data_type == 'fasta': + fields = line.split() + for score in fields: + try: + int( score ) + seq_method = '454' + break + except: + break + if i == 100: + break + + if data_type is None: + stop_err( 'This tool can only use fasta data or tabular data.' ) + if seq_method is None: + stop_err( 'Invalid data for fasta format.') + + if os.path.exists( seq_infile_name ) and os.path.exists( score_infile_name ): + seq = None + score = None + score_found = False + + score_file = open( score_infile_name, 'r' ) + + for i, line in enumerate( open( seq_infile_name ) ): + line = line.rstrip( '\r\n' ) + if not line or line.startswith( '#' ): + continue + if line.startswith( '>' ): + if seq: + scores = [] + if data_type == 'fasta': + score = None + score_found = False + score_line = 'start' + while not score_found and score_line: + score_line = score_file.readline().rstrip( '\r\n' ) + if not score_line or score_line.startswith( '#' ): + continue + if score_line.startswith( '>' ): + if score: + scores = score.split() + score_found = True + score = None + else: + for val in score_line.split(): + try: + int( val ) + except: + score_file.close() + stop_err( "Non-numerical value '%s' in score file." % val ) + if not score: + score = score_line + else: + score = '%s %s' % ( score, score_line ) + elif data_type == 'tabular': + score = score_file.readline().rstrip('\r\n') + loc = score.split( '\t' ) + for base in loc: + nuc_error = base.split() + try: + nuc_error[0] = int( nuc_error[0] ) + nuc_error[1] = int( nuc_error[1] ) + nuc_error[2] = int( nuc_error[2] ) + nuc_error[3] = int( nuc_error[3] ) + big = max( nuc_error ) + except: + score_file.close() + stop_err( "Invalid characters in line %d: '%s'" % ( i, line ) ) + scores.append( big ) + if scores: + new_trim_seq_segments = trim_seq( seq, scores, arg, threshold_trim, threshold_report ) + append_to_outfile( outfile_seq_name, seq_title, new_trim_seq_segments ) + + seq_title = line + seq = None + else: + if not seq: + seq = line + else: + seq = "%s%s" % ( seq, line ) + if seq: + scores = [] + if data_type == 'fasta': + score = None + while score_line: + score_line = score_file.readline().rstrip( '\r\n' ) + if not score_line or score_line.startswith( '#' ) or score_line.startswith( '>' ): + continue + for val in score_line.split(): + try: + int( val ) + except: + score_file.close() + stop_err( "Non-numerical value '%s' in score file." % val ) + if not score: + score = score_line + else: + score = "%s %s" % ( score, score_line ) + if score: + scores = score.split() + elif data_type == 'tabular': + score = score_file.readline().rstrip('\r\n') + loc = score.split( '\t' ) + for base in loc: + nuc_error = base.split() + try: + nuc_error[0] = int( nuc_error[0] ) + nuc_error[1] = int( nuc_error[1] ) + nuc_error[2] = int( nuc_error[2] ) + nuc_error[3] = int( nuc_error[3] ) + big = max( nuc_error ) + except: + score_file.close() + stop_err( "Invalid characters in line %d: '%s'" % ( i, line ) ) + scores.append( big ) + if scores: + new_trim_seq_segments = trim_seq( seq, scores, arg, threshold_trim, threshold_report ) + append_to_outfile( outfile_seq_name, seq_title, new_trim_seq_segments ) + score_file.close() + else: + stop_err( "Cannot locate sequence file '%s'or score file '%s'." % ( seq_infile_name, score_infile_name ) ) + +if __name__ == "__main__": __main__()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/short_reads_trim_seq.xml Mon May 19 12:34:17 2014 -0400 @@ -0,0 +1,93 @@ +<tool id="trim_reads" name="Select high quality segments" version="1.0.0"> +<description></description> + +<command interpreter="python"> + short_reads_trim_seq.py $trim $length $output1 $input1 $input2 $sequencing_method_choice.input3 +</command> +<inputs> +<page> + <param name="input1" type="data" format="fasta" label="Reads" /> + <param name="input2" type="data" format="qualsolexa,qual454" label="Quality scores" /> + <param name="trim" type="integer" size="5" value="20" label="Minimal quality score" help="bases scoring below this value will trigger splitting"/> + <param name="length" type="integer" size="5" value="100" label="Minimal length of contiguous segment" help="report all high quality segments above this length. Setting this option to '0' will cause the program to return a single longest run of high quality bases per read" /> + <conditional name="sequencing_method_choice"> + <param name="sequencer" type="select" label="Select technology"> + <option value="454">Roche (454) or ABI SOLiD</option> + <option value="Solexa">Illumina (Solexa)</option> + </param> + <when value="454"> + <param name="input3" type="select" label="Low quality bases in homopolymers" help="if set to 'DO NOT trigger splitting' the program will not count low quality bases that are within or adjacent to homonucleotide runs. This will significantly reduce fragmentation of 454 data"> + <option value="yes">DO NOT trigger splitting </option> + <option value="no">trigger splitting</option> + </param> + </when> + <when value="Solexa"> + <param name="input3" type="integer" size="5" value="0" label="Restrict length of each read to" help="('0' = do not trim) The quality of Solexa reads drops towards the end. This option allows selecting the specified number of nucleotides from the beginning and then running the tool." /> + </when> + </conditional> +</page> +</inputs> + +<outputs> + <data name="output1" format="fasta" /> +</outputs> + +<tests> + <test> + <param name="sequencer" value="454" /> + <param name="input1" value="454.fasta" ftype="fasta" /> + <param name="input2" value="454.qual" ftype="qual454" /> + <param name="input3" value="no" /> + <param name="trim" value="20" /> + <param name="length" value="0" /> + <output name="output1" file="short_reads_trim_seq_out1.fasta" /> + </test> + <test> + <param name="sequencer" value="Solexa" /> + <param name="input1" value="solexa.fasta" ftype="fasta" /> + <param name="input2" value="solexa.qual" ftype="qualsolexa" /> + <param name="input3" value="0" /> + <param name="trim" value="20" /> + <param name="length" value="0" /> + <output name="output1" file="short_reads_trim_seq_out2.fasta" /> + </test> +</tests> + +<help> + +.. class:: warningmark + +To use this tool, your dataset needs to be in the *Quality Score* format. Click the pencil icon next to your dataset to set the datatype to *Quality Score* (see below for examples). + +----- + +**What it does** + +This tool finds high quality segments within sequencing reads generated by by Roche (454), Illumina (Solexa), or ABI SOLiD machines. + +----- + +**Example** + + +Suppose this is your sequencing read:: + + 5'---------*-------------*------**----3' + +where **dashes** (-) are HIGH quality bases (above 20) and **asterisks** (*) are LOW quality bases (below 20). If the **Minimal length of contiguous segment** is set to **5** (of course, only for the purposes of this example), the tool will return:: + + 5'--------- + ------------- + ------- + +you can see that the tool simply splits the read on low quality bases and then returns all segments longer than 5. **Note**, that the output of this tool will likely contain higher number of shorter sequences compared to the original input. If we set the **Minimal length of contiguous segment** to **0**, the tool will only return the single longest segment:: + + ------------- + + + + + + +</help> +</tool>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/454.fasta Mon May 19 12:34:17 2014 -0400 @@ -0,0 +1,52 @@ +>EYKX4VC01B65GS length=54 xy=0784_1754 region=1 run=R_2007_11_07_16_15_57_ +CCGGTATCCGGGTGCCGTGATGAGCGCCACCGGAACGAATTCGACTATGCCGAA +>EYKX4VC01BNCSP length=187 xy=0558_3831 region=1 run=R_2007_11_07_16_15_57_ +CTTACCGGTCACCACCGTGCCTTCAGGATTGATCGCCAGATCGGTCGGTGCGTCAGGCGG +GGTGACATCGCCCACCACGGTACTCACTGGCTGGCTCTGGTTCCCGGCGGCATCGGAGGC +CACCACGTTGAGGGTATTCCCCTCGGTTTGTGGCTCGGTGAGAACCACGTTGTAGTCGCC +ATTGGTC +>EYKX4VC01CD9FT length=115 xy=0865_1719 region=1 run=R_2007_11_07_16_15_57_ +GGGGGCTTTGGCCTGTCGTCCGGCACCTCGCAAGAGCTACAGCAGGCGCGGCTGGCGATC +ATCGGCGGCACGCCGGCCTATATGTCGCCGGAACACACCACCCGCACCCAACGCG +>EYKX4VC01B8FW0 length=95 xy=0799_0514 region=1 run=R_2007_11_07_16_15_57_ +TAAATTTCAAGGAATGCAAATCAGGGTCGTGTGTTTAGACTTCGGCTTTAGAGACCTGAA +TACGTCAAAAACATAACTTCATGATATCTTGCAGT +>EYKX4VC01BCGYW length=115 xy=0434_3926 region=1 run=R_2007_11_07_16_15_57_ +GGCCAGCCGGGACAGCGTTGTTGGGCTGCATGGCGACGAGCTAAAAGTCGCCATCACCGC +CCCGCCGGTTGATGGGCAGGCTAATGCCCATCTGGTAAAAACTTTCTCGCCAAAC +>EYKX4VC01AZXC6 length=116 xy=0292_0280 region=1 run=R_2007_11_07_16_15_57_ +GGGGGCGTTTGGCCTGTCGTCCGGCACCTCGCAAGAGCTACAGCAGGCGCGGCTGGCGAT +CATCGGCGGCACGCCGGCCTATATGTCGCCGGAACACACCACCCGCACCCAACGCG +>EYKX4VC01CATH5 length=82 xy=0826_0843 region=1 run=R_2007_11_07_16_15_57_ +CGAAATTGCACATTCTCGGCCATATCTCTGGACCTACATGACCGATTTGATCATCTTCGA +ACTTAGCCTTCCTTTNTTAACG +>EYKX4VC01BCEIV length=47 xy=0434_0757 region=1 run=R_2007_11_07_16_15_57_ +TGACGTCGTGCCGAGCTACGACAATGCCGACATGGTGATCGTTAACA +>EYKX4VC01BWERM length=83 xy=0662_0304 region=1 run=R_2007_11_07_16_15_57_ +CGGTCGGCCTCACCATGGAGAAGATCCCGCCCCGGCCGAGGTCATGGTGGATCTCGGCCA +GGGCGTGCTGATGAAGTTCAAAT +>EYKX4VC01BT2O7 length=69 xy=0635_1945 region=1 run=R_2007_11_07_16_15_57_ +AGCGTTTCTCCAGCCGGTCGGCTACGCCGTTTGCCCCTGAAAGACGCTGTTCAGACCGAA +CGCGGTAAA +>EYKX4VC01BO0UO length=222 xy=0577_3838 region=1 run=R_2007_11_07_16_15_57_ +AGACCTGGGACAGCGGCGGGCTGCTGAAGCCGCAGGCGATAGAGGACAAACTGCAGTACC +GCTTCTGGCTGCACTATGCCGAAGGCTCGCTGATGCCGCTGCTGTTAATGAAGCTGGTGT +TCGCCAGCCTGGGTAAACCCCCTGTGCCCTTTGGCGTCCGCTCGCTGGGCGCCCTGCTGG +GCAAGGGCATTCAGAAAGCGTGGCTGGATCCCCAGCTGGCCA +>EYKX4VC01CBCPK length=83 xy=0832_1158 region=1 run=R_2007_11_07_16_15_57_ +CGGTCGGCCTCACCATGGAGAAGATCCCGCCCCGGCCGAGGTCATGGTGGATCTCGGCCA +GGGCGTGCTGATGAAGTTCAAAT +>EYKX4VC01B474S length=54 xy=0762_2010 region=1 run=R_2007_11_07_16_15_57_ +AGCAGTTTTCCAGCGCTTTCGAAGAGCGCTGGCGCGCGCGGGCTTCCAGCATAT +>EYKX4VC01BB4QL length=57 xy=0431_0363 region=1 run=R_2007_11_07_16_15_57_ +GGGGAGGAGCTAATAATATGCTCTTGGGGAGGAGCTAATTATATGCTCTTGGGGAGG +>EYKX4VC01BJ37M length=64 xy=0522_0192 region=1 run=R_2007_11_07_16_15_57_ +TCGAGTATGTATCAAGGACTACATACAAATTTGCCAAAAGAGATTATGCACTATCCCGAC +TTCC +>EYKX4VC01BV9R8 length=54 xy=0660_2038 region=1 run=R_2007_11_07_16_15_57_ +AAAACTCGGAGAAACTATTCAGCAGCACTGCGTTTCGCTGAATTTTAGACCGTT +>EYKX4VC01CEPP8 length=60 xy=0870_2350 region=1 run=R_2007_11_07_16_15_57_ +CTGGGTGGGTGCACTACAGGAACGTCATTTGTTCAATCCTCACGTTGTTGTTAGTGTCAG +>EYKX4VC01BTLME length=78 xy=0630_0292 region=1 run=R_2007_11_07_16_15_57_ +TTATCCACACGCTGTCCGGATCCAGCGCCAGGCGCCGACGCTGGACTTCCGCCGCCTGCG +CCCAGTTGCCCTGACTTC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/454.qual Mon May 19 12:34:17 2014 -0400 @@ -0,0 +1,52 @@ +>EYKX4VC01B65GS length=54 xy=0784_1754 region=1 run=R_2007_11_07_16_15_57_ +33 23 34 25 28 28 28 32 23 34 27 4 28 28 31 21 28 27 27 28 28 28 28 28 28 28 33 23 28 33 24 36 27 31 21 28 28 33 26 33 24 27 28 28 28 28 28 28 28 32 23 28 34 25 +>EYKX4VC01BNCSP length=187 xy=0558_3831 region=1 run=R_2007_11_07_16_15_57_ +27 35 26 25 37 28 37 28 25 28 27 36 27 28 36 27 28 28 27 36 27 30 19 27 28 36 28 23 36 27 27 28 27 27 28 37 29 27 26 27 24 24 36 27 26 28 36 28 24 25 21 28 24 28 26 34 25 26 43 36 +22 9 23 19 28 28 28 28 26 28 39 32 12 27 36 28 28 26 37 28 28 26 28 28 28 27 28 26 36 27 27 27 36 28 27 27 28 28 36 27 36 28 39 32 12 35 28 26 37 29 28 28 28 28 37 29 28 36 28 35 +26 27 37 29 28 26 28 36 28 26 24 38 32 11 28 26 32 24 36 32 18 2 27 25 33 26 32 28 6 18 22 26 17 15 14 28 20 8 22 21 14 22 26 16 26 16 28 20 22 27 18 27 18 27 28 27 20 25 34 27 +27 33 25 34 28 8 26 +>EYKX4VC01CD9FT length=115 xy=0865_1719 region=1 run=R_2007_11_07_16_15_57_ +35 24 16 9 2 27 39 33 13 36 27 36 27 28 28 28 27 28 28 33 23 37 28 28 28 36 27 28 28 28 28 36 27 28 28 28 27 28 28 28 28 28 28 28 37 28 28 28 28 37 28 26 28 36 27 28 28 28 28 28 +28 28 28 37 28 28 35 26 27 28 28 27 36 27 35 25 32 22 28 28 28 28 28 28 28 28 28 34 25 36 27 34 25 28 27 28 28 36 27 28 35 29 6 28 28 28 37 30 8 33 24 28 27 27 27 +>EYKX4VC01B8FW0 length=95 xy=0799_0514 region=1 run=R_2007_11_07_16_15_57_ +28 40 34 15 35 28 6 27 33 23 34 24 32 22 28 28 28 41 34 17 28 28 28 37 30 9 28 28 28 28 28 27 28 37 30 8 28 28 27 28 35 26 27 35 26 28 37 30 9 28 27 28 28 28 34 25 28 28 32 22 +26 28 28 28 28 27 43 36 23 12 1 28 21 28 27 16 28 32 23 27 28 27 28 28 27 28 28 28 32 22 28 26 26 27 28 +>EYKX4VC01BCGYW length=115 xy=0434_3926 region=1 run=R_2007_11_07_16_15_57_ +28 6 26 15 27 28 37 28 41 35 17 28 21 28 23 21 27 36 27 24 36 28 40 34 14 22 25 28 24 27 28 37 28 26 28 27 27 28 28 28 28 27 43 36 22 8 28 26 28 27 26 14 28 25 20 28 34 24 25 40 +33 18 1 19 27 16 36 28 36 28 21 27 25 41 34 16 22 28 37 29 26 26 35 27 28 26 41 34 16 28 28 27 28 37 29 25 43 36 23 12 1 11 39 32 12 28 17 20 28 28 17 36 29 7 24 +>EYKX4VC01AZXC6 length=116 xy=0292_0280 region=1 run=R_2007_11_07_16_15_57_ +35 24 17 11 5 26 24 40 33 14 34 25 33 24 28 27 27 26 28 28 33 24 36 27 28 27 36 27 27 28 27 28 35 26 27 27 28 27 28 28 28 28 28 27 28 36 27 28 28 28 37 28 27 26 35 26 27 28 28 28 +27 28 28 28 37 29 28 35 26 28 27 28 28 35 26 35 26 31 21 28 28 28 28 28 28 28 28 28 34 25 35 26 35 26 28 28 28 28 37 28 27 37 30 9 28 28 28 37 30 9 33 23 28 28 28 27 +>EYKX4VC01CATH5 length=82 xy=0826_0843 region=1 run=R_2007_11_07_16_15_57_ +28 28 41 35 17 33 24 28 27 28 28 28 36 27 28 28 28 36 27 34 25 27 28 28 28 28 28 28 28 37 28 27 35 25 28 26 28 27 28 28 24 36 27 26 26 37 30 9 28 28 28 28 28 25 25 35 26 26 27 35 +25 28 36 28 28 28 31 21 25 13 32 22 41 34 17 0 22 10 32 23 24 28 +>EYKX4VC01BCEIV length=47 xy=0434_0757 region=1 run=R_2007_11_07_16_15_57_ +28 28 26 26 28 26 28 27 28 25 32 22 27 26 25 27 28 28 27 26 27 28 32 23 28 28 34 25 27 22 26 26 27 28 17 28 28 28 28 28 28 34 24 35 25 28 28 +>EYKX4VC01BWERM length=83 xy=0662_0304 region=1 run=R_2007_11_07_16_15_57_ +28 36 27 28 28 35 26 34 24 28 28 28 32 22 28 28 32 23 28 28 32 23 27 28 27 34 27 3 27 43 36 22 9 35 26 37 29 26 27 32 23 28 28 27 28 36 27 28 36 27 28 28 28 28 28 35 26 34 25 28 +36 30 8 28 28 28 28 27 27 28 28 28 28 37 28 28 36 27 28 39 33 13 27 +>EYKX4VC01BT2O7 length=69 xy=0635_1945 region=1 run=R_2007_11_07_16_15_57_ +28 28 28 28 41 34 17 27 28 31 21 28 27 32 23 36 27 28 28 33 24 28 27 28 28 27 32 22 28 34 27 3 27 43 36 22 8 27 28 34 27 3 28 28 28 28 28 28 28 33 23 28 28 28 28 34 24 28 34 24 +28 28 27 36 27 28 37 30 9 +>EYKX4VC01BO0UO length=222 xy=0577_3838 region=1 run=R_2007_11_07_16_15_57_ +27 27 28 36 27 28 39 33 13 28 28 28 27 28 37 28 28 41 35 17 28 28 28 27 28 26 36 27 28 36 27 27 28 27 35 26 27 26 28 28 28 28 28 36 27 28 28 38 31 10 24 27 27 27 27 27 28 28 37 28 +27 28 35 26 28 28 36 27 28 28 27 28 28 28 28 28 28 27 36 28 27 36 27 37 28 27 28 27 28 28 28 27 28 28 27 36 27 26 27 28 28 28 28 28 37 28 37 29 25 28 36 27 28 27 28 34 27 26 24 34 +28 28 28 31 23 27 28 34 27 28 37 33 14 23 37 33 15 38 34 23 13 2 26 24 28 26 35 31 12 36 32 14 31 22 24 28 27 33 26 26 27 27 27 27 28 27 35 30 11 26 27 35 31 12 28 27 26 27 36 32 +14 27 34 27 37 33 15 27 27 34 28 27 23 27 35 31 11 27 28 28 26 34 26 27 28 34 28 28 28 39 35 22 9 27 27 23 27 35 28 34 27 27 +>EYKX4VC01CBCPK length=83 xy=0832_1158 region=1 run=R_2007_11_07_16_15_57_ +28 35 26 28 28 35 26 35 26 28 28 28 34 24 28 28 35 25 28 28 34 25 28 28 27 35 28 5 28 43 36 22 9 35 26 37 28 28 27 32 23 27 28 28 28 36 27 28 36 27 28 28 28 28 28 36 27 35 25 28 +37 30 9 28 28 28 28 28 28 28 28 28 28 36 27 28 35 26 28 38 31 10 28 +>EYKX4VC01B474S length=54 xy=0762_2010 region=1 run=R_2007_11_07_16_15_57_ +28 28 28 28 27 43 36 23 11 33 23 27 25 26 28 28 39 33 13 28 27 29 18 28 26 27 26 28 27 28 36 27 26 28 28 28 28 25 28 41 34 17 24 36 28 37 28 28 26 28 17 27 28 26 +>EYKX4VC01BB4QL length=57 xy=0431_0363 region=1 run=R_2007_11_07_16_15_57_ +36 24 15 7 28 33 26 28 27 27 26 29 18 28 35 26 28 26 28 25 27 27 28 36 27 41 34 20 5 27 36 28 28 28 27 28 32 22 34 25 28 28 28 28 26 28 27 28 36 27 40 34 18 3 28 37 28 +>EYKX4VC01BJ37M length=64 xy=0522_0192 region=1 run=R_2007_11_07_16_15_57_ +28 26 28 28 28 28 28 28 27 28 28 27 27 36 27 37 28 28 28 28 28 28 28 28 28 27 36 29 8 39 33 13 28 36 27 41 34 20 5 28 28 28 27 36 28 28 28 28 27 28 28 28 28 27 37 30 8 27 28 26 +33 26 35 26 +>EYKX4VC01BV9R8 length=54 xy=0660_2038 region=1 run=R_2007_11_07_16_15_57_ +41 34 19 4 27 28 28 30 20 28 28 34 27 4 28 28 27 34 25 27 28 28 28 28 28 28 28 28 28 28 28 28 38 31 11 27 28 28 28 28 37 28 40 33 18 2 24 15 25 24 12 26 34 27 +>EYKX4VC01CEPP8 length=60 xy=0870_2350 region=1 run=R_2007_11_07_16_15_57_ +26 21 40 34 17 26 36 29 8 26 28 22 26 28 28 20 24 28 34 26 23 11 28 28 26 27 26 40 33 14 27 35 26 26 23 10 28 31 21 28 23 27 23 28 36 27 26 36 28 27 36 28 28 27 25 27 27 27 26 28 +>EYKX4VC01BTLME length=78 xy=0630_0292 region=1 run=R_2007_11_07_16_15_57_ +36 27 25 24 33 23 28 26 28 28 28 28 27 27 26 36 27 36 28 28 28 36 27 28 28 27 27 36 28 28 37 29 28 26 36 27 27 28 27 27 28 27 36 28 28 28 36 27 36 27 28 36 28 25 36 28 28 28 27 28 +39 33 13 28 28 37 28 28 41 34 16 28 28 28 26 36 28 24
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/short_reads_trim_seq_out1.fasta Mon May 19 12:34:17 2014 -0400 @@ -0,0 +1,36 @@ +>EYKX4VC01B65GS length=54 xy=0784_1754 region=1 run=R_2007_11_07_16_15_57_ +TGCCGTGATGAGCGCCACCGGAACGAATTCGACTATGCCGAA +>EYKX4VC01BNCSP length=187 xy=0558_3831 region=1 run=R_2007_11_07_16_15_57_ +CAGGATTGATCGCCAGATCGGTCGGTGCGTCAGGCGGG +>EYKX4VC01CD9FT length=115 xy=0865_1719 region=1 run=R_2007_11_07_16_15_57_ +GGCCTGTCGTCCGGCACCTCGCAAGAGCTACAGCAGGCGCGGCTGGCGATCATCGGCGGCACGCCGGCCTATATGTCGCCGGAACACACCACC +>EYKX4VC01B8FW0 length=95 xy=0799_0514 region=1 run=R_2007_11_07_16_15_57_ +AGAGACCTGAATACGTCAAA +>EYKX4VC01BCGYW length=115 xy=0434_3926 region=1 run=R_2007_11_07_16_15_57_ +CTGCATGGCGACGAGCTAAA +>EYKX4VC01AZXC6 length=116 xy=0292_0280 region=1 run=R_2007_11_07_16_15_57_ +GGCCTGTCGTCCGGCACCTCGCAAGAGCTACAGCAGGCGCGGCTGGCGATCATCGGCGGCACGCCGGCCTATATGTCGCCGGAACACACCACC +>EYKX4VC01CATH5 length=82 xy=0826_0843 region=1 run=R_2007_11_07_16_15_57_ +TTGCACATTCTCGGCCATATCTCTGGACCTACATGACCGATT +>EYKX4VC01BCEIV length=47 xy=0434_0757 region=1 run=R_2007_11_07_16_15_57_ +TGACGTCGTGCCGAGCTACGACAATGCCGACATG +>EYKX4VC01BWERM length=83 xy=0662_0304 region=1 run=R_2007_11_07_16_15_57_ +GGCCGAGGTCATGGTGGATCTCGGCCAGG +>EYKX4VC01BT2O7 length=69 xy=0635_1945 region=1 run=R_2007_11_07_16_15_57_ +GACGCTGTTCAGACCGAACGCGGTAA +>EYKX4VC01BO0UO length=222 xy=0577_3838 region=1 run=R_2007_11_07_16_15_57_ +CTGCAGTACCGCTTCTGGCTGCACTATGCCGAAGGCTCGCTGATGCCGCTGCTGTTAATGAAGCTGGTGTTCGCCAGCCTGG +>EYKX4VC01CBCPK length=83 xy=0832_1158 region=1 run=R_2007_11_07_16_15_57_ +GGCCGAGGTCATGGTGGATCTCGGCCAGG +>EYKX4VC01B474S length=54 xy=0762_2010 region=1 run=R_2007_11_07_16_15_57_ +GAGCGCTGGCGCGCGCGG +>EYKX4VC01BB4QL length=57 xy=0431_0363 region=1 run=R_2007_11_07_16_15_57_ +AGGAGCTAATTATATGCTCTTGG +>EYKX4VC01BJ37M length=64 xy=0522_0192 region=1 run=R_2007_11_07_16_15_57_ +TCGAGTATGTATCAAGGACTACATACAA +>EYKX4VC01BV9R8 length=54 xy=0660_2038 region=1 run=R_2007_11_07_16_15_57_ +CTATTCAGCAGCACTGCGTT +>EYKX4VC01CEPP8 length=60 xy=0870_2350 region=1 run=R_2007_11_07_16_15_57_ +TCCTCACGTTGTTGTTAGTGTCAG +>EYKX4VC01BTLME length=78 xy=0630_0292 region=1 run=R_2007_11_07_16_15_57_ +TTATCCACACGCTGTCCGGATCCAGCGCCAGGCGCCGACGCTGGACTTCCGCCGCCTGCGCC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/short_reads_trim_seq_out2.fasta Mon May 19 12:34:17 2014 -0400 @@ -0,0 +1,62 @@ +>0 +GACTCATGATTTCTTACCTATTAGTGGTTGAACA +>1 +GTGATATGTATGTTGA +>2 +GTTGTCGATAGAACTTCATGTG +>3 +ACCAACCAGAACGTGAAAAAG +>4 +GTTTATGTTGGTTTCATGGTTT +>5 +GCTTTACCGTCTTTCCAGAAATTGTTCCAAGTATCG +>6 +GCTTGTTTACGAATTAAATCGAAGTGGACTGCTG +>7 +GTTATAACGCCGAAGCGGTAAAAATTTTTATTTTTT +>8 +GTTCTCACTTCTGTTACTCCAGCTTCTTCGGCACCT +>9 +GTGGCCTGTTGAT +>10_0 +GTGACCG +>10_1 +ATAAAGT +>11 +TCGCTACACGCAGGA +>12 +GCTCGTTATGGTTTCCGTTGCTGCCATCTCAAAAAC +>13 +GTTGACGGCCATAAGGCTG +>14 +GTCAAGGACTGGTTTAGATATGAGTCACATTTTGTT +>15 +GTGCTGAGTTTTTTTCTGTTACTGTG +>16 +GACCTTGCTGCTAAAGGTCTAGGAGCTAAAGAATGG +>17 +GGAAAATGAGAAAATTCGACCTATCCTTGCGCAGCT +>18 +GAGTCTCATTTTGCATCTCGGCAATCTCTTTCTGAT +>19 +GTCATAAGAGGTTTTACCTCCAAATGAAGAAATAAC +>20 +GCTGGTAATGGTGGTTTTTTTTTTTTTTTTTTT +>21 +GTTGAGGCTTGCGTTTATGGTACGCTGGACTTT +>22 +CAAGGT +>23 +GGCGACTTCACGCCAGAATACGAAA +>24 +GCTCATTCAGGCTTCTGCCGTTTTGGATTTAACCGA +>25 +GGGATGAACATAATAAGCAATGACG +>26 +GTATTTTACCAATGACCAAATCAAAGAAATGACTCG +>27 +GTTTTTAGTGAGTTGTTCCATTCTTTAGCTCCTAGA +>28 +AAGCTGTTGCCGA +>29 +GCGTACTTATTCGCCACCATGATTATTAC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/solexa.fasta Mon May 19 12:34:17 2014 -0400 @@ -0,0 +1,60 @@ +>0 +GACTCATGATTTCTTACCTATTAGTGGTTGAACATC +>1 +GTGATATGTATGTTGACGGCCATAAGGCTGCTTCTT +>2 +GTTGTCGATAGAACTTCATGTGCCTGTAAAACAAGT +>3 +ACCAACCAGAACGTGAAAAAGCGTCCTGCGTGTAGC +>4 +GTTTATGTTGGTTTCATGGTTTTGTCTAACTTTATC +>5 +GCTTTACCGTCTTTCCAGAAATTGTTCCAAGTATCG +>6 +GCTTGTTTACGAATTAAATCGAAGTGGACTGCTGGC +>7 +GTTATAACGCCGAAGCGGTAAAAATTTTTATTTTTT +>8 +GTTCTCACTTCTGTTACTCCAGCTTCTTCGGCACCT +>9 +GTGGCCTGTTGATTCTAAAGGTTAGTTTCTTCACGC +>10 +GTGACCGCATAAAGTGCACAACATGGAAATGAGGAC +>11 +GCAGATCGCTACACGCAGGACGCTTTTTCACGTTCT +>12 +GCTCGTTATGGTTTCCGTTGCTGCCATCTCAAAAAC +>13 +GTTGACGGCCATAAGGCTGCTTCTGACGTTCGTGAT +>14 +GTCAAGGACTGGTTTAGATATGAGTCACATTTTGTT +>15 +GTGCTGAGTTTTTTTCTGTTACTGTGACATTAATTT +>16 +GACCTTGCTGCTAAAGGTCTAGGAGCTAAAGAATGG +>17 +GGAAAATGAGAAAATTCGACCTATCCTTGCGCAGCT +>18 +GAGTCTCATTTTGCATCTCGGCAATCTCTTTCTGAT +>19 +GTCATAAGAGGTTTTACCTCCAAATGAAGAAATAAC +>20 +GCTGGTAATGGTGGTTTTTTTTTTTTTTTTTTTTTT +>21 +GTTGAGGCTTGCGTTTATGGTACGCTGGACTTTGTA +>22 +GAGGAGAGTGCAGGTATTAATATCAAGGTTTGTGAG +>23 +GGCGACTTCACGCCAGAATACGAAATACCAGGTATT +>24 +GCTCATTCAGGCTTCTGCCGTTTTGGATTTAACCGA +>25 +GGGATGAACATAATAAGCAATGACGGCAGCAATAAA +>26 +GTATTTTACCAATGACCAAATCAAAGAAATGACTCG +>27 +GTTTTTAGTGAGTTGTTCCATTCTTTAGCTCCTAGA +>28 +GTATTGATAAAGCTGTTGCCGATACTTAGCACTATT +>29 +GCGTACTTATTCGCCACCATGATTATTACCAGTGTT
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/solexa.qual Mon May 19 12:34:17 2014 -0400 @@ -0,0 +1,30 @@ + -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -15 15 -40 40 -40 -40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -5 5 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 21 -40 -21 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 12 -40 -40 -12 -36 -40 36 -40 -40 -40 40 -40 -4 4 -40 -40 -40 -40 -40 40 -40 -40 14 -14 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -25 25 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 34 -40 -34 40 -40 -40 -40 -40 -40 -40 40 -40 -25 25 -40 -40 -40 -40 40 -37 -40 37 -40 -40 7 -40 -7 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 38 -40 -40 -38 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 11 -16 -13 -22 -40 -40 40 -40 -40 -40 -40 40 + 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -33 33 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -25 25 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 27 -27 -5 5 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -37 37 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -25 25 40 -40 -40 -40 -40 -40 34 -34 -40 40 -40 -40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -2 2 -40 -40 35 -35 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 36 -40 -36 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 5 -5 -40 -28 -40 -16 -40 16 -40 40 -40 -40 + -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 28 -28 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 + -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 27 -27 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 14 -14 -40 40 -40 -40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -36 -40 -40 36 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 22 -22 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -6 6 -40 40 -40 -40 -40 -40 -40 40 3 -40 -40 -3 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -0 -40 -40 0 -40 -40 -40 40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -20 20 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 8 -40 -40 -8 -40 40 -40 -40 -40 -40 40 -40 -4 4 -40 -40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -1 1 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 28 -28 -40 -40 -40 40 -10 -40 10 -40 -40 40 -40 -40 40 -40 -40 -40 -40 2 -2 -40 40 -40 -40 -40 17 -40 -17 -40 -40 40 -40 -40 3 -3 -40 -40 -40 -40 -40 40 -28 -40 28 -40 -40 -40 40 -40 13 -26 -13 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 18 -18 40 -40 -40 -40 -10 -40 10 -40 -40 -40 40 -40 17 -40 -17 -40 -28 28 -40 -40 + -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 5 -40 -40 -5 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -10 10 -40 -40 -40 -40 40 -40 -40 28 -28 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 32 -32 -40 -40 -40 4 -40 -4 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 + -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 27 -27 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -15 15 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 32 -40 -40 -32 -40 -40 -40 40 + -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 25 -40 -40 -25 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -20 20 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -31 31 -40 -40 -40 -40 -40 40 -40 -23 23 -40 -40 -40 -40 40 -40 -40 40 -40 15 -15 -40 -40 -40 40 -40 -40 25 -40 -25 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 39 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 + -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 + -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 + -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 + -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 + -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -36 -40 36 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -24 -40 -40 24 -40 -40 -40 40 -14 -40 -40 14 -40 -40 -40 40 -40 -40 -40 40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 9 -9 -40 -40 -40 40 23 -40 -40 -23 + -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 20 -20 40 -40 -40 -40 -40 -10 10 -40 14 -40 -40 -14 -40 -40 40 -40 -40 -40 -40 40 -35 -40 35 -40 -40 38 -38 -40 40 -40 -40 -40 -40 -40 13 -13 -40 -40 40 -40 -40 -40 -40 40 29 -29 -40 -40 -40 -40 -40 40 -15 -40 -40 15 40 -40 -40 -40 40 -40 -40 -40 -23 -40 -40 23 40 -40 -40 -40 -1 -40 -40 1 -40 38 -38 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -9 9 -40 -40 -21 21 -40 -40 21 -21 -40 -40 -29 29 -40 -13 13 -40 40 -40 -40 -40 -40 -40 40 -40 + -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -3 3 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 12 -40 -40 -12 -10 -40 10 -40 -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -21 -40 -40 21 + -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 + -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -1 1 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -31 31 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 + -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 + -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 40 -40 -40 -29 29 -40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 36 -36 40 -40 -40 -40 + -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 20 -20 -40 -40 -40 -40 -40 40 3 -40 -40 -3 40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 -40 -40 33 -33 40 -40 -40 -40 -13 -40 -40 13 8 -8 -40 -40 -40 28 -28 -40 -29 -40 -40 29 -40 -40 -40 40 2 -40 -2 -26 -40 -28 27 -33 -1 0 -40 -35 31 -31 -40 -40 -40 40 -40 -40 -11 -40 -40 11 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 + -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 40 40 -40 -40 -40 -40 40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 38 -38 -40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 40 -40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40 -40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 40 -40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 40 -40 -40 -40 -40 -40 -40 40 -40 -40 -40 40 29 -40 -40 -29 -40 40 -40 -40 -40 10 -40 -10 40 -40 -40 -40 -40 -40 2 -2 -13 -40 -40 13 -40 -40 40 -40 -40 -40 -40 40 -40 -40 -40 40