moving more stuff
[cview.git] / lib / CXGN / Cview / Marker / RangeMarker.pm
blob6a4982265ebd8025301ff2517f58d4f0c9e715f0
2 =head1 NAME
4 CXGN::Cview::Marker::RangeMarker - a class to draw markers that represent ranges
6 =head1 DESCRIPTION
8 CXGN::Cview::Marker::RangeMarker inherits from L<CXGN::Cview::Marker>.
10 my $m = CXGN::Cview::Marker::RangeMarker->new();
11 $m->set_offset(30);
12 $m->set_north_range(10);
13 $m->set_south_range(10);
15 This will render the marker
17 Chr
19 |_ _
20 | | | north range
21 | |___marker _|
22 | | |
23 | | | south range
24 |- -
28 =head1 AUTHOR
30 Lukas Mueller (lam87@cornell.edu)
32 =head1 FUNCTIONS
34 This class implements the following functions:
36 =cut
38 use strict;
39 use CXGN::Cview::Marker;
40 use CXGN::Cview::Label::RangeLabel;
42 package CXGN::Cview::Marker::RangeMarker;
44 use base qw / CXGN::Cview::Marker /;
46 =head2 function new
48 Synopsis:
49 Arguments:
50 Returns:
51 Side effects:
52 Description:
54 =cut
56 sub new {
57 my $class = shift;
58 my $chromosome = shift;
59 my $self = $class -> SUPER::new($chromosome);
61 my $range_label = CXGN::Cview::Label::RangeLabel->new();
62 $range_label->set_horizontal_offset($self->get_label()->get_horizontal_offset());
63 $range_label->set_vertical_offset($self->get_label()->get_vertical_offset());
64 $range_label->set_name($self->get_label()->get_name());
65 $range_label->set_reference_point($self->get_label()->get_reference_point());
66 $range_label->set_enclosing_rect($self->get_label()->get_enclosing_rect());
67 $self->set_label($range_label);
69 $self->get_label()->set_stacking_level(1);
70 $self->set_label_side("right");
71 $self->set_hilite_chr_region(0);
72 $self->set_region_hilite_color(100, 100, 150);
73 return $self;
76 =head2 functions get_north_range(), set_north_range()
78 Synopsis: $m->get_north_range()
79 Arguments: setter: the north range of the range marker
80 in the units of the map
81 Returns: getter: the north range
82 Side effects: the markers range drawn on the northern side
83 reflects this value
84 Description:
86 =cut
88 sub get_north_range {
89 my $self=shift;
90 return $self->{north_range};
94 sub set_north_range {
95 my $self=shift;
96 my $cM = shift;
97 $self->{north_range}=$cM;
101 =head2 functions get_south_range(), set_south_range()
103 Synopsis: see north range
104 Arguments:
105 Returns:
106 Side effects:
107 Description:
109 =cut
111 sub get_south_range {
112 my $self=shift;
114 return $self->{south_range};
117 sub set_south_range {
118 my $self=shift;
119 my $cM = shift;
120 $self->{south_range}=$cM;
126 sub render {
127 my $self = shift;
128 my $image = shift;
130 # calculate the pos in pixels of the northern range limit
132 my $north_pixels = $self->get_chromosome()->mapunits2pixels($self->get_offset()) + $self->get_chromosome()->get_vertical_offset() - $self->get_chromosome()->mapunits2pixels($self->get_north_range());
134 # determine the pixels of the southern limit
136 my $south_pixels = $self->get_chromosome()->mapunits2pixels($self->get_offset()) + $self->get_chromosome()->get_vertical_offset() + $self->get_chromosome()->mapunits2pixels($self->get_south_range());
137 # print STDERR "cM = ".$self->get_north_range().", pixels= $north_pixels\n";
138 # print STDERR "cM = ".$self->get_south_range().", pixels= $south_pixels\n";
140 $self->get_label()->set_north_position($north_pixels);
141 $self->get_label()->set_south_position($south_pixels);
143 if ($self->get_label_side() eq "right") {
144 $self->get_label()->set_reference_point($self->get_chromosome()->get_horizontal_offset()+int($self->get_chromosome()->get_width()/2)+$self->get_label()->get_stacking_height()*($self->get_label()->get_stacking_level()), int($north_pixels+$south_pixels)/2);
146 elsif ($self->get_label_side() eq "left") {
147 $self->get_label()->set_reference_point($self->get_chromosome()->get_horizontal_offset()-int($self->get_chromosome()->get_width()/2)-$self->get_label()->get_stacking_height()*$self->get_label()->get_stacking_level(), int($north_pixels+$south_pixels)/2);
149 else {
150 die "[RangeMarker.pm] label_side can either be right or left. Sorry.";
152 if ($self->get_hilite_chr_region()) {
153 $self->hilite_chr_region($image);
156 $self->SUPER::render($image);
160 =head2 accessors set_region_hilite_color, get_region_hilite_color
162 Property:
163 Setter Args:
164 Getter Args:
165 Getter Ret:
166 Side Effects:
167 Description:
169 =cut
171 sub get_region_hilite_color {
172 my $self=shift;
173 return @{$self->{region_hilite_color}};
176 sub set_region_hilite_color {
177 my $self=shift;
178 @{$self->{region_hilite_color}}= (shift, shift, shift);
183 =head2 accessors set_hilite_chr_region(), get_hilite_chr_region()
185 Property:
186 Setter Args:
187 Getter Args:
188 Getter Ret:
189 Side Effects:
190 Description:
192 =cut
194 sub get_hilite_chr_region {
195 my $self=shift;
196 return $self->{hilite_chr_region};
199 sub set_hilite_chr_region {
200 my $self=shift;
201 $self->{hilite_chr_region}=shift;
206 sub hilite_chr_region {
207 my $self = shift;
208 my $image = shift;
210 my $north_pixels = $self->get_label()->get_north_position();
211 my $south_pixels = $self->get_label()->get_south_position();
213 # hilite only regions that are visible
215 if ($north_pixels < 0) { $north_pixels = 0; }
216 my $chr_end_pixels = ($self->get_chromosome()->get_height()+$self->get_chromosome()->get_vertical_offset());
217 if ($north_pixels > $chr_end_pixels) {
218 $north_pixels = $chr_end_pixels;
221 my $left_pixels = $self->get_chromosome()->get_horizontal_offset()-$self->get_chromosome()->get_width()/2+1;
222 my $right_pixels = $self->get_chromosome()->get_horizontal_offset()+$self->get_chromosome()->get_width()/2-1;
224 #print STDERR "North: $north_pixels South: $south_pixels. left: $left_pixels. Right: $right_pixels\n";
226 $image->filledRectangle($left_pixels, $north_pixels, $right_pixels, $south_pixels, $image->colorAllocate($self->get_region_hilite_color()));
229 sub draw_tick {
230 my $self = shift;
231 my $image = shift;
232 my $color = $image -> colorResolve($self->get_color());
233 my $halfwidth = int($self->get_chromosome->get_width/2);
234 my $north_y = $self->get_chromosome()->get_vertical_offset() + $self->get_chromosome()->mapunits2pixels($self->get_offset()-$self->get_north_range());
236 my $south_y = $self->get_chromosome()->get_vertical_offset() + $self->get_chromosome()->mapunits2pixels($self->get_offset()+$self->get_south_range());
238 if ($self->get_show_tick()) {
239 $image -> line($self->get_chromosome()->get_horizontal_offset() - $halfwidth +1, $north_y, $self->get_chromosome()->get_horizontal_offset()+$halfwidth-1, $north_y, $color);
240 $image -> line($self->get_chromosome()->get_horizontal_offset() - $halfwidth +1, $south_y, $self->get_chromosome()->get_horizontal_offset()+$halfwidth-1, $south_y, $color);
245 return 1;