JAL-2335 failing test for FeatureRendererModel.findFeaturesAt and contact features
[jalview.git] / src / jalview / workers / StrucConsensusThread.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ 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
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.workers;
22
23 import jalview.analysis.StructureFrequency;
24 import jalview.api.AlignViewportI;
25 import jalview.api.AlignmentViewPanel;
26 import jalview.datamodel.AlignmentAnnotation;
27 import jalview.datamodel.AlignmentI;
28 import jalview.datamodel.Annotation;
29 import jalview.datamodel.SequenceI;
30
31 import java.util.Hashtable;
32
33 public class StrucConsensusThread extends AlignCalcWorker
34 {
35   public StrucConsensusThread(AlignViewportI alignViewport,
36           AlignmentViewPanel alignPanel)
37   {
38     super(alignViewport, alignPanel);
39   }
40
41   AlignmentAnnotation strucConsensus;
42
43   Hashtable[] hStrucConsensus;
44
45   private long nseq = -1;
46
47   @Override
48   public void run()
49   {
50     try
51     {
52       if (calcMan.isPending(this))
53       {
54         return;
55       }
56       calcMan.notifyStart(this);
57       while (!calcMan.notifyWorking(this))
58       {
59         try
60         {
61           if (ap != null)
62           {
63             // ap.paintAlignment(false);
64           }
65
66           Thread.sleep(200);
67         } catch (Exception ex)
68         {
69           ex.printStackTrace();
70         }
71       }
72       if (alignViewport.isClosed())
73       {
74         abortAndDestroy();
75         return;
76       }
77       AlignmentI alignment = alignViewport.getAlignment();
78
79       int aWidth = -1;
80
81       if (alignment == null || (aWidth = alignment.getWidth()) < 0)
82       {
83         calcMan.workerComplete(this);
84         return;
85       }
86       strucConsensus = alignViewport.getAlignmentStrucConsensusAnnotation();
87       hStrucConsensus = alignViewport.getRnaStructureConsensusHash();
88       strucConsensus.annotations = null;
89       strucConsensus.annotations = new Annotation[aWidth];
90
91       hStrucConsensus = new Hashtable[aWidth];
92
93       AlignmentAnnotation[] aa = alignViewport.getAlignment()
94               .getAlignmentAnnotation();
95       AlignmentAnnotation rnaStruc = null;
96       // select rna struct to use for calculation
97       if (aa != null)
98       {
99         for (int i = 0; i < aa.length; i++)
100         {
101           if (aa[i].visible && aa[i].isRNA() && aa[i].isValidStruc())
102           {
103             rnaStruc = aa[i];
104             break;
105           }
106         }
107       }
108       // check to see if its valid
109
110       if (rnaStruc == null || !rnaStruc.isValidStruc())
111       {
112         calcMan.workerComplete(this);
113         return;
114       }
115
116       try
117       {
118         final SequenceI[] arr = alignment.getSequencesArray();
119         nseq = arr.length;
120         jalview.analysis.StructureFrequency.calculate(arr, 0,
121                 alignment.getWidth(), hStrucConsensus, true, rnaStruc);
122       } catch (ArrayIndexOutOfBoundsException x)
123       {
124         calcMan.workerComplete(this);
125         return;
126       }
127       alignViewport.setRnaStructureConsensusHash(hStrucConsensus);
128       // TODO AlignmentAnnotation rnaStruc!!!
129       updateResultAnnotation(true);
130     } catch (OutOfMemoryError error)
131     {
132       calcMan.disableWorker(this);
133
134       // consensus = null;
135       // hconsensus = null;
136       ap.raiseOOMWarning("calculating RNA structure consensus", error);
137     } finally
138     {
139       calcMan.workerComplete(this);
140       if (ap != null)
141       {
142         ap.paintAlignment(true);
143       }
144     }
145
146   }
147
148   /**
149    * update the consensus annotation from the sequence profile data using
150    * current visualization settings.
151    */
152   @Override
153   public void updateAnnotation()
154   {
155     updateResultAnnotation(false);
156   }
157
158   public void updateResultAnnotation(boolean immediate)
159   {
160     if (immediate || !calcMan.isWorking(this) && strucConsensus != null
161             && hStrucConsensus != null)
162     {
163       StructureFrequency.completeConsensus(strucConsensus, hStrucConsensus,
164               0, hStrucConsensus.length,
165               alignViewport.isIgnoreGapsConsensus(),
166               alignViewport.isShowSequenceLogo(), nseq);
167     }
168   }
169
170 }