package Bio::Graphics::Browser2::Plugin::RandomGene;
# $Id: RandomGene.pm,v 1.2 2005-12-09 22:19:09 mwz444 Exp $
# test plugin
use strict;
use Bio::Graphics::Browser2::Plugin;
use Bio::Graphics::Feature;
use CGI qw(:standard *table);
use vars '$VERSION','@ISA';
$VERSION = '0.3';
@ISA = qw(Bio::Graphics::Browser2::Plugin);
sub name { "Simulated Genes" }
sub description {
p("The simulated gene plugin generates random genes",
"on the current view.").
p("It was written to illustrate how annotation plugins work.");
}
sub type { 'annotator' }
sub init { }
sub config_defaults {
my $self = shift;
return { gene_size => 5_000,
exon_size => 100,
intron_size => 500,
};
}
sub reconfigure {
my $self = shift;
my $current_config = $self->configuration;
my $defaults = $self->config_defaults;
for my $size ('exon_size','intron_size','gene_size') {
my $new_size = $self->config_param($size);
if ($new_size > 0 and $new_size < 1_000_000) { # sanity check
$current_config->{$size} = $new_size;
} else { # doesn't pass check, so go to defaults
$current_config->{$size} = $defaults->{$size};
}
}
}
sub configure_form {
my $self = shift;
my $current_config = $self->configuration;
return
"Average length of simulated gene: ".textfield(-name=>$self->config_name('gene_size'),
-default=>$current_config->{gene_size}
)
.br().
"Average length of simulated exon: ".textfield(-name=>$self->config_name('exon_size'),
-default=>$current_config->{exon_size}
)
.br().
"Average length of simulated intron: ".textfield(-name=>$self->config_name('intron_size'),
-default=>$current_config->{intron_size}
);
}
sub annotate {
my $self = shift;
my $segment = shift;
my $dna = $segment->seq;
my $abs_start = $segment->start;
my $end = $segment->end;
my $length = $segment->length;
my $exon_size = $self->configuration->{exon_size};
my $gene_size = $self->configuration->{gene_size};
my $intron_size = $self->configuration->{intron_size};
my $feature_list = Bio::Graphics::FeatureFile->new;
$feature_list->add_type('gene' => {glyph => 'transcript2',
key => 'simulated gene',
bgcolor => 'blue',
});
for (1..5) {
my $gene_start = int(rand($length));
my $gene_end = $gene_start+int(rand($gene_size));
my $strand = rand > 0.5 ? +1 : -1;
my $name = sprintf("GMOD%010d",rand(1E6));
my $gene = Bio::Graphics::Feature->new(-start=>$abs_start+$gene_start,
-end =>$abs_start+$gene_end,
-display_name => $name,
-type=>'gene',
-strand => $strand,
-url => "http://www.google.com/search?q=$name",
);
my $exon_start = $gene_start;
my $exon_end;
do {
$exon_end = $exon_start + int(rand($exon_size));
$exon_end = $gene_end if $exon_end > $gene_end;
my $exon_feature = Bio::Graphics::Feature->new(-start=>$abs_start+$exon_start,
-end =>$abs_start+$exon_end,
-type => 'exon',
-strand => $strand,
);
$gene->add_segment($exon_feature);
$exon_start = $exon_end + int(rand($intron_size));
} until ($exon_end >= $gene_end);
$feature_list->add_feature($gene,'gene');
}
return $feature_list;
}
1;