annotate variant_effect_predictor/Bio/Graphics/FeatureFile.pm @ 0:2bc9b66ada89 draft default tip

Uploaded
author mahtabm
date Thu, 11 Apr 2013 06:29:17 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1 package Bio::Graphics::FeatureFile;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
2
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
3 # $Id: FeatureFile.pm,v 1.20.2.2 2003/08/29 19:30:10 lstein Exp $
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
4 # This package parses and renders a simple tab-delimited format for features.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
5 # It is simpler than GFF, but still has a lot of expressive power.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
6 # See __END__ for the file format
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
7
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
8 =head1 NAME
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
9
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
10 Bio::Graphics::FeatureFile -- A set of Bio::Graphics features, stored in a file
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
11
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
12 =head1 SYNOPSIS
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
13
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
14 use Bio::Graphics::FeatureFile;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
15 my $data = Bio::Graphics::FeatureFile->new(-file => 'features.txt');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
16
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
17
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
18 # create a new panel and render contents of the file onto it
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
19 my $panel = $data->new_panel;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
20 my $tracks_rendered = $data->render($panel);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
21
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
22 # or do it all in one step
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
23 my ($tracks_rendered,$panel) = $data->render;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
24
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
25 # for more control, render tracks individually
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
26 my @feature_types = $data->types;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
27 for my $type (@feature_types) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
28 my $features = $data->features($type);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
29 my %options = $data->style($type);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
30 $panel->add_track($features,%options); # assuming we have a Bio::Graphics::Panel
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
31 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
32
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
33 # get individual settings
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
34 my $est_fg_color = $data->setting(EST => 'fgcolor');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
35
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
36 # or create the FeatureFile by hand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
37
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
38 # add a type
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
39 $data->add_type(EST => {fgcolor=>'blue',height=>12});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
40
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
41 # add a feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
42 my $feature = Bio::Graphics::Feature->new(
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
43 # params
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
44 ); # or some other SeqI
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
45 $data->add_feature($feature=>'EST');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
46
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
47 =head1 DESCRIPTION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
48
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
49 The Bio::Graphics::FeatureFile module reads and parses files that
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
50 describe sequence features and their renderings. It accepts both GFF
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
51 format and a more human-friendly file format described below. Once a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
52 FeatureFile object has been initialized, you can interrogate it for
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
53 its consistuent features and their settings, or render the entire file
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
54 onto a Bio::Graphics::Panel.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
55
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
56 This moduel is a precursor of Jason Stajich's
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
57 Bio::Annotation::Collection class, and fulfills a similar function of
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
58 storing a collection of sequence features. However, it also stores
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
59 rendering information about the features, and does not currently
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
60 follow the CollectionI interface.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
61
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
62 =head2 The File Format
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
63
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
64 There are two types of entry in the file format: feature entries, and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
65 formatting entries. They can occur in any order. See the Appendix
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
66 for a full example.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
67
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
68 Feature entries can take several forms. At their simplest, they look
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
69 like this:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
70
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
71 Gene B0511.1 516-11208
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
72
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
73 This means that a feature of type "Gene" and name "B0511.1" occupies
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
74 the range between bases 516 and 11208. A range can be specified
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
75 equally well using a hyphen, or two dots as in 516..11208. Negative
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
76 coordinates are allowed, such as -187..1000.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
77
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
78 A discontinuous range ("split location") uses commas to separate the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
79 ranges. For example:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
80
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
81 Gene B0511.1 516-619,3185-3294,10946-11208
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
82
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
83 Alternatively, the locations can be split by repeating the features
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
84 type and name on multiple adjacent lines:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
85
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
86 Gene B0511.1 516-619
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
87 Gene B0511.1 3185-3294
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
88 Gene B0511.1 10946-11208
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
89
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
90 A comment can be added to features by adding a fourth column. These
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
91 comments will be rendered as under-the-glyph descriptions by those
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
92 glyphs that honor descriptions:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
93
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
94 Gene B0511.1 516-619,3185-3294,10946-11208 "Putative primase"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
95
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
96 Columns are separated using whitespace, not (necessarily) tabs.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
97 Embedded whitespace can be escaped using quote marks or backslashes in
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
98 the same way as in the shell:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
99
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
100 'Putative Gene' my\ favorite\ gene 516-11208
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
101
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
102 Features can be grouped so that they are rendered by the "group" glyph
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
103 (so far this has only been used to relate 5' and 3' ESTs). To start a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
104 group, create a two-column feature entry showing the group type and a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
105 name for the group. Follow this with a list of feature entries with a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
106 blank type. For example:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
107
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
108 EST yk53c10
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
109 yk53c10.3 15000-15500,15700-15800
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
110 yk53c10.5 18892-19154
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
111
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
112 This example is declaring that the ESTs named yk53c10.3 and yk53c10.5
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
113 belong to the same group named yk53c10.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
114
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
115 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
116
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
117 use strict;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
118 use Bio::Graphics::Feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
119 use Bio::DB::GFF::Util::Rearrange;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
120 use Carp;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
121 use IO::File;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
122 use Text::Shellwords;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
123
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
124 # default colors for unconfigured features
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
125 my @COLORS = qw(cyan blue red yellow green wheat turquoise orange);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
126 use constant WIDTH => 600;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
127
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
128 =head2 METHODS
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
129
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
130 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
131
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
132 =item $features = Bio::Graphics::FeatureFile-E<gt>new(@args)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
133
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
134 Create a new Bio::Graphics::FeatureFile using @args to initialize the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
135 object. Arguments are -name=E<gt>value pairs:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
136
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
137 Argument Value
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
138 -------- -----
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
139
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
140 -file Read data from a file path or filehandle. Use
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
141 "-" to read from standard input.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
142
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
143 -text Read data from a text scalar.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
144
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
145 -map_coords Coderef containing a subroutine to use for remapping
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
146 all coordinates.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
147
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
148 -smart_features Flag indicating that the features created by this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
149 module should be made aware of the FeatureFile
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
150 object by calling their configurator() method.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
151
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
152 -safe Indicates that the contents of this file is trusted.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
153 Any option value that begins with the string "sub {"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
154 or \&subname will be evaluated as a code reference.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
155
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
156 The -file and -text arguments are mutually exclusive, and -file will
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
157 supersede the other if both are present.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
158
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
159 -map_coords points to a coderef with the following signature:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
160
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
161 ($newref,[$start1,$end1],[$start2,$end2]....)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
162 = coderef($ref,[$start1,$end1],[$start2,$end2]...)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
163
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
164 See the Bio::Graphics::Browser (part of the generic genome browser
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
165 package) for an illustration of how to use this to do wonderful stuff.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
166
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
167 The -smart_features flag is used by the generic genome browser to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
168 provide features with a way to access the link-generation code. See
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
169 gbrowse for how this works.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
170
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
171 If the file is trusted, and there is an option named "init_code" in
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
172 the [GENERAL] section of the file, it will be evaluated as perl code
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
173 immediately after parsing. You can use this to declare global
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
174 variables and subroutines for use in option values.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
175
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
176 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
177
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
178 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
179
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
180 # args array:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
181 # -file => parse from a file (- allowed for ARGV)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
182 # -text => parse from a text scalar
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
183 # -map_coords => code ref to do coordinate mapping
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
184 # called with ($ref,[$start1,$stop1],[$start2,$stop2]...)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
185 # returns ($newref,$new_coord1,$new_coord2...)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
186
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
187 sub new {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
188 my $class = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
189 my %args = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
190 my $self = bless {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
191 config => {},
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
192 features => {},
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
193 seenit => {},
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
194 types => [],
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
195 max => undef,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
196 min => undef,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
197 stat => [],
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
198 refs => {},
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
199 safe => undef,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
200 },$class;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
201 $self->{coordinate_mapper} = $args{-map_coords}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
202 if exists $args{-map_coords} && ref($args{-map_coords}) eq 'CODE';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
203 $self->{smart_features} = $args{-smart_features} if exists $args{-smart_features};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
204 $self->{safe} = $args{-safe} if exists $args{-safe};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
205
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
206 # call with
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
207 # -file
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
208 # -text
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
209 my $fh;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
210 if (my $file = $args{-file}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
211 no strict 'refs';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
212 if (defined fileno($file)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
213 $fh = $file;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
214 } elsif ($file eq '-') {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
215 $self->parse_argv();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
216 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
217 $fh = IO::File->new($file) or croak("Can't open $file: $!\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
218 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
219 $self->parse_file($fh);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
220 } elsif (my $text = $args{-text}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
221 $self->parse_text($text);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
222 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
223 close($fh) or warn "Error closing file: $!" if $fh;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
224 $self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
225 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
226
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
227 # render our features onto a panel using configuration data
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
228 # return the number of tracks inserted
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
229
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
230 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
231
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
232 =item ($rendered,$panel) = $features-E<gt>render([$panel])
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
233
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
234 Render features in the data set onto the indicated
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
235 Bio::Graphics::Panel. If no panel is specified, creates one.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
236
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
237 In a scalar context returns the number of tracks rendered. In a list
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
238 context, returns a two-element list containing the number of features
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
239 rendered and the panel. Use this form if you want the panel created
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
240 for you.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
241
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
242 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
243
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
244 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
245
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
246 #"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
247
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
248 sub render {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
249 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
250 my $panel = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
251 my ($position_to_insert,$options,$max_bump,$max_label) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
252
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
253 $panel ||= $self->new_panel;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
254
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
255 # count up number of tracks inserted
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
256 my $tracks = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
257 my $color;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
258 my %types = map {$_=>1} $self->configured_types;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
259
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
260 my @configured_types = grep {exists $self->{features}{$_}} $self->configured_types;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
261 my @unconfigured_types = sort grep {!exists $types{$_}} $self->types;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
262
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
263 my @base_config = $self->style('general');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
264
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
265 my @override = ();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
266 if ($options && ref $options eq 'HASH') {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
267 @override = %$options;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
268 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
269 $options ||= 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
270 if ($options == 1) { # compact
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
271 push @override,(-bump => 0,-label=>0);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
272 } elsif ($options == 2) { #expanded
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
273 push @override,(-bump=>1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
274 } elsif ($options == 3) { #expand and label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
275 push @override,(-bump=>1,-label=>1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
276 } elsif ($options == 4) { #hyperexpand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
277 push @override,(-bump => 2);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
278 } elsif ($options == 5) { #hyperexpand and label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
279 push @override,(-bump => 2,-label=>1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
280 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
281 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
282
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
283 for my $type (@configured_types,@unconfigured_types) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
284 my $features = $self->features($type);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
285 my @auto_bump;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
286 push @auto_bump,(-bump => @$features < $max_bump) if defined $max_bump;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
287 push @auto_bump,(-label => @$features < $max_label) if defined $max_label;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
288
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
289 my @config = ( -glyph => 'segments', # really generic
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
290 -bgcolor => $COLORS[$color++ % @COLORS],
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
291 -label => 1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
292 -key => $type,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
293 @auto_bump,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
294 @base_config, # global
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
295 $self->style($type), # feature-specific
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
296 @override,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
297 );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
298 if (defined($position_to_insert)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
299 $panel->insert_track($position_to_insert++,$features,@config);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
300 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
301 $panel->add_track($features,@config);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
302 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
303 $tracks++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
304 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
305 return wantarray ? ($tracks,$panel) : $tracks;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
306 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
307
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
308 sub _stat {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
309 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
310 my $fh = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
311 $self->{stat} = [stat($fh)];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
312 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
313
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
314 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
315
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
316 =item $error = $features-E<gt>error([$error])
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
317
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
318 Get/set the current error message.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
319
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
320 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
321
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
322 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
323
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
324 sub error {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
325 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
326 my $d = $self->{error};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
327 $self->{error} = shift if @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
328 $d;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
329 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
330
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
331 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
332
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
333 =item $smart_features = $features-E<gt>smart_features([$flag]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
334
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
335 Get/set the "smart_features" flag. If this is set, then any features
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
336 added to the featurefile object will have their configurator() method
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
337 called using the featurefile object as the argument.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
338
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
339 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
340
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
341 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
342
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
343 sub smart_features {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
344 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
345 my $d = $self->{smart_features};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
346 $self->{smart_features} = shift if @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
347 $d;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
348 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
349
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
350 sub parse_argv {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
351 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
352
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
353 $self->init_parse;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
354 while (<>) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
355 chomp;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
356 $self->parse_line($_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
357 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
358 $self->finish_parse;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
359 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
360
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
361 sub parse_file {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
362 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
363 my $fh = shift or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
364 $self->_stat($fh);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
365
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
366 $self->init_parse;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
367 while (<$fh>) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
368 chomp;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
369 $self->parse_line($_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
370 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
371 $self->finish_parse;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
372 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
373
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
374 sub parse_text {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
375 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
376 my $text = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
377
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
378 $self->init_parse;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
379 foreach (split /\015?\012|\015\012?/,$text) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
380 $self->parse_line($_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
381 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
382 $self->finish_parse;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
383 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
384
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
385 sub parse_line {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
386 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
387 local $_ = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
388
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
389 s/\015//g; # get rid of carriage returns left over by MS-DOS/Windows systems
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
390
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
391 return if /^\s*[\#]/;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
392
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
393 if (/^\s+(.+)/ && $self->{current_tag}) { # continuation line
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
394 my $value = $1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
395 my $cc = $self->{current_config} ||= 'general'; # in case no configuration named
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
396 $self->{config}{$cc}{$self->{current_tag}} .= ' ' . $value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
397 # respect newlines in code subs
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
398 $self->{config}{$cc}{$self->{current_tag}} .= "\n"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
399 if $self->{config}{$cc}{$self->{current_tag}}=~ /^sub\s*\{/;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
400 return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
401 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
402
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
403 if (/^\s*\[([^\]]+)\]/) { # beginning of a configuration section
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
404 my $label = $1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
405 my $cc = $label =~ /^(general|default)$/i ? 'general' : $label; # normalize
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
406 push @{$self->{types}},$cc unless $cc eq 'general';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
407 $self->{current_config} = $cc;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
408 return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
409 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
410
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
411 if (/^([\w: -]+?)\s*=\s*(.*)/) { # key value pair within a configuration section
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
412 my $tag = lc $1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
413 my $cc = $self->{current_config} ||= 'general'; # in case no configuration named
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
414 my $value = defined $2 ? $2 : '';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
415 $self->{config}{$cc}{$tag} = $value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
416 $self->{current_tag} = $tag;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
417 return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
418 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
419
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
420
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
421 if (/^$/) { # empty line
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
422 undef $self->{current_tag};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
423 return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
424 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
425
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
426 # parse data lines
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
427 my @tokens = eval { shellwords($_||'') };
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
428 unshift @tokens,'' if /^\s+/;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
429
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
430 # close any open group
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
431 if (length $tokens[0] > 0 && $self->{group}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
432 push @{$self->{features}{$self->{grouptype}}},$self->{group};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
433 undef $self->{group};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
434 undef $self->{grouptype};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
435 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
436
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
437 if (@tokens < 3) { # short line; assume a group identifier
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
438 my $type = shift @tokens;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
439 my $name = shift @tokens;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
440 $self->{group} = Bio::Graphics::Feature->new(-name => $name,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
441 -type => 'group');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
442 $self->{grouptype} = $type;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
443 return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
444 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
445
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
446 my($ref,$type,$name,$strand,$bounds,$description,$url);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
447
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
448 if (@tokens >= 8) { # conventional GFF file
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
449 my ($r,$source,$method,$start,$stop,$score,$s,$phase,@rest) = @tokens;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
450 my $group = join ' ',@rest;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
451 $type = join(':',$method,$source);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
452 $bounds = join '..',$start,$stop;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
453 $strand = $s;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
454 if ($group) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
455 my ($notes,@notes);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
456 (undef,$self->{groupname},undef,undef,$notes) = split_group($group);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
457 foreach (@$notes) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
458 if (m!^(http|ftp)://!) { $url = $_ } else { push @notes,$_ }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
459 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
460 $description = join '; ',@notes if @notes;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
461 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
462 $name ||= $self->{group}->display_id if $self->{group};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
463 $ref = $r;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
464 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
465
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
466 elsif ($tokens[2] =~ /^([+-.]|[+-]?[01])$/) { # old simplified version
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
467 ($type,$name,$strand,$bounds,$description,$url) = @tokens;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
468 } else { # new simplified version
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
469 ($type,$name,$bounds,$description,$url) = @tokens;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
470 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
471
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
472 $type ||= $self->{grouptype} || '';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
473 $type =~ s/\s+$//; # get rid of excess whitespace
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
474
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
475 # the reference is specified by the GFF reference line first,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
476 # the last reference line we saw second,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
477 # or the reference line in the "general" section.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
478 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
479 local $^W = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
480 $ref ||= $self->{config}{$self->{current_config}}{'reference'}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
481 || $self->{config}{general}{reference};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
482 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
483 $self->{refs}{$ref}++ if defined $ref;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
484
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
485 my @parts = map { [/(-?\d+)(?:-|\.\.)(-?\d+)/]} split /(?:,| )\s*/,$bounds;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
486
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
487 foreach (@parts) { # max and min calculation, sigh...
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
488 $self->{min} = $_->[0] if !defined $self->{min} || $_->[0] < $self->{min};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
489 $self->{max} = $_->[1] if !defined $self->{max} || $_->[1] > $self->{max};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
490 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
491
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
492 if ($self->{coordinate_mapper} && $ref) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
493 ($ref,@parts) = $self->{coordinate_mapper}->($ref,@parts);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
494 return unless $ref;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
495 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
496
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
497 $type = '' unless defined $type;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
498 $name = '' unless defined $name;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
499
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
500 # attribute handling
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
501 my %attributes;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
502 my $score;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
503 if (defined $description && $description =~ /\w+=\w+/) { # attribute line
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
504 my @attributes = split /;\s*/,$description;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
505 foreach (@attributes) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
506 my ($name,$value) = split /=/,$_,2;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
507 Bio::Root::Root->throw(qq("$_" is not a valid attribute=value pair)) unless defined $value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
508 _unescape($name);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
509 my @values = split /,/,$value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
510 _unescape(@values);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
511 if ($name =~ /^(note|description)/) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
512 $description = "@values";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
513 } elsif ($name eq 'url') {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
514 $url = $value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
515 } elsif ($name eq 'score') {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
516 $score = $value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
517 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
518 push @{$attributes{$name}},@values;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
519 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
520 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
521 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
522
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
523 # either create a new feature or add a segment to it
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
524 if (my $feature = $self->{seenit}{$type,$name}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
525
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
526 # create a new first part
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
527 if (!$feature->segments) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
528 $feature->add_segment(Bio::Graphics::Feature->new(-type => $feature->type,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
529 -strand => $feature->strand,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
530 -start => $feature->start,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
531 -end => $feature->end));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
532 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
533 $feature->add_segment(@parts);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
534 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
535
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
536 else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
537 my @coordinates = @parts > 1 ? (-segments => \@parts) : (-start=>$parts[0][0],-end=>$parts[0][1]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
538 $feature = $self->{seenit}{$type,$name} =
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
539 Bio::Graphics::Feature->new(-name => $name,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
540 -type => $type,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
541 $strand ? (-strand => make_strand($strand)) : (),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
542 defined $score ? (-score=>$score) : (),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
543 -desc => $description,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
544 -ref => $ref,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
545 -attributes => \%attributes,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
546 defined($url) ? (-url => $url) : (),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
547 @coordinates,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
548 );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
549 $feature->configurator($self) if $self->smart_features;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
550 if ($self->{group}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
551 $self->{group}->add_segment($feature);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
552 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
553 push @{$self->{features}{$type}},$feature; # for speed; should use add_feature() instead
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
554 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
555 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
556 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
557
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
558 sub _unescape {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
559 foreach (@_) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
560 tr/+/ /; # pluses become spaces
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
561 s/%([0-9a-fA-F]{2})/chr hex($1)/g;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
562 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
563 @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
564 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
565
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
566 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
567
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
568 =item $features-E<gt>add_feature($feature [=E<gt>$type])
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
569
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
570 Add a new Bio::FeatureI object to the set. If $type is specified, the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
571 object will be added with the indicated type. Otherwise, the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
572 feature's primary_tag() method will be invoked to get the type.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
573
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
574 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
575
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
576 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
577
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
578 # add a feature of given type to our list
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
579 # we use the primary_tag() method
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
580 sub add_feature {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
581 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
582 my ($feature,$type) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
583 $type = $feature->primary_tag unless defined $type;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
584 push @{$self->{features}{$type}},$feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
585 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
586
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
587
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
588 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
589
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
590 =item $features-E<gt>add_type($type=E<gt>$hashref)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
591
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
592 Add a new feature type to the set. The type is a string, such as
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
593 "EST". The hashref is a set of key=E<gt>value pairs indicating options to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
594 set on the type. Example:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
595
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
596 $features->add_type(EST => { glyph => 'generic', fgcolor => 'blue'})
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
597
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
598 When a feature of type "EST" is rendered, it will use the generic
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
599 glyph and have a foreground color of blue.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
600
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
601 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
602
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
603 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
604
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
605 # Add a type to the list. Hash values are used for key/value pairs
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
606 # in the configuration. Call as add_type($type,$configuration) where
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
607 # $configuration is a hashref.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
608 sub add_type {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
609 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
610 my ($type,$type_configuration) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
611 my $cc = $type =~ /^(general|default)$/i ? 'general' : $type; # normalize
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
612 push @{$self->{types}},$cc unless $cc eq 'general' or $self->{config}{$cc};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
613 if (defined $type_configuration) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
614 for my $tag (keys %$type_configuration) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
615 $self->{config}{$cc}{lc $tag} = $type_configuration->{$tag};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
616 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
617 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
618 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
619
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
620
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
621
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
622 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
623
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
624 =item $features-E<gt>set($type,$tag,$value)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
625
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
626 Change an individual option for a particular type. For example, this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
627 will change the foreground color of EST features to my favorite color:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
628
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
629 $features->set('EST',fgcolor=>'chartreuse')
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
630
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
631 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
632
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
633 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
634
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
635 # change configuration of a type. Call as set($type,$tag,$value)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
636 # $type will be added if not already there.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
637 sub set {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
638 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
639 croak("Usage: \$featurefile->set(\$type,\$tag,\$value\n")
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
640 unless @_ == 3;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
641 my ($type,$tag,$value) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
642 unless ($self->{config}{$type}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
643 return $self->add_type($type,{$tag=>$value});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
644 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
645 $self->{config}{$type}{lc $tag} = $value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
646 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
647 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
648
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
649 # break circular references
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
650 sub destroy {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
651 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
652 delete $self->{features};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
653 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
654
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
655 sub DESTROY { shift->destroy(@_) }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
656
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
657 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
658
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
659 =item $value = $features-E<gt>setting($stanza =E<gt> $option)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
660
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
661 In the two-element form, the setting() method returns the value of an
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
662 option in the configuration stanza indicated by $stanza. For example:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
663
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
664 $value = $features->setting(general => 'height')
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
665
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
666 will return the value of the "height" option in the [general] stanza.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
667
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
668 Call with one element to retrieve all the option names in a stanza:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
669
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
670 @options = $features->setting('general');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
671
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
672 Call with no elements to retrieve all stanza names:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
673
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
674 @stanzas = $features->setting;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
675
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
676 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
677
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
678 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
679
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
680 sub setting {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
681 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
682 if ($self->safe) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
683 $self->code_setting(@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
684 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
685 $self->_setting(@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
686 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
687 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
688
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
689 # return configuration information
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
690 # arguments are ($type) => returns tags for type
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
691 # ($type=>$tag) => returns values of tag on type
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
692 sub _setting {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
693 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
694 my $config = $self->{config} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
695 return keys %{$config} unless @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
696 return keys %{$config->{$_[0]}} if @_ == 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
697 return $config->{$_[0]}{$_[1]} if @_ > 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
698 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
699
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
700
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
701 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
702
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
703 =item $value = $features-E<gt>code_setting($stanza=E<gt>$option);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
704
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
705 This works like setting() except that it is also able to evaluate code
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
706 references. These are options whose values begin with the characters
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
707 "sub {". In this case the value will be passed to an eval() and the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
708 resulting codereference returned. Use this with care!
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
709
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
710 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
711
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
712 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
713
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
714 sub code_setting {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
715 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
716 my $section = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
717 my $option = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
718
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
719 my $setting = $self->_setting($section=>$option);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
720 return unless defined $setting;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
721 return $setting if ref($setting) eq 'CODE';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
722 if ($setting =~ /^\\&(\w+)/) { # coderef in string form
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
723 my $subroutine_name = $1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
724 my $package = $self->base2package;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
725 my $codestring = "\\&${package}\:\:${subroutine_name}";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
726 my $coderef = eval $codestring;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
727 warn $@ if $@;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
728 $self->set($section,$option,$coderef);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
729 return $coderef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
730 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
731 elsif ($setting =~ /^sub\s*\{/) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
732 my $coderef = eval $setting;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
733 warn $@ if $@;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
734 $self->set($section,$option,$coderef);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
735 return $coderef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
736 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
737 return $setting;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
738 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
739 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
740
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
741 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
742
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
743 =item $flag = $features-E<gt>safe([$flag]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
744
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
745 This gets or sets and "safe" flag. If the safe flag is set, then
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
746 calls to setting() will invoke code_setting(), allowing values that
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
747 begin with the string "sub {" to be interpreted as anonymous
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
748 subroutines. This is a potential security risk when used with
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
749 untrusted files of features, so use it with care.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
750
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
751 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
752
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
753 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
754
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
755 sub safe {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
756 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
757 my $d = $self->{safe};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
758 $self->{safe} = shift if @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
759 $self->evaluate_coderefs if $self->{safe} && !$d;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
760 $d;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
761 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
762
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
763
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
764 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
765
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
766 =item @args = $features-E<gt>style($type)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
767
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
768 Given a feature type, returns a list of track configuration arguments
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
769 suitable for suitable for passing to the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
770 Bio::Graphics::Panel-E<gt>add_track() method.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
771
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
772 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
773
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
774 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
775
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
776 # turn configuration into a set of -name=>value pairs suitable for add_track()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
777 sub style {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
778 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
779 my $type = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
780
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
781 my $config = $self->{config} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
782 my $hashref = $config->{$type} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
783
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
784 return map {("-$_" => $hashref->{$_})} keys %$hashref;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
785 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
786
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
787
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
788 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
789
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
790 =item $glyph = $features-E<gt>glyph($type);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
791
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
792 Return the name of the glyph corresponding to the given type (same as
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
793 $features-E<gt>setting($type=E<gt>'glyph')).
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
794
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
795 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
796
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
797 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
798
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
799 # retrieve just the glyph part of the configuration
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
800 sub glyph {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
801 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
802 my $type = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
803 my $config = $self->{config} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
804 my $hashref = $config->{$type} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
805 return $hashref->{glyph};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
806 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
807
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
808
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
809 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
810
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
811 =item @types = $features-E<gt>configured_types()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
812
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
813 Return a list of all the feature types currently known to the feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
814 file set. Roughly equivalent to:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
815
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
816 @types = grep {$_ ne 'general'} $features->setting;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
817
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
818 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
819
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
820 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
821
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
822 # return list of configured types, in proper order
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
823 sub configured_types {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
824 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
825 my $types = $self->{types} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
826 return @{$types};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
827 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
828
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
829 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
830
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
831 =item @types = $features-E<gt>types()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
832
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
833 This is similar to the previous method, but will return *all* feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
834 types, including those that are not configured with a stanza.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
835
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
836 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
837
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
838 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
839
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
840 sub types {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
841 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
842 my $features = $self->{features} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
843 return keys %{$features};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
844 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
845
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
846
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
847 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
848
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
849 =item $features = $features-E<gt>features($type)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
850
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
851 Return a list of all the feature types of type "$type". If the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
852 featurefile object was created by parsing a file or text scalar, then
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
853 the features will be of type Bio::Graphics::Feature (which follow the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
854 Bio::FeatureI interface). Otherwise the list will contain objects of
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
855 whatever type you added with calls to add_feature().
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
856
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
857 Two APIs:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
858
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
859 1) original API:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
860
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
861 # Reference to an array of all features of type "$type"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
862 $features = $features-E<gt>features($type)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
863
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
864 # Reference to an array of all features of all types
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
865 $features = $features-E<gt>features()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
866
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
867 # A list when called in a list context
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
868 @features = $features-E<gt>features()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
869
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
870 2) Bio::Das::SegmentI API:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
871
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
872 @features = $features-E<gt>features(-type=>['list','of','types']);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
873
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
874 # variants
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
875 $features = $features-E<gt>features(-type=>['list','of','types']);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
876 $features = $features-E<gt>features(-type=>'a type');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
877 $iterator = $features-E<gt>features(-type=>'a type',-iterator=>1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
878
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
879 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
880
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
881 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
882
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
883 # return features
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
884 sub features {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
885 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
886 my ($types,$iterator,@rest) = $_[0]=~/^-/ ? rearrange([['TYPE','TYPES']],@_) : (\@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
887 $types = [$types] if $types && !ref($types);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
888 my @types = ($types && @$types) ? @$types : $self->types;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
889 my @features = map {@{$self->{features}{$_}}} @types;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
890 if ($iterator) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
891 require Bio::Graphics::FeatureFile::Iterator;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
892 return Bio::Graphics::FeatureFile::Iterator->new(\@features);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
893 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
894 return wantarray ? @features : \@features;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
895 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
896
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
897 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
898
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
899 =item @features = $features-E<gt>features($type)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
900
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
901 Return a list of all the feature types of type "$type". If the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
902 featurefile object was created by parsing a file or text scalar, then
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
903 the features will be of type Bio::Graphics::Feature (which follow the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
904 Bio::FeatureI interface). Otherwise the list will contain objects of
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
905 whatever type you added with calls to add_feature().
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
906
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
907 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
908
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
909 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
910
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
911 sub make_strand {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
912 local $^W = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
913 return +1 if $_[0] =~ /^\+/ || $_[0] > 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
914 return -1 if $_[0] =~ /^\-/ || $_[0] < 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
915 return 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
916 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
917
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
918 =head2 get_seq_stream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
919
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
920 Title : get_seq_stream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
921 Usage : $stream = $s->get_seq_stream(@args)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
922 Function: get a stream of features that overlap this segment
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
923 Returns : a Bio::SeqIO::Stream-compliant stream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
924 Args : see below
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
925 Status : Public
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
926
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
927 This is the same as feature_stream(), and is provided for Bioperl
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
928 compatibility. Use like this:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
929
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
930 $stream = $s->get_seq_stream('exon');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
931 while (my $exon = $stream->next_seq) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
932 print $exon->start,"\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
933 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
934
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
935 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
936
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
937 sub get_seq_stream {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
938 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
939 local $^W = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
940 my @args = $_[0] =~ /^-/ ? (@_,-iterator=>1) : (-types=>\@_,-iterator=>1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
941 $self->features(@args);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
942 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
943
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
944 =head2 get_feature_stream(), top_SeqFeatures(), all_SeqFeatures()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
945
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
946 Provided for compatibility with older BioPerl and/or Bio::DB::GFF
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
947 APIs.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
948
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
949 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
950
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
951 *get_feature_stream = \&get_seq_stream;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
952 *top_SeqFeatures = *all_SeqFeatures = \&features;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
953
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
954
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
955 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
956
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
957 =item @refs = $features-E<gt>refs
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
958
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
959 Return the list of reference sequences referred to by this data file.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
960
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
961 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
962
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
963 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
964
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
965 sub refs {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
966 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
967 my $refs = $self->{refs} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
968 keys %$refs;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
969 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
970
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
971 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
972
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
973 =item $min = $features-E<gt>min
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
974
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
975 Return the minimum coordinate of the leftmost feature in the data set.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
976
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
977 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
978
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
979 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
980
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
981 sub min { shift->{min} }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
982
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
983 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
984
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
985 =item $max = $features-E<gt>max
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
986
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
987 Return the maximum coordinate of the rightmost feature in the data set.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
988
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
989 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
990
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
991 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
992
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
993 sub max { shift->{max} }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
994
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
995 sub init_parse {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
996 my $s = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
997
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
998 $s->{seenit} = {};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
999 $s->{max} = $s->{min} = undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1000 $s->{types} = [];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1001 $s->{features} = {};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1002 $s->{config} = {}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1003 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1004
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1005 sub finish_parse {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1006 my $s = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1007 $s->evaluate_coderefs if $s->safe;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1008 $s->{seenit} = {};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1009 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1010
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1011 sub evaluate_coderefs {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1012 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1013 $self->initialize_code();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1014 for my $s ($self->_setting) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1015 for my $o ($self->_setting($s)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1016 $self->code_setting($s,$o);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1017 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1018 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1019 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1020
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1021 sub initialize_code {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1022 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1023 my $package = $self->base2package;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1024 my $init_code = $self->_setting(general => 'init_code') or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1025 my $code = "package $package; $init_code; 1;";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1026 eval $code;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1027 warn $@ if $@;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1028 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1029
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1030 sub base2package {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1031 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1032 (my $package = overload::StrVal($self)) =~ s/[^a-z0-9A-Z_]/_/g;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1033 $package =~ s/^[^a-zA-Z_]/_/g;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1034 $package;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1035 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1036
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1037 sub split_group {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1038 my $group = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1039
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1040 $group =~ s/\\;/$;/g; # protect embedded semicolons in the group
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1041 $group =~ s/( \"[^\"]*);([^\"]*\")/$1$;$2/g;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1042 my @groups = split(/\s*;\s*/,$group);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1043 foreach (@groups) { s/$;/;/g }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1044
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1045 my ($gclass,$gname,$tstart,$tstop,@notes);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1046
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1047 foreach (@groups) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1048
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1049 my ($tag,$value) = /^(\S+)\s*(.*)/;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1050 $value =~ s/\\t/\t/g;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1051 $value =~ s/\\r/\r/g;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1052 $value =~ s/^"//;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1053 $value =~ s/"$//;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1054
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1055 # if the tag is "Note", then we add this to the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1056 # notes array
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1057 if ($tag eq 'Note') { # just a note, not a group!
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1058 push @notes,$value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1059 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1060
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1061 # if the tag eq 'Target' then the class name is embedded in the ID
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1062 # (the GFF format is obviously screwed up here)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1063 elsif ($tag eq 'Target' && $value =~ /([^:\"]+):([^\"]+)/) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1064 ($gclass,$gname) = ($1,$2);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1065 ($tstart,$tstop) = /(\d+) (\d+)/;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1066 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1067
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1068 elsif (!$value) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1069 push @notes,$tag; # e.g. "Confirmed_by_EST"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1070 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1071
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1072 # otherwise, the tag and value correspond to the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1073 # group class and name
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1074 else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1075 ($gclass,$gname) = ($tag,$value);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1076 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1077 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1078
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1079 return ($gclass,$gname,$tstart,$tstop,\@notes);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1080 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1081
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1082 # create a panel if needed
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1083 sub new_panel {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1084 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1085
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1086 require Bio::Graphics::Panel;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1087
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1088 # general configuration of the image here
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1089 my $width = $self->setting(general => 'pixels')
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1090 || $self->setting(general => 'width')
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1091 || WIDTH;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1092
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1093 my ($start,$stop);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1094 my $range_expr = '(-?\d+)(?:-|\.\.)(-?\d+)';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1095
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1096 if (my $bases = $self->setting(general => 'bases')) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1097 ($start,$stop) = $bases =~ /([\d-]+)(?:-|\.\.)([\d-]+)/;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1098 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1099
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1100 if (!defined $start || !defined $stop) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1101 $start = $self->min unless defined $start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1102 $stop = $self->max unless defined $stop;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1103 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1104
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1105 my $new_segment = Bio::Graphics::Feature->new(-start=>$start,-stop=>$stop);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1106 my $panel = Bio::Graphics::Panel->new(-segment => $new_segment,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1107 -width => $width,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1108 -key_style => 'between');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1109 $panel;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1110 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1111
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1112 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1113
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1114 =item $mtime = $features-E<gt>mtime
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1115
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1116 =item $atime = $features-E<gt>atime
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1117
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1118 =item $ctime = $features-E<gt>ctime
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1119
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1120 =item $size = $features-E<gt>size
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1121
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1122 Returns stat() information about the data file, for featurefile
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1123 objects created using the -file option. Size is in bytes. mtime,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1124 atime, and ctime are in seconds since the epoch.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1125
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1126 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1127
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1128 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1129
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1130 sub mtime {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1131 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1132 my $d = $self->{m_time} || $self->{stat}->[9];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1133 $self->{m_time} = shift if @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1134 $d;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1135 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1136 sub atime { shift->{stat}->[8]; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1137 sub ctime { shift->{stat}->[10]; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1138 sub size { shift->{stat}->[7]; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1139
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1140 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1141
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1142 =item $label = $features-E<gt>feature2label($feature)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1143
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1144 Given a feature, determines the configuration stanza that bests
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1145 describes it. Uses the feature's type() method if it has it (DasI
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1146 interface) or its primary_tag() method otherwise.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1147
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1148 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1149
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1150 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1151
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1152 sub feature2label {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1153 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1154 my $feature = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1155 my $type = eval {$feature->type} || $feature->primary_tag or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1156 (my $basetype = $type) =~ s/:.+$//;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1157 my @labels = $self->type2label($type);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1158 @labels = $self->type2label($basetype) unless @labels;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1159 @labels = ($type) unless @labels;;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1160 wantarray ? @labels : $labels[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1161 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1162
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1163 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1164
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1165 =item $link = $features-E<gt>make_link($feature)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1166
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1167 Given a feature, tries to generate a URL to link out from it. This
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1168 uses the 'link' option, if one is present. This method is a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1169 convenience for the generic genome browser.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1170
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1171 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1172
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1173 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1174
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1175 sub make_link {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1176 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1177 my $feature = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1178 for my $label ($self->feature2label($feature)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1179 my $link = $self->setting($label,'link');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1180 $link = $self->setting(general=>'link') unless defined $link;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1181 next unless $link;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1182 return $self->link_pattern($link,$feature);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1183 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1184 return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1185 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1186
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1187 sub link_pattern {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1188 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1189 my ($pattern,$feature,$panel) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1190 require CGI unless defined &CGI::escape;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1191 my $n;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1192 $pattern =~ s/\$(\w+)/
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1193 CGI::escape(
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1194 $1 eq 'ref' ? ($n = $feature->location->seq_id) && "$n"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1195 : $1 eq 'name' ? ($n = $feature->display_name) && "$n" # workaround broken CGI.pm
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1196 : $1 eq 'class' ? eval {$feature->class} || ''
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1197 : $1 eq 'type' ? eval {$feature->method} || $feature->primary_tag
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1198 : $1 eq 'method' ? eval {$feature->method} || $feature->primary_tag
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1199 : $1 eq 'source' ? eval {$feature->source} || $feature->source_tag
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1200 : $1 eq 'start' ? $feature->start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1201 : $1 eq 'end' ? $feature->end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1202 : $1 eq 'stop' ? $feature->end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1203 : $1 eq 'segstart' ? $panel->start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1204 : $1 eq 'segend' ? $panel->end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1205 : $1 eq 'description' ? eval {join '',$feature->notes} || ''
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1206 : $1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1207 )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1208 /exg;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1209 return $pattern;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1210 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1211
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1212 # given a feature type, return its label(s)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1213 sub type2label {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1214 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1215 my $type = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1216 $self->{_type2label} ||= $self->invert_types;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1217 my @labels = keys %{$self->{_type2label}{$type}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1218 wantarray ? @labels : $labels[0]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1219 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1220
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1221 sub invert_types {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1222 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1223 my $config = $self->{config} or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1224 my %inverted;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1225 for my $label (keys %{$config}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1226 my $feature = $config->{$label}{feature} or next;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1227 foreach (shellwords($feature||'')) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1228 $inverted{$_}{$label}++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1229 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1230 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1231 \%inverted;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1232 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1233
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1234 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1235
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1236 =item $citation = $features-E<gt>citation($feature)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1237
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1238 Given a feature, tries to generate a citation for it, using the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1239 "citation" option if one is present. This method is a convenience for
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1240 the generic genome browser.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1241
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1242 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1243
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1244 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1245
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1246 # This routine returns the "citation" field. It is here in order to simplify the logic
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1247 # a bit in the generic browser
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1248 sub citation {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1249 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1250 my $feature = shift || 'general';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1251 return $self->setting($feature=>'citation');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1252 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1253
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1254 =over 4
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1255
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1256 =item $name = $features-E<gt>name([$feature])
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1257
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1258 Get/set the name of this feature set. This is a convenience method
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1259 useful for keeping track of multiple feature sets.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1260
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1261 =back
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1262
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1263 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1264
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1265 # give this feature file a nickname
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1266 sub name {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1267 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1268 my $d = $self->{name};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1269 $self->{name} = shift if @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1270 $d;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1271 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1272
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1273 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1274
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1275 __END__
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1276
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1277 =head1 Appendix -- Sample Feature File
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1278
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1279 # file begins
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1280 [general]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1281 pixels = 1024
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1282 bases = 1-20000
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1283 reference = Contig41
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1284 height = 12
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1285
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1286 [Cosmid]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1287 glyph = segments
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1288 fgcolor = blue
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1289 key = C. elegans conserved regions
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1290
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1291 [EST]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1292 glyph = segments
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1293 bgcolor= yellow
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1294 connector = dashed
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1295 height = 5;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1296
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1297 [FGENESH]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1298 glyph = transcript2
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1299 bgcolor = green
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1300 description = 1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1301
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1302 Cosmid B0511 516-619
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1303 Cosmid B0511 3185-3294
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1304 Cosmid B0511 10946-11208
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1305 Cosmid B0511 13126-13511
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1306 Cosmid B0511 11394-11539
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1307 EST yk260e10.5 15569-15724
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1308 EST yk672a12.5 537-618,3187-3294
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1309 EST yk595e6.5 552-618
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1310 EST yk595e6.5 3187-3294
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1311 EST yk846e07.3 11015-11208
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1312 EST yk53c10
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1313 yk53c10.3 15000-15500,15700-15800
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1314 yk53c10.5 18892-19154
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1315 EST yk53c10.5 16032-16105
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1316 SwissProt PECANEX 13153-13656 Swedish fish
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1317 FGENESH Predicted gene 1 1-205,518-616,661-735,3187-3365,3436-3846 Pfam domain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1318 FGENESH Predicted gene 2 5513-6497,7968-8136,8278-8383,8651-8839,9462-9515,10032-10705,10949-11340,11387-11524,11765-12067,12876-13577,13882-14121,14169-14535,15006-15209,15259-15462,15513-15753,15853-16219 Mysterious
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1319 FGENESH Predicted gene 3 16626-17396,17451-17597
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1320 FGENESH Predicted gene 4 18459-18722,18882-19176,19221-19513,19572-19835 Transmembrane protein
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1321 # file ends
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1322
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1323 =head1 SEE ALSO
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1324
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1325 L<Bio::Graphics::Panel>,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1326 L<Bio::Graphics::Glyph>,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1327 L<Bio::Graphics::Feature>,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1328 L<Bio::Graphics::FeatureFile>
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1329
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1330 =head1 AUTHOR
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1331
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1332 Lincoln Stein E<lt>lstein@cshl.orgE<gt>.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1333
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1334 Copyright (c) 2001 Cold Spring Harbor Laboratory
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1335
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1336 This library is free software; you can redistribute it and/or modify
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1337 it under the same terms as Perl itself. See DISCLAIMER.txt for
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1338 disclaimers of warranty.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1339
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1340 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1341
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1342
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1343