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;
SecondaryStructureListener, InterfaceVARNASelectionListener,
VamsasSource
{
- private static final Pattern PAIRS_PATTERN = Pattern
- .compile("[^([{<>}])]");
+ private static final byte[] PAIRS = new byte[]
+ { '(', ')', '[', ']', '{', '}', '<', '>' };
private AppVarnaBinding vab;
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'
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();
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();
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())
{
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;
+ }
}
--- /dev/null
+package jalview.gui;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertNull;
+import static org.testng.AssertJUnit.assertSame;
+
+import org.testng.annotations.Test;
+
+public class AppVarnaTest
+{
+ @Test
+ public void testReplaceOddGaps()
+ {
+ String struct = "{(<]}>)";
+ String replaced = AppVarna.replaceOddGaps(struct);
+ assertEquals(struct, replaced);
+ assertSame(struct, replaced);
+ assertEquals("..{.([.<.].}.>)",
+ AppVarna.replaceOddGaps("..{ ([*<-]?} >)"));
+ assertEquals("....", AppVarna.replaceOddGaps("cgta"));
+ assertEquals("", AppVarna.replaceOddGaps(""));
+ assertNull(AppVarna.replaceOddGaps(null));
+ }
+}