Java 11 integration;
[jalview.git] / src2 / fr / orsay / lri / varna / factories / RNAAlignment.java
diff --git a/src2/fr/orsay/lri/varna/factories/RNAAlignment.java b/src2/fr/orsay/lri/varna/factories/RNAAlignment.java
new file mode 100644 (file)
index 0000000..0cbf17c
--- /dev/null
@@ -0,0 +1,106 @@
+package fr.orsay.lri.varna.factories;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Hashtable;
+import java.util.Stack;
+
+import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
+import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses;
+import fr.orsay.lri.varna.models.rna.RNA;
+
+/**
+ * BH SwingJS -- must explicitly check for array out of bounds
+ */
+public class RNAAlignment {
+   private ArrayList<String> _lst = new ArrayList<String> (); 
+   private Hashtable<String, Integer> _index = new Hashtable<String, Integer> ();
+   private Hashtable<String, String> _accession = new Hashtable<String, String> ();
+   private String _secStr = "";
+   
+   public void addSequence(String id, String s)
+   {
+          if (!_index.containsKey(id))
+          {
+                  _index.put(id,_lst.size());
+                  _lst.add(s);
+          }
+          _lst.set(_index.get(id),s);
+   }
+   
+   public void setSecStr(String s)
+   {
+          _secStr = s;
+   }
+   
+  public void setAccession(String id, String AC)
+  {
+         _accession.put(id,AC);
+  }
+   
+   public ArrayList<RNA> getRNAs() throws ExceptionUnmatchedClosingParentheses
+   {
+          ArrayList<RNA> result = new ArrayList<RNA>(); 
+          int[] str = RNAFactory.parseSecStr(_secStr);
+          ArrayList<String> ids = new ArrayList<String>(_index.keySet());
+          Collections.sort(ids,new Comparator<String>(){
+               public int compare(String o1, String o2) {
+                       return o1.compareToIgnoreCase(o2);
+               }});
+          for (String id: ids )
+          {
+                  int n = _index.get(id);
+                  String seq = _lst.get(n);
+                  if (seq.length() != str.length)
+                          throw new ArrayIndexOutOfBoundsException(); // BH SwingJS -- must explicitly check for array out of bounds
+                  String nseq ="";
+                  String nstr ="";
+                  for(int i=0;i<seq.length();i++)
+                  {
+                          char c = seq.charAt(i);
+                          int j = str[i];
+                          
+                          if (!(c=='.' || c==':' || c=='-'))
+                          {
+                                  nseq += c;
+                                  if (j==-1)
+                                  {
+                                          nstr += '.';
+                                  }
+                                  else
+                                  {
+                                          int cp = seq.charAt(j);
+                                          if (cp=='.' || cp==':' || cp=='-')
+                                          {
+                                                  nstr += '.';                                            
+                                          }
+                                          else
+                                          {
+                                                  nstr += _secStr.charAt(i);
+                                          }
+                                  }
+                          }
+                  }
+                  RNA r = new RNA();
+                  try {
+                       r.setRNA(nseq, nstr);
+                       r.setName(id);
+                       if (_accession.containsKey(id))
+                       {
+                               r.setID(_accession.get(id));
+                       }
+                       else
+                       {
+                               r.setID(id);
+                       }
+                       result.add(r);
+               } catch (ExceptionFileFormatOrSyntax e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+          }
+          return result;
+   }
+}