X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FAnnotationFile.java;h=69926b5afd3b9cec4f58f64a47bae499535cc189;hb=a45774ee31d9f35d4eff46d54d7deab719afb092;hp=ef2673a8c9aa54aae7f3a253aedd34ef6036c5b1;hpb=8a6fa9ea9900d0f106529c3f6283e7f9d76dd2cb;p=jalview.git diff --git a/src/jalview/io/AnnotationFile.java b/src/jalview/io/AnnotationFile.java index ef2673a..69926b5 100755 --- a/src/jalview/io/AnnotationFile.java +++ b/src/jalview/io/AnnotationFile.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 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.getShowNonconserved() + "\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,16 +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)); } } } @@ -566,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; } @@ -646,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; } @@ -729,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; @@ -784,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(); @@ -826,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) @@ -1372,7 +1477,7 @@ public class AnnotationFile else { sp.append(atos.substring(p)); - sp.append("\n"); + sp.append(newline); } p = cp + 1; } while (p > 0);