phylotastic hackathon at NESCENT 120606
[jalview.git] / forester / java / src / org / forester / util / SequenceIdParser.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: www.phylosoft.org/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.data.Identifier;\r
35 import org.forester.ws.uniprot.DatabaseTools;\r
36 \r
37 public final class SequenceIdParser {\r
38 \r
39     \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     \r
51     //The format for GenBank Accession numbers are:\r
52     //Nucleotide: 1 letter + 5 numerals OR 2 letters + 6 numerals\r
53     //Protein:    3 letters + 5 numerals\r
54     //http://www.ncbi.nlm.nih.gov/Sequin/acc.html\r
55     private final static Pattern GENBANK_NUCLEOTIDE_AC_PATTERN_1 = Pattern\r
56                                                                          .compile( "(?:\\A|.*[^a-zA-Z0-9])([A-Z]\\d{5})(?:[^a-zA-Z0-9]|\\Z)" );\r
57     private final static Pattern GENBANK_NUCLEOTIDE_AC_PATTERN_2 = Pattern\r
58                                                                          .compile( "(?:\\A|.*[^a-zA-Z0-9])([A-Z]{2}\\d{6})(?:[^a-zA-Z0-9]|\\Z)" );\r
59     private final static Pattern GENBANK_PROTEIN_AC_PATTERN      = Pattern\r
60                                                                          .compile( "(?:\\A|.*[^a-zA-Z0-9])([A-Z]{3}\\d{5})(?:[^a-zA-Z0-9]|\\Z)" );\r
61     private final static boolean DEBUG                           = true;\r
62 \r
63     \r
64     /**\r
65      * Returns null if no match.\r
66      * \r
67      */\r
68     public final static Identifier parse( final String s ) {\r
69         String v = parseGenbankAccessor( s );\r
70         if ( !ForesterUtil.isEmpty( v ) ) {\r
71             return new Identifier( v, "ncbi" );\r
72         }\r
73         v = parseRefSeqAccessor( s );\r
74         if ( !ForesterUtil.isEmpty( v ) ) {\r
75             return new Identifier( v, "ncbi" );\r
76         }\r
77         return null;\r
78     }\r
79     \r
80     /**\r
81      * Returns null if no match.\r
82      * \r
83      * @param query\r
84      * @param db \r
85      * @return\r
86      */\r
87     static public String parseGenbankAccessor( final String query ) {\r
88         Matcher m = GENBANK_NUCLEOTIDE_AC_PATTERN_1.matcher( query );\r
89         if ( m.lookingAt() ) {\r
90             return m.group( 1 );\r
91         }\r
92         else {\r
93             m = GENBANK_NUCLEOTIDE_AC_PATTERN_2.matcher( query );\r
94             if ( m.lookingAt() ) {\r
95                 return m.group( 1 );\r
96             }\r
97             else {\r
98                 m = GENBANK_PROTEIN_AC_PATTERN.matcher( query );\r
99                 if ( m.lookingAt() ) {\r
100                     return m.group( 1 );\r
101                 }\r
102                 else {\r
103                     return null;\r
104                 }\r
105             }\r
106         }\r
107     }\r
108     \r
109     public final static String parseRefSeqAccessor( final String query ) {\r
110         Matcher m = GENBANK_NUCLEOTIDE_AC_PATTERN_1.matcher( query );\r
111         if ( m.lookingAt() ) {\r
112             return m.group( 1 );\r
113         }\r
114         else {\r
115             m = GENBANK_NUCLEOTIDE_AC_PATTERN_2.matcher( query );\r
116             if ( m.lookingAt() ) {\r
117                 return m.group( 1 );\r
118             }\r
119             else {\r
120                 m = GENBANK_PROTEIN_AC_PATTERN.matcher( query );\r
121                 if ( m.lookingAt() ) {\r
122                     return m.group( 1 );\r
123                 }\r
124                 else {\r
125                     return null;\r
126                 }\r
127             }\r
128         }\r
129     }\r
130     \r
131     \r
132     \r
133     private SequenceIdParser() {\r
134         // Hiding the constructor.\r
135     }\r
136     \r
137     \r
138     \r
139 }\r