diff --git a/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java b/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java index 17d9d1e01ee13e3bfade8a498ae07beb4ff48ee4..50e1dc6adaa65450887bd348b862e919b04c75a9 100644 --- a/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java +++ b/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java @@ -23,12 +23,16 @@ */ package uk.ac.sanger.artemis.components.alignment; +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.text.DecimalFormat; import javax.swing.JCheckBox; import javax.swing.JComponent; @@ -46,6 +50,9 @@ public class AbstractGraphPanel extends JPanel protected int end; protected float pixPerBase; + protected BamView bamView; + protected int windowSize; + protected int max; protected boolean autoWinSize = true; protected int userWinSize = 1; protected JPopupMenu popup = new JPopupMenu(); @@ -61,12 +68,13 @@ public class AbstractGraphPanel extends JPanel GridBagConstraints c = new GridBagConstraints(); JPanel pane = new JPanel(gridbag); final JTextField newWinSize = new JTextField(Integer.toString(userWinSize), 10); + newWinSize.setEnabled(!autoWinSize); final JLabel lab = new JLabel("Window size:"); c.gridy = 0; pane.add(lab, c); pane.add(newWinSize, c); - final JCheckBox autoSet = new JCheckBox("Automatically set window size", false); + final JCheckBox autoSet = new JCheckBox("Automatically set window size", autoWinSize); autoSet.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -102,6 +110,23 @@ public class AbstractGraphPanel extends JPanel addMouseListener(new PopupListener()); } + + /** + * Draw maximum average value. + * @param g2 + */ + protected void drawMax(Graphics2D g2) + { + DecimalFormat df = new DecimalFormat("0.#"); + String maxStr = df.format((float)max/(float)windowSize); + + FontMetrics fm = getFontMetrics(getFont()); + g2.setColor(Color.black); + + int xpos = bamView.getJspView().getVisibleRect().width - fm.stringWidth(maxStr) - + bamView.getJspView().getVerticalScrollBar().getWidth(); + g2.drawString(maxStr, xpos, fm.getHeight()); + } protected void setStartAndEnd(int start, int end) { diff --git a/uk/ac/sanger/artemis/components/alignment/SnpPanel.java b/uk/ac/sanger/artemis/components/alignment/SnpPanel.java index 453ae6faef7ccf9faf05ca888beeee404cdf448b..63b65f818f58999842b501b730511bdd8b9bc74b 100644 --- a/uk/ac/sanger/artemis/components/alignment/SnpPanel.java +++ b/uk/ac/sanger/artemis/components/alignment/SnpPanel.java @@ -26,7 +26,6 @@ package uk.ac.sanger.artemis.components.alignment; import java.awt.BasicStroke; import java.awt.Color; -import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; @@ -49,10 +48,10 @@ import net.sf.samtools.SAMRecord; public class SnpPanel extends AbstractGraphPanel { private static final long serialVersionUID = 1L; - private BamView bamView; - private Bases bases; private float minBaseQualityFilter = 0; + private int nBins; + private int snpCount[]; public SnpPanel(final BamView bamView, Bases bases) { @@ -96,16 +95,18 @@ import net.sf.samtools.SAMRecord; { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; - - if(bases == null) - return; - - List<SAMRecord> readsInView = bamView.getReadsInView(); - if(readsInView == null) + + if(bases == null || nBins == 0 || bamView.getReadsInView() == null) return; - - int windowSize; - + draw(g2); + drawMax(g2); + } + + protected void init(BamView bamView, float pixPerBase, int start, int end) + { + this.bamView = bamView; + setPixPerBase(pixPerBase); + setStartAndEnd(start, end); if(autoWinSize) { windowSize = (bamView.getBasesInView()/300); @@ -116,36 +117,13 @@ import net.sf.samtools.SAMRecord; if(windowSize < 1) windowSize = 1; - - int nBins = Math.round((end-start+1.f)/windowSize); - int max = drawPlot(g2, nBins, windowSize); - - String maxStr = Float.toString(max/windowSize); - FontMetrics fm = getFontMetrics(getFont()); - g2.setColor(Color.black); - - int xpos = getWidth() - fm.stringWidth(maxStr) - - bamView.getJspView().getVerticalScrollBar().getWidth(); - g2.drawString(maxStr, xpos, fm.getHeight()); + nBins = Math.round((end-start+1.f)/windowSize); + max = 0; + snpCount = null; } - - - private int drawPlot(Graphics2D g2, int nBins, int windowSize) - { - //lines = CoveragePanel.getLineAttributes(bamView.bamList.size()); - List<SAMRecord> readsInView = bamView.getReadsInView(); - - int snpCount[] = new int[nBins]; - for(int i=0; i<snpCount.length; i++) - snpCount[i] = 0; - - int max = 0; - for(int i=0; i<readsInView.size(); i++) - { - SAMRecord thisRead = readsInView.get(i); - max = calculateSNPs(thisRead, windowSize, nBins, snpCount, max); - } + protected void draw(Graphics2D g2) + { g2.setColor(Color.red); g2.setStroke(new BasicStroke(1.f)); @@ -182,8 +160,6 @@ import net.sf.samtools.SAMRecord; g2.drawLine(x0, y0, x1, y1); } } - - return max; } /** @@ -193,12 +169,15 @@ import net.sf.samtools.SAMRecord; * @param pixPerBase * @param ypos */ - private int calculateSNPs(SAMRecord thisRead, - int windowSize, - int nBins, - int[] snpCount, - int max) + protected void addRecord(SAMRecord thisRead) { + if(snpCount == null) + { + snpCount = new int[nBins]; + for(int i=0; i<snpCount.length; i++) + snpCount[i] = 0; + } + int thisStart = thisRead.getAlignmentStart(); int thisEnd = thisRead.getAlignmentEnd(); int offset = bamView.getSequenceOffset(thisRead.getReferenceName()); @@ -241,7 +220,5 @@ import net.sf.samtools.SAMRecord; { e.printStackTrace(); } - return max; } - } \ No newline at end of file