JAL-1807 includes ?j2sdebug flag and DebugJS._(msg)
[jalviewjs.git] / src / jalview / workers / StrucConsensusThread.java
index 6f81676..4a0f41d 100644 (file)
@@ -31,16 +31,27 @@ import jalview.datamodel.SequenceI;
 
 import java.util.Hashtable;
 
+/**
+ * 
+ * untested
+ * 
+ * @author Bob Hanson 
+ *
+ */
 public class StrucConsensusThread extends AlignCalcWorker implements
         AlignCalcWorkerI
 {
 
+       private AlignmentAnnotation rnaStruc = null;
   private AlignmentAnnotation strucConsensus;
 
   private Hashtable[] hStrucConsensus;
 
   private long nseq = -1;
 
+       private AlignmentAnnotation[] aa;
+       private SequenceI[] arr;
+
 
   @Override
        public AlignCalcWorkerI getNewWorker() {
@@ -53,108 +64,106 @@ public class StrucConsensusThread extends AlignCalcWorker implements
     super(alignViewport, alignPanel);
   }
 
-  @Override
-  public void run()
-  {
-    try
-    {
-      if (calcMan.isPending(this))
-      {
-        return;
-      }
-      calcMan.notifyStart(this);
-      while (!calcMan.notifyWorking(this))
-      {
-        try
-        {
-          if (ap != null)
-          {
-            // ap.paintAlignment(false);
-          }
-
-          Thread.sleep(200);
-        } catch (Exception ex)
-        {
-          ex.printStackTrace();
-        }
-      }
-      if (alignViewport.isClosed())
-      {
-        abortAndDestroy();
-        return;
-      }
-      AlignmentI alignment = alignViewport.getAlignment();
-
-      int aWidth = -1;
-
-      if (alignment == null || (aWidth = alignment.getWidth()) < 0)
-      {
-        calcMan.workerComplete(this);
-        return;
-      }
-      strucConsensus = alignViewport.getAlignmentStrucConsensusAnnotation();
-      hStrucConsensus = alignViewport.getRnaStructureConsensusHash();
-      strucConsensus.annotations = null;
-      strucConsensus.annotations = new Annotation[aWidth];
-
-      hStrucConsensus = new Hashtable[aWidth];
-
-      AlignmentAnnotation[] aa = alignViewport.getAlignment()
-              .getAlignmentAnnotation();
-      AlignmentAnnotation rnaStruc = null;
-      // select rna struct to use for calculation
-      for (int i = 0; i < aa.length; i++)
-      {
-        if (aa[i].getRNAStruc() != null && aa[i].isValidStruc())
-        {
-          rnaStruc = aa[i];
-          break;
-        }
-      }
-      // check to see if its valid
-
-      if (rnaStruc == null || !rnaStruc.isValidStruc())
-      {
-        calcMan.workerComplete(this);
-        return;
-      }
-
-      try
-      {
-        final SequenceI[] arr = alignment.getSequencesArray();
-        nseq = arr.length;
-        StructureFrequency.calculate(arr, 0,
+       @Override
+       protected void run1(int state) {
+               if (alignViewport.isClosed()) {
+                       abortAndDestroy();
+                       return;
+               }
+               while (!interrupted()) {
+                       try {
+                               switch (state) {
+                               case INIT:
+                                       if (calcMan.isPending(this))
+                                               return;
+                                       calcMan.notifyStart(this);
+                                       state = LOOP_STANDBY;
+                                       break;
+                               case LOOP_STANDBY:
+                                       while (!calcMan.notifyWorking(this)) {
+                                               if (ap != null) {
+                                                       ap.paintAlignment(false);
+                                               }
+                                               try {
+                                                       if (sleepAndReturn(200, state))
+                                                               return;
+                                               } catch (InterruptedException e) {
+                                                       state = DONE;
+                                                       break;
+                                               }
+                                       }
+                                       if (alignViewport.isClosed()) {
+                                               abortAndDestroy();
+                                               state = DONE;
+                                               break;
+                                       }
+                                       alignment = alignViewport.getAlignment();
+                                       aWidth = -1;
+                                       if (alignment == null || (aWidth = alignment.getWidth()) < 0) {
+                                               state = DONE;
+                                       }
+                                       strucConsensus = alignViewport.getAlignmentStrucConsensusAnnotation();
+                                       hStrucConsensus = alignViewport.getRnaStructureConsensusHash();
+                                       strucConsensus.annotations = null;
+                                       strucConsensus.annotations = new Annotation[aWidth];
+
+                                       hStrucConsensus = new Hashtable[aWidth];
+
+                                       aa = alignViewport.getAlignment().getAlignmentAnnotation();
+                     // select rna struct to use for calculation
+                     for (int i = 0; i < aa.length; i++)
+                     {
+                       if (aa[i].getRNAStruc() != null && aa[i].isValidStruc())
+                       {
+                         rnaStruc = aa[i];
+                         break;
+                       }
+                     }
+                     // check to see if its valid
+
+                     if (rnaStruc == null || !rnaStruc.isValidStruc())
+                     {
+                       calcMan.workerComplete(this);
+                       return;
+                     }
+               arr = alignment.getSequencesArray();
+               nseq = arr.length;
+
+                                       state = LOOP_CALCULATE;
+                                       break;
+                               case LOOP_CALCULATE:
+                                       iFirst = iLast;
+                                       iLast = Math.min(iLast + nPer, aWidth);
+                                       if (iLast == iFirst) {
+                                               state = DONE;
+                                       } else {
+                       StructureFrequency.calculate(arr, 0,
                 alignment.getWidth(), hStrucConsensus, true, rnaStruc);
-      } catch (ArrayIndexOutOfBoundsException x)
-      {
-        calcMan.workerComplete(this);
-        return;
-      }
-      alignViewport.setRnaStructureConsensusHash(hStrucConsensus);
-      // TODO AlignmentAnnotation rnaStruc!!!
-      updateResultAnnotation(true);
-      if (alignViewport.getGlobalColourScheme() != null)
-      {
-        alignViewport.getGlobalColourScheme().setConsensus(hStrucConsensus);
-      }
-
-    } catch (OutOfMemoryError error)
-    {
-      calcMan.workerCannotRun(this);
-
-      // consensus = null;
-      // hconsensus = null;
-      ap.raiseOOMWarning("calculating RNA structure consensus", error);
-    } finally
-    {
-      calcMan.workerComplete(this);
-      if (ap != null)
-      {
-        ap.paintAlignment(true);
-      }
-    }
-
-  }
+                                               if (sleepAndReturn(0, state))
+                                                       return;
+                                       }
+                                       break;
+                               case DONE:
+                     alignViewport.setRnaStructureConsensusHash(hStrucConsensus);
+                     // TODO AlignmentAnnotation rnaStruc!!!
+                     updateResultAnnotation(true);
+                     if (alignViewport.getGlobalColourScheme() != null)
+                     {
+                       alignViewport.getGlobalColourScheme().setConsensus(hStrucConsensus);
+                     }
+                                       notifyDone();
+                                       return;
+                               }
+                       } catch (OutOfMemoryError error) {
+                               calcMan.workerCannotRun(this);
+             ap.raiseOOMWarning("calculating RNA structure consensus", error);
+                       } catch (Throwable e) {
+                               System.out.println("Error in ConsensusThread: " + e);
+                               e.printStackTrace();
+                               calcMan.workerComplete(this);
+                       }
+               }
+       }
 
   /**
    * update the consensus annotation from the sequence profile data using
@@ -178,10 +187,4 @@ public class StrucConsensusThread extends AlignCalcWorker implements
     }
   }
 
-       @Override
-       protected void run1(int state) {
-               // TODO Auto-generated method stub
-               
-       }
-
 }