X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FAnnotationFile.java;h=49e99a105ae5703c6e8656c71b536e63e7546b35;hb=c51dbe7933683b64548f5353e67561d2b5e377f7;hp=2af3fcd8cf607271260a232929cab33fe9aa81fd;hpb=d15f5de72b92c8ac1b217362dc565c496e8f9370;p=jalview.git diff --git a/src/jalview/io/AnnotationFile.java b/src/jalview/io/AnnotationFile.java index 2af3fcd..49e99a1 100755 --- a/src/jalview/io/AnnotationFile.java +++ b/src/jalview/io/AnnotationFile.java @@ -26,17 +26,23 @@ import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.Annotation; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.DynamicData; +import jalview.datamodel.DynamicData.DataType; import jalview.datamodel.GraphLine; +import jalview.datamodel.HiddenColumns; import jalview.datamodel.HiddenSequences; +import jalview.datamodel.PDBEntry; +import jalview.datamodel.PDBEntry.Type; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemeProperty; -import jalview.schemes.UserColourScheme; +import jalview.structure.StructureSelectionManager; import jalview.util.ColorUtils; import java.awt.Color; import java.io.BufferedReader; +import java.io.File; import java.io.FileReader; import java.io.InputStreamReader; import java.io.StringReader; @@ -52,6 +58,28 @@ import java.util.Vector; public class AnnotationFile { + StringBuffer text; + + SequenceI refSeq = null; + + String refSeqId = null; + + String[] StructModelHeader = null; + + long nlinesread = 0; + + String lastread = ""; + + /** + * used for resolving absolute references to resources relative to + * annotationFile location + */ + String baseUri = ""; + + private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE", + STRUCTMODEL = "STRUCTMODEL", + HEADER_STRUCT_MODEL = "HEADER_STRUCT_MODEL"; + public AnnotationFile() { init(); @@ -78,7 +106,6 @@ public class AnnotationFile return newline; } - StringBuffer text; private void init() { @@ -110,23 +137,22 @@ public class AnnotationFile */ public class ViewDef { - public String viewname; + // TODO this class is not used - remove? + public final String viewname; - public HiddenSequences hidseqs; + public final HiddenSequences hidseqs; - public ColumnSelection hiddencols; + public final HiddenColumns hiddencols; - public Vector visibleGroups; + public final Hashtable hiddenRepSeqs; - public Hashtable hiddenRepSeqs; - - public ViewDef(String viewname, HiddenSequences hidseqs, - ColumnSelection hiddencols, Hashtable hiddenRepSeqs) + public ViewDef(String vname, HiddenSequences hseqs, + HiddenColumns hcols, Hashtable hRepSeqs) { - this.viewname = viewname; - this.hidseqs = hidseqs; - this.hiddencols = hiddencols; - this.hiddenRepSeqs = hiddenRepSeqs; + this.viewname = vname; + this.hidseqs = hseqs; + this.hiddencols = hcols; + this.hiddenRepSeqs = hRepSeqs; } } @@ -142,7 +168,8 @@ public class AnnotationFile */ public String printAnnotations(AlignmentAnnotation[] annotations, List list, Hashtable properties, - ColumnSelection cs, AlignmentI al, ViewDef view) + HiddenColumns cs, + AlignmentI al, ViewDef view) { if (view != null) { @@ -152,7 +179,7 @@ public class AnnotationFile } if (list == null) { - list = view.visibleGroups; + // list = view.visibleGroups; } if (cs == null) { @@ -171,7 +198,7 @@ public class AnnotationFile if (cs != null && cs.hasHiddenColumns()) { text.append("VIEW_HIDECOLS\t"); - List hc = cs.getHiddenColumns(); + List hc = cs.getHiddenRegions(); boolean comma = false; for (int[] r : hc) { @@ -537,7 +564,7 @@ public class AnnotationFile return false; } - public void printGroups(List list) + protected void printGroups(List list) { SequenceI seqrep = null; for (SequenceGroup sg : list) @@ -583,7 +610,8 @@ public class AnnotationFile if (sg.cs != null) { text.append("colour="); - text.append(sg.cs.toString()); + text.append(ColourSchemeProperty.getColourName(sg.cs + .getColourScheme())); text.append("\t"); if (sg.cs.getThreshold() != 0) { @@ -657,23 +685,26 @@ public class AnnotationFile } } - SequenceI refSeq = null; - - String refSeqId = null; public boolean annotateAlignmentView(AlignViewportI viewport, String file, DataSourceType protocol) { ColumnSelection colSel = viewport.getColumnSelection(); + HiddenColumns hidden = viewport.getAlignment().getHiddenColumns(); if (colSel == null) { colSel = new ColumnSelection(); } - boolean rslt = readAnnotationFile(viewport.getAlignment(), colSel, + if (hidden == null) + { + hidden = new HiddenColumns(); + } + boolean rslt = readAnnotationFile(viewport.getAlignment(), hidden, file, protocol); - if (rslt && (colSel.hasSelectedColumns() || colSel.hasHiddenColumns())) + if (rslt && (colSel.hasSelectedColumns() || hidden.hasHiddenColumns())) { viewport.setColumnSelection(colSel); + viewport.getAlignment().setHiddenColumns(hidden); } return rslt; @@ -685,24 +716,44 @@ public class AnnotationFile return readAnnotationFile(al, null, file, sourceType); } - public boolean readAnnotationFile(AlignmentI al, ColumnSelection colSel, + public boolean readAnnotationFile(AlignmentI al, HiddenColumns hidden, String file, DataSourceType sourceType) { + baseUri = ""; BufferedReader in = null; try { if (sourceType == DataSourceType.FILE) { in = new BufferedReader(new FileReader(file)); + baseUri = new File(file).getParent(); + if (baseUri == null) + { + baseUri = ""; + } + else + { + baseUri += "/"; + } } else if (sourceType == DataSourceType.URL) { URL url = new URL(file); in = new BufferedReader(new InputStreamReader(url.openStream())); + String bs = url.toExternalForm(); + baseUri = bs.substring(0, bs.indexOf(url.getHost()) + + url.getHost().length()); + baseUri += url.toURI().getPath(); + if (baseUri.lastIndexOf("/") > -1) + { + baseUri = baseUri.substring(0, baseUri.lastIndexOf("/")) + "/"; + } } else if (sourceType == DataSourceType.PASTE) { in = new BufferedReader(new StringReader(file)); + // TODO - support mimencoded PDBs for a paste.. ? + baseUri = ""; } else if (sourceType == DataSourceType.CLASSLOADER) { @@ -710,11 +761,13 @@ public class AnnotationFile if (is != null) { in = new BufferedReader(new java.io.InputStreamReader(is)); + // TODO: this probably doesn't work for classloader - needs a test + baseUri = new File("/" + file).getParent() + "/"; } } if (in != null) { - return parseAnnotationFrom(al, colSel, in); + return parseAnnotationFrom(al, hidden, in); } } catch (Exception ex) @@ -731,13 +784,8 @@ public class AnnotationFile return false; } - long nlinesread = 0; - - String lastread = ""; - private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE"; - - public boolean parseAnnotationFrom(AlignmentI al, ColumnSelection colSel, + public boolean parseAnnotationFrom(AlignmentI al, HiddenColumns hidden, BufferedReader in) throws Exception { nlinesread = 0; @@ -929,12 +977,6 @@ public class AnnotationFile modified = true; continue; } - // else if (token.equalsIgnoreCase("VIEW_DEF")) - // { - // addOrSetView(al,st); - // modified = true; - // continue; - // } else if (token.equalsIgnoreCase("VIEW_SETREF")) { if (refSeq != null) @@ -948,11 +990,11 @@ public class AnnotationFile { if (st.hasMoreTokens()) { - if (colSel == null) + if (hidden == null) { - colSel = new ColumnSelection(); + hidden = new HiddenColumns(); } - parseHideCols(colSel, st.nextToken()); + parseHideCols(hidden, st.nextToken()); } modified = true; continue; @@ -966,7 +1008,7 @@ public class AnnotationFile } if (sr != null) { - if (colSel == null) + if (hidden == null) { System.err .println("Cannot process HIDE_INSERTIONS without an alignment view: Ignoring line: " @@ -975,13 +1017,64 @@ public class AnnotationFile else { // consider deferring this till after the file has been parsed ? - colSel.hideInsertionsFor(sr); + hidden.hideInsertionsFor(sr); } } modified = true; continue; } - + else if (token.equalsIgnoreCase(HEADER_STRUCT_MODEL)) + { + int hSize = st.countTokens(); + StructModelHeader = new String[hSize]; + for (int x = 0; x < hSize; x++) + { + StructModelHeader[x] = st.nextToken(); + } + continue; + } + else if (token.equalsIgnoreCase(STRUCTMODEL)) + { + boolean failedtoadd = true; + // expects STRUCTMODEL + // + String querySeqId = !st.hasMoreTokens() ? "" : st.nextToken(); + SequenceI querySeq = al.findName(querySeqId); + if (st.hasMoreTokens()) { + refSeq = al.findName(refSeqId = st.nextToken()); + if (refSeq == null) + { + System.err.println("Couldn't locate " + refSeqId + + " in the alignment for STRUCTMODEL"); + refSeqId = null; + } + else + { + int tSize = st.countTokens() + 2; + String[] rowData = new String[tSize]; + rowData[0] = querySeqId; + rowData[1] = refSeqId; + for (int x = 2; x < tSize; x++) + { + rowData[x] = st.nextToken(); + } + if (processStructModel(al, querySeq, refSeq, + StructModelHeader, rowData, baseUri)) + { + failedtoadd = false; + } + } + } + if (failedtoadd) + { + System.err + .println("Need minimum of as tab separated fields after" + + STRUCTMODEL); + } else { + modified = true; + } + continue; + } // Parse out the annotation row graphStyle = AlignmentAnnotation.getGraphValueFromString(token); label = st.nextToken(); @@ -1181,7 +1274,101 @@ public class AnnotationFile return modified; } - private void parseHideCols(ColumnSelection colSel, String nextToken) + + /** + * Resolve structural model to a reference sequence and register it to + * StructureSelectionManager + * + * @param al + * @param querySequence + * @param templateSeq + * @param structModelHeader + * @param structModelData + * @return true if model and sequence was added + */ + static boolean processStructModel(AlignmentI al, SequenceI querySequence, + SequenceI templateSeq, + String[] structModelHeader, + String[] structModelData, String baseUri) + { + String warningMessage = null; + boolean added = false; + try { + String structureModelFile = resolveAbsolutePath(structModelData[2], + baseUri); + String fastaMappingFile = resolveAbsolutePath(structModelData[3], + baseUri); + // System.out.println("Model File >> " + structureModelFile); + // System.out.println("Fasta File >> " + fastaMappingFile); + String modelName = StructureFile.safeName(structureModelFile); + PDBEntry phyre2PDBEntry = new PDBEntry(modelName, " ", + Type.PDB, + structureModelFile); + List phyreDD = generatePhyreDynamicDataList( + structModelHeader, structModelData); + phyre2PDBEntry.setProperty("DYNAMIC_DATA_PHYRE2", phyreDD); + templateSeq.getDatasetSequence().addPDBId(phyre2PDBEntry); + if (querySequence != null) + { + querySequence.getDatasetSequence().addPDBId(phyre2PDBEntry); + } + StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(); + ssm.registerPhyre2Template(structureModelFile, fastaMappingFile); + added = true; + + } catch (Exception x) + { + warningMessage = x.toString(); + } finally { + if (warningMessage !=null) + { + System.err.println("Warnings whilst processing STRUCTMODEL: "+warningMessage); + } + } + return added; + } + + static List generatePhyreDynamicDataList( + String[] headerArray, + String[] dataArray) + { + + if (headerArray == null || dataArray == null) + { + throw new IllegalArgumentException( + "Header or data arrays must not be null"); + } + + if (headerArray.length != dataArray.length) + { + throw new IllegalArgumentException( + "Header and data arrays must be of same lenght"); + } + List dynamicDataList = new ArrayList(); + int x = 0; + for (String data : dataArray) + { + // first four column should be hidden; + boolean show = (x > 4); + dynamicDataList.add(new DynamicData(headerArray[x], data, DataType.S, + "PHYRE2", show)); + x++; + } + return dynamicDataList; + } + + static String resolveAbsolutePath(String relURI, String _baseUri) + { + if (relURI.indexOf(":/") > -1 || relURI.startsWith("/") + || "".equals(_baseUri) || relURI.startsWith(_baseUri)) + { + return relURI; + } + return _baseUri + relURI; + } + + private void parseHideCols(HiddenColumns hidden, String nextToken) { StringTokenizer inval = new StringTokenizer(nextToken, ","); while (inval.hasMoreTokens()) @@ -1193,7 +1380,7 @@ public class AnnotationFile from = to = Integer.parseInt(range); if (from >= 0) { - colSel.hideColumns(from, to); + hidden.hideColumns(from, to); } } else @@ -1209,7 +1396,7 @@ public class AnnotationFile } if (from > 0 && to >= from) { - colSel.hideColumns(from, to); + hidden.hideColumns(from, to); } } } @@ -1610,8 +1797,7 @@ public class AnnotationFile if (sg != null) { String keyValue, key, value; - ColourSchemeI def = sg.cs; - sg.cs = null; + ColourSchemeI def = sg.getColourScheme(); while (st.hasMoreTokens()) { keyValue = st.nextToken(); @@ -1624,7 +1810,8 @@ public class AnnotationFile } else if (key.equalsIgnoreCase("colour")) { - sg.cs = ColourSchemeProperty.getColourScheme(al, value); + sg.cs.setColourScheme(ColourSchemeProperty + .getColourScheme(al, value)); } else if (key.equalsIgnoreCase("pidThreshold")) { @@ -1677,9 +1864,8 @@ public class AnnotationFile } else if (key.equalsIgnoreCase("idColour")) { - // consider warning if colour doesn't resolve to a real colour - def = new UserColourScheme(value); - sg.setIdColour(def.findColour()); + Color idColour = ColorUtils.parseColourString(value); + sg.setIdColour(idColour == null ? Color.black : idColour); } else if (key.equalsIgnoreCase("hide")) { @@ -1693,9 +1879,9 @@ public class AnnotationFile } sg.recalcConservation(); } - if (sg.cs == null) + if (sg.getColourScheme() == null) { - sg.cs = def; + sg.setColourScheme(def); } } } @@ -1789,7 +1975,7 @@ public class AnnotationFile return printAnnotations(viewport.isShowAnnotation() ? viewport .getAlignment().getAlignmentAnnotation() : null, viewport .getAlignment().getGroups(), viewport.getAlignment() - .getProperties(), viewport.getColumnSelection(), + .getProperties(), viewport.getAlignment().getHiddenColumns(), viewport.getAlignment(), null); }