JAL-1705 include stop codons in derived CDS; support ensemblgenomes
[jalview.git] / src / jalview / ext / ensembl / EnsemblSeqProxy.java
index 869a702..a878784 100644 (file)
@@ -33,6 +33,7 @@ import java.util.Map.Entry;
 /**
  * Base class for Ensembl sequence fetchers
  * 
+ * @see http://rest.ensembl.org/documentation/info/sequence_id
  * @author gmcarstairs
  */
 public abstract class EnsemblSeqProxy extends EnsemblRestClient
@@ -112,10 +113,19 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
   }
 
   /**
-   * Constructor
+   * Default constructor (to use rest.ensembl.org)
    */
   public EnsemblSeqProxy()
   {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   */
+  public EnsemblSeqProxy(String d)
+  {
+    super(d);
   }
 
   /**
@@ -201,7 +211,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
        * get 'dummy' genomic sequence with exon, cds and variation features
        */
       SequenceI genomicSequence = null;
-      EnsemblFeatures gffFetcher = new EnsemblFeatures();
+      EnsemblFeatures gffFetcher = new EnsemblFeatures(getDomain());
       EnsemblFeatureType[] features = getFeaturesToFetch();
       AlignmentI geneFeatures = gffFetcher.getSequenceRecords(accId,
               features);
@@ -251,7 +261,8 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
     String accId = querySeq.getName();
     try
     {
-      AlignmentI protein = new EnsemblProtein().getSequenceRecords(accId);
+      AlignmentI protein = new EnsemblProtein(getDomain())
+              .getSequenceRecords(accId);
       if (protein == null || protein.getHeight() == 0)
       {
         System.out.println("Failed to retrieve protein for " + accId);
@@ -302,7 +313,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
       seq = seq.getDatasetSequence();
     }
 
-    EnsemblXref xrefFetcher = new EnsemblXref();
+    EnsemblXref xrefFetcher = new EnsemblXref(getDomain());
     List<DBRefEntry> xrefs = xrefFetcher.getCrossReferences(seq.getName(),
             getCrossReferenceDatabases());
     for (DBRefEntry xref : xrefs)
@@ -338,9 +349,8 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
    */
   protected MapList mapCdsToProtein(SequenceI dnaSeq, SequenceI proteinSeq)
   {
-    List<int[]> ranges = new ArrayList<int[]>(50);
-
-    int mappedDnaLength = getCdsRanges(dnaSeq, ranges);
+    List<int[]> ranges = getCdsRanges(dnaSeq);
+    int mappedDnaLength = MappingUtils.getLength(ranges);
 
     int proteinLength = proteinSeq.getLength();
     int proteinEnd = proteinLength;
@@ -363,7 +373,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
     int codesForResidues = mappedDnaLength / 3;
     if (codesForResidues == (proteinLength + 1))
     {
-      MappingUtils.unmapStopCodon(ranges, mappedDnaLength);
+      // assuming extra codon is for STOP and not in peptide
       codesForResidues--;
     }
     if (codesForResidues == proteinLength)
@@ -375,26 +385,24 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
   }
 
   /**
-   * Adds CDS ranges to the ranges list, and returns the total length mapped
-   * from.
+   * Returns a list of CDS ranges found.
    * 
    * No need to worry about reverse strand dna, here since the retrieved
    * sequence is as transcribed (reverse complement for reverse strand), i.e in
    * the same sense as the peptide.
    * 
    * @param dnaSeq
-   * @param ranges
    * @return
    */
-  protected int getCdsRanges(SequenceI dnaSeq, List<int[]> ranges)
+  protected List<int[]> getCdsRanges(SequenceI dnaSeq)
   {
+    List<int[]> result = new ArrayList<int[]>();
     SequenceFeature[] sfs = dnaSeq.getSequenceFeatures();
     if (sfs == null)
     {
-      return 0;
+      return result;
     }
     SequenceOntologyI so = SequenceOntologyFactory.getInstance();
-    int mappedDnaLength = 0;
     for (SequenceFeature sf : sfs)
     {
       /*
@@ -415,7 +423,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
          */
         int begin = sf.getBegin();
         int end = sf.getEnd();
-        if (ranges.isEmpty())
+        if (result.isEmpty())
         {
           begin += phase;
           if (begin > end)
@@ -423,11 +431,10 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
             continue; // shouldn't happen?
           }
         }
-        ranges.add(new int[] { begin, end });
-        mappedDnaLength += Math.abs(end - begin) + 1;
+        result.add(new int[] { begin, end });
       }
     }
-    return mappedDnaLength;
+    return result;
   }
 
   /**
@@ -514,7 +521,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
      * multiple ids go in the POST body instead
      */
     StringBuffer urlstring = new StringBuffer(128);
-    urlstring.append(SEQUENCE_ID_URL);
+    urlstring.append(getDomain() + "/sequence/id");
     if (ids.size() == 1)
     {
       urlstring.append("/").append(ids.get(0));