Mercurial > repos > mahtabm > ensembl
comparison variant_effect_predictor/Bio/Graphics/Glyph/dna.pm @ 0:1f6dce3d34e0
Uploaded
| author | mahtabm | 
|---|---|
| date | Thu, 11 Apr 2013 02:01:53 -0400 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| -1:000000000000 | 0:1f6dce3d34e0 | 
|---|---|
| 1 package Bio::Graphics::Glyph::dna; | |
| 2 | |
| 3 use strict; | |
| 4 use Bio::Graphics::Glyph::generic; | |
| 5 use vars '@ISA'; | |
| 6 @ISA = qw(Bio::Graphics::Glyph::generic); | |
| 7 | |
| 8 my %complement = (g=>'c',a=>'t',t=>'a',c=>'g',n=>'n', | |
| 9 G=>'C',A=>'T',T=>'A',C=>'G',N=>'N'); | |
| 10 | |
| 11 # turn off description | |
| 12 sub description { 0 } | |
| 13 | |
| 14 # turn off label | |
| 15 # sub label { 1 } | |
| 16 | |
| 17 sub height { | |
| 18 my $self = shift; | |
| 19 my $font = $self->font; | |
| 20 return $self->dna_fits ? 2*$font->height | |
| 21 : $self->do_gc ? $self->SUPER::height | |
| 22 : 0; | |
| 23 } | |
| 24 | |
| 25 sub do_gc { | |
| 26 my $self = shift; | |
| 27 my $do_gc = $self->option('do_gc'); | |
| 28 return if defined($do_gc) && !$do_gc; | |
| 29 return 1; | |
| 30 } | |
| 31 | |
| 32 sub draw_component { | |
| 33 my $self = shift; | |
| 34 my $gd = shift; | |
| 35 my ($x1,$y1,$x2,$y2) = $self->bounds(@_); | |
| 36 | |
| 37 my $dna = eval { $self->feature->seq }; | |
| 38 $dna = $dna->seq if ref($dna) and $dna->can('seq'); # to catch Bio::PrimarySeqI objects | |
| 39 $dna or return; | |
| 40 | |
| 41 # workaround for my misreading of interface -- LS | |
| 42 $dna = $dna->seq if ref($dna) && $dna->can('seq'); | |
| 43 | |
| 44 if ($self->dna_fits) { | |
| 45 $self->draw_dna($gd,$dna,$x1,$y1,$x2,$y2); | |
| 46 } elsif ($self->do_gc) { | |
| 47 $self->draw_gc_content($gd,$dna,$x1,$y1,$x2,$y2); | |
| 48 } | |
| 49 } | |
| 50 | |
| 51 sub draw_dna { | |
| 52 my $self = shift; | |
| 53 | |
| 54 my ($gd,$dna,$x1,$y1,$x2,$y2) = @_; | |
| 55 my $pixels_per_base = $self->scale; | |
| 56 | |
| 57 my $feature = $self->feature; | |
| 58 | |
| 59 my $strand = $feature->strand; | |
| 60 $strand *= -1 if $self->{flip}; | |
| 61 | |
| 62 my @bases = split '',$strand >= 0 ? $dna : $self->reversec($dna); | |
| 63 my $color = $self->fgcolor; | |
| 64 my $font = $self->font; | |
| 65 my $lineheight = $font->height; | |
| 66 $y1 -= $lineheight/2 - 3; | |
| 67 my $strands = $self->option('strand') || 'auto'; | |
| 68 | |
| 69 my ($forward,$reverse); | |
| 70 if ($strands eq 'auto') { | |
| 71 $forward = $feature->strand >= 0; | |
| 72 $reverse = $feature->strand <= 0; | |
| 73 } elsif ($strands eq 'both') { | |
| 74 $forward = $reverse = 1; | |
| 75 } elsif ($strands eq 'reverse') { | |
| 76 $reverse = 1; | |
| 77 } else { | |
| 78 $forward = 1; | |
| 79 } | |
| 80 | |
| 81 my $start = $self->map_no_trunc($feature->start); | |
| 82 my $end = $self->map_no_trunc($feature->end); | |
| 83 | |
| 84 my $offset = int(($x1-$start-1)/$pixels_per_base); | |
| 85 | |
| 86 for (my $i=$offset;$i<@bases;$i++) { | |
| 87 my $x = $start + $i * $pixels_per_base; | |
| 88 next if $x+1 < $x1; | |
| 89 last if $x > $x2; | |
| 90 $gd->char($font,$x+1,$y1,$bases[$i],$color) if $forward; | |
| 91 $gd->char($font,$x+1,$y1+($forward ? $lineheight:0),$complement{$bases[$i]}||$bases[$i],$color) if $reverse; | |
| 92 } | |
| 93 | |
| 94 } | |
| 95 | |
| 96 sub draw_gc_content { | |
| 97 my $self = shift; | |
| 98 my $gd = shift; | |
| 99 my $dna = shift; | |
| 100 my ($x1,$y1,$x2,$y2) = @_; | |
| 101 | |
| 102 my $bin_size = length($dna) / ($self->option('gc_bins') || 100); | |
| 103 $bin_size = 100 if $bin_size < 100; | |
| 104 | |
| 105 my @bins; | |
| 106 for (my $i = 0; $i < length($dna) - $bin_size; $i+= $bin_size) { | |
| 107 my $subseq = substr($dna,$i,$bin_size); | |
| 108 my $gc = $subseq =~ tr/gcGC/gcGC/; | |
| 109 my $content = $gc/$bin_size; | |
| 110 push @bins,$content; | |
| 111 } | |
| 112 push @bins,0.5 unless @bins; # avoid div by zero | |
| 113 my $bin_width = ($x2-$x1)/@bins; | |
| 114 my $bin_height = $y2-$y1; | |
| 115 my $fgcolor = $self->fgcolor; | |
| 116 my $bgcolor = $self->factory->translate_color($self->panel->gridcolor); | |
| 117 my $axiscolor = $self->color('axis_color') || $fgcolor; | |
| 118 | |
| 119 $gd->line($x1, $y1, $x1, $y2, $axiscolor); | |
| 120 $gd->line($x2-2,$y1, $x2-2,$y2, $axiscolor); | |
| 121 $gd->line($x1, $y1, $x1+3,$y1, $axiscolor); | |
| 122 $gd->line($x1, $y2, $x1+3,$y2, $axiscolor); | |
| 123 $gd->line($x1, ($y2+$y1)/2,$x1+3,($y2+$y1)/2,$axiscolor); | |
| 124 $gd->line($x2-4,$y1, $x2-1, $y1, $axiscolor); | |
| 125 $gd->line($x2-4,$y2, $x2-1, $y2, $axiscolor); | |
| 126 $gd->line($x2-4,($y2+$y1)/2,$x2-1,($y2+$y1)/2,$axiscolor); | |
| 127 $gd->line($x1+5,$y2, $x2-5,$y2, $bgcolor); | |
| 128 $gd->line($x1+5,($y2+$y1)/2,$x2-5,($y2+$y1)/2,$bgcolor); | |
| 129 $gd->line($x1+5,$y1, $x2-5,$y1, $bgcolor); | |
| 130 $gd->string($self->font,$x1+5,$y1,'% gc',$axiscolor) if $bin_height > $self->font->height*2; | |
| 131 | |
| 132 for (my $i = 0; $i < @bins; $i++) { | |
| 133 my $bin_start = $x1+$i*$bin_width; | |
| 134 my $bin_stop = $bin_start + $bin_width; | |
| 135 my $y = $y2 - ($bin_height*$bins[$i]); | |
| 136 $gd->line($bin_start,$y,$bin_stop,$y,$fgcolor); | |
| 137 $gd->line($bin_stop,$y,$bin_stop,$y2 - ($bin_height*$bins[$i+1]),$fgcolor) | |
| 138 if $i < @bins-1; | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 sub make_key_feature { | |
| 143 my $self = shift; | |
| 144 my @gatc = qw(g a t c); | |
| 145 my $offset = $self->panel->offset; | |
| 146 my $scale = 1/$self->scale; # base pairs/pixel | |
| 147 | |
| 148 my $start = $offset+1; | |
| 149 my $stop = $offset+100*$scale; | |
| 150 my $feature = | |
| 151 Bio::Graphics::Feature->new(-start=> $start, | |
| 152 -stop => $stop, | |
| 153 -seq => join('',map{$gatc[rand 4]} (1..500)), | |
| 154 -name => $self->option('key'), | |
| 155 -strand => '+1', | |
| 156 ); | |
| 157 $feature; | |
| 158 } | |
| 159 | |
| 160 1; | |
| 161 | |
| 162 __END__ | |
| 163 | |
| 164 =head1 NAME | |
| 165 | |
| 166 Bio::Graphics::Glyph::dna - The "dna" glyph | |
| 167 | |
| 168 =head1 SYNOPSIS | |
| 169 | |
| 170 See L<Bio::Graphics::Panel> and L<Bio::Graphics::Glyph>. | |
| 171 | |
| 172 =head1 DESCRIPTION | |
| 173 | |
| 174 This glyph draws DNA sequences. At high magnifications, this glyph | |
| 175 will draw the actual base pairs of the sequence (both strands). At | |
| 176 low magnifications, the glyph will plot the GC content. | |
| 177 | |
| 178 For this glyph to work, the feature must return a DNA sequence string | |
| 179 in response to the dna() method. | |
| 180 | |
| 181 =head2 OPTIONS | |
| 182 | |
| 183 The following options are standard among all Glyphs. See | |
| 184 L<Bio::Graphics::Glyph> for a full explanation. | |
| 185 | |
| 186 Option Description Default | |
| 187 ------ ----------- ------- | |
| 188 | |
| 189 -fgcolor Foreground color black | |
| 190 | |
| 191 -outlinecolor Synonym for -fgcolor | |
| 192 | |
| 193 -bgcolor Background color turquoise | |
| 194 | |
| 195 -fillcolor Synonym for -bgcolor | |
| 196 | |
| 197 -linewidth Line width 1 | |
| 198 | |
| 199 -height Height of glyph 10 | |
| 200 | |
| 201 -font Glyph font gdSmallFont | |
| 202 | |
| 203 -connector Connector type 0 (false) | |
| 204 | |
| 205 -connector_color | |
| 206 Connector color black | |
| 207 | |
| 208 -label Whether to draw a label 0 (false) | |
| 209 | |
| 210 -description Whether to draw a description 0 (false) | |
| 211 | |
| 212 In addition to the common options, the following glyph-specific | |
| 213 options are recognized: | |
| 214 | |
| 215 Option Description Default | |
| 216 ------ ----------- ------- | |
| 217 | |
| 218 -do_gc Whether to draw the GC true | |
| 219 graph at low mags | |
| 220 | |
| 221 -gc_bins Fixed number of intervals 100 | |
| 222 to sample across the | |
| 223 panel. | |
| 224 | |
| 225 -axis_color Color of the vertical axes fgcolor | |
| 226 in the GC content graph | |
| 227 | |
| 228 -strand Show both forward and auto | |
| 229 reverse strand, one of | |
| 230 "forward", "reverse", | |
| 231 "both" or "auto". | |
| 232 In "auto" mode, | |
| 233 +1 strand features will | |
| 234 show the plus strand | |
| 235 -1 strand features will | |
| 236 show the reverse complement | |
| 237 and strandless features will | |
| 238 show both | |
| 239 | |
| 240 =head1 BUGS | |
| 241 | |
| 242 Please report them. | |
| 243 | |
| 244 =head1 SEE ALSO | |
| 245 | |
| 246 L<Bio::Graphics::Panel>, | |
| 247 L<Bio::Graphics::Glyph>, | |
| 248 L<Bio::Graphics::Glyph::arrow>, | |
| 249 L<Bio::Graphics::Glyph::cds>, | |
| 250 L<Bio::Graphics::Glyph::crossbox>, | |
| 251 L<Bio::Graphics::Glyph::diamond>, | |
| 252 L<Bio::Graphics::Glyph::dna>, | |
| 253 L<Bio::Graphics::Glyph::dot>, | |
| 254 L<Bio::Graphics::Glyph::ellipse>, | |
| 255 L<Bio::Graphics::Glyph::extending_arrow>, | |
| 256 L<Bio::Graphics::Glyph::generic>, | |
| 257 L<Bio::Graphics::Glyph::graded_segments>, | |
| 258 L<Bio::Graphics::Glyph::heterogeneous_segments>, | |
| 259 L<Bio::Graphics::Glyph::line>, | |
| 260 L<Bio::Graphics::Glyph::pinsertion>, | |
| 261 L<Bio::Graphics::Glyph::primers>, | |
| 262 L<Bio::Graphics::Glyph::rndrect>, | |
| 263 L<Bio::Graphics::Glyph::segments>, | |
| 264 L<Bio::Graphics::Glyph::ruler_arrow>, | |
| 265 L<Bio::Graphics::Glyph::toomany>, | |
| 266 L<Bio::Graphics::Glyph::transcript>, | |
| 267 L<Bio::Graphics::Glyph::transcript2>, | |
| 268 L<Bio::Graphics::Glyph::translation>, | |
| 269 L<Bio::Graphics::Glyph::triangle>, | |
| 270 L<Bio::DB::GFF>, | |
| 271 L<Bio::SeqI>, | |
| 272 L<Bio::SeqFeatureI>, | |
| 273 L<Bio::Das>, | |
| 274 L<GD> | |
| 275 | |
| 276 =head1 AUTHOR | |
| 277 | |
| 278 Lincoln Stein E<lt>lstein@cshl.orgE<gt>. | |
| 279 | |
| 280 Copyright (c) 2001 Cold Spring Harbor Laboratory | |
| 281 | |
| 282 This library is free software; you can redistribute it and/or modify | |
| 283 it under the same terms as Perl itself. See DISCLAIMER.txt for | |
| 284 disclaimers of warranty. | |
| 285 | |
| 286 =cut | 
