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