d6d3f3af680225652cb55531d7ea075186326d6d
[jalview.git] / src / jalview / ext / ensembl / EnsemblCdna.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.ext.ensembl;
22
23 import jalview.datamodel.SequenceFeature;
24 import jalview.datamodel.SequenceI;
25 import jalview.io.gff.SequenceOntologyI;
26
27 import java.util.ArrayList;
28 import java.util.List;
29
30 import com.stevesoft.pat.Regex;
31
32 /**
33  * A client to fetch CDNA sequence from Ensembl (i.e. that part of the genomic
34  * sequence that is transcribed to RNA, but not necessarily translated to
35  * protein)
36  * 
37  * @author gmcarstairs
38  *
39  */
40 public class EnsemblCdna extends EnsemblSeqProxy
41 {
42   /*
43    * accepts ENST or ENSTG with 11 digits
44    * or ENSMUST or similar for other species
45    * or CCDSnnnnn.nn with at least 3 digits
46    */
47   private static final Regex ACCESSION_REGEX = new Regex(
48           "(ENS([A-Z]{3}|)[TG][0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
49
50   /*
51    * fetch exon features on genomic sequence (to identify the cdna regions)
52    * and cds and variation features (to retain)
53    */
54   private static final EnsemblFeatureType[] FEATURES_TO_FETCH = {
55       EnsemblFeatureType.exon, EnsemblFeatureType.cds,
56       EnsemblFeatureType.variation };
57
58   /**
59    * Default constructor (to use rest.ensembl.org)
60    */
61   public EnsemblCdna()
62   {
63     super();
64   }
65
66   @Override
67   public String getDbName()
68   {
69     return "ENSEMBL (CDNA)";
70   }
71
72   @Override
73   protected EnsemblSeqType getSourceEnsemblType()
74   {
75     return EnsemblSeqType.CDNA;
76   }
77
78   @Override
79   public Regex getAccessionValidator()
80   {
81     return ACCESSION_REGEX;
82   }
83
84   @Override
85   protected EnsemblFeatureType[] getFeaturesToFetch()
86   {
87     return FEATURES_TO_FETCH;
88   }
89
90   /**
91    * Answers true unless the feature type is 'transcript' (or a sub-type in the
92    * Sequence Ontology).
93    */
94   @Override
95   protected boolean retainFeature(SequenceFeature sf, String accessionId)
96   {
97     if (isTranscript(sf.getType()))
98     {
99       return false;
100     }
101     return featureMayBelong(sf, accessionId);
102   }
103
104   /**
105    * Answers a list of sequence features (if any) whose type is 'exon' (or a
106    * subtype of exon in the Sequence Ontology), and whose Parent is the
107    * transcript we are retrieving
108    */
109   @Override
110   protected List<SequenceFeature> getIdentifyingFeatures(SequenceI seq,
111           String accId)
112   {
113     List<SequenceFeature> result = new ArrayList<>();
114     List<SequenceFeature> sfs = seq.getFeatures()
115             .getFeaturesByOntology(SequenceOntologyI.EXON);
116     for (SequenceFeature sf : sfs)
117     {
118       String parentFeature = (String) sf.getValue(PARENT);
119       if (accId.equals(parentFeature))
120       {
121         result.add(sf);
122       }
123     }
124
125     return result;
126   }
127
128   /**
129    * Parameter object_type=Transcaript added to ensure cdna and not peptide is
130    * returned (JAL-2529)
131    */
132   @Override
133   protected String getObjectType()
134   {
135     return OBJECT_TYPE_TRANSCRIPT;
136   }
137
138 }