5ab000e3ae7cdcd4df43f838c5cfa7cf798ccaa1
[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     public final static Pattern  ENSEMBL_PATTERN       = Pattern.compile( "(?:\\b|_)(ENS[A-Z]*[0-9]+)(?:\\b|_)" );\r
68     // RefSeq accession numbers can be distinguished from GenBank accessions \r
69     // by their distinct prefix format of 2 characters followed by an\r
70     // underscore character ('_'). For example, a RefSeq protein accession is NP_015325. \r
71     private final static Pattern REFSEQ_PATTERN        = Pattern\r
72                                                                .compile( "(?:\\A|.*[^a-zA-Z0-9])([A-Z]{2}_\\d{6,})(?:[^a-zA-Z0-9]|\\Z)" );\r
73 \r
74     private SequenceAccessionTools() {\r
75         // Hiding the constructor.\r
76     }\r
77 \r
78     public final static boolean isProteinDbQuery( final String query ) {\r
79         final String r1 = parseRefSeqAccessorFromString( query );\r
80         if ( !ForesterUtil.isEmpty( r1 ) && ( r1.charAt( 1 ) == 'P' ) ) {\r
81             return true;\r
82         }\r
83         final String r2 = parseUniProtAccessorFromString( query );\r
84         if ( !ForesterUtil.isEmpty( r2 ) ) {\r
85             return true;\r
86         }\r
87         return GENBANK_PROT_PATTERN.matcher( query ).lookingAt();\r
88     }\r
89 \r
90     public final static Accession obtainAccessorFromDataFields( final PhylogenyNode n ) {\r
91         String a = obtainUniProtAccessorFromDataFields( n );\r
92         if ( !ForesterUtil.isEmpty( a ) ) {\r
93             return new Accession( a, Source.UNIPROT );\r
94         }\r
95         a = obtainGenbankAccessorFromDataFields( n );\r
96         if ( !ForesterUtil.isEmpty( a ) ) {\r
97             return new Accession( a, Source.NCBI );\r
98         }\r
99         a = obtainRefSeqAccessorFromDataFields( n );\r
100         if ( !ForesterUtil.isEmpty( a ) ) {\r
101             return new Accession( a, Source.REFSEQ );\r
102         }\r
103         a = obtainGiNumberFromDataFields( n );\r
104         if ( !ForesterUtil.isEmpty( a ) ) {\r
105             return new Accession( a, Source.GI );\r
106         }\r
107         return null;\r
108     }\r
109 \r
110     public final static Accession obtainFromSeqAccession( final PhylogenyNode n ) {\r
111         if ( n.getNodeData().isHasSequence() && ( n.getNodeData().getSequence().getAccession() != null )\r
112                 && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getAccession().getSource() )\r
113                 && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getAccession().getValue() ) ) {\r
114             final String source = n.getNodeData().getSequence().getAccession().getSource().toLowerCase();\r
115             final String value = n.getNodeData().getSequence().getAccession().getValue();\r
116             if ( ( source.startsWith( "uniprot" ) || source.equals( "swissprot" ) || source.equals( "trembl" ) || source\r
117                     .equals( "sp" ) ) ) {\r
118                 return new Accession( value, Source.UNIPROT );\r
119             }\r
120             else if ( source.equals( "embl" ) || source.equals( "ebi" ) ) {\r
121                 return new Accession( value, Source.EMBL );\r
122             }\r
123             else if ( source.equals( "ncbi" ) || source.equals( "genbank" ) ) {\r
124                 return new Accession( value, Source.NCBI );\r
125             }\r
126             else if ( source.equals( "refseq" ) ) {\r
127                 return new Accession( value, Source.REFSEQ );\r
128             }\r
129             else if ( source.equals( "gi" ) ) {\r
130                 return new Accession( value, Source.GI );\r
131             }\r
132         }\r
133         return null;\r
134     }\r
135 \r
136     public final static String obtainGenbankAccessorFromDataFields( final PhylogenyNode n ) {\r
137         String a = null;\r
138         if ( n.getNodeData().isHasSequence() ) {\r
139             final Sequence seq = n.getNodeData().getSequence();\r
140             if ( !ForesterUtil.isEmpty( seq.getSymbol() ) ) {\r
141                 a = parseGenbankAccessorFromString( seq.getSymbol() );\r
142             }\r
143             if ( !ForesterUtil.isEmpty( seq.getGeneName() ) ) {\r
144                 a = parseGenbankAccessorFromString( seq.getGeneName() );\r
145             }\r
146             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getName() ) ) {\r
147                 a = parseGenbankAccessorFromString( seq.getName() );\r
148             }\r
149             if ( ForesterUtil.isEmpty( a ) && ( n.getNodeData().getSequence().getAccession() != null )\r
150                     && !ForesterUtil.isEmpty( seq.getAccession().getValue() ) ) {\r
151                 a = parseGenbankAccessorFromString( seq.getAccession().getValue() );\r
152             }\r
153         }\r
154         if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( n.getName() ) ) {\r
155             a = parseGenbankAccessorFromString( n.getName() );\r
156         }\r
157         return a;\r
158     }\r
159 \r
160     public final static String obtainGiNumberFromDataFields( final PhylogenyNode n ) {\r
161         String a = null;\r
162         if ( n.getNodeData().isHasSequence() ) {\r
163             final Sequence seq = n.getNodeData().getSequence();\r
164             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getName() ) ) {\r
165                 a = parseGInumberFromString( seq.getName() );\r
166             }\r
167             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getGeneName() ) ) {\r
168                 a = parseGInumberFromString( seq.getGeneName() );\r
169             }\r
170             if ( ForesterUtil.isEmpty( a ) && ( n.getNodeData().getSequence().getAccession() != null )\r
171                     && !ForesterUtil.isEmpty( seq.getAccession().getValue() ) ) {\r
172                 a = parseGInumberFromString( seq.getAccession().getValue() );\r
173             }\r
174         }\r
175         if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( n.getName() ) ) {\r
176             a = parseGInumberFromString( n.getName() );\r
177         }\r
178         return a;\r
179     }\r
180 \r
181     public final static String obtainRefSeqAccessorFromDataFields( final PhylogenyNode n ) {\r
182         String a = null;\r
183         if ( n.getNodeData().isHasSequence() ) {\r
184             final Sequence seq = n.getNodeData().getSequence();\r
185             if ( !ForesterUtil.isEmpty( seq.getSymbol() ) ) {\r
186                 a = parseRefSeqAccessorFromString( seq.getSymbol() );\r
187             }\r
188             if ( !ForesterUtil.isEmpty( seq.getGeneName() ) ) {\r
189                 a = parseRefSeqAccessorFromString( seq.getGeneName() );\r
190             }\r
191             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getName() ) ) {\r
192                 a = parseRefSeqAccessorFromString( seq.getName() );\r
193             }\r
194             if ( ForesterUtil.isEmpty( a ) && ( n.getNodeData().getSequence().getAccession() != null )\r
195                     && !ForesterUtil.isEmpty( seq.getAccession().getValue() ) ) {\r
196                 a = parseRefSeqAccessorFromString( seq.getAccession().getValue() );\r
197             }\r
198         }\r
199         if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( n.getName() ) ) {\r
200             a = parseRefSeqAccessorFromString( n.getName() );\r
201         }\r
202         return a;\r
203     }\r
204 \r
205     public final static String obtainUniProtAccessorFromDataFields( final PhylogenyNode n ) {\r
206         String a = null;\r
207         if ( n.getNodeData().isHasSequence() ) {\r
208             final Sequence seq = n.getNodeData().getSequence();\r
209             if ( !ForesterUtil.isEmpty( seq.getSymbol() ) ) {\r
210                 a = SequenceAccessionTools.parseUniProtAccessorFromString( seq.getSymbol() );\r
211             }\r
212             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getName() ) ) {\r
213                 a = SequenceAccessionTools.parseUniProtAccessorFromString( seq.getName() );\r
214             }\r
215             if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( seq.getGeneName() ) ) {\r
216                 a = SequenceAccessionTools.parseUniProtAccessorFromString( seq.getGeneName() );\r
217             }\r
218             if ( ForesterUtil.isEmpty( a ) && ( n.getNodeData().getSequence().getAccession() != null )\r
219                     && !ForesterUtil.isEmpty( seq.getAccession().getValue() ) ) {\r
220                 a = SequenceAccessionTools.parseUniProtAccessorFromString( seq.getAccession().getValue() );\r
221             }\r
222         }\r
223         if ( ForesterUtil.isEmpty( a ) && !ForesterUtil.isEmpty( n.getName() ) ) {\r
224             a = SequenceAccessionTools.parseUniProtAccessorFromString( n.getName() );\r
225         }\r
226         return a;\r
227     }\r
228 \r
229     public final static Accession parseAccessorFromString( final String s ) {\r
230         if ( !ForesterUtil.isEmpty( s ) ) {\r
231             String v = parseUniProtAccessorFromString( s );\r
232             if ( !ForesterUtil.isEmpty( v ) ) {\r
233                 return new Accession( v, Source.UNIPROT );\r
234             }\r
235             v = parseGenbankAccessorFromString( s );\r
236             if ( !ForesterUtil.isEmpty( v ) ) {\r
237                 return new Accession( v, Source.NCBI );\r
238             }\r
239             v = parseRefSeqAccessorFromString( s );\r
240             if ( !ForesterUtil.isEmpty( v ) ) {\r
241                 return new Accession( v, Source.REFSEQ );\r
242             }\r
243             v = parseGInumberFromString( s );\r
244             if ( !ForesterUtil.isEmpty( v ) ) {\r
245                 return new Accession( v, Source.GI );\r
246             }\r
247             v = parseEnsemlAccessorFromString( s );\r
248             if ( !ForesterUtil.isEmpty( v ) ) {\r
249                 return new Accession( v, Source.ENSEMBL );\r
250             }\r
251         }\r
252         return null;\r
253     }\r
254 \r
255     public final static String parseGenbankAccessorFromString( final String s ) {\r
256         Matcher m = GENBANK_NUC_PATTERN_1.matcher( s );\r
257         if ( m.lookingAt() ) {\r
258             return m.group( 1 );\r
259         }\r
260         else {\r
261             m = GENBANK_NUC_PATTERN_2.matcher( s );\r
262             if ( m.lookingAt() ) {\r
263                 return m.group( 1 );\r
264             }\r
265             else {\r
266                 m = GENBANK_PROT_PATTERN.matcher( s );\r
267                 if ( m.lookingAt() ) {\r
268                     return m.group( 1 );\r
269                 }\r
270                 else {\r
271                     return null;\r
272                 }\r
273             }\r
274         }\r
275     }\r
276 \r
277     public final static String parseGenbankProteinAccessorFromString( final String s ) {\r
278         final Matcher m = GENBANK_PROT_PATTERN.matcher( s );\r
279         if ( m.lookingAt() ) {\r
280             return m.group( 1 );\r
281         }\r
282         else {\r
283             return null;\r
284         }\r
285     }\r
286 \r
287     public final static String parseGInumberFromString( final String s ) {\r
288         final Matcher m = GI_PATTERN.matcher( s );\r
289         if ( m.find() ) {\r
290             return m.group( 1 );\r
291         }\r
292         return null;\r
293     }\r
294 \r
295     public final static String parseEnsemlAccessorFromString( final String s ) {\r
296         final Matcher m = ENSEMBL_PATTERN.matcher( s );\r
297         if ( m.find() ) {\r
298             return m.group( 1 );\r
299         }\r
300         return null;\r
301     }\r
302 \r
303     public final static String parseRefSeqAccessorFromString( final String s ) {\r
304         final Matcher m = REFSEQ_PATTERN.matcher( s );\r
305         if ( m.lookingAt() ) {\r
306             return m.group( 1 );\r
307         }\r
308         return null;\r
309     }\r
310 \r
311     public final static String parseUniProtAccessorFromString( final String s ) {\r
312         Matcher m = UNIPROT_KB_PATTERN_1.matcher( s );\r
313         if ( m.find() ) {\r
314             return m.group( 1 );\r
315         }\r
316         m = UNIPROT_KB_PATTERN_2.matcher( s );\r
317         if ( m.find() ) {\r
318             return m.group();\r
319         }\r
320         m = UNIPROT_KB_PATTERN_0.matcher( s );\r
321         if ( m.find() ) {\r
322             return m.group( 1 );\r
323         }\r
324         return null;\r
325     }\r
326 }\r