Quality trimming in R using ShortRead and Biostrings
I wrote an R function to do soft-trimming, right clipping FastQ reads based on quality.
This function has the option of leaving out sequences trimmed to extinction and will do left-side fixed trimming as well.
To use:
This function has the option of leaving out sequences trimmed to extinction and will do left-side fixed trimming as well.
#softTrim #trim first position lower than minQuality and all subsequent positions #omit sequences that after trimming are shorter than minLength #left trim to firstBase, (1 implies no left trim) #input: ShortReadQ reads # integer minQuality # integer firstBase # integer minLength #output: ShortReadQ trimmed reads library("ShortRead") softTrim<-function(reads,minQuality,firstBase=1,minLength=5){ qualMat<-as(FastqQuality(quality(quality(reads))),'matrix') qualList<-split(qualMat,row(qualMat)) ends<-as.integer(lapply(qualList, function(x){which(x < minQuality)[1]-1})) #length=end-start+1, so set start to no more than length+1 to avoid negative-length starts<-as.integer(lapply(ends,function(x){min(x+1,firstBase)})) #use whatever QualityScore subclass is sent newQ<-ShortReadQ(sread=subseq(sread(reads),start=starts,end=ends), quality=new(Class=class(quality(reads)), quality=subseq(quality(quality(reads)), start=starts,end=ends)), id=id(reads)) #apply minLength using srFilter lengthCutoff <- srFilter(function(x) { width(x)>=minLength },name="length cutoff") newQ[lengthCutoff(newQ)] }
To use:
library("ShortRead") source("softTrimFunction.R") #or whatever you want to name this reads<-readFastq("myreads.fq") trimmedReads<-softTrim(reads=reads,minQuality=5,firstBase=4,minLength=3) writeFastq(trimmedReads,file="trimmed.fq")I strongly recommend reading the excellent UC Riverside HT-Sequencing Wiki cookbook and tutorial if you wish to venture into using R for NGS handling. Among other things, it will explain how to perform casting if you have Solexa scaled (base 64) fastq files. The function should respect that. http://manuals.bioinformatics.ucr.edu/home/ht-seq
glad to see my code in use! .. but please note that the behavior is a little different from Heng Li's trimming. Mine will trim down to 1 base, whereas bwa "soft clipping" will trim down to a minimum (35) but no more. I like mine, as bad sequences will then naturally fall out of consideration with velvet de novo assembly ... they may still be mapped by bwa, but one can ignore non-unique mappings (as they're likely to be if trimmed down to < 20nt). But trimming strategy is certainly open for debate ...
ReplyDeletelooks like the UCR people have added a similar recipe:
ReplyDeletehttp://manuals.bioinformatics.ucr.edu/home/ht-seq#TOC-Trimming-Low-Quality-3-Tails-from-R
Thanks for the script. It works very well.
ReplyDelete