X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FAnnotationFile.java;h=49e99a105ae5703c6e8656c71b536e63e7546b35;hb=c51dbe7933683b64548f5353e67561d2b5e377f7;hp=eca27a727c3b625c333ee8a1f0deafcbd24b54b2;hpb=3e98c1348b037f0972367245a524f182029a9686;p=jalview.git diff --git a/src/jalview/io/AnnotationFile.java b/src/jalview/io/AnnotationFile.java index eca27a7..49e99a1 100755 --- a/src/jalview/io/AnnotationFile.java +++ b/src/jalview/io/AnnotationFile.java @@ -26,7 +26,10 @@ 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; @@ -34,13 +37,13 @@ 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.IOException; import java.io.InputStreamReader; import java.io.StringReader; import java.net.URL; @@ -55,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(); @@ -81,7 +106,6 @@ public class AnnotationFile return newline; } - StringBuffer text; private void init() { @@ -113,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; } } @@ -145,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) { @@ -155,7 +179,7 @@ public class AnnotationFile } if (list == null) { - list = view.visibleGroups; + // list = view.visibleGroups; } if (cs == null) { @@ -174,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) { @@ -540,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) @@ -586,7 +610,8 @@ public class AnnotationFile if (sg.cs != null) { text.append("colour="); - text.append(ColourSchemeProperty.getColourName(sg.cs)); + text.append(ColourSchemeProperty.getColourName(sg.cs + .getColourScheme())); text.append("\t"); if (sg.cs.getThreshold() != 0) { @@ -660,42 +685,45 @@ public class AnnotationFile } } - SequenceI refSeq = null; - - String refSeqId = null; public boolean annotateAlignmentView(AlignViewportI viewport, - String file, String protocol) + 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; } public boolean readAnnotationFile(AlignmentI al, String file, - String protocol) + DataSourceType sourceType) { - return readAnnotationFile(al, null, file, protocol); + return readAnnotationFile(al, null, file, sourceType); } - public boolean readAnnotationFile(AlignmentI al, ColumnSelection colSel, - String file, String protocol) + public boolean readAnnotationFile(AlignmentI al, HiddenColumns hidden, + String file, DataSourceType sourceType) { baseUri = ""; BufferedReader in = null; try { - if (protocol.equals(AppletFormatAdapter.FILE)) + if (sourceType == DataSourceType.FILE) { in = new BufferedReader(new FileReader(file)); baseUri = new File(file).getParent(); @@ -708,7 +736,7 @@ public class AnnotationFile baseUri += "/"; } } - else if (protocol.equals(AppletFormatAdapter.URL)) + else if (sourceType == DataSourceType.URL) { URL url = new URL(file); in = new BufferedReader(new InputStreamReader(url.openStream())); @@ -721,13 +749,13 @@ public class AnnotationFile baseUri = baseUri.substring(0, baseUri.lastIndexOf("/")) + "/"; } } - else if (protocol.equals(AppletFormatAdapter.PASTE)) + else if (sourceType == DataSourceType.PASTE) { in = new BufferedReader(new StringReader(file)); // TODO - support mimencoded PDBs for a paste.. ? baseUri = ""; } - else if (protocol.equals(AppletFormatAdapter.CLASSLOADER)) + else if (sourceType == DataSourceType.CLASSLOADER) { java.io.InputStream is = getClass().getResourceAsStream("/" + file); if (is != null) @@ -739,7 +767,7 @@ public class AnnotationFile } if (in != null) { - return parseAnnotationFrom(al, colSel, in); + return parseAnnotationFrom(al, hidden, in); } } catch (Exception ex) @@ -756,20 +784,8 @@ public class AnnotationFile return false; } - 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"; - - public boolean parseAnnotationFrom(AlignmentI al, ColumnSelection colSel, + public boolean parseAnnotationFrom(AlignmentI al, HiddenColumns hidden, BufferedReader in) throws Exception { nlinesread = 0; @@ -961,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) @@ -980,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; @@ -998,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: " @@ -1007,18 +1017,29 @@ 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; - // expect - // STRUCTMODEL + // 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) @@ -1029,12 +1050,16 @@ public class AnnotationFile } else { - String tempId = st.nextToken(); - String urlToModel = st.nextToken(); - String urlToPairwise = st.hasMoreTokens() ? st.nextToken() - : ""; - if (add_structmodel(al, refSeq, tempId, urlToModel, - urlToPairwise)) + 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; } @@ -1043,7 +1068,7 @@ public class AnnotationFile if (failedtoadd) { System.err - .println("Need [] as tab separated fields after " + .println("Need minimum of as tab separated fields after" + STRUCTMODEL); } else { modified = true; @@ -1249,86 +1274,50 @@ public class AnnotationFile return modified; } + /** - * resolve a structural model and generate and add an alignment sequence for - * it + * Resolve structural model to a reference sequence and register it to + * StructureSelectionManager * - * @param refSeq2 - * @param tempId - * @param urlToModel - * @param urlToPairwise + * @param al + * @param querySequence + * @param templateSeq + * @param structModelHeader + * @param structModelData * @return true if model and sequence was added */ - private boolean add_structmodel(AlignmentI al, SequenceI refSeq2, String tempId, - String urlToModel, String urlToPairwise) + static boolean processStructModel(AlignmentI al, SequenceI querySequence, + SequenceI templateSeq, + String[] structModelHeader, + String[] structModelData, String baseUri) { - String warningMessage = null, modelPath = null, modelProt = null, aliPath = null, aliProt = null; + String warningMessage = null; boolean added = false; try { - // locate tempId. if it exists, will need to merge, otherwise: - SequenceI templateSeq = al.findName(tempId); - // 1. load urlToModel - modelPath = resolveAbsolute(urlToModel); - modelProt = AppletFormatAdapter.checkProtocol(modelPath); - // need to transfer to local temp file ? - PDBEntry modelpe = new PDBEntry(tempId, null, Type.FILE, modelPath); - PDBEntry templpe = new PDBEntry(tempId, null, Type.FILE, modelPath); - refSeq2.addPDBId(modelpe); - aliPath = resolveAbsolute(urlToPairwise); - aliProt = AppletFormatAdapter.checkProtocol(aliPath); - // 2. load urlToPairwise - AlignmentI pwa = new AppletFormatAdapter().readFile(aliPath, aliProt, - "FASTA"); - SequenceI qPw = null, tPw = null; - if (pwa != null) - { - // resolve query/template sequences in provided alignment - qPw = pwa.findName(refSeqId); - tPw = pwa.findName(tempId); - } - if (false) - // (qPw != null && tPw != null) - { - // not yet complete - // refalQ vvva--addrvvvtttddd - // refalT ---aaaa---sss---ddd - // profalQ ---v-v-v-a.-.-a---dd--r--vvvtt--td--dd - // profalT ---.-.-.-aa-a-a---..--.--sss..--.d--dd - // Pragmatic solution here: - // Map templpe onto refalT only where refalT and refalQ are both - // non-gaps - - // columns for start..end in refSeq2 - int[] gapMap = refSeq2.gapMap(); - // insert gaps in tPw - int curi = 0, width = refSeq2.getLength(); - // TBC - } - else - { - // assume 1:1 - so synthesise sequences to use to construct mapping - StructureFile pdbf = StructureSelectionManager - .getStructureSelectionManager().setMapping(false, - new SequenceI[] { refSeq2.getDatasetSequence() }, - null, modelPath, modelProt); - refSeq2.getDatasetSequence().addPDBId(modelpe); - if (templateSeq == null && tPw != null) - { - tPw.createDatasetSequence(); - tPw.getDatasetSequence().addPDBId(templpe); // needs to set mapping based on model yet... - al.addSequence(tPw); - added = true; - } - } - // 3. pad/insert gaps in urlToPairwise according to gaps already present in - // refSeq2 - // 4. add padded tempId sequence to alignment - // 4. associate urlToModel with refSeq2 based on position map provided by - // urlToPairwise - // 5. associate urlToModel with tempId based on position map provided by - // urlToPairwise - // start a thread to load urlToModel and process/annotate sequences. - } catch (IOException x) + 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 { @@ -1336,21 +1325,50 @@ public class AnnotationFile { System.err.println("Warnings whilst processing STRUCTMODEL: "+warningMessage); } - return added; } + return added; } - private String resolveAbsolute(String relURI) + 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)) + || "".equals(_baseUri) || relURI.startsWith(_baseUri)) { return relURI; } - return baseUri + relURI; + return _baseUri + relURI; } - private void parseHideCols(ColumnSelection colSel, String nextToken) + private void parseHideCols(HiddenColumns hidden, String nextToken) { StringTokenizer inval = new StringTokenizer(nextToken, ","); while (inval.hasMoreTokens()) @@ -1362,7 +1380,7 @@ public class AnnotationFile from = to = Integer.parseInt(range); if (from >= 0) { - colSel.hideColumns(from, to); + hidden.hideColumns(from, to); } } else @@ -1378,7 +1396,7 @@ public class AnnotationFile } if (from > 0 && to >= from) { - colSel.hideColumns(from, to); + hidden.hideColumns(from, to); } } } @@ -1394,29 +1412,21 @@ public class AnnotationFile Annotation parseAnnotation(String string, int graphStyle) { - boolean hasSymbols = (graphStyle == AlignmentAnnotation.NO_GRAPH); // don't - // do the - // glyph - // test - // if we - // don't - // want - // secondary - // structure + // don't do the glyph test if we don't want secondary structure + boolean hasSymbols = (graphStyle == AlignmentAnnotation.NO_GRAPH); String desc = null, displayChar = null; char ss = ' '; // secondaryStructure float value = 0; boolean parsedValue = false, dcset = false; // find colour here - java.awt.Color colour = null; + Color colour = null; int i = string.indexOf("["); int j = string.indexOf("]"); if (i > -1 && j > -1) { - UserColourScheme ucs = new UserColourScheme(); - - colour = ucs.getColourFromString(string.substring(i + 1, j)); + colour = ColorUtils.parseColourString(string.substring(i + 1, + j)); if (i > 0 && string.charAt(i - 1) == ',') { // clip the preceding comma as well @@ -1518,7 +1528,7 @@ public class AnnotationFile void colourAnnotations(AlignmentI al, String label, String colour) { - UserColourScheme ucs = new UserColourScheme(colour); + Color awtColour = ColorUtils.parseColourString(colour); Annotation[] annotations; for (int i = 0; i < al.getAlignmentAnnotation().length; i++) { @@ -1529,7 +1539,7 @@ public class AnnotationFile { if (annotations[j] != null) { - annotations[j].colour = ucs.findColour('A'); + annotations[j].colour = awtColour; } } } @@ -1599,15 +1609,22 @@ public class AnnotationFile SequenceGroup groupRef) { String group = st.nextToken(); - AlignmentAnnotation annotation = null, alannot[] = al - .getAlignmentAnnotation(); - float value = new Float(st.nextToken()).floatValue(); + AlignmentAnnotation[] alannot = al.getAlignmentAnnotation(); + String nextToken = st.nextToken(); + float value = 0f; + try + { + value = Float.valueOf(nextToken); + } catch (NumberFormatException e) + { + System.err.println("line " + nlinesread + ": Threshold '" + nextToken + + "' invalid, setting to zero"); + } String label = st.hasMoreTokens() ? st.nextToken() : null; - java.awt.Color colour = null; + Color colour = null; if (st.hasMoreTokens()) { - UserColourScheme ucs = new UserColourScheme(st.nextToken()); - colour = ucs.findColour('A'); + colour = ColorUtils.parseColourString(st.nextToken()); } if (alannot != null) { @@ -1621,10 +1638,6 @@ public class AnnotationFile } } } - if (annotation == null) - { - return; - } } void addGroup(AlignmentI al, StringTokenizer st) @@ -1784,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(); @@ -1798,7 +1810,8 @@ public class AnnotationFile } else if (key.equalsIgnoreCase("colour")) { - sg.cs = ColourSchemeProperty.getColour(al, value); + sg.cs.setColourScheme(ColourSchemeProperty + .getColourScheme(al, value)); } else if (key.equalsIgnoreCase("pidThreshold")) { @@ -1808,9 +1821,8 @@ public class AnnotationFile else if (key.equalsIgnoreCase("consThreshold")) { sg.cs.setConservationInc(Integer.parseInt(value)); - Conservation c = new Conservation("Group", 3, - sg.getSequences(null), sg.getStartRes(), - sg.getEndRes() + 1); + Conservation c = new Conservation("Group", sg.getSequences(null), + sg.getStartRes(), sg.getEndRes() + 1); c.calculate(); c.verdict(false, 25); // TODO: refer to conservation percent threshold @@ -1820,7 +1832,7 @@ public class AnnotationFile } else if (key.equalsIgnoreCase("outlineColour")) { - sg.setOutlineColour(new UserColourScheme(value).findColour('A')); + sg.setOutlineColour(ColorUtils.parseColourString(value)); } else if (key.equalsIgnoreCase("displayBoxes")) { @@ -1840,11 +1852,11 @@ public class AnnotationFile } else if (key.equalsIgnoreCase("textCol1")) { - sg.textColour = new UserColourScheme(value).findColour('A'); + sg.textColour = ColorUtils.parseColourString(value); } else if (key.equalsIgnoreCase("textCol2")) { - sg.textColour2 = new UserColourScheme(value).findColour('A'); + sg.textColour2 = ColorUtils.parseColourString(value); } else if (key.equalsIgnoreCase("textColThreshold")) { @@ -1852,9 +1864,8 @@ public class AnnotationFile } else if (key.equalsIgnoreCase("idColour")) { - // consider warning if colour doesn't resolve to a real colour - sg.setIdColour((def = new UserColourScheme(value)) - .findColour('A')); + Color idColour = ColorUtils.parseColourString(value); + sg.setIdColour(idColour == null ? Color.black : idColour); } else if (key.equalsIgnoreCase("hide")) { @@ -1868,9 +1879,9 @@ public class AnnotationFile } sg.recalcConservation(); } - if (sg.cs == null) + if (sg.getColourScheme() == null) { - sg.cs = def; + sg.setColourScheme(def); } } } @@ -1964,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); }