1 package fr.orsay.lri.varna.models.rna;
4 import java.io.IOException;
6 import java.io.Serializable;
7 import java.io.StreamTokenizer;
8 import java.util.ArrayList;
9 import java.util.Arrays;
10 import java.util.Formatter;
11 import java.util.Vector;
13 public class ModeleColorMap implements Cloneable, Serializable{
17 private static final long serialVersionUID = 4055062096061553106L;
18 private Vector<Color> _map;
19 private Vector<Double> _values;
21 public static final Color DEFAULT_COLOR = Color.GREEN;
23 public enum NamedColorMapTypes {
24 RED ("red",ModeleColorMap.redColorMap()),
25 BLUE ("blue",ModeleColorMap.blueColorMap()),
26 GREEN ("green",ModeleColorMap.greenColorMap()),
27 HEAT ("heat",ModeleColorMap.heatColorMap()),
28 ENERGY ("energy",ModeleColorMap.energyColorMap()),
29 ROCKNROLL ("rocknroll",ModeleColorMap.rockNRollColorMap()),
30 VIENNA ("vienna",ModeleColorMap.viennaColorMap()),
31 BW ("bw",ModeleColorMap.bwColorMap());
36 private NamedColorMapTypes(String id, ModeleColorMap cm)
46 public ModeleColorMap getColorMap()
50 public String toString()
57 public ModeleColorMap()
59 this(new Vector<Color>(),new Vector<Double>());
63 public ModeleColorMap(Vector<Color> map,
64 Vector<Double> values)
70 public void addColor(double val, Color col)
72 int offset = Arrays.binarySearch(_values.toArray(), val) ;
75 int inspoint = (-offset)-1;
76 _map.insertElementAt(col, inspoint);
77 _values.insertElementAt(val,inspoint);
81 public double getMinValue()
84 return _values.get(0);
88 public double getMaxValue()
91 return _values.get(_values.size()-1);
96 public Color getMinColor()
100 return DEFAULT_COLOR;
103 public Color getMaxColor()
106 return _map.get(_map.size()-1);
107 return DEFAULT_COLOR;
111 public int getNumColors()
113 return (_map.size());
116 public Color getColorAt(int i)
118 return (_map.get(i));
121 public Double getValueAt(int i)
123 return (_values.get(i));
126 public Color getColorForValue(double val)
129 if (val<=getMinValue())
130 { result = getMinColor(); }
131 else if (val>=getMaxValue())
133 result = getMaxColor();
137 int offset = Arrays.binarySearch(_values.toArray(), val) ;
140 result = _map.get(offset);
144 int inspoint = (-offset)-1;
145 Color c1 = _map.get(inspoint);
146 double v1 = _values.get(inspoint);
149 Color c2 = _map.get(inspoint-1);
150 double v2 = _values.get(inspoint-1);
151 double blendCoeff = (v2-val)/(v2-v1);
152 result = new Color((int)(blendCoeff*c1.getRed()+(1.0-blendCoeff)*c2.getRed()),
153 (int)(blendCoeff*c1.getGreen()+(1.0-blendCoeff)*c2.getGreen()),
154 (int)(blendCoeff*c1.getBlue()+(1.0-blendCoeff)*c2.getBlue()));
166 public static ModeleColorMap energyColorMap()
168 ModeleColorMap cm = new ModeleColorMap();
169 cm.addColor(1.0,new Color(128,50,50).brighter());
170 cm.addColor(0.9,new Color(255,50,50).brighter());
171 cm.addColor(0.65,new Color(255,255,50).brighter());
172 cm.addColor(0.55,new Color(20,255,50).brighter());
173 cm.addColor(0.2,new Color(50,50,255).brighter());
174 cm.addColor(0.0,new Color(50,50,128).brighter());
178 public static ModeleColorMap viennaColorMap()
180 ModeleColorMap cm = new ModeleColorMap();
181 cm.addColor(0.0,new Color(0,80,220));
182 cm.addColor(0.1,new Color(0,139,220));
183 cm.addColor(0.2,new Color(0,220,218));
184 cm.addColor(0.3,new Color(0,220,123));
185 cm.addColor(0.4,new Color(0,220,49));
186 cm.addColor(0.5,new Color(34,220,0));
187 cm.addColor(0.6,new Color(109,220,0));
188 cm.addColor(0.7,new Color(199,220,0));
189 cm.addColor(0.8,new Color(220,165,0));
190 cm.addColor(0.9,new Color(220,86,0));
191 cm.addColor(1.0,new Color(220,0,0));
195 public static ModeleColorMap bwColorMap()
197 ModeleColorMap cm = new ModeleColorMap();
198 cm.addColor(0.0,Color.white);
199 cm.addColor(1.0,Color.gray.darker());
203 public static ModeleColorMap greenColorMap()
205 ModeleColorMap cm = new ModeleColorMap();
206 cm.addColor(0.0,Color.gray.brighter().brighter());
207 cm.addColor(1.0,Color.green.darker());
211 public static ModeleColorMap blueColorMap()
213 ModeleColorMap cm = new ModeleColorMap();
214 cm.addColor(0.0,Color.gray.brighter().brighter());
215 cm.addColor(1.0,Color.blue);
219 public static ModeleColorMap redColorMap()
221 ModeleColorMap cm = new ModeleColorMap();
222 cm.addColor(0.0,Color.gray.brighter().brighter());
223 cm.addColor(1.0,Color.red);
227 public static ModeleColorMap heatColorMap()
229 ModeleColorMap cm = new ModeleColorMap();
230 cm.addColor(0.0,Color.yellow);
231 cm.addColor(1.0,Color.red);
235 public static ModeleColorMap rockNRollColorMap()
237 ModeleColorMap cm = new ModeleColorMap();
238 cm.addColor(0.0,Color.red.brighter());
239 cm.addColor(1.0,Color.black);
240 cm.addColor(2.0,Color.green.brighter());
245 public static ModeleColorMap defaultColorMap()
247 return energyColorMap();
250 public static ModeleColorMap parseColorMap(String s)
252 String[] data = s.split("[;,]");
255 String name = data[0].toLowerCase();
256 for (NamedColorMapTypes p : NamedColorMapTypes.values())
258 if (name.equals(p.getId().toLowerCase()))
260 return p.getColorMap();
263 return ModeleColorMap.defaultColorMap();
267 ModeleColorMap cm = new ModeleColorMap();
269 for(int i=0;i<data.length;i++)
271 String[] data2 = data[i].split(":");
275 Double val = Double.parseDouble(data2[0]);
276 Color col = Color.decode(data2[1]);
277 cm.addColor(val, col);
284 if (cm.getNumColors()>1)
287 return ModeleColorMap.defaultColorMap();
290 public void setMinValue(double newMin)
292 rescale(newMin,getMaxValue());
295 public void setMaxValue(double newMax)
297 rescale(getMinValue(),newMax);
300 public void rescale(double newMin, double newMax)
302 double minBck = getMinValue();
303 double maxBck = getMaxValue();
304 double spanBck = maxBck-minBck;
307 newMax = Math.max(newMax,newMin+1.0);
308 for (int i=0;i<_values.size();i++)
310 double valBck = _values.get(i);
311 _values.set(i, newMin+(newMax-newMin)*(valBck-minBck)/(spanBck));
316 public ModeleColorMap clone()
318 ModeleColorMap cm = new ModeleColorMap();
319 cm._map = (Vector<Color>) _map.clone();
320 cm._values = (Vector<Double>)_values.clone();
324 public boolean equals(ModeleColorMap cm)
326 if ( getNumColors()!=cm.getNumColors())
328 for (int i=0;i<getNumColors();i++)
330 if ((!getColorAt(i).equals(cm.getColorAt(i))) || (!getValueAt(i).equals(cm.getValueAt(i))) )
337 public String getParamEncoding()
340 Formatter f = new Formatter();
341 for(int i=0;i<getNumColors();i++)
345 f.format("%.2f:#%02X%02X%02X", _values.get(i),_map.get(i).getRed(),_map.get(i).getGreen(),_map.get(i).getBlue());
347 return f.out().toString();
352 public String toString()
354 return getParamEncoding();