JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / workers / ConservationThread.java
index 7d5c661..990f724 100644 (file)
@@ -1,59 +1,69 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 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.
- * 
+ * 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/>.
+ * 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.ArrayList;
-import java.util.List;
-
 import jalview.analysis.Conservation;
 import jalview.api.AlignCalcWorkerI;
-import jalview.api.AlignmentViewPanel;
 import jalview.api.AlignViewportI;
+import jalview.api.AlignmentViewPanel;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 
-public class ConservationThread extends AlignCalcWorker implements AlignCalcWorkerI
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConservationThread extends AlignCalcWorker implements
+        AlignCalcWorkerI
 {
 
-  private int ConsPercGaps = 25; // JBPNote : This should be a configurable property!
-  
-  public ConservationThread(AlignViewportI alignViewport, AlignmentViewPanel alignPanel)
+  private int ConsPercGaps = 25; // JBPNote : This should be a configurable
+                                 // property!
+
+  public ConservationThread(AlignViewportI alignViewport,
+          AlignmentViewPanel alignPanel)
   {
     super(alignViewport, alignPanel);
     ConsPercGaps = alignViewport.getConsPercGaps();
   }
-  
+
   private Conservation cons;
-  AlignmentAnnotation conservation,quality;
+
+  AlignmentAnnotation conservation, quality;
+
   int alWidth;
+
+  @Override
   public void run()
   {
     try
     {
       calcMan.notifyStart(this); // updatingConservation = true;
 
-      while (!calcMan.notifyWorking(this)) 
+      while (!calcMan.notifyWorking(this))
       {
         try
         {
           if (ap != null)
           {
-            ap.paintAlignment(false);
+            // ap.paintAlignment(false);
           }
           Thread.sleep(200);
         } catch (Exception ex)
@@ -61,31 +71,41 @@ public class ConservationThread extends AlignCalcWorker implements AlignCalcWork
           ex.printStackTrace();
         }
       }
-      if (alignViewport.isClosed()) {
+      if (alignViewport.isClosed())
+      {
         abortAndDestroy();
+        return;
       }
-      List<AlignmentAnnotation>ourAnnot = new ArrayList<AlignmentAnnotation>();
-      AlignmentI alignment=alignViewport.getAlignment();
-      conservation=alignViewport.getAlignmentConservationAnnotation();
-      quality=alignViewport.getAlignmentQualityAnnot();
+      List<AlignmentAnnotation> ourAnnot = new ArrayList<AlignmentAnnotation>();
+      AlignmentI alignment = alignViewport.getAlignment();
+      conservation = alignViewport.getAlignmentConservationAnnotation();
+      quality = alignViewport.getAlignmentQualityAnnot();
       ourAnnot.add(conservation);
       ourAnnot.add(quality);
       ourAnnots = ourAnnot;
-      
+      ConsPercGaps = alignViewport.getConsPercGaps();
       // AlignViewport.UPDATING_CONSERVATION = true;
-      
-      if (alignment==null || (alWidth=alignment.getWidth())< 0)
+
+      if (alignment == null || (alWidth = alignment.getWidth()) < 0)
       {
         calcMan.workerComplete(this);
-        //.updatingConservation = false;
-        //AlignViewport.UPDATING_CONSERVATION = false;
-        
+        // .updatingConservation = false;
+        // AlignViewport.UPDATING_CONSERVATION = false;
+
+        return;
+      }
+      try
+      {
+        cons = Conservation.calculateConservation("All",
+                jalview.schemes.ResidueProperties.propHash, 3,
+                alignment.getSequences(), 0, alWidth - 1, false,
+                ConsPercGaps, quality != null);
+      } catch (IndexOutOfBoundsException x)
+      {
+        // probable race condition. just finish and return without any fuss.
+        calcMan.workerComplete(this);
         return;
       }
-
-      cons = Conservation.calculateConservation("All",
-              jalview.schemes.ResidueProperties.propHash, 3,
-              alignment.getSequences(), 0, alWidth - 1, false, ConsPercGaps, quality!=null);
       updateResultAnnotation(true);
     } catch (OutOfMemoryError error)
     {
@@ -106,14 +126,18 @@ public class ConservationThread extends AlignCalcWorker implements AlignCalcWork
 
   private void updateResultAnnotation(boolean b)
   {
-    if (b || !calcMan.isWorking(this) && cons!=null && conservation!=null && quality!=null)
-    cons.completeAnnotations(conservation,
-            quality, 0, alWidth);
+    if (b || !calcMan.isWorking(this) && cons != null
+            && conservation != null && quality != null)
+    {
+      alignViewport.setConservation(cons);
+      cons.completeAnnotations(conservation, quality, 0, alWidth);
+    }
   }
+
   @Override
   public void updateAnnotation()
   {
     updateResultAnnotation(false);
-    
+
   }
 }