X-Git-Url: http://source.jalview.org/gitweb/?p=jalviewjs.git;a=blobdiff_plain;f=site%2Fj2s%2Fjalview%2Fio%2FStockholmFile.js;fp=site%2Fj2s%2Fjalview%2Fio%2FStockholmFile.js;h=c7b8a9dbc58ba8e42a05e439158784f83567bbef;hp=877dfc8293da58da10ef4b00d21ad47ea0542e40;hb=b9b7a352eee79b7764c3b09c9d19663075061d8c;hpb=7301a2415adab88038b291fc54caeeb3a5a47a44 diff --git a/site/j2s/jalview/io/StockholmFile.js b/site/j2s/jalview/io/StockholmFile.js index 877dfc8..c7b8a9d 100644 --- a/site/j2s/jalview/io/StockholmFile.js +++ b/site/j2s/jalview/io/StockholmFile.js @@ -1,578 +1,578 @@ -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"); -}}}); +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"); +}}});