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