X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fschemes%2FFeatureColour.java;h=f1bade151686ca674cfd23fae878ea45e64e9270;hb=a7169b1c72607f3c9357195b4999869650a2a891;hp=71a3d51209827c16224b79973d775d19079007b6;hpb=dcfba29a940c44003581f28e6da481450aa86575;p=jalview.git
diff --git a/src/jalview/schemes/FeatureColour.java b/src/jalview/schemes/FeatureColour.java
index 71a3d51..f1bade1 100644
--- a/src/jalview/schemes/FeatureColour.java
+++ b/src/jalview/schemes/FeatureColour.java
@@ -20,6 +20,8 @@
*/
package jalview.schemes;
+import java.util.Locale;
+
import jalview.api.FeatureColourI;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.features.FeatureMatcher;
@@ -46,8 +48,9 @@ import java.util.StringTokenizer;
*
the range may be the full value range, or may be limited by the threshold
* value
*
- * colour by (text) value of a named attribute graduated colour by
- * (numeric) value of a named attribute
+ * colour by (text) value of a named attribute
+ * graduated colour by (numeric) value of a named attribute
+ *
*/
public class FeatureColour implements FeatureColourI
{
@@ -194,19 +197,19 @@ public class FeatureColour implements FeatureColourI
"Expected either 'label' or a colour specification in the line: "
+ descriptor);
}
- if (nextToken.toLowerCase().startsWith(LABEL))
+ if (nextToken.toLowerCase(Locale.ROOT).startsWith(LABEL))
{
byLabel = true;
// get the token after the next delimiter:
mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null);
mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null);
}
- else if (nextToken.toLowerCase().startsWith(SCORE))
+ else if (nextToken.toLowerCase(Locale.ROOT).startsWith(SCORE))
{
mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null);
mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null);
}
- else if (nextToken.toLowerCase().startsWith(ATTRIBUTE))
+ else if (nextToken.toLowerCase(Locale.ROOT).startsWith(ATTRIBUTE))
{
byAttribute = true;
attName = (gcol.hasMoreTokens() ? gcol.nextToken() : null);
@@ -304,7 +307,7 @@ public class FeatureColour implements FeatureColourI
}
gcol.nextToken(); // skip next '|'
- if (tok.toLowerCase().startsWith(ABSOLUTE))
+ if (tok.toLowerCase(Locale.ROOT).startsWith(ABSOLUTE))
{
minval = gcol.nextToken();
gcol.nextToken(); // skip next '|'
@@ -323,7 +326,7 @@ public class FeatureColour implements FeatureColourI
{
if (minval.length() > 0)
{
- min = new Float(minval).floatValue();
+ min = Float.valueOf(minval).floatValue();
}
} catch (Exception e)
{
@@ -335,7 +338,7 @@ public class FeatureColour implements FeatureColourI
{
if (maxval.length() > 0)
{
- max = new Float(maxval).floatValue();
+ max = Float.valueOf(maxval).floatValue();
}
} catch (Exception e)
{
@@ -365,8 +368,8 @@ public class FeatureColour implements FeatureColourI
Color maxColour = ColorUtils.parseColourString(maxcol);
Color noColour = noValueColour.equals(NO_VALUE_MAX) ? maxColour
: (noValueColour.equals(NO_VALUE_NONE) ? null : minColour);
- featureColour = new FeatureColour(minColour, maxColour, noColour, min,
- max);
+ featureColour = new FeatureColour(maxColour, minColour, maxColour,
+ noColour, min, max);
featureColour.setColourByLabel(minColour == null);
featureColour.setAutoScaled(autoScaled);
if (byAttribute)
@@ -380,17 +383,17 @@ public class FeatureColour implements FeatureColourI
{
// threshold type and possibly a threshold value
ttype = gcol.nextToken();
- if (ttype.toLowerCase().startsWith(BELOW))
+ if (ttype.toLowerCase(Locale.ROOT).startsWith(BELOW))
{
featureColour.setBelowThreshold(true);
}
- else if (ttype.toLowerCase().startsWith(ABOVE))
+ else if (ttype.toLowerCase(Locale.ROOT).startsWith(ABOVE))
{
featureColour.setAboveThreshold(true);
}
else
{
- if (!ttype.toLowerCase().startsWith("no"))
+ if (!ttype.toLowerCase(Locale.ROOT).startsWith("no"))
{
System.err.println(
"Ignoring unrecognised threshold type : " + ttype);
@@ -403,7 +406,7 @@ public class FeatureColour implements FeatureColourI
{
gcol.nextToken();
tval = gcol.nextToken();
- featureColour.setThreshold(new Float(tval).floatValue());
+ featureColour.setThreshold(Float.valueOf(tval).floatValue());
} catch (Exception e)
{
System.err.println("Couldn't parse threshold value as a float: ("
@@ -436,36 +439,25 @@ public class FeatureColour implements FeatureColourI
}
/**
- * Constructor given a simple colour
+ * Constructor given a simple colour. This also 'primes' a graduated colour
+ * range, where the maximum colour is the given simple colour, and the minimum
+ * colour a paler shade of it. This is for convenience when switching from a
+ * simple colour to a graduated colour scheme.
*
* @param c
*/
public FeatureColour(Color c)
{
- minColour = Color.WHITE;
- maxColour = Color.BLACK;
- noColour = DEFAULT_NO_COLOUR;
- minRed = 0f;
- minGreen = 0f;
- minBlue = 0f;
- deltaRed = 0f;
- deltaGreen = 0f;
- deltaBlue = 0f;
- colour = c;
- }
+ /*
+ * set max colour to the simple colour, min colour to a paler shade of it
+ */
+ this(c, c == null ? Color.white : ColorUtils.bleachColour(c, 0.9f),
+ c == null ? Color.black : c, DEFAULT_NO_COLOUR, 0, 0);
- /**
- * Constructor given a colour range and a score range, defaulting 'no value
- * colour' to be the same as minimum colour
- *
- * @param low
- * @param high
- * @param min
- * @param max
- */
- public FeatureColour(Color low, Color high, float min, float max)
- {
- this(low, high, low, min, max);
+ /*
+ * but enforce simple colour for now!
+ */
+ setGraduatedColour(false);
}
/**
@@ -498,29 +490,23 @@ public class FeatureColour implements FeatureColourI
}
/**
- * Copy constructor with new min/max ranges
- *
- * @param fc
- * @param min
- * @param max
- */
- public FeatureColour(FeatureColour fc, float min, float max)
- {
- this(fc);
- updateBounds(min, max);
- }
-
- /**
- * Constructor for a graduated colour
+ * Constructor that sets both simple and graduated colour values. This allows
+ * alternative colour schemes to be 'preserved' while switching between them
+ * to explore their effects on the visualisation.
+ *
+ * This sets the colour scheme to 'graduated' by default. Override this if
+ * wanted by calling setGraduatedColour(false)
for a simple
+ * colour, or setColourByLabel(true)
for colour by label.
*
+ * @param myColour
* @param low
* @param high
* @param noValueColour
* @param min
* @param max
*/
- public FeatureColour(Color low, Color high, Color noValueColour,
- float min, float max)
+ public FeatureColour(Color myColour, Color low, Color high,
+ Color noValueColour, float min, float max)
{
if (low == null)
{
@@ -530,10 +516,10 @@ public class FeatureColour implements FeatureColourI
{
high = Color.black;
}
- graduatedColour = true;
- colour = null;
+ colour = myColour;
minColour = low;
maxColour = high;
+ setGraduatedColour(true);
noColour = noValueColour;
threshold = Float.NaN;
isHighToLow = min >= max;
@@ -565,7 +551,7 @@ public class FeatureColour implements FeatureColourI
* Sets the 'graduated colour' flag. If true, also sets 'colour by label' to
* false.
*/
- void setGraduatedColour(boolean b)
+ public void setGraduatedColour(boolean b)
{
graduatedColour = b;
if (b)
@@ -696,9 +682,12 @@ public class FeatureColour implements FeatureColourI
/**
* Returns the colour for the given instance of the feature. This may be a
- * simple colour, a colour generated from the feature description (if
- * isColourByLabel()), or a colour derived from the feature score (if
- * isGraduatedColour()).
+ * simple colour, a colour generated from the feature description or other
+ * attribute (if isColourByLabel()), or a colour derived from the feature
+ * score or other attribute (if isGraduatedColour()).
+ *
+ * Answers null if feature score (or attribute) value lies outside a
+ * configured threshold.
*
* @param feature
* @return
@@ -710,8 +699,8 @@ public class FeatureColour implements FeatureColourI
{
String label = attributeName == null ? feature.getDescription()
: feature.getValueAsString(attributeName);
- return label == null ? noColour : ColorUtils
- .createColourFromName(label);
+ return label == null ? noColour
+ : ColorUtils.createColourFromName(label);
}
if (!isGraduatedColour())
@@ -837,9 +826,20 @@ public class FeatureColour implements FeatureColourI
sb.append(BAR).append(Format.getHexString(getMinColour()))
.append(BAR);
sb.append(Format.getHexString(getMaxColour())).append(BAR);
- String noValue = minColour.equals(noColour) ? NO_VALUE_MIN
- : (maxColour.equals(noColour) ? NO_VALUE_MAX
- : NO_VALUE_NONE);
+
+ /*
+ * 'no value' colour should be null, min or max colour;
+ * if none of these, coerce to minColour
+ */
+ String noValue = NO_VALUE_MIN;
+ if (maxColour.equals(noColour))
+ {
+ noValue = NO_VALUE_MAX;
+ }
+ if (noColour == null)
+ {
+ noValue = NO_VALUE_NONE;
+ }
sb.append(noValue).append(BAR);
if (!isAutoScaled())
{
@@ -898,6 +898,34 @@ public class FeatureColour implements FeatureColourI
}
@Override
+ public boolean isOutwithThreshold(SequenceFeature feature)
+ {
+ if (!isGraduatedColour())
+ {
+ return false;
+ }
+ float scr = feature.getScore();
+ if (attributeName != null)
+ {
+ try
+ {
+ String attVal = feature.getValueAsString(attributeName);
+ scr = Float.valueOf(attVal);
+ } catch (Throwable e)
+ {
+ scr = Float.NaN;
+ }
+ }
+ if (Float.isNaN(scr))
+ {
+ return false;
+ }
+
+ return ((isAboveThreshold() && scr <= threshold)
+ || (isBelowThreshold() && scr >= threshold));
+ }
+
+ @Override
public String getDescription()
{
if (isSimpleColour())