Formatting
[jalview.git] / src / jalview / io / PileUpfile.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 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\r
38     extends MSFfile\r
39 {\r
40 \r
41   /**\r
42    * Creates a new MSFfile object.\r
43    */\r
44   public PileUpfile()\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)\r
57       throws IOException\r
58   {\r
59     super(inFile, type);\r
60   }\r
61 \r
62   /**\r
63    * DOCUMENT ME!\r
64    *\r
65    * @return DOCUMENT ME!\r
66    */\r
67   public String print()\r
68   {\r
69     return print(getSeqsAsArray());\r
70   }\r
71 \r
72   public String print(SequenceI[] s)\r
73   {\r
74     StringBuffer out = new StringBuffer("PileUp\n\n");\r
75 \r
76     int max = 0;\r
77     int maxid = 0;\r
78 \r
79     int i = 0;\r
80     int bigChecksum = 0;\r
81     int[] checksums = new int[s.length];\r
82     while (i < s.length)\r
83     {\r
84       checksums[i] = checkSum(s[i].getSequenceAsString());\r
85       bigChecksum += checksums[i];\r
86       i++;\r
87     }\r
88 \r
89     out.append("   MSF: " + s[0].getSequence().length +\r
90                "   Type: P    Check:  " + bigChecksum % 10000 + "   ..\n\n\n");\r
91 \r
92     i = 0;\r
93     while ( (i < s.length) && (s[i] != null))\r
94     {\r
95       String seq = s[i].getSequenceAsString();\r
96       out.append(" Name: " + printId(s[i]) +\r
97                  " oo  Len:  " +\r
98                  seq.length() + "  Check:  " + checksums[i] +\r
99                  "  Weight:  1.00\n");\r
100 \r
101       if (seq.length() > max)\r
102       {\r
103         max = seq.length();\r
104       }\r
105 \r
106       if (s[i].getName().length() > maxid)\r
107       {\r
108         maxid = s[i].getName().length();\r
109       }\r
110 \r
111       i++;\r
112     }\r
113 \r
114     if (maxid < 10)\r
115     {\r
116       maxid = 10;\r
117     }\r
118 \r
119     maxid++;\r
120     out.append("\n\n//\n\n");\r
121 \r
122     int len = 50;\r
123 \r
124     int nochunks = (max / len) + 1;\r
125 \r
126     if ( (max % len) == 0)\r
127     {\r
128       nochunks--;\r
129     }\r
130 \r
131     for (i = 0; i < nochunks; i++)\r
132     {\r
133       int j = 0;\r
134 \r
135       while ( (j < s.length) && (s[j] != null))\r
136       {\r
137         String name = printId(s[j]);\r
138 \r
139         out.append(new Format("%-" + maxid + "s").form(name + " "));\r
140 \r
141         for (int k = 0; k < 5; k++)\r
142         {\r
143           int start = (i * 50) + (k * 10);\r
144           int end = start + 10;\r
145 \r
146           if ( (end < s[j].getSequence().length) &&\r
147               (start < s[j].getSequence().length))\r
148           {\r
149             out.append(s[j].getSequence(start, end));\r
150 \r
151             if (k < 4)\r
152             {\r
153               out.append(" ");\r
154             }\r
155             else\r
156             {\r
157               out.append("\n");\r
158             }\r
159           }\r
160           else\r
161           {\r
162             if (start < s[j].getSequence().length)\r
163             {\r
164               out.append(s[j].getSequenceAsString().substring(start));\r
165               out.append("\n");\r
166             }\r
167             else\r
168             {\r
169               if (k == 0)\r
170               {\r
171                 out.append("\n");\r
172               }\r
173             }\r
174           }\r
175         }\r
176 \r
177         j++;\r
178       }\r
179 \r
180       out.append("\n");\r
181     }\r
182 \r
183     return out.toString();\r
184   }\r
185 }\r