Merge remote-tracking branch 'origin/releases/Release_2_10_4_Branch' into develop
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 16 Mar 2018 15:03:11 +0000 (15:03 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Fri, 16 Mar 2018 15:03:11 +0000 (15:03 +0000)
Conflicts:
src/jalview/ext/ensembl/EnsemblLookup.java

1  2 
src/jalview/ext/ensembl/EnsemblLookup.java
src/jalview/gui/FeatureSettings.java
test/jalview/io/CrossRef2xmlTests.java

@@@ -46,14 -41,7 +46,9 @@@ import org.json.simple.parser.ParseExce
   */
  public class EnsemblLookup extends EnsemblRestClient
  {
 +  private static final String SPECIES = "species";
 +
    /**
-    * keep track of last identifier retrieved to break loops
-    */
-   private String lastId;
-   /**
     * Default constructor (to use rest.ensembl.org)
     */
    public EnsemblLookup()
      return geneId;
    }
  
 +  /**
 +   * Calls the Ensembl lookup REST endpoint and retrieves the 'species' for the
 +   * given identifier, or null if not found
 +   * 
 +   * @param identifier
 +   * @return
 +   */
 +  public String getSpecies(String identifier)
 +  {
 +    String species = null;
 +    JSONObject json = getResult(identifier, null);
 +    if (json != null)
 +    {
 +      Object o = json.get(SPECIES);
 +      if (o != null)
 +      {
 +        species = o.toString();
 +      }
 +    }
 +    return species;
 +  }
 +
 +  /**
 +   * Calls the /lookup/id rest service and returns the response as a JSONObject,
 +   * or null if any error
 +   * 
 +   * @param identifier
 +   * @param objectType
 +   *          (optional)
 +   * @return
 +   */
 +  protected JSONObject getResult(String identifier, String objectType)
 +  {
 +    List<String> ids = Arrays.asList(new String[] { identifier });
 +
 +    BufferedReader br = null;
 +    try
 +    {
 +      URL url = getUrl(identifier, objectType);
 +
-       if (identifier.equals(lastId))
-       {
-         System.err.println("** Ensembl lookup " + url.toString()
-                 + " looping on Parent!");
-         return null;
-       }
-       lastId = identifier;
 +      if (url != null)
 +      {
 +        br = getHttpResponse(url, ids);
 +      }
 +      return br == null ? null : (JSONObject) (new JSONParser().parse(br));
 +    } catch (IOException | ParseException e)
 +    {
 +      System.err.println("Error parsing " + identifier + " lookup response "
 +              + e.getMessage());
 +      return null;
 +    } finally
 +    {
 +      if (br != null)
 +      {
 +        try
 +        {
 +          br.close();
 +        } catch (IOException e)
 +        {
 +          // ignore
 +        }
 +      }
 +    }
 +  }
 +
 +  /**
-    * Parses the JSON response and returns the gene identifier, or null if not
-    * found. If the returned object_type is Gene, returns the id, if Transcript
-    * returns the Parent. If it is Translation (peptide identifier), then the
-    * Parent is the transcript identifier, so we redo the search with this value,
-    * specifying that object_type should be Transcript.
-    * 
-    * @param jsonObject
-    * @return
-    */
-   protected String parseGeneId(JSONObject json)
-   {
-     if (json == null)
-     {
-       // e.g. lookup failed with 404 not found
-       return null;
-     }
-     String geneId = null;
-     String type = json.get(OBJECT_TYPE).toString();
-     if (OBJECT_TYPE_GENE.equalsIgnoreCase(type))
-     {
-       // got the gene - just returns its id
-       geneId = json.get(JSON_ID).toString();
-     }
-     else if (OBJECT_TYPE_TRANSCRIPT.equalsIgnoreCase(type))
-     {
-       // got the transcript - return its (Gene) Parent
-       geneId = json.get(PARENT).toString();
-     }
-     else if (OBJECT_TYPE_TRANSLATION.equalsIgnoreCase(type))
-     {
-       // got the protein - look up its Parent, restricted to type Transcript
-       String transcriptId = json.get(PARENT).toString();
-       geneId = parseGeneId(getResult(transcriptId, OBJECT_TYPE_TRANSCRIPT));
-     }
-     return geneId;
-   }
-   /**
 +   * Calls the /lookup/id rest service for the given id, and if successful,
 +   * parses and returns the gene's chromosomal coordinates
 +   * 
 +   * @param geneId
 +   * @return
 +   */
 +  public GeneLociI getGeneLoci(String geneId)
 +  {
 +    return parseGeneLoci(getResult(geneId, OBJECT_TYPE_GENE));
 +  }
 +
 +  /**
 +   * Parses the /lookup/id response for species, asssembly_name,
 +   * seq_region_name, start, end and returns an object that wraps them, or null
 +   * if unsuccessful
 +   * 
 +   * @param json
 +   * @return
 +   */
 +  GeneLociI parseGeneLoci(JSONObject json)
 +  {
 +    if (json == null)
 +    {
 +      return null;
 +    }
 +
 +    try
 +    {
 +      final String species = json.get("species").toString();
 +      final String assembly = json.get("assembly_name").toString();
 +      final String chromosome = json.get("seq_region_name").toString();
 +      String strand = json.get("strand").toString();
 +      int start = Integer.parseInt(json.get("start").toString());
 +      int end = Integer.parseInt(json.get("end").toString());
 +      int fromEnd = end - start + 1;
 +      boolean reverseStrand = "-1".equals(strand);
 +      int toStart = reverseStrand ? end : start;
 +      int toEnd = reverseStrand ? start : end;
 +      List<int[]> fromRange = Collections.singletonList(new int[] { 1,
 +          fromEnd });
 +      List<int[]> toRange = Collections.singletonList(new int[] { toStart,
 +          toEnd });
 +      final MapList map = new MapList(fromRange, toRange, 1, 1);
 +      return new GeneLociI()
 +      {
 +
 +        @Override
 +        public String getSpeciesId()
 +        {
 +          return species == null ? "" : species;
 +        }
 +
 +        @Override
 +        public String getAssemblyId()
 +        {
 +          return assembly;
 +        }
 +
 +        @Override
 +        public String getChromosomeId()
 +        {
 +          return chromosome;
 +        }
 +
 +        @Override
 +        public MapList getMap()
 +        {
 +          return map;
 +        }
 +      };
 +    } catch (NullPointerException | NumberFormatException e)
 +    {
 +      Cache.log.error("Error looking up gene loci: " + e.getMessage());
 +      e.printStackTrace();
 +    }
 +    return null;
 +  }
 +
  }
