Jalview Imported Sources
[jalview.git] / src / jalview / io / MSFfile.java
1 package jalview.io;\r
2 \r
3 import jalview.datamodel.*;\r
4 import jalview.util.*;\r
5 \r
6 import java.io.*;\r
7 import java.util.*;\r
8 \r
9 public class MSFfile extends AlignFile {\r
10 \r
11   public MSFfile()\r
12   {}\r
13 \r
14   public MSFfile(String inStr) {\r
15     super(inStr);\r
16   }\r
17 \r
18   public MSFfile(String inFile, String type) throws IOException {\r
19     super(inFile,type);\r
20   }\r
21 \r
22   public void parse() {\r
23 \r
24     int       i       = 0;\r
25     boolean   seqFlag = false;\r
26     String    key     = new String();\r
27     Vector    headers = new Vector();\r
28     Hashtable seqhash = new Hashtable();\r
29     String    line;\r
30 \r
31     try {\r
32     while ((line = nextLine()) != null) {\r
33 \r
34       StringTokenizer str = new StringTokenizer(line);\r
35 \r
36       while (str.hasMoreTokens()) {\r
37 \r
38         String inStr = str.nextToken();\r
39 \r
40         //If line has header information add to the headers vector\r
41         if (inStr.indexOf("Name:") != -1) {\r
42           key = str.nextToken();\r
43           headers.addElement(key);\r
44         }\r
45 \r
46         //if line has // set SeqFlag to 1 so we know sequences are coming\r
47         if (inStr.indexOf("//") != -1) {\r
48           seqFlag = true;\r
49         }\r
50 \r
51         //Process lines as sequence lines if seqFlag is set\r
52         if (( inStr.indexOf("//") == -1) && (seqFlag == true)) {\r
53           //seqeunce id is the first field\r
54           key = inStr;\r
55           StringBuffer tempseq;\r
56 \r
57           //Get sequence from hash if it exists\r
58           if (seqhash.containsKey(key)) {\r
59             tempseq = (StringBuffer)seqhash.get(key);\r
60           } else {\r
61             tempseq = new StringBuffer();\r
62             seqhash.put(key,tempseq);\r
63           }\r
64 \r
65           //loop through the rest of the words\r
66           while (str.hasMoreTokens()) {\r
67             //append the word to the sequence\r
68             tempseq.append(str.nextToken());\r
69           }\r
70         }\r
71       }\r
72     }\r
73     } catch (IOException e) {\r
74       System.out.println("Exception parsing MSFFile " + e);\r
75     }\r
76 \r
77     this.noSeqs = headers.size();\r
78 \r
79     //Add sequences to the hash\r
80     for (i = 0; i < headers.size(); i++ ) {\r
81 \r
82       if ( seqhash.get(headers.elementAt(i)) != null) {\r
83         String head =  headers.elementAt(i).toString();\r
84         String seq  =  seqhash.get(head).toString();\r
85 \r
86         int start = 1;\r
87         int end = seq.length();\r
88 \r
89         if (maxLength <  head.length() ) {\r
90           maxLength =  head.length();\r
91         }\r
92 \r
93         if (head.indexOf("/") > 0 ) {\r
94 \r
95           StringTokenizer st = new StringTokenizer(head,"/");\r
96 \r
97           if (st.countTokens() == 2) {\r
98 \r
99             head = st.nextToken();\r
100             String tmp = st.nextToken();\r
101             st = new StringTokenizer(tmp,"-");\r
102             if (st.countTokens() == 2) {\r
103               start = Integer.valueOf(st.nextToken()).intValue();\r
104               end = Integer.valueOf(st.nextToken()).intValue();\r
105             }\r
106           }\r
107         }\r
108 \r
109         Sequence newSeq = new Sequence(head,seq,start,end);\r
110 \r
111         seqs.addElement(newSeq);\r
112 \r
113       } else {\r
114         System.out.println("Can't find sequence for " + headers.elementAt(i));\r
115       }\r
116     }\r
117 \r
118   }\r
119 \r
120   public static int checkSum(String seq) {\r
121     //String chars =  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.*~&@";\r
122     int check = 0;\r
123 \r
124     String index =  "--------------------------------------&---*---.-----------------@ABCDEFGHIJKLMNOPQRSTUVWXYZ------ABCDEFGHIJKLMNOPQRSTUVWXYZ----@";\r
125     index += "--------------------------------------------------------------------------------------------------------------------------------";\r
126 \r
127     for(int i = 0; i < seq.length(); i++) {\r
128       try {\r
129         if (i <seq.length()) {\r
130           int pos = index.indexOf(seq.substring(i,i+1));\r
131           if (!index.substring(pos,pos+1).equals("_")) {\r
132             check += ((i % 57) + 1) * pos;\r
133           }\r
134         }\r
135       } catch (Exception e) {\r
136         System.err.println("Exception " + e);\r
137       }\r
138     }\r
139     return check % 10000;\r
140   }\r
141 \r
142   public static String print(SequenceI[] s) {\r
143     StringBuffer out = new StringBuffer("PileUp\n\n");\r
144 \r
145     int max = 0;\r
146     int maxid = 0;\r
147 \r
148     int i = 0;\r
149     String big = "";\r
150     while (i < s.length && s[i] != null) {\r
151       big += s[i].getSequence();\r
152       i++;\r
153     }\r
154     i = 0;\r
155     int bigcheck = checkSum(big);\r
156 \r
157     out.append("   MSF: " + s[0].getSequence().length() + "   Type: P    Check:  " + bigcheck + "   ..\n\n\n");\r
158 \r
159     while (i < s.length && s[i] != null) {\r
160       String seq = s[i].getSequence();\r
161       String name =  s[i].getName()+ "/" + s[i].getStart() + "-" + s[i].getEnd();\r
162       int check = checkSum(s[i].getSequence());\r
163       out.append(" Name: " + name + " oo  Len:  " + s[i].getSequence().length() + "  Check:  " + check + "  Weight:  1.00\n");\r
164       if (seq.length() > max) {\r
165         max = seq.length();\r
166       }\r
167       if (name.length() > maxid) {\r
168         maxid = name.length();\r
169       }\r
170       i++;\r
171     }\r
172 \r
173     if (maxid < 10) {\r
174       maxid = 10;\r
175     }\r
176     maxid++;\r
177     out.append( "\n\n//\n\n");\r
178 \r
179     int len = 50;\r
180 \r
181     int nochunks =  max / len + 1;\r
182     if (max%len == 0) {\r
183       nochunks--;\r
184     }\r
185     for (i = 0; i < nochunks; i++) {\r
186       int j = 0;\r
187       while (j < s.length && s[j] != null) {\r
188         String name =  s[j].getName();\r
189         out.append( new Format("%-" + maxid + "s").form(name + "/" + s[j].getStart() + "-" + s[j].getEnd()) + " ");\r
190         for (int k = 0; k < 5; k++) {\r
191 \r
192           int start = i*50 + k*10;\r
193           int end = start + 10;\r
194 \r
195           if (end < s[j].getSequence().length() && start < s[j].getSequence().length() ) {\r
196             out.append(s[j].getSequence().substring(start,end));\r
197             if (k < 4) {\r
198               out.append(" ");\r
199             } else {\r
200               out.append("\n");\r
201             }\r
202           } else {\r
203             if (start < s[j].getSequence().length()) {\r
204               out.append(s[j].getSequence().substring(start));\r
205               out.append("\n");\r
206             } else {\r
207               if (k == 0) {\r
208                 out.append("\n");\r
209               }\r
210             }\r
211           }\r
212         }\r
213         j++;\r
214       }\r
215       out.append("\n");\r
216 \r
217     }\r
218     return out.toString();\r
219   }\r
220   public String print() {\r
221     return print(getSeqsAsArray());\r
222   }\r
223 }\r
224 \r
225 \r
226 \r
227 \r
228 \r
229 \r
230 \r