JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / io / StockholmFile.js
1 Clazz.declarePackage ("jalview.io");\r
2 Clazz.load (["jalview.io.AlignFile"], "jalview.io.StockholmFile", ["com.stevesoft.pat.Regex", "jalview.datamodel.AlignmentAnnotation", "$.Annotation", "$.Mapping", "$.Sequence", "$.SequenceFeature", "jalview.schemes.ResidueProperties", "jalview.util.DBRefUtils", "$.Format", "$.MapList", "$.MessageManager", "java.io.BufferedReader", "$.FileReader", "$.IOException", "java.lang.Character", "$.StringBuffer", "java.util.ArrayList", "$.Hashtable", "$.LinkedHashMap", "$.StringTokenizer", "$.Vector"], function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.result = null;\r
5 this.out = null;\r
6 this.al = null;\r
7 Clazz.instantialize (this, arguments);\r
8 }, jalview.io, "StockholmFile", jalview.io.AlignFile);\r
9 Clazz.makeConstructor (c$, \r
10 function () {\r
11 Clazz.superConstructor (this, jalview.io.StockholmFile, []);\r
12 });\r
13 Clazz.makeConstructor (c$, \r
14 function (al) {\r
15 Clazz.superConstructor (this, jalview.io.StockholmFile, []);\r
16 this.al = al;\r
17 }, "jalview.datamodel.AlignmentI");\r
18 Clazz.defineMethod (c$, "parse_with_VARNA", \r
19 function (inFile) {\r
20 var fr = null;\r
21 fr =  new java.io.FileReader (inFile);\r
22 var r =  new java.io.BufferedReader (fr);\r
23 this.result = null;\r
24 try {\r
25 this.result = RNAFactory.loadSecStrStockholm ();\r
26 } catch (umcp) {\r
27 if (Clazz.exceptionOf (umcp, ExceptionUnmatchedClosingParentheses)) {\r
28 this.errormessage = "Unmatched parentheses in annotation. Aborting (" + umcp.getMessage () + ")";\r
29 throw  new java.io.IOException (umcp);\r
30 } else {\r
31 throw umcp;\r
32 }\r
33 }\r
34 var seqs =  new Array (this.result.size ());\r
35 var id = null;\r
36 for (var i = 0; i < this.result.size (); i++) {\r
37 var current = this.result.get (i);\r
38 var seq = current.getSeq ();\r
39 var rna = current.getStructDBN (true);\r
40 var begin = 0;\r
41 var end = seq.length - 1;\r
42 id = this.safeName (this.getDataName ());\r
43 seqs[i] =  new jalview.datamodel.Sequence (id, seq, begin, end);\r
44 var annot =  new Array (rna.length);\r
45 var ann =  new Array (rna.length);\r
46 for (var j = 0; j < rna.length; j++) {\r
47 annot[j] = rna.substring (j, j + 1);\r
48 }\r
49 for (var k = 0; k < rna.length; k++) {\r
50 ann[k] =  new jalview.datamodel.Annotation (annot[k], "", jalview.schemes.ResidueProperties.getRNASecStrucState (annot[k]).charAt (0), 0);\r
51 }\r
52 var align =  new jalview.datamodel.AlignmentAnnotation ("Sec. str.", current.getID (), ann);\r
53 seqs[i].addAlignmentAnnotation (align);\r
54 seqs[i].setRNA (this.result.get (i));\r
55 this.annotations.addElement (align);\r
56 }\r
57 this.setSeqs (seqs);\r
58 }, "java.io.File");\r
59 Clazz.overrideMethod (c$, "parse", \r
60 function () {\r
61 var treeString =  new StringBuffer ();\r
62 var treeName = null;\r
63 var line;\r
64 var version;\r
65 var seqAnn =  new java.util.Hashtable ();\r
66 var seqs =  new java.util.LinkedHashMap ();\r
67 var p;\r
68 var r;\r
69 var rend;\r
70 var s;\r
71 var x;\r
72 r =  new com.stevesoft.pat.Regex ("# STOCKHOLM ([\\d\\.]+)");\r
73 if (!r.search (this.nextLine ())) {\r
74 throw  new java.io.IOException (jalview.util.MessageManager.getString ("exception.stockholm_invalid_format"));\r
75 } else {\r
76 version = r.stringMatched (1);\r
77 }rend =  new com.stevesoft.pat.Regex ("^\\s*\\/\\/");\r
78 p =  new com.stevesoft.pat.Regex ("(\\S+)\\/(\\d+)\\-(\\d+)");\r
79 s =  new com.stevesoft.pat.Regex ("(\\S+)\\s+(\\S*)\\s+(.*)");\r
80 r =  new com.stevesoft.pat.Regex ("#=(G[FSRC]?)\\s+(.*)");\r
81 x =  new com.stevesoft.pat.Regex ("(\\S+)\\s+(\\S+)");\r
82 var openparen =  new com.stevesoft.pat.Regex ("(<|\\[)", "(");\r
83 var closeparen =  new com.stevesoft.pat.Regex ("(>|\\])", ")");\r
84 var detectbrackets =  new com.stevesoft.pat.Regex ("(<|>|\\[|\\]|\\(|\\))");\r
85 rend.optimize ();\r
86 p.optimize ();\r
87 s.optimize ();\r
88 r.optimize ();\r
89 x.optimize ();\r
90 openparen.optimize ();\r
91 closeparen.optimize ();\r
92 while ((line = this.nextLine ()) != null) {\r
93 if (line.length == 0) {\r
94 continue;\r
95 }if (rend.search (line)) {\r
96 this.noSeqs = seqs.size ();\r
97 var seqdb;\r
98 var dbsource = null;\r
99 var pf =  new com.stevesoft.pat.Regex ("PF[0-9]{5}(.*)");\r
100 var rf =  new com.stevesoft.pat.Regex ("RF[0-9]{5}(.*)");\r
101 if (this.getAlignmentProperty ("AC") != null) {\r
102 var dbType = this.getAlignmentProperty ("AC").toString ();\r
103 if (pf.search (dbType)) {\r
104 dbsource = "PFAM";\r
105 } else if (rf.search (dbType)) {\r
106 dbsource = "RFAM";\r
107 }}for (var skey, $skey = seqs.entrySet ().iterator (); $skey.hasNext () && ((skey = $skey.next ()) || true);) {\r
108 var acc = skey.getKey ();\r
109 var seq = skey.getValue ();\r
110 if (this.maxLength < seq.length) {\r
111 this.maxLength = seq.length;\r
112 }var start = 1;\r
113 var end = -1;\r
114 var sid = acc;\r
115 var accAnnotations = null;\r
116 if (seqAnn != null && seqAnn.containsKey (acc)) {\r
117 accAnnotations = seqAnn.remove (acc);\r
118 }if (p.search (acc)) {\r
119 sid = p.stringMatched (1);\r
120 start = Integer.parseInt (p.stringMatched (2));\r
121 end = Integer.parseInt (p.stringMatched (3));\r
122 }var seqO =  new jalview.datamodel.Sequence (sid, seq, start, end);\r
123 if (accAnnotations != null && accAnnotations.containsKey ("DE")) {\r
124 var desc = accAnnotations.get ("DE");\r
125 seqO.setDescription ((desc == null) ? "" : desc);\r
126 }if (accAnnotations != null && accAnnotations.containsKey ("DR")) {\r
127 var dbr = accAnnotations.get ("DR");\r
128 if (dbr != null && dbr.indexOf (";") > -1) {\r
129 var src = dbr.substring (0, dbr.indexOf (";"));\r
130 var acn = dbr.substring (dbr.indexOf (";") + 1);\r
131 jalview.util.DBRefUtils.parseToDbRef (seqO, src, "0", acn);\r
132 }}if (accAnnotations != null && accAnnotations.containsKey ("AC")) {\r
133 if (dbsource != null) {\r
134 var dbr = accAnnotations.get ("AC");\r
135 if (dbr != null) {\r
136 this.guessDatabaseFor (seqO, dbr, dbsource);\r
137 }}}var features = null;\r
138 try {\r
139 features = accAnnotations.remove ("features");\r
140 } catch (e) {\r
141 if (Clazz.exceptionOf (e, NullPointerException)) {\r
142 } else {\r
143 throw e;\r
144 }\r
145 }\r
146 if (features != null) {\r
147 var posmap = seqO.findPositionMap ();\r
148 var i = features.keys ();\r
149 while (i.hasMoreElements ()) {\r
150 var type = i.nextElement ().toString ();\r
151 var content = features.remove (type);\r
152 var key = jalview.io.StockholmFile.type2id (type);\r
153 if (key != null) {\r
154 if (accAnnotations != null && accAnnotations.containsKey (key)) {\r
155 var vv = accAnnotations.get (key);\r
156 for (var ii = 0; ii < vv.size (); ii++) {\r
157 var an = vv.elementAt (ii);\r
158 seqO.addAlignmentAnnotation (an);\r
159 this.annotations.add (an);\r
160 }\r
161 }}var j = content.keys ();\r
162 while (j.hasMoreElements ()) {\r
163 var desc = j.nextElement ().toString ();\r
164 var ns = content.get (desc).toString ();\r
165 var byChar = ns.toCharArray ();\r
166 for (var k = 0; k < byChar.length; k++) {\r
167 var c = byChar[k];\r
168 if (!(c == ' ' || c == '_' || c == '-' || c == '.')) {\r
169 var new_pos = posmap[k];\r
170 var feat =  new jalview.datamodel.SequenceFeature (type, desc, new_pos, new_pos, 0, null);\r
171 seqO.addSequenceFeature (feat);\r
172 }}\r
173 }\r
174 }\r
175 }this.seqs.addElement (seqO);\r
176 }\r
177 return;\r
178 } else if (!r.search (line)) {\r
179 if (!x.search (line)) {\r
180 throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.couldnt_parse_sequence_line",  Clazz.newArray (-1, [line])));\r
181 }var ns = seqs.get (x.stringMatched (1));\r
182 if (ns == null) {\r
183 ns = "";\r
184 }ns += x.stringMatched (2);\r
185 seqs.put (x.stringMatched (1), ns);\r
186 } else {\r
187 var annType = r.stringMatched (1);\r
188 var annContent = r.stringMatched (2);\r
189 if (annType.equals ("GF")) {\r
190 var an =  new com.stevesoft.pat.Regex ("(\\w+)\\s*(.*)");\r
191 if (an.search (annContent)) {\r
192 if (an.stringMatched (1).equals ("NH")) {\r
193 treeString.append (an.stringMatched (2));\r
194 } else if (an.stringMatched (1).equals ("TN")) {\r
195 if (treeString.length () > 0) {\r
196 if (treeName == null) {\r
197 treeName = "Tree " + (this.getTreeCount () + 1);\r
198 }this.addNewickTree (treeName, treeString.toString ());\r
199 }treeName = an.stringMatched (2);\r
200 treeString =  new StringBuffer ();\r
201 }this.setAlignmentProperty (an.stringMatched (1), an.stringMatched (2));\r
202 }} else if (annType.equals ("GS")) {\r
203 if (s.search (annContent)) {\r
204 var acc = s.stringMatched (1);\r
205 var type = s.stringMatched (2);\r
206 var content = s.stringMatched (3);\r
207 var ann;\r
208 if (seqAnn.containsKey (acc)) {\r
209 ann = seqAnn.get (acc);\r
210 } else {\r
211 ann =  new java.util.Hashtable ();\r
212 }ann.put (type, content);\r
213 seqAnn.put (acc, ann);\r
214 } else {\r
215 throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.error_parsing_line",  Clazz.newArray (-1, [line])));\r
216 }} else if (annType.equals ("GC")) {\r
217 if (x.search (annContent)) {\r
218 jalview.io.StockholmFile.parseAnnotationRow (this.annotations, x.stringMatched (1), x.stringMatched (2));\r
219 }} else if (annType.equals ("GR")) {\r
220 if (s.search (annContent)) {\r
221 var acc = s.stringMatched (1);\r
222 var type = s.stringMatched (2);\r
223 var seq =  String.instantialize (s.stringMatched (3));\r
224 var description = null;\r
225 var sep =  new java.util.StringTokenizer (seq, " \t");\r
226 description = sep.nextToken ();\r
227 if (sep.hasMoreTokens ()) {\r
228 seq = sep.nextToken ();\r
229 } else {\r
230 seq = description;\r
231 description =  String.instantialize ();\r
232 }var ann;\r
233 if (seqAnn.containsKey (acc)) {\r
234 ann = seqAnn.get (acc);\r
235 } else {\r
236 ann =  new java.util.Hashtable ();\r
237 seqAnn.put (acc, ann);\r
238 }var features;\r
239 if (ann.containsKey ("features")) {\r
240 features = ann.get ("features");\r
241 } else {\r
242 features =  new java.util.Hashtable ();\r
243 ann.put ("features", features);\r
244 }var content;\r
245 if (features.containsKey (this.id2type (type))) {\r
246 content = features.get (this.id2type (type));\r
247 } else {\r
248 content =  new java.util.Hashtable ();\r
249 features.put (this.id2type (type), content);\r
250 }var ns = content.get (description);\r
251 if (ns == null) {\r
252 ns = "";\r
253 }ns += seq;\r
254 content.put (description, ns);\r
255 var strucAnn;\r
256 if (seqAnn.containsKey (acc)) {\r
257 strucAnn = seqAnn.get (acc);\r
258 } else {\r
259 strucAnn =  new java.util.Hashtable ();\r
260 }var newStruc =  new java.util.Vector ();\r
261 jalview.io.StockholmFile.parseAnnotationRow (newStruc, type, ns);\r
262 for (var alan, $alan = newStruc.iterator (); $alan.hasNext () && ((alan = $alan.next ()) || true);) {\r
263 alan.visible = false;\r
264 }\r
265 strucAnn.put (type, newStruc);\r
266 seqAnn.put (acc, strucAnn);\r
267 } else {\r
268 System.err.println ("Warning - couldn't parse sequence annotation row line:\n" + line);\r
269 }} else {\r
270 throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.unknown_annotation_detected",  Clazz.newArray (-1, [annType, annContent])));\r
271 }}}\r
272 if (treeString.length () > 0) {\r
273 if (treeName == null) {\r
274 treeName = "Tree " + (1 + this.getTreeCount ());\r
275 }this.addNewickTree (treeName, treeString.toString ());\r
276 }});\r
277 Clazz.defineMethod (c$, "guessDatabaseFor", \r
278  function (seqO, dbr, dbsource) {\r
279 var dbrf = null;\r
280 var dbrs =  new java.util.ArrayList ();\r
281 var seqdb = "Unknown";\r
282 var sdbac = "" + dbr;\r
283 var st = -1;\r
284 var en = -1;\r
285 var p;\r
286 if ((st = sdbac.indexOf ("/")) > -1) {\r
287 var num;\r
288 var range = sdbac.substring (st + 1);\r
289 sdbac = sdbac.substring (0, st);\r
290 if ((p = range.indexOf ("-")) > -1) {\r
291 p++;\r
292 if (p < range.length) {\r
293 num = range.substring (p).trim ();\r
294 try {\r
295 en = Integer.parseInt (num);\r
296 } catch (x) {\r
297 if (Clazz.exceptionOf (x, NumberFormatException)) {\r
298 en = -1;\r
299 } else {\r
300 throw x;\r
301 }\r
302 }\r
303 }} else {\r
304 p = range.length;\r
305 }num = range.substring (0, p).trim ();\r
306 try {\r
307 st = Integer.parseInt (num);\r
308 } catch (x) {\r
309 if (Clazz.exceptionOf (x, NumberFormatException)) {\r
310 st = -1;\r
311 } else {\r
312 throw x;\r
313 }\r
314 }\r
315 }if (dbsource.equals ("PFAM")) {\r
316 seqdb = "UNIPROT";\r
317 if (sdbac.indexOf (".") > -1) {\r
318 sdbac = sdbac.substring (0, sdbac.indexOf ("."));\r
319 dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, seqdb, dbsource, sdbac);\r
320 if (dbrf != null) {\r
321 dbrs.add (dbrf);\r
322 }}dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, dbsource, dbsource, dbr);\r
323 if (dbr != null) {\r
324 dbrs.add (dbrf);\r
325 }} else {\r
326 seqdb = "EMBL";\r
327 if (sdbac.indexOf (".") > -1) {\r
328 sdbac = sdbac.substring (0, sdbac.indexOf ("."));\r
329 dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, seqdb, dbsource, sdbac);\r
330 if (dbrf != null) {\r
331 dbrs.add (dbrf);\r
332 }}dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, dbsource, dbsource, dbr);\r
333 if (dbrf != null) {\r
334 dbrs.add (dbrf);\r
335 }}if (st != -1 && en != -1) {\r
336 for (var d, $d = dbrs.iterator (); $d.hasNext () && ((d = $d.next ()) || true);) {\r
337 var mp =  new jalview.util.MapList ( Clazz.newIntArray (-1, [seqO.getStart (), seqO.getEnd ()]),  Clazz.newIntArray (-1, [st, en]), 1, 1);\r
338 var mping =  new jalview.datamodel.Mapping (mp);\r
339 d.setMap (mping);\r
340 }\r
341 }}, "jalview.datamodel.Sequence,~S,~S");\r
342 c$.parseAnnotationRow = Clazz.defineMethod (c$, "parseAnnotationRow", \r
343 function (annotation, label, annots) {\r
344 var convert1;\r
345 var convert2 = null;\r
346 var openparen =  new com.stevesoft.pat.Regex ("(<|\\[)", "(");\r
347 var closeparen =  new com.stevesoft.pat.Regex ("(>|\\])", ")");\r
348 var detectbrackets =  new com.stevesoft.pat.Regex ("(<|>|\\[|\\]|\\(|\\))");\r
349 convert1 = openparen.replaceAll (annots);\r
350 convert2 = closeparen.replaceAll (convert1);\r
351 annots = convert2;\r
352 var type = label;\r
353 if (label.contains ("_cons")) {\r
354 type = (label.indexOf ("_cons") == label.length - 5) ? label.substring (0, label.length - 5) : label;\r
355 }var ss = false;\r
356 type = jalview.io.StockholmFile.id2type (type);\r
357 if (type.equals ("secondary structure")) {\r
358 ss = true;\r
359 }var els =  new Array (annots.length);\r
360 for (var i = 0; i < annots.length; i++) {\r
361 var pos = annots.substring (i, i + 1);\r
362 var ann;\r
363 ann =  new jalview.datamodel.Annotation (pos, "", ' ', 0);\r
364 if (ss) {\r
365 {\r
366 if (detectbrackets.search (pos)) {\r
367 ann.secondaryStructure = jalview.schemes.ResidueProperties.getRNASecStrucState (pos).charAt (0);\r
368 } else {\r
369 ann.secondaryStructure = jalview.schemes.ResidueProperties.getDssp3state (pos).charAt (0);\r
370 }if (ann.secondaryStructure == pos.charAt (0)) {\r
371 ann.displayCharacter = "";\r
372 } else {\r
373 ann.displayCharacter = " " + ann.displayCharacter;\r
374 }}}els[i] = ann;\r
375 }\r
376 var annot = null;\r
377 var e = annotation.elements ();\r
378 while (e.hasMoreElements ()) {\r
379 annot = e.nextElement ();\r
380 if (annot.label.equals (type)) {\r
381 break;\r
382 }annot = null;\r
383 }\r
384 if (annot == null) {\r
385 annot =  new jalview.datamodel.AlignmentAnnotation (type, type, els);\r
386 annotation.addElement (annot);\r
387 } else {\r
388 var anns =  new Array (annot.annotations.length + els.length);\r
389 System.arraycopy (annot.annotations, 0, anns, 0, annot.annotations.length);\r
390 System.arraycopy (els, 0, anns, annot.annotations.length, els.length);\r
391 annot.annotations = anns;\r
392 }return annot;\r
393 }, "java.util.Vector,~S,~S");\r
394 Clazz.defineMethod (c$, "print", \r
395 function (s) {\r
396 var max = 0;\r
397 var maxid = 0;\r
398 var $in = 0;\r
399 var dataRef = null;\r
400 while (($in < s.length) && (s[$in] != null)) {\r
401 var tmp = this.printId (s[$in]);\r
402 if (s[$in].getSequence ().length > max) {\r
403 max = s[$in].getSequence ().length;\r
404 }if (tmp.length > maxid) {\r
405 maxid = tmp.length;\r
406 }if (s[$in].getDBRef () != null) {\r
407 for (var idb = 0; idb < s[$in].getDBRef ().length; idb++) {\r
408 if (dataRef == null) {\r
409 dataRef =  new java.util.Hashtable ();\r
410 }var datAs1 = s[$in].getDBRef ()[idb].getSource ().toString () + " ; " + s[$in].getDBRef ()[idb].getAccessionId ().toString ();\r
411 dataRef.put (tmp, datAs1);\r
412 }\r
413 }$in++;\r
414 }\r
415 maxid += 9;\r
416 var i = 0;\r
417 if (this.al.getProperties () != null) {\r
418 if (!this.al.getProperties ().isEmpty ()) {\r
419 var key = this.al.getProperties ().keys ();\r
420 var val = this.al.getProperties ().elements ();\r
421 while (key.hasMoreElements ()) {\r
422 this.out.append ("#=GF " + key.nextElement () + " " + val.nextElement ());\r
423 this.out.append (this.newline);\r
424 }\r
425 }}if (dataRef != null) {\r
426 var en = dataRef.keys ();\r
427 while (en.hasMoreElements ()) {\r
428 var idd = en.nextElement ();\r
429 var type = dataRef.remove (idd);\r
430 this.out.append ( new jalview.util.Format ("%-" + (maxid - 2) + "s").form ("#=GS " + idd.toString () + " "));\r
431 if (type.contains ("PFAM") || type.contains ("RFAM")) {\r
432 this.out.append (" AC " + type.substring (type.indexOf (";") + 1));\r
433 } else {\r
434 this.out.append (" DR " + type + " ");\r
435 }this.out.append (this.newline);\r
436 }\r
437 }while (i < s.length && s[i] != null) {\r
438 if (s[i].getDatasetSequence () != null) {\r
439 var ds = s[i].getDatasetSequence ();\r
440 var alAnot;\r
441 var ann;\r
442 var annot;\r
443 alAnot = s[i].getAnnotation ();\r
444 var feature = "";\r
445 if (alAnot != null) {\r
446 for (var j = 0; j < alAnot.length; j++) {\r
447 if (ds.getSequenceFeatures () != null) {\r
448 feature = ds.getSequenceFeatures ()[0].type;\r
449 }var key = jalview.io.StockholmFile.type2id (feature);\r
450 if (key == null) {\r
451 continue;\r
452 }this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form ("#=GR " + this.printId (s[i]) + " " + key + " "));\r
453 ann = alAnot[j].annotations;\r
454 var isrna = alAnot[j].isValidStruc ();\r
455 var seq = "";\r
456 for (var k = 0; k < ann.length; k++) {\r
457 seq += this.outputCharacter (key, k, isrna, ann, s[i]);\r
458 }\r
459 this.out.append (seq);\r
460 this.out.append (this.newline);\r
461 }\r
462 }}this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form (this.printId (s[i]) + " "));\r
463 this.out.append (s[i].getSequenceAsString ());\r
464 this.out.append (this.newline);\r
465 i++;\r
466 }\r
467 var aa;\r
468 if (this.al.getAlignmentAnnotation () != null) {\r
469 for (var ia = 0; ia < this.al.getAlignmentAnnotation ().length; ia++) {\r
470 aa = this.al.getAlignmentAnnotation ()[ia];\r
471 if (aa.autoCalculated || !aa.visible || aa.sequenceRef != null) {\r
472 continue;\r
473 }var seq = "";\r
474 var label;\r
475 var key = "";\r
476 if (aa.label.equals ("seq")) {\r
477 label = "seq_cons";\r
478 } else {\r
479 key = jalview.io.StockholmFile.type2id (aa.label.toLowerCase ());\r
480 if (key == null) {\r
481 label = aa.label;\r
482 } else {\r
483 label = key + "_cons";\r
484 }}if (label == null) {\r
485 label = aa.label;\r
486 }label = label.$replace (" ", "_");\r
487 this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form ("#=GC " + label + " "));\r
488 var isrna = aa.isValidStruc ();\r
489 for (var j = 0; j < aa.annotations.length; j++) {\r
490 seq += this.outputCharacter (key, j, isrna, aa.annotations, null);\r
491 }\r
492 this.out.append (seq);\r
493 this.out.append (this.newline);\r
494 }\r
495 }return this.out.toString ();\r
496 }, "~A");\r
497 Clazz.defineMethod (c$, "outputCharacter", \r
498  function (key, k, isrna, ann, sequenceI) {\r
499 var seq = ' ';\r
500 var annot = ann[k];\r
501 var ch = (annot == null) ? ((sequenceI == null) ? "-" : Character.toString (sequenceI.getCharAt (k))) : annot.displayCharacter;\r
502 if (key != null && key.equals ("SS")) {\r
503 if (annot == null) {\r
504 return sequenceI == null ? '-' : sequenceI.getCharAt (k);\r
505 } else {\r
506 if (annot.secondaryStructure > ' ' && ch.length < 2) {\r
507 return annot.secondaryStructure;\r
508 }}}if (ch.length == 0) {\r
509 seq = '.';\r
510 } else if (ch.length == 1) {\r
511 seq = ch.charAt (0);\r
512 } else if (ch.length > 1) {\r
513 seq = ch.charAt (1);\r
514 }return seq;\r
515 }, "~S,~N,~B,~A,jalview.datamodel.SequenceI");\r
516 Clazz.defineMethod (c$, "print", \r
517 function () {\r
518 this.out =  new StringBuffer ();\r
519 this.out.append ("# STOCKHOLM 1.0");\r
520 this.out.append (this.newline);\r
521 this.print (this.getSeqsAsArray ());\r
522 this.out.append ("//");\r
523 this.out.append (this.newline);\r
524 return this.out.toString ();\r
525 });\r
526 c$.id2type = Clazz.defineMethod (c$, "id2type", \r
527 function (id) {\r
528 if (jalview.io.StockholmFile.typeIds.containsKey (id)) {\r
529 return jalview.io.StockholmFile.typeIds.get (id);\r
530 }System.err.println ("Warning : Unknown Stockholm annotation type code " + id);\r
531 return id;\r
532 }, "~S");\r
533 c$.type2id = Clazz.defineMethod (c$, "type2id", \r
534 function (type) {\r
535 var key = null;\r
536 var e = jalview.io.StockholmFile.typeIds.keys ();\r
537 while (e.hasMoreElements ()) {\r
538 var ll = e.nextElement ();\r
539 if (jalview.io.StockholmFile.typeIds.get (ll).toString ().equals (type)) {\r
540 key = ll;\r
541 break;\r
542 }}\r
543 if (key != null) {\r
544 return key;\r
545 }System.err.println ("Warning : Unknown Stockholm annotation type: " + type);\r
546 return key;\r
547 }, "~S");\r
548 Clazz.defineMethod (c$, "safeName", \r
549  function (dataName) {\r
550 var b = 0;\r
551 while ((b = dataName.indexOf ("/")) > -1 && b < dataName.length) {\r
552 dataName = dataName.substring (b + 1).trim ();\r
553 }\r
554 var e = (dataName.length - dataName.indexOf (".")) + 1;\r
555 dataName = dataName.substring (1, e).trim ();\r
556 return dataName;\r
557 }, "~S");\r
558 Clazz.defineStatics (c$,\r
559 "typeIds", null);\r
560 {\r
561 if (jalview.io.StockholmFile.typeIds == null) {\r
562 jalview.io.StockholmFile.typeIds =  new java.util.Hashtable ();\r
563 jalview.io.StockholmFile.typeIds.put ("SS", "secondary structure");\r
564 jalview.io.StockholmFile.typeIds.put ("SA", "surface accessibility");\r
565 jalview.io.StockholmFile.typeIds.put ("TM", "transmembrane");\r
566 jalview.io.StockholmFile.typeIds.put ("PP", "posterior probability");\r
567 jalview.io.StockholmFile.typeIds.put ("LI", "ligand binding");\r
568 jalview.io.StockholmFile.typeIds.put ("AS", "active site");\r
569 jalview.io.StockholmFile.typeIds.put ("IN", "intron");\r
570 jalview.io.StockholmFile.typeIds.put ("IR", "interacting residue");\r
571 jalview.io.StockholmFile.typeIds.put ("AC", "accession");\r
572 jalview.io.StockholmFile.typeIds.put ("OS", "organism");\r
573 jalview.io.StockholmFile.typeIds.put ("CL", "class");\r
574 jalview.io.StockholmFile.typeIds.put ("DE", "description");\r
575 jalview.io.StockholmFile.typeIds.put ("DR", "reference");\r
576 jalview.io.StockholmFile.typeIds.put ("LO", "look");\r
577 jalview.io.StockholmFile.typeIds.put ("RF", "reference positions");\r
578 }}});\r