Embl2picture
From BioPerl
#!/usr/bin/perl # file: embl2picture.pl # This is code example 6 in the Graphics-HOWTO # Author: Lincoln Stein use strict; use lib "$ENV{HOME}/projects/bioperl-live"; use Bio::Graphics; use Bio::SeqIO; use constant USAGE =><<END; Usage: $0 <file> Render a GenBank/EMBL entry into drawable form. Return as a GIF or PNG image on standard output. File must be in embl, genbank, or another SeqIO- recognized format. Only the first entry will be rendered. Example to try: embl2picture.pl factor7.embl | display - END my $file = shift or die USAGE; my $io = Bio::SeqIO->new(-file=>$file) or die USAGE; my $seq = $io->next_seq or die USAGE; my $wholeseq = Bio::SeqFeature::Generic->new(-start=>1,-end=>$seq->length, -display_name=>$seq->display_name); my @features = $seq->all_SeqFeatures; # sort features by their primary tags my %sorted_features; for my $f (@features) { my $tag = $f->primary_tag; push @{$sorted_features{$tag}},$f; } my $panel = Bio::Graphics::Panel->new( -length => $seq->length, -key_style => 'between', -width => 800, -pad_left => 10, -pad_right => 10, ); $panel->add_track($wholeseq, -glyph => 'arrow', -bump => 0, -double=>1, -tick => 2); $panel->add_track($wholeseq, -glyph => 'generic', -bgcolor => 'blue', -label => 1, ); # special cases if ($sorted_features{CDS}) { $panel->add_track($sorted_features{CDS}, -glyph => 'transcript2', -bgcolor => 'orange', -fgcolor => 'black', -font2color => 'red', -key => 'CDS', -bump => +1, -height => 12, -label => \&gene_label, -description=> \&gene_description, ); delete $sorted_features{'CDS'}; } if ($sorted_features{tRNA}) { $panel->add_track($sorted_features{tRNA}, -glyph => 'transcript2', -bgcolor => 'red', -fgcolor => 'black', -font2color => 'red', -key => 'tRNAs', -bump => +1, -height => 12, -label => \&gene_label, ); delete $sorted_features{tRNA}; } # general case my @colors = qw(cyan orange blue purple green chartreuse magenta yellow aqua); my $idx = 0; for my $tag (sort keys %sorted_features) { my $features = $sorted_features{$tag}; $panel->add_track($features, -glyph => 'generic', -bgcolor => $colors[$idx++ % @colors], -fgcolor => 'black', -font2color => 'red', -key => "${tag}s", -bump => +1, -height => 8, -description => \&generic_description ); } print $panel->png; exit 0; sub gene_label { my $feature = shift; my @notes; foreach (qw(product gene)) { next unless $feature->has_tag($_); @notes = $feature->each_tag_value($_); last; } $notes[0]; } sub gene_description { my $feature = shift; my @notes; foreach (qw(note)) { next unless $feature->has_tag($_); @notes = $feature->each_tag_value($_); last; } return unless @notes; substr($notes[0],30) = '...' if length $notes[0] > 30; $notes[0]; } sub generic_description { my $feature = shift; my $description; foreach ($feature->all_tags) { my @values = $feature->each_tag_value($_); $description .= $_ eq 'note' ? "@values" : "$_=@values; "; } $description =~ s/; $//; # get rid of last $description; }