comparison variant_effect_predictor/Bio/EnsEMBL/Variation/MotifFeatureVariationAllele.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1f6dce3d34e0
1 =head1 LICENSE
2
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
4 Genome Research Limited. All rights reserved.
5
6 This software is distributed under a modified Apache license.
7 For license details, please see
8
9 http://www.ensembl.org/info/about/code_licence.html
10
11 =head1 CONTACT
12
13 Please email comments or questions to the public Ensembl
14 developers list at <dev@ensembl.org>.
15
16 Questions may also be sent to the Ensembl help desk at
17 <helpdesk@ensembl.org>.
18
19 =cut
20
21 package Bio::EnsEMBL::Variation::MotifFeatureVariationAllele;
22
23 use strict;
24 use warnings;
25
26 use Bio::EnsEMBL::Variation::Utils::VariationEffect qw(overlap);
27 use Bio::EnsEMBL::Utils::Scalar qw(assert_ref);
28
29 use base qw(Bio::EnsEMBL::Variation::VariationFeatureOverlapAllele);
30
31 sub new_fast {
32 my ($self, $hashref) = @_;
33
34 # swap a motif_feature_variation argument for a variation_feature_overlap one
35
36 if ($hashref->{motif_feature_variation}) {
37 $hashref->{variation_feature_overlap} = delete $hashref->{motif_feature_variation};
38 }
39
40 # and call the superclass
41
42 return $self->SUPER::new_fast($hashref);
43 }
44
45 =head2 motif_feature_variation
46
47 Description: Get/set the associated MotifFeatureVariation
48 Returntype : Bio::EnsEMBL::Variation::MotifFeatureVariation
49 Status : At Risk
50
51 =cut
52
53 sub motif_feature_variation {
54 my ($self, $mfv) = shift;
55 assert_ref($mfv, 'Bio::EnsEMBL::Variation::MotifFeatureVariation') if $mfv;
56 return $self->variation_feature_overlap($mfv);
57 }
58
59 =head2 motif_feature
60
61 Description: Get/set the associated MotifFeature
62 Returntype : Bio::EnsEMBL::Funcgen::MotifFeature
63 Status : At Risk
64
65 =cut
66
67 sub motif_feature {
68 my $self = shift;
69 return $self->motif_feature_variation->motif_feature;
70 }
71
72 =head2 motif_start
73
74 Description: Get the (1-based) relative position of the variation feature start in the motif
75 Returntype : integer
76 Status : At Risk
77
78 =cut
79
80 sub motif_start {
81
82 my $self = shift;
83
84 my $mf = $self->motif_feature;
85 my $vf = $self->variation_feature;
86
87 return undef unless defined $vf->seq_region_start && defined $mf->seq_region_start;
88
89 my $mf_start = $vf->seq_region_start - $mf->seq_region_start + 1;
90
91 # adjust if the motif is on the reverse strand
92
93 $mf_start = $mf->binding_matrix->length - $mf_start + 1 if $mf->strand < 0;
94
95 # check that we're in bounds
96
97 return undef if $mf_start > $mf->length;
98
99 return $mf_start;
100 }
101
102 =head2 motif_end
103
104 Description: Get the (1-based) relative position of the variation feature end in the motif
105 Returntype : integer
106 Status : At Risk
107
108 =cut
109
110 sub motif_end {
111
112 my $self = shift;
113
114 my $mf = $self->motif_feature;
115 my $vf = $self->variation_feature;
116
117 return undef unless defined $vf->seq_region_end && defined $mf->seq_region_start;
118
119 my $mf_end = $vf->seq_region_end - $mf->seq_region_start + 1;
120
121 # adjust if the motif is on the reverse strand
122
123 $mf_end = $mf->binding_matrix->length - $mf_end + 1 if $mf->strand < 0;
124
125 # check that we're in bounds
126
127 return undef if $mf_end < 1;
128
129 return $mf_end;
130 }
131
132 =head2 in_informative_position
133
134 Description: Identify if the variation feature falls in a high information position of the motif
135 Returntype : boolean
136 Status : At Risk
137
138 =cut
139
140 sub in_informative_position {
141 my $self = shift;
142
143 # we can only call this for true SNPs
144
145 my $vf = $self->variation_feature;
146
147 unless (($vf->start == $vf->end) && ($self->variation_feature_seq ne '-')) {
148 return undef;
149 }
150
151 # get the 1-based position
152
153 my $start = $self->motif_start;
154
155 return undef unless defined $start && $start >= 1 && $start <= $self->motif_feature->length;
156
157 return $self->motif_feature->binding_matrix->is_position_informative($start);
158 }
159
160 =head2 motif_score_delta
161
162 Description: Calculate the difference in motif score between the reference and variant sequences
163 Returntype : float
164 Status : At Risk
165
166 =cut
167
168 sub motif_score_delta {
169
170 my $self = shift;
171 my $linear = shift;
172
173 unless ($self->{motif_score_delta}) {
174
175 my $vf = $self->motif_feature_variation->variation_feature;
176 my $mf = $self->motif_feature;
177
178 my $allele_seq = $self->feature_seq;
179 my $ref_allele_seq = $self->motif_feature_variation->get_reference_MotifFeatureVariationAllele->feature_seq;
180
181 if ($allele_seq eq '-' ||
182 $ref_allele_seq eq '-' ||
183 length($allele_seq) != length($ref_allele_seq)) {
184 # we can't call a score because the sequence will change length
185 return undef;
186 }
187
188 my ($mf_start, $mf_end) = ($self->motif_start, $self->motif_end);
189
190 return undef unless defined $mf_start && defined $mf_end;
191
192 my $mf_seq = $self->motif_feature_variation->_motif_feature_seq;
193 my $mf_seq_length = length($mf_seq);
194
195 # trim allele_seq
196 if($mf_start < 1) {
197 $allele_seq = substr($allele_seq, 1 - $mf_start);
198 $mf_start = 1;
199 }
200
201 if($mf_end > $mf_seq_length) {
202 $allele_seq = substr($allele_seq, 0, $mf_seq_length - $mf_start + 1);
203 $mf_end = $mf_seq_length;
204 }
205
206 my $var_len = length($allele_seq);
207
208 return undef if $var_len > $mf->length;
209
210 my $matrix = $mf->binding_matrix;
211
212 # get the binding affinity of the reference sequence
213 my $ref_affinity = $matrix->relative_affinity($mf_seq, $linear);
214
215 # splice in the variant sequence (0-based)
216 substr($mf_seq, $mf_start - 1, $var_len) = $allele_seq;
217
218 # check length hasn't changed
219 return undef if length($mf_seq) != $mf_seq_length;
220
221 # and get the affinity of the variant sequence
222 my $var_affinity = $matrix->relative_affinity($mf_seq, $linear);
223
224 $self->{motif_score_delta} = ($var_affinity - $ref_affinity);
225 }
226
227 return $self->{motif_score_delta};
228 }
229
230 1;