annotate variant_effect_predictor/Bio/EnsEMBL/DBSQL/MiscFeatureAdaptor.pm @ 3:d30fa12e4cc5 default tip

Merge heads 2:a5976b2dce6f and 1:09613ce8151e which were created as a result of a recently fixed bug.
author devteam <devteam@galaxyproject.org>
date Mon, 13 Jan 2014 10:38:30 -0500
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::MiscFeatureAdaptor
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 $mfa = $database_adaptor->get_MiscFeatureAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 # retrieve a misc feature by its dbID
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30 my $misc_feat = $mfa->fetch_by_dbID(1234);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 # retrieve all misc features in a given region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 my @misc_feats = @{ $mfa->fetch_all_by_Slice($slice) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 # retrieve all misc features in a given region with a given set code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 my @misc_clones =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 @{ $mfa->fetch_all_by_Slice_and_set_code('cloneset') };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 # store some misc features in the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 $mfa->store(@misc_features);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 This is an adaptor for the retrieval and storage of MiscFeatures.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 Misc Features are extremely generic features that can be added with
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 minimal effort to the database. Currently misc features are used to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 describe the locations of clone sets and tiling path information,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 but arbitrary features can be stored. Misc features are grouped
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 into sets and can be fetched according to their grouping using the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 fetch_all_by_Slice_and_set_code and fetch_all_by_set_code methods.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 MiscFeatures may belong to more than one set.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 =head1 METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 package Bio::EnsEMBL::DBSQL::MiscFeatureAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 use Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 use Bio::EnsEMBL::MiscFeature;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 use Bio::EnsEMBL::Attribute;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 use Bio::EnsEMBL::MiscSet;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 use Bio::EnsEMBL::Utils::Exception qw(throw warning);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 use vars qw(@ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 @ISA = qw(Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 =head2 fetch_all_by_Slice_and_set_code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 Arg [1] : Bio::EnsEMBL::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 A slice representing the region to fetch from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 Arg [2...] : string $set_code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 The code of the set to retrieve features from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 Example : @feats = @{$mfa->fetch_all_by_Slice_and_set_code('cloneset')};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 Description: Retrieves a set of MiscFeatures which have a particular set code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 and which lie in a particular region. All features with the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 provide set code and which overlap the given slice are returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 Returntype : listref of Bio::EnsEMBL::MiscFeatures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 Exceptions : throw if set_code is not provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 warning if no set for provided set code exists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 sub fetch_all_by_Slice_and_set_code {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 my $slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 throw('Set code argument is required.') unless @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 my $msa = $self->db->get_MiscSetAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 my @sets = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 my $max_len = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 foreach my $set_code (@_) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 my $set = $msa->fetch_by_code($set_code);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 if($set) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 $max_len = $set->longest_feature if $set->longest_feature > $max_len;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 push @sets, $set->dbID;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 warning("No misc_set with code [$set_code] exists");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 my $constraint;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 if( @sets > 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 $constraint = " mfms.misc_set_id in ( @{[join ',',@sets]} ) ";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 } elsif( @sets == 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 $constraint = " mfms.misc_set_id = $sets[0] ";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 return [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 $self->_max_feature_length($max_len);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 my $results = $self->fetch_all_by_Slice_constraint($slice, $constraint);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 $self->_max_feature_length(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 return $results;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 =head2 fetch_all_by_attribute_type_value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 Arg [1] : string $attrib_type_code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 The code of the attribute type to fetch features for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 Arg [2] : (optional) string $attrib_value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 The value of the attribute to fetch features for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 #get all misc features that have an embl accession
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 @feats = @{$mfa->fetch_all_by_attrib_type_value('embl_acc')};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 #get the misc feature with synonym 'AL014121'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 ($feat)=@{$mfa->fetch_all_by_attrib_type_value('synonym','AL014121');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 Description: Retrieves MiscFeatures which have a particular attribute.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 If the attribute value argument is also provided only
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 features which have the attribute AND a particular value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 are returned. The features are returned in their native
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 coordinate system (i.e. the coordinate system that they
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 are stored in).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 Returntype : listref of Bio::EnsEMBL::MiscFeatures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 Exceptions : throw if attrib_type code arg is not provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 sub fetch_all_by_attribute_type_value {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 my $attrib_type_code = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 my $attrib_value = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 throw("Attrib type code argument is required.")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 if ( !$attrib_type_code );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 # Need to do 2 queries so that all of the ids come back with the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 # features. The problem with adding attrib constraints to filter the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 # misc_features which come back is that not all of the attributes will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 # come back
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 my $sql = qq(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 SELECT DISTINCT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 ma.misc_feature_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 FROM misc_attrib ma,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 attrib_type at,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 misc_feature mf,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 seq_region sr,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 coord_system cs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 WHERE ma.attrib_type_id = at.attrib_type_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 AND at.code = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 AND ma.misc_feature_id = mf.misc_feature_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 AND mf.seq_region_id = sr.seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 AND sr.coord_system_id = cs.coord_system_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 AND cs.species_id = ?);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 if ($attrib_value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 $sql .= " AND ma.value = ?";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 my $sth = $self->prepare($sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 $sth->bind_param( 1, $attrib_type_code, SQL_VARCHAR );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 $sth->bind_param( 2, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 if ($attrib_value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 $sth->bind_param( 3, $attrib_value, SQL_VARCHAR );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 my @ids = map { $_->[0] } @{ $sth->fetchall_arrayref() };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 # Construct constraints from the list of ids. Split ids into groups
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 # of 1000 to ensure that the query is not too big.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 my @constraints;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 while (@ids) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 my @subset = splice( @ids, 0, 1000 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 if ( @subset == 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 push @constraints, "mf.misc_feature_id = $subset[0]";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 my $id_str = join( ',', @subset );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 push @constraints, "mf.misc_feature_id in ($id_str)";
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 my @results;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 foreach my $constraint (@constraints) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 push @results, @{ $self->generic_fetch($constraint) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 return \@results;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 } ## end sub fetch_all_by_attribute_type_value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 #_tables
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 # Arg [1] : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 # Example : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 # Description: PROTECTED Implementation of abstract superclass method to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 # provide the name of the tables to query
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 # Returntype : string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 # Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 # Caller : internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 sub _tables {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 return (['misc_feature', 'mf'],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 ['misc_feature_misc_set', 'mfms'],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 ['misc_attrib', 'ma'],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 ['attrib_type', 'at']);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 #_columns
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 # Arg [1] : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 # Example : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 # Description: PROTECTED Implementation of abstract superclass method to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 # provide the name of the columns to query
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 # Returntype : list of strings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 # Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 # Caller : internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 sub _columns {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 #warning _objs_from_sth implementation depends on ordering
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 return qw (mf.misc_feature_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 mf.seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 mf.seq_region_start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 mf.seq_region_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 mf.seq_region_strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 ma.value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 at.code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 mfms.misc_set_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 at.name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 at.description);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 # _default_where_clause
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 # Arg [1] : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 # Example : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 # Description: Overrides superclass method to provide an additional
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 # table joining constraint before the SQL query is performed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 # Returntype : string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 # Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 # Caller : generic_fetch
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 sub _default_where_clause {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 return '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 sub _left_join {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 return(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 ['misc_feature_misc_set','mf.misc_feature_id = mfms.misc_feature_id'],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 ['misc_attrib', 'mf.misc_feature_id = ma.misc_feature_id'],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 ['attrib_type','ma.attrib_type_id = at.attrib_type_id']);
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 sub _final_clause {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 return " ORDER BY mf.misc_feature_id";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 # _objs_from_sth
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 # Arg [1] : StatementHandle $sth
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 # Example : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 # Description: PROTECTED implementation of abstract superclass method.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 # responsible for the creation of MiscFeatures from a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 # hashref generated from an SQL query
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 # Returntype : listref of Bio::EnsEMBL::MiscFeatures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 # Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 # Caller : internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 sub _objs_from_sth {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 my ($self, $sth, $mapper, $dest_slice) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 # This code is ugly because an attempt has been made to remove as many
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 # function calls as possible for speed purposes. Thus many caches and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 # a fair bit of gymnastics is used.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 my $sa = $self->db()->get_SliceAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 my $msa = $self->db->get_MiscSetAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 my @features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 my %ms_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 my %slice_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 my %sr_name_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 my %sr_cs_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 my($misc_feature_id, $seq_region_id, $seq_region_start, $seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 $seq_region_strand, $attrib_value, $attrib_type_code, $misc_set_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 $attrib_type_name, $attrib_type_description );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 $sth->bind_columns( \$misc_feature_id, \$seq_region_id, \$seq_region_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 \$seq_region_end, \$seq_region_strand,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 \$attrib_value, \$attrib_type_code,\$misc_set_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 \$attrib_type_name, \$attrib_type_description );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 my $asm_cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 my $cmp_cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 my $asm_cs_vers;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 my $asm_cs_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 my $cmp_cs_vers;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 my $cmp_cs_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 if($mapper) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 $asm_cs = $mapper->assembled_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 $cmp_cs = $mapper->component_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 $asm_cs_name = $asm_cs->name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 $asm_cs_vers = $asm_cs->version();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 $cmp_cs_name = $cmp_cs->name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 $cmp_cs_vers = $cmp_cs->version();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 my $dest_slice_start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 my $dest_slice_end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 my $dest_slice_strand;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 my $dest_slice_length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 my $dest_slice_sr_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 my $dest_slice_sr_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 if($dest_slice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 $dest_slice_start = $dest_slice->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 $dest_slice_end = $dest_slice->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 $dest_slice_strand = $dest_slice->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 $dest_slice_length = $dest_slice->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 $dest_slice_sr_name = $dest_slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 $dest_slice_sr_id = $dest_slice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 my $current = -1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 my $throw_away = -1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 my $feat;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 my $feat_misc_sets;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 my $feat_attribs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 my $seen_attribs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 FEATURE: while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 #if this feature is not being used, skip all rows related to it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 next if($throw_away == $misc_feature_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 if ($current == $misc_feature_id) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 #still working on building up attributes and sets for current feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 #if there is a misc_set, add it to the current feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 if ($misc_set_id) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 my $misc_set = $ms_hash{$misc_set_id} ||=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 $msa->fetch_by_dbID($misc_set_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 if ( ! exists $feat_misc_sets->{$misc_set->{'code'}} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 $feat->add_MiscSet( $misc_set );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 $feat_misc_sets->{$misc_set->{'code'}} = $misc_set;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 #if there is a new attribute add it to the current feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 if ($attrib_value && $attrib_type_code &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 !$seen_attribs->{"$attrib_type_code:$attrib_value"}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 my $attrib = Bio::EnsEMBL::Attribute->new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 ( -CODE => $attrib_type_code,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 -NAME => $attrib_type_name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 -DESC => $attrib_type_description,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 -VALUE => $attrib_value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 $feat_attribs ||= [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 push @$feat_attribs, $attrib;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 $seen_attribs->{"$attrib_type_code:$attrib_value"} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 if ($feat) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 #start working on a new feature, discard references to last one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 $feat = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 $feat_attribs = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 $feat_misc_sets = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 $seen_attribs = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 $current = $misc_feature_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 #need to get the internal_seq_region, if present
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 $seq_region_id = $self->get_seq_region_id_internal($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 my $slice = $slice_hash{"ID:".$seq_region_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 if (!$slice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 $slice = $sa->fetch_by_seq_region_id($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 $slice_hash{"ID:".$seq_region_id} = $slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 $sr_name_hash{$seq_region_id} = $slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 $sr_cs_hash{$seq_region_id} = $slice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 my $sr_name = $sr_name_hash{$seq_region_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 my $sr_cs = $sr_cs_hash{$seq_region_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 # remap the feature coordinates to another coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 # if a mapper was provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 if ($mapper) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 if (defined $dest_slice && $mapper->isa('Bio::EnsEMBL::ChainedAssemblyMapper') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 ( $seq_region_id, $seq_region_start,$seq_region_end, $seq_region_strand ) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 $mapper->map( $sr_name, $seq_region_start, $seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 $seq_region_strand, $sr_cs, 1, $dest_slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 ( $seq_region_id, $seq_region_start,$seq_region_end, $seq_region_strand ) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 $mapper->fastmap( $sr_name, $seq_region_start, $seq_region_end,$seq_region_strand, $sr_cs );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 #skip features that map to gaps or coord system boundaries
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 if(!defined($seq_region_id)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 $throw_away = $misc_feature_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 next FEATURE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 #get a slice in the coord system we just mapped to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 # if ($asm_cs == $sr_cs ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 # ($cmp_cs != $sr_cs && $asm_cs->equals($sr_cs))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 $slice = $slice_hash{"ID:".$seq_region_id} ||=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 $sa->fetch_by_seq_region_id($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 # } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 # $slice = $slice_hash{"NAME:$sr_name:$asm_cs_name:$asm_cs_vers"} ||=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 # $sa->fetch_by_region($asm_cs_name, $sr_name, undef, undef, undef,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 # $asm_cs_vers);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 # }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 # If a destination slice was provided convert the coords
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 # If the dest_slice starts at 1 and is foward strand, nothing needs doing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 if ($dest_slice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475 if ($dest_slice_start != 1 || $dest_slice_strand != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 if ($dest_slice_strand == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 $seq_region_start = $seq_region_start - $dest_slice_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 $seq_region_end = $seq_region_end - $dest_slice_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 my $tmp_seq_region_start = $seq_region_start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 $seq_region_start = $dest_slice_end - $seq_region_end + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 $seq_region_end = $dest_slice_end - $tmp_seq_region_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 $seq_region_strand *= -1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 #throw away features off the end of the requested slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 if ($seq_region_end < 1 || $seq_region_start > $dest_slice_length ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 ( $dest_slice_sr_id ne $seq_region_id )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 #flag this feature as one to throw away
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 $throw_away = $misc_feature_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 next FEATURE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 $slice = $dest_slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497 if ($attrib_value && $attrib_type_code) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 my $attrib = Bio::EnsEMBL::Attribute->new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 ( -CODE => $attrib_type_code,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 -NAME => $attrib_type_name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 -DESC => $attrib_type_description,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 -VALUE => $attrib_value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 $feat_attribs = [$attrib];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 $seen_attribs->{"$attrib_type_code:$attrib_value"} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 $feat =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 $self->_create_feature_fast( 'Bio::EnsEMBL::MiscFeature', {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 'start' => $seq_region_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 'end' => $seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 'strand' => $seq_region_strand,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 'slice' => $slice,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 'adaptor' => $self,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 'dbID' => $misc_feature_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 'attributes' => $feat_attribs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 } );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 push @features, $feat;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 if ($misc_set_id) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 #get the misc_set object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 my $misc_set = $ms_hash{$misc_set_id} ||=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 $msa->fetch_by_dbID($misc_set_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 if ( ! exists $feat_misc_sets->{$misc_set->{'code'}} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 $feat->add_MiscSet( $misc_set );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 $feat_misc_sets->{$misc_set->{'code'}} = $misc_set;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 return \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 =head2 list_dbIDs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 Arg [1] : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 Example : @feature_ids = @{$misc_feature_adaptor->list_dbIDs()};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 Description: Gets an array of internal ids for all misc_features in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 current db
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 Arg[1] : <optional> int. not 0 for the ids to be sorted by the seq_region.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 Returntype : list of ints
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 Caller : ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 sub list_dbIDs {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 my ($self,$ordered) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 return $self->_list_dbIDs("misc_feature",undef,$ordered);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 =head2 store
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 Arg [1] : list of Bio::EnsEMBL::MiscFeatures @misc_features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 Example : $misc_feature_adaptor->store(@misc_features);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563 Description: Stores a list of MiscFeatures in this database. The stored
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 features will have their
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 Exceptions : throw on invalid arguments
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 warning if misc feature is already stored in this database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 throw if start/end/strand attribs are not valid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 sub store {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 my @misc_features = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 my $db = $self->db();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 my $feature_sth = $self->prepare
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 ("INSERT INTO misc_feature SET " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 " seq_region_id = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 " seq_region_start = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 " seq_region_end = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 " seq_region_strand = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 my $feature_set_sth = $self->prepare
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 ("INSERT IGNORE misc_feature_misc_set SET " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 " misc_feature_id = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 " misc_set_id = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 my $msa = $db->get_MiscSetAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 my $aa = $db->get_AttributeAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 FEATURE:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 foreach my $mf (@misc_features) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 if(!ref($mf) || !$mf->isa('Bio::EnsEMBL::MiscFeature')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 throw("List of MiscFeature arguments expeceted");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 if($mf->is_stored($db)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 warning("MiscFeature [" .$mf->dbID."] is already stored in database.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 next FEATURE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 # do some checking of the start/end and convert to seq_region coords
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 my $original = $mf;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 my $seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 ($mf, $seq_region_id) = $self->_pre_store($mf);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 # store the actual MiscFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 $feature_sth->bind_param(1,$seq_region_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 $feature_sth->bind_param(2,$mf->start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 $feature_sth->bind_param(3,$mf->end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 $feature_sth->bind_param(4,$mf->strand,SQL_TINYINT);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 $feature_sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 my $dbID = $feature_sth->{'mysql_insertid'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 $mf->dbID($dbID);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 $mf->adaptor($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 # store all the attributes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 my $attribs = $mf->get_all_Attributes();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 $aa->store_on_MiscFeature($mf, $attribs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 # store all the sets that have not been stored yet
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 my $sets = $mf->get_all_MiscSets();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 foreach my $set (@$sets) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 $msa->store($set) if(!$set->is_stored($db));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 # update the misc_feat_misc_set table to store the set relationship
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 $feature_set_sth->bind_param(1,$dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 $feature_set_sth->bind_param(2,$set->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 $feature_set_sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648