tidied up system.out messages and moved many to stderr.
[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.err.println("Exception parsing MSFFile " + e);\r
75       e.printStackTrace();\r
76     }\r
77 \r
78     this.noSeqs = headers.size();\r
79 \r
80     //Add sequences to the hash\r
81     for (i = 0; i < headers.size(); i++ ) {\r
82 \r
83       if ( seqhash.get(headers.elementAt(i)) != null) {\r
84         String head =  headers.elementAt(i).toString();\r
85         String seq  =  seqhash.get(head).toString();\r
86 \r
87         int start = 1;\r
88         int end = seq.length();\r
89 \r
90         if (maxLength <  head.length() ) {\r
91           maxLength =  head.length();\r
92         }\r
93 \r
94         if (head.indexOf("/") > 0 ) {\r
95 \r
96           StringTokenizer st = new StringTokenizer(head,"/");\r
97 \r
98           if (st.countTokens() == 2) {\r
99 \r
100             head = st.nextToken();\r
101             String tmp = st.nextToken();\r
102             st = new StringTokenizer(tmp,"-");\r
103             if (st.countTokens() == 2) {\r
104               start = Integer.valueOf(st.nextToken()).intValue();\r
105               end = Integer.valueOf(st.nextToken()).intValue();\r
106             }\r
107           }\r
108         }\r
109 \r
110         Sequence newSeq = new Sequence(head,seq,start,end);\r
111 \r
112         seqs.addElement(newSeq);\r
113 \r
114       } else {\r
115         System.err.println("MSFFile Parser: Can't find sequence for " + headers.elementAt(i));\r
116       }\r
117     }\r
118 \r
119   }\r
120 \r
121   public static int checkSum(String seq) {\r
122     //String chars =  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.*~&@";\r
123     int check = 0;\r
124 \r
125     String index =  "--------------------------------------&---*---.-----------------@ABCDEFGHIJKLMNOPQRSTUVWXYZ------ABCDEFGHIJKLMNOPQRSTUVWXYZ----@";\r
126     index += "--------------------------------------------------------------------------------------------------------------------------------";\r
127 \r
128     for(int i = 0; i < seq.length(); i++) {\r
129       try {\r
130         if (i <seq.length()) {\r
131           int pos = index.indexOf(seq.substring(i,i+1));\r
132           if (!index.substring(pos,pos+1).equals("_")) {\r
133             check += ((i % 57) + 1) * pos;\r
134           }\r
135         }\r
136       } catch (Exception e) {\r
137         System.err.println("Exception during MSF Checksum calculation");\r
138         e.printStackTrace();\r
139       }\r
140     }\r
141     return check % 10000;\r
142   }\r
143 \r
144   public static String print(SequenceI[] s) {\r
145     StringBuffer out = new StringBuffer("PileUp\n\n");\r
146 \r
147     int max = 0;\r
148     int maxid = 0;\r
149 \r
150     int i = 0;\r
151     String big = "";\r
152     while (i < s.length && s[i] != null) {\r
153       big += s[i].getSequence();\r
154       i++;\r
155     }\r
156     i = 0;\r
157     int bigcheck = checkSum(big);\r
158 \r
159     out.append("   MSF: " + s[0].getSequence().length() + "   Type: P    Check:  " + bigcheck + "   ..\n\n\n");\r
160 \r
161     while (i < s.length && s[i] != null) {\r
162       String seq = s[i].getSequence();\r
163       String name =  s[i].getName()+ "/" + s[i].getStart() + "-" + s[i].getEnd();\r
164       int check = checkSum(s[i].getSequence());\r
165       out.append(" Name: " + name + " oo  Len:  " + s[i].getSequence().length() + "  Check:  " + check + "  Weight:  1.00\n");\r
166       if (seq.length() > max) {\r
167         max = seq.length();\r
168       }\r
169       if (name.length() > maxid) {\r
170         maxid = name.length();\r
171       }\r
172       i++;\r
173     }\r
174 \r
175     if (maxid < 10) {\r
176       maxid = 10;\r
177     }\r
178     maxid++;\r
179     out.append( "\n\n//\n\n");\r
180 \r
181     int len = 50;\r
182 \r
183     int nochunks =  max / len + 1;\r
184     if (max%len == 0) {\r
185       nochunks--;\r
186     }\r
187     for (i = 0; i < nochunks; i++) {\r
188       int j = 0;\r
189       while (j < s.length && s[j] != null) {\r
190         String name =  s[j].getName();\r
191         out.append( new Format("%-" + maxid + "s").form(name + "/" + s[j].getStart() + "-" + s[j].getEnd()) + " ");\r
192         for (int k = 0; k < 5; k++) {\r
193 \r
194           int start = i*50 + k*10;\r
195           int end = start + 10;\r
196 \r
197           if (end < s[j].getSequence().length() && start < s[j].getSequence().length() ) {\r
198             out.append(s[j].getSequence().substring(start,end));\r
199             if (k < 4) {\r
200               out.append(" ");\r
201             } else {\r
202               out.append("\n");\r
203             }\r
204           } else {\r
205             if (start < s[j].getSequence().length()) {\r
206               out.append(s[j].getSequence().substring(start));\r
207               out.append("\n");\r
208             } else {\r
209               if (k == 0) {\r
210                 out.append("\n");\r
211               }\r
212             }\r
213           }\r
214         }\r
215         j++;\r
216       }\r
217       out.append("\n");\r
218 \r
219     }\r
220     return out.toString();\r
221   }\r
222   public String print() {\r
223     return print(getSeqsAsArray());\r
224   }\r
225 }\r
226 \r
227 \r
228 \r
229 \r
230 \r
231 \r
232 \r