X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FAnnotationFile.java;h=d4284a24e8612682f3b7492c856a3bc332c5f8e6;hb=329abf57c756ac530604dce9136045b0bd5ffaca;hp=aeaf2f3fdaa5a6672352c84629b94607b7217dee;hpb=d423f22792e47dbc800ae220a58677f988971d06;p=jalview.git diff --git a/src/jalview/io/AnnotationFile.java b/src/jalview/io/AnnotationFile.java index aeaf2f3..d4284a2 100755 --- a/src/jalview/io/AnnotationFile.java +++ b/src/jalview/io/AnnotationFile.java @@ -1,5 +1,5 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * * This file is part of Jalview. @@ -27,8 +27,41 @@ import jalview.schemes.*; public class AnnotationFile { - StringBuffer text = new StringBuffer("JALVIEW_ANNOTATION\n" - + "# Created: " + new java.util.Date() + "\n\n"); + public AnnotationFile() + { + init(); + } + + /** + * character used to write newlines + */ + protected String newline = System.getProperty("line.separator"); + + /** + * set new line string and reset the output buffer + * + * @param nl + */ + public void setNewlineString(String nl) + { + newline = nl; + init(); + } + + public String getNewlineString() + { + return newline; + } + + StringBuffer text; + + private void init() + { + text = new StringBuffer("JALVIEW_ANNOTATION"+newline + "# Created: " + + new java.util.Date() + newline + newline); + refSeq = null; + refSeqId = null; + } /** * convenience method for pre-2.4 feature files which have no view, hidden @@ -118,7 +151,9 @@ public class AnnotationFile { if (refSeq != null) { - text.append("\nSEQUENCE_REF\tALIGNMENT\n"); + text.append(newline); + text.append("SEQUENCE_REF\tALIGNMENT"); + text.append(newline); } refSeq = null; @@ -129,7 +164,10 @@ public class AnnotationFile if (refSeq == null || refSeq != row.sequenceRef) { refSeq = row.sequenceRef; - text.append("\nSEQUENCE_REF\t" + refSeq.getName() + "\n"); + text.append(newline); + text.append("SEQUENCE_REF\t"); + text.append(refSeq.getName()); + text.append(newline); } } // mark any group references for the row @@ -138,7 +176,9 @@ public class AnnotationFile if (refGroup != null) { - text.append("\nGROUP_REF\tALIGNMENT\n"); + text.append(newline); + text.append("GROUP_REF\tALIGNMENT"); + text.append(newline); } refGroup = null; @@ -148,7 +188,10 @@ public class AnnotationFile if (refGroup == null || refGroup != row.groupRef) { refGroup = row.groupRef; - text.append("\nGROUP_REF\t" + refGroup.getName() + "\n"); + text.append(newline); + text.append("GROUP_REF\t"); + text.append(refGroup.getName()); + text.append(newline); } } @@ -194,16 +237,16 @@ public class AnnotationFile if (row.getThreshold() != null) { - graphLine - .append("GRAPHLINE\t" - + row.label - + "\t" - + row.getThreshold().value - + "\t" - + row.getThreshold().label - + "\t" - + jalview.util.Format.getHexString(row - .getThreshold().colour) + "\n"); + graphLine.append("GRAPHLINE\t"); + graphLine.append(row.label); + graphLine.append("\t"); + graphLine.append(row.getThreshold().value); + graphLine.append("\t"); + graphLine.append(row.getThreshold().label); + graphLine.append("\t"); + graphLine.append(jalview.util.Format.getHexString(row + .getThreshold().colour)); + graphLine.append(newline); } if (row.graphGroup > -1) @@ -308,25 +351,32 @@ public class AnnotationFile if (row.hasScore()) text.append("\t" + row.score); - text.append("\n"); + text.append(newline); if (color != null && color != java.awt.Color.black && oneColour) { - colours.append("COLOUR\t" + row.label + "\t" - + jalview.util.Format.getHexString(color) + "\n"); + colours.append("COLOUR\t"); + colours.append(row.label); + colours.append("\t"); + colours.append(jalview.util.Format.getHexString(color)); + colours.append(newline); } if (row.scaleColLabel || row.showAllColLabels || row.centreColLabels) { - rowprops.append("ROWPROPERTIES\t" + row.label); - rowprops.append("\tscaletofit=" + row.scaleColLabel); - rowprops.append("\tshowalllabs=" + row.showAllColLabels); - rowprops.append("\tcentrelabs=" + row.centreColLabels); - rowprops.append("\n"); + rowprops.append("ROWPROPERTIES\t"); + rowprops.append(row.label); + rowprops.append("\tscaletofit="); + rowprops.append(row.scaleColLabel); + rowprops.append("\tshowalllabs="); + rowprops.append(row.showAllColLabels); + rowprops.append("\tcentrelabs="); + rowprops.append(row.centreColLabels); + rowprops.append(newline); } } - text.append("\n"); + text.append(newline); text.append(colours.toString()); text.append(graphLine.toString()); @@ -336,7 +386,8 @@ public class AnnotationFile Enumeration en = graphGroup.elements(); while (en.hasMoreElements()) { - text.append(en.nextElement() + "\n"); + text.append(en.nextElement()); + text.append(newline); } } text.append(rowprops.toString()); @@ -349,12 +400,17 @@ public class AnnotationFile if (properties != null) { - text.append("\n\nALIGNMENT"); + text.append(newline); + text.append(newline); + text.append("ALIGNMENT"); Enumeration en = properties.keys(); while (en.hasMoreElements()) { String key = en.nextElement().toString(); - text.append("\t" + key + "=" + properties.get(key)); + text.append("\t"); + text.append(key); + text.append("="); + text.append(properties.get(key)); } // TODO: output alignment visualization settings here if required @@ -380,61 +436,90 @@ public class AnnotationFile else { seqrep = sg.getSeqrep(); - text.append("SEQUENCE_REF\t" + seqrep.getName() + "\n"); - text.append("SEQUENCE_GROUP\t" + sg.getName() + "\t" - + (seqrep.findPosition(sg.getStartRes())) + "\t" - + (seqrep.findPosition(sg.getEndRes())) + "\t" + "-1\t"); + text.append("SEQUENCE_REF\t"); + text.append(seqrep.getName()); + text.append(newline); + text.append("SEQUENCE_GROUP\t"); + text.append(sg.getName()); + text.append("\t"); + text.append((seqrep.findPosition(sg.getStartRes()))); + text.append("\t"); + text.append((seqrep.findPosition(sg.getEndRes()))); + text.append("\t"); + text.append("-1\t"); } for (int s = 0; s < sg.getSize(); s++) { - text.append(sg.getSequenceAt(s).getName() + "\t"); + text.append(sg.getSequenceAt(s).getName()); + text.append("\t"); } - - text.append("\nPROPERTIES\t" + sg.getName() + "\t"); + text.append(newline); + text.append("PROPERTIES\t"); + text.append(sg.getName()); + text.append("\t"); if (sg.getDescription() != null) { - text.append("description=" + sg.getDescription() + "\t"); + text.append("description="); + text.append(sg.getDescription()); + text.append("\t"); } if (sg.cs != null) { - text.append("colour=" + ColourSchemeProperty.getColourName(sg.cs) - + "\t"); + text.append("colour="); + text.append(ColourSchemeProperty.getColourName(sg.cs)); + text.append("\t"); if (sg.cs.getThreshold() != 0) { - text.append("pidThreshold=" + sg.cs.getThreshold()); + text.append("pidThreshold="); + text.append(sg.cs.getThreshold()); } if (sg.cs.conservationApplied()) { - text.append("consThreshold=" + sg.cs.getConservationInc() + "\t"); + text.append("consThreshold="); + text.append(sg.cs.getConservationInc()); + text.append("\t"); } } - text.append("outlineColour=" - + jalview.util.Format.getHexString(sg.getOutlineColour()) - + "\t"); - - text.append("displayBoxes=" + sg.getDisplayBoxes() + "\t"); - text.append("displayText=" + sg.getDisplayText() + "\t"); - text.append("colourText=" + sg.getColourText() + "\t"); - text.append("showUnconserved=" + sg.getShowunconserved() + "\t"); + text.append("outlineColour="); + text.append(jalview.util.Format.getHexString(sg.getOutlineColour())); + text.append("\t"); + + text.append("displayBoxes="); + text.append(sg.getDisplayBoxes()); + text.append("\t"); + text.append("displayText="); + text.append(sg.getDisplayText()); + text.append("\t"); + text.append("colourText="); + text.append(sg.getColourText()); + text.append("\t"); + text.append("showUnconserved="); + text.append(sg.getShowNonconserved()); + text.append("\t"); if (sg.textColour != java.awt.Color.black) { - text.append("textCol1=" - + jalview.util.Format.getHexString(sg.textColour) + "\t"); + text.append("textCol1="); + text.append(jalview.util.Format.getHexString(sg.textColour)); + text.append("\t"); } if (sg.textColour2 != java.awt.Color.white) { - text.append("textCol2=" - + jalview.util.Format.getHexString(sg.textColour2) + "\t"); + text.append("textCol2="); + text.append(jalview.util.Format.getHexString(sg.textColour2)); + text.append("\t"); } if (sg.thresholdTextColour != 0) { - text.append("textColThreshold=" + sg.thresholdTextColour + "\t"); + text.append("textColThreshold="); + text.append(sg.thresholdTextColour); + text.append("\t"); } if (sg.idColour != null) { - text.append("idColour=" - + jalview.util.Format.getHexString(sg.idColour) + "\t"); + text.append("idColour="); + text.append(jalview.util.Format.getHexString(sg.idColour)); + text.append("\t"); } if (sg.isHidereps()) { @@ -447,9 +532,11 @@ public class AnnotationFile if (seqrep != null) { // terminate the last line and clear the sequence ref for the group - text.append("\nSEQUENCE_REF"); + text.append(newline); + text.append("SEQUENCE_REF"); } - text.append("\n\n"); + text.append(newline); + text.append(newline); } } @@ -461,13 +548,9 @@ public class AnnotationFile public boolean readAnnotationFile(AlignmentI al, String file, String protocol) { - String groupRef = null; - Hashtable groupRefRows = new Hashtable(); - - Hashtable autoAnnots = new Hashtable(); + BufferedReader in = null; try { - BufferedReader in = null; if (protocol.equals(AppletFormatAdapter.FILE)) { in = new BufferedReader(new FileReader(file)); @@ -489,7 +572,29 @@ public class AnnotationFile in = new BufferedReader(new java.io.InputStreamReader(is)); } } + if (in != null) + { + return parseAnnotationFrom(al, in); + } + + } catch (Exception ex) + { + ex.printStackTrace(); + System.out.println("Problem reading annotation file: " + ex); + return false; + } + return false; + } + + public boolean parseAnnotationFrom(AlignmentI al, BufferedReader in) + throws Exception + { + boolean modified = false; + String groupRef = null; + Hashtable groupRefRows = new Hashtable(); + Hashtable autoAnnots = new Hashtable(); + { String line, label, description, token; int graphStyle, index; int refSeqIndex = 1; @@ -508,14 +613,11 @@ public class AnnotationFile if (aa[aai].autoCalculated) { // make a note of the name and description - autoAnnots.put(aa[aai].graph - + "\t" - + aa[aai].label - + "\t" - + aa[aai].description - + "\t" - + (aa[aai].sequenceRef != null ? aa[aai].sequenceRef - .getDisplayId(true) : ""), new Integer(1)); + autoAnnots.put( + autoAnnotsKey(aa[aai], aa[aai].sequenceRef, + (aa[aai].groupRef == null ? null + : aa[aai].groupRef.getName())), + new Integer(1)); } } } @@ -564,22 +666,26 @@ public class AnnotationFile { // TODO: use graduated colour def'n here too colourAnnotations(al, st.nextToken(), st.nextToken()); + modified = true; continue; } else if (token.equalsIgnoreCase("COMBINE")) { combineAnnotations(al, st); + modified = true; continue; } else if (token.equalsIgnoreCase("ROWPROPERTIES")) { addRowProperties(al, st); + modified = true; continue; } else if (token.equalsIgnoreCase("GRAPHLINE")) { addLine(al, st); + modified = true; continue; } @@ -644,17 +750,20 @@ public class AnnotationFile else if (token.equalsIgnoreCase("PROPERTIES")) { addProperties(al, st); + modified = true; continue; } else if (token.equalsIgnoreCase("BELOW_ALIGNMENT")) { setBelowAlignment(al, st); + modified = true; continue; } else if (token.equalsIgnoreCase("ALIGNMENT")) { addAlignmentDetails(al, st); + modified = true; continue; } @@ -727,15 +836,8 @@ public class AnnotationFile annotation.score = score; if (!overrideAutoAnnot - && autoAnnots - .containsKey(annotation.graph - + "\t" - + annotation.label - + "\t" - + annotation.description - + "\t" - + (refSeq != null ? refSeq - .getDisplayId(true) : ""))) + && autoAnnots.containsKey(autoAnnotsKey(annotation, refSeq, + groupRef))) { // skip - we've already got an automatic annotation of this type. continue; @@ -782,6 +884,8 @@ public class AnnotationFile ((Vector) groupRefRows.get(groupRef)).addElement(annotation); } } + // and set modification flag + modified = true; } // Finally, resolve the groupRefs Enumeration en = groupRefRows.keys(); @@ -824,13 +928,16 @@ public class AnnotationFile } ((Vector) groupRefRows.get(groupRef)).removeAllElements(); } - } catch (Exception ex) - { - ex.printStackTrace(); - System.out.println("Problem reading annotation file: " + ex); - return false; } - return true; + return modified; + } + + private Object autoAnnotsKey(AlignmentAnnotation annotation, + SequenceI refSeq, String groupRef) + { + return annotation.graph + "\t" + annotation.label + "\t" + + annotation.description + "\t" + + (refSeq != null ? refSeq.getDisplayId(true) : ""); } Annotation parseAnnotation(String string, int graphStyle) @@ -982,45 +1089,55 @@ public class AnnotationFile int graphGroup = -1; String group = st.nextToken(); // First make sure we are not overwriting the graphIndex - for (int i = 0; i < al.getAlignmentAnnotation().length; i++) - { - if (al.getAlignmentAnnotation()[i].label.equalsIgnoreCase(group)) - { - graphGroup = al.getAlignmentAnnotation()[i].graphGroup + 1; - al.getAlignmentAnnotation()[i].graphGroup = graphGroup; - break; - } - } - - // Now update groups - while (st.hasMoreTokens()) + if (al.getAlignmentAnnotation() != null) { - group = st.nextToken(); for (int i = 0; i < al.getAlignmentAnnotation().length; i++) { if (al.getAlignmentAnnotation()[i].label.equalsIgnoreCase(group)) { + graphGroup = al.getAlignmentAnnotation()[i].graphGroup + 1; al.getAlignmentAnnotation()[i].graphGroup = graphGroup; break; } } + + // Now update groups + while (st.hasMoreTokens()) + { + group = st.nextToken(); + for (int i = 0; i < al.getAlignmentAnnotation().length; i++) + { + if (al.getAlignmentAnnotation()[i].label.equalsIgnoreCase(group)) + { + al.getAlignmentAnnotation()[i].graphGroup = graphGroup; + break; + } + } + } + } + else + { + System.err + .println("Couldn't combine annotations. None are added to alignment yet!"); } } void addLine(AlignmentI al, StringTokenizer st) { String group = st.nextToken(); - AlignmentAnnotation annotation = null; - - for (int i = 0; i < al.getAlignmentAnnotation().length; i++) + AlignmentAnnotation annotation = null, alannot[] = al + .getAlignmentAnnotation(); + if (alannot != null) { - if (al.getAlignmentAnnotation()[i].label.equalsIgnoreCase(group)) + for (int i = 0; i < alannot.length; i++) { - annotation = al.getAlignmentAnnotation()[i]; - break; + if (alannot[i].label.equalsIgnoreCase(group)) + { + annotation = alannot[i]; + break; + } } } - if (annotation == null) { return; @@ -1111,9 +1228,7 @@ public class AnnotationFile } else { - sg - .addSequence(al.getSequenceAt(Integer.parseInt(tmp) - 1), - false); + sg.addSequence(al.getSequenceAt(Integer.parseInt(tmp) - 1), false); } } } @@ -1153,13 +1268,16 @@ public class AnnotationFile centerlab = Boolean.valueOf(value).booleanValue(); } AlignmentAnnotation[] alr = al.getAlignmentAnnotation(); - for (int i = 0; i < alr.length; i++) + if (alr != null) { - if (alr[i].label.equalsIgnoreCase(label)) + for (int i = 0; i < alr.length; i++) { - alr[i].centreColLabels = centerlab; - alr[i].scaleColLabel = scaletofit; - alr[i].showAllColLabels = showalllabs; + if (alr[i].label.equalsIgnoreCase(label)) + { + alr[i].centreColLabels = centerlab; + alr[i].scaleColLabel = scaletofit; + alr[i].showAllColLabels = showalllabs; + } } } } @@ -1221,8 +1339,8 @@ public class AnnotationFile { sg.cs.setConservationInc(Integer.parseInt(value)); Conservation c = new Conservation("Group", - ResidueProperties.propHash, 3, sg.getSequences(null), sg - .getStartRes(), sg.getEndRes() + 1); + ResidueProperties.propHash, 3, sg.getSequences(null), + sg.getStartRes(), sg.getEndRes() + 1); c.calculate(); c.verdict(false, 25); @@ -1240,7 +1358,7 @@ public class AnnotationFile } else if (key.equalsIgnoreCase("showUnconserved")) { - sg.setShowunconserved(Boolean.valueOf(value).booleanValue()); + sg.setShowNonconserved(Boolean.valueOf(value).booleanValue()); } else if (key.equalsIgnoreCase("displayText")) { @@ -1290,19 +1408,35 @@ public class AnnotationFile void setBelowAlignment(AlignmentI al, StringTokenizer st) { String token; - AlignmentAnnotation aa; + AlignmentAnnotation aa, ala[] = al.getAlignmentAnnotation(); + if (ala == null) + { + System.err + .print("Warning - no annotation to set below for sequence associated annotation:"); + } while (st.hasMoreTokens()) { token = st.nextToken(); - for (int i = 0; i < al.getAlignmentAnnotation().length; i++) + if (ala == null) { - aa = al.getAlignmentAnnotation()[i]; - if (aa.sequenceRef == refSeq && aa.label.equals(token)) + System.err.print(" " + token); + } + else + { + for (int i = 0; i < al.getAlignmentAnnotation().length; i++) { - aa.belowAlignment = true; + aa = al.getAlignmentAnnotation()[i]; + if (aa.sequenceRef == refSeq && aa.label.equals(token)) + { + aa.belowAlignment = true; + } } } } + if (ala == null) + { + System.err.print("\n"); + } } void addAlignmentDetails(AlignmentI al, StringTokenizer st) @@ -1343,7 +1477,7 @@ public class AnnotationFile else { sp.append(atos.substring(p)); - sp.append("\n"); + sp.append(newline); } p = cp + 1; } while (p > 0);