# -*-Perl-*- Test Harness script for Bioperl # $Id$ use strict; BEGIN { use lib '.'; use Bio::Root::Test; test_begin(-tests => 102, -requires_module => 'Graph'); use_ok('Bio::OntologyIO'); } my $parser = Bio::OntologyIO->new( -format => "go", -defs_file => test_input_file('GO.defs.test'), # test using -file -file => test_input_file('component.ontology.test')); my $IS_A = Bio::Ontology::RelationshipType->get_instance( "IS_A" ); my $PART_OF = Bio::Ontology::RelationshipType->get_instance( "PART_OF" ); my @onts = (); while(my $ont = $parser->next_ontology()) { push(@onts, $ont); } is (scalar(@onts), 1); my $ont = $onts[0]; isa_ok $ont, "Bio::Ontology::OntologyI"; is ($ont->name(), "Gene Ontology"); my $engine = $ont->engine(); isa_ok $engine, "Bio::Ontology::OntologyEngineI"; my $term = $engine->get_terms( "GO:0018897" ); # note that all dblinks are now Bio::Annotation::DBLink instances and that all # *dblink* methods related to Bio::Ontology::Term are deprecated; this is due to # inconsistencies in those Bio::Ontology::Term methods. Use *dbxref* methods # instead my @dblinks = sort {$a->display_text cmp $b->display_text} ( $term->get_dbxrefs() ); my @synos = sort ( $term->get_synonyms() ); is( $dblinks[ 0 ]->display_text, "MetaCyc:PWY-681" ); is( $dblinks[ 1 ]->display_text, "UM-BBD_pathwayID:dbt" ); is( $synos[ 0 ], "murein sacculus" ); is( $synos[ 1 ], "peptidoglycan" ); is( $term->ontology()->name(), "Gene Ontology" ); is( $term->name(), "dibenzothiophene desulfurization" ); $term = $engine->get_terms( "GO:0004796" ); @dblinks = sort ( $term->get_dbxrefs() ); @synos = sort ( $term->get_synonyms() ); my @sec = sort ( $term->get_secondary_GO_ids() ); is( $dblinks[ 0 ]->display_text, "EC:5.3.99.5" ); is( $synos[ 0 ], "cytochrome P450 CYP5" ); is( $sec[ 0 ], "GO:0008400" ); is( $term->ontology()->name(), "Gene Ontology" ); is( $term->name(), "thromboxane-A synthase" ); my @parents = sort goid ( $ont->get_parent_terms( $term ) ); is( @parents, 2 ); is( $parents[ 0 ]->GO_id(), "GO:0015034" ); is( $parents[ 1 ]->GO_id(), "GO:0018895" ); @parents = sort goid ( $ont->get_parent_terms( $term, $PART_OF, $IS_A) ); is( @parents, 2 ); is( $parents[ 0 ]->GO_id(), "GO:0015034" ); is( $parents[ 1 ]->GO_id(), "GO:0018895" ); @parents = sort goid ( $ont->get_parent_terms( "GO:0004796", $IS_A ) ); is( @parents, 2 ); is( $parents[ 0 ]->GO_id(), "GO:0015034" ); is( $parents[ 1 ]->GO_id(), "GO:0018895" ); @parents = sort goid ( $ont->get_parent_terms( "GO:0004796", $PART_OF ) ); is( scalar(@parents), 0 ); my @anc = sort goid ( $ont->get_ancestor_terms( $term ) ); is( scalar(@anc), 3 ); is( $anc[ 0 ]->GO_id(), "GO:0003673" ); is( $anc[ 1 ]->GO_id(), "GO:0015034" ); is( $anc[ 2 ]->GO_id(), "GO:0018895" ); @anc = sort goid ( $ont->get_ancestor_terms( "GO:0004796", $IS_A ) ); is( scalar(@anc), 3 ); is( $anc[ 0 ]->GO_id(), "GO:0003673" ); is( $anc[ 1 ]->GO_id(), "GO:0015034" ); is( $anc[ 2 ]->GO_id(), "GO:0018895" ); @anc = sort goid ( $ont->get_ancestor_terms( "GO:0000666" ) ); is( @anc, 12 ); @anc = sort goid ( $ont->get_ancestor_terms( "GO:0000666", $IS_A ) ); is( @anc, 2 ); is( $anc[ 0 ]->GO_id(), "GO:0005811" ); is( $anc[ 1 ]->GO_id(), "GO:0030481" ); @anc = sort goid ( $ont->get_ancestor_terms( "GO:0000666", $PART_OF ) ); is( @anc, 6 ); is( $anc[ 0 ]->GO_id(), "GO:0005623" ); is( $anc[ 1 ]->GO_id(), "GO:0005625" ); is( $anc[ 2 ]->GO_id(), "GO:0005933" ); is( $anc[ 3 ]->GO_id(), "GO:0005935" ); is( $anc[ 4 ]->GO_id(), "GO:0005937" ); is( $anc[ 5 ]->GO_id(), "GO:0005938" ); my @childs = sort goid ( $ont->get_child_terms( "GO:0005625", $PART_OF ) ); is( @childs, 2 ); is( $childs[ 0 ]->GO_id(), "GO:0000666" ); is( $childs[ 0 ]->name(), "polarisomeX" ); is( $childs[ 1 ]->GO_id(), "GO:0000667" ); is( $childs[ 1 ]->name(), "polarisomeY" ); is( $childs[ 1 ]->ontology()->name(), "Gene Ontology" ); is( $engine->get_terms( "GO:0005625" )->name(), "soluble fraction" ); @childs = sort goid ( $ont->get_descendant_terms( "GO:0005624", $IS_A ) ); is( @childs, 6 ); is( $childs[ 0 ]->GO_id(), "GO:0000299" ); is( $childs[ 0 ]->name(), "integral membrane protein of membrane fraction" ); is( $childs[ 1 ]->GO_id(), "GO:0000300" ); is( $childs[ 1 ]->name(), "peripheral membrane protein of membrane fraction" ); is( $childs[ 2 ]->GO_id(), "GO:0005792" ); is( $childs[ 2 ]->name(), "microsome" ); is( $childs[ 3 ]->GO_id(), "GO:0019717" ); is( $childs[ 3 ]->name(), "synaptosome" ); is( $childs[ 4 ]->GO_id(), "GO:0019718" ); is( $childs[ 4 ]->name(), "rough microsome" ); is( $childs[ 5 ]->GO_id(), "GO:0019719" ); is( $childs[ 5 ]->name(), "smooth microsome" ); @childs = sort goid ( $ont->get_descendant_terms( "GO:0005625", $IS_A ) ); is( @childs, 0 ); @childs = sort goid ( $ont->get_descendant_terms( "GO:0005625", $PART_OF ) ); is( @childs, 2 ); my @rels = sort child_goid ( $ont->get_relationships( "GO:0005625" ) ); is( @rels, 3 ); is( $rels[ 0 ]->object_term()->GO_id(), "GO:0005625" ); is( $rels[ 0 ]->subject_term()->GO_id(), "GO:0000666" ); ok( $rels[ 0 ]->predicate_term()->equals( $PART_OF ) ); is( $rels[ 1 ]->object_term()->GO_id(), "GO:0005625" ); is( $rels[ 1 ]->subject_term()->GO_id(), "GO:0000667" ); ok( $rels[ 1 ]->predicate_term()->equals( $PART_OF ) ); is( $rels[ 2 ]->object_term()->GO_id(), "GO:0000267" ); is( $rels[ 2 ]->subject_term()->GO_id(), "GO:0005625" ); ok( $rels[ 2 ]->predicate_term()->equals( $IS_A ) ); # dbxrefs and synonyms are candidates for being falsely picked up by # overly promiscuous regular expressions as related terms, so we test for # that here my @terms = $engine->get_terms( "EC:5.3.99.5" ); is (scalar(@terms), 0); @terms = $engine->get_terms("MetaCyc:PWY-681","MetaCyc:PWY"); is (scalar(@terms), 0); @terms = $engine->get_terms("UM-BBD_pathwayID:dbt","BBD_pathwayID:dbt", "UM-BBD_pathwayID:dbt2","BBD_pathwayID:dbt2"); is (scalar(@terms), 0); ok( $engine->graph() ); ok( $ont->add_term( Bio::Ontology::GOterm->new(-identifier => "GO:0000000"))); ok( $engine->has_term( "GO:0000300" ) ); is( scalar $ont->get_all_terms(), 44 ); is( scalar $ont->get_relationship_types(), 3 ); ok( ! $ont->add_relationship( $rels[ 2 ] ) ); # this edge already exists, cannot add $rels[ 2 ]->subject_term()->GO_id( "GO:0005938" ); ok( $ont->add_relationship( $rels[ 2 ] ) ); # now it's changed, can add my @roots = $ont->get_root_terms(); is( scalar(@roots), 10 ); my @leafs = $ont->get_leaf_terms(); is( scalar(@leafs), 19 ); $parser = Bio::OntologyIO->new( -format => "go", -defs_file => test_input_file('GO.defs.test2'), # test using -files -files => test_input_file('component.ontology.test2')); $ont = $parser->next_ontology(); ok ($ont); @roots = $ont->get_root_terms(); is( scalar(@roots), 1 ); @leafs = $ont->get_leaf_terms(); is( scalar(@leafs), 4 ); $parser = Bio::OntologyIO->new( -format => "go", -file => test_input_file('mpath.ontology.test')); ok($parser); $ont = $parser->next_ontology; ok($ont); $engine = $ont->engine; ok($engine); $term = $engine->get_terms( "MPATH:30" ); is($term->identifier,"MPATH:30"); is($term->name,"cystic medial necrosis"); is($term->definition,undef); is((sort $term->get_synonyms)[0],"erdheim disease"); is($ont->get_parent_terms( $term )->name,"tissue specific degenerative process"); is(scalar($ont->get_root_terms()),2); @anc = $ont->get_ancestor_terms($term); is(scalar(@anc),4); ################################################################# # helper functions ################################################################# sub goid { num ( $a->GO_id() ) <=> num ( $b->GO_id() ) } sub child_goid { num ( $a->child_term()->GO_id() ) <=> num ( $b->child_term()->GO_id() ) } sub num { my $x = shift( @_ ); $x =~ s/\D+//g; return $x; }