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

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 =head1 LICENSE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 This software is distributed under a modified Apache license.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 For license details, please see
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 =head1 CONTACT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 <helpdesk@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 Bio::EnsEMBL::DBSQL::DensityFeatureAdaptor
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 $dfa = $database_adaptor->get_DensityFeatureAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 my $interpolate = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30 my $blocks_wanted = 50;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 @dense_feats = @{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 $dfa->fetch_all_by_Slice( $slice, 'SNPDensity', $blocks_wanted,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 $interpolate );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 Density Feature Adaptor - An adaptor responsible for the creation of density
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 features from the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 =head1 METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 package Bio::EnsEMBL::DBSQL::DensityFeatureAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 use vars qw(@ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 use POSIX;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 use Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 use Bio::EnsEMBL::Utils::Cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 use Bio::EnsEMBL::DensityFeature;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 use Bio::EnsEMBL::DensityFeatureSet;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 use Bio::EnsEMBL::DensityType;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 use Bio::EnsEMBL::Utils::Exception qw(throw warning);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 @ISA = qw(Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 our $DENSITY_FEATURE_CACHE_SIZE = 20;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 Arg [1] : list of args @args
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 Superclass constructor arguments
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 Example : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 Description: Constructor which just initializes internal cache structures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 Returntype : Bio::EnsEMBL::DBSQL::DensityFeatureAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 Caller : implementing subclass constructors
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 sub new {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 my $caller = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 my $class = ref($caller) || $caller;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 my $self = $class->SUPER::new(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 #initialize an LRU cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 my %cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 tie(%cache, 'Bio::EnsEMBL::Utils::Cache', $DENSITY_FEATURE_CACHE_SIZE);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 $self->{'_density_feature_cache'} = \%cache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 =head2 fetch_all_by_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 Arg [1] : Bio::EnsEMBL::Slice $slice - The slice representing the region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 to retrieve density features from.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 Arg [2] : string $logic_name - The logic name of the density features to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 retrieve.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 Arg [3] : int $num_blocks (optional; default = 50) - The number of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 features that are desired. The ratio between the size of these
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 features and the size of the features in the database will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 used to determine which database features will be used.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 Arg [4] : boolean $interpolate (optional; default = 0) - A flag indicating
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 whether the features in the database should be interpolated to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 fit them to the requested number of features. If true the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 features will be interpolated to provide $num_blocks features.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 This will not guarantee that exactly $num_blocks features are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 returned due to rounding etc. but it will be close.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 Arg [5] : float $max_ratio - The maximum ratio between the size of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 requested features (as determined by $num_blocks) and the actual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 size of the features in the database. If this value is exceeded
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 then an empty list will be returned. This can be used to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 prevent excessive interpolation of the database values.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 Example : #interpolate:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 $feats = $dfa->fetch_all_by_Slice($slice,'SNPDensity', 10, 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 #do not interpoloate, get what is in the database:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 $feats = $dfa->fetch_all_by_Slice($slice,'SNPDensity', 50);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 #interpolate, but not too much
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 $feats = $dfa->fetch_all_by_Slice($slice,'SNPDensity',50,1,5.0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 Description: Retrieves a set of density features which overlap the region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 of this slice. Density features are a discrete representation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 of a continuous value along a sequence, such as a density or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 percent coverage. Density Features may be stored in chunks of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 different sizes in the database, and interpolated to fit the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 desired size for the requested region. For example the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 may store a single density value for each 1KB and also for each
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 1MB. When fetching for an entire chromosome the 1MB density
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 chunks will be used if the requested number of blocks is not
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 very high.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 Note that features which have been interpolated are not stored
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 in the database and as such will have no dbID or adaptor set.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 Returntype : Bio::EnsEMBL::DensityFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 Exceptions : warning on invalid $num_blocks argument
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 warning if no features with logic_name $logic_name exist
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 warning if density_type table has invalid block_size value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 sub fetch_all_by_Slice {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 my ($self, $slice, $logic_name, $num_blocks, $interpolate, $max_ratio) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 if(defined($num_blocks) && $num_blocks < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 warning("Invalid number of density blocks [$num_blocks] requested.\n" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 "Returning empty list.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 return [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 $num_blocks ||= 50;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 my $length = $slice->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 my $wanted_block_size = POSIX::ceil($length/$num_blocks);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 # get out all of the density types and choose the one with the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 # block size closest to our desired block size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 my $dta = $self->db()->get_DensityTypeAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 my @dtypes = @{$dta->fetch_all_by_logic_name($logic_name)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 if( ! @dtypes ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 my @all_dtypes = @{ $dta->fetch_all() };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 @all_dtypes or warning( "No DensityTypes in $dta" ) && return [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 my $valid_list = join( ", ", map{$_->analysis->logic_name} @all_dtypes );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 warning( "No DensityTypes for logic name $logic_name. ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 "Select from $valid_list" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 return [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 my $best_ratio = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 my $density_type = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 my $best_ratio_large = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 my $density_type_large = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 my %dt_ratio_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 foreach my $dt (@dtypes) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 my $ratio;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 if( $dt->block_size() > 0 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 $ratio = $wanted_block_size/$dt->block_size();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 # This is only valid if the requested seq_region is the one the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 # features are stored on. Please use sensibly. Or find better implementation.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 my $block_size = $slice->seq_region_length() / $dt->region_features();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 $ratio = $wanted_block_size / $block_size;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 # we prefer to use a block size that's smaller than the required one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 # (better results on interpolation).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 # give larger bits a disadvantage and make them comparable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 if( $ratio < 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 $ratio = 5/$ratio;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 $dt_ratio_hash{ $ratio } = $dt;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 $best_ratio = (sort {$a<=>$b} (keys %dt_ratio_hash))[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 #the ratio was not good enough, or this logic name was not in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 #density type table, return an empty list
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 if(!defined($best_ratio) ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 (defined($max_ratio) && $best_ratio > $max_ratio)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 return [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 $density_type = $dt_ratio_hash{$best_ratio};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 my $constraint = "df.density_type_id = " . $density_type->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 my @features =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 @{$self->fetch_all_by_Slice_constraint($slice,$constraint)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 return \@features if(!$interpolate);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 #interpolate the features into new features of a different size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 #sort the features on start position
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 @features = sort( { $a->start() <=> $b->start() } @features );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 #resize the features that were returned
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 my $start = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 my $end = $start+$wanted_block_size-1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 my $value_type = $density_type->value_type();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 # create a new density type object for the interpolated features that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 # is not stored in the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 $density_type = Bio::EnsEMBL::DensityType->new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 (-VALUE_TYPE => $value_type,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 -ANALYSIS => $density_type->analysis(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 -BLOCK_SIZE => $wanted_block_size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 while($start < $length) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 # $end = $length if($end > $length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 my $density_value = 0.0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 my ($f, $fstart, $fend, $portion);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 my @dvalues;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 #construct a new feature using all of the old density features that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 #we overlapped
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 while(($f = shift(@features)) && $end > $f->{'start'}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 #what portion of this feature are we using to construct our new block?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 $fstart = ($f->{'start'} < $start) ? $start : $f->{'start'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 $fend = ($f->{'end'} > $end ) ? $end : $f->{'end'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 $fend = $length if($fend > $length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 if($value_type eq 'sum') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 $portion = ($fend-$fstart+1)/$f->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 #take a percentage of density value, depending on how much of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 #feature we overlapped
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 $density_value += $portion * $f->{'density_value'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 } elsif($value_type eq 'ratio') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 #maintain a running total of the length used from each feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 #and its value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 push(@dvalues,[$fend-$fstart+1,$f->{'density_value'}]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 throw("Unknown density value type [$value_type].");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 #do not want to look at next feature if we only used part of this one:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 last if($fend < $f->{'end'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 #if we did not completely overlap the last feature, put it back on so
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 #it can be partially used by the next block
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 if(defined($f) && (!defined($fend) || $fend < $f->{'end'})) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 unshift(@features, $f);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 if($value_type eq 'ratio') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 #take a weighted average of the all the density values of the features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 #used to construct this one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 my $total_len = $end - $start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 if($total_len > 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 foreach my $pair (@dvalues) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 my ($dlen, $dval) = @$pair;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 $density_value += $dval * ($dlen/$total_len);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 # interpolated features are not stored in the db so do not set the dbID
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 # or the adaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 push @out, Bio::EnsEMBL::DensityFeature->new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 (-seq_region => $slice,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 -start => $start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 -end => $end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 -density_type => $density_type,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 -density_value => $density_value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 $start = $end + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 $end += $wanted_block_size;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 sub _tables {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 return (['density_feature', 'df']);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 sub _columns {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 return qw( df.density_feature_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 df.seq_region_id df.seq_region_start df.seq_region_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 df.density_value df.density_type_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 sub _objs_from_sth {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 my ($self, $sth, $mapper, $dest_slice) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 # This code is ugly because an attempt has been made to remove as many
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 # function calls as possible for speed purposes. Thus many caches,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 # and a fair bit of gymnastics have been used.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 my $sa = $self->db()->get_SliceAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 my $dta = $self->db()->get_DensityTypeAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 my @features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 my %dtype_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 my %slice_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 my %sr_name_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 my %sr_cs_hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 my($density_feature_id, $seq_region_id, $seq_region_start, $seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 $density_value, $density_type_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 $sth->bind_columns(\$density_feature_id, \$seq_region_id, \$seq_region_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 \$seq_region_end, \$density_value, \$density_type_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 my $asm_cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 my $cmp_cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 my $asm_cs_vers;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 my $asm_cs_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 my $cmp_cs_vers;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 my $cmp_cs_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 if($mapper) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 $asm_cs = $mapper->assembled_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 $cmp_cs = $mapper->component_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 $asm_cs_name = $asm_cs->name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 $asm_cs_vers = $asm_cs->version();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 $cmp_cs_name = $cmp_cs->name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 $cmp_cs_vers = $cmp_cs->version();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 my $dest_slice_start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 my $dest_slice_end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 my $dest_slice_strand;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 my $dest_slice_length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 my $dest_slice_sr_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 my $dest_slice_sr_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 if($dest_slice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 $dest_slice_start = $dest_slice->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 $dest_slice_end = $dest_slice->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 $dest_slice_strand = $dest_slice->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 $dest_slice_length = $dest_slice->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 $dest_slice_sr_name = $dest_slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 $dest_slice_sr_id = $dest_slice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 FEATURE: while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 #get the density type object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 my $density_type = $dtype_hash{$density_type_id} ||=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 $dta->fetch_by_dbID($density_type_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 #get the slice object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 #need to get the internal_seq_region, if present
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 $seq_region_id = $self->get_seq_region_id_internal($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 my $slice = $slice_hash{"ID:".$seq_region_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 if(!$slice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 $slice = $sa->fetch_by_seq_region_id($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 $slice_hash{"ID:".$seq_region_id} = $slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 $sr_name_hash{$seq_region_id} = $slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 $sr_cs_hash{$seq_region_id} = $slice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 my $sr_name = $sr_name_hash{$seq_region_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 my $sr_cs = $sr_cs_hash{$seq_region_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 # remap the feature coordinates to another coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 # if a mapper was provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 if($mapper) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 my $len = $seq_region_end - $seq_region_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 my @coords;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 if (defined $dest_slice && $mapper->isa('Bio::EnsEMBL::ChainedAssemblyMapper') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 @coords = $mapper->map( $sr_name, $seq_region_start, $seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 1, $sr_cs, 0, $dest_slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 @coords = $mapper->map($sr_name, $seq_region_start, $seq_region_end,1, $sr_cs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 #filter out gaps
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 @coords = grep {!$_->isa('Bio::EnsEMBL::Mapper::Gap')} @coords;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 #throw out density features mapped to gaps, or split
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 next FEATURE if(@coords != 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 $seq_region_start = $coords[0]->{'start'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 $seq_region_end = $coords[0]->{'end'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 $seq_region_id = $coords[0]->{'id'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 if($density_type->value_type() eq 'sum') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 #adjust density value so it reflects length of feature actually used
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 my $newlen = $seq_region_end - $seq_region_start +1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 $density_value *= $newlen/$len if($newlen != $len);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 #get a slice in the coord system we just mapped to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 # if($asm_cs == $sr_cs || ($cmp_cs != $sr_cs && $asm_cs->equals($sr_cs))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 $slice = $slice_hash{"ID:".$seq_region_id} ||=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 $sa->fetch_by_seq_region_id($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 # } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 # $slice = $slice_hash{"NAME:$sr_name:$asm_cs_name:$asm_cs_vers"} ||=
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 # $sa->fetch_by_region($asm_cs_name, $sr_name, undef, undef, undef,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 # $asm_cs_vers);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 # }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 # If a destination slice was provided convert the coords
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 # If the dest_slice starts at 1 and is foward strand, nothing needs doing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 if($dest_slice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 if($dest_slice_start != 1 || $dest_slice_strand != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 if($dest_slice_strand == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 $seq_region_start = $seq_region_start - $dest_slice_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 $seq_region_end = $seq_region_end - $dest_slice_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 my $tmp_seq_region_start = $seq_region_start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 $seq_region_start = $dest_slice_end - $seq_region_end + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 $seq_region_end = $dest_slice_end - $tmp_seq_region_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 #throw away features entirely off the end of the requested slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 if($seq_region_end < 1 || $seq_region_start > $dest_slice_length ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 ( $dest_slice_sr_id ne $seq_region_id )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 next FEATURE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 $slice = $dest_slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 push( @features,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 $self->_create_feature( 'Bio::EnsEMBL::DensityFeature', {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 -dbID => $density_feature_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 -adaptor => $self,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 -start => $seq_region_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 -end => $seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475 -seq_region => $slice,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 -density_value => $density_value,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 -density_type => $density_type
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 } ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 return \@features;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 =head2 list_dbIDs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 Arg [1] : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 Example : @feature_ids = @{$density_feature_adaptor->list_dbIDs()};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 Description: Gets an array of internal ids for all density features in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 current db
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 Arg[1] : <optional> int. not set to 0 for the ids to be sorted by the seq_region.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 Returntype : list of ints
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 Caller : ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 sub list_dbIDs {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 my ($self, $ordered) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 return $self->_list_dbIDs("density_feature",undef, $ordered);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 =head2 store
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 Arg [1] : list of Bio::EnsEMBL::DensityFeatures @df
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 the simple features to store in the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 Example : $density_feature_adaptor->store(1234, @density_feats);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 Description: Stores a list of density feature objects in the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 Exceptions : thrown if @df is not defined, if any of the features do not
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 have an attached slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 or if any elements of @df are not Bio::EnsEMBL::SeqFeatures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 sub store{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 my ($self,@df) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 if( scalar(@df) == 0 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 throw("Must call store with list of DensityFeatures");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 #mysql> desc density_feature;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 #+--------------------+---------+------+-----+---------+----------------+
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 #| Field | Type | Null | Key | Default | Extra |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 #+--------------------+---------+------+-----+---------+----------------+
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 #| density_feature_id | int(11) | | PRI | NULL | auto_increment |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 #| density_type_id | int(11) | | MUL | 0 | |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 #| seq_region_id | int(11) | | | 0 | |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 #| seq_region_start | int(11) | | | 0 | |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 #| seq_region_end | int(11) | | | 0 | |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 #| density_value | float | | | 0 | |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 #+--------------------+---------+------+-----+---------+----------------+
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 my $sth = $self->prepare
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 ("INSERT INTO density_feature (seq_region_id, seq_region_start, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 "seq_region_end, density_type_id, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 "density_value) " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 "VALUES (?,?,?,?,?)");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 my $db = $self->db();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 my $analysis_adaptor = $db->get_AnalysisAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 FEATURE: foreach my $df ( @df ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 if( !ref $df || !$df->isa("Bio::EnsEMBL::DensityFeature") ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 throw("DensityFeature must be an Ensembl DensityFeature, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 "not a [".ref($df)."]");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 # we dont store 0 value density features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 next if( $df->density_value == 0 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 if($df->is_stored($db)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 warning("DensityFeature [".$df->dbID."] is already stored" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 " in this database.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 next FEATURE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 if(!defined($df->density_type)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 throw("A density type must be attached to the features to be stored.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 #store the density_type if it has not been stored yet
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 if(!$df->density_type->is_stored($db)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 my $dta = $db->get_DensityTypeAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 $dta->store($df->density_type());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 my $original = $df;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 my $seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 ($df, $seq_region_id) = $self->_pre_store($df);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 $sth->bind_param(1,$seq_region_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 $sth->bind_param(2,$df->start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 $sth->bind_param(3,$df->end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 $sth->bind_param(4,$df->density_type->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 $sth->bind_param(5,$df->density_value,SQL_FLOAT);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 $original->dbID($sth->{'mysql_insertid'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 $original->adaptor($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 =head2 fetch_Featureset_by_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 Arg [1-5] : see
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 Bio::EnsEMBL::DBSQL::DensityFeatureAdaptor::fetch_all_by_Slice()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 for argument documentation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 Example : $featureset = $dfa->fetch_FeatureSet_by_Slice($slice,'SNPDensity', 10, 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 Description: wrapper around
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 Bio::EnsEMBL::DBSQL::DensityFeatureAdaptor::fetch_all_by_Slice()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 which returns a Bio::EnsEMBL::DensityFeatureSet and also caches
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 results
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 Returntype : Bio::EnsEMBL::DensityFeatureSet
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 sub fetch_Featureset_by_Slice {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 my ($self, $slice, $logic_name, $num_blocks, $interpolate, $max_ratio) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 my $key = join(":", $slice->name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 $logic_name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 $num_blocks || 50,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 $interpolate || 0,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 $max_ratio);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 unless ($self->{'_density_feature_cache'}->{$key}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 my $dfeats = $self->fetch_all_by_Slice($slice, $logic_name, $num_blocks,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 $interpolate, $max_ratio);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 $self->{'_density_feature_cache'}->{$key} =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 new Bio::EnsEMBL::DensityFeatureSet($dfeats);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 return $self->{'_density_feature_cache'}->{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 1;