X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fensembl%2FEnsemblMap.java;h=f2ab1956a49712df9c162b4c3651c18b7d7f2e74;hb=1114062d7c3034db3387f46a860c0e334206ce49;hp=f01bd4f6b56ed7640f9e027503ff886d2918320a;hpb=f59dd9efbb3dfc313ab0b0507832e21cd0076fe1;p=jalview.git diff --git a/src/jalview/ext/ensembl/EnsemblMap.java b/src/jalview/ext/ensembl/EnsemblMap.java index f01bd4f..f2ab195 100644 --- a/src/jalview/ext/ensembl/EnsemblMap.java +++ b/src/jalview/ext/ensembl/EnsemblMap.java @@ -1,11 +1,32 @@ +/* + * 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 . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.ext.ensembl; import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefSource; import jalview.datamodel.GeneLociI; +import jalview.datamodel.GeneLocus; +import jalview.datamodel.Mapping; import jalview.util.MapList; -import java.io.BufferedReader; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; @@ -13,12 +34,22 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.Map; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; +/** + * A client for the Ensembl REST service /map endpoint, to convert from + * coordinates of one genome assembly to another. + *

+ * Note that species and assembly identifiers passed to this class must be valid + * in Ensembl. They are not case sensitive. + * + * @author gmcarstairs + * @see https://rest.ensembl.org/documentation/info/assembly_map + * @see https://rest.ensembl.org/info/assembly/human?content-type=text/xml + * @see https://rest.ensembl.org/info/species?content-type=text/xml + */ public class EnsemblMap extends EnsemblRestClient { private static final String MAPPED = "mapped"; @@ -73,8 +104,8 @@ public class EnsemblMap extends EnsemblRestClient * @return * @throws MalformedURLException */ - protected URL getAssemblyMapUrl(String species, String chromosome, String fromRef, - String toRef, int startPos, int endPos) + protected URL getAssemblyMapUrl(String species, String chromosome, + String fromRef, String toRef, int startPos, int endPos) throws MalformedURLException { /* @@ -119,30 +150,15 @@ public class EnsemblMap extends EnsemblRestClient String fromRef, String toRef, int[] queryRange) { URL url = null; - BufferedReader br = null; - try { - url = getAssemblyMapUrl(species, chromosome, fromRef, toRef, queryRange[0], - queryRange[1]); - br = getHttpResponse(url, null); - return (parseAssemblyMappingResponse(br)); + url = getAssemblyMapUrl(species, chromosome, fromRef, toRef, + queryRange[0], queryRange[1]); + return (parseAssemblyMappingResponse(url)); } catch (Throwable t) { System.out.println("Error calling " + url + ": " + t.getMessage()); return null; - } finally - { - if (br != null) - { - try - { - br.close(); - } catch (IOException e) - { - // ignore - } - } } } @@ -161,22 +177,24 @@ public class EnsemblMap extends EnsemblRestClient * @param br * @return */ - protected int[] parseAssemblyMappingResponse(BufferedReader br) + @SuppressWarnings("unchecked") + protected int[] parseAssemblyMappingResponse(URL url) { int[] result = null; - JSONParser jp = new JSONParser(); try { - JSONObject parsed = (JSONObject) jp.parse(br); - JSONArray mappings = (JSONArray) parsed.get(MAPPINGS); - - Iterator rvals = mappings.iterator(); + Iterator rvals = (Iterator) getJSON(url, null, -1, + MODE_ITERATOR, MAPPINGS); + if (rvals == null) + { + return null; + } while (rvals.hasNext()) { // todo check for "mapped" - JSONObject val = (JSONObject) rvals.next(); - JSONObject mapped = (JSONObject) val.get(MAPPED); + Map val = (Map) rvals.next(); + Map mapped = (Map) val.get(MAPPED); int start = Integer.parseInt(mapped.get("start").toString()); int end = Integer.parseInt(mapped.get("end").toString()); String strand = mapped.get("strand").toString(); @@ -236,37 +254,19 @@ public class EnsemblMap extends EnsemblRestClient int end, String cdsOrCdna) { URL url = null; - BufferedReader br = null; - try { String domain = new EnsemblInfo().getDomain(division); if (domain != null) { url = getIdMapUrl(domain, accession, start, end, cdsOrCdna); - br = getHttpResponse(url, null); - if (br != null) - { - return (parseIdMappingResponse(br, accession, domain)); - } + return (parseIdMappingResponse(url, accession, domain)); } return null; } catch (Throwable t) { System.out.println("Error calling " + url + ": " + t.getMessage()); return null; - } finally - { - if (br != null) - { - try - { - br.close(); - } catch (IOException e) - { - // ignore - } - } } } @@ -286,9 +286,9 @@ public class EnsemblMap extends EnsemblRestClient URL getIdMapUrl(String domain, String accession, int start, int end, String cdsOrCdna) throws MalformedURLException { - String url = String - .format("%s/map/%s/%s/%d..%d?include_original_region=1&content-type=application/json", - domain, cdsOrCdna, accession, start, end); + String url = String.format( + "%s/map/%s/%s/%d..%d?include_original_region=1&content-type=application/json", + domain, cdsOrCdna, accession, start, end); return new URL(url); } @@ -312,17 +312,18 @@ public class EnsemblMap extends EnsemblRestClient * @param domain * @return */ - GeneLociI parseIdMappingResponse(BufferedReader br, String accession, - String domain) + @SuppressWarnings("unchecked") + GeneLociI parseIdMappingResponse(URL url, String accession, String domain) { - JSONParser jp = new JSONParser(); try { - JSONObject parsed = (JSONObject) jp.parse(br); - JSONArray mappings = (JSONArray) parsed.get(MAPPINGS); - - Iterator rvals = mappings.iterator(); + Iterator rvals = (Iterator) getJSON(url, null, -1, + MODE_ITERATOR, MAPPINGS); + if (rvals == null) + { + return null; + } String assembly = null; String chromosome = null; int fromEnd = 0; @@ -330,26 +331,27 @@ public class EnsemblMap extends EnsemblRestClient while (rvals.hasNext()) { - JSONObject val = (JSONObject) rvals.next(); - JSONObject original = (JSONObject) val.get("original"); + Map val = (Map) rvals.next(); + Map original = (Map) val + .get("original"); fromEnd = Integer.parseInt(original.get("end").toString()); - JSONObject mapped = (JSONObject) val.get(MAPPED); + Map mapped = (Map) val.get(MAPPED); int start = Integer.parseInt(mapped.get("start").toString()); int end = Integer.parseInt(mapped.get("end").toString()); String ass = mapped.get("assembly_name").toString(); if (assembly != null && !assembly.equals(ass)) { - System.err - .println("EnsemblMap found multiple assemblies - can't resolve"); + System.err.println( + "EnsemblMap found multiple assemblies - can't resolve"); return null; } assembly = ass; String chr = mapped.get("seq_region_name").toString(); if (chromosome != null && !chromosome.equals(chr)) { - System.err - .println("EnsemblMap found multiple chromosomes - can't resolve"); + System.err.println( + "EnsemblMap found multiple chromosomes - can't resolve"); return null; } chromosome = chr; @@ -372,36 +374,12 @@ public class EnsemblMap extends EnsemblRestClient .getSpecies(accession); final String as = assembly; final String chr = chromosome; - List fromRange = Collections.singletonList(new int[] { 1, - fromEnd }); - final MapList map = new MapList(fromRange, regions, 1, 1); - return new GeneLociI() - { - - @Override - public String getSpeciesId() - { - return species == null ? "" : species; - } - - @Override - public String getAssemblyId() - { - return as; - } - - @Override - public String getChromosomeId() - { - return chr; - } - - @Override - public MapList getMap() - { - return map; - } - }; + List fromRange = Collections + .singletonList(new int[] + { 1, fromEnd }); + Mapping mapping = new Mapping(new MapList(fromRange, regions, 1, 1)); + return new GeneLocus(species == null ? "" : species, as, chr, + mapping); } catch (IOException | ParseException | NumberFormatException e) { // ignore