inprogress
[jalview.git] / forester / java / src / org / forester / util / SequenceAccessionTools.java
1 // $Id:\r
2 // FORESTER -- software libraries and applications\r
3 // for evolutionary biology research and applications.\r
4 //\r
5 // Copyright (C) 2008-2009 Christian M. Zmasek\r
6 // Copyright (C) 2008-2009 Burnham Institute for Medical Research\r
7 // Copyright (C) 2000-2001 Washington University School of Medicine\r
8 // and Howard Hughes Medical Institute\r
9 // Copyright (C) 2003-2007 Ethalinda K.S. Cannon\r
10 // All rights reserved\r
11 //\r
12 // This library is free software; you can redistribute it and/or\r
13 // modify it under the terms of the GNU Lesser General Public\r
14 // License as published by the Free Software Foundation; either\r
15 // version 2.1 of the License, or (at your option) any later version.\r
16 //\r
17 // This library is distributed in the hope that it will be useful,\r
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
20 // Lesser General Public License for more details.\r
21 //\r
22 // You should have received a copy of the GNU Lesser General Public\r
23 // License along with this library; if not, write to the Free Software\r
24 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
25 //\r
26 // Contact: phylosoft @ gmail . com\r
27 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester\r
28 \r
29 package org.forester.util;\r
30 \r
31 import java.util.regex.Matcher;\r
32 import java.util.regex.Pattern;\r
33 \r
34 import org.forester.phylogeny.PhylogenyNode;\r
35 import org.forester.phylogeny.data.Accession;\r
36 import org.forester.phylogeny.data.Accession.Source;\r
37 import org.forester.phylogeny.data.Sequence;\r
38 \r
39 public final class SequenceAccessionTools {\r
40 \r
41     // gb_ADF31344_1_segmented_worms_\r
42     // gb_AAA96518_1\r
43     // gb_EHB07727_1_rodents_\r
44     // dbj_BAF37827_1_turtles_\r
45     // emb_CAA73223_1_primates_\r
46     // lcl_91970_unknown_\r
47     // mites|ref_XP_002434188_1\r
48     // ref_XP_002434188_1_mites___ticks_\r
49     // ref_NP_001121530_1_frogs___toads_\r
50     //The format for GenBank Accession numbers are:\r
51     //Nucleotide: 1 letter + 5 numerals OR 2 letters + 6 numerals\r
52     //Protein:    3 letters + 5 numerals\r
53     //http://www.ncbi.nlm.nih.gov/Sequin/acc.html\r
54     public final static Pattern  GENBANK_NUC_PATTERN_1 = Pattern\r
55                                                                .compile( "(?:\\A|.*[^a-zA-Z0-9])([A-Z]\\d{5}(?:\\.\\d+)?)(?:[^a-zA-Z0-9]|\\Z)" );\r
56     public final static Pattern  GENBANK_NUC_PATTERN_2 = Pattern\r
57                                                                .compile( "(?:\\A|.*[^a-zA-Z0-9])([A-Z]{2}\\d{6}(?:\\.\\d+)?)(?:[^a-zA-Z0-9]|\\Z)" );\r
58     public final static Pattern  GENBANK_PROT_PATTERN  = Pattern\r
59                                                                .compile( "(?:\\A|.*[^a-zA-Z0-9])([A-Z]{3}\\d{5}(?:\\.\\d+)?)(?:[^a-zA-Z0-9]|\\Z)" );\r
60     public final static Pattern  GI_PATTERN            = Pattern.compile( "(?:\\b|_)(?:GI|gi)[|_=:](\\d+)(?:\\b|_)" );\r
61     public final static Pattern  UNIPROT_KB_PATTERN_0  = Pattern\r
62                                                                .compile( "(?:\\b|_)([A-Z][0-9][A-Z0-9]{3}[0-9])(?:\\b|_)" );\r
63     public final static Pattern  UNIPROT_KB_PATTERN_1  = Pattern\r
64                                                                .compile( "(?:\\b|_)(?:sp|tr)[\\.|\\-_=/\\\\]([A-Z][0-9][A-Z0-9]{3}[0-9])(?:\\b|_)" );\r
65     public final static Pattern  UNIPROT_KB_PATTERN_2  = Pattern\r
66                                                                .compile( "(?:\\b|_)(?:[A-Z0-9]{2,5}|(?:[A-Z][0-9][A-Z0-9]{3}[0-9]))_(([A-Z9][A-Z]{2}[A-Z0-9]{2})|RAT|PIG|PEA)(?:\\b|_)" );\r
67     // RefSeq accession numbers can be distinguished from GenBank accessions \r
68     // by their distinct prefix format of 2 characters followed by an\r
69     // underscore character ('_'). For example, a RefSeq protein accession is NP_015325. \r
70     private final static Pattern REFSEQ_PATTERN        = Pattern\r
71                                                                .compile( "(?:\\A|.*[^a-zA-Z0-9])([A-Z]{2}_\\d{6,})(?:[^a-zA-Z0-9]|\\Z)" );\r
72 \r
73     private SequenceAccessionTools() {\r
74         // Hiding the constructor.\r
75     }\r
76 \r
77     public final static boolean isProteinDbQuery( final String query ) {\r
78         final String r1 = parseRefSeqAccessorFromString( query );\r
79         if ( !ForesterUtil.isEmpty( r1 ) && ( r1.charAt( 1 ) == 'P' ) ) {\r
80             return true;\r
81         }\r
82         final String r2 = parseUniProtAccessorFromString( query );\r
83         if ( !ForesterUtil.isEmpty( r2 ) ) {\r
84             return true;\r
85         }\r
86         return GENBANK_PROT_PATTERN.matcher( query ).lookingAt();\r
87     }\r
88 \r
89     public final static Accession obtainAccessorFromDataFields( final PhylogenyNode n ) {\r
90         String a = obtainUniProtAccessorFromDataFields( n );\r
91         if ( !ForesterUtil.isEmpty( a ) ) {\r
92             return new Accession( a, Source.UNIPROT );\r
93         }\r
94         a = obtainGenbankAccessorFromDataFields( n );\r
95         if ( !ForesterUtil.isEmpty( a ) ) {\r
96             return new Accession( a, Source.NCBI );\r
97         }\r
98         a = obtainRefSeqAccessorFromDataFields( n );\r
99         if ( !ForesterUtil.isEmpty( a ) ) {\r
100             return new Accession( a, Source.REFSEQ );\r
101         }\r
102         a = obtainGiNumberFromDataFields( n );\r
103         if ( !ForesterUtil.isEmpty( a ) ) {\r
104             return new Accession( a, Source.GI );\r
105         }\r
106         return null;\r
107     }\r
108 \r
109     public final static Accession obtainFromSeqAccession( final PhylogenyNode n ) {\r
110         if ( n.getNodeData().isHasSequence() && ( n.getNodeData().getSequence().getAccession() != null )\r
111                 && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getAccession().getSource() )\r
112                 && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getAccession().getValue() ) ) {\r
113             final String source = n.getNodeData().getSequence().getAccession().getSource().toLowerCase();\r
114             final String value = n.getNodeData().getSequence().getAccession().getValue();\r
115             if ( ( source.startsWith( "uniprot" ) || source.equals( "swissprot" ) || source.equals( "trembl" ) || source\r
116                     .equals( "sp" ) ) ) {\r
117                 return new Accession( value, Source.UNIPROT );\r
118             }\r
119             else if ( source.equals( "embl" ) || source.equals( "ebi" ) ) {\r
120                 return new Accession( value, Source.EMBL );\r
121             }\r
122             else if ( source.equals( "ncbi" ) || source.equals( "genbank" ) ) {\r
123                 return new Accession( value, Source.NCBI );\r
124             }\r
125             else if ( source.equals( "refseq" ) ) {\r
126                 return new Accession( value, Source.REFSEQ );\r
127             }\r
128             else if ( source.equals( "gi" ) ) {\r
129                 return new Accession( value, Source.GI );\r
130             }\r
131         }\r
132         return null;\r
133     }\r
134 \r
135     public final static String obtainGenbankAccessorFromDataFields( final PhylogenyNode n ) {\r
136         String a = null;\r
137         if ( n.getNodeData().isHasSequence() ) {\r
138             final Sequence seq = n.getNodeData().getSequence();\r
139             if ( !ForesterUtil.isEmpty( seq.getSymbol() ) ) {\r
140                 a = parseGenbankAccessorFromString( seq.getSymbol() );\r
141             }\r
142             if ( !ForesterUtil.isEmpty( seq.getGeneName() ) ) {\r
143                 a = parseGenbankAccessorFromString( seq.getGeneName() );\r
144             }\r
145             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getName() ) ) {\r
146                 a = parseGenbankAccessorFromString( seq.getName() );\r
147             }\r
148             if ( ForesterUtil.isEmpty( a ) && ( n.getNodeData().getSequence().getAccession() != null )\r
149                     && !ForesterUtil.isEmpty( seq.getAccession().getValue() ) ) {\r
150                 a = parseGenbankAccessorFromString( seq.getAccession().getValue() );\r
151             }\r
152         }\r
153         if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( n.getName() ) ) {\r
154             a = parseGenbankAccessorFromString( n.getName() );\r
155         }\r
156         return a;\r
157     }\r
158 \r
159     public final static String obtainGiNumberFromDataFields( final PhylogenyNode n ) {\r
160         String a = null;\r
161         if ( n.getNodeData().isHasSequence() ) {\r
162             final Sequence seq = n.getNodeData().getSequence();\r
163             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getName() ) ) {\r
164                 a = parseGInumberFromString( seq.getName() );\r
165             }\r
166             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getGeneName() ) ) {\r
167                 a = parseGInumberFromString( seq.getGeneName() );\r
168             }\r
169             if ( ForesterUtil.isEmpty( a ) && ( n.getNodeData().getSequence().getAccession() != null )\r
170                     && !ForesterUtil.isEmpty( seq.getAccession().getValue() ) ) {\r
171                 a = parseGInumberFromString( seq.getAccession().getValue() );\r
172             }\r
173         }\r
174         if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( n.getName() ) ) {\r
175             a = parseGInumberFromString( n.getName() );\r
176         }\r
177         return a;\r
178     }\r
179 \r
180     public final static String obtainRefSeqAccessorFromDataFields( final PhylogenyNode n ) {\r
181         String a = null;\r
182         if ( n.getNodeData().isHasSequence() ) {\r
183             final Sequence seq = n.getNodeData().getSequence();\r
184             if ( !ForesterUtil.isEmpty( seq.getSymbol() ) ) {\r
185                 a = parseRefSeqAccessorFromString( seq.getSymbol() );\r
186             }\r
187             if ( !ForesterUtil.isEmpty( seq.getGeneName() ) ) {\r
188                 a = parseRefSeqAccessorFromString( seq.getGeneName() );\r
189             }\r
190             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getName() ) ) {\r
191                 a = parseRefSeqAccessorFromString( seq.getName() );\r
192             }\r
193             if ( ForesterUtil.isEmpty( a ) && ( n.getNodeData().getSequence().getAccession() != null )\r
194                     && !ForesterUtil.isEmpty( seq.getAccession().getValue() ) ) {\r
195                 a = parseRefSeqAccessorFromString( seq.getAccession().getValue() );\r
196             }\r
197         }\r
198         if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( n.getName() ) ) {\r
199             a = parseRefSeqAccessorFromString( n.getName() );\r
200         }\r
201         return a;\r
202     }\r
203 \r
204     public final static String obtainUniProtAccessorFromDataFields( final PhylogenyNode n ) {\r
205         String a = null;\r
206         if ( n.getNodeData().isHasSequence() ) {\r
207             final Sequence seq = n.getNodeData().getSequence();\r
208             if ( !ForesterUtil.isEmpty( seq.getSymbol() ) ) {\r
209                 a = SequenceAccessionTools.parseUniProtAccessorFromString( seq.getSymbol() );\r
210             }\r
211             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getName() ) ) {\r
212                 a = SequenceAccessionTools.parseUniProtAccessorFromString( seq.getName() );\r
213             }\r
214             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getGeneName() ) ) {\r
215                 a = SequenceAccessionTools.parseUniProtAccessorFromString( seq.getGeneName() );\r
216             }\r
217             if ( ForesterUtil.isEmpty( a ) && ( n.getNodeData().getSequence().getAccession() != null )\r
218                     && !ForesterUtil.isEmpty( seq.getAccession().getValue() ) ) {\r
219                 a = SequenceAccessionTools.parseUniProtAccessorFromString( seq.getAccession().getValue() );\r
220             }\r
221         }\r
222         if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( n.getName() ) ) {\r
223             a = SequenceAccessionTools.parseUniProtAccessorFromString( n.getName() );\r
224         }\r
225         return a;\r
226     }\r
227 \r
228     public final static Accession parseAccessorFromString( final String s ) {\r
229         if ( !ForesterUtil.isEmpty( s ) ) {\r
230             String v = parseUniProtAccessorFromString( s );\r
231             if ( !ForesterUtil.isEmpty( v ) ) {\r
232                 return new Accession( v, Source.UNIPROT );\r
233             }\r
234             v = parseGenbankAccessorFromString( s );\r
235             if ( !ForesterUtil.isEmpty( v ) ) {\r
236                 return new Accession( v, Source.NCBI );\r
237             }\r
238             v = parseRefSeqAccessorFromString( s );\r
239             if ( !ForesterUtil.isEmpty( v ) ) {\r
240                 return new Accession( v, Source.REFSEQ );\r
241             }\r
242             v = parseGInumberFromString( s );\r
243             if ( !ForesterUtil.isEmpty( v ) ) {\r
244                 return new Accession( v, Source.GI );\r
245             }\r
246         }\r
247         return null;\r
248     }\r
249 \r
250     public final static String parseGenbankAccessorFromString( final String s ) {\r
251         Matcher m = GENBANK_NUC_PATTERN_1.matcher( s );\r
252         if ( m.lookingAt() ) {\r
253             return m.group( 1 );\r
254         }\r
255         else {\r
256             m = GENBANK_NUC_PATTERN_2.matcher( s );\r
257             if ( m.lookingAt() ) {\r
258                 return m.group( 1 );\r
259             }\r
260             else {\r
261                 m = GENBANK_PROT_PATTERN.matcher( s );\r
262                 if ( m.lookingAt() ) {\r
263                     return m.group( 1 );\r
264                 }\r
265                 else {\r
266                     return null;\r
267                 }\r
268             }\r
269         }\r
270     }\r
271 \r
272     public final static String parseGenbankProteinAccessorFromString( final String s ) {\r
273         final Matcher m = GENBANK_PROT_PATTERN.matcher( s );\r
274         if ( m.lookingAt() ) {\r
275             return m.group( 1 );\r
276         }\r
277         else {\r
278             return null;\r
279         }\r
280     }\r
281 \r
282     public final static String parseGInumberFromString( final String s ) {\r
283         final Matcher m = GI_PATTERN.matcher( s );\r
284         if ( m.find() ) {\r
285             return m.group( 1 );\r
286         }\r
287         return null;\r
288     }\r
289 \r
290     public final static String parseRefSeqAccessorFromString( final String s ) {\r
291         final Matcher m = REFSEQ_PATTERN.matcher( s );\r
292         if ( m.lookingAt() ) {\r
293             return m.group( 1 );\r
294         }\r
295         return null;\r
296     }\r
297 \r
298     public final static String parseUniProtAccessorFromString( final String s ) {\r
299         Matcher m = UNIPROT_KB_PATTERN_1.matcher( s );\r
300         if ( m.find() ) {\r
301             return m.group( 1 );\r
302         }\r
303         m = UNIPROT_KB_PATTERN_2.matcher( s );\r
304         if ( m.find() ) {\r
305             return m.group();\r
306         }\r
307         m = UNIPROT_KB_PATTERN_0.matcher( s );\r
308         if ( m.find() ) {\r
309             return m.group( 1 );\r
310         }\r
311         return null;\r
312     }\r
313 }\r