Merge pull request #5 from solgenomics/topic/fix_il_maps
[cview.git] / lib / CXGN / Cview / Marker / RangeMarker.pm
blobc26b45ece7101adc183c827a0dceae909e14c2b4
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 $self = $class -> SUPER::new(@_);
60 my $range_label = CXGN::Cview::Label::RangeLabel->new();
61 $range_label->set_horizontal_offset($self->get_label()->get_horizontal_offset());
62 $range_label->set_vertical_offset($self->get_label()->get_vertical_offset());
63 $range_label->set_name($self->get_label()->get_name());
64 $range_label->set_reference_point($self->get_label()->get_reference_point());
65 $range_label->set_enclosing_rect($self->get_label()->get_enclosing_rect());
66 $self->set_label($range_label);
68 $self->get_label()->set_stacking_level(1);
69 $self->set_label_side("right");
70 $self->set_hilite_chr_region(0);
71 $self->set_region_hilite_color(100, 100, 150);
72 return $self;
75 =head2 functions get_north_range(), set_north_range()
77 Synopsis: $m->get_north_range()
78 Arguments: setter: the north range of the range marker
79 in the units of the map
80 Returns: getter: the north range
81 Side effects: the markers range drawn on the northern side
82 reflects this value
83 Description:
85 =cut
87 sub get_north_range {
88 my $self=shift;
89 return $self->{north_range};
93 sub set_north_range {
94 my $self=shift;
95 my $cM = shift;
96 $self->{north_range}=$cM;
100 =head2 functions get_south_range(), set_south_range()
102 Synopsis: see north range
103 Arguments:
104 Returns:
105 Side effects:
106 Description:
108 =cut
110 sub get_south_range {
111 my $self=shift;
113 return $self->{south_range};
116 sub set_south_range {
117 my $self=shift;
118 my $cM = shift;
119 $self->{south_range}=$cM;
124 sub render {
125 my $self = shift;
126 my $image = shift;
128 # calculate the pos in pixels of the northern range limit
130 my $north_pixels = $self->get_chromosome()->mapunits2pixels($self->get_offset()) + $self->get_chromosome()->get_vertical_offset() - $self->get_chromosome()->mapunits2pixels($self->get_north_range());
132 # determine the pixels of the southern limit
134 my $south_pixels = $self->get_chromosome()->mapunits2pixels($self->get_offset()) + $self->get_chromosome()->get_vertical_offset() + $self->get_chromosome()->mapunits2pixels($self->get_south_range());
135 # print STDERR "cM = ".$self->get_north_range().", pixels= $north_pixels\n";
136 # print STDERR "cM = ".$self->get_south_range().", pixels= $south_pixels\n";
138 $self->get_label()->set_north_position($north_pixels);
139 $self->get_label()->set_south_position($south_pixels);
140 my $halfwidth = int($self->get_chromosome()->get_width()/2);
141 if ($self->get_label_side() eq "right") {
142 $self->get_label()->set_reference_point($self->get_chromosome()->get_horizontal_offset()+$halfwidth+$self->get_label()->get_stacking_height()*($self->get_label()->get_stacking_level()), int(($north_pixels+$south_pixels)/2));
144 elsif ($self->get_label_side() eq "left") {
145 $self->get_label()->set_reference_point($self->get_chromosome()->get_horizontal_offset()-$halfwidth-$self->get_label()->get_stacking_height()*$self->get_label()->get_stacking_level(), int(($north_pixels+$south_pixels)/2));
147 else {
148 die "[RangeMarker.pm] label_side can either be right or left. Sorry.";
150 if ($self->get_hilite_chr_region()) {
151 $self->hilite_chr_region($image);
154 $self->get_offset_label()->set_label_text($self->get_offset());
155 # draw the offset on the right if label_side eq left, if display_marker
156 # # offset is true in the chromosome object
158 # if ($self->get_chromosome()->{display_marker_offset}) {
160 # # define the label's reference point
162 # my $offset_label = $self->get_offset_label();
163 # $offset_label->set_reference_point($self->get_chromosome()->get_horizontal_offset()+$halfwidth, int(($north_pixels+$south_pixels)/2));
164 # $offset_label->set_horizontal_offset($self->get_chromosome()->get_horizontal_offset()+ $self->get_label()->get_label_spacer() );
165 # $offset_label->set_vertical_offset($self->get_label()->get_vertical_offset());
166 # $offset_label->set_align_side("left");
168 # $offset_label->set_hidden($self->get_label()->is_hidden());
169 # $offset_label->render($image);
173 $self->SUPER::render($image);
177 =head2 accessors set_region_hilite_color, get_region_hilite_color
179 Property:
180 Setter Args:
181 Getter Args:
182 Getter Ret:
183 Side Effects:
184 Description:
186 =cut
188 sub get_region_hilite_color {
189 my $self=shift;
190 return @{$self->{region_hilite_color}};
193 sub set_region_hilite_color {
194 my $self=shift;
195 @{$self->{region_hilite_color}}= (shift, shift, shift);
200 =head2 accessors set_hilite_chr_region(), get_hilite_chr_region()
202 Property:
203 Setter Args:
204 Getter Args:
205 Getter Ret:
206 Side Effects:
207 Description:
209 =cut
211 sub get_hilite_chr_region {
212 my $self=shift;
213 return $self->{hilite_chr_region};
216 sub set_hilite_chr_region {
217 my $self=shift;
218 $self->{hilite_chr_region}=shift;
223 sub hilite_chr_region {
224 my $self = shift;
225 my $image = shift;
227 my $north_pixels = $self->get_label()->get_north_position();
228 my $south_pixels = $self->get_label()->get_south_position();
230 # hilite only regions that are visible
232 if ($north_pixels < 0) { $north_pixels = 0; }
233 my $chr_end_pixels = ($self->get_chromosome()->get_height()+$self->get_chromosome()->get_vertical_offset());
234 if ($north_pixels > $chr_end_pixels) {
235 $north_pixels = $chr_end_pixels;
238 my $left_pixels = $self->get_chromosome()->get_horizontal_offset()-$self->get_chromosome()->get_width()/2+1;
239 my $right_pixels = $self->get_chromosome()->get_horizontal_offset()+$self->get_chromosome()->get_width()/2-1;
241 #print STDERR "North: $north_pixels South: $south_pixels. left: $left_pixels. Right: $right_pixels\n";
243 $image->filledRectangle($left_pixels, $north_pixels, $right_pixels, $south_pixels, $image->colorAllocate($self->get_region_hilite_color()));
246 sub draw_tick {
247 my $self = shift;
248 my $image = shift;
249 my $color = $image -> colorResolve($self->get_color());
250 my $halfwidth = int($self->get_chromosome->get_width/2);
251 my $north_y = $self->get_chromosome()->get_vertical_offset() + $self->get_chromosome()->mapunits2pixels($self->get_offset()-$self->get_north_range());
253 my $south_y = $self->get_chromosome()->get_vertical_offset() + $self->get_chromosome()->mapunits2pixels($self->get_offset()+$self->get_south_range());
255 if ($self->get_show_tick()) {
256 $image -> line($self->get_chromosome()->get_horizontal_offset() - $halfwidth +1, $north_y, $self->get_chromosome()->get_horizontal_offset()+$halfwidth-1, $north_y, $color);
257 $image -> line($self->get_chromosome()->get_horizontal_offset() - $halfwidth +1, $south_y, $self->get_chromosome()->get_horizontal_offset()+$halfwidth-1, $south_y, $color);
262 return 1;