X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Fio%2FStockholmFile.java;h=0274abc314febc5ef95a661c419c923c92648a3a;hp=c546930c73162402dc42511e6d7598704800fa18;hb=17e77c3f2949a0729322b4a8d907f3f34b6a9914;hpb=77924f33d569a50bf5229b5ecc6504dbe823a9fa diff --git a/src/jalview/io/StockholmFile.java b/src/jalview/io/StockholmFile.java index c546930..0274abc 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 2.9) + * Copyright (C) 2015 The Jalview Authors * * This file is part of Jalview. * @@ -199,7 +199,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")); } else { @@ -417,9 +419,11 @@ public class StockholmFile extends AlignFile if (!x.search(line)) { // logger.error("Could not parse sequence line: " + line); - throw new IOException(MessageManager.formatMessage("exception.couldnt_parse_sequence_line", new String[]{line})); + throw new IOException(MessageManager.formatMessage( + "exception.couldnt_parse_sequence_line", + new String[] { line })); } - String ns = (String) seqs.get(x.stringMatched(1)); + String ns = seqs.get(x.stringMatched(1)); if (ns == null) { ns = ""; @@ -529,7 +533,9 @@ public class StockholmFile extends AlignFile } else { - throw new IOException(MessageManager.formatMessage("exception.error_parsing_line", new String[]{line})); + // throw new IOException(MessageManager.formatMessage( + // "exception.error_parsing_line", new String[] { line })); + System.err.println(">> missing annotation: " + line); } } else if (annType.equals("GC")) @@ -658,7 +664,9 @@ public class StockholmFile extends AlignFile } else { - throw new IOException(MessageManager.formatMessage("exception.unknown_annotation_detected", new String[]{annType,annContent})); + throw new IOException(MessageManager.formatMessage( + "exception.unknown_annotation_detected", new String[] { + annType, annContent })); } } } @@ -771,9 +779,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); } @@ -818,25 +825,29 @@ public class StockholmFile extends AlignFile // be written out if (ss) { - if (detectbrackets.search(pos)) + // if (" .-_".indexOf(pos) == -1) { - ann.secondaryStructure = jalview.schemes.ResidueProperties - .getRNASecStrucState(pos).charAt(0); - } - else - { - ann.secondaryStructure = jalview.schemes.ResidueProperties - .getDssp3state(pos).charAt(0); - } + 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) || pos.charAt(0) == 'C') - { - ann.displayCharacter = ""; // null; // " "; - } - else - { - ann.displayCharacter = " " + ann.displayCharacter; + if (ann.secondaryStructure == pos.charAt(0)) + { + ann.displayCharacter = ""; // null; // " "; + } + else + { + ann.displayCharacter = " " + ann.displayCharacter; + } } + } els[i] = ann; @@ -966,6 +977,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) @@ -977,33 +989,11 @@ public class StockholmFile extends AlignFile out.append(new Format("%-" + maxid + "s").form("#=GR " + printId(s[i]) + " " + key + " ")); ann = alAnot[j].annotations; + boolean isrna = alAnot[j].isValidStruc(); String seq = ""; for (int k = 0; k < ann.length; k++) { - annot = ann[k]; - String ch = (annot == null) ? Character.toString(s[i] - .getCharAt(k)) : annot.displayCharacter; - if (ch.length() == 0) - { - if (key.equals("SS")) - { - char ll = annot.secondaryStructure; - seq = (Character.toString(ll).equals(" ")) ? seq + "C" - : seq + ll; - } - else - { - seq += "."; - } - } - else if (ch.length() == 1) - { - seq += ch; - } - else if (ch.length() > 1) - { - seq += ch.charAt(1); - } + seq += outputCharacter(key, k, isrna, ann, s[i]); } out.append(seq); out.append(newline); @@ -1024,54 +1014,41 @@ public class StockholmFile extends AlignFile for (int ia = 0; ia < al.getAlignmentAnnotation().length; ia++) { aa = al.getAlignmentAnnotation()[ia]; - if (aa.autoCalculated || !aa.visible) + if (aa.autoCalculated || !aa.visible || aa.sequenceRef != null) { continue; } String seq = ""; String label; - + String key = ""; if (aa.label.equals("seq")) { label = "seq_cons"; } else { - label = type2id(aa.label.toLowerCase()) + "_cons"; + key = type2id(aa.label.toLowerCase()); + if (key == null) + { + label = aa.label; + } + else + { + label = key + "_cons"; + } } - if (label == null) { label = aa.label; } + label = label.replace(" ", "_"); out.append(new Format("%-" + maxid + "s").form("#=GC " + label + " ")); boolean isrna = aa.isValidStruc(); for (int j = 0; j < aa.annotations.length; j++) { - String ch = (aa.annotations[j] == null) ? "-" - : aa.annotations[j].displayCharacter; - if (ch.length() == 0 || isrna) - { - char ll = aa.annotations[j].secondaryStructure; - if (Character.toString(ll).equals(" ")) - { - seq += "C"; - } - else - { - seq += ll; - } - } - else if (ch.length() == 1) - { - seq += ch; - } - else if (ch.length() > 1) - { - seq += ch.charAt(1); - } + seq += outputCharacter(key, j, isrna, aa.annotations, null); } out.append(seq); out.append(newline); @@ -1080,6 +1057,55 @@ public class StockholmFile extends AlignFile return out.toString(); } + /** + * add an annotation character to the output row + * + * @param seq + * @param key + * @param k + * @param isrna + * @param ann + * @param 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; + 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); + } + else + { + // valid secondary structure AND no alternative label (e.g. ' B') + 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; + } + public String print() { out = new StringBuffer();