package jalview.workers; import jalview.analysis.AAFrequency; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; 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) { 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 */ @Override protected void deriveConsensus(AlignmentAnnotation consensusAnnotation, Hashtable[] consensusData) { AAFrequency.completeCdnaConsensus(consensusAnnotation, consensusData, alignViewport.isShowSequenceLogo(), getSequences().length); } }