package jalview.workers; import java.util.ConcurrentModificationException; import java.util.Hashtable; import java.util.Set; import jalview.analysis.AAFrequency; import jalview.api.AlignCalcWorkerI; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.AlignmentAnnotation; /** * A thread to recompute the consensus of the cDNA complement for a linked * protein alignment. * * @author gmcarstairs * */ public class ComplementConsensusThread extends ConsensusThread { private Set mappings; @Override public AlignCalcWorkerI getNewWorker() { return new ComplementConsensusThread(alignViewport, ap); } public ComplementConsensusThread(AlignViewportI alignViewport, AlignmentViewPanel alignPanel) { super(alignViewport, alignPanel); } @Override protected AlignmentAnnotation getConsensusAnnotation() { return alignViewport.getComplementConsensusAnnotation(); } @Override protected Hashtable[] getViewportConsensus() { return alignViewport.getComplementConsensusHash(); } @Override protected boolean initializeCalc() { mappings = alignment.getCodonFrames(); return (mappings != null && !mappings.isEmpty() && super.initializeCalc()); } /** * Calculate the cDNA consensus and store it on the Viewport */ @Override protected void computeConsensus() { /* * 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, mappings, hconsensus, iFirst, iLast); break; } catch (ConcurrentModificationException e) { // try again } } } protected void finalizeCalc() { 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); } }