[BUG] bug 2598
[bioperl-live.git] / t / phyloxml.t
blob73bc9a0109aff128cf88316d273457c3218174bf
1 # -*-Perl-*- Test Harness script for Bioperl
3 use strict;
4 use warnings;
6 BEGIN {
7   use lib 't/lib';
8   use BioperlTest;
10   test_begin(-tests => 97,
11              -requires_modules => [qw(XML::LibXML XML::LibXML::Reader)],
12             );
13   if (1000*$] < 5008) {
14     plan skip_all => "Reader interface only supported in Perl >= 5.8";
15     exit;
16   } elsif (XML::LibXML::LIBXML_VERSION() <= 20620) {
17     plan skip_all => "Reader not supported for libxml2 <= 2.6.20";
18     exit;
19   }
20         use_ok('Bio::TreeIO');
21         use_ok('Bio::TreeIO::phyloxml');
22   diag("libxml version: ", XML::LibXML::LIBXML_VERSION()); 
25 my $verbose = test_debug();
27 ok my $treeio = Bio::TreeIO->new(
28            -verbose => $verbose,
29                              -format => 'phyloxml',
30                              -file   => test_input_file('phyloxml_examples.xml'));
32 # tree1: clade and attribute
33 # <phylogeny> <clade> <name>
35   if ($verbose > 0) {
36     diag("\ntree1: clade and attribute");
37   }
38   my $tree = $treeio->next_tree;
39   isa_ok($tree, 'Bio::Tree::TreeI');
40   is($tree->id, 'example from Prof. Joe Felsenstein\'s book "Inferring Phylogenies"');
41   is($tree->get_tag_values('description'), 'phyloXML allows to use either a "branch_length" attribute or element to indicate branch lengths.');
42   if ($verbose > 0) {
43     diag("tree id: ",$tree->id);
44     diag("tree description: ", $tree->get_tag_values('description'));
45   }
46   is($tree->get_tag_values('rooted'), 'true');
47   my @nodes = $tree->get_nodes;
48   is(@nodes, 5);
49   my ($A) = $tree->find_node('A');
50   ok($A);
51   is($A->branch_length, '0.102');
52   if ($verbose > 0) {
53     diag("node A: branch_length ", $A->branch_length);
54   }
55   is($A->ancestor->id, '');
56   is($A->ancestor->branch_length, '0.06');
57   my $leaves_string = $tree->simplify_to_leaves_string();
58   if ($verbose > 0) {
59     diag($leaves_string);
60   }
61   is($leaves_string, '((A,B),C)');
63 # write_tree
64   if ($verbose > 0) {
65     diag("\ntest write_tree");
66   }
67   my $FILE1 = test_output_file();
68   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
69       -format => 'phyloxml',
70       -file   => ">$FILE1");
71   $treeio->write_tree($tree);
72   ok -s $FILE1;
73   if ($verbose > 0) {
74     diag(`cat $FILE1`);
75   }
78 # tree2: branch_length
79 # <branch_length>
81   if ($verbose > 0) {
82     diag("\ntree2: branch_length");
83   }
84   my $tree = $treeio->next_tree;
85   isa_ok($tree, 'Bio::Tree::TreeI');
86   if ($verbose > 0) {
87     diag("tree id: ",$tree->id);
88   }
89   my @nodes = $tree->get_nodes;
90   is(@nodes, 5);
91   my $A = $tree->find_node('A');
92   ok($A);
93   is($A->branch_length, '0.102');
94   if ($verbose > 0) {
95     diag("node A: branch_length ", $A->branch_length);
96   }
97   is($A->ancestor->id, '');
98   is($A->ancestor->branch_length, '0.06');
99   my $leaves_string = $tree->simplify_to_leaves_string();
100   if ($verbose > 0) {
101     diag($leaves_string);
102   }
103   is($leaves_string, '((A,B),C)');
105 # write_tree
106   if ($verbose > 0) {
107     diag("\ntest write_tree");
108   }
109   my $FILE1 = test_output_file();
110   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
111       -format => 'phyloxml',
112       -file   => ">$FILE1");
113   $treeio->write_tree($tree);
114   ok -s $FILE1;
115   if ($verbose > 0) {
116     diag(`cat $FILE1`);
117   }
120 # tree3: confidence (bootstrap)
121 # <confidence>
123   if ($verbose > 0) {
124     diag("\ntree3: confidence (bootstrap)");
125   }
126   my $tree = $treeio->next_tree;
127   isa_ok($tree, 'Bio::Tree::TreeI');
128   if ($verbose > 0) {
129     diag("tree id: ",$tree->id);
130   }
131   my $AB = $tree->find_node('AB');
132   ok($AB);
133   is($AB->bootstrap, '89');
134   if ($verbose > 0) {
135     diag("node AB: bootstrap ", $AB->bootstrap);
136   }
137   my $leaves_string = $tree->simplify_to_leaves_string();
138   if ($verbose > 0) {
139     diag($leaves_string);
140   }
141   is($leaves_string, '((A,B),C)');
143 # write_tree
144   if ($verbose > 0) {
145     diag("\ntest write_tree");
146   }
147   my $FILE1 = test_output_file();
148   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
149       -format => 'phyloxml',
150       -file   => ">$FILE1");
151   $treeio->write_tree($tree);
152   ok -s $FILE1;
153   if ($verbose > 0) {
154     diag(`cat $FILE1`);
155   }
158 # tree4: species and sequence
159 # <taxonomy> <scientific_name> <sequence> <annotation>
161   if ($verbose > 0) {
162     diag("\ntree4: taxonomy and sequence");
163   }
164   my $tree = $treeio->next_tree;
165   isa_ok($tree, 'Bio::Tree::TreeI');
166   if ($verbose > 0) {
167     diag("tree id: ",$tree->id);
168   }
169   my $C = $tree->find_node('C');
170   my ($ac) = $C->annotation->get_Annotations('taxonomy');
171   isa_ok( $ac, 'Bio::Annotation::Collection');
172   my ($ac2) = $ac->get_Annotations('scientific_name');
173   isa_ok( $ac2, 'Bio::Annotation::Collection');
174   my ($scientificname) = $ac2->get_Annotations('_text');
175   is($scientificname->value, 'C. elegans');
176   if ($verbose > 0) {
177     diag( "Node C Scientific Name: ",$scientificname->value);
178   }
179   my ($ac3) = $C->annotation->get_nested_Annotations(-keys=>['scientific_name'], -recursive=>1);
180   isa_ok( $ac3, 'Bio::Annotation::Collection');
181   ($scientificname) = $ac2->get_Annotations('_text');
182   is($scientificname->value, 'C. elegans');
183   if ($verbose > 0) {
184     diag( "Node C Scientific Name: ",$scientificname->value);
185   }
186   my ($seq) = @{$C->sequence};
187   isa_ok( $seq, 'Bio::SeqI');
188   my ($seqac) = $seq->annotation;
189   isa_ok( $seqac, 'Bio::Annotation::Collection');
190   my ($descac) = $seqac->get_nested_Annotations(-keys=>['desc'], -recursive=>1);
191   my ($desc) = $descac->get_Annotations('_text');
192   is($desc->value, 'alcohol dehydrogenase');
193   if ($verbose > 0) {
194     diag( "Node C Sequence description: ",$desc->value);
195   }
196   ($descac) = $seqac->get_nested_Annotations(-keys=>['desc'], -recursive=>1);
197   
198 # write_tree
199   if ($verbose > 0) {
200     diag("\ntest write_tree");
201   }
202   my $FILE1 = test_output_file();
203   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
204       -format => 'phyloxml',
205       -file   => ">$FILE1");
206   $treeio->write_tree($tree);
207   ok -s $FILE1;
208   if ($verbose > 0) {
209     diag(`cat $FILE1`);
210   }
213 # tree5: homolog relationship and sequence relationship
214 # <events> <speciations> <duplications> <symbol> <accession> 
215 # <sequence_relation> 
217   if ($verbose > 0) {
218     diag("\ntree5: events and relations");
219   }
220   my $tree = $treeio->next_tree;
221   isa_ok($tree, 'Bio::Tree::TreeI');
222   if ($verbose > 0) {
223     diag("tree id: ",$tree->id);
224   }
225   my $node = $tree->get_root_node;
226   my ($speciationsac) = $node->annotation->get_nested_Annotations(-keys=>['speciations'], -recursive=>1);
227   my ($speciationval) = $speciationsac->get_Annotations('_text');
228   is($speciationval->value, '1');
229   if ($verbose > 0) {
230     diag("root node speciation event: ", $speciationval->value);
231   }
232   my @children = ($node);
233   for (@children) {
234     push @children, $_->each_Descendent();
235   }
236   my @leaves = ();
237   for (@children) {
238     push @leaves, $_ if $_->is_Leaf;
239   }
240   my ($z) = $leaves[0];
241   my $z_seq = $z->sequence->[0];
242   isa_ok ($z_seq, 'Bio::SeqI');
243   my ($z_id) = $z_seq->annotation->get_nested_Annotations('-keys'=>['id_source'], '-recursive'=>1);
244   my ($z_id_text) = $z_id->value;
245   my @seq_rels = $z_seq->annotation->get_nested_Annotations('-keys'=>['sequence_relation'], '-recursive'=>1);
246   foreach my $rel (@seq_rels) {
247     isa_ok($rel, 'Bio::Annotation::Relation');
248     is ($rel->tagname, 'sequence_relation');
249     my $seqto = $rel->to;
250     isa_ok ($seqto, 'Bio::SeqI');
251     my ($seqto_id) = $seqto->annotation->get_nested_Annotations('-keys'=>['id_source'], '-recursive'=>1);
252     my $seqto_text = $seqto_id->value;
253     if ($verbose > 0) {
254       diag( "node ", $z_id_text, " has ", $rel->type, " relation to ", $seqto_text);
255     }
256   }
257   my ($x) = $leaves[1];
258   
260 # write_tree
261   if ($verbose > 0) {
262     diag("\ntest write_tree");
263   }
264   my $FILE1 = test_output_file();
265   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
266       -format => 'phyloxml',
267       -file   => ">$FILE1");
268   $treeio->write_tree($tree);
269   ok -s $FILE1;
270   if ($verbose > 0) {
271     diag(`cat $FILE1`);
272   }
275 # tree6: detailed sequence data
276 # <mol_seq> <annotation> <code>
278   if ($verbose > 0) {
279     diag("\ntree6: detailed sequence annotation");
280   }
281   my $tree = $treeio->next_tree;
282   isa_ok($tree, 'Bio::Tree::TreeI');
283   if ($verbose > 0) {
284     diag("tree id: ",$tree->id);
285   }
286   my @children = ($tree->get_root_node);
287   for (@children) {
288     push @children, $_->each_Descendent();
289   }
290   my @leaves = ();
291   for (@children) {
292     push @leaves, $_ if $_->is_Leaf;
293   }
294   my ($z) = $leaves[0];
295   my $z_seq = $z->sequence->[0];
296   isa_ok ($z_seq, 'Bio::SeqI');
297   my ($z_seqname) = $z_seq->annotation->get_nested_Annotations('-keys'=>['name'], '-recursive'=>1); 
298   my ($z_seqname_text) = $z_seqname->get_Annotations('_text');
299   is ($z_seqname_text->value, 'NADH-dependent butanol dehydrogenase B');
300   my ($z_molseq) = $z_seq->seq;
301   is ($z_molseq, 'MVDFEYSIPTRIFFGKDKINVLGRELKKYGSKVLIVYGGGSIKRNGIYDK');
302   if ($verbose > 0) {
303     diag("Sequence ", $z_seqname_text->value, " is ", $z_molseq);
304   }
305   my ($z_seqname_text2) = $treeio->read_annotation('-obj'=>$z_seq, '-path'=>'name');
306   is ($z_seqname_text->value, $z_seqname_text2);
308 # write_tree
309   if ($verbose > 0) {
310     diag("\ntest write_tree");
311   }
312   my $FILE1 = test_output_file();
313   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
314       -format => 'phyloxml',
315       -file   => ">$FILE1");
316   $treeio->write_tree($tree);
317   ok -s $FILE1;
318   if ($verbose > 0) {
319     diag(`cat $FILE1`);
320   }
323 # tree7: network
324 # <clade_relation> @id_source & @id_ref
326   if ($verbose > 0) {
327     diag("\ntree7: network using id_source/id_ref");
328   }
329   my $tree = $treeio->next_tree;
330   isa_ok($tree, 'Bio::Tree::TreeI');
331   if ($verbose > 0) {
332     diag("tree id: ",$tree->id);
333   }
334   my @children = ($tree->get_root_node);
335   for (@children) {
336     push @children, $_->each_Descendent();
337   }
338   my @leaves = ();
339   for (@children) {
340     push @leaves, $_ if $_->is_Leaf;
341   }
342   my ($c) = $leaves[0];
343   my ($c_id) = $c->annotation->get_nested_Annotations('-keys'=>['id_source'], '-recursive'=>1);
344   my @clade_rels = $c->annotation->get_nested_Annotations('-keys'=>['clade_relation'], '-recursive'=>1);
345   foreach my $rel (@clade_rels) {
346     isa_ok($rel, 'Bio::Annotation::Relation');
347     is ($rel->tagname, 'clade_relation');
348     my $nodeto = $rel->to;
349     isa_ok ($nodeto, 'Bio::Tree::AnnotatableNode');
350     my ($nodeto_id) = $nodeto->annotation->get_nested_Annotations('-keys'=>['id_source'], '-recursive'=>1);
351     is ($nodeto_id->value, 'b');
352     my ($nodeto_id2) = $treeio->read_annotation('-obj'=>$nodeto, '-path'=>'id_source', '-attr'=>1);
353     is ($nodeto_id->value, $nodeto_id2);
354     if ($verbose > 0) {
355       diag( "node ", $c_id->value, " has ", $rel->type, " relation to ", $nodeto_id->value);
356     }
357   }
359 # write_tree
360   if ($verbose > 0) {
361     diag("\ntest write_tree");
362   }
363   my $FILE1 = test_output_file();
364   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
365       -format => 'phyloxml',
366       -file   => ">$FILE1");
367   $treeio->write_tree($tree);
368   ok -s $FILE1;
369   if ($verbose > 0) {
370     diag(`cat $FILE1`);
371   }
374 # tree8: property elements
375 # <property>
377   if ($verbose > 0) {
378     diag("\ntree8: property");
379   }
380   my $tree = $treeio->next_tree;
381   isa_ok($tree, 'Bio::Tree::TreeI');
382   if ($verbose > 0) {
383     diag("tree id: ",$tree->id);
384   }
385   my ($A) = $tree->find_node('A');
386   isa_ok($A, 'Bio::Tree::AnnotatableNode');
387   my ($ac) = $A->annotation();
388   isa_ok($ac, 'Bio::AnnotationCollectionI');
389   my (@annotations) = $ac->get_Annotations('property');
390   isa_ok( $annotations[0], 'Bio::Annotation::Collection');
391   diag("property:",$annotations[0]);
392   my (@keys) = $annotations[0]->get_all_annotation_keys();
393   diag("keys:",@keys);
394   my (@value) = $annotations[0]->get_Annotations('_text');
395   is($value[0]->value, ' 1200 ');
396   if ($verbose > 0) {
397     diag( "Annotation NOAA:depth ",$value[0]->value);
398   }
399   my $leaves_string = $tree->simplify_to_leaves_string();
400   if ($verbose > 0) {
401     diag($leaves_string);
402   }
403   is($leaves_string, '((A,B),C)');
405 # write_tree
406   if ($verbose > 0) {
407     diag("\ntest write_tree");
408   }
409   my $FILE1 = test_output_file();
410   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
411       -format => 'phyloxml',
412       -file   => ">$FILE1");
413   $treeio->write_tree($tree);
414   ok -s $FILE1;
415   if ($verbose > 0) {
416     diag(`cat $FILE1`);
417   }
420 # tree9: property outside tree topology using id refs
421 # <property> @id_source @id_ref
423   if ($verbose > 0) {
424     diag("\ntree9: property using id_source/id_ref");
425   }
426   my $tree = $treeio->next_tree;
427   isa_ok($tree, 'Bio::Tree::TreeI');
428   if ($verbose > 0) {
429     diag("tree id: ",$tree->id);
430   }
431   my $A = $tree->find_node('A');
432   isa_ok($A, 'Bio::Tree::AnnotatableNode');
433   my $ac = $A->annotation();
434   isa_ok($ac, 'Bio::AnnotationCollectionI');
435   my @annotations = $ac->get_Annotations('property');
436   isa_ok( $annotations[0], 'Bio::Annotation::Collection');
437   my @value = $annotations[0]->get_Annotations('_text');
438   is($value[0]->value, ' 1200 ');
439   if ($verbose > 0) {
440     diag( "Annotation NOAA:depth ",$value[0]->value);
441   }
442   my $leaves_string = $tree->simplify_to_leaves_string();
443   if ($verbose > 0) {
444     diag($leaves_string);
445   }
446   is($leaves_string, '((A,B),C)');
448 # write_tree
449   if ($verbose > 0) {
450     diag("\ntest write_tree");
451   }
452   my $FILE1 = test_output_file();
453   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
454       -format => 'phyloxml',
455       -file   => ">$FILE1");
456   $treeio->write_tree($tree);
457   ok -s $FILE1;
458   if ($verbose > 0) {
459     diag(`cat $FILE1`);
460   }
463 # tree10: detailed taxonomy and distribution
464 # <id> <rank> <uri> <common_name> <distribution>
466   if ($verbose > 0) {
467     diag("\ntree10: taxonomy and distribution");
468   }
469   my $tree = $treeio->next_tree;
470   isa_ok($tree, 'Bio::Tree::TreeI');
471   if ($verbose > 0) {
472     diag("tree id: ",$tree->id);
473   }
474   my $node = $tree->get_root_node;
475   my @leaves;
476   my @children = ($node);
477   for (@children) {
478     push @children, $_->each_Descendent();
479   }
480   for (@children) {
481     push @leaves, $_ if $_->is_Leaf;
482   }
483   my ($A) = $leaves[0];
484   my ($scientificname) = $A->annotation->get_nested_Annotations('-keys'=>['scientific_name'], '-recursive'=>1);
485   my ($scientificname_text) = $scientificname->get_Annotations('_text');
486   my ($commonname) = $A->annotation->get_nested_Annotations('-keys'=>['common_name'], '-recursive'=>1); 
487   my ($commonname_text) = $commonname->get_Annotations('_text');
488   my ($rank) = $A->annotation->get_nested_Annotations('-keys'=>['rank'], '-recursive'=>1); 
489   my ($rank_text) = $rank->get_Annotations('_text');
490   if ($verbose > 0) {
491     diag("node rank is ", $rank_text->value);
492     diag("node scientific name is ", $scientificname_text->value);
493     diag("node common name is ", $commonname_text->value);
494   }
495   my ($distribution) = $A->annotation->get_nested_Annotations('-keys'=>['distribution'], '-recursive'=>1);
496   my ($desc) = $distribution->get_Annotations('desc');
497   my ($desc_text) = $desc->get_Annotations('_text');
498   if ($verbose > 0) {
499     diag("node distribution is ", $desc_text->value);
500   } 
501   
502 # write_tree
503   if ($verbose > 0) {
504     diag("\ntest write_tree");
505   }
506   my $FILE1 = test_output_file();
507   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
508       -format => 'phyloxml',
509       -file   => ">$FILE1");
510   $treeio->write_tree($tree);
511   ok -s $FILE1;
512   if ($verbose > 0) {
513     diag(`cat $FILE1`);
514   }
517 # tree11: phylogeographic information
518 # <distribution> <point> <lat> <long> <alt>
520   if ($verbose > 0) {
521     diag("\ntree11: phylogenographic information");
522   }
523   my $tree = $treeio->next_tree;
524   isa_ok($tree, 'Bio::Tree::TreeI');
525   if ($verbose > 0) {
526     diag("tree id: ",$tree->id);
527   }
528   my $node = $tree->get_root_node;
529   my @leaves;
530   my @children = ($node);
531   for (@children) {
532     push @children, $_->each_Descendent();
533   }
534   for (@children) {
535     push @leaves, $_ if $_->is_Leaf;
536   }
537   my ($D) = $leaves[0];
538   my ($point) = $treeio->read_annotation('-obj'=>$D, '-path'=>'distribution/point/geodetic_datum', '-attr'=>1);
539   is ($point, 'WGS84');
540   my ($lat) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'distribution/point/lat');
541   my ($long) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'distribution/point/long');
542   my ($alt) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'distribution/point/alt');
543   is ($lat, '32.880933');
544   is ($long, '-117.217543');
545   is ($alt, '104');
546   if ($verbose > 0) {
547     diag("node distribution lat: $lat long $long alt $alt");
548   }
549   
550   
551 # write_tree
552   if ($verbose > 0) {
553     diag("\ntest write_tree");
554   }
555   my $FILE1 = test_output_file();
556   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
557       -format => 'phyloxml',
558       -file   => ">$FILE1");
559   $treeio->write_tree($tree);
560   ok -s $FILE1;
561   if ($verbose > 0) {
562     diag(`cat $FILE1`);
563   }
566 # tree12: date information
567 # <date> <desc> <value>
569   if ($verbose > 0) {
570     diag("\ntree12: date");
571   }
572   my $tree = $treeio->next_tree;
573   isa_ok($tree, 'Bio::Tree::TreeI');
574   if ($verbose > 0) {
575     diag("tree id: ",$tree->id);
576   }
577   my $node = $tree->get_root_node;
578   my @leaves;
579   my @children = ($node);
580   for (@children) {
581     push @children, $_->each_Descendent();
582   }
583   for (@children) {
584     push @leaves, $_ if $_->is_Leaf;
585   }
586   my ($D) = $leaves[0];
587   my ($dateunit) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'date/unit', '-attr'=>1);
588   my ($daterange) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'date/range', '-attr'=>1);
589   my ($datevalue) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'date/value');
590   is ($dateunit, 'mya');
591   is ($daterange, '30');
592   is ($datevalue, '600');
593   if ($verbose > 0) {
594     diag("node date unit: $dateunit range $daterange value $datevalue");
595   }
597 # write_tree
598   if ($verbose > 0) {
599     diag("\ntest write_tree");
600   }
601   my $FILE1 = test_output_file();
602   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
603       -format => 'phyloxml',
604       -file   => ">$FILE1");
605   $treeio->write_tree($tree);
606   ok -s $FILE1;
607   if ($verbose > 0) {
608     diag(`cat $FILE1`);
609   }
612 # tree13: alignment outside <phylogeny>
613 # <align:alignment> <seq> 
615   if ($verbose > 0) {
616     diag("\ntree13: alignment outside  <phylogeny>");
617   }
618   my $tree = $treeio->next_tree;
619   isa_ok($tree, 'Bio::Tree::TreeI');
620   if ($verbose > 0) {
621     diag("tree id: ",$tree->id);
622   }
623   my $leaves_string = $tree->simplify_to_leaves_string();
624   if ($verbose > 0) {
625     diag($leaves_string);
626   }
627   is($leaves_string, '((A,B),C)');
629 # add annotation in phyloxml
630   if ($verbose > 0) {
631     diag("test add annotation in phyloXML format");
632   }
633   my $node = $tree->get_root_node;
634   my @leaves;
635   my @children = ($node);
636   for (@children) {
637     push @children, $_->each_Descendent();
638   }
639   for (@children) {
640     push @leaves, $_ if $_->is_Leaf;
641   }
642   my ($D) = $leaves[0];
643   isa_ok($D, 'Bio::Tree::AnnotatableNode');
644   $treeio->add_phyloXML_annotation(
645             -obj => $D, 
646             -xml => "            <name>D</name>
647             <date unit=\"mya\" range=\"30\">
648                <desc>my date</desc>
649                <value>veryveryold</value>
650             </date>
652             );
653   my ($dateunit) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'date/unit', '-attr'=>1);
654   my ($daterange) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'date/range', '-attr'=>1);
655   my ($datevalue) =  $treeio->read_annotation('-obj'=>$D, '-path'=>'date/value');
656   is ($dateunit, 'mya');
657   is ($daterange, '30');
658   is ($datevalue, 'veryveryold');
660 # write_tree
661   if ($verbose > 0) {
662     diag("\ntest write_tree");
663   }
664   my $FILE1 = test_output_file();
665   my $treeio = Bio::TreeIO->new(-verbose => $verbose,
666       -format => 'phyloxml',
667       -file   => ">$FILE1");
668   $treeio->write_tree($tree);
669   ok -s $FILE1;
670   if ($verbose > 0) {
671     diag(`cat $FILE1`);
672   }
676 # convert between nhx-phyloxml
678   if ($verbose > 0) {
679     diag("\n test translation between nhx and phyloxml");
680   }
681   ok my $nhxio = Bio::TreeIO->new(
682       -verbose => $verbose,
683       -format => 'nhx',
684       -file   => test_input_file('test.nhx'));
685   my $tree = $nhxio->next_tree;
686   isa_ok($tree, 'Bio::Tree::TreeI');
687   my $FILE1 = test_output_file();
688   my $phyloxmlio = Bio::TreeIO->new(-verbose => $verbose,
689       -format => 'phyloxml',
690       -file   => ">$FILE1");
691   $phyloxmlio->write_tree($tree);
692   ok -s $FILE1;
693   if ($verbose > 0) {
694     diag(`cat $FILE1`);
695   }