annotate variant_effect_predictor/Bio/EnsEMBL/DBSQL/AssemblyExceptionFeatureAdaptor.pm @ 2:a5976b2dce6f

changing defualt values for ensembl database
author mahtabm
date Thu, 11 Apr 2013 17:15:42 +1000
parents 1f6dce3d34e0
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::AssemblyExceptionFeatureAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 my $assembly_exception_feature_adaptor =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 $database_adaptor->get_AssemblyExceptionFeatureAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30 @assembly_exception_features =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 $assembly_exception_feature_adaptor->fetch_all_by_Slice($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 Assembly Exception Feature Adaptor - database access for assembly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 exception features.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 =head1 METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 package Bio::EnsEMBL::DBSQL::AssemblyExceptionFeatureAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 use warnings;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 no warnings qw(uninitialized);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 use Bio::EnsEMBL::DBSQL::BaseAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 use Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 use Bio::EnsEMBL::AssemblyExceptionFeature;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 use Bio::EnsEMBL::Utils::Exception qw(throw warning);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 use Bio::EnsEMBL::Utils::Cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 our @ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 # set the number of slices you'd like to cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 our $ASSEMBLY_EXCEPTION_FEATURE_CACHE_SIZE = 100;
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 just initializes internal cache structures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 Returntype : Bio::EnsEMBL::DBSQL::AssemblyExceptionFeatureAdaptor
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 $caller = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 my $class = ref($caller) || $caller;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 my $self = $class->SUPER::new(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 # initialize an LRU cache for slices
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 my %cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 tie(%cache, 'Bio::EnsEMBL::Utils::Cache',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 $ASSEMBLY_EXCEPTION_FEATURE_CACHE_SIZE);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 $self->{'_aexc_slice_cache'} = \%cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 =head2 fetch_all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 Arg [1] : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 Example : my @axfs = @{$axfa->fetch_all()};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 Description: Retrieves all assembly exception features which are in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 database and builds internal caches of the features.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 Returntype : reference to list of Bio::EnsEMBL::AssemblyExceptionFeatures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 Caller : fetch_by_dbID, fetch_by_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 sub fetch_all {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 # this is the "global" cache for all assembly exception features in the db
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 if(defined($self->{'_aexc_cache'})) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 return $self->{'_aexc_cache'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 my $statement = qq(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 SELECT ae.assembly_exception_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 ae.seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 ae.seq_region_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 ae.seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 ae.exc_type,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 ae.exc_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 ae.exc_seq_region_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 ae.exc_seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 ae.ori
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 FROM assembly_exception ae,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 coord_system cs,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 seq_region sr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 WHERE cs.species_id = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 AND sr.coord_system_id = cs.coord_system_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 AND sr.seq_region_id = ae.seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 my $sth = $self->prepare($statement);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 my ($ax_id, $sr_id, $sr_start, $sr_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 $x_type, $x_sr_id, $x_sr_start, $x_sr_end, $ori);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 $sth->bind_columns(\$ax_id, \$sr_id, \$sr_start, \$sr_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 \$x_type, \$x_sr_id, \$x_sr_start, \$x_sr_end, \$ori);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 my @features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 my $sa = $self->db()->get_SliceAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 $self->{'_aexc_dbID_cache'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 my $slice = $sa->fetch_by_seq_region_id($sr_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 my $x_slice = $sa->fetch_by_seq_region_id($x_sr_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 # each row creates TWO features, each of which has alternate_slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 # pointing to the "other" one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 my $a = Bio::EnsEMBL::AssemblyExceptionFeature->new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 ('-dbID' => $ax_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 '-start' => $sr_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 '-end' => $sr_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 '-strand' => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 '-adaptor' => $self,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 '-slice' => $slice,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 '-alternate_slice' => $x_slice->sub_Slice($x_sr_start, $x_sr_end),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 '-type' => $x_type);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 push @features, $a;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 $self->{'_aexc_dbID_cache'}->{$ax_id} = $a;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 push @features, Bio::EnsEMBL::AssemblyExceptionFeature->new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 ('-dbID' => $ax_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 '-start' => $x_sr_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 '-end' => $x_sr_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 '-strand' => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 '-adaptor' => $self,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 '-slice' => $x_slice,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 '-alternate_slice' => $slice->sub_Slice($sr_start, $sr_end),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 '-type' => "$x_type REF" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 $self->{'_aexc_cache'} = \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 return \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 =head2 fetch_by_dbID
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 Arg [1] : int $dbID
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 Example : my $axf = $axfa->fetch_by_dbID(3);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 Description: Retrieves a single assembly exception feature via its internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 identifier. Note that this only retrieves one of the two
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 assembly exception features which are represented by a single
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 row in the assembly_exception table.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 Returntype : Bio::EnsEMBL::AssemblyExceptionFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 sub fetch_by_dbID {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 my $dbID = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 if(!exists($self->{'_aexc_dbID_cache'})) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 # force loading of cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 $self->fetch_all();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 return $self->{'_aexc_dbID_cache'}->{$dbID};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 =head2 fetch_all_by_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 Arg [1] : Bio::EnsEMBL::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 Example : my @axfs = @{$axfa->fetch_all_by_Slice($slice)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 Description: Retrieves all assembly exception features which overlap the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 provided slice. The returned features will be in coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 system of the slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 Returntype : reference to list of Bio::EnsEMBL::AssemblyException features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 Caller : Feature::get_all_alt_locations, general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 sub fetch_all_by_Slice {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 my $slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 my $key= uc($slice->name());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 # return features from the slice cache if present
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 if(exists($self->{'_aexc_slice_cache'}->{$key})) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 return $self->{'_aexc_slice_cache'}->{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 my $all_features = $self->fetch_all();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 my $mcc = $self->db()->get_MetaCoordContainer();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 my $css = $mcc->fetch_all_CoordSystems_by_feature_type('assembly_exception');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 my @features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 my $ma = $self->db()->get_AssemblyMapperAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 foreach my $cs (@$css) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 my $mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 if($cs->equals($slice->coord_system)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 $mapper = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 $mapper = $ma->fetch_by_CoordSystems($cs,$slice->coord_system());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 push @features, @{ $self->_remap($all_features, $mapper, $slice) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 $self->{'_aexc_slice_cache'}->{$key} = \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 return \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 # Given a list of features checks if they are in the correct coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 # by looking at the first features slice. If they are not then they are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 # converted and placed on the slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 # Note that this is a re-implementation of a method with the same name in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 # BaseFeatureAdaptor, and in contrast to the latter which maps features in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 # place, this method returns a remapped copy of each feature. The reason for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 # this is to get around conflicts with caching.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 sub _remap {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 my ($self, $features, $mapper, $slice) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 # check if any remapping is actually needed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 if(@$features && (!$features->[0]->isa('Bio::EnsEMBL::Feature') ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 $features->[0]->slice == $slice)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 return $features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 # remapping has not been done, we have to do our own conversion from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 # to slice coords
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 my $slice_start = $slice->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 my $slice_end = $slice->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 my $slice_strand = $slice->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 my $slice_cs = $slice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 my ($seq_region, $start, $end, $strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 my $slice_seq_region = $slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 foreach my $f (@$features) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 # since feats were obtained in contig coords, attached seq is a contig
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 my $fslice = $f->slice();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 if(!$fslice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 throw("Feature does not have attached slice.\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 my $fseq_region = $fslice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 my $fcs = $fslice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 if(!$slice_cs->equals($fcs)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 # slice of feature in different coord system, mapping required
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 ($seq_region, $start, $end, $strand) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 $mapper->fastmap($fseq_region,$f->start(),$f->end(),$f->strand(),$fcs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 # undefined start means gap
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 next if(!defined $start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 $start = $f->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 $end = $f->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 $strand = $f->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 $seq_region = $f->slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 # maps to region outside desired area
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 next if ($start > $slice_end) || ($end < $slice_start) ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 ($slice_seq_region ne $seq_region);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 # create new copies of successfully mapped feaatures with shifted start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 # end and strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 my ($new_start, $new_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 if($slice_strand == -1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 $new_start = $slice_end - $end + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 $new_end = $slice_end - $start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 $new_start = $start - $slice_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 $new_end = $end - $slice_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 push @out, Bio::EnsEMBL::AssemblyExceptionFeature->new(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 '-dbID' => $f->dbID,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 '-start' => $new_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 '-end' => $new_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 '-strand' => $strand * $slice_strand,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 '-adaptor' => $self,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 '-slice' => $slice,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 '-alternate_slice' => $f->alternate_slice,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 '-type' => $f->type,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 =head2 store
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 Arg[1] : Bio::EnsEMBL::AssemblyException $asx
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 Arg[2] : Bio::EnsEMBL::AssemblyException $asx2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 Example : $asx = Bio::EnsEMBL::AssemblyExceptionFeature->new(...)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 $asx2 = Bio::EnsEMBL::AssemblyExceptionFeature->new(...)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 $asx_seq_region_id = $asx_adaptor->store($asx);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 Description: This stores a assembly exception feature in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 assembly_exception table and returns the assembly_exception_id.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 Needs 2 features: one pointing to the Assembly_exception, and the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 other pointing to the region in the reference that is being mapped to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 Will check that start, end and type are defined, and the alternate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 slice is present as well.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 ReturnType: int
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 Exceptions: throw if assembly exception not defined (needs start, end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 type and alternate_slice) of if $asx not a Bio::EnsEMBL::AssemblyException
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 Caller: general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 Status: Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 sub store{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 my $asx = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 my $asx2 = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 if (! $asx->isa('Bio::EnsEMBL::AssemblyExceptionFeature')){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 throw("$asx is not a Ensembl assemlby exception -- not stored");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 #if already present, return ID in the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 my $db = $self->db();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 if ($asx->is_stored($db)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 return $asx->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 #do some checkings for the object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 #at the moment, the orientation is always 1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 if (! $asx->start || ! $asx->end ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 throw("Assembly exception does not have coordinates");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 if ($asx->type !~ /PAR|HAP|PATCH_NOVEL|PATCH_FIX/){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 throw("Only types of assembly exception features valid are PAR, HAP, PATCH_FIX or PATCH_NOVEL");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 if ( !($asx->alternate_slice->isa('Bio::EnsEMBL::Slice')) ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 throw("Alternate slice should be a Bio::EnsEMBL::Slice");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 #now check the other Assembly exception feature, the one pointing to the REF
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 # region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 if (!$asx2->isa('Bio::EnsEMBL::AssemblyExceptionFeature')){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 throw("$asx2 is not a Ensembl assemlby exception -- not stored");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 if (! $asx2->start || ! $asx2->end ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 throw("Assembly exception does not have coordinates");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 if ($asx2->type !~ /HAP REF|PAR REF|PATCH_NOVEL REF|PATCH_FIX REF/){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 throw("$asx2 should have type of assembly exception features HAP REF, PAR REF, PATCH_FIX REF or PATCH_NOVEL REF");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 if (! ($asx2->alternate_slice->isa('Bio::EnsEMBL::Slice')) ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 throw("Alternate slice should be a Bio::EnsEMBL::Slice");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 #finally check that both features are pointing to each other slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 if ($asx->slice != $asx2->alternate_slice || $asx->alternate_slice != $asx2->slice){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 throw("Slice and alternate slice in both features are not pointing to each other");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 #prepare the SQL
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 my $asx_sql = q{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 INSERT INTO assembly_exception( seq_region_id, seq_region_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 exc_type, exc_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 exc_seq_region_start, exc_seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 ori)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 VALUES (?, ?, ?, ?, ?, ?, ?, 1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 my $asx_st = $self->prepare($asx_sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 my $asx_id = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 my $asx_seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 my $asx2_seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 my $original = $asx;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 my $original2 = $asx2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 #check all feature information
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 ($asx, $asx_seq_region_id) = $self->_pre_store($asx);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 ($asx2, $asx2_seq_region_id) = $self->_pre_store($asx2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 #and store it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 $asx_st->bind_param(1, $asx_seq_region_id, SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 $asx_st->bind_param(2, $asx->start(), SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 $asx_st->bind_param(3, $asx->end(), SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 $asx_st->bind_param(4, $asx->type(), SQL_VARCHAR);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 $asx_st->bind_param(5, $asx2_seq_region_id, SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 $asx_st->bind_param(6, $asx2->start(), SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 $asx_st->bind_param(7, $asx2->end(), SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 $asx_st->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 $asx_id = $asx_st->{'mysql_insertid'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 #finally, update the dbID and adaptor of the asx and asx2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 $original->adaptor($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 $original->dbID($asx_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 $original2->adaptor($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 $original2->dbID($asx_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 #and finally update dbID cache with new assembly exception
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 $self->{'_aexc_dbID_cache'}->{$asx_id} = $original;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 #and update the other caches as well
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 push @{$self->{'_aexc_slice_cache'}->{uc($asx->slice->name)}},$original, $original2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 push @{$self->{'_aexc_cache'}}, $original, $original2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 return $asx_id;
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 # Helper function containing some common feature storing functionality
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 # Given a Feature this will return a copy (or the same feature if no changes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 # to the feature are needed) of the feature which is relative to the start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 # of the seq_region it is on. The seq_region_id of the seq_region it is on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 # is also returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 # This method will also ensure that the database knows which coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 # systems that this feature is stored in.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 # Since this adaptor doesn't inherit from BaseFeatureAdaptor, we need to copy
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 # the code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 sub _pre_store {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475 my $feature = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 if(!ref($feature) || !$feature->isa('Bio::EnsEMBL::Feature')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 throw('Expected Feature argument.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 $self->_check_start_end_strand($feature->start(),$feature->end(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 $feature->strand());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 my $db = $self->db();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 my $slice_adaptor = $db->get_SliceAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 my $slice = $feature->slice();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 if(!ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice')) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 throw('Feature must be attached to Slice to be stored.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 # make sure feature coords are relative to start of entire seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 if($slice->start != 1 || $slice->strand != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497 #move feature onto a slice of the entire seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 $slice = $slice_adaptor->fetch_by_region($slice->coord_system->name(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 $slice->seq_region_name(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 undef, #start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 undef, #end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 undef, #strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 $slice->coord_system->version());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 $feature = $feature->transfer($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 if(!$feature) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 throw('Could not transfer Feature to slice of ' .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 'entire seq_region prior to storing');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 # Ensure this type of feature is known to be stored in this coord system.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 my $cs = $slice->coord_system;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 my $mcc = $db->get_MetaCoordContainer();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 $mcc->add_feature_type($cs, 'assembly_exception', $feature->length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 my $seq_region_id = $slice_adaptor->get_seq_region_id($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 if(!$seq_region_id) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 throw('Feature is associated with seq_region which is not in this DB.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 return ($feature, $seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 # helper function used to validate start/end/strand and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 # hstart/hend/hstrand etc.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 sub _check_start_end_strand {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 my $start = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 my $end = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 my $strand = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 # Make sure that the start, end, strand are valid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 if(int($start) != $start) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 throw("Invalid Feature start [$start]. Must be integer.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 if(int($end) != $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 throw("Invalid Feature end [$end]. Must be integer.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 if(int($strand) != $strand || $strand < -1 || $strand > 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 throw("Invalid Feature strand [$strand]. Must be -1, 0 or 1.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 if($end < $start) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 throw("Invalid Feature start/end [$start/$end]. Start must be less " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 "than or equal to end.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 return 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 =head2 remove
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 Arg [1] : $asx Bio::EnsEMBL::AssemblyFeatureException
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 Example : $asx_adaptor->remove($asx);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563 Description: This removes a assembly exception feature from the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 Exceptions : thrown if $asx arg does not implement dbID(), or if
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 $asx->dbID is not a true value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 #again, this method is generic in BaseFeatureAdaptor, but since this class
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 #is not inheriting, need to copy&paste
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 sub remove {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 my ($self, $feature) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 if(!$feature || !ref($feature) || !$feature->isa('Bio::EnsEMBL::AssemblyExceptionFeature')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 throw('AssemblyExceptionFeature argument is required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 if(!$feature->is_stored($self->db)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 throw("This feature is not stored in this database");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 my $asx_id = $feature->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 my $key = uc($feature->slice->name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 my $sth = $self->prepare("DELETE FROM assembly_exception WHERE assembly_exception_id = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 $sth->bind_param(1,$feature->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 #and clear cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 #and finally update dbID cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 delete $self->{'_aexc_dbID_cache'}->{$asx_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 #and remove from cache feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 my @features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 foreach my $asx (@{$self->{'_aexc_slice_cache'}->{$key}}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 if ($asx->dbID != $asx_id){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 push @features, $asx;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 $self->{'_aexc_slice_cache'}->{$key} = \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 @features = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 foreach my $asx (@{$self->{'_aexc_cache'}}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 if ($asx->dbID != $asx_id){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 push @features, $asx;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 $self->{'_aexc_cache'} = \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 #unset the feature dbID ad adaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 $feature->dbID(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 $feature->adaptor(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 1;