Old MSF Format writer now renamed.
authorjprocter <Jim Procter>
Fri, 27 May 2005 09:29:27 +0000 (09:29 +0000)
committerjprocter <Jim Procter>
Fri, 27 May 2005 09:29:27 +0000 (09:29 +0000)
src/jalview/io/PileUpfile.java [new file with mode: 0755]

diff --git a/src/jalview/io/PileUpfile.java b/src/jalview/io/PileUpfile.java
new file mode 100755 (executable)
index 0000000..387596d
--- /dev/null
@@ -0,0 +1,248 @@
+package jalview.io;
+
+/**
+ * <p>Title: </p>
+ *  PileUpfile
+ * <p>Description: </p>
+ *
+ *  Read and write PileUp style MSF Files.
+ *  This used to be the MSFFile class, and was written according to the EBI's idea
+ *  of a subset of the MSF alignment format. But, that was updated to reflect current
+ *  GCG style IO fashion, as found in Emboss (thanks David Martin!)
+ *
+ **/
+
+
+import jalview.datamodel.*;
+import jalview.util.*;
+
+import java.io.*;
+import java.util.*;
+
+
+public class PileUpfile
+    extends AlignFile
+{
+
+public PileUpfile()
+{}
+
+public PileUpfile(String inStr) {
+  super(inStr);
+}
+
+public PileUpfile(String inFile, String type) throws IOException {
+  super(inFile,type);
+}
+
+public void parse() {
+
+  int       i       = 0;
+  boolean   seqFlag = false;
+  String    key     = new String();
+  Vector    headers = new Vector();
+  Hashtable seqhash = new Hashtable();
+  String    line;
+
+  try {
+  while ((line = nextLine()) != null) {
+
+    StringTokenizer str = new StringTokenizer(line);
+
+    while (str.hasMoreTokens()) {
+
+      String inStr = str.nextToken();
+
+      //If line has header information add to the headers vector
+      if (inStr.indexOf("Name:") != -1) {
+        key = str.nextToken();
+        headers.addElement(key);
+      }
+
+      //if line has // set SeqFlag to 1 so we know sequences are coming
+      if (inStr.indexOf("//") != -1) {
+        seqFlag = true;
+      }
+
+      //Process lines as sequence lines if seqFlag is set
+      if (( inStr.indexOf("//") == -1) && (seqFlag == true)) {
+        //seqeunce id is the first field
+        key = inStr;
+        StringBuffer tempseq;
+
+        //Get sequence from hash if it exists
+        if (seqhash.containsKey(key)) {
+          tempseq = (StringBuffer)seqhash.get(key);
+        } else {
+          tempseq = new StringBuffer();
+          seqhash.put(key,tempseq);
+        }
+
+        //loop through the rest of the words
+        while (str.hasMoreTokens()) {
+          //append the word to the sequence
+          tempseq.append(str.nextToken());
+        }
+      }
+    }
+  }
+  } catch (IOException e) {
+    System.err.println("Exception parsing PileUpfile " + e);
+    e.printStackTrace();
+  }
+
+  this.noSeqs = headers.size();
+
+  //Add sequences to the hash
+  for (i = 0; i < headers.size(); i++ ) {
+
+    if ( seqhash.get(headers.elementAt(i)) != null) {
+      String head =  headers.elementAt(i).toString();
+      String seq  =  seqhash.get(head).toString();
+
+      int start = 1;
+      int end = seq.length();
+
+      if (maxLength <  head.length() ) {
+        maxLength =  head.length();
+      }
+
+      if (head.indexOf("/") > 0 ) {
+
+        StringTokenizer st = new StringTokenizer(head,"/");
+
+        if (st.countTokens() == 2) {
+
+          head = st.nextToken();
+          String tmp = st.nextToken();
+          st = new StringTokenizer(tmp,"-");
+          if (st.countTokens() == 2) {
+            start = Integer.valueOf(st.nextToken()).intValue();
+            end = Integer.valueOf(st.nextToken()).intValue();
+          }
+        }
+      }
+
+      Sequence newSeq = new Sequence(head,seq,start,end);
+
+      seqs.addElement(newSeq);
+
+    } else {
+      System.err.println("PileUpfile Parser: Can't find sequence for " + headers.elementAt(i));
+    }
+  }
+
+}
+
+public static int checkSum(String seq) {
+  //String chars =  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.*~&@";
+  int check = 0;
+
+  String index =  "--------------------------------------&---*---.-----------------@ABCDEFGHIJKLMNOPQRSTUVWXYZ------ABCDEFGHIJKLMNOPQRSTUVWXYZ----@";
+  index += "--------------------------------------------------------------------------------------------------------------------------------";
+
+  for(int i = 0; i < seq.length(); i++) {
+    try {
+      if (i <seq.length()) {
+        int pos = index.indexOf(seq.substring(i,i+1));
+        if (!index.substring(pos,pos+1).equals("_")) {
+          check += ((i % 57) + 1) * pos;
+        }
+      }
+    } catch (Exception e) {
+      System.err.println("Exception during MSF Checksum calculation");
+      e.printStackTrace();
+    }
+  }
+  return check % 10000;
+}
+
+public static String print(SequenceI[] s) {
+  StringBuffer out = new StringBuffer("PileUp\n\n");
+
+  int max = 0;
+  int maxid = 0;
+
+  int i = 0;
+  String big = "";
+  while (i < s.length && s[i] != null) {
+    big += s[i].getSequence();
+    i++;
+  }
+  i = 0;
+  int bigcheck = checkSum(big);
+
+  out.append("   MSF: " + s[0].getSequence().length() + "   Type: P    Check:  " + bigcheck + "   ..\n\n\n");
+
+  while (i < s.length && s[i] != null) {
+    String seq = s[i].getSequence();
+    String name =  s[i].getName()+ "/" + s[i].getStart() + "-" + s[i].getEnd();
+    int check = checkSum(s[i].getSequence());
+    out.append(" Name: " + name + " oo  Len:  " + s[i].getSequence().length() + "  Check:  " + check + "  Weight:  1.00\n");
+    if (seq.length() > max) {
+      max = seq.length();
+    }
+    if (name.length() > maxid) {
+      maxid = name.length();
+    }
+    i++;
+  }
+
+  if (maxid < 10) {
+    maxid = 10;
+  }
+  maxid++;
+  out.append( "\n\n//\n\n");
+
+  int len = 50;
+
+  int nochunks =  max / len + 1;
+  if (max%len == 0) {
+    nochunks--;
+  }
+  for (i = 0; i < nochunks; i++) {
+    int j = 0;
+    while (j < s.length && s[j] != null) {
+      String name =  s[j].getName();
+      out.append( new Format("%-" + maxid + "s").form(name + "/" + s[j].getStart() + "-" + s[j].getEnd()) + " ");
+      for (int k = 0; k < 5; k++) {
+
+        int start = i*50 + k*10;
+        int end = start + 10;
+
+        if (end < s[j].getSequence().length() && start < s[j].getSequence().length() ) {
+          out.append(s[j].getSequence().substring(start,end));
+          if (k < 4) {
+            out.append(" ");
+          } else {
+            out.append("\n");
+          }
+        } else {
+          if (start < s[j].getSequence().length()) {
+            out.append(s[j].getSequence().substring(start));
+            out.append("\n");
+          } else {
+            if (k == 0) {
+              out.append("\n");
+            }
+          }
+        }
+      }
+      j++;
+    }
+    out.append("\n");
+
+  }
+  return out.toString();
+}
+public String print() {
+  return print(getSeqsAsArray());
+}
+}
+
+
+
+
+
+
+