Class |
Line # |
Actions |
|||
---|---|---|---|---|---|
RnamlFile | 45 | 59 | 25 |
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 | import jalview.analysis.Rna; | |
24 | import jalview.datamodel.AlignmentAnnotation; | |
25 | import jalview.datamodel.Annotation; | |
26 | import jalview.datamodel.Sequence; | |
27 | import jalview.datamodel.SequenceI; | |
28 | import jalview.util.MessageManager; | |
29 | ||
30 | import java.io.BufferedReader; | |
31 | import java.io.FileNotFoundException; | |
32 | import java.io.FileReader; | |
33 | import java.io.IOException; | |
34 | import java.util.ArrayList; | |
35 | import java.util.List; | |
36 | ||
37 | import com.stevesoft.pat.Regex; | |
38 | ||
39 | import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; | |
40 | import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; | |
41 | import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; | |
42 | import fr.orsay.lri.varna.factories.RNAFactory; | |
43 | import fr.orsay.lri.varna.models.rna.RNA; | |
44 | ||
45 | public class RnamlFile extends AlignFile | |
46 | { | |
47 | public String id; | |
48 | ||
49 | protected ArrayList<RNA> result; | |
50 | ||
51 | 0 | public RnamlFile() |
52 | { | |
53 | 0 | super(); |
54 | ||
55 | } | |
56 | ||
57 | 1 | public RnamlFile(String inFile, DataSourceType type) throws IOException |
58 | { | |
59 | 1 | super(inFile, type); |
60 | ||
61 | } | |
62 | ||
63 | 1 | public RnamlFile(FileParse source) throws IOException |
64 | { | |
65 | 1 | super(source); |
66 | ||
67 | } | |
68 | ||
69 | 0 | public BufferedReader CreateReader() throws FileNotFoundException |
70 | { | |
71 | 0 | FileReader fr = null; |
72 | 0 | fr = new FileReader(inFile); |
73 | ||
74 | 0 | BufferedReader r = new BufferedReader(fr); |
75 | 0 | return r; |
76 | } | |
77 | ||
78 | /* | |
79 | * (non-Javadoc) | |
80 | * | |
81 | * @see jalview.io.AlignFile#parse() | |
82 | */ | |
83 | 2 | @Override |
84 | public void parse() throws IOException | |
85 | { | |
86 | 2 | if (System.getProperty("java.version").indexOf("1.6") > -1 |
87 | || System.getProperty("java.version").indexOf("1.5") > -1) | |
88 | { | |
89 | // patch for 'This parser does not support specification "null" version | |
90 | // "null"' error | |
91 | // this hack ensures we get a properly updated SAXParserFactory on older | |
92 | // JVMs | |
93 | // thanks to Stefan Birkner over at https://coderwall.com/p/kqsrrw | |
94 | 0 | System.setProperty("javax.xml.parsers.SAXParserFactory", |
95 | "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); | |
96 | } | |
97 | // rather than lose exception semantics whilst parsing RNAML with VARNA we | |
98 | // wrap the routine and catch all exceptions before passing them up the | |
99 | // chain as an IOException | |
100 | 2 | try |
101 | { | |
102 | 2 | _parse(); |
103 | } catch (ExceptionPermissionDenied pdx) | |
104 | { | |
105 | 0 | errormessage = MessageManager.formatMessage( |
106 | "exception.rnaml_couldnt_access_datasource", new String[] | |
107 | { pdx.getMessage() }); | |
108 | 0 | throw new IOException(pdx); |
109 | } catch (ExceptionLoadingFailed lf) | |
110 | { | |
111 | 0 | errormessage = MessageManager.formatMessage( |
112 | "exception.ranml_couldnt_process_data", new String[] | |
113 | { lf.getMessage() }); | |
114 | 0 | throw new IOException(lf); |
115 | } catch (ExceptionFileFormatOrSyntax iff) | |
116 | { | |
117 | 0 | errormessage = MessageManager |
118 | .formatMessage("exception.ranml_invalid_file", new String[] | |
119 | { iff.getMessage() }); | |
120 | 0 | throw new IOException(iff); |
121 | } catch (Exception x) | |
122 | { | |
123 | 0 | error = true; |
124 | 0 | errormessage = MessageManager.formatMessage( |
125 | "exception.ranml_problem_parsing_data", new String[] | |
126 | { x.getMessage() }); | |
127 | 0 | throw new IOException(errormessage, x); |
128 | } | |
129 | } | |
130 | ||
131 | 2 | @SuppressWarnings("unchecked") |
132 | public void _parse() | |
133 | throws FileNotFoundException, ExceptionPermissionDenied, | |
134 | ExceptionLoadingFailed, ExceptionFileFormatOrSyntax | |
135 | { | |
136 | ||
137 | 2 | result = RNAFactory.loadSecStrRNAML(getReader()); |
138 | ||
139 | // ArrayList<ArrayList> allarray = new ArrayList(); | |
140 | // ArrayList<ArrayList<SimpleBP>> BP = new ArrayList(); | |
141 | // ArrayList strucinarray = new ArrayList(); | |
142 | 2 | SequenceI[] sqs = new SequenceI[result.size()]; |
143 | ||
144 | 5 | for (int i = 0; i < result.size(); i++) |
145 | { | |
146 | ||
147 | 3 | RNA current = result.get(i); |
148 | 3 | String rna = current.getStructDBN(true); |
149 | 3 | String seq = current.getSeq(); |
150 | 3 | int begin = 1; |
151 | 3 | int end = seq.length(); |
152 | ||
153 | 3 | id = current.getName(); |
154 | 3 | if (id == null || id.trim().length() == 0) |
155 | { | |
156 | 3 | id = safeName(getDataName()); |
157 | 3 | if (result.size() > 1) |
158 | { | |
159 | 2 | id += "." + i; |
160 | } | |
161 | } | |
162 | 3 | sqs[i] = new Sequence(id, seq, begin, end); |
163 | 3 | if (seq.length() != (end - begin + 1)) |
164 | { | |
165 | 0 | sqs[i].setEnd(sqs[i].findPosition(sqs[i].getLength())); |
166 | } | |
167 | 3 | String[] annot = new String[rna.length()]; |
168 | 3 | Annotation[] ann = new Annotation[rna.length()]; |
169 | ||
170 | 566 | for (int j = 0; j < rna.length(); j++) |
171 | { | |
172 | 563 | annot[j] = "" + rna.charAt(j); |
173 | ||
174 | } | |
175 | 566 | for (int k = 0; k < rna.length(); k++) |
176 | { | |
177 | 563 | ann[k] = new Annotation(annot[k], "", |
178 | Rna.getRNASecStrucState(annot[k]).charAt(0), 0f); | |
179 | } | |
180 | ||
181 | 3 | AlignmentAnnotation align = new AlignmentAnnotation( |
182 | "Secondary Structure", | |
183 | 3 | current.getID().trim().length() > 0 |
184 | ? "Secondary Structure for " + current.getID() | |
185 | : "", | |
186 | ann); | |
187 | ||
188 | 3 | sqs[i].addAlignmentAnnotation(align); |
189 | 3 | sqs[i].setRNA(result.get(i)); |
190 | ||
191 | // allarray.add(strucinarray); | |
192 | ||
193 | 3 | annotations.addElement(align); |
194 | // BP.add(align.bps); | |
195 | ||
196 | } | |
197 | ||
198 | 2 | setSeqs(sqs); |
199 | } | |
200 | ||
201 | 0 | @Override |
202 | public String print(SequenceI[] s, boolean jvSuffix) | |
203 | { | |
204 | 0 | return "not yet implemented"; |
205 | } | |
206 | ||
207 | 0 | public List<RNA> getRNA() |
208 | { | |
209 | 0 | return result; |
210 | } | |
211 | ||
212 | // public static void main(String[] args) { | |
213 | // Pattern p= Pattern.compile("(.+)[.][^.]+"); | |
214 | // Matcher m = p.matcher("toto.xml.zip"); | |
215 | // jalview.bin.Console.outPrintln(m.matches()); | |
216 | // jalview.bin.Console.outPrintln(m.group(1)); | |
217 | // } | |
218 | /** | |
219 | * make a friendly ID string. | |
220 | * | |
221 | * @param dataName | |
222 | * @return truncated dataName to after last '/' | |
223 | */ | |
224 | 3 | private String safeName(String dataName) |
225 | { | |
226 | 3 | int b = 0; |
227 | ? | if ((b = dataName.lastIndexOf(".")) > 0) |
228 | { | |
229 | 3 | dataName = dataName.substring(0, b - 1); |
230 | } | |
231 | 3 | b = 0; |
232 | 3 | Regex m = new Regex("[\\/]?([-A-Za-z0-9]+)\\.?"); |
233 | 3 | String mm = dataName; |
234 | 12 | while (m.searchFrom(dataName, b)) |
235 | { | |
236 | 9 | mm = m.stringMatched(); |
237 | 9 | b = m.matchedTo(); |
238 | } | |
239 | 3 | return mm; |
240 | } | |
241 | } |