X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FAnnotationFile.java;h=d8f9f150c488954336d10907bf52f66022e5d5b4;hb=e84b575bede2d5a6dea85cb96000dc751d090016;hp=6834e7645b8bf1bcef81e0799cd01dee8bb7895d;hpb=8d6b113f475c6b5916f7685cfd289e054d95a9ee;p=jalview.git diff --git a/src/jalview/io/AnnotationFile.java b/src/jalview/io/AnnotationFile.java index 6834e76..d8f9f15 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.8.2) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -28,6 +28,8 @@ import jalview.datamodel.Annotation; import jalview.datamodel.ColumnSelection; import jalview.datamodel.GraphLine; 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; @@ -37,6 +39,7 @@ import jalview.schemes.UserColourScheme; import java.io.BufferedReader; import java.io.FileReader; +import java.io.IOException; import java.io.InputStreamReader; import java.io.StringReader; import java.net.URL; @@ -99,7 +102,7 @@ public class AnnotationFile public String printAnnotations(AlignmentAnnotation[] annotations, List list, Hashtable properties) { - return printAnnotations(annotations, list, properties, null); + return printAnnotations(annotations, list, properties, null, null, null); } @@ -140,16 +143,56 @@ public class AnnotationFile * @return annotation file */ public String printAnnotations(AlignmentAnnotation[] annotations, - List list, Hashtable properties, ViewDef[] views) + List list, Hashtable properties, + ColumnSelection cs, AlignmentI al, ViewDef view) { - // TODO: resolve views issue : annotationFile could contain visible region, - // or full data + hidden region specifications for a view. - if (views != null) + if (view != null) { - // are views defined and then annotation added to alignment or the other - // way around ? - + if (view.viewname != null) + { + text.append("VIEW_DEF\t" + view.viewname + "\n"); + } + if (list == null) + { + list = view.visibleGroups; + } + if (cs == null) + { + cs = view.hiddencols; + } + if (al == null) + { + // add hidden rep sequences. + } } + // first target - store and restore all settings for a view. + if (al != null && al.hasSeqrep()) + { + text.append("VIEW_SETREF\t" + al.getSeqrep().getName() + "\n"); + } + if (cs != null && cs.hasHiddenColumns()) + { + text.append("VIEW_HIDECOLS\t"); + List hc = cs.getHiddenColumns(); + boolean comma = false; + for (int[] r : hc) + { + if (!comma) + { + comma = true; + } + else + { + text.append(","); + } + text.append(r[0]); + text.append("-"); + text.append(r[1]); + } + text.append("\n"); + } + // TODO: allow efficient recovery of annotation data shown in several + // different views if (annotations != null) { boolean oneColour = true; @@ -201,7 +244,7 @@ public class AnnotationFile && row.annotations[j].displayCharacter.length() > 0 && !row.annotations[j].displayCharacter .equals(" ")); hasGlyphs |= (row.annotations[j].secondaryStructure != 0 && row.annotations[j].secondaryStructure != ' '); - hasValues |= (row.annotations[j].value != Float.NaN); // NaNs can't + hasValues |= (!Float.isNaN(row.annotations[j].value)); // NaNs can't // be // rendered.. hasText |= (row.annotations[j].description != null && row.annotations[j].description @@ -254,8 +297,7 @@ public class AnnotationFile } else { - graphGroup_refs.put(key, new Object[] - { refSeq, refGroup }); + graphGroup_refs.put(key, new Object[] { refSeq, refGroup }); graphGroup.put(key, row.label); } } @@ -291,13 +333,13 @@ public class AnnotationFile } if (hasValues) { - if (row.annotations[j].value != Float.NaN) + if (!Float.isNaN(row.annotations[j].value)) { text.append(comma + row.annotations[j].value); } else { - System.err.println("Skipping NaN - not valid value."); + // System.err.println("Skipping NaN - not valid value."); text.append(comma + 0f);// row.annotations[j].value); } comma = ","; @@ -432,7 +474,9 @@ public class AnnotationFile text.append(properties.get(key)); } // TODO: output alignment visualization settings here if required - + // iterate through one or more views, defining, marking columns and rows + // as visible/hidden, and emmitting view properties. + // View specific annotation is } return text.toString(); @@ -629,14 +673,14 @@ public class AnnotationFile } boolean rslt = readAnnotationFile(viewport.getAlignment(), colSel, file, protocol); - if (rslt - && (colSel.hasSelectedColumns() || colSel.hasHiddenColumns())) + if (rslt && (colSel.hasSelectedColumns() || colSel.hasHiddenColumns())) { viewport.setColumnSelection(colSel); } return rslt; } + public boolean readAnnotationFile(AlignmentI al, String file, String protocol) { @@ -693,11 +737,11 @@ public class AnnotationFile String lastread = ""; - private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE"; + private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE", + STRUCTMODEL = "STRUCTMODEL"; public boolean parseAnnotationFrom(AlignmentI al, ColumnSelection colSel, - BufferedReader in) - throws Exception + BufferedReader in) throws Exception { nlinesread = 0; ArrayList combineAnnotation_calls = new ArrayList(); @@ -790,8 +834,8 @@ public class AnnotationFile else if (token.equalsIgnoreCase(COMBINE)) { // keep a record of current state and resolve groupRef at end - combineAnnotation_calls.add(new Object[] - { st, refSeq, groupRef }); + combineAnnotation_calls + .add(new Object[] { st, refSeq, groupRef }); modified = true; continue; } @@ -804,8 +848,8 @@ public class AnnotationFile else if (token.equalsIgnoreCase(GRAPHLINE)) { // resolve at end - deferredAnnotation_calls.add(new Object[] - { GRAPHLINE, st, refSeq, groupRef }); + deferredAnnotation_calls.add(new Object[] { GRAPHLINE, st, + refSeq, groupRef }); modified = true; continue; } @@ -888,6 +932,12 @@ 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) @@ -897,6 +947,19 @@ public class AnnotationFile modified = true; continue; } + else if (token.equalsIgnoreCase("VIEW_HIDECOLS")) + { + if (st.hasMoreTokens()) + { + if (colSel == null) + { + colSel = new ColumnSelection(); + } + parseHideCols(colSel, st.nextToken()); + } + modified = true; + continue; + } else if (token.equalsIgnoreCase("HIDE_INSERTIONS")) { SequenceI sr = refSeq == null ? al.getSeqrep() : refSeq; @@ -921,7 +984,43 @@ public class AnnotationFile modified = true; continue; } - + else if (token.equalsIgnoreCase(STRUCTMODEL)) + { + boolean failedtoadd = true; + // expect + // STRUCTMODEL + 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 + { + String tempId = st.nextToken(); + String urlToModel = st.nextToken(); + String urlToPairwise = st.hasMoreTokens() ? st.nextToken() + : ""; + if (add_structmodel(al, refSeq, tempId, urlToModel, + urlToPairwise)) + { + failedtoadd = false; + } + } + } + if (failedtoadd) + { + System.err + .println("Need [] as tab separated fields after " + + STRUCTMODEL); + } else { + modified = true; + } + continue; + } // Parse out the annotation row graphStyle = AlignmentAnnotation.getGraphValueFromString(token); label = st.nextToken(); @@ -1094,7 +1193,7 @@ public class AnnotationFile (SequenceI) _deferred_args[2], // refSeq (_deferred_args[3] == null) ? null : groupRefLookup .get(_deferred_args[3]) // the reference - // group, or null + // group, or null ); } } @@ -1114,13 +1213,132 @@ public class AnnotationFile (SequenceI) _combine_args[1], // refSeq (_combine_args[2] == null) ? null : groupRefLookup .get(_combine_args[2]) // the reference group, - // or null + // or null ); } } return modified; } + /** + * resolve a structural model and generate and add an alignment sequence for + * it + * + * @param refSeq2 + * @param tempId + * @param urlToModel + * @param urlToPairwise + * @return true if model and sequence was added + */ + private boolean add_structmodel(AlignmentI al, SequenceI refSeq2, String tempId, + String urlToModel, String urlToPairwise) + { + 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 + // TODO: get base for current import operation and resolve against it + // transfer to local temp file ? + PDBEntry modelpe = new PDBEntry(tempId,null,Type.FILE,urlToModel); + PDBEntry templpe = new PDBEntry(tempId, null, Type.FILE, urlToModel); + refSeq2.addPDBId(modelpe); + + // 2. load urlToPairwise + AlignmentI pwa = new AppletFormatAdapter().readFile(urlToPairwise, + AppletFormatAdapter.checkProtocol(urlToPairwise), "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 ? + 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) + { + warningMessage = x.toString(); + } finally { + if (warningMessage !=null) + { + System.err.println("Warnings whilst processing STRUCTMODEL: "+warningMessage); + } + return added; + } + } + + private void parseHideCols(ColumnSelection colSel, String nextToken) + { + StringTokenizer inval = new StringTokenizer(nextToken, ","); + while (inval.hasMoreTokens()) + { + String range = inval.nextToken().trim(); + int from, to = range.indexOf("-"); + if (to == -1) + { + from = to = Integer.parseInt(range); + if (from >= 0) + { + colSel.hideColumns(from, to); + } + } + else + { + from = Integer.parseInt(range.substring(0, to)); + if (to < range.length() - 1) + { + to = Integer.parseInt(range.substring(to + 1)); + } + else + { + to = from; + } + if (from > 0 && to >= from) + { + colSel.hideColumns(from, to); + } + } + } + } + private Object autoAnnotsKey(AlignmentAnnotation annotation, SequenceI refSeq, String groupRef) { @@ -1207,8 +1425,8 @@ public class AnnotationFile } } if (hasSymbols - && (token.equals("H") || token.equals("E") - || token.equals("S") || token.equals(" "))) + && (token.length() == 1 && "()<>[]{}AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" + .contains(token))) { // Either this character represents a helix or sheet // or an integer which can be displayed @@ -1667,6 +1885,10 @@ public class AnnotationFile */ public String printCSVAnnotations(AlignmentAnnotation[] annotations) { + if (annotations == null) + { + return ""; + } StringBuffer sp = new StringBuffer(); for (int i = 0; i < annotations.length; i++) { @@ -1697,12 +1919,13 @@ public class AnnotationFile return printAnnotations(viewport.isShowAnnotation() ? viewport .getAlignment().getAlignmentAnnotation() : null, viewport .getAlignment().getGroups(), viewport.getAlignment() - .getProperties()); + .getProperties(), viewport.getColumnSelection(), + viewport.getAlignment(), null); } public String printAnnotationsForAlignment(AlignmentI al) { return printAnnotations(al.getAlignmentAnnotation(), al.getGroups(), - al.getProperties()); + al.getProperties(), null, al, null); } }