annotate variant_effect_predictor/Bio/EnsEMBL/DBSQL/BaseFeatureAdaptor.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 =head1 LICENSE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 This software is distributed under a modified Apache license.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 For license details, please see
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 =head1 CONTACT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 <helpdesk@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor - An Abstract Base class for all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 FeatureAdaptors
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 Abstract class - should not be instantiated. Implementation of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 abstract methods must be performed by subclasses.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 This is a base adaptor for feature adaptors. This base class is simply a way
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 of eliminating code duplication through the implementation of methods
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 common to all feature adaptors.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 =head1 METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41 package Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 use vars qw(@ISA @EXPORT);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 use Bio::EnsEMBL::DBSQL::BaseAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 use Bio::EnsEMBL::Utils::Cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 use Bio::EnsEMBL::Utils::Exception qw(warning throw deprecate stack_trace_dump);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 use Bio::EnsEMBL::Utils::Iterator;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 @ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 @EXPORT = (@{$DBI::EXPORT_TAGS{'sql_types'}});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 our $SLICE_FEATURE_CACHE_SIZE = 4;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 our $MAX_SPLIT_QUERY_SEQ_REGIONS = 3;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 our $SILENCE_CACHE_WARNINGS = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 Arg [1] : list of args @args
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 Superclass constructor arguments
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 Example : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 Description: Constructor which warns if caching has been switched off
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 Returntype : Bio::EnsEMBL::BaseFeatureAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 Caller : implementing subclass constructors
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 sub new {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 my ($class, @args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 my $self = $class->SUPER::new(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 if ( defined $self->db->no_cache() && $self->db->no_cache() && ! $SILENCE_CACHE_WARNINGS) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 warning( "You are using the API without caching most recent features. "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 . "Performance might be affected." );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 =head2 start_equals_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 Arg [1] : (optional) boolean $newval
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 Example : $bfa->start_equals_end(1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 Description: Getter/Setter for the start_equals_end flag. If set
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 to true sub _slice_fetch will use a simplified sql to retrieve 1bp slices.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 Returntype : boolean
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 Caller : EnsemblGenomes variation DB build
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 sub start_equals_end {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 my ( $self, $value ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 if ( defined($value) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 $self->{'start_equals_end'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 return $self->{'start_equals_end'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 =head2 clear_cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 Args : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 Example : my $sa =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 $registry->get_adaptor( 'Mus musculus', 'Core',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 'Slice' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 my $ga =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 $registry->get_adaptor( 'Mus musculus', 'Core',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 'Gene' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 my $slice =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 $sa->fetch_by_region( 'Chromosome', '1', 1e8,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 1.05e8 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 my $genes = $ga->fetch_all_by_Slice($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 $ga->clear_cache();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 Description : Empties the feature cache associated with this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 feature adaptor.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 Return type : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 Exceptions : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 Caller : General
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 Status : At risk (under development)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 sub clear_cache {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 %{$self->{_slice_feature_cache}} = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 =head2 _slice_feature_cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 Description : Returns the feature cache if we are allowed to cache and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 will build it if we need to. We will never return a reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 to the hash to avoid unintentional auto-vivfying caching
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 Returntype : Bio::EnsEMBL::Utils::Cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 Exceptions : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 Caller : Internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 sub _slice_feature_cache {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 return if $self->db()->no_cache();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 if(! exists $self->{_slice_feature_cache}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 tie my %cache, 'Bio::EnsEMBL::Utils::Cache', $SLICE_FEATURE_CACHE_SIZE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 $self->{_slice_feature_cache} = \%cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 return $self->{_slice_feature_cache};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 =head2 fetch_all_by_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 Arg [1] : Bio::EnsEMBL::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 the slice from which to obtain features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 Arg [2] : (optional) string $logic_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 the logic name of the type of features to obtain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 Example : $fts = $a->fetch_all_by_Slice($slice, 'Swall');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 Description: Returns a listref of features created from the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 which are on the Slice defined by $slice. If $logic_name is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 defined only features with an analysis of type $logic_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 will be returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 NOTE: only features that are entirely on the slice's seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 will be returned (i.e. if they hang off the start/end of a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 seq_region they will be discarded). Features can extend over the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 slice boundaries though (in cases where you have a slice that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 doesn't span the whole seq_region).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 Returntype : listref of Bio::EnsEMBL::SeqFeatures in Slice coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 Caller : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 sub fetch_all_by_Slice {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 my ($self, $slice, $logic_name) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 #fetch by constraint with empty constraint
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 return $self->fetch_all_by_Slice_constraint($slice, '', $logic_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 =head2 fetch_Iterator_by_Slice_method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 Arg [1] : CODE ref of Slice fetch method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 Arg [2] : ARRAY ref of parameters for Slice fetch method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 Arg [3] : Optional int: Slice index in parameters array
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 Arg [4] : Optional int: Slice chunk size. Default=500000
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 Example : my $slice_iter = $feature_adaptor->fetch_Iterator_by_Slice_method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 ($feature_adaptor->can('fetch_all_by_Slice_Arrays'),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 \@fetch_method_params,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 0,#Slice idx
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 while(my $feature = $slice_iter->next && defined $feature){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 #Do something here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 Description: Creates an Iterator which chunks the query Slice to facilitate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 large Slice queries which would have previously run out of memory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 Returntype : Bio::EnsEMBL::Utils::Iterator
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 Exceptions : Throws if mandatory params not valid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 Status : at risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 #Does not support Collections. See Funcgen ResultFeatureAdaptor::fetch_collection_Iterator_by_Slice_method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 sub fetch_Iterator_by_Slice_method{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 my ($self, $slice_method_ref, $params_ref, $slice_idx, $chunk_size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 if(! ( defined $slice_method_ref &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 ref($slice_method_ref) eq 'CODE')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 throw('Must pass a valid Slice fetch method CODE ref');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 if (! ($params_ref &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 ref($params_ref) eq 'ARRAY')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 #Don't need to check size here so long as we have valid Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 throw('You must pass a method params ARRAYREF');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 $slice_idx = 0 if(! defined $slice_idx);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 my $slice = $params_ref->[$slice_idx];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 $chunk_size ||= 1000000;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 my @feat_cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 my $finished = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 my $start = 1; #local coord for sub slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 my $end = $slice->length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 my $num_overlaps = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 my $coderef =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 sub {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 while (scalar(@feat_cache) == 0 &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 ! $finished) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 my $new_end = ($start + $chunk_size - 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 if ($new_end >= $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 # this is our last chunk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 $new_end = $end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 $finished = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 #Chunk by sub slicing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 my $sub_slice = $slice->sub_Slice($start, $new_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 $params_ref->[$slice_idx] = $sub_slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 @feat_cache = @{ $slice_method_ref->($self, @$params_ref)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 #Remove & count overlapping features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 splice(@feat_cache, 0, $num_overlaps) if($num_overlaps);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 my $i;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 if (scalar(@feat_cache) > 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 my $feat_end = $feat_cache[$#feat_cache]->seq_region_end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 my $slice_end = $sub_slice->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 $num_overlaps = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 for ($i = $#feat_cache; $i >=0; $i--) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 if ($feat_end > $slice_end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 $feat_end = $feat_cache[$i]->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 $num_overlaps ++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 # update the start coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 $start = $new_end + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 #this maybe returning from an undef cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 #Need to sub this out even more?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 return shift @feat_cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 return Bio::EnsEMBL::Utils::Iterator->new($coderef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 =head2 fetch_Iterator_by_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 Arg [1] : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 Arg [2] : Optional string: logic name of analysis
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 Arg [3] : Optional int: Chunk size to iterate over. Default is 500000
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 Example : my $slice_iter = $feature_adaptor->fetch_Iterator_by_Slice($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 while(my $feature = $slice_iter->next && defined $feature){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 #Do something here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 Description: Creates an Iterator which chunks the query Slice to facilitate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 large Slice queries which would have previously run out of memory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 Returntype : Bio::EnsEMBL::Utils::Iterator
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 Exceptions : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 Status : at risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 sub fetch_Iterator_by_Slice{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 my ($self, $slice, $logic_name, $chunk_size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 my $method_ref = $self->can('fetch_all_by_Slice');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 return $self->fetch_Iterator_by_Slice_method($method_ref, [$slice, $logic_name], 0, $chunk_size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 =head2 fetch_all_by_Slice_and_score
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 Arg [1] : Bio::EnsEMBL::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 the slice from which to obtain features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 Arg [2] : (optional) float $score
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 lower bound of the the score of the features retrieved
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 Arg [3] : (optional) string $logic_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 the logic name of the type of features to obtain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 Example : $fts = $a->fetch_all_by_Slice_and_score($slice,90,'Swall');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 Description: Returns a list of features created from the database which are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 are on the Slice defined by $slice and which have a score
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 greater than $score. If $logic_name is defined,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 only features with an analysis of type $logic_name will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 Returntype : listref of Bio::EnsEMBL::SeqFeatures in Slice coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 Caller : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 sub fetch_all_by_Slice_and_score {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 my ( $self, $slice, $score, $logic_name ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 my $constraint;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 if ( defined($score) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 # Get the synonym of the primary_table
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 my @tabs = $self->_tables();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 my $syn = $tabs[0]->[1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 $constraint = sprintf( "%s.score > %s",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 $syn,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 $self->dbc()->db_handle()->quote( $score, SQL_FLOAT ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 return
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 $self->fetch_all_by_Slice_constraint( $slice, $constraint,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 $logic_name );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 =head2 fetch_all_by_Slice_constraint
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 Arg [1] : Bio::EnsEMBL::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 the slice from which to obtain features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 Arg [2] : (optional) string $constraint
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 An SQL query constraint (i.e. part of the WHERE clause)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 Arg [3] : (optional) string $logic_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 the logic name of the type of features to obtain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 Example : $fs = $a->fetch_all_by_Slice_constraint($slc, 'perc_ident > 5');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 Description: Returns a listref of features created from the database which
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 are on the Slice defined by $slice and fulfill the SQL
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 constraint defined by $constraint. If logic name is defined,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 only features with an analysis of type $logic_name will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 Returntype : listref of Bio::EnsEMBL::SeqFeatures in Slice coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 Exceptions : thrown if $slice is not defined
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 Caller : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 sub fetch_all_by_Slice_constraint {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 my ( $self, $slice, $constraint, $logic_name ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 my @result = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 if ( !ref($slice)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 || !( $slice->isa('Bio::EnsEMBL::Slice')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 or $slice->isa('Bio::EnsEMBL::LRGSlice') ) )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 throw("Bio::EnsEMBL::Slice argument expected.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 $constraint ||= '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 $constraint =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 $self->_logic_name_to_constraint( $constraint, $logic_name );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 # If the logic name was invalid, undef was returned
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 if ( !defined($constraint) ) { return [] }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 my $key;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 my $cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 # Will only use feature_cache if hasn't been no_cache attribute set
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 if (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 !( defined( $self->db()->no_cache() ) && $self->db()->no_cache() ) )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 #strain test and add to constraint if so to stop caching.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 if ( $slice->isa('Bio::EnsEMBL::StrainSlice') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 my $string =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 $self->dbc()->db_handle()->quote( $slice->strain_name() );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 if ( $constraint ne "" ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 $constraint .= " AND $string = $string ";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 $constraint .= " $string = $string ";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 # Check the cache and return the cached results if we have already
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 # done this query. The cache key is the made up from the slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 # name, the constraint, and the bound parameters (if there are any).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 $key = uc( join( ':', $slice->name(), $constraint ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 my $bind_params = $self->bind_param_generic_fetch();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 if ( defined($bind_params) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 $key .= ':'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 . join( ':', map { $_->[0] . '/' . $_->[1] } @{$bind_params} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 $cache = $self->_slice_feature_cache();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 if ( exists( $cache->{$key} ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 # Clear the bound parameters and return the cached data.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 $self->{'_bind_param_generic_fetch'} = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 return $cache->{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 } ## end if ( !( defined( $self...)))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 my $sa = $slice->adaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 # Hap/PAR support: retrieve normalized 'non-symlinked' slices.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 my @proj = @{ $sa->fetch_normalized_slice_projection($slice) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 if ( !@proj ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 throw( 'Could not retrieve normalized Slices. '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 . 'Database contains incorrect assembly_exception information.'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 # Want to get features on the FULL original slice as well as any
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 # symlinked slices.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 # Filter out partial slices from projection that are on same
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 # seq_region as original slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 my $sr_id = $slice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 @proj = grep { $_->to_Slice->get_seq_region_id() != $sr_id } @proj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 my $segment = bless( [ 1, $slice->length(), $slice ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 'Bio::EnsEMBL::ProjectionSegment' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 push( @proj, $segment );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 # construct list of Hap/PAR boundaries for entire seq region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475 my @bounds;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 my $ent_slice = $sa->fetch_by_seq_region_id($sr_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 if ( $slice->strand() == -1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 $ent_slice = $ent_slice->invert();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 my @ent_proj =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 @{ $sa->fetch_normalized_slice_projection($ent_slice) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 shift(@ent_proj); # skip first
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 @bounds = map { $_->from_start() - $slice->start() + 1 } @ent_proj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 # fetch features for the primary slice AND all symlinked slices
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 foreach my $seg (@proj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 my $offset = $seg->from_start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 my $seg_slice = $seg->to_Slice();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 my $features =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 $self->_slice_fetch( $seg_slice, $constraint );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 # If this was a symlinked slice offset the feature coordinates as
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 # needed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 if ( $seg_slice->name() ne $slice->name() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 FEATURE:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 foreach my $f ( @{$features} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 if ( $offset != 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 $f->{'start'} += $offset - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 $f->{'end'} += $offset - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 # discard boundary crossing features from symlinked regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 foreach my $bound (@bounds) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 if ( $f->{'start'} < $bound && $f->{'end'} >= $bound ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 next FEATURE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 $f->{'slice'} = $slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 push( @result, $f );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 push( @result, @{$features} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 } ## end foreach my $seg (@proj)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 # Will only use feature_cache when set attribute no_cache in DBAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 if ( defined($key) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 $cache->{$key} = \@result;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 return \@result;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 } ## end sub fetch_all_by_Slice_constraint
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 =head2 fetch_all_by_logic_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 Arg [3] : string $logic_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 the logic name of the type of features to obtain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 Example : $fs = $a->fetch_all_by_logic_name('foobar');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 Description: Returns a listref of features created from the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 only features with an analysis of type $logic_name will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 be returned. If the logic name is invalid (not in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 analysis table), a reference to an empty list will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 Returntype : listref of Bio::EnsEMBL::SeqFeatures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 Exceptions : thrown if no $logic_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 Caller : General
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 sub fetch_all_by_logic_name {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 my ( $self, $logic_name ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 if ( !defined($logic_name) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 throw("Need a logic_name");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 my $constraint = $self->_logic_name_to_constraint( '', $logic_name );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 if ( !defined($constraint) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 warning("Invalid logic name: $logic_name");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 return [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 return $self->generic_fetch($constraint);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 # Method that creates an object. Called by the _objs_from_sth() method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 # in the sub-classes (the various feature adaptors). Overridden by the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 # feature collection classes.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 sub _create_feature {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 my ( $self, $feature_type, $args ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 return $feature_type->new( %{$args} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 # This is the same as the above, but calls the new_fast() constructor of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 # the feature type.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 sub _create_feature_fast {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 my ( $self, $feature_type, $args ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 return $feature_type->new_fast($args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 # helper function used by fetch_all_by_Slice_constraint method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 sub _slice_fetch {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 my ( $self, $slice, $orig_constraint ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 my $slice_start = $slice->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 my $slice_end = $slice->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 my $slice_strand = $slice->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 my $slice_cs = $slice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 my $slice_seq_region = $slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 my $slice_seq_region_id = $slice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 #get the synonym and name of the primary_table
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 my @tabs = $self->_tables;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 my ( $tab_name, $tab_syn ) = @{ $tabs[0] };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 #find out what coordinate systems the features are in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 my $mcc = $self->db->get_MetaCoordContainer();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 my @feat_css = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 my $mca = $self->db->get_MetaContainer();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 my $value_list = $mca->list_value_by_key( $tab_name . "build.level" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 if ( @$value_list and $slice->is_toplevel() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 push @feat_css, $slice_cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 @feat_css =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 @{ $mcc->fetch_all_CoordSystems_by_feature_type($tab_name) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 my $asma = $self->db->get_AssemblyMapperAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 my @features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 # fetch the features from each coordinate system they are stored in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 COORD_SYSTEM: foreach my $feat_cs (@feat_css) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 my $mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 my @coords;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 my @ids;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 if ( $feat_cs->equals($slice_cs) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 # no mapping is required if this is the same coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626 my $max_len = $self->_max_feature_length()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 || $mcc->fetch_max_length_by_CoordSystem_feature_type( $feat_cs,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 $tab_name );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 my $constraint = $orig_constraint;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 my $sr_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 if ( $slice->adaptor() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 $sr_id = $slice->adaptor()->get_seq_region_id($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 $sr_id =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 $self->db()->get_SliceAdaptor()->get_seq_region_id($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 # If there is mapping information, use the external_seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 # to get features.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 my @sr_ids = ($sr_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645 while (1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 my $ext_sr_id = $self->get_seq_region_id_external($sr_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648 if ( $ext_sr_id == $sr_id ) { last }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650 push( @sr_ids, $ext_sr_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651 $sr_id = $ext_sr_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 $constraint .= " AND " if ($constraint);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 $constraint .= "${tab_syn}.seq_region_id IN ("
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 . join( ',', @sr_ids ) . ") AND";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 #faster query for 1bp slices where SNP data is not compressed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661 if ( $self->start_equals_end && $slice_start == $slice_end ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662 $constraint .=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 " AND ${tab_syn}.seq_region_start = $slice_end" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664 " AND ${tab_syn}.seq_region_end = $slice_start";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 if ( !$slice->is_circular() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 # Deal with the default case of a non-circular chromosome.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670 $constraint .= " ${tab_syn}.seq_region_start <= $slice_end AND "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 . "${tab_syn}.seq_region_end >= $slice_start";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 if ( $max_len ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674 my $min_start = $slice_start - $max_len;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 $constraint .= " AND ${tab_syn}.seq_region_start >= $min_start";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 # Deal with the case of a circular chromosome.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 if ( $slice_start > $slice_end ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 $constraint .= " ( ${tab_syn}.seq_region_start >= $slice_start "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682 . "OR ${tab_syn}.seq_region_start <= $slice_end "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 . "OR ${tab_syn}.seq_region_end >= $slice_start "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684 . "OR ${tab_syn}.seq_region_end <= $slice_end "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 . "OR ${tab_syn}.seq_region_start > ${tab_syn}.seq_region_end)";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688 $constraint .= " ((${tab_syn}.seq_region_start <= $slice_end "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689 . "AND ${tab_syn}.seq_region_end >= $slice_start) "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 . "OR (${tab_syn}.seq_region_start > ${tab_syn}.seq_region_end "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691 . "AND (${tab_syn}.seq_region_start <= $slice_end "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692 . "OR ${tab_syn}.seq_region_end >= $slice_start)))";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698 my $fs = $self->generic_fetch( $constraint, undef, $slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700 # features may still have to have coordinates made relative to slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 # start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702 $fs = $self->_remap( $fs, $mapper, $slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704 push @features, @$fs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706 $mapper = $asma->fetch_by_CoordSystems( $slice_cs, $feat_cs );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708 next unless defined $mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710 # Get list of coordinates and corresponding internal ids for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711 # regions the slice spans
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 @coords =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713 $mapper->map( $slice_seq_region, $slice_start, $slice_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 $slice_strand, $slice_cs );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716 @coords = grep { !$_->isa('Bio::EnsEMBL::Mapper::Gap') } @coords;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718 next COORD_SYSTEM if ( !@coords );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720 @ids = map { $_->id() } @coords;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721 #coords are now id rather than name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 # @ids = @{$asma->seq_regions_to_ids($feat_cs, \@ids)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724 # When regions are large and only partially spanned
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725 # by slice it is faster to to limit the query with
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726 # start and end constraints. Take simple approach:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 # use regional constraints if there are less than a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728 # specific number of regions covered.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730 if ( @coords > $MAX_SPLIT_QUERY_SEQ_REGIONS ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731 my $constraint = $orig_constraint;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732 my $id_str = join( ',', @ids );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 $constraint .= " AND " if ($constraint);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 $constraint .= "${tab_syn}.seq_region_id IN ($id_str)";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735 my $fs = $self->generic_fetch( $constraint, $mapper, $slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737 $fs = $self->_remap( $fs, $mapper, $slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739 push @features, @$fs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742 # do multiple split queries using start / end constraints
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744 my $max_len = (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745 $self->_max_feature_length()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746 || $mcc->fetch_max_length_by_CoordSystem_feature_type(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747 $feat_cs, $tab_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748 ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750 my $len = @coords;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751 for ( my $i = 0; $i < $len; $i++ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752 my $constraint = $orig_constraint;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753 $constraint .= " AND " if ($constraint);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754 $constraint .=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755 "${tab_syn}.seq_region_id = "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756 . $ids[$i] . " AND "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757 . "${tab_syn}.seq_region_start <= "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758 . $coords[$i]->end() . " AND "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759 . "${tab_syn}.seq_region_end >= "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 . $coords[$i]->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762 if ($max_len) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763 my $min_start = $coords[$i]->start() - $max_len;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764 $constraint .=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765 " AND ${tab_syn}.seq_region_start >= $min_start";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767 my $fs = $self->generic_fetch( $constraint, $mapper, $slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769 $fs = $self->_remap( $fs, $mapper, $slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771 push @features, @$fs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773 } ## end else [ if ( @coords > $MAX_SPLIT_QUERY_SEQ_REGIONS)]
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774 } ## end else [ if ( $feat_cs->equals(...))]
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775 } ## end foreach my $feat_cs (@feat_css)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 return \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 } ## end sub _slice_fetch
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781 #for a given seq_region_id, gets the one used in an external database, if present, otherwise, returns the internal one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782 sub get_seq_region_id_external {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783 my ( $self, $sr_id ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784 my $cs_a = $self->db()->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785 return ( exists( $cs_a->{'_internal_seq_region_mapping'}->{$sr_id} )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786 ? $cs_a->{'_internal_seq_region_mapping'}->{$sr_id}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787 : $sr_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790 #for a given seq_region_id and coord_system, gets the one used in the internal (core) database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791 sub get_seq_region_id_internal{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792 my ( $self, $sr_id ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793 my $cs_a = $self->db()->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794 return ( exists $cs_a->{'_external_seq_region_mapping'}->{$sr_id}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795 ? $cs_a->{'_external_seq_region_mapping'}->{$sr_id}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796 : $sr_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800 # Helper function containing some common feature storing functionality
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802 # Given a Feature this will return a copy (or the same feature if no changes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803 # to the feature are needed) of the feature which is relative to the start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804 # of the seq_region it is on. The seq_region_id of the seq_region it is on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805 # is also returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807 # This method will also ensure that the database knows which coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808 # systems that this feature is stored in.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811 sub _pre_store {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813 my $feature = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815 if(!ref($feature) || !$feature->isa('Bio::EnsEMBL::Feature')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816 throw('Expected Feature argument.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818 my $slice = $feature->slice();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820 $self->_check_start_end_strand($feature->start(),$feature->end(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821 $feature->strand(), $slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 my $db = $self->db();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826 my $slice_adaptor = $db->get_SliceAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828 if(!ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice')) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829 throw('Feature must be attached to Slice to be stored.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832 # make sure feature coords are relative to start of entire seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834 if($slice->start != 1 || $slice->strand != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 #move feature onto a slice of the entire seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836 $slice = $slice_adaptor->fetch_by_region($slice->coord_system->name(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 $slice->seq_region_name(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838 undef, #start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839 undef, #end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840 undef, #strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841 $slice->coord_system->version());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843 $feature = $feature->transfer($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845 if(!$feature) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846 throw('Could not transfer Feature to slice of ' .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847 'entire seq_region prior to storing');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851 # Ensure this type of feature is known to be stored in this coord system.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852 my $cs = $slice->coord_system;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854 my ($tab) = $self->_tables();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855 my $tabname = $tab->[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857 my $mcc = $db->get_MetaCoordContainer();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
859 $mcc->add_feature_type($cs, $tabname, $feature->length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
860
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
861 my $seq_region_id = $slice_adaptor->get_seq_region_id($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
862
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
863 if(!$seq_region_id) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
864 throw('Feature is associated with seq_region which is not in this DB.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
865 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
866
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
867 return ($feature, $seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
868 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
869
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
870
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
871 # The same function as _pre_store
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
872 # This one is used to store user uploaded features in XXX_userdata db
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
873
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
874 sub _pre_store_userdata {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
875 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
876 my $feature = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
877
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
878 if(!ref($feature) || !$feature->isa('Bio::EnsEMBL::Feature')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
879 throw('Expected Feature argument.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
880 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
881
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
882 my $slice = $feature->slice();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
883 my $slice_adaptor = $slice->adaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
884
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
885 $self->_check_start_end_strand($feature->start(),$feature->end(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
886 $feature->strand(), $slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
887
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
888
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
889 if(!ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice')) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
890 throw('Feature must be attached to Slice to be stored.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
891 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
892
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
893 # make sure feature coords are relative to start of entire seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
894
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
895 if($slice->start != 1 || $slice->strand != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
896 #move feature onto a slice of the entire seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
897 $slice = $slice_adaptor->fetch_by_region($slice->coord_system->name(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
898 $slice->seq_region_name(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
899 undef, #start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
900 undef, #end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
901 undef, #strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
902 $slice->coord_system->version());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
903
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
904 $feature = $feature->transfer($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
905
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
906 if(!$feature) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
907 throw('Could not transfer Feature to slice of ' .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
908 'entire seq_region prior to storing');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
909 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
910 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
911
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
912 # Ensure this type of feature is known to be stored in this coord system.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
913 my $cs = $slice->coord_system;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
914
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
915 my ($tab) = $self->_tables();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
916 my $tabname = $tab->[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
917
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
918 my $db = $self->db;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
919 my $mcc = $db->get_MetaCoordContainer();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
920
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
921 $mcc->add_feature_type($cs, $tabname, $feature->length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
922
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
923 my $seq_region_id = $slice_adaptor->get_seq_region_id($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
924
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
925 if(!$seq_region_id) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
926 throw('Feature is associated with seq_region which is not in this DB.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
927 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
928
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
929 return ($feature, $seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
930 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
931
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
932
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
933 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
934 # helper function used to validate start/end/strand and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
935 # hstart/hend/hstrand etc.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
936 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
937 sub _check_start_end_strand {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
938 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
939 my $start = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
940 my $end = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
941 my $strand = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
942 my $slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
943
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
944 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
945 # Make sure that the start, end, strand are valid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
946 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
947 if(int($start) != $start) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
948 throw("Invalid Feature start [$start]. Must be integer.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
949 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
950 if(int($end) != $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
951 throw("Invalid Feature end [$end]. Must be integer.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
952 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
953 if(int($strand) != $strand || $strand < -1 || $strand > 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
954 throw("Invalid Feature strand [$strand]. Must be -1, 0 or 1.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
955 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
956 if($end < $start && !$slice->is_circular()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
957 throw("Invalid Feature start/end [$start/$end]. Start must be less " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
958 "than or equal to end.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
959 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
960
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
961 return 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
962 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
963
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
964
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
965 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
966 # Given a list of features checks if they are in the correct coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
967 # by looking at the first features slice. If they are not then they are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
968 # converted and placed on the slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
969 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
970 sub _remap {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
971 my ( $self, $features, $mapper, $slice ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
972
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
973 #check if any remapping is actually needed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
974 if(@$features && (!$features->[0]->isa('Bio::EnsEMBL::Feature') ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
975 $features->[0]->slice == $slice)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
976 return $features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
977 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
978
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
979 #remapping has not been done, we have to do our own conversion from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
980 #to slice coords
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
981
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
982 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
983
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
984 my $slice_start = $slice->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
985 my $slice_end = $slice->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
986 my $slice_strand = $slice->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
987 my $slice_cs = $slice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
988
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
989 my ($seq_region, $start, $end, $strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
990
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
991 my $slice_seq_region_id = $slice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
992 my $slice_seq_region = $slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
993
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
994 foreach my $f (@$features) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
995 #since feats were obtained in contig coords, attached seq is a contig
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
996 my $fslice = $f->slice();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
997 if(!$fslice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
998 throw("Feature does not have attached slice.\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
999 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1000 my $fseq_region = $fslice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1001 my $fseq_region_id = $fslice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1002 my $fcs = $fslice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1003
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1004 if(!$slice_cs->equals($fcs)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1005 #slice of feature in different coord system, mapping required
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1006
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1007 ($seq_region, $start, $end, $strand) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1008 $mapper->fastmap($fseq_region_id,$f->start(),$f->end(),$f->strand(),$fcs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1009
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1010 # undefined start means gap
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1011 next if(!defined $start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1012 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1013 $start = $f->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1014 $end = $f->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1015 $strand = $f->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1016 $seq_region = $f->slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1017 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1018
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1019 # maps to region outside desired area
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1020 next if ($start > $slice_end) || ($end < $slice_start) ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1021 ($slice_seq_region ne $seq_region);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1022
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1023 #shift the feature start, end and strand in one call
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1024 if($slice_strand == -1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1025 $f->move( $slice_end - $end + 1, $slice_end - $start + 1, $strand * -1 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1026 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1027 $f->move( $start - $slice_start + 1, $end - $slice_start + 1, $strand );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1028 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1029
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1030 $f->slice($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1031
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1032 push @out,$f;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1033 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1034
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1035 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1036 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1037
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1038
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1039 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1040 # Given a logic name and an existing constraint this will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1041 # add an analysis table constraint to the feature. Note that if no
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1042 # analysis_id exists in the columns of the primary table then no
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1043 # constraint is added at all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1044 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1045 sub _logic_name_to_constraint {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1046 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1047 my $constraint = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1048 my $logic_name = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1049
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1050 return $constraint if(!$logic_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1051
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1052 #make sure that an analysis_id exists in the primary table
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1053 my ($prim_tab) = $self->_tables();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1054 my $prim_synonym = $prim_tab->[1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1055
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1056 my $found_analysis=0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1057 foreach my $col ($self->_columns) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1058 my ($syn,$col_name) = split(/\./,$col);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1059 next if($syn ne $prim_synonym);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1060 if($col_name eq 'analysis_id') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1061 $found_analysis = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1062 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1063 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1064 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1065
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1066 if(!$found_analysis) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1067 warning("This feature is not associated with an analysis.\n" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1068 "Ignoring logic_name argument = [$logic_name].\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1069 return $constraint;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1070 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1071
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1072 my $aa = $self->db->get_AnalysisAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1073 my $an = $aa->fetch_by_logic_name($logic_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1074
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1075 if ( !defined($an) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1076 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1077 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1078
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1079 my $an_id = $an->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1080
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1081 $constraint .= ' AND' if($constraint);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1082 $constraint .= " ${prim_synonym}.analysis_id = $an_id";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1083 return $constraint;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1084 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1085
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1086
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1087 =head2 store
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1088
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1089 Arg [1] : list of Bio::EnsEMBL::SeqFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1090 Example : $adaptor->store(@feats);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1091 Description: ABSTRACT Subclasses are responsible for implementing this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1092 method. It should take a list of features and store them in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1093 the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1094 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1095 Exceptions : thrown method is not implemented by subclass
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1096 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1097 Status : At Risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1098 : throws if called.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1099
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1100 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1101
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1102 sub store{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1103 my $self = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1104
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1105 throw("Abstract method store not defined by implementing subclass\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1106 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1107
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1108
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1109 =head2 remove
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1110
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1111 Arg [1] : A feature $feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1112 Example : $feature_adaptor->remove($feature);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1113 Description: This removes a feature from the database. The table the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1114 feature is removed from is defined by the abstract method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1115 _tablename, and the primary key of the table is assumed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1116 to be _tablename() . '_id'. The feature argument must
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1117 be an object implementing the dbID method, and for the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1118 feature to be removed from the database a dbID value must
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1119 be returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1120 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1121 Exceptions : thrown if $feature arg does not implement dbID(), or if
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1122 $feature->dbID is not a true value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1123 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1124 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1126 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1127
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1128
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1129 sub remove {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1130 my ($self, $feature) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1131
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1132 if(!$feature || !ref($feature) || !$feature->isa('Bio::EnsEMBL::Feature')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1133 throw('Feature argument is required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1134 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1135
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1136 if(!$feature->is_stored($self->db)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1137 throw("This feature is not stored in this database");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1138 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1140 my @tabs = $self->_tables;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1141 my ($table) = @{$tabs[0]};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1142
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1143 my $sth = $self->prepare("DELETE FROM $table WHERE ${table}_id = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1144 $sth->bind_param(1,$feature->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1145 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1146
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1147 #unset the feature dbID ad adaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1148 $feature->dbID(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1149 $feature->adaptor(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1151 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1152 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1153
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1154
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1155 =head2 remove_by_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1156
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1157 Arg [1] : Bio::Ensembl::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1158 Example : $feature_adaptor->remove_by_Slice($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1159 Description: This removes features from the database which lie on a region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1160 represented by the passed in slice. Only features which are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1161 fully contained by the slice are deleted; features which overlap
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1162 the edge of the slice are not removed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1163 The table the features are removed from is defined by
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1164 the abstract method_tablename.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1165 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1166 Exceptions : thrown if no slice is supplied
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1167 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1168 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1169
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1170 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1171
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1172 sub remove_by_Slice {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1173 my ($self, $slice) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1174
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1175 if(!$slice || !ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice')) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1176 throw("Slice argument is required");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1177 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1178
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1179 my @tabs = $self->_tables;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1180 my ($table_name) = @{$tabs[0]};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1181
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1182 my $seq_region_id = $self->db->get_SliceAdaptor->get_seq_region_id($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1183 my $start = $slice->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1184 my $end = $slice->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1185
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1186 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1187 # Delete only features fully on the slice, not overlapping ones
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1188 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1189 my $sth = $self->prepare("DELETE FROM $table_name " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1190 "WHERE seq_region_id = ? " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1191 "AND seq_region_start >= ? " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1192 "AND seq_region_end <= ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1194 $sth->bind_param(1,$seq_region_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1195 $sth->bind_param(2,$start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1196 $sth->bind_param(3,$end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1197 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1198 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1199 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1200
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1201
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1202 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1203 # Internal function. Allows the max feature length which is normally
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1204 # retrieved from the meta_coord table to be overridden. This allows
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1205 # for some significant optimizations to be put in when it is known
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1206 # that requested features will not be over a certain size.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1207 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1208 sub _max_feature_length {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1209 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1210 return $self->{'_max_feature_length'} = shift if(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1211 return $self->{'_max_feature_length'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1212 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1213
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1214
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1215 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1216 # Lists all seq_region_ids that a particular feature type is found on.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1217 # Useful e.g. for finding out which seq_regions have genes.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1218 # Returns a listref of seq_region_ids.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1219 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1220 sub _list_seq_region_ids {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1221 my ($self, $table) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1222
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1223 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1224
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1225 my $sql = qq(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1226 SELECT DISTINCT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1227 sr.seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1228 FROM seq_region sr,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1229 $table a,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1230 coord_system cs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1231 WHERE sr.seq_region_id = a.seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1232 AND sr.coord_system_id = cs.coord_system_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1233 AND cs.species_id = ?);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1234
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1235 my $sth = $self->prepare($sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1236
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1237 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1238
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1239 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1240
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1241 while (my ($id) = $sth->fetchrow) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1242 push(@out, $id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1243 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1244
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1245 $sth->finish;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1246
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1247 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1248 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1249
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1250
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1251 =head1 DEPRECATED METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1252
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1253 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1254
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1255
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1256 =head2 fetch_all_by_RawContig_constraint
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1257
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1258 Description: DEPRECATED use fetch_all_by_RawContig_constraint instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1259
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1260 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1261
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1262 sub fetch_all_by_RawContig_constraint {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1263 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1264 deprecate('Use fetch_all_by_Slice_constraint() instead.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1265 return $self->fetch_all_by_slice_constraint(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1266 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1267
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1268 =head2 fetch_all_by_RawContig
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1269
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1270 Description: DEPRECATED use fetch_all_by_Slice instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1271
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1272 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1273
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1274 sub fetch_all_by_RawContig {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1275 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1276 deprecate('Use fetch_all_by_Slice() instead.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1277 return $self->fetch_all_by_Slice(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1278 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1279
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1280 =head2 fetch_all_by_RawContig_and_score
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1281
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1282 Description: DEPRECATED use fetch_all_by_Slice_and_score instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1284 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1285
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1286 sub fetch_all_by_RawContig_and_score{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1287 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1288 deprecate('Use fetch_all_by_Slice_and_score() instead.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1289 return $self->fetch_all_by_Slice_and_score(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1290 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1291
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1292 =head2 remove_by_RawContig
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1293
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1294 Description: DEPRECATED use remove_by_Slice instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1295
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1296 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1297
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1298 sub remove_by_RawContig {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1299 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1300 deprecate("Use remove_by_Slice instead");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1301 return $self->remove_by_Slice(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1302 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1303
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1304
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1305 sub remove_by_analysis_id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1306 my ($self, $analysis_id) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1307
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1308 $analysis_id or throw("Must call with analysis id");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1309
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1310 my @tabs = $self->_tables;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1311 my ($tablename) = @{$tabs[0]};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1312
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1313 my $sql = "DELETE FROM $tablename WHERE analysis_id = $analysis_id";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1314 # warn "SQL : $sql";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1315
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1316 my $sth = $self->prepare($sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1317 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1318 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1319 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1320
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1321 sub remove_by_feature_id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1322 my ($self, $features_list) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1324 my @feats = @$features_list or throw("Must call store with features");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1325
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1326 my @tabs = $self->_tables;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1327 my ($tablename) = @{$tabs[0]};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1328
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1329 my $sql = sprintf "DELETE FROM $tablename WHERE ${tablename}_id IN (%s)", join ', ', @feats;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1330 # warn "SQL : $sql";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1331
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1332 my $sth = $self->prepare($sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1333 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1334 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1335 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1336
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1337
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1338 1;