Merge branch 'patch/JAL-3700_JAL-3748_JAL-3763_for_2_11_1_3' into releases/Release_2_...
[jalview.git] / src / jalview / workers / ComplementConsensusThread.java
index 2e4424e..431fbec 100644 (file)
@@ -1,7 +1,25 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.workers;
 
-import java.util.Hashtable;
-
 import jalview.analysis.AAFrequency;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
@@ -9,6 +27,9 @@ 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.
@@ -37,13 +58,31 @@ public class ComplementConsensusThread extends ConsensusThread
     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();
-    AAFrequency.calculateCdna(alignment, hconsensus);
+
+    /*
+     * 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);
   }
@@ -57,7 +96,6 @@ public class ComplementConsensusThread extends ConsensusThread
    * @param consensusData
    *          the computed consensus data
    */
-  @Override
   protected void deriveConsensus(AlignmentAnnotation consensusAnnotation,
           Hashtable[] consensusData)
   {
@@ -65,4 +103,16 @@ public class ComplementConsensusThread extends ConsensusThread
             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);
+    }
+  }
+
 }