my ($self, $dataflow_rules) = @_;
my $graph = $self->graph();
my $dataflow_colour = $self->config_get('Edge', 'Data', 'Colour');
my $semablock_colour = $self->config_get('Edge', 'Semablock', 'Colour');
my $accu_colour = $self->config_get('Edge', 'Accu', 'Colour');
my $df_edge_fontname = $self->config_get('Edge', 'Data', 'Font');
foreach my $df_rule ( @$dataflow_rules ) {
my ($from_analysis, $branch_code, $funnel_dataflow_rule, $target_object) =
($df_rule->from_analysis, $df_rule->branch_code, $df_rule->funnel_dataflow_rule, $df_rule->to_analysis);
my $from_node_name = $self->_analysis_node_name( $from_analysis );
my $target_node_name;
# Different treatment for analyses and tables:
if(UNIVERSAL::isa($target_object, 'Bio::EnsEMBL::Hive::Analysis')) {
$target_node_name = $self->_analysis_node_name( $target_object );
} elsif(UNIVERSAL::isa($target_object, 'Bio::EnsEMBL::Hive::NakedTable')) {
$target_node_name = $self->_table_node_name( $df_rule );
$self->_add_table_node($target_node_name, $target_object);
} elsif(UNIVERSAL::isa($target_object, 'Bio::EnsEMBL::Hive::Accumulator')) {
$target_node_name =
_midpoint_name( $from_analysis->{
'_funnel_dfr'} );
} else {
warn('Do not know how to handle the type '.ref($target_object));
next;
}
# a rule needs a midpoint either if it HAS a funnel or if it IS a funnel
if( $funnel_dataflow_rule or $df_rule->{'_is_a_funnel'} ) {
$graph->add_node( $midpoint_name, # midpoint itself
color => $dataflow_colour,
label => '',
shape => 'point',
fixedsize => 1,
width => 0.01,
height => 0.01,
);
$graph->add_edge( $from_node_name => $midpoint_name, # first half of the two-part arrow
color => $dataflow_colour,
arrowhead => 'none',
fontname => $df_edge_fontname,
fontcolor => $dataflow_colour,
label => '#'.$branch_code,
);
$graph->add_edge( $midpoint_name => $target_node_name, # second half of the two-part arrow
color => $dataflow_colour,
);
if($funnel_dataflow_rule) {
$graph->add_edge( $midpoint_name =>
_midpoint_name( $funnel_dataflow_rule ), # semaphore inter-rule link
color => $semablock_colour,
style => 'dashed',
arrowhead => 'tee',
dir => 'both',
arrowtail => 'crow',
);
}
} elsif(UNIVERSAL::isa($target_object, 'Bio::EnsEMBL::Hive::Accumulator')) {
# one-part dashed arrow:
$graph->add_edge( $from_node_name => $target_node_name,
color => $accu_colour,
style => 'dashed',
label => $target_object->struct_name().'#'.$branch_code,
fontname => $df_edge_fontname,
fontcolor => $accu_colour,
dir => 'both',
arrowtail => 'crow',
);
} else {
# one-part solid arrow:
$graph->add_edge( $from_node_name => $target_node_name,
color => $dataflow_colour,
fontname => $df_edge_fontname,
fontcolor => $dataflow_colour,
label => '#'.$branch_code,
);
} # /if( "$df_rule needs a midpoint" )
} # /foreach my $df_rule (@$dataflow_rules)
}