reads by quality score and length fastq_filter.py $input_file $fastq_filter_file $output_file $output_file.files_path '${input_file.extension[len( 'fastq' ):]}' int( float( value ) ) == float( value ) int( float( value ) ) == float( value ) def fastq_read_pass_filter( fastq_read ): def mean( score_list ): return float( sum( score_list ) ) / float( len( score_list ) ) if len( fastq_read ) < $min_size: return False if $max_size > 0 and len( fastq_read ) > $max_size: return False num_deviates = $max_num_deviants qual_scores = fastq_read.get_decimal_quality_scores() for qual_score in qual_scores: if qual_score < $min_quality or ( $max_quality > 0 and qual_score > $max_quality ): if num_deviates == 0: return False else: num_deviates -= 1 #if $paired_end.value == 'single_end': qual_scores_split = [ qual_scores ] #else: qual_scores_split = [ qual_scores[ 0:int( len( qual_scores ) / 2 ) ], qual_scores[ int( len( qual_scores ) / 2 ): ] ] #end if #for $fastq_filter in $fastq_filters: for split_scores in qual_scores_split: left_column_offset = $fastq_filter[ 'offset_type' ][ 'left_column_offset' ] right_column_offset = $fastq_filter[ 'offset_type' ][ 'right_column_offset' ] #if $fastq_filter[ 'offset_type' ]['base_offset_type'] == 'offsets_percent': left_column_offset = int( round( float( left_column_offset ) / 100.0 * float( len( split_scores ) ) ) ) right_column_offset = int( round( float( right_column_offset ) / 100.0 * float( len( split_scores ) ) ) ) #end if if right_column_offset > 0: split_scores = split_scores[ left_column_offset:-right_column_offset] else: split_scores = split_scores[ left_column_offset:] if split_scores: ##if a read doesn't have enough columns, it passes by default if not ( ${fastq_filter[ 'score_operation' ]}( split_scores ) $fastq_filter[ 'score_comparison' ] $fastq_filter[ 'score' ] ): return False #end for return True ret_val = fastq_read_pass_filter( fastq_read ) This tool allows you to build complex filters to be applied to each read in a FASTQ file. **Basic Options:** * You can specify a minimum and maximum read lengths. * You can specify minimum and maximum per base quality scores, with optionally specifying the number of bases that are allowed to deviate from this range (default of 0 deviant bases). * If your data is paired-end, select the proper checkbox; this will cause each read to be internally split down the middle and filters applied to each half using the offsets specified. **Advance Options:** * You can specify any number of advanced filters. * 5' and 3' offsets are defined, starting at zero, increasing from the respective end of the reads. For example, a quality string of "ABCDEFG", with 5' and 3' offsets of 1 and 1, respectively, specified will yield "BCDEF". * You can specify either absolute offset values, or percentage offset values. *Absolute Values* based offsets are useful for fixed length reads (e.g. Illumina or SOLiD data). *Percentage of Read Length* based offsets are useful for variable length reads (e.g. 454 data). When using the percent-based method, offsets are rounded to the nearest integer. * The user specifies the aggregating action (min, max, sum, mean) to perform on the quality score values found between the specified offsets to be used with the user defined comparison operation and comparison value. * If a set of offsets is specified that causes the remaining quality score list to be of length zero, then the read will **pass** the quality filter unless the size range filter is used to remove these reads. ----- .. class:: warningmark Adapter bases in color space reads are excluded from filtering.