Skip to content
Snippets Groups Projects
Commit 3e425945 authored by tjc's avatar tjc
Browse files

add a coverage plot to the read alignment

git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@11904 ee4ac58c-ac51-4696-9907-e4b3aa274f04
parent 3a4e1aa4
No related branches found
No related tags found
No related merge requests found
...@@ -49,6 +49,7 @@ import java.awt.event.MouseEvent; ...@@ -49,6 +49,7 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener; import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener; import java.awt.event.WindowFocusListener;
import java.awt.geom.GeneralPath;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -122,10 +123,12 @@ public class JamView extends JPanel ...@@ -122,10 +123,12 @@ public class JamView extends JPanel
private boolean isSingle = false; private boolean isSingle = false;
private boolean isSNPs = false; private boolean isSNPs = false;
private boolean isStackView = false; private boolean isStackView = false;
private boolean isCoverage = false;
private FeatureDisplay feature_display; private FeatureDisplay feature_display;
private Selection selection; private Selection selection;
private JPanel mainPanel; private JPanel mainPanel;
private CoveragePanel coveragePanel;
private boolean showScale = true; private boolean showScale = true;
private Ruler ruler = new Ruler(); private Ruler ruler = new Ruler();
private int nbasesInView; private int nbasesInView;
...@@ -404,6 +407,13 @@ public class JamView extends JPanel ...@@ -404,6 +407,13 @@ public class JamView extends JPanel
drawLineView(g2, seqLength, pixPerBase, start, end); drawLineView(g2, seqLength, pixPerBase, start, end);
else else
drawStackView(g2, seqLength, pixPerBase, start, end); drawStackView(g2, seqLength, pixPerBase, start, end);
if(isCoverage)
{
coveragePanel.setStartAndEnd(start, end);
coveragePanel.setPixPerBase(pixPerBase);
coveragePanel.repaint();
}
} }
} }
...@@ -956,8 +966,6 @@ public class JamView extends JPanel ...@@ -956,8 +966,6 @@ public class JamView extends JPanel
final FeatureDisplay feature_display) final FeatureDisplay feature_display)
{ {
this.mainPanel = mainPanel; this.mainPanel = mainPanel;
final JComponent topPanel; final JComponent topPanel;
if(feature_display != null) if(feature_display != null)
{ {
...@@ -1085,7 +1093,12 @@ public class JamView extends JPanel ...@@ -1085,7 +1093,12 @@ public class JamView extends JPanel
if(topPanel instanceof JPanel) if(topPanel instanceof JPanel)
mainPanel.add(topPanel, BorderLayout.NORTH); mainPanel.add(topPanel, BorderLayout.NORTH);
mainPanel.add(jspView, BorderLayout.CENTER); mainPanel.add(jspView, BorderLayout.CENTER);
coveragePanel = new CoveragePanel();
mainPanel.add(coveragePanel, BorderLayout.SOUTH);
coveragePanel.setPreferredSize(new Dimension(900, 100));
coveragePanel.setVisible(false);
jspView.getVerticalScrollBar().setValue( jspView.getVerticalScrollBar().setValue(
jspView.getVerticalScrollBar().getMaximum()); jspView.getVerticalScrollBar().getMaximum());
...@@ -1168,6 +1181,19 @@ public class JamView extends JPanel ...@@ -1168,6 +1181,19 @@ public class JamView extends JPanel
} }
}); });
view.add(checkBoxStackView); view.add(checkBoxStackView);
JCheckBoxMenuItem checkBoxCoverage = new JCheckBoxMenuItem("Coverage");
checkBoxCoverage.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
isCoverage = !isCoverage;
coveragePanel.setVisible(isCoverage);
repaint();
}
});
view.add(checkBoxCoverage);
} }
public void setVisible(boolean visible) public void setVisible(boolean visible)
...@@ -1403,6 +1429,83 @@ public class JamView extends JPanel ...@@ -1403,6 +1429,83 @@ public class JamView extends JPanel
return selection; return selection;
} }
private class CoveragePanel extends JPanel
{
private static final long serialVersionUID = 1L;
private int start;
private int end;
private float pixPerBase;
public CoveragePanel()
{
super();
setBackground(Color.white);
}
/**
* Override
*/
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
if(readsInView == null)
return;
int windowSize = 10;
int nBins = Math.round((end-start+1.f)/windowSize);
float coverage[] = new float[nBins];
for(int i=0; i<coverage.length; i++)
coverage[i] = 0.f;
float max = 0.f;
for(int i=0; i<readsInView.size(); i++)
{
SAMRecord thisRead = readsInView.get(i);
int length = thisRead.getReadLength();
for(int j=0; j<length;j++)
{
int bin =
Math.round(((thisRead.getAlignmentStart()-start) + j) / windowSize);
if(bin < 0 || bin > coverage.length-1)
continue;
coverage[bin]+=1;
if(coverage[bin] > max)
max = coverage[bin];
}
}
g2.setColor(Color.blue);
GeneralPath shape = new GeneralPath();
shape.moveTo(0,getHeight());
for(int i=0; i<coverage.length; i++)
{
float xpos = ((i*(windowSize)) - windowSize/2.f)*pixPerBase;
shape.lineTo(xpos,
getHeight() - ((coverage[i]/max)*getHeight()));
}
shape.lineTo(getWidth(),getHeight());
g2.fill(shape);
}
protected void setStartAndEnd(int start, int end)
{
this.start = start;
this.end = end;
}
public void setPixPerBase(float pixPerBase)
{
this.pixPerBase = pixPerBase;
}
}
private class Ruler extends JPanel private class Ruler extends JPanel
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
...@@ -1575,6 +1678,13 @@ public class JamView extends JPanel ...@@ -1575,6 +1678,13 @@ public class JamView extends JPanel
} }
} }
public void selectionChanged(SelectionChangeEvent event)
{
repaint();
}
public static void main(String[] args) public static void main(String[] args)
{ {
String bam = args[0]; String bam = args[0];
...@@ -1624,8 +1734,5 @@ public class JamView extends JPanel ...@@ -1624,8 +1734,5 @@ public class JamView extends JPanel
frame.setVisible(true); frame.setVisible(true);
} }
public void selectionChanged(SelectionChangeEvent event)
{
repaint();
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment