From 09441f80c87860cdeae589cd298df907d7d7074a Mon Sep 17 00:00:00 2001 From: tcarver <tjc> Date: Tue, 30 Apr 2013 16:21:15 +0100 Subject: [PATCH] adjustable read line height --- .../artemis/components/alignment/BamView.java | 134 ++++++++++++------ 1 file changed, 91 insertions(+), 43 deletions(-) diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java index e7e32f866..72d10b752 100644 --- a/uk/ac/sanger/artemis/components/alignment/BamView.java +++ b/uk/ac/sanger/artemis/components/alignment/BamView.java @@ -96,11 +96,14 @@ import javax.swing.JRadioButton; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JSeparator; +import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import org.apache.log4j.Level; @@ -251,6 +254,8 @@ public class BamView extends JPanel private ExecutorService bamReadTaskExecutor; private int MAX_COVERAGE = Integer.MAX_VALUE; + private float readLnHgt = 2.0f; + public static org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getLogger(BamView.class); @@ -1340,8 +1345,9 @@ public class BamView extends JPanel drawScale(g2, start, end, pixPerBase, getHeight()); final Stroke stroke = - new BasicStroke (1.3f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); + new BasicStroke (readLnHgt, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); g2.setStroke(stroke); + int ydiff = (int) Math.round(1.5*readLnHgt); final int scaleHeight; if(isShowScale()) @@ -1371,7 +1377,7 @@ public class BamView extends JPanel continue; g2.setColor(Color.black); - drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps); + drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps, ydiff); } continue; } @@ -1413,18 +1419,18 @@ public class BamView extends JPanel else g2.setColor(Color.blue); - drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps); - drawRead(g2, bamViewNextRecord, pixPerBase, ypos, baseAtStartOfView, getSNPs(samNextRecord)); + drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps, ydiff); + drawRead(g2, bamViewNextRecord, pixPerBase, ypos, baseAtStartOfView, getSNPs(samNextRecord), ydiff); } else { - drawLoneRead(g2, bamViewRecord, ypos, pixPerBase, baseAtStartOfView, scaleHeight, snps); + drawLoneRead(g2, bamViewRecord, ypos, pixPerBase, baseAtStartOfView, scaleHeight, snps, ydiff); i--; } } else { - drawLoneRead(g2, bamViewRecord, ypos, pixPerBase, baseAtStartOfView, scaleHeight, snps); + drawLoneRead(g2, bamViewRecord, ypos, pixPerBase, baseAtStartOfView, scaleHeight, snps, ydiff); } } @@ -1467,7 +1473,7 @@ public class BamView extends JPanel drawScale(g2, start, end, pixPerBase, getHeight()); final BasicStroke stroke = new BasicStroke( - 1.3f, + readLnHgt, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); g2.setStroke(stroke); @@ -1479,9 +1485,10 @@ public class BamView extends JPanel scaleHeight = 0; int ypos = (getHeight() - scaleHeight); - int ydiff = 2; + int ydiff = (int) Math.round(1.5*readLnHgt); + if(isOrientation) - ydiff= 4; + ydiff= 2*ydiff; int maxEnd = 0; int lstStart = 0; int lstEnd = 0; @@ -1546,7 +1553,7 @@ public class BamView extends JPanel if(ypos > r.getMaxY() || ypos < r.getMinY()) continue; - drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps); + drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps, ydiff); } } @@ -1572,7 +1579,7 @@ public class BamView extends JPanel { drawSelectionRange(g2, pixPerBase,start, end, Color.PINK); final BasicStroke stroke = new BasicStroke( - 1.3f, + readLnHgt, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); @@ -1580,14 +1587,16 @@ public class BamView extends JPanel drawScale(g2, start, end, pixPerBase, ((getHeight()+scaleHeight)/2)); int ymid = (getHeight()/ 2); - int ydiff = 2; + int ydiff = (int) Math.round(1.5*readLnHgt); if(isOrientation) - ydiff= 4; + ydiff= 2*ydiff; + + g2.setStroke(stroke); // positive strand - drawStrand(g2, false, scaleHeight, ymid-(scaleHeight/2), -ydiff, pixPerBase, stroke); + drawStrand(g2, false, scaleHeight, ymid-(scaleHeight/2), -ydiff, pixPerBase); // negative strand - drawStrand(g2, true, scaleHeight, ymid+(scaleHeight/2), ydiff, pixPerBase, stroke); + drawStrand(g2, true, scaleHeight, ymid+(scaleHeight/2), ydiff, pixPerBase); } @@ -1596,8 +1605,7 @@ public class BamView extends JPanel int scaleHeight, int ymid, int ystep, - float pixPerBase, - Stroke stroke) + float pixPerBase) { int hgt = getHeight(); int ypos = (hgt - scaleHeight); @@ -1666,7 +1674,7 @@ public class BamView extends JPanel if(ypos > r.getMaxY() || ypos < r.getMinY()) continue; - drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps); + drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps, ystep); } } } @@ -1731,10 +1739,9 @@ public class BamView extends JPanel } Collections.sort(pairedReads, new PairedReadComparator()); - Stroke originalStroke = new BasicStroke (1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); - Stroke stroke = - new BasicStroke (1.3f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); - g2.setStroke(stroke); + Stroke originalStroke = new BasicStroke (readLnHgt, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); + + g2.setStroke( new BasicStroke (1.3f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)); final int scaleHeight; if(isShowScale()) @@ -1742,9 +1749,9 @@ public class BamView extends JPanel else scaleHeight = 0; - int ydiff = 3; + int ydiff = (int) Math.round(2.3*readLnHgt); if(isOrientation) - ydiff= 5; + ydiff= 2*ydiff; int ypos = getHeight() - scaleHeight - ydiff; int lastEnd = 0; int baseAtStartOfView = getBaseAtStartOfView(); @@ -1826,9 +1833,9 @@ public class BamView extends JPanel else g2.setColor(Color.blue); - drawRead(g2, pr.sam1, pixPerBase, ypos, baseAtStartOfView, getSNPs(pr.sam1.sam)); + drawRead(g2, pr.sam1, pixPerBase, ypos, baseAtStartOfView, getSNPs(pr.sam1.sam), ydiff); if(pr.sam2 != null) - drawRead(g2, pr.sam2, pixPerBase, ypos, baseAtStartOfView, getSNPs(pr.sam2.sam)); + drawRead(g2, pr.sam2, pixPerBase, ypos, baseAtStartOfView, getSNPs(pr.sam2.sam), ydiff); } } @@ -1946,7 +1953,7 @@ public class BamView extends JPanel * @param stroke */ private void drawLoneRead(Graphics2D g2, BamViewRecord bamViewRecord, int ypos, - float pixPerBase, int baseAtStartOfView, int scaleHeight, List<Integer> snps) + float pixPerBase, int baseAtStartOfView, int scaleHeight, List<Integer> snps, int ydiff) { SAMRecord samRecord = bamViewRecord.sam; boolean offTheTop = false; @@ -1997,7 +2004,7 @@ public class BamView extends JPanel else g2.setColor(Color.blue); - drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps); + drawRead(g2, bamViewRecord, pixPerBase, ypos, baseAtStartOfView, snps, ydiff); /*if (isSNPs) showSNPsOnReads(g2, samRecord, pixPerBase, ypos, offset);*/ @@ -2108,7 +2115,8 @@ public class BamView extends JPanel final float pixPerBase, final int ypos, final int baseAtStartOfView, - final List<Integer> snps) + final List<Integer> snps, + final int ydiff) { SAMRecord thisRead = bamViewRecord.sam; int offset = getSequenceOffset(thisRead.getReferenceName()); @@ -2121,7 +2129,7 @@ public class BamView extends JPanel { Stroke originalStroke = g2.getStroke(); Stroke stroke = - new BasicStroke (3.f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); + new BasicStroke (readLnHgt*1.6f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND); g2.setStroke(stroke); Color c = g2.getColor(); g2.setColor(Color.black); @@ -2159,7 +2167,7 @@ public class BamView extends JPanel } if(isOrientation) - drawArrow(g2, thisRead, thisStart, thisEnd, pixPerBase, ypos); + drawArrow(g2, thisRead, thisStart, thisEnd, pixPerBase, ypos, ydiff); // test if the mouse is over this read if(lastMousePoint != null) @@ -2185,22 +2193,28 @@ public class BamView extends JPanel * @param pixPerBase * @param ypos */ - private void drawArrow(Graphics2D g2, - SAMRecord thisRead, - int thisStart, - int thisEnd, - float pixPerBase, - int ypos) + private void drawArrow(final Graphics2D g2, + final SAMRecord thisRead, + final int thisStart, + final int thisEnd, + final float pixPerBase, + int ypos, + int ydiff) { + if(ydiff < 0) + ydiff = -ydiff; + if(thisRead.getReadNegativeStrandFlag()) { - int apos = ypos + 2; + ypos-=readLnHgt/2; + int apos = ypos + ydiff - 1; g2.drawLine((int)( (thisStart+5) * pixPerBase), apos, (int)( thisStart * pixPerBase), ypos); } else { - int apos = ypos - 2; + ypos+=readLnHgt/2; + int apos = ypos - ydiff + 1; g2.drawLine((int)( (thisEnd-5) * pixPerBase), apos, (int)( thisEnd * pixPerBase), ypos); } @@ -2279,12 +2293,20 @@ public class BamView extends JPanel */ private void showSNPsOnReads(final List<Integer> snps, final Graphics2D g2, - float pixPerBase, int ypos) + float pixPerBase, final int ypos) { + final Stroke originalStroke = g2.getStroke(); + final BasicStroke stroke = new BasicStroke( + 1.3f, + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER); + g2.setStroke(stroke); + g2.setColor(Color.red); for(int pos: snps) g2.drawLine((int) (pos * pixPerBase), ypos + 2, (int) (pos * pixPerBase), ypos - 2); + g2.setStroke(originalStroke); } @@ -3160,22 +3182,30 @@ public class BamView extends JPanel { lastMousePoint = e.getPoint(); - int thisHgt = HEIGHT; + int thisHgt = HEIGHT-2; if (thisHgt < 5) thisHgt = 15; int y = (int) (e.getY() - jspView.getViewport().getViewRect().getY()); + Point p = jspView.getViewport().getViewPosition(); + boolean isVis = topPanel.isVisible(); + if (y < thisHgt) { topPanel.setVisible(true); + if(!isVis) + p.y += topPanel.getHeight(); } else { if (buttonAutoHide.isSelected()) - topPanel.setVisible(false); + topPanel.setVisible(false); } + + if(topPanel.isVisible()) + jspView.getViewport().setViewPosition(p); mainPanel.repaint(); - mainPanel.revalidate(); + //mainPanel.revalidate(); } }; addMouseMotionListener(mouseMotionListener); @@ -3249,6 +3279,18 @@ public class BamView extends JPanel topPanel.add(buttonAutoHide); + + final JSlider slider = new JSlider(13, 52, (int) (readLnHgt*10)); + slider.addChangeListener(new ChangeListener(){ + public void stateChanged(ChangeEvent arg0) + { + readLnHgt = (slider.getValue()/10.f); + repaintBamView(); + } + }); + topPanel.add(new JLabel(" Read Line Height:")); + topPanel.add(slider); + if(feature_display != null) { JButton close = new JButton("Close"); @@ -3257,6 +3299,12 @@ public class BamView extends JPanel { public void actionPerformed(ActionEvent e) { + int status = JOptionPane.showConfirmDialog(frame, + "Close the BAM panel?", "Close", + JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if(status == JOptionPane.CANCEL_OPTION) + return; + final JPanel containerPanel = (JPanel) mainPanel.getParent(); feature_display.removeDisplayAdjustmentListener(BamView.this); feature_display.getSelection().removeSelectionChangeListener(BamView.this); -- GitLab