tidied up system.out messages and moved many to stderr.
[jalview.git] / src / jalview / io / ClustalFile.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 ClustalFile extends AlignFile {\r
10 \r
11   Vector ids;\r
12 \r
13   public ClustalFile()\r
14   {}\r
15 \r
16   public ClustalFile(String inStr) {\r
17     super(inStr);\r
18   }\r
19 \r
20 \r
21   public void initData() {\r
22     super.initData();\r
23     ids = new Vector();\r
24   }\r
25 \r
26   public ClustalFile(String inFile, String type) throws IOException {\r
27     super(inFile,type);\r
28   }\r
29 \r
30   public void parse() {\r
31     int     i    = 0;\r
32     boolean flag = false;\r
33 \r
34     Vector    headers = new Vector();\r
35     Hashtable seqhash = new Hashtable();\r
36 \r
37     String line;\r
38 \r
39     try {\r
40       while ((line = nextLine()) != null) {\r
41         if (line.indexOf(" ") != 0) {\r
42           StringTokenizer str = new StringTokenizer(line," ");\r
43           String id = "";\r
44 \r
45           if (str.hasMoreTokens()) {\r
46             id = str.nextToken();\r
47             if (id.equals("CLUSTAL")) {\r
48               flag = true;\r
49             } else {\r
50               if (flag) {\r
51                 StringBuffer tempseq;\r
52                 if (seqhash.containsKey(id)) {\r
53                   tempseq = (StringBuffer)seqhash.get(id);\r
54                 } else {\r
55                   tempseq = new StringBuffer();\r
56                   seqhash.put(id,tempseq);\r
57                 }\r
58 \r
59                 if (!(headers.contains(id))) {\r
60                   headers.addElement(id);\r
61                 }\r
62 \r
63                 tempseq.append(str.nextToken());\r
64               }\r
65             }\r
66           }\r
67         }\r
68       }\r
69     } catch (IOException e) {\r
70       System.err.println("Exception parsing clustal file " + e);\r
71       e.stacktrace();\r
72     }\r
73 \r
74     if (flag) {\r
75       this.noSeqs = headers.size();\r
76 \r
77       //Add sequences to the hash\r
78       for (i = 0; i < headers.size(); i++ ) {\r
79         int start = -1;\r
80         int end   = -1;\r
81 \r
82         if ( seqhash.get(headers.elementAt(i)) != null) {\r
83           if (maxLength <  seqhash.get(headers.elementAt(i)).toString().length() ) {\r
84             maxLength =  seqhash.get(headers.elementAt(i)).toString().length();\r
85           }\r
86           String head =  headers.elementAt(i).toString();\r
87           start = 1;\r
88           end   =  seqhash.get(headers.elementAt(i)).toString().length();\r
89 \r
90           if (head.indexOf("/") > 0 ) {\r
91             StringTokenizer st = new StringTokenizer(head,"/");\r
92             if (st.countTokens() == 2) {\r
93 \r
94               ids.addElement(st.nextToken());\r
95 \r
96               String tmp = st.nextToken();\r
97               st = new StringTokenizer(tmp,"-");\r
98               if (st.countTokens() == 2) {\r
99                 start = Integer.valueOf(st.nextToken()).intValue();\r
100                 end = Integer.valueOf(st.nextToken()).intValue();\r
101               }\r
102             } else {\r
103               ids.addElement(headers.elementAt(i));\r
104             }\r
105           }  else {\r
106             ids.addElement(headers.elementAt(i));\r
107 \r
108           }\r
109           Sequence newSeq = new Sequence(ids.elementAt(i).toString(),\r
110                                          seqhash.get(headers.elementAt(i).toString()).toString(),start,end);\r
111 \r
112           seqs.addElement(newSeq);\r
113 \r
114         } else {\r
115           System.err.println("Clustal File Reader: Can't find sequence for " + headers.elementAt(i));\r
116         }\r
117       }\r
118     }\r
119 \r
120   }\r
121 \r
122   public String print() {\r
123     return print(getSeqsAsArray());\r
124   }\r
125   public static String print(SequenceI[] s) {\r
126     StringBuffer out = new StringBuffer("CLUSTAL\n\n");\r
127 \r
128     int max = 0;\r
129     int maxid = 0;\r
130 \r
131     int i = 0;\r
132 \r
133     while (i < s.length && s[i] != null) {\r
134       String tmp = s[i].getName() + "/" + s[i].getStart() + "-" + s[i].getEnd();\r
135 \r
136       if (s[i].getSequence().length() > max) {\r
137         max = s[i].getSequence().length();\r
138       }\r
139       if (tmp.length() > maxid) {\r
140         maxid = tmp.length();\r
141       }\r
142       i++;\r
143     }\r
144 \r
145     if (maxid < 15) {\r
146       maxid = 15;\r
147     }\r
148     maxid++;\r
149     int len = 60;\r
150     int nochunks =  max / len + 1;\r
151 \r
152     for (i = 0; i < nochunks; i++) {\r
153       int j = 0;\r
154       while ( j < s.length && s[j] != null) {\r
155         out.append( new Format("%-" + maxid + "s").form(s[j].getName() + "/" + s[j].getStart() + "-" + s[j].getEnd()) + " ");\r
156         int start = i*len;\r
157         int end = start + len;\r
158 \r
159         if (end < s[j].getSequence().length() && start < s[j].getSequence().length() ) {\r
160           out.append(s[j].getSequence().substring(start,end) + "\n");\r
161         } else {\r
162           if (start < s[j].getSequence().length()) {\r
163             out.append(s[j].getSequence().substring(start) + "\n");\r
164           }\r
165         }\r
166         j++;\r
167       }\r
168       out.append("\n");\r
169 \r
170     }\r
171     return out.toString();\r
172   }\r
173 \r
174 \r
175 }\r