Add support RNAML format
[jalview.git] / src / jalview / io / PileUpfile.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
3  * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, 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
45 import jalview.datamodel.*;
46 import jalview.util.*;
47
48 public class PileUpfile extends MSFfile
49 {
50
51   /**
52    * Creates a new MSFfile object.
53    */
54   public PileUpfile()
55   {
56   }
57
58   /**
59    * Creates a new MSFfile object.
60    * 
61    * @param inFile
62    *          DOCUMENT ME!
63    * @param type
64    *          DOCUMENT ME!
65    * 
66    * @throws IOException
67    *           DOCUMENT ME!
68  * @throws SAXException 
69  * @throws ParserConfigurationException 
70  * @throws ExceptionFileFormatOrSyntax 
71  * @throws ExceptionLoadingFailed 
72  * @throws ExceptionPermissionDenied 
73    */
74   public PileUpfile(String inFile, String type) throws IOException, ExceptionFileFormatOrSyntax, ParserConfigurationException, SAXException, ExceptionPermissionDenied, ExceptionLoadingFailed
75   {
76     super(inFile, type);
77   }
78
79   public PileUpfile(FileParse source) throws IOException, ExceptionFileFormatOrSyntax, ParserConfigurationException, SAXException, ExceptionPermissionDenied, ExceptionLoadingFailed
80   {
81     super(source);
82   }
83
84   /**
85    * DOCUMENT ME!
86    * 
87    * @return DOCUMENT ME!
88    */
89   public String print()
90   {
91     return print(getSeqsAsArray());
92   }
93
94   public String print(SequenceI[] s)
95   {
96     StringBuffer out = new StringBuffer("PileUp");
97     out.append(newline);
98     out.append(newline);
99     
100     int max = 0;
101     int maxid = 0;
102
103     int i = 0;
104     int bigChecksum = 0;
105     int[] checksums = new int[s.length];
106     while (i < s.length)
107     {
108       checksums[i] = checkSum(s[i].getSequenceAsString());
109       bigChecksum += checksums[i];
110       i++;
111     }
112
113     out.append("   MSF: " + s[0].getSequence().length
114             + "   Type: P    Check:  " + bigChecksum % 10000
115             + "   ..");
116     out.append(newline);
117     out.append(newline);
118     out.append(newline);
119
120     i = 0;
121     while ((i < s.length) && (s[i] != null))
122     {
123       String seq = s[i].getSequenceAsString();
124       out.append(" Name: " + printId(s[i]) + " oo  Len:  " + seq.length()
125               + "  Check:  " + checksums[i] + "  Weight:  1.00");
126       out.append(newline);
127
128       if (seq.length() > max)
129       {
130         max = seq.length();
131       }
132
133       if (s[i].getName().length() > maxid)
134       {
135         maxid = s[i].getName().length();
136       }
137
138       i++;
139     }
140
141     if (maxid < 10)
142     {
143       maxid = 10;
144     }
145
146     maxid++;
147     out.append(newline);out.append(newline);out.append("//");
148     out.append(newline);out.append(newline);
149
150     int len = 50;
151
152     int nochunks = (max / len) + 1;
153
154     if ((max % len) == 0)
155     {
156       nochunks--;
157     }
158
159     for (i = 0; i < nochunks; i++)
160     {
161       int j = 0;
162
163       while ((j < s.length) && (s[j] != null))
164       {
165         String name = printId(s[j]);
166
167         out.append(new Format("%-" + maxid + "s").form(name + " "));
168
169         for (int k = 0; k < 5; k++)
170         {
171           int start = (i * 50) + (k * 10);
172           int end = start + 10;
173
174           if ((end < s[j].getSequence().length)
175                   && (start < s[j].getSequence().length))
176           {
177             out.append(s[j].getSequence(start, end));
178
179             if (k < 4)
180             {
181               out.append(" ");
182             }
183             else
184             {
185               out.append(newline);
186             }
187           }
188           else
189           {
190             if (start < s[j].getSequence().length)
191             {
192               out.append(s[j].getSequenceAsString().substring(start));
193               out.append(newline);
194             }
195             else
196             {
197               if (k == 0)
198               {
199                 out.append(newline);
200               }
201             }
202           }
203         }
204
205         j++;
206       }
207
208       out.append(newline);
209     }
210
211     return out.toString();
212   }
213 }