package Bio::Graphics::Browser2::Plugin::CpGIslandAnnotator;
use strict;
use Bio::Graphics::Browser2::Plugin;
use CGI qw(:standard *table);
use vars '$VERSION','@ISA';
$VERSION = '1.0';
@ISA = qw(Bio::Graphics::Browser2::Plugin);
sub name { "CpG Islands" }
sub description {
p("This plugin calculates and displays the ratio of observed/expected CG ".
"dimers over a user specified interval (default 400bp).");
}
sub type { 'annotator' }
sub init{
}
sub config_defaults {
return { window_size => 400 };
}
sub reconfigure {
my $self = shift;
my $current_config = $self->configuration;
my $defaults = $self->config_defaults;
my $ws = $self->config_param('window_size');
if ($ws >= 50 && $ws <= 2000) {
$current_config->{window_size} = $ws;
} else {
$current_config->{window_size} = $defaults->{window_size};
}
}
sub configure_form {
my $self = shift;
my $current_config = $self->configuration;
return table( TR( th( "Window Size: " ),
td( textfield(-name => $self->config_name('window_size'),
-value => $current_config->{window_size},
-size => 12,
-maxlength => 4) )
)
);
}
sub annotate {
my $self = shift;
my $segment = shift;
my $window = $self->configuration->{window_size};
my $start = $segment->start;
my $ref = $segment->seq_id;
my $dna = $segment->seq;
$dna = $dna->seq if ref $dna;
$dna =~ tr/[a-z]/[A-Z]/;
my $length = length $dna;
#####
## Add feature types
my $feature_list = $self->new_feature_list;
my $cg = sub{ ($_[0]>.9) ? 'red' : ($_[0]>.8) ? 'orange' : ($_[0]>.7) ? 'yellow' :
($_[0]>.6) ? 'green' : ($_[0]>.3) ? 'blue' : 'white'; };
$feature_list->add_type("CpGIslands" =>{ glyph => 'segments',
key => 'CpG Islands',
bgcolor => sub{ $cg->(shift->attributes('RATIO')); },
fgcolor => sub{ $cg->(shift->attributes('RATIO')); },
height => sub{ sprintf("%3.0f", shift->attributes('OBSERVED')); },
label => sub{ ($length < 10001) ? sprintf("%5.2f", shift->attributes('RATIO')) : 0 ; },
bump => 0,
});
#####
## Find dimer info
my $window_start = $window - $start%$window;
for (my $i=$window_start; $i<$length; $i+=$window) {
my $subseq = substr($dna, $i, $window);
my %attr = ProcessSeq($subseq);
next unless $attr{RATIO};
my $feature = Bio::Graphics::Feature->new( -start => $start+$i,
-stop => $start+$i+$window,
-ref => $ref,
-name => "
Ratio: $attr{RATIO}".
"
Observed: $attr{OBSERVED}".
"
Expected: ".int($attr{EXPECTED}+.5).
"
",
-type => "CpGIslands",
-attributes => \%attr);
$feature_list->add_feature($feature => 'CpGIslands');
}
return $feature_list;
}
sub ProcessSeq {
my $seq = shift;
my $len = length $seq;
my %counts;
$counts{OBSERVED}++ while $seq=~/CG/g;
$counts{OBSERVED} ||= 0;
my $C = $seq=~tr/C/C/;
my $G = $seq=~tr/G/G/;
$counts{EXPECTED} = sprintf("%3.5f", $C*$G/$len);
return %counts if $counts{EXPECTED} == 0;
$counts{RATIO} = sprintf("%3.5f", $counts{OBSERVED}/$counts{EXPECTED});
return %counts;
}
1;
__END__
=head1 NAME
Bio::Graphics::Browser2::Plugin::CpGPluginAnnotator - Display CpG Island observed/expected ratios
=head1 SYNOPSIS
In the appropriate gbrowse configuration file:
plugins = CpGPluginAnnotator
=head1 DESCRIPTION
This plugin displays the ratio of observed/expected for CG dimers over a user-specified
interval (default 400 bp). The coloring of the features is based on the ratio, with red
being the higest range and blue the lowest. The height is equal to number of CG dimers
actually observed.
=head1 BUGS
None known yet
=head1 SEE ALSO
L
=head1 AUTHOR
Joseph Bullard Ejtb4478@rit.eduE.
=cut