X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FStockholmFile.java;h=3fd0505738e23bbdd0da3dde1e7f9bd8868c491b;hb=ea1b74357e517baef19ef6f862bc7775f7a7804e;hp=3b9fb00576d87eb6704d52cba4d66c18616c8695;hpb=78c75d17d486be63f023a9eed386a0b40954d95b;p=jalview.git diff --git a/src/jalview/io/StockholmFile.java b/src/jalview/io/StockholmFile.java index 3b9fb00..3fd0505 100644 --- a/src/jalview/io/StockholmFile.java +++ b/src/jalview/io/StockholmFile.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -23,6 +23,7 @@ */ package jalview.io; +import jalview.analysis.Rna; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.Annotation; @@ -31,6 +32,7 @@ import jalview.datamodel.Mapping; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; +import jalview.schemes.ResidueProperties; import jalview.util.Format; import jalview.util.MessageManager; @@ -72,8 +74,12 @@ import fr.orsay.lri.varna.models.rna.RNA; */ public class StockholmFile extends AlignFile { - // static Logger logger = Logger.getLogger("jalview.io.StockholmFile"); - protected ArrayList result; + private static final Regex OPEN_PAREN = new Regex("(<|\\[)", "("); + + private static final Regex CLOSE_PAREN = new Regex("(>|\\])", ")"); + + private static final Regex DETECT_BRACKETS = new Regex( + "(<|>|\\[|\\]|\\(|\\))"); StringBuffer out; // output buffer @@ -91,7 +97,8 @@ public class StockholmFile extends AlignFile this.al = al; } - public StockholmFile(String inFile, String type) throws IOException + public StockholmFile(String inFile, DataSourceType type) + throws IOException { super(inFile, type); } @@ -101,6 +108,7 @@ public class StockholmFile extends AlignFile super(source); } + @Override public void initData() { super.initData(); @@ -118,7 +126,7 @@ public class StockholmFile extends AlignFile fr = new FileReader(inFile); BufferedReader r = new BufferedReader(fr); - result = null; + List result = null; try { result = RNAFactory.loadSecStrStockholm(r); @@ -155,9 +163,8 @@ public class StockholmFile extends AlignFile for (int k = 0; k < rna.length(); k++) { - ann[k] = new Annotation(annot[k], "", - jalview.schemes.ResidueProperties.getRNASecStrucState( - annot[k]).charAt(0), 0f); + ann[k] = new Annotation(annot[k], "", Rna.getRNASecStrucState( + annot[k]).charAt(0), 0f); } AlignmentAnnotation align = new AlignmentAnnotation("Sec. str.", @@ -178,6 +185,7 @@ public class StockholmFile extends AlignFile * @throws IOException * If there is an error with the input file */ + @Override public void parse() throws IOException { StringBuffer treeString = new StringBuffer(); @@ -420,8 +428,8 @@ public class StockholmFile extends AlignFile { // logger.error("Could not parse sequence line: " + line); throw new IOException(MessageManager.formatMessage( - "exception.couldnt_parse_sequence_line", new String[] - { line })); + "exception.couldnt_parse_sequence_line", + new String[] { line })); } String ns = seqs.get(x.stringMatched(1)); if (ns == null) @@ -533,9 +541,8 @@ public class StockholmFile extends AlignFile } else { - throw new IOException(MessageManager.formatMessage( - "exception.error_parsing_line", new String[] - { line })); + // throw new IOException("Error parsing " + line); + System.err.println(">> missing annotation: " + line); } } else if (annType.equals("GC")) @@ -665,8 +672,8 @@ public class StockholmFile extends AlignFile else { throw new IOException(MessageManager.formatMessage( - "exception.unknown_annotation_detected", new String[] - { annType, annContent })); + "exception.unknown_annotation_detected", new String[] { + annType, annContent })); } } } @@ -779,9 +786,8 @@ public class StockholmFile extends AlignFile { for (DBRefEntry d : dbrs) { - jalview.util.MapList mp = new jalview.util.MapList(new int[] - { seqO.getStart(), seqO.getEnd() }, new int[] - { st, en }, 1, 1); + jalview.util.MapList mp = new jalview.util.MapList(new int[] { + seqO.getStart(), seqO.getEnd() }, new int[] { st, en }, 1, 1); jalview.datamodel.Mapping mping = new Mapping(mp); d.setMap(mping); } @@ -789,19 +795,13 @@ public class StockholmFile extends AlignFile } protected static AlignmentAnnotation parseAnnotationRow( - Vector annotation, String label, String annots) + Vector annotation, String label, + String annots) { String convert1, convert2 = null; - // Convert all bracket types to parentheses - Regex openparen = new Regex("(<|\\[)", "("); - Regex closeparen = new Regex("(>|\\])", ")"); - - // Detect if file is RNA by looking for bracket types - Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))"); - - convert1 = openparen.replaceAll(annots); - convert2 = closeparen.replaceAll(convert1); + convert1 = OPEN_PAREN.replaceAll(annots); + convert2 = CLOSE_PAREN.replaceAll(convert1); annots = convert2; String type = label; @@ -826,17 +826,17 @@ public class StockholmFile extends AlignFile // be written out if (ss) { - //if (" .-_".indexOf(pos) == -1) + // if (" .-_".indexOf(pos) == -1) { - if (detectbrackets.search(pos)) + if (DETECT_BRACKETS.search(pos)) { - ann.secondaryStructure = jalview.schemes.ResidueProperties - .getRNASecStrucState(pos).charAt(0); + ann.secondaryStructure = Rna.getRNASecStrucState( + pos).charAt(0); } else { - ann.secondaryStructure = jalview.schemes.ResidueProperties - .getDssp3state(pos).charAt(0); + ann.secondaryStructure = ResidueProperties.getDssp3state(pos) + .charAt(0); } if (ann.secondaryStructure == pos.charAt(0)) @@ -848,16 +848,16 @@ public class StockholmFile extends AlignFile ann.displayCharacter = " " + ann.displayCharacter; } } - + } els[i] = ann; } AlignmentAnnotation annot = null; - Enumeration e = annotation.elements(); + Enumeration e = annotation.elements(); while (e.hasMoreElements()) { - annot = (AlignmentAnnotation) e.nextElement(); + annot = e.nextElement(); if (annot.label.equals(type)) { break; @@ -882,8 +882,13 @@ public class StockholmFile extends AlignFile return annot; } - public String print(SequenceI[] s) + @Override + public String print(SequenceI[] s, boolean jvSuffix) { + out = new StringBuffer(); + out.append("# STOCKHOLM 1.0"); + out.append(newline); + // find max length of id int max = 0; int maxid = 0; @@ -891,7 +896,7 @@ public class StockholmFile extends AlignFile Hashtable dataRef = null; while ((in < s.length) && (s[in] != null)) { - String tmp = printId(s[in]); + String tmp = printId(s[in], jvSuffix); if (s[in].getSequence().length > max) { max = s[in].getSequence().length; @@ -901,18 +906,18 @@ public class StockholmFile extends AlignFile { maxid = tmp.length(); } - if (s[in].getDBRef() != null) + if (s[in].getDBRefs() != null) { - for (int idb = 0; idb < s[in].getDBRef().length; idb++) + for (int idb = 0; idb < s[in].getDBRefs().length; idb++) { if (dataRef == null) { dataRef = new Hashtable(); } - String datAs1 = s[in].getDBRef()[idb].getSource().toString() + String datAs1 = s[in].getDBRefs()[idb].getSource().toString() + " ; " - + s[in].getDBRef()[idb].getAccessionId().toString(); + + s[in].getDBRefs()[idb].getAccessionId().toString(); dataRef.put(tmp, datAs1); } } @@ -978,6 +983,7 @@ public class StockholmFile extends AlignFile { feature = ds.getSequenceFeatures()[0].type; } + // ?bug - feature may still have previous loop value String key = type2id(feature); if (key == null) @@ -987,7 +993,7 @@ public class StockholmFile extends AlignFile // out.append("#=GR "); out.append(new Format("%-" + maxid + "s").form("#=GR " - + printId(s[i]) + " " + key + " ")); + + printId(s[i], jvSuffix) + " " + key + " ")); ann = alAnot[j].annotations; boolean isrna = alAnot[j].isValidStruc(); String seq = ""; @@ -1001,7 +1007,8 @@ public class StockholmFile extends AlignFile } } - out.append(new Format("%-" + maxid + "s").form(printId(s[i]) + " ")); + out.append(new Format("%-" + maxid + "s") + .form(printId(s[i], jvSuffix) + " ")); out.append(s[i].getSequenceAsString()); out.append(newline); i++; @@ -1054,6 +1061,10 @@ public class StockholmFile extends AlignFile out.append(newline); } } + + out.append("//"); + out.append(newline); + return out.toString(); } @@ -1067,21 +1078,19 @@ public class StockholmFile extends AlignFile * @param ann * @param sequenceI */ - private char outputCharacter(String key, int k, - boolean isrna, Annotation[] ann, SequenceI sequenceI) + private char outputCharacter(String key, int k, boolean isrna, + Annotation[] ann, SequenceI sequenceI) { char seq = ' '; Annotation annot = ann[k]; String ch = (annot == null) ? ((sequenceI == null) ? "-" : Character - .toString(sequenceI.getCharAt(k))) - : annot.displayCharacter; + .toString(sequenceI.getCharAt(k))) : annot.displayCharacter; if (key != null && key.equals("SS")) { if (annot == null) { // sensible gap character if one is available or make one up - return sequenceI == null ? '-' : sequenceI - .getCharAt(k); + return sequenceI == null ? '-' : sequenceI.getCharAt(k); } else { @@ -1113,7 +1122,7 @@ public class StockholmFile extends AlignFile out = new StringBuffer(); out.append("# STOCKHOLM 1.0"); out.append(newline); - print(getSeqsAsArray()); + print(getSeqsAsArray(), false); out.append("//"); out.append(newline); @@ -1121,6 +1130,7 @@ public class StockholmFile extends AlignFile } private static Hashtable typeIds = null; + static { if (typeIds == null)