2 // forester -- software libraries and applications
3 // for genomics and evolutionary biology research.
5 // Copyright (C) 2010 Christian M Zmasek
6 // Copyright (C) 2010 Sanford-Burnham Medical Research Institute
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU Lesser General Public
11 // License as published by the Free Software Foundation; either
12 // version 2.1 of the License, or (at your option) any later version.
14 // This library is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 // Lesser General Public License for more details.
19 // You should have received a copy of the GNU Lesser General Public
20 // License along with this library; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 // Contact: phylosoft @ gmail . com
24 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester
26 package org.forester.ws.seqdb;
28 import java.util.List;
29 import java.util.SortedSet;
30 import java.util.TreeSet;
31 import java.util.regex.Matcher;
32 import java.util.regex.Pattern;
34 import org.forester.go.GoTerm;
35 import org.forester.phylogeny.data.Accession;
36 import org.forester.phylogeny.data.Annotation;
37 import org.forester.util.ForesterUtil;
39 public final class EbiDbEntry implements SequenceDatabaseEntry {
41 // public static SequenceDatabaseEntry createInstanceFromPlainText( final List<String> lines ) {
42 // final EbiDbEntry e = new EbiDbEntry();
43 // for( final String line : lines ) {
44 // if ( line.startsWith( "PA" ) ) {
45 // e.setPA( SequenceDbWsTools.extractFrom( line, "PA" ) );
47 // else if ( line.startsWith( "DE" ) ) {
48 // e.setDe( SequenceDbWsTools.extractFrom( line, "DE" ) );
50 // else if ( line.startsWith( "OS" ) ) {
51 // if ( line.indexOf( "(" ) > 0 ) {
52 // e.setOs( SequenceDbWsTools.extractFromTo( line, "OS", "(" ) );
55 // e.setOs( SequenceDbWsTools.extractFrom( line, "OS" ) );
58 // else if ( line.startsWith( "OX" ) ) {
59 // if ( line.indexOf( "NCBI_TaxID=" ) > 0 ) {
60 // e.setTaxId( SequenceDbWsTools.extractFromTo( line, "NCBI_TaxID=", ";" ) );
66 public static SequenceDatabaseEntry createInstanceFromPlainTextForRefSeq( final List<String> lines ) {
67 final Pattern X_PATTERN = Pattern.compile( "^[A-Z]+" );
68 final Pattern chromosome_PATTERN = Pattern.compile( "\\s+/chromosome=\"(\\w+)\"" );
69 final Pattern map_PATTERN = Pattern.compile( "\\s+/map=\"([\\w+\\.])\"" );
70 final Pattern gene_PATTERN = Pattern.compile( "\\s+/gene=\"(.+)\"" );
71 final Pattern mim_PATTERN = Pattern.compile( "\\s+/db_xref=\"MIM:(\\d+)\"" );
72 final Pattern taxon_PATTERN = Pattern.compile( "\\s+/db_xref=\"taxon:(\\d+)\"" );
73 final Pattern interpro_PATTERN = Pattern.compile( "\\s+/db_xref=\"InterPro:([A-Z0-9]+)\"" );
74 final Pattern uniprot_PATTERN = Pattern.compile( "\\s+/db_xref=\"UniProtKB/[A-Za-z-]*:(\\w+)\"" );
75 final Pattern hgnc_PATTERN = Pattern.compile( "\\s+/db_xref=\"[A-Z:]*HGNC:(\\d+)\"" );
76 final Pattern geneid_PATTERN = Pattern.compile( "\\s+/db_xref=\"GeneID:(\\d+)\"" );
77 final Pattern pdb_PATTERN = Pattern.compile( "\\s+/db_xref=\"PDB:([A-Z0-9]+)\"" );
78 final Pattern ec_PATTERN = Pattern.compile( "\\s+/EC_number=\"([\\.\\-\\d]+)\"" );
79 final Pattern product_PATTERN = Pattern.compile( "\\s+/product=\"(\\w{1,10})\"" );
80 final EbiDbEntry e = new EbiDbEntry();
81 final StringBuilder def = new StringBuilder();
82 boolean in_definition = false;
83 boolean in_features = false;
84 boolean in_source = false;
85 boolean in_gene = false;
86 boolean in_cds = false;
87 boolean in_mrna = false;
88 boolean in_protein = false;
89 for( final String line : lines ) {
90 if ( line.startsWith( "ACCESSION " ) ) {
91 e.setAccession( SequenceDbWsTools.extractFrom( line, "ACCESSION" ) );
92 in_definition = false;
94 else if ( line.startsWith( "ID " ) ) {
95 e.setAccession( SequenceDbWsTools.extractFromTo( line, "ID", ";" ) );
96 in_definition = false;
98 else if ( line.startsWith( "DEFINITION " ) || ( line.startsWith( "DE " ) ) ) {
99 boolean definiton = false;
100 if ( line.startsWith( "DEFINITION " ) ) {
103 if ( line.indexOf( "[" ) > 0 ) {
105 x( def, ( SequenceDbWsTools.extractFromTo( line, "DEFINITION", "[" ) ) );
108 x( def, ( SequenceDbWsTools.extractFromTo( line, "DE", "[" ) ) );
111 else if ( line.indexOf( "." ) > 0 ) {
113 x( def, ( SequenceDbWsTools.extractFromTo( line, "DEFINITION", "." ) ) );
116 x( def, ( SequenceDbWsTools.extractFromTo( line, "DE", "." ) ) );
121 x( def, ( SequenceDbWsTools.extractFrom( line, "DEFINITION" ) ) );
124 x( def, ( SequenceDbWsTools.extractFrom( line, "DE" ) ) );
128 in_definition = true;
131 else if ( line.startsWith( " ORGANISM " ) ) {
132 if ( line.indexOf( "(" ) > 0 ) {
133 e.setTaxonomyScientificName( SequenceDbWsTools.extractFromTo( line, " ORGANISM", "(" ) );
136 e.setTaxonomyScientificName( SequenceDbWsTools.extractFrom( line, " ORGANISM" ) );
140 else if ( line.startsWith( "OS " ) ) {
141 if ( line.indexOf( "(" ) > 0 ) {
142 e.setTaxonomyScientificName( SequenceDbWsTools.extractFromTo( line, "OS", "(" ) );
145 e.setTaxonomyScientificName( SequenceDbWsTools.extractFrom( line, "OS" ) );
148 else if ( line.startsWith( " " ) && in_definition ) {
150 if ( line.indexOf( "[" ) > 0 ) {
151 def.append( SequenceDbWsTools.extractTo( line, "[" ) );
153 else if ( line.indexOf( "." ) > 0 ) {
154 def.append( SequenceDbWsTools.extractTo( line, "." ) );
157 def.append( line.trim() );
161 in_definition = false;
163 if ( !line.startsWith( "FT " ) && X_PATTERN.matcher( line ).find() ) {
172 if ( line.startsWith( "FEATURES " ) || line.startsWith( "FT " ) ) {
175 if ( in_features && ( line.startsWith( " source " ) || line.startsWith( "FT source " ) ) ) {
182 if ( in_features && ( line.startsWith( " gene " ) || line.startsWith( "FT gene " ) ) ) {
189 if ( in_features && ( line.startsWith( " CDS " ) || line.startsWith( "FT CDS " ) ) ) {
196 if ( in_features && ( line.startsWith( " Protein " ) || line.startsWith( "FT Protein " ) ) ) {
203 if ( in_features && ( line.startsWith( " mRNA " ) || line.startsWith( "FT mRNA " ) ) ) {
211 final Matcher ti = taxon_PATTERN.matcher( line );
213 e.setTaxId( ti.group( 1 ) );
215 final Matcher chr = chromosome_PATTERN.matcher( line );
217 e.setChromosome( chr.group( 1 ) );
219 final Matcher map = map_PATTERN.matcher( line );
221 e.setMap( map.group( 1 ) );
224 if ( in_cds || in_gene ) {
225 final Matcher hgnc = hgnc_PATTERN.matcher( line );
227 e.addCrossReference( new Accession( hgnc.group( 1 ), "hgnc" ) );
229 final Matcher geneid = geneid_PATTERN.matcher( line );
230 if ( geneid.find() ) {
231 e.addCrossReference( new Accession( geneid.group( 1 ), "geneid" ) );
234 if ( in_protein || in_cds || in_gene || in_mrna ) {
235 final Matcher ec = ec_PATTERN.matcher( line );
237 e.addAnnotation( new Annotation( "EC", ec.group( 1 ) ) );
239 final Matcher gene = gene_PATTERN.matcher( line );
241 e.setGeneName( gene.group( 1 ) );
243 final Matcher uniprot = uniprot_PATTERN.matcher( line );
244 if ( uniprot.find() ) {
245 e.addCrossReference( new Accession( uniprot.group( 1 ), "uniprot" ) );
247 final Matcher interpro = interpro_PATTERN.matcher( line );
248 if ( interpro.find() ) {
249 e.addCrossReference( new Accession( interpro.group( 1 ), "interpro" ) );
251 final Matcher mim = mim_PATTERN.matcher( line );
253 e.addCrossReference( new Accession( mim.group( 1 ), "mim" ) );
255 final Matcher product = product_PATTERN.matcher( line );
256 if ( product.find() ) {
257 e.setSequenceSymbol( product.group( 1 ) );
259 final Matcher pdb = pdb_PATTERN.matcher( line );
261 e.addCrossReference( new Accession( pdb.group( 1 ), "pdb" ) );
265 if ( def.length() > 0 ) {
266 e.setSequenceName( def.toString().trim() );
271 private String _chromosome;
273 private void setMap( String map ) {
278 private void setChromosome( String chromosome ) {
279 _chromosome = chromosome;
284 public String getMap( ) {
289 public String getChromosome() {
295 private static void x( final StringBuilder sb, final String s ) {
296 if ( sb.length() > 0 ) {
299 sb.append( s.trim() );
301 // FIXME actually this is NCBI entry
302 //http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/emb/AAR37336/
306 private String _tax_id;
307 private String _symbol;
308 private String _provider;
309 private SortedSet<Accession> _cross_references;
310 private SortedSet<Annotation> _annotations;
311 private String _gene_name;
313 // TODO PUBMED 15798186
315 // source /db_xref="taxon:9606"
319 // /db_xref="MIM:604739"
322 // /db_xref="MIM:604739"
323 // /db_xref="InterPro:IPR002475"
325 // /db_xref="UniProtKB/TrEMBL:Q5J7V1" <- reparse?
329 LOCUS NM_184234 2881 bp mRNA linear PRI 16-JUN-2013
330 DEFINITION Homo sapiens RNA binding motif protein 39 (RBM39), transcript
333 VERSION NM_184234.2 GI:336176061
335 SOURCE Homo sapiens (human)
336 ORGANISM Homo sapiens
337 Eukaryota; Metazoa; Chordata; Craniata; Vertebrata; Euteleostomi;
338 Mammalia; Eutheria; Euarchontoglires; Primates; Haplorrhini;
339 Catarrhini; Hominidae; Homo.
340 REFERENCE 1 (bases 1 to 2881)
341 AUTHORS Sillars-Hardebol,A.H., Carvalho,B., Belien,J.A., de Wit,M.,
342 Delis-van Diemen,P.M., Tijssen,M., van de Wiel,M.A., Ponten,F.,
343 Meijer,G.A. and Fijneman,R.J.
344 TITLE CSE1L, DIDO1 and RBM39 in colorectal adenoma to carcinoma
346 JOURNAL Cell Oncol (Dordr) 35 (4), 293-300 (2012)
348 REMARK GeneRIF: Data show that CSE1L, DIDO1 and RBM39 mRNA expression
349 levels correlated with chromosome 20q DNA copy number status.
350 REFERENCE 2 (bases 1 to 2881)
351 AUTHORS Huang,G., Zhou,Z., Wang,H. and Kleinerman,E.S.
352 TITLE CAPER-alpha alternative splicing regulates the expression of
353 vascular endothelial growth factor(1)(6)(5) in Ewing sarcoma cells
354 JOURNAL Cancer 118 (8), 2106-2116 (2012)
356 REMARK GeneRIF: Increased VEGF(165) expression is secondary to the
357 down-regulation of CAPER-alpha by EWS/FLI-1. CAPER-alpha mediates
358 alternative splicing and controls the shift from VEGF(189) to
360 REFERENCE 3 (bases 1 to 2881)
361 AUTHORS Han,B., Stockwin,L.H., Hancock,C., Yu,S.X., Hollingshead,M.G. and
363 TITLE Proteomic analysis of nuclei isolated from cancer cell lines
364 treated with indenoisoquinoline NSC 724998, a novel topoisomerase I
366 JOURNAL J. Proteome Res. 9 (8), 4016-4027 (2010)
368 REMARK Erratum:[J Proteome Res. 2011 Apr 1;10(4):2128]
369 REFERENCE 4 (bases 1 to 2881)
370 AUTHORS Zhang,J.Y., Looi,K.S. and Tan,E.M.
371 TITLE Identification of tumor-associated antigens as diagnostic and
372 predictive biomarkers in cancer
373 JOURNAL Methods Mol. Biol. 520, 1-10 (2009)
375 REFERENCE 5 (bases 1 to 2881)
376 AUTHORS Dutta,J., Fan,G. and Gelinas,C.
377 TITLE CAPERalpha is a novel Rel-TAD-interacting factor that inhibits
378 lymphocyte transformation by the potent Rel/NF-kappaB oncoprotein
380 JOURNAL J. Virol. 82 (21), 10792-10802 (2008)
382 REMARK GeneRIF: this study identifies CAPERalpha (RNA binding motif
383 protein 39) as a new transcriptional coregulator for v-Rel and
384 reveals an important role in modulating Rel's oncogenic activity.
385 REFERENCE 6 (bases 1 to 2881)
386 AUTHORS Cazalla,D., Newton,K. and Caceres,J.F.
387 TITLE A novel SR-related protein is required for the second step of
389 JOURNAL Mol. Cell. Biol. 25 (8), 2969-2980 (2005)
391 REFERENCE 7 (bases 1 to 2881)
392 AUTHORS Dowhan,D.H., Hong,E.P., Auboeuf,D., Dennis,A.P., Wilson,M.M.,
393 Berget,S.M. and O'Malley,B.W.
394 TITLE Steroid hormone receptor coactivation and alternative RNA splicing
395 by U2AF65-related proteins CAPERalpha and CAPERbeta
396 JOURNAL Mol. Cell 17 (3), 429-439 (2005)
398 REFERENCE 8 (bases 1 to 2881)
399 AUTHORS Sun,N.N., Fastje,C.D., Wong,S.S., Sheppard,P.R., Macdonald,S.J.,
400 Ridenour,G., Hyde,J.D. and Witten,M.L.
401 TITLE Dose-dependent transcriptome changes by metal ores on a human acute
402 lymphoblastic leukemia cell line
403 JOURNAL Toxicol Ind Health 19 (7-10), 157-163 (2003)
405 REMARK GeneRIF: 10 genes were down-regulated following treatment of the
406 T-ALL cells with 0.15 and 1.5 microg/mL of metal ores at 72 h
407 REFERENCE 9 (bases 1 to 2881)
408 AUTHORS Jung,D.J., Na,S.Y., Na,D.S. and Lee,J.W.
409 TITLE Molecular cloning and characterization of CAPER, a novel
410 coactivator of activating protein-1 and estrogen receptors
411 JOURNAL J. Biol. Chem. 277 (2), 1229-1234 (2002)
413 REMARK GeneRIF: This paper describes the mouse gene.
414 REFERENCE 10 (bases 1 to 2881)
415 AUTHORS Imai,H., Chan,E.K., Kiyosawa,K., Fu,X.D. and Tan,E.M.
416 TITLE Novel nuclear autoantigen with splicing factor motifs identified
417 with antibody from hepatocellular carcinoma
418 JOURNAL J. Clin. Invest. 92 (5), 2419-2426 (1993)
420 COMMENT REVIEWED REFSEQ: This record has been curated by NCBI staff. The
421 reference sequence was derived from DC346351.1, BC141835.1 and
423 On Jun 16, 2011 this sequence version replaced gi:35493810.
425 Summary: This gene encodes a member of the U2AF65 family of
426 proteins. The encoded protein is found in the nucleus, where it
427 co-localizes with core spliceosomal proteins. It has been shown to
428 play a role in both steroid hormone receptor-mediated transcription
429 and alternative splicing, and it is also a transcriptional
430 coregulator of the viral oncoprotein v-Rel. Multiple transcript
431 variants have been observed for this gene. A related pseudogene has
432 been identified on chromosome X. [provided by RefSeq, Aug 2011].
434 Transcript Variant: This variant (1) encodes the longest isoform
435 (a, also called CC1.4).
437 Publication Note: This RefSeq record includes a subset of the
438 publications that are available for this gene. Please see the Gene
439 record to access additional publications.
441 ##Evidence-Data-START##
442 Transcript exon combination :: BC141835.1, L10911.1 [ECO:0000332]
443 RNAseq introns :: mixed/partial sample support
444 ERS025081, ERS025082 [ECO:0000350]
445 ##Evidence-Data-END##
446 COMPLETENESS: complete on the 3' end.
447 PRIMARY REFSEQ_SPAN PRIMARY_IDENTIFIER PRIMARY_SPAN COMP
448 1-578 DC346351.1 3-580
449 579-2872 BC141835.1 429-2722
450 2873-2881 C75555.1 1-9 c
451 FEATURES Location/Qualifiers
453 /organism="Homo sapiens"
455 /db_xref="taxon:9606"
460 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
461 /note="RNA binding motif protein 39"
462 /db_xref="GeneID:9584"
463 /db_xref="HGNC:15923"
464 /db_xref="HPRD:09201"
465 /db_xref="MIM:604739"
468 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
469 /inference="alignment:Splign:1.39.8"
472 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
473 /standard_name="REN58946"
474 /db_xref="UniSTS:383746"
475 misc_feature 221..223
477 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
478 /note="upstream in-frame stop codon"
481 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
482 /standard_name="G64285"
483 /db_xref="UniSTS:158667"
486 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
487 /inference="alignment:Splign:1.39.8"
490 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
491 /note="isoform a is encoded by transcript variant 1;
492 coactivator of activating protein-1 and estrogen
493 receptors; functional spliceosome-associated protein 59;
494 RNA-binding region (RNP1, RRM) containing 2;
495 hepatocellular carcinoma protein 1; splicing factor HCC1"
497 /product="RNA-binding protein 39 isoform a"
498 /protein_id="NP_909122.1"
499 /db_xref="GI:35493811"
500 /db_xref="CCDS:CCDS13266.1"
501 /db_xref="GeneID:9584"
502 /db_xref="HGNC:15923"
503 /db_xref="HPRD:09201"
504 /db_xref="MIM:604739"
505 /translation="MADDIDIEAMLEAPYKKDENKLSSANGHEERSKKRKKSKSRSRS
506 HERKRSKSKERKRSRDRERKKSKSRERKRSRSKERRRSRSRSRDRRFRGRYRSPYSGP
507 KFNSAIRGKIGLPHSIKLSRRRSRSKSPFRKDKSPVREPIDNLTPEERDARTVFCMQL
508 AARIRPRDLEEFFSTVGKVRDVRMISDRNSRRSKGIAYVEFVDVSSVPLAIGLTGQRV
509 LGVPIIVQASQAEKNRAAAMANNLQKGSAGPMRLYVGSLHFNITEDMLRGIFEPFGRI
510 ESIQLMMDSETGRSKGYGFITFSDSECAKKALEQLNGFELAGRPMKVGHVTERTDASS
511 ASSFLDSDELERTGIDLGTTGRLQLMARLAEGTGLQIPPAAQQALQMSGSLAFGAVAE
512 FSFVIDLQTRLSQQTEASALAAAASVQPLATQCFQLSNMFNPQTEEEVGWDTEIKDDV
513 IEECNKHGGVIHIYVDKNSAQGNVYVKCPSIAAAIAAVNALHGRWFAGKMITAAYVPL
514 PTYHNLFPDSMTATQLLVPSRR"
515 misc_feature 413..415
517 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
518 /experiment="experimental evidence, no additional details
520 /note="N-acetylalanine; propagated from
521 UniProtKB/Swiss-Prot (Q14498.2); acetylation site"
525 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
526 /inference="alignment:Splign:1.39.8"
530 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
531 /inference="alignment:Splign:1.39.8"
534 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
535 /standard_name="REN58786"
536 /db_xref="UniSTS:383586"
539 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
540 /standard_name="D19S1033"
541 /db_xref="UniSTS:154759"
544 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
545 /standard_name="REN58785"
546 /db_xref="UniSTS:383585"
548 polyA_signal 2851..2856
550 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
553 /gene_synonym="CAPER; CAPERalpha; FSAP59; HCC1; RNPC2"
555 1 atttggagct tggggcagct tctcgcgaga gcccgtgctg agggctctgt gaggccccgt
556 61 gtgtttgtgt gtgtgtatgt gtgctggtga atgtgagtac agggaagcag cggccgccat
557 121 ttcagggagc ttgtcgacgc tgtcgcaggg gtggatcctg agctgccgaa gccgccgtcc
558 181 tgctctcccg cgtgggcttc tctaattcca ttgttttttt tagattctct cgggcctagc
559 241 cgtccttgga acccgatatt cgggctgggc ggttccgcgg cctgggccta ggggcttaac
564 private EbiDbEntry() {
567 private void addCrossReference( final Accession accession ) {
568 if ( _cross_references == null ) {
569 _cross_references = new TreeSet<Accession>();
571 System.out.println( "XREF ADDED: " + accession );
572 _cross_references.add( accession );
576 public Object clone() throws CloneNotSupportedException {
577 throw new CloneNotSupportedException();
581 public String getAccession() {
586 public SortedSet<Accession> getCrossReferences() {
587 return _cross_references;
591 public String getGeneName() {
596 public SortedSet<GoTerm> getGoTerms() {
601 public String getProvider() {
606 public String getSequenceName() {
611 public String getSequenceSymbol() {
615 private void setSequenceSymbol( final String symbol ) {
620 public String getTaxonomyIdentifier() {
625 public String getTaxonomyScientificName() {
630 public boolean isEmpty() {
631 return ( ForesterUtil.isEmpty( getAccession() ) && ForesterUtil.isEmpty( getSequenceName() )
632 && ForesterUtil.isEmpty( getTaxonomyScientificName() )
633 && ForesterUtil.isEmpty( getTaxonomyIdentifier() ) && ForesterUtil.isEmpty( getSequenceSymbol() ) );
636 private void setSequenceName( final String rec_name ) {
642 private void setGeneName( final String gene_name ) {
643 if ( _gene_name == null ) {
644 _gene_name = gene_name;
648 private void setTaxonomyScientificName( final String os ) {
654 private void setAccession( final String pa ) {
660 public void setProvider( final String provider ) {
661 _provider = provider;
664 private void setTaxId( final String tax_id ) {
665 if ( _tax_id == null ) {
671 public SortedSet<Annotation> getAnnotations() {
675 private void addAnnotation( final Annotation annotation ) {
676 if ( _annotations == null ) {
677 _annotations = new TreeSet<Annotation>();
679 _annotations.add( annotation );