JAL-3026 srcjar files for VARNA and log4j
[jalview.git] / srcjar / fr / orsay / lri / varna / models / rna / ModeleColorMap.java
1 package fr.orsay.lri.varna.models.rna;
2
3 import java.awt.Color;
4 import java.io.IOException;
5 import java.io.Reader;
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;
12
13 public class ModeleColorMap implements Cloneable, Serializable{
14   /**
15          * 
16          */
17         private static final long serialVersionUID = 4055062096061553106L;
18 private Vector<Color> _map;
19   private Vector<Double> _values;
20   
21   public static final Color DEFAULT_COLOR = Color.GREEN; 
22   
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());
32           
33           String _id;
34           ModeleColorMap _cm;
35           
36           private NamedColorMapTypes(String id, ModeleColorMap cm)
37           {
38                 _id = id;
39                 _cm = cm;
40           }
41           
42           public String getId()
43           {
44                   return _id;
45           }
46           public ModeleColorMap getColorMap()
47           {
48                   return _cm;
49           }
50           public String toString()
51           {
52                 return _id; 
53           }
54   }
55   
56   
57   public ModeleColorMap()
58   {
59     this(new Vector<Color>(),new Vector<Double>());
60   }
61
62   
63   public ModeleColorMap(Vector<Color> map,
64                   Vector<Double> values)
65   {
66           _map = map;
67           _values = values;
68   }
69   
70   public void addColor(double val, Color col)
71   {
72           int offset = Arrays.binarySearch(_values.toArray(), val) ;
73           if (offset<0)
74           {
75                   int inspoint = (-offset)-1;
76                   _map.insertElementAt(col, inspoint);            
77                   _values.insertElementAt(val,inspoint);                  
78           }
79   }
80
81   public double getMinValue()
82   {
83           if (_values.size()>0)
84             return _values.get(0);
85           return 0.0;
86   }
87  
88   public double getMaxValue()
89   {
90           if (_values.size()>0)
91             return _values.get(_values.size()-1);
92           return 0.0;
93   }
94  
95   
96   public Color getMinColor()
97   {
98           if (_map.size()>0)
99             return _map.get(0);
100           return DEFAULT_COLOR;
101   }
102
103   public Color getMaxColor()
104   {
105           if (_map.size()>0)
106             return _map.get(_map.size()-1);
107           return DEFAULT_COLOR;
108   }
109  
110
111   public int getNumColors()
112   {
113           return (_map.size());
114   }
115  
116   public Color getColorAt(int i)
117   {
118           return (_map.get(i));
119   }
120
121   public Double getValueAt(int i)
122   {
123           return (_values.get(i));
124   }
125   
126   public Color getColorForValue(double val)
127   {
128           Color result; 
129           if (val<=getMinValue())
130           {       result = getMinColor(); }
131           else if (val>=getMaxValue())
132           {
133                   result = getMaxColor();
134           }
135           else
136           {
137           int offset = Arrays.binarySearch(_values.toArray(), val) ;
138           if (offset>=0)
139           {
140                   result =  _map.get(offset);
141           }
142           else
143           {
144                   int inspoint = (-offset)-1;
145                   Color c1 = _map.get(inspoint);
146                   double v1 = _values.get(inspoint);
147                   if (inspoint>0)
148                   {
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()));
155                          
156                   }
157                   else
158                   {
159                         result = c1;  
160                   }
161           }
162           }
163           return result;
164   }
165   
166   public static ModeleColorMap energyColorMap()
167   {
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());
175           return cm;
176   }
177   
178   public static ModeleColorMap viennaColorMap()
179   {
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));
192           return cm;
193   }
194   
195   public static ModeleColorMap bwColorMap()
196   {
197           ModeleColorMap cm = new ModeleColorMap();
198           cm.addColor(0.0,Color.white);
199           cm.addColor(1.0,Color.gray.darker());
200           return cm;
201   }
202
203   public static ModeleColorMap greenColorMap()
204   {
205           ModeleColorMap cm = new ModeleColorMap();
206           cm.addColor(0.0,Color.gray.brighter().brighter());
207           cm.addColor(1.0,Color.green.darker());
208           return cm;
209   }
210   
211   public static ModeleColorMap blueColorMap()
212   {
213           ModeleColorMap cm = new ModeleColorMap();
214           cm.addColor(0.0,Color.gray.brighter().brighter());
215           cm.addColor(1.0,Color.blue);
216           return cm;
217   }
218   
219   public static ModeleColorMap redColorMap()
220   {
221           ModeleColorMap cm = new ModeleColorMap();
222           cm.addColor(0.0,Color.gray.brighter().brighter());
223           cm.addColor(1.0,Color.red);
224           return cm;
225   }
226
227   public static ModeleColorMap heatColorMap()
228   {
229           ModeleColorMap cm = new ModeleColorMap();
230           cm.addColor(0.0,Color.yellow);
231           cm.addColor(1.0,Color.red);
232           return cm;
233   }
234   
235   public static ModeleColorMap rockNRollColorMap()
236   {
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());
241           return cm;      
242   }
243
244   
245   public static ModeleColorMap defaultColorMap()
246   {
247           return energyColorMap();
248   }
249   
250   public static ModeleColorMap parseColorMap(String s)
251   {
252           String[] data = s.split("[;,]");
253           if (data.length==1)
254           {
255                   String name = data[0].toLowerCase();
256                   for (NamedColorMapTypes p : NamedColorMapTypes.values())
257                   {
258                           if (name.equals(p.getId().toLowerCase()))
259                           {
260                                   return p.getColorMap();
261                           }
262                   }
263                   return ModeleColorMap.defaultColorMap();
264           }
265           else
266           {
267                   ModeleColorMap cm = new ModeleColorMap();
268                   
269                   for(int i=0;i<data.length;i++)
270                   {
271                           String[] data2 = data[i].split(":");
272                           if (data2.length==2)
273                           {
274                                   try{
275                                           Double val = Double.parseDouble(data2[0]);
276                                           Color col = Color.decode(data2[1]);
277                                           cm.addColor(val, col);
278                                   }
279                                   catch(Exception e)
280                                   {  
281                                   }
282                           }
283                   }
284                   if (cm.getNumColors()>1)
285                           return cm;
286           }
287           return ModeleColorMap.defaultColorMap();
288   }
289   
290   public void setMinValue(double newMin)
291   {
292           rescale(newMin,getMaxValue());
293   }
294
295   public void setMaxValue(double newMax)
296   {
297           rescale(getMinValue(),newMax);
298   }
299
300   public void rescale(double newMin, double newMax)
301   {
302           double minBck = getMinValue();
303           double maxBck = getMaxValue();
304           double spanBck = maxBck-minBck;
305           if (newMax!=newMin)
306           {
307               newMax = Math.max(newMax,newMin+1.0);
308                   for (int i=0;i<_values.size();i++)
309                   {
310                           double valBck = _values.get(i);
311                           _values.set(i, newMin+(newMax-newMin)*(valBck-minBck)/(spanBck));
312                   }
313           }
314   }
315   
316   public ModeleColorMap clone()
317   {
318           ModeleColorMap cm = new ModeleColorMap(); 
319           cm._map = (Vector<Color>) _map.clone();
320           cm._values = (Vector<Double>)_values.clone();
321           return cm;
322   }
323   
324   public boolean equals(ModeleColorMap cm)
325   {
326           if ( getNumColors()!=cm.getNumColors())
327                   return false;
328           for (int i=0;i<getNumColors();i++)
329           {
330                   if ((!getColorAt(i).equals(cm.getColorAt(i))) || (!getValueAt(i).equals(cm.getValueAt(i))) )
331                                   return false;
332           }
333           return true;
334                   
335   }
336   
337   public String getParamEncoding()
338   {
339           String result = "";
340           Formatter f = new Formatter();
341           for(int i=0;i<getNumColors();i++)
342           {
343                   if (i!=0)
344                           f.format(",");
345                   f.format("%.2f:#%02X%02X%02X", _values.get(i),_map.get(i).getRed(),_map.get(i).getGreen(),_map.get(i).getBlue());
346           }
347           return f.out().toString();
348   }
349   
350
351   
352   public String toString()
353   {
354           return getParamEncoding();
355   }
356 }
357