Jalview Imported Sources
[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.out.println("Exception parsing clustal file " + e);\r
71     }\r
72 \r
73     if (flag) {\r
74       this.noSeqs = headers.size();\r
75 \r
76       //Add sequences to the hash\r
77       for (i = 0; i < headers.size(); i++ ) {\r
78         int start = -1;\r
79         int end   = -1;\r
80 \r
81         if ( seqhash.get(headers.elementAt(i)) != null) {\r
82           if (maxLength <  seqhash.get(headers.elementAt(i)).toString().length() ) {\r
83             maxLength =  seqhash.get(headers.elementAt(i)).toString().length();\r
84           }\r
85           String head =  headers.elementAt(i).toString();\r
86           start = 1;\r
87           end   =  seqhash.get(headers.elementAt(i)).toString().length();\r
88 \r
89           if (head.indexOf("/") > 0 ) {\r
90             StringTokenizer st = new StringTokenizer(head,"/");\r
91             if (st.countTokens() == 2) {\r
92 \r
93               ids.addElement(st.nextToken());\r
94 \r
95               String tmp = st.nextToken();\r
96               st = new StringTokenizer(tmp,"-");\r
97               if (st.countTokens() == 2) {\r
98                 start = Integer.valueOf(st.nextToken()).intValue();\r
99                 end = Integer.valueOf(st.nextToken()).intValue();\r
100               }\r
101             } else {\r
102               ids.addElement(headers.elementAt(i));\r
103             }\r
104           }  else {\r
105             ids.addElement(headers.elementAt(i));\r
106 \r
107           }\r
108           Sequence newSeq = new Sequence(ids.elementAt(i).toString(),\r
109                                          seqhash.get(headers.elementAt(i).toString()).toString(),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 \r
121   public String print() {\r
122     return print(getSeqsAsArray());\r
123   }\r
124   public static String print(SequenceI[] s) {\r
125     StringBuffer out = new StringBuffer("CLUSTAL\n\n");\r
126 \r
127     int max = 0;\r
128     int maxid = 0;\r
129 \r
130     int i = 0;\r
131 \r
132     while (i < s.length && s[i] != null) {\r
133       String tmp = s[i].getName() + "/" + s[i].getStart() + "-" + s[i].getEnd();\r
134 \r
135       if (s[i].getSequence().length() > max) {\r
136         max = s[i].getSequence().length();\r
137       }\r
138       if (tmp.length() > maxid) {\r
139         maxid = tmp.length();\r
140       }\r
141       i++;\r
142     }\r
143 \r
144     if (maxid < 15) {\r
145       maxid = 15;\r
146     }\r
147     maxid++;\r
148     int len = 60;\r
149     int nochunks =  max / len + 1;\r
150 \r
151     for (i = 0; i < nochunks; i++) {\r
152       int j = 0;\r
153       while ( j < s.length && s[j] != null) {\r
154         out.append( new Format("%-" + maxid + "s").form(s[j].getName() + "/" + s[j].getStart() + "-" + s[j].getEnd()) + " ");\r
155         int start = i*len;\r
156         int end = start + len;\r
157 \r
158         if (end < s[j].getSequence().length() && start < s[j].getSequence().length() ) {\r
159           out.append(s[j].getSequence().substring(start,end) + "\n");\r
160         } else {\r
161           if (start < s[j].getSequence().length()) {\r
162             out.append(s[j].getSequence().substring(start) + "\n");\r
163           }\r
164         }\r
165         j++;\r
166       }\r
167       out.append("\n");\r
168 \r
169     }\r
170     return out.toString();\r
171   }\r
172 \r
173 \r
174 }\r