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