ensure lastSeq is refreshed if new feature added
[jalview.git] / src / jalview / io / PileUpfile.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.io;\r
20 \r
21 /**\r
22  * <p>Title: </p>\r
23  *  PileUpfile\r
24  * <p>Description: </p>\r
25  *\r
26  *  Read and write PileUp style MSF Files.\r
27  *  This used to be the MSFFile class, and was written according to the EBI's idea\r
28  *  of a subset of the MSF alignment format. But, that was updated to reflect current\r
29  *  GCG style IO fashion, as found in Emboss (thanks David Martin!)\r
30  *\r
31  **/\r
32 import java.io.*;\r
33 \r
34 import jalview.datamodel.*;\r
35 import jalview.util.*;\r
36 \r
37 public class PileUpfile  extends MSFfile\r
38 {\r
39 \r
40     /**\r
41      * Creates a new MSFfile object.\r
42      */\r
43     public PileUpfile()\r
44     {\r
45     }\r
46 \r
47 \r
48     /**\r
49      * Creates a new MSFfile object.\r
50      *\r
51      * @param inFile DOCUMENT ME!\r
52      * @param type DOCUMENT ME!\r
53      *\r
54      * @throws IOException DOCUMENT ME!\r
55      */\r
56     public PileUpfile(String inFile, String type) throws IOException\r
57     {\r
58         super(inFile, type);\r
59     }\r
60    /**\r
61    * DOCUMENT ME!\r
62    *\r
63    * @return DOCUMENT ME!\r
64    */\r
65   public String print()\r
66   {\r
67       return print(getSeqsAsArray());\r
68   }\r
69 \r
70 \r
71   public  String print(SequenceI[] s)\r
72   {\r
73     StringBuffer out = new StringBuffer("PileUp\n\n");\r
74 \r
75     int max = 0;\r
76     int maxid = 0;\r
77 \r
78     int i = 0;\r
79     int bigChecksum = 0;\r
80     int[] checksums = new int[s.length];\r
81     while (i < s.length)\r
82     {\r
83       checksums[i] = checkSum(s[i].getSequenceAsString());\r
84       bigChecksum += checksums[i];\r
85       i++;\r
86     }\r
87 \r
88     out.append("   MSF: " + s[0].getSequence().length +\r
89                "   Type: P    Check:  " + bigChecksum%10000 + "   ..\n\n\n");\r
90 \r
91     i=0;\r
92     while ( (i < s.length) && (s[i] != null))\r
93     {\r
94       String seq = s[i].getSequenceAsString();\r
95       out.append(" Name: " + printId(s[i]) +\r
96                  " oo  Len:  " +\r
97                  seq.length() + "  Check:  " + checksums[i] +\r
98                  "  Weight:  1.00\n");\r
99 \r
100       if (seq.length() > max)\r
101       {\r
102         max = seq.length();\r
103       }\r
104 \r
105       if (s[i].getName().length() > maxid)\r
106       {\r
107         maxid = s[i].getName().length();\r
108       }\r
109 \r
110       i++;\r
111     }\r
112 \r
113     if (maxid < 10)\r
114     {\r
115       maxid = 10;\r
116     }\r
117 \r
118     maxid++;\r
119     out.append("\n\n//\n\n");\r
120 \r
121     int len = 50;\r
122 \r
123     int nochunks = (max / len) + 1;\r
124 \r
125     if ( (max % len) == 0)\r
126     {\r
127       nochunks--;\r
128     }\r
129 \r
130     for (i = 0; i < nochunks; i++)\r
131     {\r
132       int j = 0;\r
133 \r
134       while ( (j < s.length) && (s[j] != null))\r
135       {\r
136         String name = printId(s[j]);\r
137 \r
138          out.append(new Format("%-" + maxid + "s").form(name + " "));\r
139 \r
140         for (int k = 0; k < 5; k++)\r
141         {\r
142           int start = (i * 50) + (k * 10);\r
143           int end = start + 10;\r
144 \r
145           if ( (end < s[j].getSequence().length) &&\r
146               (start < s[j].getSequence().length))\r
147           {\r
148             out.append(s[j].getSequence(start, end));\r
149 \r
150             if (k < 4)\r
151             {\r
152               out.append(" ");\r
153             }\r
154             else\r
155             {\r
156               out.append("\n");\r
157             }\r
158           }\r
159           else\r
160           {\r
161             if (start < s[j].getSequence().length)\r
162             {\r
163               out.append(s[j].getSequenceAsString().substring(start));\r
164               out.append("\n");\r
165             }\r
166             else\r
167             {\r
168               if (k == 0)\r
169               {\r
170                 out.append("\n");\r
171               }\r
172             }\r
173           }\r
174         }\r
175 \r
176         j++;\r
177       }\r
178 \r
179       out.append("\n");\r
180     }\r
181 \r
182     return out.toString();\r
183   }\r
184 }\r