0
|
1 #
|
|
2 # Ensembl module for Bio::EnsEMBL::Funcgen::FeatureSet
|
|
3 #
|
|
4
|
|
5 =head1 LICENSE
|
|
6
|
|
7 Copyright (c) 1999-2011 The European Bioinformatics Institute and
|
|
8 Genome Research Limited. All rights reserved.
|
|
9
|
|
10 This software is distributed under a modified Apache license.
|
|
11 For license details, please see
|
|
12
|
|
13 http://www.ensembl.org/info/about/code_licence.html
|
|
14
|
|
15 =head1 CONTACT
|
|
16
|
|
17 Please email comments or questions to the public Ensembl
|
|
18 developers list at <ensembl-dev@ebi.ac.uk>.
|
|
19
|
|
20 Questions may also be sent to the Ensembl help desk at
|
|
21 <helpdesk@ensembl.org>.
|
|
22
|
|
23
|
|
24 =head1 NAME
|
|
25
|
|
26 Bio::EnsEMBL::FeatureSet - A module to represent FeatureSet.
|
|
27
|
|
28
|
|
29 =head1 SYNOPSIS
|
|
30
|
|
31 use Bio::EnsEMBL::Funcgen::FeatureSet;
|
|
32
|
|
33 my $result_set = Bio::EnsEMBL::Funcgen::FeatureSet->new(
|
|
34
|
|
35 );
|
|
36
|
|
37
|
|
38
|
|
39 =head1 DESCRIPTION
|
|
40
|
|
41 A FeatureSet object provides access to a set of feature predictions and their details, which may have been generated from a
|
|
42 single or multiple Experiments with potentially differing analyses. The FeatureSet itself will only have a single analysis
|
|
43 which may be one or a combination of programs but will be represented by one analysis record.
|
|
44
|
|
45 =cut
|
|
46
|
|
47 use strict;
|
|
48 use warnings;
|
|
49
|
|
50 package Bio::EnsEMBL::Funcgen::FeatureSet;
|
|
51
|
|
52 use Bio::EnsEMBL::Utils::Argument qw( rearrange );
|
|
53 use Bio::EnsEMBL::Utils::Exception qw( throw warning deprecate);
|
|
54 use Bio::EnsEMBL::Funcgen::Set;
|
|
55
|
|
56 use vars qw(@ISA);
|
|
57 @ISA = qw(Bio::EnsEMBL::Funcgen::Set);
|
|
58
|
|
59 my %valid_classes = ( annotated => undef,
|
|
60 regulatory => undef,
|
|
61 external => undef,
|
|
62 segmentation => undef, );
|
|
63
|
|
64 =head2 new
|
|
65
|
|
66 -name => $name,
|
|
67 -feature_type => $ftype,
|
|
68 -cell_type => $ctype,
|
|
69 -name => $name,
|
|
70 -description => 'Release 3.1',
|
|
71 -display_label => 'Short name',
|
|
72 -analysis => $analysis,
|
|
73 Arg [-EXPERIMENT_ID] : Experiment dbID
|
|
74 -dbid => $dbid,
|
|
75 Arg [-ADAPTOR]
|
|
76
|
|
77 Example : my $feature = Bio::EnsEMBL::Funcgen::FeatureSet->new(
|
|
78 -dbid => $dbid,
|
|
79 -analysis => $analysis,
|
|
80 -feature_type => $ftype,
|
|
81 -cell_type => $ctype,
|
|
82 -name => $name,
|
|
83 -feature_class => 'annotated',
|
|
84 -description => 'Release 3.1',
|
|
85 -display_label => 'Short name',
|
|
86 -input_set => $iset,
|
|
87 );
|
|
88 Description: Constructor for FeatureSet objects.
|
|
89 Returntype : Bio::EnsEMBL::Funcgen::FeatureSet
|
|
90 Exceptions : Throws if FeatureType defined
|
|
91 Caller : General
|
|
92 Status : At risk
|
|
93
|
|
94 =cut
|
|
95
|
|
96 sub new {
|
|
97 my $caller = shift;
|
|
98 my $class = ref($caller) || $caller;
|
|
99 my $self = $class->SUPER::new(@_);
|
|
100
|
|
101 my ( $desc, $dlabel, $iset_id, $iset, $exp_id, $exp ) =
|
|
102 rearrange( [
|
|
103 'DESCRIPTION', 'DISPLAY_LABEL',
|
|
104 'INPUT_SET_ID', 'INPUT_SET', 'EXPERIMENT_ID', 'EXPERIMENT'
|
|
105 ],
|
|
106 @_ );
|
|
107
|
|
108
|
|
109 if($exp_id || $exp){
|
|
110 throw('Passing an Experiment or an experiment_id is now deprecated,'.
|
|
111 ' please use -input_set or -input_set_id instead');
|
|
112 }
|
|
113
|
|
114 #Allow exp or exp_id to be passed to support storing and lazy loading
|
|
115
|
|
116 #Mandatory params checks here (setting done in Set.pm)
|
|
117 throw('Must provide a FeatureType')
|
|
118 if ( !defined $self->feature_type );
|
|
119
|
|
120 #explicit type check here to avoid invalid types being imported as NULL
|
|
121 #subsequently throwing errors on retrieval
|
|
122 my $type = $self->feature_class;
|
|
123
|
|
124 if ( !( $type && exists $valid_classes{$type} ) ) {
|
|
125 throw( 'You must define a valid FeatureSet type e.g. ' .
|
|
126 join( ', ', keys %valid_classes ) );
|
|
127 }
|
|
128
|
|
129 #Direct assignment to prevent need for set arg test in method
|
|
130
|
|
131 $self->{'description'} = $desc if defined $desc;
|
|
132 $self->{'display_label'} = $dlabel if defined $dlabel;
|
|
133 $self->{'input_set_id'} = $iset_id if defined $iset_id;
|
|
134
|
|
135 if ( defined $iset ) {
|
|
136 #Exp obj is only passed during object storing
|
|
137 #so let the adaptor do is_stored_and_valid
|
|
138 $self->{'input_set'} = $iset;
|
|
139 }
|
|
140
|
|
141 return $self;
|
|
142 } ## end sub new
|
|
143
|
|
144
|
|
145
|
|
146 =head2 new_fast
|
|
147
|
|
148 Args : Hashref with all internal attributes set
|
|
149 Example : none
|
|
150 Description: Quick and dirty version of new. Only works if the code is very
|
|
151 disciplined.
|
|
152 Returntype : Bio::EnsEMBL::Funcgen::FeatureSet
|
|
153 Exceptions : None
|
|
154 Caller : General
|
|
155 Status : At Risk
|
|
156
|
|
157 =cut
|
|
158
|
|
159
|
|
160 sub new_fast {
|
|
161 return bless ($_[1], $_[0]);
|
|
162 }
|
|
163
|
|
164
|
|
165 =head2 description
|
|
166
|
|
167 Example : print "Feature set description is:\t".$fset->description."\n";
|
|
168 Description: Getter for the description of this FeatureSet. e.g. Release 3.1
|
|
169 Returntype : String
|
|
170 Exceptions : None
|
|
171 Caller : General
|
|
172 Status : At Risk
|
|
173
|
|
174 =cut
|
|
175
|
|
176 sub description {
|
|
177 return $_[0]->{'description'};
|
|
178 }
|
|
179
|
|
180
|
|
181
|
|
182 =head2 display_label
|
|
183
|
|
184 Example : print $rset->display_label;
|
|
185 Description: Getter for the display_label attribute for this FeatureSet.
|
|
186 Returntype : String
|
|
187 Exceptions : None
|
|
188 Caller : General
|
|
189 Status : At Risk
|
|
190
|
|
191 =cut
|
|
192
|
|
193 sub display_label {
|
|
194 my $self = shift;
|
|
195
|
|
196 if ( !$self->{'display_label'} ) {
|
|
197
|
|
198 if ( $self->feature_type->class() eq 'Regulatory Feature' ) {
|
|
199 $self->{'display_label'} = $self->name;
|
|
200 }
|
|
201 else {
|
|
202 #This still fails here if we don't have a class or a cell_type set
|
|
203
|
|
204 $self->{'display_label'} =
|
|
205 $self->feature_type->name() . " - " . $self->cell_type->name() .
|
|
206 " Enriched Sites";
|
|
207 }
|
|
208 }
|
|
209
|
|
210 return $self->{'display_label'};
|
|
211 }
|
|
212
|
|
213
|
|
214
|
|
215
|
|
216 =head2 get_FeatureAdaptor
|
|
217
|
|
218 Example :
|
|
219 Description: Retrieves and caches FeatureAdaptor of feature_set type
|
|
220 Returntype : Bio::EnsEMBL::Funcgen::DBSQL::ucfirst($self->feature_class())FeatureAdaptor
|
|
221 Exceptions : None
|
|
222 Caller : General
|
|
223 Status : At Risk
|
|
224
|
|
225 =cut
|
|
226
|
|
227
|
|
228 sub get_FeatureAdaptor{
|
|
229 my $self = shift;
|
|
230
|
|
231 if(! exists $self->{'adaptor_refs'}){
|
|
232
|
|
233 foreach my $valid_class(keys %valid_classes){
|
|
234 my $method = 'get_'.ucfirst($valid_class).'FeatureAdaptor';
|
|
235
|
|
236 $self->{'adaptor_refs'}{$valid_class} = $self->adaptor->db->$method;
|
|
237 }
|
|
238 }
|
|
239
|
|
240 return $self->{'adaptor_refs'}->{$self->feature_class()};
|
|
241
|
|
242 }
|
|
243
|
|
244
|
|
245
|
|
246 =head2 get_Features_by_Slice
|
|
247
|
|
248 Example : my @features = @{$FeatureSet->get_Features_by_Slice($slice)};
|
|
249 Description: Retrieves all Features for this FeatureSet for a given Slice
|
|
250 Returntype : ARRAYREF containing Features of the feature_set type i.e. Annotated, Regulatory or Supporting;
|
|
251 Exceptions : None
|
|
252 Caller : General
|
|
253 Status : At Risk
|
|
254
|
|
255 =cut
|
|
256
|
|
257 sub get_Features_by_Slice{
|
|
258 my ($self, $slice) = @_;
|
|
259
|
|
260 return $self->get_FeatureAdaptor->fetch_all_by_Slice_FeatureSets($slice, [$self]);
|
|
261 }
|
|
262
|
|
263
|
|
264 =head2 get_Features_by_FeatureType
|
|
265
|
|
266 Arg[0] : Bio::EnsEMBL::Funcgen::FeatureType
|
|
267 Example : my @features = @{$FeatureSet->get_Features_by_FeatureType($ftype)};
|
|
268 Description: Retrieves all Features for this FeatureSet for a given FeatureType
|
|
269 or associated FeatureType. This is mainly used by external FeatureSets
|
|
270 which can sometimes have more than one associated FeatureType.
|
|
271 Returntype : ARRAYREF
|
|
272 Exceptions : None
|
|
273 Caller : General
|
|
274 Status : At Risk
|
|
275
|
|
276 =cut
|
|
277
|
|
278
|
|
279 sub get_Features_by_FeatureType{
|
|
280 my ($self, $type) = @_;
|
|
281
|
|
282 return $self->get_FeatureAdaptor->fetch_all_by_FeatureType_FeatureSets($type, [$self]);
|
|
283 }
|
|
284
|
|
285
|
|
286 =head2 get_all_Features
|
|
287
|
|
288 Example : my @features = @{$FeatureSet->get_all_Features};
|
|
289 Description: Retrieves all Features for this FeatureSet
|
|
290 Returntype : ARRAYREF
|
|
291 Exceptions : None
|
|
292 Caller : General
|
|
293 Status : At Risk
|
|
294
|
|
295 =cut
|
|
296
|
|
297 sub get_all_Features{
|
|
298 my $self = shift;
|
|
299
|
|
300 return $self->get_FeatureAdaptor->fetch_all_by_FeatureSets([$self]);
|
|
301 }
|
|
302
|
|
303
|
|
304
|
|
305
|
|
306 =head2 is_focus_set
|
|
307
|
|
308 Args : None
|
|
309 Example : if($fset->is_focus_set){ ... }
|
|
310 Description: Returns true if FeatureSet is a focus set used in the RegulatoryBuild
|
|
311 Returntype : Boolean
|
|
312 Exceptions : Throws if meta entry not present
|
|
313 Caller : General
|
|
314 Status : At Risk
|
|
315
|
|
316 =cut
|
|
317
|
|
318 sub is_focus_set{
|
|
319 my $self = shift;
|
|
320
|
|
321 if(! defined $self->{focus_set}){
|
|
322
|
|
323 if(! defined $self->cell_type){
|
|
324 warn "FeatureSet without an associated CellType cannot be a focus set:\t".$self->name;
|
|
325 $self->{focus_set} = 0;
|
|
326 }
|
|
327 else{
|
|
328 $self->{focus_set} = $self->adaptor->fetch_focus_set_config_by_FeatureSet($self);
|
|
329 }
|
|
330 }
|
|
331
|
|
332 return $self->{focus_set};
|
|
333 }
|
|
334
|
|
335
|
|
336 =head2 is_attribute_set
|
|
337
|
|
338 Args : None
|
|
339 Example : if($fset->is_attribute_set){ ... }
|
|
340 Description: Returns true if FeatureSet is a supporting/attribute(focus or not) set used in the RegulatoryBuild
|
|
341 Returntype : Boolean
|
|
342 Exceptions : Throws if meta entry not present
|
|
343 Caller : General
|
|
344 Status : At Risk
|
|
345
|
|
346 =cut
|
|
347
|
|
348 sub is_attribute_set{
|
|
349 my $self = shift;
|
|
350
|
|
351 if(! defined $self->{attribute_set}){
|
|
352
|
|
353 if(! defined $self->cell_type){
|
|
354 warn "FeatureSet without an associated CellType cannot be a attribute set:\t".$self->name;
|
|
355 $self->{attribute_set} = 0;
|
|
356 }
|
|
357 else{
|
|
358 $self->{attribute_set} = $self->adaptor->fetch_attribute_set_config_by_FeatureSet($self);
|
|
359 }
|
|
360 }
|
|
361
|
|
362 return $self->{attribute_set};
|
|
363 }
|
|
364
|
|
365
|
|
366 =head2 get_InputSet
|
|
367
|
|
368 Example : my $input_set = $FeatureSet->get_InputSet;
|
|
369 Description: Retrieves the InputSet for this FeatureSet
|
|
370 Returntype : Bio::EnsEMBL::Funcgen::InputSet
|
|
371 Exceptions : None
|
|
372 Caller : General
|
|
373 Status : At Risk
|
|
374
|
|
375 =cut
|
|
376
|
|
377 sub get_InputSet{
|
|
378 my $self = shift;
|
|
379
|
|
380 if( (! defined $self->{input_set}) &&
|
|
381 (defined $self->{input_set_id}) ){
|
|
382 $self->{input_set} = $self->adaptor->db->get_InputSetAdaptor->fetch_by_dbID($self->{input_set_id});
|
|
383 }
|
|
384
|
|
385 return $self->{input_set};
|
|
386 }
|
|
387
|
|
388
|
|
389
|
|
390 =head2 source_label
|
|
391
|
|
392 Example : my $source_label = $fset->source_label;
|
|
393 Description: Retrieves the source label this FeatureSet, used in zmenus
|
|
394 Returntype : Arrayref of Strings
|
|
395 Exceptions : None
|
|
396 Caller : Webcode zmenus
|
|
397 Status : At Risk - remove, to be done by webcode?
|
|
398
|
|
399 =cut
|
|
400
|
|
401 #These are used to link through to the experiment view based on feature_set_id
|
|
402
|
|
403 sub source_label{
|
|
404 my $self = shift;
|
|
405
|
|
406 if (! defined $self->{source_label}) {
|
|
407 my $input_set = $self->get_InputSet;
|
|
408 my @source_labels;
|
|
409
|
|
410 if ($input_set) {
|
|
411
|
|
412
|
|
413 foreach my $isset(@{$input_set->get_InputSubsets}){
|
|
414
|
|
415 if(defined $isset->archive_id){
|
|
416 push @source_labels, $isset->archive_id;
|
|
417 }
|
|
418 #Archive IDs e.g. SRX identifiers or undef.
|
|
419 }
|
|
420
|
|
421 #Append project name
|
|
422 my $exp_group = $input_set->get_Experiment->experimental_group;
|
|
423
|
|
424 if ($exp_group &&
|
|
425 $exp_group->is_project) {
|
|
426 push @source_labels, $exp_group->name;
|
|
427 }
|
|
428 }
|
|
429
|
|
430
|
|
431 $self->{source_label} = join(' ', @source_labels);
|
|
432 }
|
|
433
|
|
434 return $self->{source_label};
|
|
435 }
|
|
436
|
|
437
|
|
438
|
|
439
|
|
440 ### DEPRECATED ###
|
|
441
|
|
442 =head2 get_Experiment
|
|
443 #
|
|
444 # Example : my $exp = $FeatureSet->get_Experiment;
|
|
445 # Description: Retrieves the Experiment for this FeatureSet
|
|
446 # Returntype : Bio::EnsEMBL::Funcgen::Experiment
|
|
447 # Exceptions : None
|
|
448 # Caller : General
|
|
449 Status : DEPRECATED
|
|
450
|
|
451 =cut
|
|
452
|
|
453 sub get_Experiment{
|
|
454 throw('FeatureSet::get_Experiment is not longer supported, please use FeatureSet::get_InputSet');
|
|
455 }
|
|
456
|
|
457
|
|
458 1;
|