X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAppVarna.java;h=a50de77ae95ed0b247af8b94a86d52623ccc20b3;hb=136c0793b90b72b928c4d77dc109dd5c644e00d3;hp=dcb2a7ddea8ca0519fadc574e3e07400c0df4d55;hpb=528dcd143968fc270232e4cec64a79b447aa5ec6;p=jalview.git diff --git a/src/jalview/gui/AppVarna.java b/src/jalview/gui/AppVarna.java index dcb2a7d..a50de77 100644 --- a/src/jalview/gui/AppVarna.java +++ b/src/jalview/gui/AppVarna.java @@ -23,6 +23,7 @@ package jalview.gui; import jalview.analysis.AlignSeq; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenColumns; import jalview.datamodel.RnaViewerModel; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; @@ -43,8 +44,6 @@ import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.swing.JInternalFrame; import javax.swing.JSplitPane; @@ -66,8 +65,8 @@ public class AppVarna extends JInternalFrame implements SelectionListener, SecondaryStructureListener, InterfaceVARNASelectionListener, VamsasSource { - private static final Pattern PAIRS_PATTERN = Pattern - .compile("[^([{<>}])]"); + private static final byte[] PAIRS = new byte[] { '(', ')', '[', ']', '{', + '}', '<', '>' }; private AppVarnaBinding vab; @@ -183,8 +182,7 @@ public class AppVarna extends JInternalFrame implements SelectionListener, String theTitle = sname + (aa.sequenceRef == null ? " trimmed to " + seq.getName() : ""); theTitle = MessageManager.formatMessage("label.varna_params", - new String[] - { theTitle }); + new String[] { theTitle }); setTitle(theTitle); String gappedTitle = sname + " (with gaps)"; @@ -197,7 +195,6 @@ public class AppVarna extends JInternalFrame implements SelectionListener, vab.setSelectedIndex(0); } - /** * Constructor that links the viewer to a parent panel (but has no structures * yet - use addModel to add them) @@ -260,13 +257,6 @@ public class AppVarna extends JInternalFrame implements SelectionListener, showPanel(true); } - public String replaceOddGaps(String oldStr) - { - Matcher matcher = PAIRS_PATTERN.matcher(oldStr); - String newStr = matcher.replaceAll("."); - return newStr; - } - /** * Constructs a new RNA model from the given one, without gaps. Also * calculates and saves a 'shift list' @@ -282,7 +272,8 @@ public class AppVarna extends JInternalFrame implements SelectionListener, RNA rnaTrim = new RNA(name); try { - rnaTrim.setRNA(rna.getSeq(), replaceOddGaps(rna.getStructDBN())); + String structDBN = rna.getStructDBN(true); + rnaTrim.setRNA(rna.getSeq(), replaceOddGaps(structDBN)); } catch (ExceptionUnmatchedClosingParentheses e2) { e2.printStackTrace(); @@ -293,7 +284,7 @@ public class AppVarna extends JInternalFrame implements SelectionListener, String seq = rnaTrim.getSeq(); StringBuilder struc = new StringBuilder(256); - struc.append(rnaTrim.getStructDBN()); + struc.append(rnaTrim.getStructDBN(true)); int ofstart = -1; int sleng = seq.length(); @@ -306,7 +297,7 @@ public class AppVarna extends JInternalFrame implements SelectionListener, ofstart = i; } /* - * mark base or base pair in the structure with * + * mark base or base & pair in the structure with * */ if (!rnaTrim.findPair(i).isEmpty()) { @@ -410,7 +401,7 @@ public class AppVarna extends JInternalFrame implements SelectionListener, @Override public void selection(SequenceGroup seqsel, ColumnSelection colsel, - SelectionSource source) + HiddenColumns hidden, SelectionSource source) { if (source != ap.av) { @@ -685,7 +676,6 @@ public class AppVarna extends JInternalFrame implements SelectionListener, vab.setSelectedIndex(selectedIndex); } - /** * Add a model with associated Varna session file * @@ -723,4 +713,41 @@ public class AppVarna extends JInternalFrame implements SelectionListener, return null; } } + + /** + * Replace everything except RNA secondary structure characters with a period + * + * @param s + * @return + */ + public static String replaceOddGaps(String s) + { + if (s == null) + { + return null; + } + + // this is measured to be 10 times faster than a regex replace + boolean changed = false; + byte[] bytes = s.getBytes(); + for (int i = 0; i < bytes.length; i++) + { + boolean ok = false; + // todo check for ((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z')) if + // wanted also + for (int j = 0; !ok && (j < PAIRS.length); j++) + { + if (bytes[i] == PAIRS[j]) + { + ok = true; + } + } + if (!ok) + { + bytes[i] = '.'; + changed = true; + } + } + return changed ? new String(bytes) : s; + } }