Clover icon

Coverage Report

  1. Project Clover database Mon Nov 18 2024 09:38:20 GMT
  2. Package jalview.workers

File SecondaryStructureConsensusThread.java

 

Coverage histogram

../../img/srcFileCovDistChart8.png
13% of files have more coverage

Code metrics

34
87
15
1
325
218
40
0.46
5.8
15
2.67

Classes

Class Line # Actions
SecondaryStructureConsensusThread 41 87 40
0.779411877.9%
 

Contributing tests

This file is covered by 88 tests. .

Source view

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 java.util.Collections;
24    import java.util.HashMap;
25    import java.util.List;
26    import java.util.Map;
27   
28    import jalview.analysis.AAFrequency;
29    import jalview.analysis.AlignmentUtils;
30    import jalview.api.AlignViewportI;
31    import jalview.api.AlignmentViewPanel;
32    import jalview.datamodel.AlignmentAnnotation;
33    import jalview.datamodel.AlignmentI;
34    import jalview.datamodel.Annotation;
35    import jalview.datamodel.ProfilesI;
36    import jalview.datamodel.SequenceI;
37    import jalview.renderer.ResidueShaderI;
38    import jalview.util.Constants;
39    import jalview.util.MessageManager;
40   
 
41    public class SecondaryStructureConsensusThread extends AlignCalcWorker
42    {
 
43  211 toggle public SecondaryStructureConsensusThread(AlignViewportI alignViewport,
44    AlignmentViewPanel alignPanel)
45    {
46  211 super(alignViewport, alignPanel);
47    }
48   
 
49  379 toggle @Override
50    public void run()
51    {
52  379 if (calcMan.isPending(this))
53    {
54  0 return;
55    }
56  379 calcMan.notifyStart(this);
57    // long started = System.currentTimeMillis();
58  379 try
59    {
60  379 List<AlignmentAnnotation> ssConsensus = getSSConsensusAnnotation();
61  379 AlignmentAnnotation gap = getGapAnnotation();
62  379 if ((ssConsensus == null && gap == null) || calcMan.isPending(this))
63    {
64  3 calcMan.workerComplete(this);
65  3 return;
66    }
67  376 while (!calcMan.notifyWorking(this))
68    {
69  0 try
70    {
71  0 if (ap != null)
72    {
73  0 ap.paintAlignment(false, false);
74    }
75  0 Thread.sleep(200);
76    } catch (Exception ex)
77    {
78  0 ex.printStackTrace();
79    }
80    }
81  376 if (alignViewport.isClosed())
82    {
83  0 abortAndDestroy();
84  0 return;
85    }
86  376 AlignmentI alignment = alignViewport.getAlignment();
87   
88  376 int aWidth = -1;
89   
90  ? if (alignment == null || (aWidth = alignment.getWidth()) < 0)
91    {
92  0 calcMan.workerComplete(this);
93  0 return;
94    }
95   
96  376 setSecondaryStructureSources();
97  376 eraseSSConsensus(aWidth);
98  376 computeSSConsensus(alignment);
99  376 updateResultAnnotation(true);
100   
101  376 if (ap != null)
102    {
103  376 ap.paintAlignment(true, true);
104    }
105    } catch (OutOfMemoryError error)
106    {
107  0 calcMan.disableWorker(this);
108  0 ap.raiseOOMWarning("calculating consensus", error);
109    } finally
110    {
111    /*
112    * e.g. ArrayIndexOutOfBoundsException can happen due to a race condition
113    * - alignment was edited at same time as calculation was running
114    */
115  379 calcMan.workerComplete(this);
116    }
117    }
118   
119    /**
120    * Clear out any existing consensus annotations
121    *
122    * @param aWidth
123    * the width (number of columns) of the annotated alignment
124    */
 
125  376 toggle protected void eraseSSConsensus(int aWidth)
126    {
127  376 List<AlignmentAnnotation> ssConsensuses = getSSConsensusAnnotation();
128  376 for (AlignmentAnnotation ssConsensus : ssConsensuses)
129    {
130  336 if (ssConsensus != null)
131    {
132  336 ssConsensus.annotations = new Annotation[aWidth];
133    }
134    }
135  376 AlignmentAnnotation gap = getGapAnnotation();
136  376 if (gap != null)
137    {
138  374 gap.annotations = new Annotation[aWidth];
139    }
140    }
141   
142    /**
143    * @param alignment
144    */
 
145  376 toggle protected void computeSSConsensus(AlignmentI alignment)
146    {
147   
148  376 SequenceI[] aseqs = getSequences();
149  376 int width = alignment.getWidth();
150  376 Map<String, ProfilesI> hSSConsensusProfileMap = new HashMap<String, ProfilesI>();
151  376 List<String> ssSources = getSecondaryStructureSources();
152  376 for (String ssSource : ssSources)
153    {
154  390 ProfilesI hSSConsensus = AAFrequency.calculateSS(aseqs, width, 0,
155    width, true, ssSource);
156  390 hSSConsensusProfileMap.put(ssSource, hSSConsensus);
157    }
158   
159  376 alignViewport.setSequenceSSConsensusHash(hSSConsensusProfileMap);
160  376 setColourSchemeConsensus(hSSConsensusProfileMap);
161    }
162   
163    /**
164    * @return
165    */
 
166  1046 toggle protected SequenceI[] getSequences()
167    {
168  1046 return alignViewport.getAlignment().getSequencesArray();
169    }
170   
171    /**
172    * @param hconsensus
173    */
 
174  376 toggle protected void setColourSchemeConsensus(
175    Map<String, ProfilesI> ssConsensusProfileMap)
176    {
177  376 ResidueShaderI cs = alignViewport.getResidueShading();
178  376 if (cs != null)
179    {
180  376 cs.setSSConsensusProfileMap(ssConsensusProfileMap);
181    }
182    }
183   
184    /**
185    * Get the Consensus annotation for the alignment
186    *
187    * @return
188    */
 
189  1131 toggle protected List<AlignmentAnnotation> getSSConsensusAnnotation()
190    {
191  1131 return alignViewport
192    .getAlignmentSecondaryStructureConsensusAnnotation();
193    }
194   
195    /**
196    * Get the Consensus annotation for the alignment
197    *
198    * @return
199    */
 
200  376 toggle protected void setSecondaryStructureSources()
201    {
202  376 List<String> sources = null;
203  376 AlignmentAnnotation[] aa = alignViewport.getAlignment()
204    .getAlignmentAnnotation();
205  376 if (aa != null)
206    {
207  376 sources = AlignmentUtils.extractSSSourceInAlignmentAnnotation(aa);
208  376 if (sources != null)
209    {
210  376 sources.add(0, Constants.SS_ALL_PROVIDERS);
211  376 alignViewport.setSecondaryStructureSources(sources);
212    }
213    }
214    }
215   
 
216  376 toggle protected List<String> getSecondaryStructureSources()
217    {
218  376 return alignViewport.getSecondaryStructureSources();
219    }
220   
221    /**
222    * Get the Gap annotation for the alignment
223    *
224    * @return
225    */
 
226  1091 toggle protected AlignmentAnnotation getGapAnnotation()
227    {
228  1091 return alignViewport.getAlignmentGapAnnotation();
229    }
230   
231    /**
232    * update the consensus annotation from the sequence profile data using
233    * current visualization settings.
234    */
 
235  0 toggle @Override
236    public void updateAnnotation()
237    {
238  0 updateResultAnnotation(false);
239    }
240   
 
241  376 toggle public void updateResultAnnotation(boolean immediate)
242    {
243  376 List<AlignmentAnnotation> ssConsensuses = getSSConsensusAnnotation();
244  376 Map<String, ProfilesI> ssConsensusProfileMap = getViewportSSConsensus();
245  376 for (AlignmentAnnotation ssConsensus : ssConsensuses)
246    {
247  336 ProfilesI ssConsensusProfile = null;
248  336 for (String source : ssConsensusProfileMap.keySet())
249    {
250  350 if (ssConsensus.description.startsWith(source))
251    {
252  336 ssConsensusProfile = ssConsensusProfileMap.get(source);
253  336 break;
254    }
255    }
256  336 if (ssConsensusProfile == null)
257    {
258  0 continue;
259    }
260  336 if (immediate || !calcMan.isWorking(this) && ssConsensus != null
261    && ssConsensusProfile != null)
262    {
263  336 if (ssConsensusProfile.get(0) != null)
264  336 ssConsensus.setNoOfSequencesIncluded(
265    ssConsensusProfile.get(0).getSeqWithSSCount());
266  336 deriveSSConsensus(ssConsensus, ssConsensusProfile);
267  336 ssConsensus.hasData=ssConsensusProfile.getCount()>0;
268   
269  336 AlignmentAnnotation gap = getGapAnnotation();
270  336 if (gap != null)
271    {
272  334 deriveGap(gap, ssConsensusProfile);
273    }
274    }
275    }
276    }
277   
278    /**
279    * Convert the computed consensus data into the desired annotation for
280    * display.
281    *
282    * @param consensusAnnotation
283    * the annotation to be populated
284    * @param hconsensus
285    * the computed consensus data
286    */
 
287  336 toggle protected void deriveSSConsensus(AlignmentAnnotation ssConsensus,
288    ProfilesI hSSConsensus)
289    {
290   
291  336 long nseq = getSequences().length;
292  336 AAFrequency.completeSSConsensus(ssConsensus, hSSConsensus,
293    hSSConsensus.getStartColumn(), hSSConsensus.getEndColumn() + 1,
294    alignViewport.isIgnoreGapsConsensus(),
295    alignViewport.isShowSequenceLogo(), nseq);
296    }
297   
298    /**
299    * Convert the computed consensus data into a gap annotation row for display.
300    *
301    * @param gapAnnotation
302    * the annotation to be populated
303    * @param hconsensus
304    * the computed consensus data
305    */
 
306  334 toggle protected void deriveGap(AlignmentAnnotation gapAnnotation,
307    ProfilesI hconsensus)
308    {
309  334 long nseq = getSequences().length;
310  334 AAFrequency.completeGapAnnot(gapAnnotation, hconsensus,
311    hconsensus.getStartColumn(), hconsensus.getEndColumn() + 1,
312    nseq);
313    }
314   
315    /**
316    * Get the consensus data stored on the viewport.
317    *
318    * @return
319    */
 
320  376 toggle protected Map<String, ProfilesI> getViewportSSConsensus()
321    {
322    // TODO convert ComplementConsensusThread to use Profile
323  376 return alignViewport.getSequenceSSConsensusHash();
324    }
325    }