diff --git a/etc/versions b/etc/versions index 476c45ccbfd96078986b9c3dfeb348b42c5e6215..e9e6db733650269b69961ec002acba9a3dc000bb 100644 --- a/etc/versions +++ b/etc/versions @@ -1,4 +1,4 @@ Artemis Release 16.0.2 ACT Release 13.0.2 DNAPlotter Release 1.11 -BamView 1.2.10 \ No newline at end of file +BamView 1.2.11 \ No newline at end of file diff --git a/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java b/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java index 075eb56df9ab770c015688568d93a9f06bafbc96..78a02e0f36eabf66a566ca9f6cc91bcdcfa13098 100644 --- a/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java +++ b/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java @@ -149,9 +149,18 @@ public class AbstractGraphPanel extends JPanel * @param g2 */ protected void drawMax(Graphics2D g2) + { + drawMax(g2, (float)max/(float)windowSize); + } + + /** + * Draw maximum average value. + * @param g2 + */ + protected void drawMax(Graphics2D g2, float max) { DecimalFormat df = new DecimalFormat("0.#"); - String maxStr = df.format((float)max/(float)windowSize); + String maxStr = df.format(max); FontMetrics fm = getFontMetrics(getFont()); g2.setColor(Color.black); diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java index 8dcac2241bfff1a2dc22d206de234e7a296ef297..04bbb11257b4384f6382995b4029a5823205a61b 100644 --- a/uk/ac/sanger/artemis/components/alignment/BamView.java +++ b/uk/ac/sanger/artemis/components/alignment/BamView.java @@ -1946,7 +1946,7 @@ public class BamView extends JPanel coverageView.drawSelectionRange(g2, pixPerBase, start, end, getHeight(), Color.PINK); coverageView.draw(g2, getWidth(), hgt, hideBamList); if(!coverageView.isPlotHeatMap()) - coverageView.drawMax(g2); + coverageView.drawMax(g2, coverageView.getMaxCoverage()); } /** diff --git a/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java b/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java index 64dbaa55c31135c22c92026a2c9c02651bd3f1af..2d01720aecf3e6ad58cf335ca0acd6d1eba5323b 100644 --- a/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java +++ b/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java @@ -47,6 +47,7 @@ import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JSeparator; import javax.swing.JTextField; import uk.ac.sanger.artemis.components.Plot; @@ -71,11 +72,14 @@ import net.sf.samtools.SAMRecord; private List<String> selected = new Vector<String>(); private boolean showGrid = false; private boolean logScale = false; + private int maxCoverage = Integer.MAX_VALUE; + private JCheckBox fixHgt = new JCheckBox("Fix the graph height to cut-off", false); protected CoveragePanel(final BamView bamView) { this(); this.bamView = bamView; + setMaxBases = false; createMenus(popup); addMouseListener(new PopupListener()); } @@ -129,7 +133,18 @@ import net.sf.samtools.SAMRecord; if(!plotHeatMap) drawSelectionRange(g2, pixPerBase, start, end, getHeight(), Color.PINK); drawPlot(g2); - drawMax(g2); + drawMax(g2, getMaxCoverage()); + } + + protected float getMaxCoverage() + { + return (useMaxCutOff() ? maxCoverage: (float)max/(float)windowSize); + } + + private boolean useMaxCutOff() + { + return (maxCoverage < Integer.MAX_VALUE && maxCoverage < (float)max/(float)windowSize) || + (maxCoverage < Integer.MAX_VALUE && fixHgt.isSelected()); } protected void init(BamView bamView, float pixPerBase, int start, int end) @@ -187,7 +202,7 @@ import net.sf.samtools.SAMRecord; max = thisPlot[i][0]; } } - + draw(g2, getWidth(), getHeight(), null); } @@ -310,7 +325,12 @@ import net.sf.samtools.SAMRecord; { g2.setColor(line.getLineColour()); int hgt2 = hgt/2; - float maxVal = getValue(max, logScale); + float maxVal; + + if(useMaxCutOff()) + maxVal = getValue((maxCoverage*windowSize), logScale); + else + maxVal = getValue(max, logScale); if(line.getPlotType() == LineAttributes.PLOT_TYPES[0]) { @@ -538,25 +558,45 @@ import net.sf.samtools.SAMRecord; final GridBagConstraints c = new GridBagConstraints(); final JTextField newBaseMax = new JTextField(Integer.toString(bamView.getMaxBases()), 10); - c.gridy = 0; + c.gridy+=1; + c.gridwidth = 1; if(setMaxBases) { final JLabel labMax1 = new JLabel("Zoom level before switching"); final JLabel labMax2 = new JLabel("to coverage view (in bases):"); c.anchor = GridBagConstraints.WEST; + c.gridy+=1; opts.add(labMax1, c); - c.gridy = c.gridy+1; + c.gridy+=1; opts.add(labMax2, c); opts.add(newBaseMax, c); + addSeparator(c, opts); } + // cut-off + final JTextField maxCutoff = new JTextField( + (maxCoverage < Integer.MAX_VALUE ? Integer.toString(maxCoverage) : ""), 10); + c.gridy+=1; + c.anchor = GridBagConstraints.WEST; + opts.add(new JLabel("Coverage cut-off:"), c); + c.anchor = GridBagConstraints.EAST; + opts.add(maxCutoff, c); + + c.gridy+=1; + c.gridwidth = GridBagConstraints.REMAINDER; + c.anchor = GridBagConstraints.WEST; + opts.add(fixHgt, c); + + addSeparator(c, opts); + + // window size final JTextField newWinSize = new JTextField(Integer.toString(userWinSize), 10); final JLabel lab = new JLabel("Window size:"); lab.setEnabled(!autoWinSize); newWinSize.setEnabled(!autoWinSize); - c.gridy = c.gridy+1; - c.anchor = GridBagConstraints.EAST; + c.gridy+=1; + c.anchor = GridBagConstraints.WEST; opts.add(lab, c); opts.add(newWinSize, c); @@ -570,22 +610,24 @@ import net.sf.samtools.SAMRecord; } }); c.anchor = GridBagConstraints.WEST; - c.gridy = c.gridy+1; + c.gridy+=1; c.gridwidth = GridBagConstraints.REMAINDER; opts.add(autoSet, c); + addSeparator(c, opts); + final JCheckBox showCombined = new JCheckBox("Show combined plot", includeCombined); if(bamView.bamList.size() == 1) showCombined.setEnabled(false); - c.gridy = c.gridy+1; + c.gridy+=1; opts.add(showCombined, c); final JCheckBox byStrand = new JCheckBox("Plot by strand", plotByStrand); - c.gridy = c.gridy+1; + c.gridy+=1; opts.add(byStrand, c); final JCheckBox logMenu = new JCheckBox("Log scale", logScale); - c.gridy = c.gridy+1; + c.gridy+=1; opts.add(logMenu, c); String window_options[] = { "OK", "Cancel" }; @@ -601,10 +643,14 @@ import net.sf.samtools.SAMRecord; includeCombined = showCombined.isSelected(); plotByStrand = byStrand.isSelected(); logScale = logMenu.isSelected(); - + try { userWinSize = Integer.parseInt(newWinSize.getText().trim()); + if(maxCutoff.getText().length() > 0) + maxCoverage = Integer.parseInt(maxCutoff.getText().trim()); + else + maxCoverage = Integer.MAX_VALUE; if(setMaxBases) bamView.setMaxBases(Integer.parseInt(newBaseMax.getText().trim())); } @@ -614,6 +660,22 @@ import net.sf.samtools.SAMRecord; } } + /** + * Add a separator + * @param c + * @param opts + */ + private void addSeparator(GridBagConstraints c, final JPanel opts) + { + c.gridy+=1; + c.gridwidth = GridBagConstraints.REMAINDER; + final JSeparator sep = new JSeparator(); + c.fill = GridBagConstraints.HORIZONTAL; + opts.add(sep, c); + c.gridwidth = 1; + c.fill = GridBagConstraints.NONE; + } + /** * Click on heatmap * @param y