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