JAL-1503 update version in GPL header
[jalview.git] / src / jalview / schemes / ColourSchemeProperty.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
3  * Copyright (C) 2014 The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
10  *  
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  * The Jalview Authors are detailed in the 'AUTHORS' file.
18  */
19 package jalview.schemes;
20
21 import jalview.datamodel.AnnotatedCollectionI;
22
23 import java.awt.Color;
24
25 /**
26  * ColourSchemeProperty binds names to hardwired colourschemes and tries to deal
27  * intelligently with mapping unknown names to user defined colourschemes (that
28  * exist or can be created from the string representation of the colourscheme
29  * name - either a hex RGB triplet or a named colour under java.awt.color ). The
30  * values of the colourscheme constants is important for callers of
31  * getColourName(int i), since it can be used to enumerate the set of built in
32  * colours. The FIRST_COLOUR and LAST_COLOUR symbols are provided for this.
33  * 
34  * @author $author$
35  * @version $Revision$
36  */
37 public class ColourSchemeProperty
38 {
39   /** Undefined Colourscheme Index */
40   public static final int UNDEFINED = -1;
41
42   /** for schemes defined on the fly */
43   public static final int USER_DEFINED = 0;
44
45   /** No Colourscheme Index */
46   public static final int NONE = 1;
47
48   /** DOCUMENT ME!! */
49   public static final int CLUSTAL = 2;
50
51   /** DOCUMENT ME!! */
52   public static final int BLOSUM = 3;
53
54   /** DOCUMENT ME!! */
55   public static final int PID = 4;
56
57   /** DOCUMENT ME!! */
58   public static final int ZAPPO = 5;
59
60   /** DOCUMENT ME!! */
61   public static final int TAYLOR = 6;
62
63   /** DOCUMENT ME!! */
64   public static final int HYDROPHOBIC = 7;
65
66   /** DOCUMENT ME!! */
67   public static final int HELIX = 8;
68
69   /** DOCUMENT ME!! */
70   public static final int STRAND = 9;
71
72   /** DOCUMENT ME!! */
73   public static final int TURN = 10;
74
75   /** DOCUMENT ME!! */
76   public static final int BURIED = 11;
77
78   /** DOCUMENT ME!! */
79   public static final int NUCLEOTIDE = 12;
80
81   /**
82    * purine/pyrimidine
83    */
84   public static final int PURINEPYRIMIDINE = 13;
85
86   public static final int COVARIATION = 14;
87
88   public static final int TCOFFEE = 15;
89   
90   public static final int RNAHELIX = 16;
91
92   /**
93    * index of first colourscheme (includes 'None')
94    */
95   public static final int FIRST_COLOUR = NONE;
96
97   public static final int LAST_COLOUR = RNAHELIX;
98
99   /**
100    * DOCUMENT ME!
101    * 
102    * @param name
103    *          DOCUMENT ME!
104    * 
105    * @return DOCUMENT ME!
106    */
107   public static int getColourIndexFromName(String name)
108   {
109     int ret = UNDEFINED;
110
111     if (name.equalsIgnoreCase("Clustal"))
112     {
113       ret = CLUSTAL;
114     }
115     else if (name.equalsIgnoreCase("Blosum62"))
116     {
117       ret = BLOSUM;
118     }
119     else if (name.equalsIgnoreCase("% Identity"))
120     {
121       ret = PID;
122     }
123     else if (name.equalsIgnoreCase("Zappo"))
124     {
125       ret = ZAPPO;
126     }
127     else if (name.equalsIgnoreCase("Taylor"))
128     {
129       ret = TAYLOR;
130     }
131     else if (name.equalsIgnoreCase("Hydrophobic"))
132     {
133       ret = HYDROPHOBIC;
134     }
135     else if (name.equalsIgnoreCase("Helix Propensity"))
136     {
137       ret = HELIX;
138     }
139     else if (name.equalsIgnoreCase("Strand Propensity"))
140     {
141       ret = STRAND;
142     }
143     else if (name.equalsIgnoreCase("Turn Propensity"))
144     {
145       ret = TURN;
146     }
147     else if (name.equalsIgnoreCase("Buried Index"))
148     {
149       ret = BURIED;
150     }
151     else if (name.equalsIgnoreCase("Nucleotide"))
152     {
153       ret = NUCLEOTIDE;
154     }
155     else if (name.equalsIgnoreCase("T-Coffee Scores"))
156     {
157       ret = TCOFFEE;
158     }
159
160     else if (name.equalsIgnoreCase("User Defined"))
161     {
162       ret = USER_DEFINED;
163     }
164     else if (name.equalsIgnoreCase("None"))
165     {
166       ret = NONE;
167     }
168     else if (name.equalsIgnoreCase("Purine/Pyrimidine"))
169     {
170       ret = PURINEPYRIMIDINE;
171     }
172     else if (name.equalsIgnoreCase("RNA Helices"))
173     {
174       ret = RNAHELIX;
175     }
176     // else if (name.equalsIgnoreCase("Covariation"))
177     // {
178     // ret = COVARIATION;
179     // }
180
181     return ret;
182   }
183
184   /**
185    * DOCUMENT ME!
186    * 
187    * @param cs
188    *          DOCUMENT ME!
189    * 
190    * @return DOCUMENT ME!
191    */
192   public static String getColourName(ColourSchemeI cs)
193   {
194
195     int index = NONE;
196
197     if (cs instanceof ClustalxColourScheme)
198     {
199       index = CLUSTAL;
200     }
201     else if (cs instanceof Blosum62ColourScheme)
202     {
203       index = BLOSUM;
204     }
205     else if (cs instanceof PIDColourScheme)
206     {
207       index = PID;
208     }
209     else if (cs instanceof ZappoColourScheme)
210     {
211       index = ZAPPO;
212     }
213     else if (cs instanceof TaylorColourScheme)
214     {
215       index = TAYLOR;
216     }
217     else if (cs instanceof HydrophobicColourScheme)
218     {
219       index = HYDROPHOBIC;
220     }
221     else if (cs instanceof HelixColourScheme)
222     {
223       index = HELIX;
224     }
225     else if (cs instanceof StrandColourScheme)
226     {
227       index = STRAND;
228     }
229     else if (cs instanceof TurnColourScheme)
230     {
231       index = TURN;
232     }
233     else if (cs instanceof BuriedColourScheme)
234     {
235       index = BURIED;
236     }
237     else if (cs instanceof NucleotideColourScheme)
238     {
239       index = NUCLEOTIDE;
240     }
241     else if (cs instanceof PurinePyrimidineColourScheme)
242     {
243       index = PURINEPYRIMIDINE;
244     }
245     else if (cs instanceof TCoffeeColourScheme)
246     {
247       index = TCOFFEE;
248     }
249     else if (cs instanceof RNAHelicesColour)
250     {
251       index = RNAHELIX;
252     }
253     /*
254      * else if (cs instanceof CovariationColourScheme) { index = COVARIATION; }
255      */
256     else if (cs instanceof UserColourScheme)
257     {
258       if ((((UserColourScheme) cs).getName() != null)
259               && (((UserColourScheme) cs).getName().length() > 0))
260       {
261         return ((UserColourScheme) cs).getName();
262       }
263       // get default colourscheme name
264       index = USER_DEFINED;
265     }
266
267     return getColourName(index);
268   }
269
270   /**
271    * DOCUMENT ME!
272    * 
273    * @param index
274    *          DOCUMENT ME!
275    * 
276    * @return DOCUMENT ME!
277    */
278   public static String getColourName(int index)
279   {
280     String ret = null;
281
282     switch (index)
283     {
284     case CLUSTAL:
285       ret = "Clustal";
286
287       break;
288
289     case BLOSUM:
290       ret = "Blosum62";
291
292       break;
293
294     case PID:
295       ret = "% Identity";
296
297       break;
298
299     case ZAPPO:
300       ret = "Zappo";
301
302       break;
303
304     case TAYLOR:
305       ret = "Taylor";
306       break;
307
308     case HYDROPHOBIC:
309       ret = "Hydrophobic";
310
311       break;
312
313     case HELIX:
314       ret = "Helix Propensity";
315
316       break;
317
318     case STRAND:
319       ret = "Strand Propensity";
320
321       break;
322
323     case TURN:
324       ret = "Turn Propensity";
325
326       break;
327
328     case BURIED:
329       ret = "Buried Index";
330
331       break;
332
333     case NUCLEOTIDE:
334       ret = "Nucleotide";
335
336       break;
337
338     case PURINEPYRIMIDINE:
339       ret = "Purine/Pyrimidine";
340
341       break;
342
343     case TCOFFEE:
344       ret = "T-Coffee Scores";
345
346       break;
347     case RNAHELIX:
348       ret = "RNA Helices";
349
350       break;
351     /*
352      * case COVARIATION: ret = "Covariation";
353      * 
354      * break;
355      */
356     case USER_DEFINED:
357       ret = "User Defined";
358
359       break;
360
361     default:
362       ret = "None";
363
364       break;
365     }
366
367     return ret;
368   }
369
370   /**
371    * retrieve or create colourscheme associated with name
372    * 
373    * @param seqs
374    *          sequences to colour
375    * @param width
376    *          range of sequences to colour
377    * @param name
378    *          colourscheme name, applet colour parameter specification, or
379    *          string to parse as colour for new coloursheme
380    * @return Valid Colourscheme
381    */
382   public static ColourSchemeI getColour(AnnotatedCollectionI alignment,
383           String name)
384   {
385     int colindex = getColourIndexFromName(name);
386     if (colindex == UNDEFINED)
387     {
388       if (name.indexOf('=') == -1)
389       {
390         // try to build a colour from the string directly
391         try
392         {
393           return new UserColourScheme(name);
394         } catch (Exception e)
395         {
396           // System.err.println("Ignoring unknown colourscheme name");
397         }
398       }
399       else
400       {
401         // try to parse the string as a residue colourscheme
402         try
403         {
404           // fix the launchApp user defined coloursheme transfer bug
405           jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme(
406                   "white");
407           ucs.parseAppletParameter(name);
408
409         } catch (Exception e)
410         {
411           // System.err.println("Ignoring exception when parsing colourscheme as applet-parameter");
412         }
413       }
414     }
415     return getColour(alignment, getColourIndexFromName(name));
416   }
417
418   /**
419    * Construct an instance of ColourSchemeI corresponding to the given
420    * colourscheme index
421    * 
422    * @param seqs
423    *          sequences to be coloured by colourscheme
424    * @param width
425    *          geometry of alignment
426    * @param index
427    *          colourscheme number
428    * 
429    * @return null or an instance of the colourscheme configured to colour given
430    *         sequence set
431    */
432   public static ColourSchemeI getColour(
433           jalview.datamodel.AnnotatedCollectionI coll, int index)
434   {
435     // TODO 3.0 2.8 refactor signature to take an alignmentI like container so
436     // colourschemes based on annotation can be initialised
437     ColourSchemeI cs = null;
438
439     switch (index)
440     {
441     case CLUSTAL:
442       cs = new ClustalxColourScheme(coll, null);
443
444       break;
445
446     case BLOSUM:
447       cs = new Blosum62ColourScheme();
448
449       break;
450
451     case PID:
452       cs = new PIDColourScheme();
453
454       break;
455
456     case ZAPPO:
457       cs = new ZappoColourScheme();
458
459       break;
460
461     case TAYLOR:
462       cs = new TaylorColourScheme();
463       break;
464
465     case HYDROPHOBIC:
466       cs = new HydrophobicColourScheme();
467
468       break;
469
470     case HELIX:
471       cs = new HelixColourScheme();
472
473       break;
474
475     case STRAND:
476       cs = new StrandColourScheme();
477
478       break;
479
480     case TURN:
481       cs = new TurnColourScheme();
482
483       break;
484
485     case BURIED:
486       cs = new BuriedColourScheme();
487
488       break;
489
490     case NUCLEOTIDE:
491       cs = new NucleotideColourScheme();
492
493       break;
494
495     case PURINEPYRIMIDINE:
496       cs = new PurinePyrimidineColourScheme();
497
498       break;
499
500     case TCOFFEE:
501       cs = new TCoffeeColourScheme(coll);
502       break;
503     
504     case RNAHELIX:
505       cs = new RNAHelicesColour(coll);
506       break;
507       
508       // case COVARIATION:
509       // cs = new CovariationColourScheme(annotation);
510
511       // break;
512
513     case USER_DEFINED:
514       Color[] col = new Color[24];
515       for (int i = 0; i < 24; i++)
516       {
517         col[i] = Color.white;
518       }
519       cs = new UserColourScheme(col);
520       break;
521
522     default:
523       break;
524     }
525
526     return cs;
527   }
528
529   public static Color getAWTColorFromName(String name)
530   {
531     Color col = null;
532     name = name.toLowerCase();
533     if (name.equals("black"))
534     {
535       col = Color.black;
536     }
537     else if (name.equals("blue"))
538     {
539       col = Color.blue;
540     }
541     else if (name.equals("cyan"))
542     {
543       col = Color.cyan;
544     }
545     else if (name.equals("darkGray"))
546     {
547       col = Color.darkGray;
548     }
549     else if (name.equals("gray"))
550     {
551       col = Color.gray;
552     }
553     else if (name.equals("green"))
554     {
555       col = Color.green;
556     }
557     else if (name.equals("lightGray"))
558     {
559       col = Color.lightGray;
560     }
561     else if (name.equals("magenta"))
562     {
563       col = Color.magenta;
564     }
565     else if (name.equals("orange"))
566     {
567       col = Color.orange;
568     }
569     else if (name.equals("pink"))
570     {
571       col = Color.pink;
572     }
573     else if (name.equals("red"))
574     {
575       col = Color.red;
576     }
577     else if (name.equals("white"))
578     {
579       col = Color.white;
580     }
581     else if (name.equals("yellow"))
582     {
583       col = Color.yellow;
584     }
585
586     return col;
587   }
588 }