+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
+ * Copyright (C) 2014 The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
package jalview.workers;
import jalview.analysis.AAFrequency;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceI;
import jalview.schemes.ColourSchemeI;
import java.util.Hashtable;
-public class ConsensusThread extends AlignCalcWorker implements AlignCalcWorkerI
+public class ConsensusThread extends AlignCalcWorker implements
+ AlignCalcWorkerI
{
+ private long nseq = -1;
+
public ConsensusThread(AlignViewportI alignViewport,
AlignmentViewPanel alignPanel)
{
super(alignViewport, alignPanel);
}
+ @Override
public void run()
{
+ if (calcMan.isPending(this))
+ {
+ return;
+ }
+ calcMan.notifyStart(this);
+ long started = System.currentTimeMillis();
try
{
- AlignmentAnnotation consensus = alignViewport.getAlignmentConsensusAnnotation();
- if (consensus==null) { return;
+ AlignmentAnnotation consensus = alignViewport
+ .getAlignmentConsensusAnnotation();
+ if (consensus == null || calcMan.isPending(this))
+ {
+ calcMan.workerComplete(this);
+ return;
}
- calcMan.notifyStart(this);
- while (!calcMan.notifyWorking(this))
+ while (!calcMan.notifyWorking(this))
{
+ // System.err.println("Thread (Consensus"+Thread.currentThread().getName()+") Waiting around.");
try
{
if (ap != null)
{
ap.paintAlignment(false);
}
-
Thread.sleep(200);
} catch (Exception ex)
{
ex.printStackTrace();
}
}
- calcMan.notifyWorking(this);
if (alignViewport.isClosed())
{
abortAndDestroy();
return;
}
- consensus = alignViewport
- .getAlignmentConsensusAnnotation();
+ consensus = alignViewport.getAlignmentConsensusAnnotation();
consensus.annotations = null;
consensus.annotations = new Annotation[aWidth];
Hashtable[] hconsensus = alignViewport.getSequenceConsensusHash();
hconsensus = new Hashtable[aWidth];
- AAFrequency.calculate(alignment.getSequencesArray(), 0,
- alignment.getWidth(), hconsensus, true);
+ try
+ {
+ SequenceI aseqs[] = alignment.getSequencesArray();
+ nseq = aseqs.length;
+ AAFrequency.calculate(aseqs, 0, alignment.getWidth(), hconsensus,
+ true);
+ } catch (ArrayIndexOutOfBoundsException x)
+ {
+ // this happens due to a race condition -
+ // alignment was edited at same time as calculation was running
+ //
+ // calcMan.workerCannotRun(this);
+ calcMan.workerComplete(this);
+ return;
+ }
alignViewport.setSequenceConsensusHash(hconsensus);
updateResultAnnotation(true);
ColourSchemeI globalColourScheme = alignViewport
* update the consensus annotation from the sequence profile data using
* current visualization settings.
*/
+ @Override
public void updateAnnotation()
{
updateResultAnnotation(false);
AlignmentAnnotation consensus = alignViewport
.getAlignmentConsensusAnnotation();
Hashtable[] hconsensus = alignViewport.getSequenceConsensusHash();
- if (immediate || !calcMan.isWorking(this) && consensus!=null && hconsensus!=null)
+ if (immediate || !calcMan.isWorking(this) && consensus != null
+ && hconsensus != null)
{
AAFrequency.completeConsensus(consensus, hconsensus, 0,
- hconsensus.length, alignViewport.getIgnoreGapsConsensus(),
- alignViewport.isShowSequenceLogo());
+ hconsensus.length, alignViewport.getIgnoreGapsConsensus(),
+ alignViewport.isShowSequenceLogo(), nseq);
}
}
}