/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ 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 .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.workers;
import jalview.analysis.AAFrequency;
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import java.util.ConcurrentModificationException;
import java.util.Hashtable;
/**
* A thread to recompute the consensus of the cDNA complement for a linked
* protein alignment.
*
* @author gmcarstairs
*
*/
public class ComplementConsensusThread extends ConsensusThread
{
public ComplementConsensusThread(AlignViewportI alignViewport,
AlignmentViewPanel alignPanel)
{
super(alignViewport, alignPanel);
}
@Override
protected AlignmentAnnotation getConsensusAnnotation()
{
return alignViewport.getComplementConsensusAnnotation();
}
@Override
protected Hashtable[] getViewportConsensus()
{
return alignViewport.getComplementConsensusHash();
}
/**
* Calculate the cDNA consensus and store it on the Viewport
*/
@Override
protected void computeConsensus(AlignmentI alignment)
{
@SuppressWarnings("unchecked")
Hashtable[] hconsensus = new Hashtable[alignment
.getWidth()];
// SequenceI[] aseqs = getSequences();
/*
* Allow 3 tries at this, since this thread can start up while we are still
* modifying protein-codon mappings on the alignment
*/
for (int i = 0; i < 3; i++)
{
try
{
AAFrequency.calculateCdna(alignment, hconsensus);
break;
} catch (ConcurrentModificationException e)
{
// try again
}
}
alignViewport.setComplementConsensusHash(hconsensus);
}
/**
* Convert the computed consensus data into the desired annotation for
* display.
*
* @param consensusAnnotation
* the annotation to be populated
* @param consensusData
* the computed consensus data
*/
protected void deriveConsensus(AlignmentAnnotation consensusAnnotation,
Hashtable[] consensusData)
{
AAFrequency.completeCdnaConsensus(consensusAnnotation, consensusData,
alignViewport.isShowSequenceLogo(), getSequences().length);
}
@Override
public void updateResultAnnotation(boolean immediate)
{
AlignmentAnnotation consensus = getConsensusAnnotation();
Hashtable[] hconsensus = getViewportConsensus();
if (immediate || !calcMan.isWorking(this) && consensus != null
&& hconsensus != null)
{
deriveConsensus(consensus, hconsensus);
}
}
}