/* * Changelog: * - Piero Dalle Pezze: Added reports. * - Bart Ailey: Class creation. */ package uk.ac.babraham.BamQC.Modules; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; import javax.xml.stream.XMLStreamException; import net.sf.samtools.SAMRecord; import org.apache.log4j.Logger; import uk.ac.babraham.BamQC.DataTypes.Genome.AnnotationSet; import uk.ac.babraham.BamQC.Graphs.BarGraph; import uk.ac.babraham.BamQC.Report.HTMLReportArchive; import uk.ac.babraham.BamQC.Sequence.SequenceFile; /** * @author Bart Ailey * @author Piero Dalle Pezze * */ public class SequenceQualityDistribution extends AbstractQCModule { private static Logger log = Logger.getLogger(SequenceQualityDistribution.class); private List<Integer> distribution = new ArrayList<Integer>(); private double[] distributionDouble = null; /** * Constructor. */ public SequenceQualityDistribution() {} private void addAverage(int average) { if (average >= distribution.size()) { for (int i = distribution.size(); i < average; i++) { distribution.add(0); } distribution.add(1); } else { int existingValue = distribution.get(average); distribution.set(average, ++existingValue); } } @Override public void processSequence(SAMRecord read) { byte[] baseQuality = read.getBaseQualities(); int count = 0; int total = 0; for (byte quality : baseQuality) { total = total + quality; //log.debug(String.format("%d) int %d total %d", count, (int) quality, total)); count++; } int average = (int) Math.round((double) total / count); addAverage(average); log.debug("average = " + average); } @Override public JPanel getResultsPanel() { String[] label = new String[distribution.size()]; for (int i = 0; i < label.length; i++) { label[i] = Integer.toString(i); } distributionDouble = new double[distribution.size()]; int maxCount = 0; int i = 0; int total = 0; for (int count : distribution) { if (count > maxCount) maxCount = count; total += count; } for (int count : distribution) { distributionDouble[i++] = ( (double) count / total) * 100.0; } double maxVaule = ( (double) maxCount / total) * 100.0; String title = "Sequence Quality Distribution"; String xLabel = "Sequence Quality (Phred)"; String yLabel = "Percent of Reads"; return new BarGraph(distributionDouble, 0.0D, maxVaule, xLabel, yLabel, label, title); } @Override public void processFile(SequenceFile file) {} @Override public void processAnnotationSet(AnnotationSet annotation) { } @Override public String name() { return "Sequence Quality Distribution"; } @Override public String description() { return "Sequence Quality Distribution"; } @Override public void reset() { distribution = new ArrayList<Integer>(); } @Override public boolean raisesError() { return false; } @Override public boolean raisesWarning() { return false; } @Override public boolean needsToSeeSequences() { return true; } @Override public boolean needsToSeeAnnotation() { return false; } @Override public boolean ignoreInReport() { if(ModuleConfig.getParam("SequenceQualityDistribution", "ignore") > 0) return true; return false; } @Override public void makeReport(HTMLReportArchive report) throws XMLStreamException, IOException { super.writeDefaultImage(report, "sequence_quality_distribution.png", "Sequence Quality Distribution", 800, 600); if(distribution == null) { return; } StringBuffer sb = report.dataDocument(); sb.append("Sequence_quality_(phred)\tSequence_quality_distribution\n"); for (int i=0;i<distributionDouble.length;i++) { sb.append(i).append("\t").append(distributionDouble[i]).append("\n"); } } public List<Integer> getDistribution() { return distribution; } }