diff --git a/uk/ac/sanger/artemis/components/variant/VCFview.java b/uk/ac/sanger/artemis/components/variant/VCFview.java index 33f34f6ead66119419a2e1a486b84964f36546b6..f3c1367f39951ef5f284c7edcc9cb7496e918348 100644 --- a/uk/ac/sanger/artemis/components/variant/VCFview.java +++ b/uk/ac/sanger/artemis/components/variant/VCFview.java @@ -132,6 +132,8 @@ public class VCFview extends JPanel private boolean showDeletions = true; private boolean showInsertions = true; private boolean showMultiAlleles = true; + // show variants that do not overlap CDS + private boolean showNonOverlappings = true; private float MIN_QUALITY = -10; private Pattern multiAllelePattern = Pattern.compile("^[AGCT],[AGCT,]+$"); @@ -333,8 +335,12 @@ public class VCFview extends JPanel // popup menu popup = new JPopupMenu(); + + JMenu showMenu = new JMenu("Show"); + popup.add(showMenu); + final JCheckBoxMenuItem showSyn = new JCheckBoxMenuItem( - "Show synonymous", showSynonymous); + "Synonymous", showSynonymous); showSyn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { @@ -342,10 +348,10 @@ public class VCFview extends JPanel repaint(); } }); - popup.add(showSyn); + showMenu.add(showSyn); final JCheckBoxMenuItem showNonSyn = new JCheckBoxMenuItem( - "Show non-synonymous", showNonSynonymous); + "Non-synonymous", showNonSynonymous); showNonSyn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { @@ -353,11 +359,11 @@ public class VCFview extends JPanel repaint(); } }); - popup.add(showNonSyn); + showMenu.add(showNonSyn); final JCheckBoxMenuItem showDeletionsMenu = new JCheckBoxMenuItem( - "Show deletions", showDeletions); + "Deletions", showDeletions); showDeletionsMenu.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { @@ -365,10 +371,10 @@ public class VCFview extends JPanel repaint(); } }); - popup.add(showDeletionsMenu); + showMenu.add(showDeletionsMenu); final JCheckBoxMenuItem showInsertionsMenu = new JCheckBoxMenuItem( - "Show insertions", showInsertions); + "Insertions", showInsertions); showInsertionsMenu.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { @@ -376,10 +382,10 @@ public class VCFview extends JPanel repaint(); } }); - popup.add(showInsertionsMenu); + showMenu.add(showInsertionsMenu); final JCheckBoxMenuItem showMultiAllelesMenu = new JCheckBoxMenuItem( - "Show multiple alleles", showMultiAlleles); + "Multiple alleles", showMultiAlleles); showMultiAllelesMenu.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { @@ -387,8 +393,18 @@ public class VCFview extends JPanel repaint(); } }); - popup.add(showMultiAllelesMenu); - popup.addSeparator(); + showMenu.add(showMultiAllelesMenu); + + final JCheckBoxMenuItem showNonOverlappingsMenu = new JCheckBoxMenuItem( + "Varaints not overlapping CDS", showNonOverlappings); + showNonOverlappingsMenu.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) + { + showNonOverlappings = showNonOverlappingsMenu.isSelected(); + repaint(); + } + }); + showMenu.add(showNonOverlappingsMenu); final JMenuItem filterByQuality = new JMenuItem("Filter by quality"); filterByQuality.addActionListener(new ActionListener(){ @@ -397,7 +413,6 @@ public class VCFview extends JPanel // String inputValue = JOptionPane.showInputDialog(null, "Enter a minimum quality score:", MIN_QUALITY); - if(inputValue == null) return; try @@ -667,6 +682,9 @@ public class VCFview extends JPanel if(!showInsertions && isInsertion(variant)) return false; + if(!showNonOverlappings && !isOverlappingFeature(features, basePosition)) + return false; + if( (!showSynonymous || !showNonSynonymous) && !isDeletion(variant) && !isInsertion(variant) && variant.length() == 1) { @@ -683,6 +701,25 @@ public class VCFview extends JPanel return true; } + private boolean isOverlappingFeature(FeatureVector features, int basePosition) + { + for(int i = 0; i<features.size(); i++) + { + Feature feature = features.elementAt(i); + if(feature.getRawFirstBase() < basePosition && feature.getRawLastBase() > basePosition) + { + RangeVector ranges = feature.getLocation().getRanges(); + for(int j=0; j< ranges.size(); j++) + { + Range range = (Range) ranges.get(j); + if(range.getStart() < basePosition && range.getEnd() > basePosition) + return true; + } + } + } + return false; + } + private void drawVariantCall(Graphics g, String line, int start, int index, float pixPerBase, FeatureVector features) { String parts[] = line.split("\\t");