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