JAL-2994 put ‘\’ first in character class clause of regex - otherwise doesn’t compile...
[jalview.git] / src / jalview / io / PileUpfile.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
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
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.io;
22
23 /**
24  * <p>
25  * Title:
26  * </p>
27  * PileUpfile
28  * <p>
29  * Description:
30  * </p>
31  * 
32  * Read and write PileUp style MSF Files. This used to be the MSFFile class, and
33  * was written according to the EBI's idea of a subset of the MSF alignment
34  * format. But, that was updated to reflect current GCG style IO fashion, as
35  * found in Emboss (thanks David Martin!)
36  * 
37  */
38 import jalview.datamodel.SequenceI;
39 import jalview.util.Format;
40
41 import java.io.IOException;
42
43 public class PileUpfile extends MSFfile
44 {
45
46   /**
47    * Creates a new MSFfile object.
48    */
49   public PileUpfile()
50   {
51   }
52
53   /**
54    * Creates a new MSFfile object.
55    * 
56    * @param inFile
57    *          DOCUMENT ME!
58    * @param sourceType
59    *          DOCUMENT ME!
60    * 
61    * @throws IOException
62    *           DOCUMENT ME!
63    */
64   public PileUpfile(String inFile, DataSourceType sourceType)
65           throws IOException
66   {
67     super(inFile, sourceType);
68   }
69
70   public PileUpfile(FileParse source) throws IOException
71   {
72     super(source);
73   }
74
75   @Override
76   public String print(SequenceI[] s, boolean jvsuffix)
77   {
78     StringBuffer out = new StringBuffer("PileUp");
79     out.append(newline);
80     out.append(newline);
81
82     int max = 0;
83     int maxid = 0;
84
85     int i = 0;
86     int bigChecksum = 0;
87     int[] checksums = new int[s.length];
88     while (i < s.length)
89     {
90       checksums[i] = checkSum(s[i].getSequenceAsString());
91       bigChecksum += checksums[i];
92       i++;
93     }
94
95     out.append("   MSF: " + s[0].getLength()
96             + "   Type: P    Check:  " + bigChecksum % 10000 + "   ..");
97     out.append(newline);
98     out.append(newline);
99     out.append(newline);
100
101     i = 0;
102     while ((i < s.length) && (s[i] != null))
103     {
104       String seq = s[i].getSequenceAsString();
105       out.append(" Name: " + printId(s[i], jvsuffix) + " oo  Len:  "
106               + seq.length() + "  Check:  " + checksums[i]
107               + "  Weight:  1.00");
108       out.append(newline);
109
110       if (seq.length() > max)
111       {
112         max = seq.length();
113       }
114
115       if (s[i].getName().length() > maxid)
116       {
117         maxid = s[i].getName().length();
118       }
119
120       i++;
121     }
122
123     if (maxid < 10)
124     {
125       maxid = 10;
126     }
127
128     maxid++;
129     out.append(newline);
130     out.append(newline);
131     out.append("//");
132     out.append(newline);
133     out.append(newline);
134
135     int len = 50;
136
137     int nochunks = (max / len) + (max % len > 0 ? 1 : 0);
138
139     for (i = 0; i < nochunks; i++)
140     {
141       int j = 0;
142
143       while ((j < s.length) && (s[j] != null))
144       {
145         String name = printId(s[j], jvsuffix);
146
147         out.append(new Format("%-" + maxid + "s").form(name + " "));
148
149         for (int k = 0; k < 5; k++)
150         {
151           int start = (i * 50) + (k * 10);
152           int end = start + 10;
153
154           int length = s[j].getLength();
155           if ((end < length) && (start < length))
156           {
157             out.append(s[j].getSequence(start, end));
158
159             if (k < 4)
160             {
161               out.append(" ");
162             }
163             else
164             {
165               out.append(newline);
166             }
167           }
168           else
169           {
170             if (start < length)
171             {
172               out.append(s[j].getSequenceAsString().substring(start));
173               out.append(newline);
174             }
175             else
176             {
177               if (k == 0)
178               {
179                 out.append(newline);
180               }
181             }
182           }
183         }
184
185         j++;
186       }
187
188       out.append(newline);
189     }
190
191     return out.toString();
192   }
193 }