X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src2%2Ffr%2Forsay%2Flri%2Fvarna%2Fmodels%2Frna%2FModeleColorMap.java;fp=src2%2Ffr%2Forsay%2Flri%2Fvarna%2Fmodels%2Frna%2FModeleColorMap.java;h=9570ad4448bb1309fa50ac97aa5f9f0e1a877f90;hb=665d2c2f4c1310e6985b93b7c2c8a8eec2fa9086;hp=0000000000000000000000000000000000000000;hpb=0e684f72690bd6532272a39ab6c188a27559fd09;p=jalview.git diff --git a/src2/fr/orsay/lri/varna/models/rna/ModeleColorMap.java b/src2/fr/orsay/lri/varna/models/rna/ModeleColorMap.java new file mode 100644 index 0000000..9570ad4 --- /dev/null +++ b/src2/fr/orsay/lri/varna/models/rna/ModeleColorMap.java @@ -0,0 +1,357 @@ +package fr.orsay.lri.varna.models.rna; + +import java.awt.Color; +import java.io.IOException; +import java.io.Reader; +import java.io.Serializable; +import java.io.StreamTokenizer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Formatter; +import java.util.Vector; + +public class ModeleColorMap implements Cloneable, Serializable{ + /** + * + */ + private static final long serialVersionUID = 4055062096061553106L; +private Vector _map; + private Vector _values; + + public static final Color DEFAULT_COLOR = Color.GREEN; + + public enum NamedColorMapTypes { + RED ("red",ModeleColorMap.redColorMap()), + BLUE ("blue",ModeleColorMap.blueColorMap()), + GREEN ("green",ModeleColorMap.greenColorMap()), + HEAT ("heat",ModeleColorMap.heatColorMap()), + ENERGY ("energy",ModeleColorMap.energyColorMap()), + ROCKNROLL ("rocknroll",ModeleColorMap.rockNRollColorMap()), + VIENNA ("vienna",ModeleColorMap.viennaColorMap()), + BW ("bw",ModeleColorMap.bwColorMap()); + + String _id; + ModeleColorMap _cm; + + private NamedColorMapTypes(String id, ModeleColorMap cm) + { + _id = id; + _cm = cm; + } + + public String getId() + { + return _id; + } + public ModeleColorMap getColorMap() + { + return _cm; + } + public String toString() + { + return _id; + } + } + + + public ModeleColorMap() + { + this(new Vector(),new Vector()); + } + + + public ModeleColorMap(Vector map, + Vector values) + { + _map = map; + _values = values; + } + + public void addColor(double val, Color col) + { + int offset = Arrays.binarySearch(_values.toArray(), val) ; + if (offset<0) + { + int inspoint = (-offset)-1; + _map.insertElementAt(col, inspoint); + _values.insertElementAt(val,inspoint); + } + } + + public double getMinValue() + { + if (_values.size()>0) + return _values.get(0); + return 0.0; + } + + public double getMaxValue() + { + if (_values.size()>0) + return _values.get(_values.size()-1); + return 0.0; + } + + + public Color getMinColor() + { + if (_map.size()>0) + return _map.get(0); + return DEFAULT_COLOR; + } + + public Color getMaxColor() + { + if (_map.size()>0) + return _map.get(_map.size()-1); + return DEFAULT_COLOR; + } + + + public int getNumColors() + { + return (_map.size()); + } + + public Color getColorAt(int i) + { + return (_map.get(i)); + } + + public Double getValueAt(int i) + { + return (_values.get(i)); + } + + public Color getColorForValue(double val) + { + Color result; + if (val<=getMinValue()) + { result = getMinColor(); } + else if (val>=getMaxValue()) + { + result = getMaxColor(); + } + else + { + int offset = Arrays.binarySearch(_values.toArray(), val) ; + if (offset>=0) + { + result = _map.get(offset); + } + else + { + int inspoint = (-offset)-1; + Color c1 = _map.get(inspoint); + double v1 = _values.get(inspoint); + if (inspoint>0) + { + Color c2 = _map.get(inspoint-1); + double v2 = _values.get(inspoint-1); + double blendCoeff = (v2-val)/(v2-v1); + result = new Color((int)(blendCoeff*c1.getRed()+(1.0-blendCoeff)*c2.getRed()), + (int)(blendCoeff*c1.getGreen()+(1.0-blendCoeff)*c2.getGreen()), + (int)(blendCoeff*c1.getBlue()+(1.0-blendCoeff)*c2.getBlue())); + + } + else + { + result = c1; + } + } + } + return result; + } + + public static ModeleColorMap energyColorMap() + { + ModeleColorMap cm = new ModeleColorMap(); + cm.addColor(1.0,new Color(128,50,50).brighter()); + cm.addColor(0.9,new Color(255,50,50).brighter()); + cm.addColor(0.65,new Color(255,255,50).brighter()); + cm.addColor(0.55,new Color(20,255,50).brighter()); + cm.addColor(0.2,new Color(50,50,255).brighter()); + cm.addColor(0.0,new Color(50,50,128).brighter()); + return cm; + } + + public static ModeleColorMap viennaColorMap() + { + ModeleColorMap cm = new ModeleColorMap(); + cm.addColor(0.0,new Color(0,80,220)); + cm.addColor(0.1,new Color(0,139,220)); + cm.addColor(0.2,new Color(0,220,218)); + cm.addColor(0.3,new Color(0,220,123)); + cm.addColor(0.4,new Color(0,220,49)); + cm.addColor(0.5,new Color(34,220,0)); + cm.addColor(0.6,new Color(109,220,0)); + cm.addColor(0.7,new Color(199,220,0)); + cm.addColor(0.8,new Color(220,165,0)); + cm.addColor(0.9,new Color(220,86,0)); + cm.addColor(1.0,new Color(220,0,0)); + return cm; + } + + public static ModeleColorMap bwColorMap() + { + ModeleColorMap cm = new ModeleColorMap(); + cm.addColor(0.0,Color.white); + cm.addColor(1.0,Color.gray.darker()); + return cm; + } + + public static ModeleColorMap greenColorMap() + { + ModeleColorMap cm = new ModeleColorMap(); + cm.addColor(0.0,Color.gray.brighter().brighter()); + cm.addColor(1.0,Color.green.darker()); + return cm; + } + + public static ModeleColorMap blueColorMap() + { + ModeleColorMap cm = new ModeleColorMap(); + cm.addColor(0.0,Color.gray.brighter().brighter()); + cm.addColor(1.0,Color.blue); + return cm; + } + + public static ModeleColorMap redColorMap() + { + ModeleColorMap cm = new ModeleColorMap(); + cm.addColor(0.0,Color.gray.brighter().brighter()); + cm.addColor(1.0,Color.red); + return cm; + } + + public static ModeleColorMap heatColorMap() + { + ModeleColorMap cm = new ModeleColorMap(); + cm.addColor(0.0,Color.yellow); + cm.addColor(1.0,Color.red); + return cm; + } + + public static ModeleColorMap rockNRollColorMap() + { + ModeleColorMap cm = new ModeleColorMap(); + cm.addColor(0.0,Color.red.brighter()); + cm.addColor(1.0,Color.black); + cm.addColor(2.0,Color.green.brighter()); + return cm; + } + + + public static ModeleColorMap defaultColorMap() + { + return energyColorMap(); + } + + public static ModeleColorMap parseColorMap(String s) + { + String[] data = s.split("[;,]"); + if (data.length==1) + { + String name = data[0].toLowerCase(); + for (NamedColorMapTypes p : NamedColorMapTypes.values()) + { + if (name.equals(p.getId().toLowerCase())) + { + return p.getColorMap(); + } + } + return ModeleColorMap.defaultColorMap(); + } + else + { + ModeleColorMap cm = new ModeleColorMap(); + + for(int i=0;i1) + return cm; + } + return ModeleColorMap.defaultColorMap(); + } + + public void setMinValue(double newMin) + { + rescale(newMin,getMaxValue()); + } + + public void setMaxValue(double newMax) + { + rescale(getMinValue(),newMax); + } + + public void rescale(double newMin, double newMax) + { + double minBck = getMinValue(); + double maxBck = getMaxValue(); + double spanBck = maxBck-minBck; + if (newMax!=newMin) + { + newMax = Math.max(newMax,newMin+1.0); + for (int i=0;i<_values.size();i++) + { + double valBck = _values.get(i); + _values.set(i, newMin+(newMax-newMin)*(valBck-minBck)/(spanBck)); + } + } + } + + public ModeleColorMap clone() + { + ModeleColorMap cm = new ModeleColorMap(); + cm._map = (Vector) _map.clone(); + cm._values = (Vector)_values.clone(); + return cm; + } + + public boolean equals(ModeleColorMap cm) + { + if ( getNumColors()!=cm.getNumColors()) + return false; + for (int i=0;i