X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FFeaturesFile.java;h=cfc08fbdcaebb2e8917e9fe0e0c8d0c27e342806;hb=153dd62dc91da13ae732600e6ea55ddbe15eab39;hp=8f5e4bd1bd145759ceae74e89c82ee0b86927b0b;hpb=d423f22792e47dbc800ae220a58677f988971d06;p=jalview.git diff --git a/src/jalview/io/FeaturesFile.java b/src/jalview/io/FeaturesFile.java index 8f5e4bd..cfc08fb 100755 --- a/src/jalview/io/FeaturesFile.java +++ b/src/jalview/io/FeaturesFile.java @@ -1,5 +1,5 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * * This file is part of Jalview. @@ -104,9 +104,10 @@ public class FeaturesFile extends AlignFile SequenceFeature sf; String featureGroup = null, groupLink = null; Hashtable typeLink = new Hashtable(); - + /** + * when true, assume GFF style features rather than Jalview style. + */ boolean GFFFile = true; - while ((line = nextLine()) != null) { if (line.startsWith("#")) @@ -115,6 +116,15 @@ public class FeaturesFile extends AlignFile } st = new StringTokenizer(line, "\t"); + if (st.countTokens() == 1) + { + if (line.trim().equalsIgnoreCase("GFF")) + { + // Start parsing file as if it might be GFF again. + GFFFile = true; + continue; + } + } if (st.countTokens() > 1 && st.countTokens() < 4) { GFFFile = false; @@ -140,58 +150,109 @@ public class FeaturesFile extends AlignFile { Object colour = null; String colscheme = st.nextToken(); - if (colscheme.indexOf("|") > -1) + if (colscheme.indexOf("|") > -1 + || colscheme.trim().equalsIgnoreCase("label")) { // Parse '|' separated graduated colourscheme fields: - // mincolour|maxcolour|[absolute|]minvalue|maxvalue|thresholdtype|thresholdvalue - // first four are required. - // first two are hexadecimal or word equivalent colours. - // second two are values parsed as floats. + // [label|][mincolour|maxcolour|[absolute|]minvalue|maxvalue|thresholdtype|thresholdvalue] + // can either provide 'label' only, first is optional, next two + // colors are required (but may be + // left blank), next is optional, nxt two min/max are required. + // first is either 'label' + // first/second and third are both hexadecimal or word equivalent + // colour. + // next two are values parsed as floats. // fifth is either 'above','below', or 'none'. // sixth is a float value and only required when fifth is either // 'above' or 'below'. - StringTokenizer gcol = new StringTokenizer(colscheme, "|"); - String mincol = gcol.nextToken(), maxcol = gcol.nextToken(); - String abso = gcol.nextToken(), minval, maxval; - if (abso.toLowerCase().indexOf("abso") != 0) - { - minval = abso; - abso = null; - } - else - { - minval = gcol.nextToken(); - } - maxval = gcol.nextToken(); + StringTokenizer gcol = new StringTokenizer(colscheme, "|", true); // set defaults int threshtype = AnnotationColourGradient.NO_THRESHOLD; float min = Float.MIN_VALUE, max = Float.MAX_VALUE, threshval = Float.NaN; - try - { - if (minval.length() > 0) - { - min = new Float(minval).floatValue(); - } - } catch (Exception e) + boolean labelCol = false; + // Parse spec line + String mincol = gcol.nextToken(); + if (mincol=="|") { System.err - .println("Couldn't parse the minimum value for graduated colour for type (" - + colscheme - + ") - did you misspell 'auto' for the optional automatic colour switch ?"); - e.printStackTrace(); + .println("Expected either 'label' or a colour specification in the line: "+line ); + continue; } - try + String maxcol = null; + if (mincol.toLowerCase().indexOf("label") == 0) + { + labelCol = true; + mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null); // skip '|' + mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null); + } + String abso = null, minval, maxval; + if (mincol != null) { - if (maxval.length() > 0) + // at least four more tokens + if (mincol.equals("|")) { - max = new Float(maxval).floatValue(); + mincol=""; + } else { + gcol.nextToken(); // skip next '|' } - } catch (Exception e) + // continue parsing rest of line + maxcol = gcol.nextToken(); + if (maxcol.equals("|")) + { + maxcol=""; + } else { + gcol.nextToken(); // skip next '|' + } + abso = gcol.nextToken(); + gcol.nextToken(); // skip next '|' + if (abso.toLowerCase().indexOf("abso") != 0) + { + minval = abso; + abso = null; + } + else + { + minval = gcol.nextToken(); + gcol.nextToken(); // skip next '|' + } + maxval = gcol.nextToken(); + if (gcol.hasMoreTokens()) { + gcol.nextToken(); // skip next '|' + } + try + { + if (minval.length() > 0) + { + min = new Float(minval).floatValue(); + } + } catch (Exception e) + { + System.err + .println("Couldn't parse the minimum value for graduated colour for type (" + + colscheme + + ") - did you misspell 'auto' for the optional automatic colour switch ?"); + e.printStackTrace(); + } + try + { + if (maxval.length() > 0) + { + max = new Float(maxval).floatValue(); + } + } catch (Exception e) + { + System.err + .println("Couldn't parse the maximum value for graduated colour for type (" + + colscheme + ")"); + e.printStackTrace(); + } + } + else { - System.err - .println("Couldn't parse the maximum value for graduated colour for type (" - + colscheme + ")"); - e.printStackTrace(); + // add in some dummy min/max colours for the label-only + // colourscheme. + mincol = "FFFFFF"; + maxcol = "000000"; } try { @@ -209,6 +270,8 @@ public class FeaturesFile extends AlignFile if (colour != null) { ((jalview.schemes.GraduatedColor) colour) + .setColourByLabel(labelCol); + ((jalview.schemes.GraduatedColor) colour) .setAutoScaled(abso == null); // add in any additional parameters String ttype = null, tval = null; @@ -240,9 +303,10 @@ public class FeaturesFile extends AlignFile } if (((GraduatedColor) colour).getThreshType() != AnnotationColourGradient.NO_THRESHOLD) { - tval = gcol.nextToken(); try { + gcol.nextToken(); + tval = gcol.nextToken(); ((jalview.schemes.GraduatedColor) colour) .setThresh(new Float(tval).floatValue()); } catch (Exception e) @@ -260,7 +324,7 @@ public class FeaturesFile extends AlignFile .println("Ignoring additional tokens in parameters in graduated colour specification\n"); while (gcol.hasMoreTokens()) { - System.err.println("|" + gcol); + System.err.println("|" + gcol.nextToken()); } System.err.println("\n"); } @@ -616,8 +680,8 @@ public class FeaturesFile extends AlignFile if (visible.get(type) instanceof GraduatedColor) { GraduatedColor gc = (GraduatedColor) visible.get(type); - // TODO: NOW: colour by label, autoscale flags. - color = Format.getHexString(gc.getMinColor()) + "|" + color = (gc.isColourByLabel() ? "label|" : "") + + Format.getHexString(gc.getMinColor()) + "|" + Format.getHexString(gc.getMaxColor()) + (gc.isAutoScale() ? "|" : "|abso|") + gc.getMin() + "|" + gc.getMax() + "|"; @@ -754,9 +818,7 @@ public class FeaturesFile extends AlignFile if (next[j].description.indexOf(href) == -1) { - out - .append("" + label - + ""); + out.append("" + label + ""); } }