Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / site / j2s / jalview / io / StockholmFile.js
index 877dfc8..c7b8a9d 100644 (file)
-Clazz.declarePackage ("jalview.io");\r
-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
-c$ = Clazz.decorateAsClass (function () {\r
-this.result = null;\r
-this.out = null;\r
-this.al = null;\r
-Clazz.instantialize (this, arguments);\r
-}, jalview.io, "StockholmFile", jalview.io.AlignFile);\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-Clazz.superConstructor (this, jalview.io.StockholmFile, []);\r
-});\r
-Clazz.makeConstructor (c$, \r
-function (al) {\r
-Clazz.superConstructor (this, jalview.io.StockholmFile, []);\r
-this.al = al;\r
-}, "jalview.datamodel.AlignmentI");\r
-Clazz.defineMethod (c$, "parse_with_VARNA", \r
-function (inFile) {\r
-var fr = null;\r
-fr =  new java.io.FileReader (inFile);\r
-var r =  new java.io.BufferedReader (fr);\r
-this.result = null;\r
-try {\r
-this.result = RNAFactory.loadSecStrStockholm ();\r
-} catch (umcp) {\r
-if (Clazz.exceptionOf (umcp, ExceptionUnmatchedClosingParentheses)) {\r
-this.errormessage = "Unmatched parentheses in annotation. Aborting (" + umcp.getMessage () + ")";\r
-throw  new java.io.IOException (umcp);\r
-} else {\r
-throw umcp;\r
-}\r
-}\r
-var seqs =  new Array (this.result.size ());\r
-var id = null;\r
-for (var i = 0; i < this.result.size (); i++) {\r
-var current = this.result.get (i);\r
-var seq = current.getSeq ();\r
-var rna = current.getStructDBN (true);\r
-var begin = 0;\r
-var end = seq.length - 1;\r
-id = this.safeName (this.getDataName ());\r
-seqs[i] =  new jalview.datamodel.Sequence (id, seq, begin, end);\r
-var annot =  new Array (rna.length);\r
-var ann =  new Array (rna.length);\r
-for (var j = 0; j < rna.length; j++) {\r
-annot[j] = rna.substring (j, j + 1);\r
-}\r
-for (var k = 0; k < rna.length; k++) {\r
-ann[k] =  new jalview.datamodel.Annotation (annot[k], "", jalview.schemes.ResidueProperties.getRNASecStrucState (annot[k]).charAt (0), 0);\r
-}\r
-var align =  new jalview.datamodel.AlignmentAnnotation ("Sec. str.", current.getID (), ann);\r
-seqs[i].addAlignmentAnnotation (align);\r
-seqs[i].setRNA (this.result.get (i));\r
-this.annotations.addElement (align);\r
-}\r
-this.setSeqs (seqs);\r
-}, "java.io.File");\r
-Clazz.overrideMethod (c$, "parse", \r
-function () {\r
-var treeString =  new StringBuffer ();\r
-var treeName = null;\r
-var line;\r
-var version;\r
-var seqAnn =  new java.util.Hashtable ();\r
-var seqs =  new java.util.LinkedHashMap ();\r
-var p;\r
-var r;\r
-var rend;\r
-var s;\r
-var x;\r
-r =  new com.stevesoft.pat.Regex ("# STOCKHOLM ([\\d\\.]+)");\r
-if (!r.search (this.nextLine ())) {\r
-throw  new java.io.IOException (jalview.util.MessageManager.getString ("exception.stockholm_invalid_format"));\r
-} else {\r
-version = r.stringMatched (1);\r
-}rend =  new com.stevesoft.pat.Regex ("^\\s*\\/\\/");\r
-p =  new com.stevesoft.pat.Regex ("(\\S+)\\/(\\d+)\\-(\\d+)");\r
-s =  new com.stevesoft.pat.Regex ("(\\S+)\\s+(\\S*)\\s+(.*)");\r
-r =  new com.stevesoft.pat.Regex ("#=(G[FSRC]?)\\s+(.*)");\r
-x =  new com.stevesoft.pat.Regex ("(\\S+)\\s+(\\S+)");\r
-var openparen =  new com.stevesoft.pat.Regex ("(<|\\[)", "(");\r
-var closeparen =  new com.stevesoft.pat.Regex ("(>|\\])", ")");\r
-var detectbrackets =  new com.stevesoft.pat.Regex ("(<|>|\\[|\\]|\\(|\\))");\r
-rend.optimize ();\r
-p.optimize ();\r
-s.optimize ();\r
-r.optimize ();\r
-x.optimize ();\r
-openparen.optimize ();\r
-closeparen.optimize ();\r
-while ((line = this.nextLine ()) != null) {\r
-if (line.length == 0) {\r
-continue;\r
-}if (rend.search (line)) {\r
-this.noSeqs = seqs.size ();\r
-var seqdb;\r
-var dbsource = null;\r
-var pf =  new com.stevesoft.pat.Regex ("PF[0-9]{5}(.*)");\r
-var rf =  new com.stevesoft.pat.Regex ("RF[0-9]{5}(.*)");\r
-if (this.getAlignmentProperty ("AC") != null) {\r
-var dbType = this.getAlignmentProperty ("AC").toString ();\r
-if (pf.search (dbType)) {\r
-dbsource = "PFAM";\r
-} else if (rf.search (dbType)) {\r
-dbsource = "RFAM";\r
-}}for (var skey, $skey = seqs.entrySet ().iterator (); $skey.hasNext () && ((skey = $skey.next ()) || true);) {\r
-var acc = skey.getKey ();\r
-var seq = skey.getValue ();\r
-if (this.maxLength < seq.length) {\r
-this.maxLength = seq.length;\r
-}var start = 1;\r
-var end = -1;\r
-var sid = acc;\r
-var accAnnotations = null;\r
-if (seqAnn != null && seqAnn.containsKey (acc)) {\r
-accAnnotations = seqAnn.remove (acc);\r
-}if (p.search (acc)) {\r
-sid = p.stringMatched (1);\r
-start = Integer.parseInt (p.stringMatched (2));\r
-end = Integer.parseInt (p.stringMatched (3));\r
-}var seqO =  new jalview.datamodel.Sequence (sid, seq, start, end);\r
-if (accAnnotations != null && accAnnotations.containsKey ("DE")) {\r
-var desc = accAnnotations.get ("DE");\r
-seqO.setDescription ((desc == null) ? "" : desc);\r
-}if (accAnnotations != null && accAnnotations.containsKey ("DR")) {\r
-var dbr = accAnnotations.get ("DR");\r
-if (dbr != null && dbr.indexOf (";") > -1) {\r
-var src = dbr.substring (0, dbr.indexOf (";"));\r
-var acn = dbr.substring (dbr.indexOf (";") + 1);\r
-jalview.util.DBRefUtils.parseToDbRef (seqO, src, "0", acn);\r
-}}if (accAnnotations != null && accAnnotations.containsKey ("AC")) {\r
-if (dbsource != null) {\r
-var dbr = accAnnotations.get ("AC");\r
-if (dbr != null) {\r
-this.guessDatabaseFor (seqO, dbr, dbsource);\r
-}}}var features = null;\r
-try {\r
-features = accAnnotations.remove ("features");\r
-} catch (e) {\r
-if (Clazz.exceptionOf (e, NullPointerException)) {\r
-} else {\r
-throw e;\r
-}\r
-}\r
-if (features != null) {\r
-var posmap = seqO.findPositionMap ();\r
-var i = features.keys ();\r
-while (i.hasMoreElements ()) {\r
-var type = i.nextElement ().toString ();\r
-var content = features.remove (type);\r
-var key = jalview.io.StockholmFile.type2id (type);\r
-if (key != null) {\r
-if (accAnnotations != null && accAnnotations.containsKey (key)) {\r
-var vv = accAnnotations.get (key);\r
-for (var ii = 0; ii < vv.size (); ii++) {\r
-var an = vv.elementAt (ii);\r
-seqO.addAlignmentAnnotation (an);\r
-this.annotations.add (an);\r
-}\r
-}}var j = content.keys ();\r
-while (j.hasMoreElements ()) {\r
-var desc = j.nextElement ().toString ();\r
-var ns = content.get (desc).toString ();\r
-var byChar = ns.toCharArray ();\r
-for (var k = 0; k < byChar.length; k++) {\r
-var c = byChar[k];\r
-if (!(c == ' ' || c == '_' || c == '-' || c == '.')) {\r
-var new_pos = posmap[k];\r
-var feat =  new jalview.datamodel.SequenceFeature (type, desc, new_pos, new_pos, 0, null);\r
-seqO.addSequenceFeature (feat);\r
-}}\r
-}\r
-}\r
-}this.seqs.addElement (seqO);\r
-}\r
-return;\r
-} else if (!r.search (line)) {\r
-if (!x.search (line)) {\r
-throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.couldnt_parse_sequence_line",  Clazz.newArray (-1, [line])));\r
-}var ns = seqs.get (x.stringMatched (1));\r
-if (ns == null) {\r
-ns = "";\r
-}ns += x.stringMatched (2);\r
-seqs.put (x.stringMatched (1), ns);\r
-} else {\r
-var annType = r.stringMatched (1);\r
-var annContent = r.stringMatched (2);\r
-if (annType.equals ("GF")) {\r
-var an =  new com.stevesoft.pat.Regex ("(\\w+)\\s*(.*)");\r
-if (an.search (annContent)) {\r
-if (an.stringMatched (1).equals ("NH")) {\r
-treeString.append (an.stringMatched (2));\r
-} else if (an.stringMatched (1).equals ("TN")) {\r
-if (treeString.length () > 0) {\r
-if (treeName == null) {\r
-treeName = "Tree " + (this.getTreeCount () + 1);\r
-}this.addNewickTree (treeName, treeString.toString ());\r
-}treeName = an.stringMatched (2);\r
-treeString =  new StringBuffer ();\r
-}this.setAlignmentProperty (an.stringMatched (1), an.stringMatched (2));\r
-}} else if (annType.equals ("GS")) {\r
-if (s.search (annContent)) {\r
-var acc = s.stringMatched (1);\r
-var type = s.stringMatched (2);\r
-var content = s.stringMatched (3);\r
-var ann;\r
-if (seqAnn.containsKey (acc)) {\r
-ann = seqAnn.get (acc);\r
-} else {\r
-ann =  new java.util.Hashtable ();\r
-}ann.put (type, content);\r
-seqAnn.put (acc, ann);\r
-} else {\r
-throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.error_parsing_line",  Clazz.newArray (-1, [line])));\r
-}} else if (annType.equals ("GC")) {\r
-if (x.search (annContent)) {\r
-jalview.io.StockholmFile.parseAnnotationRow (this.annotations, x.stringMatched (1), x.stringMatched (2));\r
-}} else if (annType.equals ("GR")) {\r
-if (s.search (annContent)) {\r
-var acc = s.stringMatched (1);\r
-var type = s.stringMatched (2);\r
-var seq =  String.instantialize (s.stringMatched (3));\r
-var description = null;\r
-var sep =  new java.util.StringTokenizer (seq, " \t");\r
-description = sep.nextToken ();\r
-if (sep.hasMoreTokens ()) {\r
-seq = sep.nextToken ();\r
-} else {\r
-seq = description;\r
-description =  String.instantialize ();\r
-}var ann;\r
-if (seqAnn.containsKey (acc)) {\r
-ann = seqAnn.get (acc);\r
-} else {\r
-ann =  new java.util.Hashtable ();\r
-seqAnn.put (acc, ann);\r
-}var features;\r
-if (ann.containsKey ("features")) {\r
-features = ann.get ("features");\r
-} else {\r
-features =  new java.util.Hashtable ();\r
-ann.put ("features", features);\r
-}var content;\r
-if (features.containsKey (this.id2type (type))) {\r
-content = features.get (this.id2type (type));\r
-} else {\r
-content =  new java.util.Hashtable ();\r
-features.put (this.id2type (type), content);\r
-}var ns = content.get (description);\r
-if (ns == null) {\r
-ns = "";\r
-}ns += seq;\r
-content.put (description, ns);\r
-var strucAnn;\r
-if (seqAnn.containsKey (acc)) {\r
-strucAnn = seqAnn.get (acc);\r
-} else {\r
-strucAnn =  new java.util.Hashtable ();\r
-}var newStruc =  new java.util.Vector ();\r
-jalview.io.StockholmFile.parseAnnotationRow (newStruc, type, ns);\r
-for (var alan, $alan = newStruc.iterator (); $alan.hasNext () && ((alan = $alan.next ()) || true);) {\r
-alan.visible = false;\r
-}\r
-strucAnn.put (type, newStruc);\r
-seqAnn.put (acc, strucAnn);\r
-} else {\r
-System.err.println ("Warning - couldn't parse sequence annotation row line:\n" + line);\r
-}} else {\r
-throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.unknown_annotation_detected",  Clazz.newArray (-1, [annType, annContent])));\r
-}}}\r
-if (treeString.length () > 0) {\r
-if (treeName == null) {\r
-treeName = "Tree " + (1 + this.getTreeCount ());\r
-}this.addNewickTree (treeName, treeString.toString ());\r
-}});\r
-Clazz.defineMethod (c$, "guessDatabaseFor", \r
- function (seqO, dbr, dbsource) {\r
-var dbrf = null;\r
-var dbrs =  new java.util.ArrayList ();\r
-var seqdb = "Unknown";\r
-var sdbac = "" + dbr;\r
-var st = -1;\r
-var en = -1;\r
-var p;\r
-if ((st = sdbac.indexOf ("/")) > -1) {\r
-var num;\r
-var range = sdbac.substring (st + 1);\r
-sdbac = sdbac.substring (0, st);\r
-if ((p = range.indexOf ("-")) > -1) {\r
-p++;\r
-if (p < range.length) {\r
-num = range.substring (p).trim ();\r
-try {\r
-en = Integer.parseInt (num);\r
-} catch (x) {\r
-if (Clazz.exceptionOf (x, NumberFormatException)) {\r
-en = -1;\r
-} else {\r
-throw x;\r
-}\r
-}\r
-}} else {\r
-p = range.length;\r
-}num = range.substring (0, p).trim ();\r
-try {\r
-st = Integer.parseInt (num);\r
-} catch (x) {\r
-if (Clazz.exceptionOf (x, NumberFormatException)) {\r
-st = -1;\r
-} else {\r
-throw x;\r
-}\r
-}\r
-}if (dbsource.equals ("PFAM")) {\r
-seqdb = "UNIPROT";\r
-if (sdbac.indexOf (".") > -1) {\r
-sdbac = sdbac.substring (0, sdbac.indexOf ("."));\r
-dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, seqdb, dbsource, sdbac);\r
-if (dbrf != null) {\r
-dbrs.add (dbrf);\r
-}}dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, dbsource, dbsource, dbr);\r
-if (dbr != null) {\r
-dbrs.add (dbrf);\r
-}} else {\r
-seqdb = "EMBL";\r
-if (sdbac.indexOf (".") > -1) {\r
-sdbac = sdbac.substring (0, sdbac.indexOf ("."));\r
-dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, seqdb, dbsource, sdbac);\r
-if (dbrf != null) {\r
-dbrs.add (dbrf);\r
-}}dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, dbsource, dbsource, dbr);\r
-if (dbrf != null) {\r
-dbrs.add (dbrf);\r
-}}if (st != -1 && en != -1) {\r
-for (var d, $d = dbrs.iterator (); $d.hasNext () && ((d = $d.next ()) || true);) {\r
-var mp =  new jalview.util.MapList ( Clazz.newIntArray (-1, [seqO.getStart (), seqO.getEnd ()]),  Clazz.newIntArray (-1, [st, en]), 1, 1);\r
-var mping =  new jalview.datamodel.Mapping (mp);\r
-d.setMap (mping);\r
-}\r
-}}, "jalview.datamodel.Sequence,~S,~S");\r
-c$.parseAnnotationRow = Clazz.defineMethod (c$, "parseAnnotationRow", \r
-function (annotation, label, annots) {\r
-var convert1;\r
-var convert2 = null;\r
-var openparen =  new com.stevesoft.pat.Regex ("(<|\\[)", "(");\r
-var closeparen =  new com.stevesoft.pat.Regex ("(>|\\])", ")");\r
-var detectbrackets =  new com.stevesoft.pat.Regex ("(<|>|\\[|\\]|\\(|\\))");\r
-convert1 = openparen.replaceAll (annots);\r
-convert2 = closeparen.replaceAll (convert1);\r
-annots = convert2;\r
-var type = label;\r
-if (label.contains ("_cons")) {\r
-type = (label.indexOf ("_cons") == label.length - 5) ? label.substring (0, label.length - 5) : label;\r
-}var ss = false;\r
-type = jalview.io.StockholmFile.id2type (type);\r
-if (type.equals ("secondary structure")) {\r
-ss = true;\r
-}var els =  new Array (annots.length);\r
-for (var i = 0; i < annots.length; i++) {\r
-var pos = annots.substring (i, i + 1);\r
-var ann;\r
-ann =  new jalview.datamodel.Annotation (pos, "", ' ', 0);\r
-if (ss) {\r
-{\r
-if (detectbrackets.search (pos)) {\r
-ann.secondaryStructure = jalview.schemes.ResidueProperties.getRNASecStrucState (pos).charAt (0);\r
-} else {\r
-ann.secondaryStructure = jalview.schemes.ResidueProperties.getDssp3state (pos).charAt (0);\r
-}if (ann.secondaryStructure == pos.charAt (0)) {\r
-ann.displayCharacter = "";\r
-} else {\r
-ann.displayCharacter = " " + ann.displayCharacter;\r
-}}}els[i] = ann;\r
-}\r
-var annot = null;\r
-var e = annotation.elements ();\r
-while (e.hasMoreElements ()) {\r
-annot = e.nextElement ();\r
-if (annot.label.equals (type)) {\r
-break;\r
-}annot = null;\r
-}\r
-if (annot == null) {\r
-annot =  new jalview.datamodel.AlignmentAnnotation (type, type, els);\r
-annotation.addElement (annot);\r
-} else {\r
-var anns =  new Array (annot.annotations.length + els.length);\r
-System.arraycopy (annot.annotations, 0, anns, 0, annot.annotations.length);\r
-System.arraycopy (els, 0, anns, annot.annotations.length, els.length);\r
-annot.annotations = anns;\r
-}return annot;\r
-}, "java.util.Vector,~S,~S");\r
-Clazz.defineMethod (c$, "print", \r
-function (s) {\r
-var max = 0;\r
-var maxid = 0;\r
-var $in = 0;\r
-var dataRef = null;\r
-while (($in < s.length) && (s[$in] != null)) {\r
-var tmp = this.printId (s[$in]);\r
-if (s[$in].getSequence ().length > max) {\r
-max = s[$in].getSequence ().length;\r
-}if (tmp.length > maxid) {\r
-maxid = tmp.length;\r
-}if (s[$in].getDBRef () != null) {\r
-for (var idb = 0; idb < s[$in].getDBRef ().length; idb++) {\r
-if (dataRef == null) {\r
-dataRef =  new java.util.Hashtable ();\r
-}var datAs1 = s[$in].getDBRef ()[idb].getSource ().toString () + " ; " + s[$in].getDBRef ()[idb].getAccessionId ().toString ();\r
-dataRef.put (tmp, datAs1);\r
-}\r
-}$in++;\r
-}\r
-maxid += 9;\r
-var i = 0;\r
-if (this.al.getProperties () != null) {\r
-if (!this.al.getProperties ().isEmpty ()) {\r
-var key = this.al.getProperties ().keys ();\r
-var val = this.al.getProperties ().elements ();\r
-while (key.hasMoreElements ()) {\r
-this.out.append ("#=GF " + key.nextElement () + " " + val.nextElement ());\r
-this.out.append (this.newline);\r
-}\r
-}}if (dataRef != null) {\r
-var en = dataRef.keys ();\r
-while (en.hasMoreElements ()) {\r
-var idd = en.nextElement ();\r
-var type = dataRef.remove (idd);\r
-this.out.append ( new jalview.util.Format ("%-" + (maxid - 2) + "s").form ("#=GS " + idd.toString () + " "));\r
-if (type.contains ("PFAM") || type.contains ("RFAM")) {\r
-this.out.append (" AC " + type.substring (type.indexOf (";") + 1));\r
-} else {\r
-this.out.append (" DR " + type + " ");\r
-}this.out.append (this.newline);\r
-}\r
-}while (i < s.length && s[i] != null) {\r
-if (s[i].getDatasetSequence () != null) {\r
-var ds = s[i].getDatasetSequence ();\r
-var alAnot;\r
-var ann;\r
-var annot;\r
-alAnot = s[i].getAnnotation ();\r
-var feature = "";\r
-if (alAnot != null) {\r
-for (var j = 0; j < alAnot.length; j++) {\r
-if (ds.getSequenceFeatures () != null) {\r
-feature = ds.getSequenceFeatures ()[0].type;\r
-}var key = jalview.io.StockholmFile.type2id (feature);\r
-if (key == null) {\r
-continue;\r
-}this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form ("#=GR " + this.printId (s[i]) + " " + key + " "));\r
-ann = alAnot[j].annotations;\r
-var isrna = alAnot[j].isValidStruc ();\r
-var seq = "";\r
-for (var k = 0; k < ann.length; k++) {\r
-seq += this.outputCharacter (key, k, isrna, ann, s[i]);\r
-}\r
-this.out.append (seq);\r
-this.out.append (this.newline);\r
-}\r
-}}this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form (this.printId (s[i]) + " "));\r
-this.out.append (s[i].getSequenceAsString ());\r
-this.out.append (this.newline);\r
-i++;\r
-}\r
-var aa;\r
-if (this.al.getAlignmentAnnotation () != null) {\r
-for (var ia = 0; ia < this.al.getAlignmentAnnotation ().length; ia++) {\r
-aa = this.al.getAlignmentAnnotation ()[ia];\r
-if (aa.autoCalculated || !aa.visible || aa.sequenceRef != null) {\r
-continue;\r
-}var seq = "";\r
-var label;\r
-var key = "";\r
-if (aa.label.equals ("seq")) {\r
-label = "seq_cons";\r
-} else {\r
-key = jalview.io.StockholmFile.type2id (aa.label.toLowerCase ());\r
-if (key == null) {\r
-label = aa.label;\r
-} else {\r
-label = key + "_cons";\r
-}}if (label == null) {\r
-label = aa.label;\r
-}label = label.$replace (" ", "_");\r
-this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form ("#=GC " + label + " "));\r
-var isrna = aa.isValidStruc ();\r
-for (var j = 0; j < aa.annotations.length; j++) {\r
-seq += this.outputCharacter (key, j, isrna, aa.annotations, null);\r
-}\r
-this.out.append (seq);\r
-this.out.append (this.newline);\r
-}\r
-}return this.out.toString ();\r
-}, "~A");\r
-Clazz.defineMethod (c$, "outputCharacter", \r
- function (key, k, isrna, ann, sequenceI) {\r
-var seq = ' ';\r
-var annot = ann[k];\r
-var ch = (annot == null) ? ((sequenceI == null) ? "-" : Character.toString (sequenceI.getCharAt (k))) : annot.displayCharacter;\r
-if (key != null && key.equals ("SS")) {\r
-if (annot == null) {\r
-return sequenceI == null ? '-' : sequenceI.getCharAt (k);\r
-} else {\r
-if (annot.secondaryStructure > ' ' && ch.length < 2) {\r
-return annot.secondaryStructure;\r
-}}}if (ch.length == 0) {\r
-seq = '.';\r
-} else if (ch.length == 1) {\r
-seq = ch.charAt (0);\r
-} else if (ch.length > 1) {\r
-seq = ch.charAt (1);\r
-}return seq;\r
-}, "~S,~N,~B,~A,jalview.datamodel.SequenceI");\r
-Clazz.defineMethod (c$, "print", \r
-function () {\r
-this.out =  new StringBuffer ();\r
-this.out.append ("# STOCKHOLM 1.0");\r
-this.out.append (this.newline);\r
-this.print (this.getSeqsAsArray ());\r
-this.out.append ("//");\r
-this.out.append (this.newline);\r
-return this.out.toString ();\r
-});\r
-c$.id2type = Clazz.defineMethod (c$, "id2type", \r
-function (id) {\r
-if (jalview.io.StockholmFile.typeIds.containsKey (id)) {\r
-return jalview.io.StockholmFile.typeIds.get (id);\r
-}System.err.println ("Warning : Unknown Stockholm annotation type code " + id);\r
-return id;\r
-}, "~S");\r
-c$.type2id = Clazz.defineMethod (c$, "type2id", \r
-function (type) {\r
-var key = null;\r
-var e = jalview.io.StockholmFile.typeIds.keys ();\r
-while (e.hasMoreElements ()) {\r
-var ll = e.nextElement ();\r
-if (jalview.io.StockholmFile.typeIds.get (ll).toString ().equals (type)) {\r
-key = ll;\r
-break;\r
-}}\r
-if (key != null) {\r
-return key;\r
-}System.err.println ("Warning : Unknown Stockholm annotation type: " + type);\r
-return key;\r
-}, "~S");\r
-Clazz.defineMethod (c$, "safeName", \r
- function (dataName) {\r
-var b = 0;\r
-while ((b = dataName.indexOf ("/")) > -1 && b < dataName.length) {\r
-dataName = dataName.substring (b + 1).trim ();\r
-}\r
-var e = (dataName.length - dataName.indexOf (".")) + 1;\r
-dataName = dataName.substring (1, e).trim ();\r
-return dataName;\r
-}, "~S");\r
-Clazz.defineStatics (c$,\r
-"typeIds", null);\r
-{\r
-if (jalview.io.StockholmFile.typeIds == null) {\r
-jalview.io.StockholmFile.typeIds =  new java.util.Hashtable ();\r
-jalview.io.StockholmFile.typeIds.put ("SS", "secondary structure");\r
-jalview.io.StockholmFile.typeIds.put ("SA", "surface accessibility");\r
-jalview.io.StockholmFile.typeIds.put ("TM", "transmembrane");\r
-jalview.io.StockholmFile.typeIds.put ("PP", "posterior probability");\r
-jalview.io.StockholmFile.typeIds.put ("LI", "ligand binding");\r
-jalview.io.StockholmFile.typeIds.put ("AS", "active site");\r
-jalview.io.StockholmFile.typeIds.put ("IN", "intron");\r
-jalview.io.StockholmFile.typeIds.put ("IR", "interacting residue");\r
-jalview.io.StockholmFile.typeIds.put ("AC", "accession");\r
-jalview.io.StockholmFile.typeIds.put ("OS", "organism");\r
-jalview.io.StockholmFile.typeIds.put ("CL", "class");\r
-jalview.io.StockholmFile.typeIds.put ("DE", "description");\r
-jalview.io.StockholmFile.typeIds.put ("DR", "reference");\r
-jalview.io.StockholmFile.typeIds.put ("LO", "look");\r
-jalview.io.StockholmFile.typeIds.put ("RF", "reference positions");\r
-}}});\r
+Clazz.declarePackage ("jalview.io");
+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 () {
+c$ = Clazz.decorateAsClass (function () {
+this.result = null;
+this.out = null;
+this.al = null;
+Clazz.instantialize (this, arguments);
+}, jalview.io, "StockholmFile", jalview.io.AlignFile);
+Clazz.makeConstructor (c$, 
+function () {
+Clazz.superConstructor (this, jalview.io.StockholmFile, []);
+});
+Clazz.makeConstructor (c$, 
+function (al) {
+Clazz.superConstructor (this, jalview.io.StockholmFile, []);
+this.al = al;
+}, "jalview.datamodel.AlignmentI");
+Clazz.defineMethod (c$, "parse_with_VARNA", 
+function (inFile) {
+var fr = null;
+fr =  new java.io.FileReader (inFile);
+var r =  new java.io.BufferedReader (fr);
+this.result = null;
+try {
+this.result = RNAFactory.loadSecStrStockholm ();
+} catch (umcp) {
+if (Clazz.exceptionOf (umcp, ExceptionUnmatchedClosingParentheses)) {
+this.errormessage = "Unmatched parentheses in annotation. Aborting (" + umcp.getMessage () + ")";
+throw  new java.io.IOException (umcp);
+} else {
+throw umcp;
+}
+}
+var seqs =  new Array (this.result.size ());
+var id = null;
+for (var i = 0; i < this.result.size (); i++) {
+var current = this.result.get (i);
+var seq = current.getSeq ();
+var rna = current.getStructDBN (true);
+var begin = 0;
+var end = seq.length - 1;
+id = this.safeName (this.getDataName ());
+seqs[i] =  new jalview.datamodel.Sequence (id, seq, begin, end);
+var annot =  new Array (rna.length);
+var ann =  new Array (rna.length);
+for (var j = 0; j < rna.length; j++) {
+annot[j] = rna.substring (j, j + 1);
+}
+for (var k = 0; k < rna.length; k++) {
+ann[k] =  new jalview.datamodel.Annotation (annot[k], "", jalview.schemes.ResidueProperties.getRNASecStrucState (annot[k]).charAt (0), 0);
+}
+var align =  new jalview.datamodel.AlignmentAnnotation ("Sec. str.", current.getID (), ann);
+seqs[i].addAlignmentAnnotation (align);
+seqs[i].setRNA (this.result.get (i));
+this.annotations.addElement (align);
+}
+this.setSeqs (seqs);
+}, "java.io.File");
+Clazz.overrideMethod (c$, "parse", 
+function () {
+var treeString =  new StringBuffer ();
+var treeName = null;
+var line;
+var version;
+var seqAnn =  new java.util.Hashtable ();
+var seqs =  new java.util.LinkedHashMap ();
+var p;
+var r;
+var rend;
+var s;
+var x;
+r =  new com.stevesoft.pat.Regex ("# STOCKHOLM ([\\d\\.]+)");
+if (!r.search (this.nextLine ())) {
+throw  new java.io.IOException (jalview.util.MessageManager.getString ("exception.stockholm_invalid_format"));
+} else {
+version = r.stringMatched (1);
+}rend =  new com.stevesoft.pat.Regex ("^\\s*\\/\\/");
+p =  new com.stevesoft.pat.Regex ("(\\S+)\\/(\\d+)\\-(\\d+)");
+s =  new com.stevesoft.pat.Regex ("(\\S+)\\s+(\\S*)\\s+(.*)");
+r =  new com.stevesoft.pat.Regex ("#=(G[FSRC]?)\\s+(.*)");
+x =  new com.stevesoft.pat.Regex ("(\\S+)\\s+(\\S+)");
+var openparen =  new com.stevesoft.pat.Regex ("(<|\\[)", "(");
+var closeparen =  new com.stevesoft.pat.Regex ("(>|\\])", ")");
+var detectbrackets =  new com.stevesoft.pat.Regex ("(<|>|\\[|\\]|\\(|\\))");
+rend.optimize ();
+p.optimize ();
+s.optimize ();
+r.optimize ();
+x.optimize ();
+openparen.optimize ();
+closeparen.optimize ();
+while ((line = this.nextLine ()) != null) {
+if (line.length == 0) {
+continue;
+}if (rend.search (line)) {
+this.noSeqs = seqs.size ();
+var seqdb;
+var dbsource = null;
+var pf =  new com.stevesoft.pat.Regex ("PF[0-9]{5}(.*)");
+var rf =  new com.stevesoft.pat.Regex ("RF[0-9]{5}(.*)");
+if (this.getAlignmentProperty ("AC") != null) {
+var dbType = this.getAlignmentProperty ("AC").toString ();
+if (pf.search (dbType)) {
+dbsource = "PFAM";
+} else if (rf.search (dbType)) {
+dbsource = "RFAM";
+}}for (var skey, $skey = seqs.entrySet ().iterator (); $skey.hasNext () && ((skey = $skey.next ()) || true);) {
+var acc = skey.getKey ();
+var seq = skey.getValue ();
+if (this.maxLength < seq.length) {
+this.maxLength = seq.length;
+}var start = 1;
+var end = -1;
+var sid = acc;
+var accAnnotations = null;
+if (seqAnn != null && seqAnn.containsKey (acc)) {
+accAnnotations = seqAnn.remove (acc);
+}if (p.search (acc)) {
+sid = p.stringMatched (1);
+start = Integer.parseInt (p.stringMatched (2));
+end = Integer.parseInt (p.stringMatched (3));
+}var seqO =  new jalview.datamodel.Sequence (sid, seq, start, end);
+if (accAnnotations != null && accAnnotations.containsKey ("DE")) {
+var desc = accAnnotations.get ("DE");
+seqO.setDescription ((desc == null) ? "" : desc);
+}if (accAnnotations != null && accAnnotations.containsKey ("DR")) {
+var dbr = accAnnotations.get ("DR");
+if (dbr != null && dbr.indexOf (";") > -1) {
+var src = dbr.substring (0, dbr.indexOf (";"));
+var acn = dbr.substring (dbr.indexOf (";") + 1);
+jalview.util.DBRefUtils.parseToDbRef (seqO, src, "0", acn);
+}}if (accAnnotations != null && accAnnotations.containsKey ("AC")) {
+if (dbsource != null) {
+var dbr = accAnnotations.get ("AC");
+if (dbr != null) {
+this.guessDatabaseFor (seqO, dbr, dbsource);
+}}}var features = null;
+try {
+features = accAnnotations.remove ("features");
+} catch (e) {
+if (Clazz.exceptionOf (e, NullPointerException)) {
+} else {
+throw e;
+}
+}
+if (features != null) {
+var posmap = seqO.findPositionMap ();
+var i = features.keys ();
+while (i.hasMoreElements ()) {
+var type = i.nextElement ().toString ();
+var content = features.remove (type);
+var key = jalview.io.StockholmFile.type2id (type);
+if (key != null) {
+if (accAnnotations != null && accAnnotations.containsKey (key)) {
+var vv = accAnnotations.get (key);
+for (var ii = 0; ii < vv.size (); ii++) {
+var an = vv.elementAt (ii);
+seqO.addAlignmentAnnotation (an);
+this.annotations.add (an);
+}
+}}var j = content.keys ();
+while (j.hasMoreElements ()) {
+var desc = j.nextElement ().toString ();
+var ns = content.get (desc).toString ();
+var byChar = ns.toCharArray ();
+for (var k = 0; k < byChar.length; k++) {
+var c = byChar[k];
+if (!(c == ' ' || c == '_' || c == '-' || c == '.')) {
+var new_pos = posmap[k];
+var feat =  new jalview.datamodel.SequenceFeature (type, desc, new_pos, new_pos, 0, null);
+seqO.addSequenceFeature (feat);
+}}
+}
+}
+}this.seqs.addElement (seqO);
+}
+return;
+} else if (!r.search (line)) {
+if (!x.search (line)) {
+throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.couldnt_parse_sequence_line",  Clazz.newArray (-1, [line])));
+}var ns = seqs.get (x.stringMatched (1));
+if (ns == null) {
+ns = "";
+}ns += x.stringMatched (2);
+seqs.put (x.stringMatched (1), ns);
+} else {
+var annType = r.stringMatched (1);
+var annContent = r.stringMatched (2);
+if (annType.equals ("GF")) {
+var an =  new com.stevesoft.pat.Regex ("(\\w+)\\s*(.*)");
+if (an.search (annContent)) {
+if (an.stringMatched (1).equals ("NH")) {
+treeString.append (an.stringMatched (2));
+} else if (an.stringMatched (1).equals ("TN")) {
+if (treeString.length () > 0) {
+if (treeName == null) {
+treeName = "Tree " + (this.getTreeCount () + 1);
+}this.addNewickTree (treeName, treeString.toString ());
+}treeName = an.stringMatched (2);
+treeString =  new StringBuffer ();
+}this.setAlignmentProperty (an.stringMatched (1), an.stringMatched (2));
+}} else if (annType.equals ("GS")) {
+if (s.search (annContent)) {
+var acc = s.stringMatched (1);
+var type = s.stringMatched (2);
+var content = s.stringMatched (3);
+var ann;
+if (seqAnn.containsKey (acc)) {
+ann = seqAnn.get (acc);
+} else {
+ann =  new java.util.Hashtable ();
+}ann.put (type, content);
+seqAnn.put (acc, ann);
+} else {
+throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.error_parsing_line",  Clazz.newArray (-1, [line])));
+}} else if (annType.equals ("GC")) {
+if (x.search (annContent)) {
+jalview.io.StockholmFile.parseAnnotationRow (this.annotations, x.stringMatched (1), x.stringMatched (2));
+}} else if (annType.equals ("GR")) {
+if (s.search (annContent)) {
+var acc = s.stringMatched (1);
+var type = s.stringMatched (2);
+var seq =  String.instantialize (s.stringMatched (3));
+var description = null;
+var sep =  new java.util.StringTokenizer (seq, " \t");
+description = sep.nextToken ();
+if (sep.hasMoreTokens ()) {
+seq = sep.nextToken ();
+} else {
+seq = description;
+description =  String.instantialize ();
+}var ann;
+if (seqAnn.containsKey (acc)) {
+ann = seqAnn.get (acc);
+} else {
+ann =  new java.util.Hashtable ();
+seqAnn.put (acc, ann);
+}var features;
+if (ann.containsKey ("features")) {
+features = ann.get ("features");
+} else {
+features =  new java.util.Hashtable ();
+ann.put ("features", features);
+}var content;
+if (features.containsKey (this.id2type (type))) {
+content = features.get (this.id2type (type));
+} else {
+content =  new java.util.Hashtable ();
+features.put (this.id2type (type), content);
+}var ns = content.get (description);
+if (ns == null) {
+ns = "";
+}ns += seq;
+content.put (description, ns);
+var strucAnn;
+if (seqAnn.containsKey (acc)) {
+strucAnn = seqAnn.get (acc);
+} else {
+strucAnn =  new java.util.Hashtable ();
+}var newStruc =  new java.util.Vector ();
+jalview.io.StockholmFile.parseAnnotationRow (newStruc, type, ns);
+for (var alan, $alan = newStruc.iterator (); $alan.hasNext () && ((alan = $alan.next ()) || true);) {
+alan.visible = false;
+}
+strucAnn.put (type, newStruc);
+seqAnn.put (acc, strucAnn);
+} else {
+System.err.println ("Warning - couldn't parse sequence annotation row line:\n" + line);
+}} else {
+throw  new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.unknown_annotation_detected",  Clazz.newArray (-1, [annType, annContent])));
+}}}
+if (treeString.length () > 0) {
+if (treeName == null) {
+treeName = "Tree " + (1 + this.getTreeCount ());
+}this.addNewickTree (treeName, treeString.toString ());
+}});
+Clazz.defineMethod (c$, "guessDatabaseFor", 
+ function (seqO, dbr, dbsource) {
+var dbrf = null;
+var dbrs =  new java.util.ArrayList ();
+var seqdb = "Unknown";
+var sdbac = "" + dbr;
+var st = -1;
+var en = -1;
+var p;
+if ((st = sdbac.indexOf ("/")) > -1) {
+var num;
+var range = sdbac.substring (st + 1);
+sdbac = sdbac.substring (0, st);
+if ((p = range.indexOf ("-")) > -1) {
+p++;
+if (p < range.length) {
+num = range.substring (p).trim ();
+try {
+en = Integer.parseInt (num);
+} catch (x) {
+if (Clazz.exceptionOf (x, NumberFormatException)) {
+en = -1;
+} else {
+throw x;
+}
+}
+}} else {
+p = range.length;
+}num = range.substring (0, p).trim ();
+try {
+st = Integer.parseInt (num);
+} catch (x) {
+if (Clazz.exceptionOf (x, NumberFormatException)) {
+st = -1;
+} else {
+throw x;
+}
+}
+}if (dbsource.equals ("PFAM")) {
+seqdb = "UNIPROT";
+if (sdbac.indexOf (".") > -1) {
+sdbac = sdbac.substring (0, sdbac.indexOf ("."));
+dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, seqdb, dbsource, sdbac);
+if (dbrf != null) {
+dbrs.add (dbrf);
+}}dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, dbsource, dbsource, dbr);
+if (dbr != null) {
+dbrs.add (dbrf);
+}} else {
+seqdb = "EMBL";
+if (sdbac.indexOf (".") > -1) {
+sdbac = sdbac.substring (0, sdbac.indexOf ("."));
+dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, seqdb, dbsource, sdbac);
+if (dbrf != null) {
+dbrs.add (dbrf);
+}}dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, dbsource, dbsource, dbr);
+if (dbrf != null) {
+dbrs.add (dbrf);
+}}if (st != -1 && en != -1) {
+for (var d, $d = dbrs.iterator (); $d.hasNext () && ((d = $d.next ()) || true);) {
+var mp =  new jalview.util.MapList ( Clazz.newIntArray (-1, [seqO.getStart (), seqO.getEnd ()]),  Clazz.newIntArray (-1, [st, en]), 1, 1);
+var mping =  new jalview.datamodel.Mapping (mp);
+d.setMap (mping);
+}
+}}, "jalview.datamodel.Sequence,~S,~S");
+c$.parseAnnotationRow = Clazz.defineMethod (c$, "parseAnnotationRow", 
+function (annotation, label, annots) {
+var convert1;
+var convert2 = null;
+var openparen =  new com.stevesoft.pat.Regex ("(<|\\[)", "(");
+var closeparen =  new com.stevesoft.pat.Regex ("(>|\\])", ")");
+var detectbrackets =  new com.stevesoft.pat.Regex ("(<|>|\\[|\\]|\\(|\\))");
+convert1 = openparen.replaceAll (annots);
+convert2 = closeparen.replaceAll (convert1);
+annots = convert2;
+var type = label;
+if (label.contains ("_cons")) {
+type = (label.indexOf ("_cons") == label.length - 5) ? label.substring (0, label.length - 5) : label;
+}var ss = false;
+type = jalview.io.StockholmFile.id2type (type);
+if (type.equals ("secondary structure")) {
+ss = true;
+}var els =  new Array (annots.length);
+for (var i = 0; i < annots.length; i++) {
+var pos = annots.substring (i, i + 1);
+var ann;
+ann =  new jalview.datamodel.Annotation (pos, "", ' ', 0);
+if (ss) {
+{
+if (detectbrackets.search (pos)) {
+ann.secondaryStructure = jalview.schemes.ResidueProperties.getRNASecStrucState (pos).charAt (0);
+} else {
+ann.secondaryStructure = jalview.schemes.ResidueProperties.getDssp3state (pos).charAt (0);
+}if (ann.secondaryStructure == pos.charAt (0)) {
+ann.displayCharacter = "";
+} else {
+ann.displayCharacter = " " + ann.displayCharacter;
+}}}els[i] = ann;
+}
+var annot = null;
+var e = annotation.elements ();
+while (e.hasMoreElements ()) {
+annot = e.nextElement ();
+if (annot.label.equals (type)) {
+break;
+}annot = null;
+}
+if (annot == null) {
+annot =  new jalview.datamodel.AlignmentAnnotation (type, type, els);
+annotation.addElement (annot);
+} else {
+var anns =  new Array (annot.annotations.length + els.length);
+System.arraycopy (annot.annotations, 0, anns, 0, annot.annotations.length);
+System.arraycopy (els, 0, anns, annot.annotations.length, els.length);
+annot.annotations = anns;
+}return annot;
+}, "java.util.Vector,~S,~S");
+Clazz.defineMethod (c$, "print", 
+function (s) {
+var max = 0;
+var maxid = 0;
+var $in = 0;
+var dataRef = null;
+while (($in < s.length) && (s[$in] != null)) {
+var tmp = this.printId (s[$in]);
+if (s[$in].getSequence ().length > max) {
+max = s[$in].getSequence ().length;
+}if (tmp.length > maxid) {
+maxid = tmp.length;
+}if (s[$in].getDBRef () != null) {
+for (var idb = 0; idb < s[$in].getDBRef ().length; idb++) {
+if (dataRef == null) {
+dataRef =  new java.util.Hashtable ();
+}var datAs1 = s[$in].getDBRef ()[idb].getSource ().toString () + " ; " + s[$in].getDBRef ()[idb].getAccessionId ().toString ();
+dataRef.put (tmp, datAs1);
+}
+}$in++;
+}
+maxid += 9;
+var i = 0;
+if (this.al.getProperties () != null) {
+if (!this.al.getProperties ().isEmpty ()) {
+var key = this.al.getProperties ().keys ();
+var val = this.al.getProperties ().elements ();
+while (key.hasMoreElements ()) {
+this.out.append ("#=GF " + key.nextElement () + " " + val.nextElement ());
+this.out.append (this.newline);
+}
+}}if (dataRef != null) {
+var en = dataRef.keys ();
+while (en.hasMoreElements ()) {
+var idd = en.nextElement ();
+var type = dataRef.remove (idd);
+this.out.append ( new jalview.util.Format ("%-" + (maxid - 2) + "s").form ("#=GS " + idd.toString () + " "));
+if (type.contains ("PFAM") || type.contains ("RFAM")) {
+this.out.append (" AC " + type.substring (type.indexOf (";") + 1));
+} else {
+this.out.append (" DR " + type + " ");
+}this.out.append (this.newline);
+}
+}while (i < s.length && s[i] != null) {
+if (s[i].getDatasetSequence () != null) {
+var ds = s[i].getDatasetSequence ();
+var alAnot;
+var ann;
+var annot;
+alAnot = s[i].getAnnotation ();
+var feature = "";
+if (alAnot != null) {
+for (var j = 0; j < alAnot.length; j++) {
+if (ds.getSequenceFeatures () != null) {
+feature = ds.getSequenceFeatures ()[0].type;
+}var key = jalview.io.StockholmFile.type2id (feature);
+if (key == null) {
+continue;
+}this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form ("#=GR " + this.printId (s[i]) + " " + key + " "));
+ann = alAnot[j].annotations;
+var isrna = alAnot[j].isValidStruc ();
+var seq = "";
+for (var k = 0; k < ann.length; k++) {
+seq += this.outputCharacter (key, k, isrna, ann, s[i]);
+}
+this.out.append (seq);
+this.out.append (this.newline);
+}
+}}this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form (this.printId (s[i]) + " "));
+this.out.append (s[i].getSequenceAsString ());
+this.out.append (this.newline);
+i++;
+}
+var aa;
+if (this.al.getAlignmentAnnotation () != null) {
+for (var ia = 0; ia < this.al.getAlignmentAnnotation ().length; ia++) {
+aa = this.al.getAlignmentAnnotation ()[ia];
+if (aa.autoCalculated || !aa.visible || aa.sequenceRef != null) {
+continue;
+}var seq = "";
+var label;
+var key = "";
+if (aa.label.equals ("seq")) {
+label = "seq_cons";
+} else {
+key = jalview.io.StockholmFile.type2id (aa.label.toLowerCase ());
+if (key == null) {
+label = aa.label;
+} else {
+label = key + "_cons";
+}}if (label == null) {
+label = aa.label;
+}label = label.$replace (" ", "_");
+this.out.append ( new jalview.util.Format ("%-" + maxid + "s").form ("#=GC " + label + " "));
+var isrna = aa.isValidStruc ();
+for (var j = 0; j < aa.annotations.length; j++) {
+seq += this.outputCharacter (key, j, isrna, aa.annotations, null);
+}
+this.out.append (seq);
+this.out.append (this.newline);
+}
+}return this.out.toString ();
+}, "~A");
+Clazz.defineMethod (c$, "outputCharacter", 
+ function (key, k, isrna, ann, sequenceI) {
+var seq = ' ';
+var annot = ann[k];
+var ch = (annot == null) ? ((sequenceI == null) ? "-" : Character.toString (sequenceI.getCharAt (k))) : annot.displayCharacter;
+if (key != null && key.equals ("SS")) {
+if (annot == null) {
+return sequenceI == null ? '-' : sequenceI.getCharAt (k);
+} else {
+if (annot.secondaryStructure > ' ' && ch.length < 2) {
+return annot.secondaryStructure;
+}}}if (ch.length == 0) {
+seq = '.';
+} else if (ch.length == 1) {
+seq = ch.charAt (0);
+} else if (ch.length > 1) {
+seq = ch.charAt (1);
+}return seq;
+}, "~S,~N,~B,~A,jalview.datamodel.SequenceI");
+Clazz.defineMethod (c$, "print", 
+function () {
+this.out =  new StringBuffer ();
+this.out.append ("# STOCKHOLM 1.0");
+this.out.append (this.newline);
+this.print (this.getSeqsAsArray ());
+this.out.append ("//");
+this.out.append (this.newline);
+return this.out.toString ();
+});
+c$.id2type = Clazz.defineMethod (c$, "id2type", 
+function (id) {
+if (jalview.io.StockholmFile.typeIds.containsKey (id)) {
+return jalview.io.StockholmFile.typeIds.get (id);
+}System.err.println ("Warning : Unknown Stockholm annotation type code " + id);
+return id;
+}, "~S");
+c$.type2id = Clazz.defineMethod (c$, "type2id", 
+function (type) {
+var key = null;
+var e = jalview.io.StockholmFile.typeIds.keys ();
+while (e.hasMoreElements ()) {
+var ll = e.nextElement ();
+if (jalview.io.StockholmFile.typeIds.get (ll).toString ().equals (type)) {
+key = ll;
+break;
+}}
+if (key != null) {
+return key;
+}System.err.println ("Warning : Unknown Stockholm annotation type: " + type);
+return key;
+}, "~S");
+Clazz.defineMethod (c$, "safeName", 
+ function (dataName) {
+var b = 0;
+while ((b = dataName.indexOf ("/")) > -1 && b < dataName.length) {
+dataName = dataName.substring (b + 1).trim ();
+}
+var e = (dataName.length - dataName.indexOf (".")) + 1;
+dataName = dataName.substring (1, e).trim ();
+return dataName;
+}, "~S");
+Clazz.defineStatics (c$,
+"typeIds", null);
+{
+if (jalview.io.StockholmFile.typeIds == null) {
+jalview.io.StockholmFile.typeIds =  new java.util.Hashtable ();
+jalview.io.StockholmFile.typeIds.put ("SS", "secondary structure");
+jalview.io.StockholmFile.typeIds.put ("SA", "surface accessibility");
+jalview.io.StockholmFile.typeIds.put ("TM", "transmembrane");
+jalview.io.StockholmFile.typeIds.put ("PP", "posterior probability");
+jalview.io.StockholmFile.typeIds.put ("LI", "ligand binding");
+jalview.io.StockholmFile.typeIds.put ("AS", "active site");
+jalview.io.StockholmFile.typeIds.put ("IN", "intron");
+jalview.io.StockholmFile.typeIds.put ("IR", "interacting residue");
+jalview.io.StockholmFile.typeIds.put ("AC", "accession");
+jalview.io.StockholmFile.typeIds.put ("OS", "organism");
+jalview.io.StockholmFile.typeIds.put ("CL", "class");
+jalview.io.StockholmFile.typeIds.put ("DE", "description");
+jalview.io.StockholmFile.typeIds.put ("DR", "reference");
+jalview.io.StockholmFile.typeIds.put ("LO", "look");
+jalview.io.StockholmFile.typeIds.put ("RF", "reference positions");
+}}});