package fr.ens.biologie.genomique.eoulsan.bio.readsfilters; import org.usadellab.trimmomatic.fastq.FastqRecord; import org.usadellab.trimmomatic.trim.AbstractSingleRecordTrimmer; import fr.ens.biologie.genomique.eoulsan.EoulsanException; import fr.ens.biologie.genomique.eoulsan.bio.ReadSequence; /** * This classe define an abstract trimmomatic ReadFilter that allow paired-end * and single-end. * @since 1.0 * @author du */ public abstract class AbstractTrimmomaticReadFilter extends AbstractReadFilter { private AbstractSingleRecordTrimmer trimmer; @Override public String getDescription() { return getName() + " Trimmomatic filter"; } @Override public void setParameter(final String key, final String value) throws EoulsanException { if ("arguments".equals(key)) { try { this.trimmer = createTrimmer(value == null ? "" : value); } catch (Exception e) { throw new EoulsanException("Invalid parameter: " + value, e); } } else { throw new EoulsanException( "Unknown parameter for " + getName() + " read filter: " + key); } } @Override public void init() { if (this.trimmer == null) { this.trimmer = createTrimmer(""); } } /** * Create a Trimmer object * @param trimmerArgs trimmer arguments * @return new sequence after trimmomatic */ protected abstract AbstractSingleRecordTrimmer createTrimmer( String trimmerArgs); @Override public boolean accept(final ReadSequence read) { // The sequence can not be empty if (read == null) { return false; } // Fastq record entry FastqRecord in = new FastqRecord(read.getName(), read.getSequence(), "", read.getQuality(), read.getFastqFormat().getAsciiOffset()); // Fastq record exit FastqRecord out = this.trimmer.processRecord(in); // The fastq record exit can not be empty if (out == null) { return false; } // update sequence and their quality after trimmomatic read.setSequence(out.getSequence()); read.setQuality(out.getQuality()); return true; } }