JAL-1705 include stop codons in derived CDS; support ensemblgenomes
[jalview.git] / src / jalview / ext / ensembl / EnsemblProtein.java
1 package jalview.ext.ensembl;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.SequenceFeature;
5
6 import java.util.Arrays;
7 import java.util.List;
8
9 import com.stevesoft.pat.Regex;
10
11 /**
12  * A client to fetch protein translated sequence for an Ensembl identifier
13  * 
14  * @author gmcarstairs
15  *
16  */
17 public class EnsemblProtein extends EnsemblSeqProxy
18 {
19   /*
20    * accepts ENSP with 11 digits
21    * or ENSMUSP or similar for other species
22    * or CCDSnnnnn.nn with at least 3 digits
23    */
24   private static final Regex ACCESSION_REGEX = new Regex(
25           "(ENS([A-Z]{3}|)P[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
26
27   private static final List<String> CROSSREFS = Arrays.asList(new String[] {
28       "PDB", "Uniprot/SPTREMBL", "Uniprot/SWISSPROT" });
29
30   /**
31    * Default constructor (to use rest.ensembl.org)
32    */
33   public EnsemblProtein()
34   {
35     super();
36   }
37
38   /**
39    * Constructor given the target domain to fetch data from
40    * 
41    * @param d
42    */
43   public EnsemblProtein(String d)
44   {
45     super(d);
46   }
47
48   @Override
49   public String getDbName()
50   {
51     return "ENSEMBL (Protein)";
52   }
53
54   @Override
55   protected EnsemblSeqType getSourceEnsemblType()
56   {
57     return EnsemblSeqType.PROTEIN;
58   }
59
60   /**
61    * Returns false, as this fetcher does not retrieve DNA sequences.
62    */
63   @Override
64   public boolean isDnaCoding()
65   {
66     return false;
67   }
68
69   /**
70    * Test query is to the protein translation of transcript ENST00000288602
71    */
72   @Override
73   public String getTestQuery()
74   {
75     return "ENSP00000288602";
76   }
77
78   /**
79    * Overrides base class method to do nothing - genomic features are not
80    * applicable to the protein product sequence
81    */
82   @Override
83   protected void addFeaturesAndProduct(String accId, AlignmentI alignment)
84   {
85   }
86
87   @Override
88   protected EnsemblFeatureType[] getFeaturesToFetch()
89   {
90     // not applicable - can't fetch genomic features for a protein sequence
91     return null;
92   }
93
94   @Override
95   protected boolean identifiesSequence(SequenceFeature sf, String accId)
96   {
97     // not applicable - protein sequence is not a 'subset' of genomic sequence
98     return false;
99   }
100
101   @Override
102   protected List<String> getCrossReferenceDatabases()
103   {
104     return CROSSREFS;
105   }
106
107   @Override
108   public Regex getAccessionValidator()
109   {
110     return ACCESSION_REGEX;
111   }
112
113   /**
114    * Returns an accession id for a query, including conversion of ENST* to
115    * ENSP*. This supports querying for the protein sequence for a transcript
116    * (ENST identifier) and returning the ENSP identifier.
117    */
118   @Override
119   public String getAccessionIdFromQuery(String query)
120   {
121     String accId = super.getAccessionIdFromQuery(query);
122
123     /*
124      * ensure last character before (11) digits is P
125      * ENST00000288602 -> ENSP00000288602
126      * ENSMUST00000288602 -> ENSMUSP00000288602
127      */
128     if (accId != null && accId.length() >= 12)
129     {
130       char[] chars = accId.toCharArray();
131       chars[chars.length - 12] = 'P';
132       accId = new String(chars);
133     }
134     return accId;
135   }
136
137 }