@@@ -1031,9 -964,10 +1031,10 @@@ public class FeatureSettings extends JP
      Object[][] data = ((FeatureTableModel) table.getModel()).getData();
      for (int i = 0; i < data.length; i++)
      {
--      data[i][2] = !(Boolean) data[i][2];
++      data[i][SHOW_COLUMN] = !(Boolean) data[i][SHOW_COLUMN];
      }
-     af.alignPanel.paintAlignment(true, true);
+     updateFeatureRenderer(data, true);
+     table.repaint();
    }
  
    public void orderByAvWidth()
@@@ -93,12 -104,12 +107,12 @@@ public class CrossRef2xmlTests extends 
      // . codonframes
      //
      //
 -    HashMap<String, String> dbtoviewBit = new HashMap<>();
 +    Map<String, String> dbtoviewBit = new HashMap<>();
      List<String> keyseq = new ArrayList<>();
 -    HashMap<String, File> savedProjects = new HashMap<>();
 +    Map<String, File> savedProjects = new HashMap<>();
  
-     for (String[] did : new String[][] { { "UNIPROT", "P00338" } })
-     {
+ //    for (String[] did : new String[][] { { "UNIPROT", "P00338" } })
+ //    {
        // pass counters - 0 - first pass, 1 means retrieve project rather than
        // perform action
        int pass1 = 0, pass2 = 0, pass3 = 0;