JAL-2335 filterNonStandardResidues configurable for jabaws clients
[jalview.git] / src / jalview / ws / jws2 / AbstractJabaCalcWorker.java
index a7cc5b6..3c5ce63 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * 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.ws.jws2;
 
 import jalview.analysis.AlignSeq;
@@ -10,6 +30,7 @@ import jalview.datamodel.AnnotatedCollectionI;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
 import jalview.gui.IProgressIndicator;
+import jalview.schemes.ResidueProperties;
 import jalview.workers.AlignCalcWorker;
 import jalview.ws.jws2.dm.AAConSettings;
 import jalview.ws.jws2.dm.JabaWsParamSet;
@@ -43,6 +64,11 @@ public abstract class AbstractJabaCalcWorker extends AlignCalcWorker
   protected boolean submitGaps = true;
 
   /**
+   * by default, we filter out non-standard residues before submission
+   */
+  protected boolean filterNonStandardResidues = true;
+
+  /**
    * Recover any existing parameters for this service
    */
   protected void initViewportParams()
@@ -93,7 +119,7 @@ public abstract class AbstractJabaCalcWorker extends AlignCalcWorker
 
   public List<Option> getJabaArguments()
   {
-    List<Option> newargs = new ArrayList<Option>();
+    List<Option> newargs = new ArrayList<>();
     if (preset != null && preset instanceof JabaWsParamSet)
     {
       newargs.addAll(((JabaWsParamSet) preset).getjabaArguments());
@@ -311,23 +337,23 @@ public abstract class AbstractJabaCalcWorker extends AlignCalcWorker
       System.err.println("submission error with " + getServiceActionText()
               + " :");
       x.printStackTrace();
-      calcMan.workerCannotRun(this);
+      calcMan.disableWorker(this);
     } catch (ResultNotAvailableException x)
     {
       System.err.println("collection error:\nJob ID: " + rslt);
       x.printStackTrace();
-      calcMan.workerCannotRun(this);
+      calcMan.disableWorker(this);
 
     } catch (OutOfMemoryError error)
     {
-      calcMan.workerCannotRun(this);
+      calcMan.disableWorker(this);
 
       // consensus = null;
       // hconsensus = null;
       ap.raiseOOMWarning(getServiceActionText(), error);
     } catch (Exception x)
     {
-      calcMan.workerCannotRun(this);
+      calcMan.disableWorker(this);
 
       // consensus = null;
       // hconsensus = null;
@@ -364,11 +390,13 @@ public abstract class AbstractJabaCalcWorker extends AlignCalcWorker
 
   /**
    * validate input for dynamic/non-dynamic update context
+   * 
    * @param dynamic
    * @param seqs
    * @return true if input is valid
    */
-  abstract boolean checkValidInputSeqs(boolean dynamic, List<FastaSequence> seqs);
+  abstract boolean checkValidInputSeqs(boolean dynamic,
+          List<FastaSequence> seqs);
 
   abstract String submitToService(
           List<compbio.data.sequence.FastaSequence> seqs)
@@ -390,11 +418,11 @@ public abstract class AbstractJabaCalcWorker extends AlignCalcWorker
       String id = rslt;
       if (cancelJob(rslt))
       {
-        System.err.println("Cancelled job "+id);
+        System.err.println("Cancelled job " + id);
       }
-      else 
+      else
       {
-        System.err.println("Job "+id+" couldn't be cancelled.");
+        System.err.println("Job " + id + " couldn't be cancelled.");
       }
     } catch (Exception q)
     {
@@ -428,19 +456,19 @@ public abstract class AbstractJabaCalcWorker extends AlignCalcWorker
       inputSeqs = alignment;
     }
 
-    List<compbio.data.sequence.FastaSequence> seqs = new ArrayList<compbio.data.sequence.FastaSequence>();
+    List<compbio.data.sequence.FastaSequence> seqs = new ArrayList<>();
 
     int minlen = 10;
     int ln = -1;
     if (bySequence)
     {
-      seqNames = new HashMap<String, SequenceI>();
+      seqNames = new HashMap<>();
     }
     gapMap = new boolean[0];
     start = inputSeqs.getStartRes();
     end = inputSeqs.getEndRes();
 
-    for (SequenceI sq : ((List<SequenceI>) inputSeqs.getSequences()))
+    for (SequenceI sq : (inputSeqs.getSequences()))
     {
       if (bySequence ? sq.findPosition(end + 1)
               - sq.findPosition(start + 1) > minlen - 1 : sq.getEnd()
@@ -469,7 +497,12 @@ public abstract class AbstractJabaCalcWorker extends AlignCalcWorker
           }
           for (int apos : sq.gapMap())
           {
-            gapMap[apos] = true; // aligned.
+            if (!filterNonStandardResidues
+                    || ResidueProperties.aaIndex[sq.getCharAt(apos)] < 20)
+            {
+              gapMap[apos] = true; // aligned and real amino acid residue
+            }
+            ;
           }
         }
         else