X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FStockholmFile.java;h=72bf86ab4733078b3ad44977dcea85c05246ea3f;hb=eb3e681d6e82ccdd5d312d1981dfb306e7f479f0;hp=4697262a7143db6b8fb022a0c98fe26b910801e6;hpb=90cf1b4dbeb37554fd4b654c1da523f5791383e4;p=jalview.git diff --git a/src/jalview/io/StockholmFile.java b/src/jalview/io/StockholmFile.java index 4697262..72bf86a 100644 --- a/src/jalview/io/StockholmFile.java +++ b/src/jalview/io/StockholmFile.java @@ -23,22 +23,6 @@ */ package jalview.io; -import jalview.analysis.Rna; -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.Annotation; -import jalview.datamodel.DBRefEntry; -import jalview.datamodel.DBRefSource; -import jalview.datamodel.Mapping; -import jalview.datamodel.Sequence; -import jalview.datamodel.SequenceFeature; -import jalview.datamodel.SequenceI; -import jalview.schemes.ResidueProperties; -import jalview.util.Comparison; -import jalview.util.DBRefUtils; -import jalview.util.Format; -import jalview.util.MessageManager; - import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; @@ -47,6 +31,7 @@ import java.util.Enumeration; import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Vector; @@ -55,8 +40,21 @@ import com.stevesoft.pat.Regex; import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; import fr.orsay.lri.varna.factories.RNAFactory; import fr.orsay.lri.varna.models.rna.RNA; - -// import org.apache.log4j.*; +import jalview.analysis.Rna; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.Annotation; +import jalview.datamodel.DBRefEntry; +import jalview.datamodel.DBRefSource; +import jalview.datamodel.Mapping; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceFeature; +import jalview.datamodel.SequenceI; +import jalview.schemes.ResidueProperties; +import jalview.util.Comparison; +import jalview.util.DBRefUtils; +import jalview.util.Format; +import jalview.util.MessageManager; /** * This class is supposed to parse a Stockholm format file into Jalview There @@ -78,20 +76,21 @@ public class StockholmFile extends AlignFile { private static final String ANNOTATION = "annotation"; - private static final Regex OPEN_PAREN = new Regex("(<|\\[)", "("); - - private static final Regex CLOSE_PAREN = new Regex("(>|\\])", ")"); + // private static final Regex OPEN_PAREN = new Regex("(<|\\[)", "("); + // + // private static final Regex CLOSE_PAREN = new Regex("(>|\\])", ")"); public static final Regex DETECT_BRACKETS = new Regex( "(<|>|\\[|\\]|\\(|\\)|\\{|\\})"); - // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using NOT_RNASS first. + // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using + // NOT_RNASS first. public static final String RNASS_BRACKETS = "<>[](){}AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"; // use the following regex to decide an annotations (whole) line is NOT an RNA // SS (it contains only E,H,e,h and other non-brace/non-alpha chars) private static final Regex NOT_RNASS = new Regex( - "^[^<>[\\](){}A-DF-Za-df-z]*$"); + "^[^<>[\\](){}ADFJ-RUVWYZadfj-ruvwyz]*$"); StringBuffer out; // output buffer @@ -148,19 +147,20 @@ public class StockholmFile extends AlignFile + umcp.getMessage() + ")"; throw new IOException(umcp); } - // DEBUG System.out.println("this is the secondary scructure:" + // DEBUG jalview.bin.Console.outPrintln("this is the secondary scructure:" // +result.size()); SequenceI[] seqs = new SequenceI[result.size()]; String id = null; for (int i = 0; i < result.size(); i++) { - // DEBUG System.err.println("Processing i'th sequence in Stockholm file") + // DEBUG jalview.bin.Console.errPrintln("Processing i'th sequence in + // Stockholm file") RNA current = result.get(i); String seq = current.getSeq(); String rna = current.getStructDBN(true); - // DEBUG System.out.println(seq); - // DEBUG System.err.println(rna); + // DEBUG jalview.bin.Console.outPrintln(seq); + // DEBUG jalview.bin.Console.errPrintln(rna); int begin = 0; int end = seq.length() - 1; id = safeName(getDataName()); @@ -219,8 +219,9 @@ public class StockholmFile extends AlignFile r = new Regex("# STOCKHOLM ([\\d\\.]+)"); if (!r.search(nextLine())) { - throw new IOException(MessageManager - .getString("exception.stockholm_invalid_format")); + throw new IOException( + MessageManager.getString("exception.stockholm_invalid_format") + + " (" + r + ")"); } else { @@ -241,8 +242,8 @@ public class StockholmFile extends AlignFile Regex openparen = new Regex("(<|\\[)", "("); Regex closeparen = new Regex("(>|\\])", ")"); - // Detect if file is RNA by looking for bracket types - Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))"); + // // Detect if file is RNA by looking for bracket types + // Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))"); rend.optimize(); p.optimize(); @@ -263,7 +264,7 @@ public class StockholmFile extends AlignFile // End of the alignment, pass stuff back this.noSeqs = seqs.size(); - String seqdb, dbsource = null; + String dbsource = null; Regex pf = new Regex("PF[0-9]{5}(.*)"); // Finds AC for Pfam Regex rf = new Regex("RF[0-9]{5}(.*)"); // Finds AC for Rfam if (getAlignmentProperty("AC") != null) @@ -338,7 +339,8 @@ public class StockholmFile extends AlignFile if (dbr != null) { // we could get very clever here - but for now - just try to - // guess accession type from type of sequence, source of alignment plus + // guess accession type from type of sequence, source of alignment + // plus // structure // of accession guessDatabaseFor(seqO, dbr, dbsource); @@ -440,7 +442,7 @@ public class StockholmFile extends AlignFile } else if (!r.search(line)) { - // System.err.println("Found sequence line: " + line); + // jalview.bin.Console.errPrintln("Found sequence line: " + line); // Split sequence in sequence and accession parts if (!x.search(line)) @@ -464,7 +466,8 @@ public class StockholmFile extends AlignFile String annType = r.stringMatched(1); String annContent = r.stringMatched(2); - // System.err.println("type:" + annType + " content: " + annContent); + // jalview.bin.Console.errPrintln("type:" + annType + " content: " + + // annContent); if (annType.equals("GF")) { @@ -526,8 +529,10 @@ public class StockholmFile extends AlignFile treeName = an.stringMatched(2); treeString = new StringBuffer(); } - // TODO: JAL-3532 - this is where GF comments and database references are lost - // suggest overriding this method for Stockholm files to catch and properly + // TODO: JAL-3532 - this is where GF comments and database + // references are lost + // suggest overriding this method for Stockholm files to catch and + // properly // process CC, DR etc into multivalued properties setAlignmentProperty(an.stringMatched(1), an.stringMatched(2)); } @@ -564,7 +569,8 @@ public class StockholmFile extends AlignFile else { // throw new IOException("Error parsing " + line); - System.err.println(">> missing annotation: " + line); + jalview.bin.Console + .errPrintln(">> missing annotation: " + line); } } else if (annType.equals("GC")) @@ -682,7 +688,7 @@ public class StockholmFile extends AlignFile // } else { - System.err.println( + jalview.bin.Console.errPrintln( "Warning - couldn't parse sequence annotation row line:\n" + line); // throw new IOException("Error parsing " + line); @@ -759,7 +765,8 @@ public class StockholmFile extends AlignFile } if (dbsource == null) { - // make up an origin based on whether the sequence looks like it is nucleotide + // make up an origin based on whether the sequence looks like it is + // nucleotide // or protein dbsource = (seqO.isProtein()) ? "PFAM" : "RFAM"; } @@ -933,7 +940,7 @@ public class StockholmFile extends AlignFile annot.annotations.length); System.arraycopy(els, 0, anns, annot.annotations.length, els.length); annot.annotations = anns; - // System.out.println("else: "); + // jalview.bin.Console.outPrintln("else: "); } return annot; } @@ -943,6 +950,7 @@ public class StockholmFile extends AlignFile return ref.getSource().toString() + " ; " + ref.getAccessionId().toString(); } + @Override public String print(SequenceI[] s, boolean jvSuffix) { @@ -954,34 +962,37 @@ public class StockholmFile extends AlignFile int max = 0; int maxid = 0; int in = 0; - Hashtable dataRef = null; + int slen = s.length; + SequenceI seq; + Hashtable dataRef = null; boolean isAA = s[in].isProtein(); - while ((in < s.length) && (s[in] != null)) + while ((in < slen) && ((seq = s[in]) != null)) { - - String tmp = printId(s[in], jvSuffix); - max = Math.max(max, s[in].getLength()); + String tmp = printId(seq, jvSuffix); + max = Math.max(max, seq.getLength()); if (tmp.length() > maxid) { maxid = tmp.length(); } - if (s[in].getDBRefs() != null) + List seqrefs = seq.getDBRefs(); + int ndb; + if (seqrefs != null && (ndb = seqrefs.size()) > 0) { if (dataRef == null) { - dataRef = new Hashtable(); + dataRef = new Hashtable<>(); } - List primrefs = s[in].getPrimaryDBRefs(); + List primrefs = seq.getPrimaryDBRefs(); if (primrefs.size() >= 1) { dataRef.put(tmp, dbref_to_ac_record(primrefs.get(0))); } else { - for (int idb = 0; idb < s[in].getDBRefs().length; idb++) + for (int idb = 0; idb < seq.getDBRefs().size(); idb++) { - DBRefEntry dbref = s[in].getDBRefs()[idb]; + DBRefEntry dbref = seq.getDBRefs().get(idb); dataRef.put(tmp, dbref_to_ac_record(dbref)); // if we put in a uniprot or EMBL record then we're done: if (isAA && DBRefSource.UNIPROT @@ -1020,11 +1031,11 @@ public class StockholmFile extends AlignFile // output database accessions if (dataRef != null) { - Enumeration en = dataRef.keys(); + Enumeration en = dataRef.keys(); while (en.hasMoreElements()) { Object idd = en.nextElement(); - String type = (String) dataRef.remove(idd); + String type = dataRef.remove(idd); out.append(new Format("%-" + (maxid - 2) + "s") .form("#=GS " + idd.toString() + " ")); if (isAA && type.contains("UNIPROT") @@ -1041,14 +1052,23 @@ public class StockholmFile extends AlignFile } } - // output annotations - while (i < s.length && s[i] != null) + // output description and annotations + + while (i < slen && (seq = s[i]) != null) { - AlignmentAnnotation[] alAnot = s[i].getAnnotation(); + if (seq.getDescription() != null) + { + // out.append("#=GR "); + out.append(new Format("%-" + maxid + "s").form("#=GS " + + printId(seq, jvSuffix) + " DE " + seq.getDescription())); + out.append(newline); + } + + AlignmentAnnotation[] alAnot = seq.getAnnotation(); if (alAnot != null) { Annotation[] ann; - for (int j = 0; j < alAnot.length; j++) + for (int j = 0, nj = alAnot.length; j < nj; j++) { String key = type2id(alAnot[j].label); @@ -1068,37 +1088,38 @@ public class StockholmFile extends AlignFile // out.append("#=GR "); out.append(new Format("%-" + maxid + "s").form( - "#=GR " + printId(s[i], jvSuffix) + " " + key + " ")); + "#=GR " + printId(seq, jvSuffix) + " " + key + " ")); ann = alAnot[j].annotations; - String seq = ""; - for (int k = 0; k < ann.length; k++) + String sseq = ""; + for (int k = 0, nk = ann.length; k < nk; k++) { - seq += outputCharacter(key, k, isrna, ann, s[i]); + sseq += outputCharacter(key, k, isrna, ann, seq); } - out.append(seq); + out.append(sseq); out.append(newline); } } out.append(new Format("%-" + maxid + "s") - .form(printId(s[i], jvSuffix) + " ")); - out.append(s[i].getSequenceAsString()); + .form(printId(seq, jvSuffix) + " ")); + out.append(seq.getSequenceAsString()); out.append(newline); i++; } // alignment annotation AlignmentAnnotation aa; - if (al.getAlignmentAnnotation() != null) + AlignmentAnnotation[] an = al.getAlignmentAnnotation(); + if (an != null) { - for (int ia = 0; ia < al.getAlignmentAnnotation().length; ia++) + for (int ia = 0, na = an.length; ia < na; ia++) { - aa = al.getAlignmentAnnotation()[ia]; + aa = an[ia]; if (aa.autoCalculated || !aa.visible || aa.sequenceRef != null) { continue; } - String seq = ""; + String sseq = ""; String label; String key = ""; if (aa.label.equals("seq")) @@ -1107,7 +1128,7 @@ public class StockholmFile extends AlignFile } else { - key = type2id(aa.label.toLowerCase()); + key = type2id(aa.label.toLowerCase(Locale.ROOT)); if (key == null) { label = aa.label; @@ -1126,11 +1147,11 @@ public class StockholmFile extends AlignFile out.append( new Format("%-" + maxid + "s").form("#=GC " + label + " ")); boolean isrna = aa.isValidStruc(); - for (int j = 0; j < aa.annotations.length; j++) + for (int j = 0, nj = aa.annotations.length; j < nj; j++) { - seq += outputCharacter(key, j, isrna, aa.annotations, null); + sseq += outputCharacter(key, j, isrna, aa.annotations, null); } - out.append(seq); + out.append(sseq); out.append(newline); } } @@ -1252,7 +1273,7 @@ public class StockholmFile extends AlignFile { return (String) typeIds.get(id); } - System.err.println( + jalview.bin.Console.errPrintln( "Warning : Unknown Stockholm annotation type code " + id); return id; } @@ -1274,7 +1295,7 @@ public class StockholmFile extends AlignFile { return key; } - System.err.println( + jalview.bin.Console.errPrintln( "Warning : Unknown Stockholm annotation type: " + type); return key; }