JAL-1379 a JPred v3.0.1 client via JABA 2.1
[jalview.git] / src / jalview / ws / jws2 / JPred301Client.java
diff --git a/src/jalview/ws/jws2/JPred301Client.java b/src/jalview/ws/jws2/JPred301Client.java
new file mode 100644 (file)
index 0000000..71cbb7e
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
+ * Copyright (C) 2014 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.api.AlignCalcWorkerI;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.gui.AlignFrame;
+import jalview.ws.jws2.jabaws2.Jws2Instance;
+import jalview.ws.params.ArgumentI;
+import jalview.ws.params.OptionI;
+import jalview.ws.params.WsParamSetI;
+import jalview.ws.uimodel.AlignAnalysisUIText;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import compbio.data.sequence.FastaSequence;
+import compbio.data.sequence.JpredAlignment;
+import compbio.metadata.Argument;
+
+public class JPred301Client extends JabawsMsaInterfaceAlignCalcWorker
+        implements AlignCalcWorkerI
+{
+
+  /**
+   * 
+   * @return default args for this service when run as dynamic web service
+   */
+  public List<Argument> selectDefaultArgs()
+  {
+    List<ArgumentI> rgs = new ArrayList<ArgumentI>();
+    for (ArgumentI argi: service.getParamStore().getServiceParameters())
+    {
+      if (argi instanceof OptionI)
+      {
+        List<String> o = ((OptionI) argi).getPossibleValues();
+        if (o.contains("-pred-nohits"))
+        {
+          OptionI cpy = ((OptionI)argi).copy();
+          cpy.setValue("-pred-nohits");
+          rgs.add(cpy);
+        }
+      }
+    }
+    return JabaParamStore.getJabafromJwsArgs(rgs);
+  }
+
+  public JPred301Client(Jws2Instance service, AlignFrame alignFrame,
+          WsParamSetI preset, List<Argument> paramset)
+  {
+    super(service, alignFrame, preset, paramset);
+    submitGaps = true;
+    alignedSeqs = true;
+    nucleotidesAllowed = false;
+    proteinAllowed = true;
+    gapMap = new boolean[0];
+    updateParameters(null, selectDefaultArgs());
+  }
+
+  @Override
+  boolean checkValidInputSeqs(boolean dynamic, List<FastaSequence> seqs)
+  {
+    return (seqs.size() > 1);
+  }
+
+  public String getServiceActionText()
+  {
+    return "calculating consensus secondary structure prediction using JPred service";
+  }
+  private static HashMap<String, String[]> jpredRowLabels = new HashMap<String,String[]>();
+  private static HashSet<String>jpredRes_graph,jpredRes_ssonly;
+  {
+    jpredRes_ssonly=new HashSet();
+    jpredRes_ssonly.add("jnetpred".toLowerCase());
+    jpredRes_graph=new HashSet();
+    jpredRes_graph.add("jnetconf".toLowerCase());
+    
+  }
+  /**
+   * update the consensus annotation from the sequence profile data using
+   * current visualization settings.
+   */
+  public void updateResultAnnotation(boolean immediate)
+  {
+    if (immediate || !calcMan.isWorking(this) && msascoreset != null)
+    {
+      if (msascoreset instanceof compbio.data.sequence.JpredAlignment)
+      {
+        JpredAlignment jpres = (JpredAlignment) msascoreset;
+        int alWidth = alignViewport.getAlignment().getWidth();
+        ArrayList<AlignmentAnnotation> ourAnnot = new ArrayList<AlignmentAnnotation>();
+        for (FastaSequence fsq:jpres.getJpredSequences())
+        {
+          String[] k = jpredRowLabels.get(fsq.getId());
+          if (k==null)
+          {
+            k = new String[] { fsq.getId(), "JNet Output"};
+          }
+          createAnnotationRowFromString(ourAnnot, getCalcId(), alWidth,
+                  k[0],k[1],
+                  jpredRes_graph.contains(fsq.getId()) ?  AlignmentAnnotation.BAR_GRAPH : AlignmentAnnotation.NO_GRAPH, 0f, 0f,
+                  fsq.getSequence());
+
+        }
+        for (FastaSequence fsq: jpres.getSequences())
+        {
+          if (fsq.getId().equalsIgnoreCase("QUERY"))
+          {
+            createAnnotationRowFromString(ourAnnot, getCalcId(), alWidth,
+                    "Query", "JPred Reference Sequence",
+                    AlignmentAnnotation.NO_GRAPH, 0f, 0f,
+                    fsq.getSequence());
+          }
+        }
+        if (ourAnnot.size() > 0)
+        {
+          updateOurAnnots(ourAnnot);
+        }
+      }
+    }
+  }
+
+  private void createAnnotationRowFromString(
+          ArrayList<AlignmentAnnotation> ourAnnot, String calcId,
+          int alWidth, String label, String descr, int rowType, float min,
+          float max, String jpredPrediction)
+  {
+    // simple annotation row
+    AlignmentAnnotation annotation = alignViewport.getAlignment()
+            .findOrCreateAnnotation(label, calcId, true, null, null);
+    if (alWidth == gapMap.length) // scr.getScores().size())
+    {
+      annotation.label = new String(label);
+      annotation.description = new String(descr);
+      annotation.graph = rowType;
+      annotation.graphMin = min;
+      annotation.graphMax = max;
+      if (constructAnnotationFromString(annotation, jpredPrediction,
+              alWidth, rowType))
+      {
+        // created a valid annotation from the data
+        ourAnnot.add(annotation);
+      }
+    }
+  }
+
+  private boolean constructAnnotationFromString(
+          AlignmentAnnotation annotation, String sourceData, int alWidth,
+          int rowType)
+  {
+    if (sourceData.length()==0 && alWidth>0)
+    {
+      return false;
+    }
+    Annotation[] elm = new Annotation[alWidth];
+
+    for (int i = 0, iSize = sourceData.length(); i < iSize; i++)
+    {
+      char annot = sourceData.charAt(i);
+      // if we're at a gapped column then skip to next ungapped position
+      if (gapMap != null && gapMap.length > 0)
+      {
+        while (!gapMap[i])
+        {
+          elm[i++] = new Annotation("", "", ' ', Float.NaN);
+        }
+      }
+      switch (rowType)
+      {
+      case AlignmentAnnotation.NO_GRAPH:
+        elm[i] = new Annotation("" + annot, "" + annot, annot, Float.NaN);
+        break;
+      default:
+        try
+        {
+          elm[i] = new Annotation("" + annot, "" + annot, annot,
+                  Integer.valueOf(annot));
+        } catch (Exception x)
+        {
+          System.err.println("Expected numeric value in character '"
+                  + annot + "'");
+        }
+      }
+    }
+
+    annotation.annotations = elm;
+    annotation.belowAlignment = true;
+    annotation.validateRangeAndDisplay();
+    return true;
+  }
+
+  @Override
+  public String getCalcId()
+  {
+    return CALC_ID;
+  }
+
+  private static String CALC_ID = "jabaws21.JPred3Cons";
+
+  public static AlignAnalysisUIText getAlignAnalysisUITest()
+  {
+    return new AlignAnalysisUIText(
+            compbio.ws.client.Services.JpredWS.toString(),
+            jalview.ws.jws2.JPred301Client.class, CALC_ID, false, true,
+            true, "JPred Consensus",
+            "When checked, JPred consensus is updated automatically.",
+            "Change JPred Settings...",
+            "Modify settings for JPred calculations.");
+  }
+}