X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FAnnotationFile.java;h=b3b2111540fecc0a369da12f8d9dce01630bf5d1;hb=9c00e25bfdf274009a471eba895f39e2fac4c0ac;hp=34595178c486bfbb913942cd0e948808dea16781;hpb=5f8a96e101d9e8bd2a35767588398ace4f3022ad;p=jalview.git diff --git a/src/jalview/io/AnnotationFile.java b/src/jalview/io/AnnotationFile.java index 3459517..b3b2111 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, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle * * This file is part of Jalview. * @@ -27,22 +27,55 @@ 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 * columns or hidden row keywords. * * @param annotations - * @param groups + * @param list * @param properties * @return feature file as a string. */ public String printAnnotations(AlignmentAnnotation[] annotations, - Vector groups, Hashtable properties) + List list, Hashtable properties) { - return printAnnotations(annotations, groups, properties, null); + return printAnnotations(annotations, list, properties, null); } @@ -77,13 +110,13 @@ public class AnnotationFile * properties and views. * * @param annotations - * @param groups + * @param list * @param properties * @param views * @return annotation file */ public String printAnnotations(AlignmentAnnotation[] annotations, - Vector groups, Hashtable properties, ViewDef[] views) + List list, Hashtable properties, ViewDef[] views) { // TODO: resolve views issue : annotationFile could contain visible region, // or full data + hidden region specifications for a view. @@ -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,25 +386,31 @@ 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()); } - if (groups != null) + if (list != null) { - printGroups(groups); + printGroups(list); } 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 @@ -363,13 +419,11 @@ public class AnnotationFile return text.toString(); } - public void printGroups(Vector sequenceGroups) + public void printGroups(List list) { - SequenceGroup sg; SequenceI seqrep = null; - for (int i = 0; i < sequenceGroups.size(); i++) + for (SequenceGroup sg:list) { - sg = (SequenceGroup) sequenceGroups.elementAt(i); if (!sg.hasSeqrep()) { text.append("SEQUENCE_GROUP\t" + sg.getName() + "\t" @@ -380,61 +434,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 +530,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); } } @@ -502,6 +587,7 @@ public class AnnotationFile public boolean parseAnnotationFrom(AlignmentI al, BufferedReader in) throws Exception { + boolean modified = false; String groupRef = null; Hashtable groupRefRows = new Hashtable(); @@ -525,16 +611,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)); } } } @@ -583,22 +664,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; } @@ -663,17 +748,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; } @@ -746,15 +834,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; @@ -801,20 +882,19 @@ public class AnnotationFile ((Vector) groupRefRows.get(groupRef)).addElement(annotation); } } + // and set modification flag + modified = true; } // Finally, resolve the groupRefs Enumeration en = groupRefRows.keys(); - SequenceGroup theGroup = null; - + while (en.hasMoreElements()) { groupRef = (String) en.nextElement(); boolean matched = false; // Resolve group: TODO: add a getGroupByName method to alignments - Vector grps = al.getGroups(); - for (int g = 0, gSize = grps.size(); g < gSize; g++) + for (SequenceGroup theGroup : al.getGroups()) { - theGroup = (SequenceGroup) grps.elementAt(g); if (theGroup.getName().equals(groupRef)) { if (matched) @@ -844,7 +924,15 @@ public class AnnotationFile ((Vector) groupRefRows.get(groupRef)).removeAllElements(); } } - 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) @@ -925,7 +1013,7 @@ public class AnnotationFile } } if (hasSymbols - && (token.equals("H") || token.equals("E") || token + && (token.equals("H") || token.equals("E") || token.equals("S") || token .equals(" "))) { // Either this character represents a helix or sheet @@ -1200,15 +1288,12 @@ public class AnnotationFile { return; } - SequenceGroup sg = null; - + String name = st.nextToken(); - - Vector groups = al.getGroups(); - for (int i = 0; i < groups.size(); i++) + SequenceGroup sg=null; + for (SequenceGroup _sg:al.getGroups()) { - sg = (SequenceGroup) groups.elementAt(i); - if (sg.getName().equals(name)) + if ((sg=_sg).getName().equals(name)) { break; } @@ -1250,7 +1335,7 @@ public class AnnotationFile sg.getStartRes(), sg.getEndRes() + 1); c.calculate(); - c.verdict(false, 25); + c.verdict(false, 25); // TODO: refer to conservation percent threshold sg.cs.setConservation(c); @@ -1384,7 +1469,7 @@ public class AnnotationFile else { sp.append(atos.substring(p)); - sp.append("\n"); + sp.append(newline); } p = cp + 1; } while (p > 0);