# $Id: Dotty.pm,v 1.1 2005/02/11 05:44:56 cmungall Exp $
package GO::IO::Dotty;
=head1 NAME
GO::IO::Dotty;
=head1 SYNOPSIS
Utility functions for producing Dotty diagrams from GO graphs
Contributed to the go-database list by Philip Lord
=head1 REQUIREMENTS
http://www.research.att.com/sw/tools/graphviz/
http://search.cpan.org/search?dist=GraphViz
=cut
use strict;
use Exporter;
use GraphViz;
my @ISA=qw{Exporter};
my %labellednodes;
sub graphviz_to_dotty{
my $graphviz = shift;
open( DOTTY, "|dotty -" );
print DOTTY $graphviz->as_text;
close( DOTTY );
}
sub go_graph_to_graphviz {
my $graph = shift;
my %gopts = %{shift || {}};
my %opts = %{shift || {}};
my $it = $graph->create_iterator;
my %relationships;
my %labellednodes;
my $graphviz = GraphViz->new(%gopts);
while (my $ni = $it->next_node_instance ){
my $term = $ni->term;
my $rel = $ni->parent_rel;
my $parents = $graph->get_parent_terms($term->acc);
_graphviz_label( $term, $graph,
\%labellednodes, $graphviz, \%opts );
foreach my $p (@$parents){
_graphviz_label( $p, $graph->is_focus_node( $p ),
\%labellednodes, $graphviz, \%opts );
my $identifier = $p->acc . " " . $term->acc;
unless( $relationships{ $identifier } ){
## for some reason graphviz assumes that a number is only a
## label, and not a node name which is irritating.
my $node = "acc" . $term->acc;
my $pnode = "acc" . $p->acc;
my $apph = $term->apph;
$graphviz->add_edge($node=>$pnode, label=>$rel->type);
$relationships{ $identifier } = 1;
}
}
if ($opts{selected_assocs}) {
my @prs = map {$_->gene_product } @{$term->selected_association_list || []};
my $node = "acc" . $term->acc;
foreach my $pr (@prs) {
my $nid = $pr->xref->as_str;
unless($labellednodes{$nid}) {
$graphviz->add_node($nid, label=>$pr->symbol,
color=>'red');
$labellednodes{$nid} = 1;
}
$graphviz->add_edge( $nid=>$node, label=>"annotated_to");
}
}
}
return $graphviz;
}
sub _graphviz_label{
my $term = shift;
my $graph = shift;
my $labellednodes = shift;
my $graphviz = shift;
my %opts = %{ shift || {}};
my $acc = $term->acc;
my $node = "acc" . $term->acc;
unless( $labellednodes->{$acc} ){
if ($opts{sub}) {
$graphviz->add_node($opts{sub}->($node, $term));
}
else {
$graphviz->add_node
( $node,
label=>$term->name . " " . $term->acc ,
URL=>%opts->{'base_url'}.$term->acc,
fontname=>'Courier'
);
}
$labellednodes->{$acc} = 1;
}
}
sub label_nodes_with_colour{
my $graphviz = shift;
my $terms = shift;
my $colour = shift;
foreach my $term (@$terms){
my $node = "acc" . $term->public_acc;
$graphviz->add_node
( $node,
style=>"filled", color=>$colour ,
fontname=>'Courier');
}
}
# support US spelling
*label_nodes_with_color = \&label_nodes_with_colour;
1;