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 () {
7 Clazz.instantialize (this, arguments);
8 }, jalview.io, "StockholmFile", jalview.io.AlignFile);
9 Clazz.makeConstructor (c$,
11 Clazz.superConstructor (this, jalview.io.StockholmFile, []);
13 Clazz.makeConstructor (c$,
15 Clazz.superConstructor (this, jalview.io.StockholmFile, []);
17 }, "jalview.datamodel.AlignmentI");
18 Clazz.defineMethod (c$, "parse_with_VARNA",
21 fr = new java.io.FileReader (inFile);
22 var r = new java.io.BufferedReader (fr);
25 this.result = RNAFactory.loadSecStrStockholm ();
27 if (Clazz.exceptionOf (umcp, ExceptionUnmatchedClosingParentheses)) {
28 this.errormessage = "Unmatched parentheses in annotation. Aborting (" + umcp.getMessage () + ")";
29 throw new java.io.IOException (umcp);
34 var seqs = new Array (this.result.size ());
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);
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);
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);
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);
59 Clazz.overrideMethod (c$, "parse",
61 var treeString = new StringBuffer ();
65 var seqAnn = new java.util.Hashtable ();
66 var seqs = new java.util.LinkedHashMap ();
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"));
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 ("(<|>|\\[|\\]|\\(|\\))");
90 openparen.optimize ();
91 closeparen.optimize ();
92 while ((line = this.nextLine ()) != null) {
93 if (line.length == 0) {
95 }if (rend.search (line)) {
96 this.noSeqs = seqs.size ();
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)) {
105 } else if (rf.search (dbType)) {
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;
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");
136 this.guessDatabaseFor (seqO, dbr, dbsource);
137 }}}var features = null;
139 features = accAnnotations.remove ("features");
141 if (Clazz.exceptionOf (e, NullPointerException)) {
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);
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);
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++) {
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);
175 }this.seqs.addElement (seqO);
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));
184 }ns += x.stringMatched (2);
185 seqs.put (x.stringMatched (1), ns);
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);
208 if (seqAnn.containsKey (acc)) {
209 ann = seqAnn.get (acc);
211 ann = new java.util.Hashtable ();
212 }ann.put (type, content);
213 seqAnn.put (acc, ann);
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 ();
231 description = String.instantialize ();
233 if (seqAnn.containsKey (acc)) {
234 ann = seqAnn.get (acc);
236 ann = new java.util.Hashtable ();
237 seqAnn.put (acc, ann);
239 if (ann.containsKey ("features")) {
240 features = ann.get ("features");
242 features = new java.util.Hashtable ();
243 ann.put ("features", features);
245 if (features.containsKey (this.id2type (type))) {
246 content = features.get (this.id2type (type));
248 content = new java.util.Hashtable ();
249 features.put (this.id2type (type), content);
250 }var ns = content.get (description);
254 content.put (description, ns);
256 if (seqAnn.containsKey (acc)) {
257 strucAnn = seqAnn.get (acc);
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;
265 strucAnn.put (type, newStruc);
266 seqAnn.put (acc, strucAnn);
268 System.err.println ("Warning - couldn't parse sequence annotation row line:\n" + line);
270 throw new java.io.IOException (jalview.util.MessageManager.formatMessage ("exception.unknown_annotation_detected", Clazz.newArray (-1, [annType, annContent])));
272 if (treeString.length () > 0) {
273 if (treeName == null) {
274 treeName = "Tree " + (1 + this.getTreeCount ());
275 }this.addNewickTree (treeName, treeString.toString ());
277 Clazz.defineMethod (c$, "guessDatabaseFor",
278 function (seqO, dbr, dbsource) {
280 var dbrs = new java.util.ArrayList ();
281 var seqdb = "Unknown";
282 var sdbac = "" + dbr;
286 if ((st = sdbac.indexOf ("/")) > -1) {
288 var range = sdbac.substring (st + 1);
289 sdbac = sdbac.substring (0, st);
290 if ((p = range.indexOf ("-")) > -1) {
292 if (p < range.length) {
293 num = range.substring (p).trim ();
295 en = Integer.parseInt (num);
297 if (Clazz.exceptionOf (x, NumberFormatException)) {
305 }num = range.substring (0, p).trim ();
307 st = Integer.parseInt (num);
309 if (Clazz.exceptionOf (x, NumberFormatException)) {
315 }if (dbsource.equals ("PFAM")) {
317 if (sdbac.indexOf (".") > -1) {
318 sdbac = sdbac.substring (0, sdbac.indexOf ("."));
319 dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, seqdb, dbsource, sdbac);
322 }}dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, dbsource, dbsource, dbr);
327 if (sdbac.indexOf (".") > -1) {
328 sdbac = sdbac.substring (0, sdbac.indexOf ("."));
329 dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, seqdb, dbsource, sdbac);
332 }}dbrf = jalview.util.DBRefUtils.parseToDbRef (seqO, dbsource, dbsource, dbr);
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);
341 }}, "jalview.datamodel.Sequence,~S,~S");
342 c$.parseAnnotationRow = Clazz.defineMethod (c$, "parseAnnotationRow",
343 function (annotation, label, annots) {
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);
353 if (label.contains ("_cons")) {
354 type = (label.indexOf ("_cons") == label.length - 5) ? label.substring (0, label.length - 5) : label;
356 type = jalview.io.StockholmFile.id2type (type);
357 if (type.equals ("secondary structure")) {
359 }var els = new Array (annots.length);
360 for (var i = 0; i < annots.length; i++) {
361 var pos = annots.substring (i, i + 1);
363 ann = new jalview.datamodel.Annotation (pos, "", ' ', 0);
366 if (detectbrackets.search (pos)) {
367 ann.secondaryStructure = jalview.schemes.ResidueProperties.getRNASecStrucState (pos).charAt (0);
369 ann.secondaryStructure = jalview.schemes.ResidueProperties.getDssp3state (pos).charAt (0);
370 }if (ann.secondaryStructure == pos.charAt (0)) {
371 ann.displayCharacter = "";
373 ann.displayCharacter = " " + ann.displayCharacter;
377 var e = annotation.elements ();
378 while (e.hasMoreElements ()) {
379 annot = e.nextElement ();
380 if (annot.label.equals (type)) {
385 annot = new jalview.datamodel.AlignmentAnnotation (type, type, els);
386 annotation.addElement (annot);
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;
393 }, "java.util.Vector,~S,~S");
394 Clazz.defineMethod (c$, "print",
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) {
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);
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);
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));
434 this.out.append (" DR " + type + " ");
435 }this.out.append (this.newline);
437 }while (i < s.length && s[i] != null) {
438 if (s[i].getDatasetSequence () != null) {
439 var ds = s[i].getDatasetSequence ();
443 alAnot = s[i].getAnnotation ();
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);
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 ();
456 for (var k = 0; k < ann.length; k++) {
457 seq += this.outputCharacter (key, k, isrna, ann, s[i]);
459 this.out.append (seq);
460 this.out.append (this.newline);
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);
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) {
476 if (aa.label.equals ("seq")) {
479 key = jalview.io.StockholmFile.type2id (aa.label.toLowerCase ());
483 label = key + "_cons";
484 }}if (label == null) {
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);
492 this.out.append (seq);
493 this.out.append (this.newline);
495 }return this.out.toString ();
497 Clazz.defineMethod (c$, "outputCharacter",
498 function (key, k, isrna, ann, sequenceI) {
501 var ch = (annot == null) ? ((sequenceI == null) ? "-" : Character.toString (sequenceI.getCharAt (k))) : annot.displayCharacter;
502 if (key != null && key.equals ("SS")) {
504 return sequenceI == null ? '-' : sequenceI.getCharAt (k);
506 if (annot.secondaryStructure > ' ' && ch.length < 2) {
507 return annot.secondaryStructure;
508 }}}if (ch.length == 0) {
510 } else if (ch.length == 1) {
512 } else if (ch.length > 1) {
515 }, "~S,~N,~B,~A,jalview.datamodel.SequenceI");
516 Clazz.defineMethod (c$, "print",
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 ();
526 c$.id2type = Clazz.defineMethod (c$, "id2type",
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);
533 c$.type2id = Clazz.defineMethod (c$, "type2id",
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)) {
545 }System.err.println ("Warning : Unknown Stockholm annotation type: " + type);
548 Clazz.defineMethod (c$, "safeName",
549 function (dataName) {
551 while ((b = dataName.indexOf ("/")) > -1 && b < dataName.length) {
552 dataName = dataName.substring (b + 1).trim ();
554 var e = (dataName.length - dataName.indexOf (".")) + 1;
555 dataName = dataName.substring (1, e).trim ();
558 Clazz.defineStatics (c$,
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");