update consensus and conservation are in try catch for out of memory error
[jalview.git] / src / jalview / gui / AlignViewport.java
1  /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.gui;\r
20 \r
21 import jalview.analysis.*;\r
22 \r
23 import jalview.bin.*;\r
24 \r
25 import jalview.datamodel.*;\r
26 \r
27 import jalview.schemes.*;\r
28 \r
29 import java.awt.*;\r
30 \r
31 import java.util.*;\r
32 \r
33 \r
34 /**\r
35  * DOCUMENT ME!\r
36  *\r
37  * @author $author$\r
38  * @version $Revision$\r
39  */\r
40 public class AlignViewport\r
41 {\r
42     int startRes;\r
43     int endRes;\r
44     int startSeq;\r
45     int endSeq;\r
46     boolean showFullId = false;\r
47     boolean showText = true;\r
48     boolean showColourText = false;\r
49     boolean showBoxes = true;\r
50     boolean wrapAlignment = false;\r
51     boolean renderGaps = true;\r
52     boolean showSequenceFeatures = false;\r
53     boolean showAnnotation = true;\r
54     boolean showConservation = true;\r
55     boolean showQuality = true;\r
56     boolean showIdentity = true;\r
57     boolean colourAppliesToAllGroups = true;\r
58     ColourSchemeI globalColourScheme = null;\r
59     boolean conservationColourSelected = false;\r
60     boolean abovePIDThreshold = false;\r
61     SequenceGroup selectionGroup;\r
62     int charHeight;\r
63     int charWidth;\r
64     int chunkWidth;\r
65     int chunkHeight;\r
66     Font font = new Font("SansSerif", Font.PLAIN, 10);\r
67     AlignmentI alignment;\r
68     ColumnSelection colSel = new ColumnSelection();\r
69     int threshold;\r
70     int increment;\r
71     NJTree currentTree = null;\r
72     boolean scaleAboveWrapped = false;\r
73     boolean scaleLeftWrapped = true;\r
74     boolean scaleRightWrapped = true;\r
75 \r
76     /** DOCUMENT ME!! */\r
77     public Vector vconsensus;\r
78     AlignmentAnnotation consensus;\r
79     AlignmentAnnotation conservation;\r
80     AlignmentAnnotation quality;\r
81 \r
82     /** DOCUMENT ME!! */\r
83     public int ConsPercGaps = 25; // JBPNote : This should be a scalable property!\r
84 \r
85     // JBPNote Prolly only need this in the applet version.\r
86     private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(this);\r
87 \r
88     boolean ignoreGapsInConsensusCalculation = false;\r
89 \r
90     /**\r
91      * Creates a new AlignViewport object.\r
92      *\r
93      * @param al DOCUMENT ME!\r
94      */\r
95     public AlignViewport(AlignmentI al)\r
96     {\r
97         setAlignment(al);\r
98         this.startRes = 0;\r
99         this.endRes = al.getWidth() - 1;\r
100         this.startSeq = 0;\r
101         this.endSeq = al.getHeight() - 1;\r
102 \r
103         updateFromPreferences();\r
104     }\r
105 \r
106     /**\r
107      * DOCUMENT ME!\r
108      */\r
109     public void updateFromPreferences()\r
110     {\r
111       showFullId = Cache.getDefault("SHOW_FULL_ID", true);\r
112       showAnnotation = Cache.getDefault("SHOW_ANNOTATIONS", true);\r
113       showConservation = Cache.getDefault("SHOW_CONSERVATION", true);\r
114 \r
115       showQuality = Cache.getDefault("SHOW_QUALITY", true);\r
116       showIdentity = Cache.getDefault("SHOW_IDENTITY", true);\r
117 \r
118        String fontName = Cache.getDefault("FONT_NAME", "SansSerif");\r
119        String fontStyle = Cache.getDefault("FONT_STYLE", Font.PLAIN + "") ;\r
120        String fontSize = Cache.getDefault("FONT_SIZE", "10");\r
121 \r
122        int style = 0;\r
123 \r
124        if (fontStyle.equals("bold"))\r
125        {\r
126          style = 1;\r
127        }\r
128        else if (fontStyle.equals("italic"))\r
129        {\r
130          style = 2;\r
131        }\r
132 \r
133        setFont(new Font(fontName, style, Integer.parseInt(fontSize)));\r
134 \r
135 \r
136        alignment.setGapCharacter( Cache.getDefault("GAP_SYMBOL", "-").charAt(0) );\r
137 \r
138 \r
139         // We must set conservation and consensus before setting colour,\r
140         // as Blosum and Clustal require this to be done\r
141         updateConservation();\r
142         updateConsensus();\r
143 \r
144         if (jalview.bin.Cache.getProperty("DEFAULT_COLOUR") != null)\r
145         {\r
146           globalColourScheme = ColourSchemeProperty.getColour(alignment,\r
147               jalview.bin.Cache.getProperty("DEFAULT_COLOUR"));\r
148 \r
149             if (globalColourScheme instanceof UserColourScheme)\r
150             {\r
151                 globalColourScheme = UserDefinedColours.loadDefaultColours();\r
152                 ((UserColourScheme)globalColourScheme).setThreshold(0, getIgnoreGapsConsensus());\r
153             }\r
154 \r
155             if (globalColourScheme != null)\r
156             {\r
157                 globalColourScheme.setConsensus(vconsensus);\r
158             }\r
159         }\r
160     }\r
161 \r
162 \r
163 \r
164     /**\r
165      * DOCUMENT ME!\r
166      *\r
167      * @param b DOCUMENT ME!\r
168      */\r
169     public void showSequenceFeatures(boolean b)\r
170     {\r
171         showSequenceFeatures = b;\r
172     }\r
173 \r
174     /**\r
175      * DOCUMENT ME!\r
176      */\r
177     public void updateConservation()\r
178     {\r
179       try{\r
180         Conservation cons = new jalview.analysis.Conservation("All",\r
181             jalview.schemes.ResidueProperties.propHash, 3,\r
182             alignment.getSequences(), 0, alignment.getWidth() - 1);\r
183         cons.calculate();\r
184         cons.verdict(false, ConsPercGaps);\r
185         cons.findQuality();\r
186 \r
187         int alWidth = alignment.getWidth();\r
188         Annotation[] annotations = new Annotation[alWidth];\r
189         Annotation[] qannotations = new Annotation[alWidth];\r
190         String sequence = cons.getConsSequence().getSequence();\r
191         float minR;\r
192         float minG;\r
193         float minB;\r
194         float maxR;\r
195         float maxG;\r
196         float maxB;\r
197         minR = 0.3f;\r
198         minG = 0.0f;\r
199         minB = 0f;\r
200         maxR = 1.0f - minR;\r
201         maxG = 0.9f - minG;\r
202         maxB = 0f - minB; // scalable range for colouring both Conservation and Quality\r
203 \r
204         float min = 0f;\r
205         float max = 11f;\r
206         float qmin = cons.qualityRange[0].floatValue();\r
207         float qmax = cons.qualityRange[1].floatValue();\r
208 \r
209         for (int i = 0; i < alWidth; i++)\r
210         {\r
211           float value = 0;\r
212 \r
213           try\r
214           {\r
215             value = Integer.parseInt(sequence.charAt(i) + "");\r
216           }\r
217           catch (Exception ex)\r
218           {\r
219             if (sequence.charAt(i) == '*')\r
220             {\r
221               value = 11;\r
222             }\r
223 \r
224             if (sequence.charAt(i) == '+')\r
225             {\r
226               value = 10;\r
227             }\r
228           }\r
229 \r
230           float vprop = value - min;\r
231           vprop /= max;\r
232           annotations[i] = new Annotation(sequence.charAt(i) + "",\r
233                                           String.valueOf(value), ' ', value,\r
234                                           new Color(minR + (maxR * vprop),\r
235               minG + (maxG * vprop),\r
236               minB + (maxB * vprop)));\r
237 \r
238           // Quality calc\r
239           value = ( (Double) cons.quality.get(i)).floatValue();\r
240           vprop = value - qmin;\r
241           vprop /= qmax;\r
242           qannotations[i] = new Annotation(" ", String.valueOf(value), ' ',\r
243                                            value,\r
244                                            new Color(minR + (maxR * vprop),\r
245               minG + (maxG * vprop),\r
246               minB + (maxB * vprop)));\r
247         }\r
248 \r
249         if (conservation == null)\r
250         {\r
251           conservation = new AlignmentAnnotation("Conservation",\r
252                                                  "Conservation of total alignment less than " +\r
253                                                  ConsPercGaps + "% gaps",\r
254                                                  annotations, 0f, // cons.qualityRange[0].floatValue(),\r
255                                                  11f, // cons.qualityRange[1].floatValue()\r
256                                                  1);\r
257 \r
258           if (showConservation)\r
259           {\r
260             alignment.addAnnotation(conservation);\r
261           }\r
262 \r
263           quality = new AlignmentAnnotation("Quality",\r
264                                             "Alignment Quality based on Blosum62 scores",\r
265                                             qannotations,\r
266                                             cons.qualityRange[0].floatValue(),\r
267                                             cons.qualityRange[1].floatValue(),\r
268                                             1);\r
269 \r
270           if (showQuality)\r
271           {\r
272             alignment.addAnnotation(quality);\r
273           }\r
274         }\r
275         else\r
276         {\r
277           conservation.annotations = annotations;\r
278           quality.annotations = qannotations;\r
279           quality.graphMax = cons.qualityRange[1].floatValue();\r
280         }\r
281       }catch(OutOfMemoryError error)\r
282       {\r
283         System.out.println("Out of memory calculating conservation.");\r
284       }\r
285     }\r
286 \r
287     /**\r
288      * DOCUMENT ME!\r
289      */\r
290     public void updateConsensus()\r
291     {\r
292       try{\r
293         Annotation[] annotations = new Annotation[alignment.getWidth()];\r
294 \r
295         // this routine prevents vconsensus becoming a new object each time\r
296         // consenus is calculated. Important for speed of Blosum62\r
297         // and PID colouring of alignment\r
298         if (vconsensus == null)\r
299         {\r
300           vconsensus = alignment.getAAFrequency();\r
301         }\r
302         else\r
303         {\r
304           Vector temp = alignment.getAAFrequency();\r
305           vconsensus.clear();\r
306 \r
307           Enumeration e = temp.elements();\r
308 \r
309           while (e.hasMoreElements())\r
310           {\r
311             vconsensus.add(e.nextElement());\r
312           }\r
313         }\r
314 \r
315         Hashtable hash = null;\r
316 \r
317         for (int i = 0; i < alignment.getWidth(); i++)\r
318         {\r
319           hash = (Hashtable) vconsensus.elementAt(i);\r
320 \r
321           float value = 0;\r
322           if (ignoreGapsInConsensusCalculation)\r
323             value = ( (Float) hash.get("pid_nogaps")).floatValue();\r
324           else\r
325             value = ( (Float) hash.get("pid_gaps")).floatValue();\r
326 \r
327           String maxRes = hash.get("maxResidue").toString();\r
328           String mouseOver = hash.get("maxResidue") + " ";\r
329 \r
330           if (maxRes.length() > 1)\r
331           {\r
332             mouseOver = "[" + maxRes + "] ";\r
333             maxRes = "+";\r
334           }\r
335 \r
336           mouseOver += ( (int) value + "%");\r
337           annotations[i] = new Annotation(maxRes, mouseOver, ' ', value);\r
338         }\r
339 \r
340         if (consensus == null)\r
341         {\r
342           consensus = new AlignmentAnnotation("Consensus", "PID",\r
343                                               annotations, 0f, 100f, 1);\r
344 \r
345           if (showIdentity)\r
346           {\r
347             alignment.addAnnotation(consensus);\r
348           }\r
349         }\r
350         else\r
351         {\r
352           consensus.annotations = annotations;\r
353         }\r
354 \r
355         if (globalColourScheme != null)\r
356           globalColourScheme.setConsensus(vconsensus);\r
357 \r
358       }catch(OutOfMemoryError error)\r
359       {\r
360         System.out.println("Out of memory calculating consensus.");\r
361       }\r
362 \r
363     }\r
364 \r
365     /**\r
366      * DOCUMENT ME!\r
367      *\r
368      * @return DOCUMENT ME!\r
369      */\r
370     public SequenceGroup getSelectionGroup()\r
371     {\r
372         return selectionGroup;\r
373     }\r
374 \r
375     /**\r
376      * DOCUMENT ME!\r
377      *\r
378      * @param sg DOCUMENT ME!\r
379      */\r
380     public void setSelectionGroup(SequenceGroup sg)\r
381     {\r
382         selectionGroup = sg;\r
383     }\r
384 \r
385     /**\r
386      * DOCUMENT ME!\r
387      *\r
388      * @return DOCUMENT ME!\r
389      */\r
390     public boolean getConservationSelected()\r
391     {\r
392         return conservationColourSelected;\r
393     }\r
394 \r
395     /**\r
396      * DOCUMENT ME!\r
397      *\r
398      * @param b DOCUMENT ME!\r
399      */\r
400     public void setConservationSelected(boolean b)\r
401     {\r
402         conservationColourSelected = b;\r
403     }\r
404 \r
405     /**\r
406      * DOCUMENT ME!\r
407      *\r
408      * @return DOCUMENT ME!\r
409      */\r
410     public boolean getAbovePIDThreshold()\r
411     {\r
412         return abovePIDThreshold;\r
413     }\r
414 \r
415     /**\r
416      * DOCUMENT ME!\r
417      *\r
418      * @param b DOCUMENT ME!\r
419      */\r
420     public void setAbovePIDThreshold(boolean b)\r
421     {\r
422         abovePIDThreshold = b;\r
423     }\r
424 \r
425     /**\r
426      * DOCUMENT ME!\r
427      *\r
428      * @return DOCUMENT ME!\r
429      */\r
430     public int getStartRes()\r
431     {\r
432         return startRes;\r
433     }\r
434 \r
435     /**\r
436      * DOCUMENT ME!\r
437      *\r
438      * @return DOCUMENT ME!\r
439      */\r
440     public int getEndRes()\r
441     {\r
442         return endRes;\r
443     }\r
444 \r
445     /**\r
446      * DOCUMENT ME!\r
447      *\r
448      * @return DOCUMENT ME!\r
449      */\r
450     public int getStartSeq()\r
451     {\r
452         return startSeq;\r
453     }\r
454 \r
455     /**\r
456      * DOCUMENT ME!\r
457      *\r
458      * @param cs DOCUMENT ME!\r
459      */\r
460     public void setGlobalColourScheme(ColourSchemeI cs)\r
461     {\r
462         globalColourScheme = cs;\r
463     }\r
464 \r
465     /**\r
466      * DOCUMENT ME!\r
467      *\r
468      * @return DOCUMENT ME!\r
469      */\r
470     public ColourSchemeI getGlobalColourScheme()\r
471     {\r
472         return globalColourScheme;\r
473     }\r
474 \r
475     /**\r
476      * DOCUMENT ME!\r
477      *\r
478      * @param res DOCUMENT ME!\r
479      */\r
480     public void setStartRes(int res)\r
481     {\r
482         this.startRes = res;\r
483     }\r
484 \r
485     /**\r
486      * DOCUMENT ME!\r
487      *\r
488      * @param seq DOCUMENT ME!\r
489      */\r
490     public void setStartSeq(int seq)\r
491     {\r
492         this.startSeq = seq;\r
493     }\r
494 \r
495     /**\r
496      * DOCUMENT ME!\r
497      *\r
498      * @param res DOCUMENT ME!\r
499      */\r
500     public void setEndRes(int res)\r
501     {\r
502         if (res > (alignment.getWidth() - 1))\r
503         {\r
504             // log.System.out.println(" Corrected res from " + res + " to maximum " + (alignment.getWidth()-1));\r
505             res = alignment.getWidth() - 1;\r
506         }\r
507 \r
508         if (res < 0)\r
509         {\r
510             res = 0;\r
511         }\r
512 \r
513         this.endRes = res;\r
514     }\r
515 \r
516     /**\r
517      * DOCUMENT ME!\r
518      *\r
519      * @param seq DOCUMENT ME!\r
520      */\r
521     public void setEndSeq(int seq)\r
522     {\r
523         if (seq > alignment.getHeight())\r
524         {\r
525             seq = alignment.getHeight();\r
526         }\r
527 \r
528         if (seq < 0)\r
529         {\r
530             seq = 0;\r
531         }\r
532 \r
533         this.endSeq = seq;\r
534     }\r
535 \r
536     /**\r
537      * DOCUMENT ME!\r
538      *\r
539      * @return DOCUMENT ME!\r
540      */\r
541     public int getEndSeq()\r
542     {\r
543         return endSeq;\r
544     }\r
545 \r
546     /**\r
547      * DOCUMENT ME!\r
548      *\r
549      * @param f DOCUMENT ME!\r
550      */\r
551     public void setFont(Font f)\r
552     {\r
553         font = f;\r
554 \r
555         Container c = new Container();\r
556 \r
557         java.awt.FontMetrics fm = c.getFontMetrics(font);\r
558         setCharHeight(fm.getHeight());\r
559         setCharWidth(fm.charWidth('M'));\r
560     }\r
561 \r
562     /**\r
563      * DOCUMENT ME!\r
564      *\r
565      * @return DOCUMENT ME!\r
566      */\r
567     public Font getFont()\r
568     {\r
569         return font;\r
570     }\r
571 \r
572     /**\r
573      * DOCUMENT ME!\r
574      *\r
575      * @param w DOCUMENT ME!\r
576      */\r
577     public void setCharWidth(int w)\r
578     {\r
579         this.charWidth = w;\r
580     }\r
581 \r
582     /**\r
583      * DOCUMENT ME!\r
584      *\r
585      * @return DOCUMENT ME!\r
586      */\r
587     public int getCharWidth()\r
588     {\r
589         return charWidth;\r
590     }\r
591 \r
592     /**\r
593      * DOCUMENT ME!\r
594      *\r
595      * @param h DOCUMENT ME!\r
596      */\r
597     public void setCharHeight(int h)\r
598     {\r
599         this.charHeight = h;\r
600     }\r
601 \r
602     /**\r
603      * DOCUMENT ME!\r
604      *\r
605      * @return DOCUMENT ME!\r
606      */\r
607     public int getCharHeight()\r
608     {\r
609         return charHeight;\r
610     }\r
611 \r
612     /**\r
613      * DOCUMENT ME!\r
614      *\r
615      * @param w DOCUMENT ME!\r
616      */\r
617     public void setChunkWidth(int w)\r
618     {\r
619         this.chunkWidth = w;\r
620     }\r
621 \r
622     /**\r
623      * DOCUMENT ME!\r
624      *\r
625      * @return DOCUMENT ME!\r
626      */\r
627     public int getChunkWidth()\r
628     {\r
629         return chunkWidth;\r
630     }\r
631 \r
632     /**\r
633      * DOCUMENT ME!\r
634      *\r
635      * @param h DOCUMENT ME!\r
636      */\r
637     public void setChunkHeight(int h)\r
638     {\r
639         this.chunkHeight = h;\r
640     }\r
641 \r
642     /**\r
643      * DOCUMENT ME!\r
644      *\r
645      * @return DOCUMENT ME!\r
646      */\r
647     public int getChunkHeight()\r
648     {\r
649         return chunkHeight;\r
650     }\r
651 \r
652     /**\r
653      * DOCUMENT ME!\r
654      *\r
655      * @return DOCUMENT ME!\r
656      */\r
657     public AlignmentI getAlignment()\r
658     {\r
659         return alignment;\r
660     }\r
661 \r
662     /**\r
663      * DOCUMENT ME!\r
664      *\r
665      * @param align DOCUMENT ME!\r
666      */\r
667     public void setAlignment(AlignmentI align)\r
668     {\r
669         this.alignment = align;\r
670     }\r
671 \r
672     /**\r
673      * DOCUMENT ME!\r
674      *\r
675      * @param state DOCUMENT ME!\r
676      */\r
677     public void setWrapAlignment(boolean state)\r
678     {\r
679         wrapAlignment = state;\r
680     }\r
681 \r
682     /**\r
683      * DOCUMENT ME!\r
684      *\r
685      * @param state DOCUMENT ME!\r
686      */\r
687     public void setShowText(boolean state)\r
688     {\r
689         showText = state;\r
690     }\r
691 \r
692     /**\r
693      * DOCUMENT ME!\r
694      *\r
695      * @param state DOCUMENT ME!\r
696      */\r
697     public void setRenderGaps(boolean state)\r
698     {\r
699         renderGaps = state;\r
700     }\r
701 \r
702     /**\r
703      * DOCUMENT ME!\r
704      *\r
705      * @return DOCUMENT ME!\r
706      */\r
707     public boolean getColourText()\r
708     {\r
709         return showColourText;\r
710     }\r
711 \r
712     /**\r
713      * DOCUMENT ME!\r
714      *\r
715      * @param state DOCUMENT ME!\r
716      */\r
717     public void setColourText(boolean state)\r
718     {\r
719         showColourText = state;\r
720     }\r
721 \r
722     /**\r
723      * DOCUMENT ME!\r
724      *\r
725      * @param state DOCUMENT ME!\r
726      */\r
727     public void setShowBoxes(boolean state)\r
728     {\r
729         showBoxes = state;\r
730     }\r
731 \r
732     /**\r
733      * DOCUMENT ME!\r
734      *\r
735      * @return DOCUMENT ME!\r
736      */\r
737     public boolean getWrapAlignment()\r
738     {\r
739         return wrapAlignment;\r
740     }\r
741 \r
742     /**\r
743      * DOCUMENT ME!\r
744      *\r
745      * @return DOCUMENT ME!\r
746      */\r
747     public boolean getShowText()\r
748     {\r
749         return showText;\r
750     }\r
751 \r
752     /**\r
753      * DOCUMENT ME!\r
754      *\r
755      * @return DOCUMENT ME!\r
756      */\r
757     public boolean getShowBoxes()\r
758     {\r
759         return showBoxes;\r
760     }\r
761 \r
762     /**\r
763      * DOCUMENT ME!\r
764      *\r
765      * @return DOCUMENT ME!\r
766      */\r
767     public char getGapCharacter()\r
768     {\r
769         return getAlignment().getGapCharacter();\r
770     }\r
771 \r
772     /**\r
773      * DOCUMENT ME!\r
774      *\r
775      * @param gap DOCUMENT ME!\r
776      */\r
777     public void setGapCharacter(char gap)\r
778     {\r
779         if (getAlignment() != null)\r
780         {\r
781             getAlignment().setGapCharacter(gap);\r
782         }\r
783     }\r
784 \r
785     /**\r
786      * DOCUMENT ME!\r
787      *\r
788      * @param thresh DOCUMENT ME!\r
789      */\r
790     public void setThreshold(int thresh)\r
791     {\r
792         threshold = thresh;\r
793     }\r
794 \r
795     /**\r
796      * DOCUMENT ME!\r
797      *\r
798      * @return DOCUMENT ME!\r
799      */\r
800     public int getThreshold()\r
801     {\r
802         return threshold;\r
803     }\r
804 \r
805     /**\r
806      * DOCUMENT ME!\r
807      *\r
808      * @param inc DOCUMENT ME!\r
809      */\r
810     public void setIncrement(int inc)\r
811     {\r
812         increment = inc;\r
813     }\r
814 \r
815     /**\r
816      * DOCUMENT ME!\r
817      *\r
818      * @return DOCUMENT ME!\r
819      */\r
820     public int getIncrement()\r
821     {\r
822         return increment;\r
823     }\r
824 \r
825     /**\r
826      * DOCUMENT ME!\r
827      *\r
828      * @param y DOCUMENT ME!\r
829      *\r
830      * @return DOCUMENT ME!\r
831      */\r
832     public int getIndex(int y)\r
833     {\r
834         int y1 = 0;\r
835         int starty = getStartSeq();\r
836         int endy = getEndSeq();\r
837 \r
838         for (int i = starty; i <= endy; i++)\r
839         {\r
840             if ((i < alignment.getHeight()) &&\r
841                     (alignment.getSequenceAt(i) != null))\r
842             {\r
843                 int y2 = y1 + getCharHeight();\r
844 \r
845                 if ((y >= y1) && (y <= y2))\r
846                 {\r
847                     return i;\r
848                 }\r
849 \r
850                 y1 = y2;\r
851             }\r
852             else\r
853             {\r
854                 return -1;\r
855             }\r
856         }\r
857 \r
858         return -1;\r
859     }\r
860 \r
861     /**\r
862      * DOCUMENT ME!\r
863      *\r
864      * @return DOCUMENT ME!\r
865      */\r
866     public ColumnSelection getColumnSelection()\r
867     {\r
868         return colSel;\r
869     }\r
870 \r
871 \r
872     /**\r
873      * DOCUMENT ME!\r
874      *\r
875      * @param tree DOCUMENT ME!\r
876      */\r
877     public void setCurrentTree(NJTree tree)\r
878     {\r
879         currentTree = tree;\r
880     }\r
881 \r
882     /**\r
883      * DOCUMENT ME!\r
884      *\r
885      * @return DOCUMENT ME!\r
886      */\r
887     public NJTree getCurrentTree()\r
888     {\r
889         return currentTree;\r
890     }\r
891 \r
892     /**\r
893      * DOCUMENT ME!\r
894      *\r
895      * @param b DOCUMENT ME!\r
896      */\r
897     public void setColourAppliesToAllGroups(boolean b)\r
898     {\r
899         colourAppliesToAllGroups = b;\r
900     }\r
901 \r
902     /**\r
903      * DOCUMENT ME!\r
904      *\r
905      * @return DOCUMENT ME!\r
906      */\r
907     public boolean getColourAppliesToAllGroups()\r
908     {\r
909         return colourAppliesToAllGroups;\r
910     }\r
911 \r
912     /**\r
913      * DOCUMENT ME!\r
914      *\r
915      * @return DOCUMENT ME!\r
916      */\r
917     public boolean getShowFullId()\r
918     {\r
919         return showFullId;\r
920     }\r
921 \r
922     /**\r
923      * DOCUMENT ME!\r
924      *\r
925      * @param b DOCUMENT ME!\r
926      */\r
927     public void setShowFullId(boolean b)\r
928     {\r
929         showFullId = b;\r
930     }\r
931 \r
932     /**\r
933      * DOCUMENT ME!\r
934      *\r
935      * @return DOCUMENT ME!\r
936      */\r
937     public boolean getShowAnnotation()\r
938     {\r
939         return showAnnotation;\r
940     }\r
941 \r
942     /**\r
943      * DOCUMENT ME!\r
944      *\r
945      * @param b DOCUMENT ME!\r
946      */\r
947     public void setShowAnnotation(boolean b)\r
948     {\r
949         showAnnotation = b;\r
950     }\r
951 \r
952     /**\r
953      * DOCUMENT ME!\r
954      *\r
955      * @return DOCUMENT ME!\r
956      */\r
957     public boolean getScaleAboveWrapped()\r
958     {\r
959         return scaleAboveWrapped;\r
960     }\r
961 \r
962     /**\r
963      * DOCUMENT ME!\r
964      *\r
965      * @return DOCUMENT ME!\r
966      */\r
967     public boolean getScaleLeftWrapped()\r
968     {\r
969         return scaleLeftWrapped;\r
970     }\r
971 \r
972     /**\r
973      * DOCUMENT ME!\r
974      *\r
975      * @return DOCUMENT ME!\r
976      */\r
977     public boolean getScaleRightWrapped()\r
978     {\r
979         return scaleRightWrapped;\r
980     }\r
981 \r
982     /**\r
983      * DOCUMENT ME!\r
984      *\r
985      * @param b DOCUMENT ME!\r
986      */\r
987     public void setScaleAboveWrapped(boolean b)\r
988     {\r
989         scaleAboveWrapped = b;\r
990     }\r
991 \r
992     /**\r
993      * DOCUMENT ME!\r
994      *\r
995      * @param b DOCUMENT ME!\r
996      */\r
997     public void setScaleLeftWrapped(boolean b)\r
998     {\r
999         scaleLeftWrapped = b;\r
1000     }\r
1001 \r
1002     /**\r
1003      * DOCUMENT ME!\r
1004      *\r
1005      * @param b DOCUMENT ME!\r
1006      */\r
1007     public void setScaleRightWrapped(boolean b)\r
1008     {\r
1009         scaleRightWrapped = b;\r
1010     }\r
1011 \r
1012     /**\r
1013      * Property change listener for changes in alignment\r
1014      *\r
1015      * @param listener DOCUMENT ME!\r
1016      */\r
1017     public void addPropertyChangeListener(\r
1018         java.beans.PropertyChangeListener listener)\r
1019     {\r
1020         changeSupport.addPropertyChangeListener(listener);\r
1021     }\r
1022 \r
1023     /**\r
1024      * DOCUMENT ME!\r
1025      *\r
1026      * @param listener DOCUMENT ME!\r
1027      */\r
1028     public void removePropertyChangeListener(\r
1029         java.beans.PropertyChangeListener listener)\r
1030     {\r
1031         changeSupport.removePropertyChangeListener(listener);\r
1032     }\r
1033 \r
1034     /**\r
1035      * Property change listener for changes in alignment\r
1036      *\r
1037      * @param prop DOCUMENT ME!\r
1038      * @param oldvalue DOCUMENT ME!\r
1039      * @param newvalue DOCUMENT ME!\r
1040      */\r
1041     public void firePropertyChange(String prop, Object oldvalue, Object newvalue)\r
1042     {\r
1043         changeSupport.firePropertyChange(prop, oldvalue, newvalue);\r
1044     }\r
1045 \r
1046     public void setIgnoreGapsConsensus(boolean b)\r
1047     {\r
1048       ignoreGapsInConsensusCalculation = b;\r
1049       updateConsensus();\r
1050       if(globalColourScheme!=null)\r
1051       {\r
1052         globalColourScheme.setThreshold(globalColourScheme.getThreshold(), ignoreGapsInConsensusCalculation);\r
1053       }\r
1054 \r
1055     }\r
1056 \r
1057     public boolean getIgnoreGapsConsensus()\r
1058     {\r
1059      return ignoreGapsInConsensusCalculation;\r
1060     }\r
1061 }\r