comparison variant_effect_predictor/Bio/EnsEMBL/Variation/StructuralVariationFeature.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 # Ensembl module for Bio::EnsEMBL::Variation::StructuralVariationFeature
22 #
23 # Copyright (c) 2011 Ensembl
24 #
25
26
27 =head1 NAME
28
29 Bio::EnsEMBL::Variation::StructuralVariationFeature - A genomic position for a structural variation.
30
31 =head1 SYNOPSIS
32
33 # Structural variation feature representing a CNV
34 $svf = Bio::EnsEMBL::Variation::StructuralVariationFeature->new
35 (-start => 100,
36 -end => 200,
37 -strand => 1,
38 -slice => $slice,
39 -variation_name => 'esv1001',
40 -class_so_term => 'copy_number_variation',
41 -source => 'DGVa',
42 -source_description => 'Database of Genomic Variants Archive',
43 );
44
45 ...
46
47 print $svf->start(), "-", $svf->end(), '(', $svf->strand(), ')', "\n";
48
49 print $svf->variation_name(), ":", $svf->var_class();
50
51 =head1 DESCRIPTION
52
53 This is a class representing the genomic position of a structural variant
54 from the ensembl-variation database. A StructuralVariationFeature behaves as any other
55 Ensembl feature. See B<Bio::EnsEMBL::Feature> and
56 B<Bio::EnsEMBL::Variation::Variation>.
57
58 =head1 METHODS
59
60 =cut
61
62 use strict;
63 use warnings;
64
65 package Bio::EnsEMBL::Variation::StructuralVariationFeature;
66
67 use Scalar::Util qw(weaken isweak);
68
69 use Bio::EnsEMBL::Variation::BaseVariationFeature;
70 use Bio::EnsEMBL::Utils::Exception qw(throw warning deprecate);
71 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
72 use Bio::EnsEMBL::Utils::Scalar qw(assert_ref);
73 use Bio::EnsEMBL::Slice;
74 use Bio::EnsEMBL::Variation::Utils::Constants qw(%VARIATION_CLASSES);
75 use Bio::EnsEMBL::Variation::Utils::VariationEffect qw(MAX_DISTANCE_FROM_TRANSCRIPT);
76 use Bio::EnsEMBL::Variation::StructuralVariationOverlap;
77 use Bio::EnsEMBL::Variation::TranscriptStructuralVariation;
78 use Bio::EnsEMBL::Variation::IntergenicStructuralVariation;
79
80 our @ISA = ('Bio::EnsEMBL::Variation::BaseVariationFeature');
81
82 =head2 new
83
84 Arg [-dbID] :
85 see superclass constructor
86
87 Arg [-ADAPTOR] :
88 see superclass constructor
89
90 Arg [-START] :
91 see superclass constructor
92 Arg [-END] :
93 see superclass constructor
94
95 Arg [-STRAND] :
96 see superclass constructor
97
98 Arg [-SLICE] :
99 see superclass constructor
100
101 Arg [-INNER_START] :
102 int - the 5'-greater coordinate of the underlying structural variation
103
104 Arg [-INNER_END] :
105 int - the 3'-less coordinate of the underlying structural variation
106
107 Arg [-OUTER_START] :
108 int - the 5'-less coordinate of the underlying structural variation
109
110 Arg [-OUTER_END] :
111 int - the 3'-greater coordinate of the underlying structural variation
112
113 Arg [-VARIATION_NAME] :
114 string - the name of the variation this feature is for (denormalisation
115 from Variation object).
116
117 Arg [-CLASS_SO_TERM] :
118 string - the sequence ontology term defining the class of the structural variation.
119
120 Arg [-ALLELE_STRING] :
121 string - allele sequence of the structural variation.
122
123 Arg [-SOURCE] :
124 string - the name of the source where the variation comes from
125
126 Arg [-SOURCE_VERSION]:
127 string - version number of the source
128
129 Arg [-IS_SOMATIC] :
130 int - flag to inform whether the structural variant is a somatic (1) or germline (0).
131
132 Arg [-BREAKPOINT_ORDER] :
133 int - For a structural variant with multiple breakpoints, this gives the predicted order of the breakpoint event.
134
135 Example :
136 $svf = Bio::EnsEMBL::Variation::StructuralVariationFeature->new
137 (-start => 100,
138 -end => 200,
139 -strand => 1,
140 -slice => $slice,
141 -variation_name => 'esv25480',
142 -class_so_term => 'structural_variant',
143 -source => 'DGVa');
144
145 Description: Constructor. Instantiates a new StructuralVariationFeature object.
146 Returntype : Bio::EnsEMBL::Variation::StructuralVariationFeature
147 Exceptions : none
148 Caller : general
149 Status : At Risk
150
151 =cut
152
153 sub new {
154 my $caller = shift;
155 my $class = ref($caller) || $caller;
156
157 my $self = $class->SUPER::new(@_);
158
159 my (
160 $var_name,
161 $source,
162 $source_version,
163 $class_so_term,
164 $inner_start,
165 $inner_end,
166 $outer_start,
167 $outer_end,
168 $allele_string,
169 $is_somatic,
170 $breakpoint_order
171 ) = rearrange([qw(
172 VARIATION_NAME
173 SOURCE
174 SOURCE_VERSION
175 CLASS_SO_TERM
176 INNER_START
177 INNER_END
178 OUTER_START
179 INNER_START
180 ALLELE_STRING
181 IS_SOMATIC
182 BREAKPOINT_ORDER
183 )], @_);
184
185
186 $self->{'variation_name'} = $var_name;
187 $self->{'source'} = $source;
188 $self->{'source_version'} = $source_version;
189 $self->{'class_SO_term'} = $class_so_term;
190 $self->{'inner_start'} = $inner_start;
191 $self->{'inner_end'} = $inner_end;
192 $self->{'outer_start'} = $outer_start;
193 $self->{'outer_end'} = $outer_end;
194 $self->{'allele_string'} = $allele_string;
195 $self->{'is_somatic'} = $is_somatic || 0;
196 $self->{'breakpoint_order'} = $breakpoint_order;
197
198 return $self;
199 }
200
201
202
203 sub new_fast {
204 my $class = shift;
205 my $hashref = shift;
206 return bless $hashref, $class;
207 }
208
209
210 =head2 display_id
211
212 Arg [1] : none
213 Example : print $svf->display_id(), "\n";
214 Description: Returns the 'display' identifier for this feature. For
215 StructuralVariationFeatures this is simply the name of the structural variation
216 it is associated with.
217 Returntype : string
218 Exceptions : none
219 Caller : webcode
220 Status : At Risk
221
222 =cut
223
224 sub display_id {
225 my $self = shift;
226 return $self->{'variation_name'} || '';
227 }
228
229
230
231 =head2 variation_name
232
233 Arg [1] : string $newval (optional)
234 The new value to set the variation_name attribute to
235 Example : $variation_name = $obj->variation_name()
236 Description: Getter/Setter for the variation_name attribute. This is the
237 name of the structural variant associated with this feature.
238 Returntype : string
239 Exceptions : none
240 Caller : general
241 Status : Stable
242
243 =cut
244
245 sub variation_name{
246 my $self = shift;
247 return $self->{'variation_name'} = shift if(@_);
248 return $self->{'variation_name'};
249 }
250
251 =head2 allele_string
252
253 Arg [1] : string $newval (optional)
254 The new value to set the allele_string attribute to
255 Example : $allele_string = $obj->allele_string()
256 Description: Getter/Setter for the allele_string attribute. This is the
257 genomic sequence represented by this feature.
258 Returntype : string
259 Exceptions : none
260 Caller : general
261 Status : Stable
262
263 =cut
264
265 sub allele_string{
266 my $self = shift;
267 return $self->{'allele_string'} = shift if(@_);
268 return $self->{'allele_string'};
269 }
270
271
272
273 =head2 structural_variation
274
275 Arg [1] : (optional) Bio::EnsEMBL::Variation::StructuralVariation or
276 Bio::EnsEMBL::Variation::SupportingStructuralVariation $structural_variation
277 Example : $sv = $svf->structural_variation();
278 Description: Getter/Setter for the structural variant associated with this feature.
279 If not set, and this StructuralVariationFeature has an associated adaptor
280 an attempt will be made to lazy-load the structural variation from the
281 database.
282 Returntype : Bio::EnsEMBL::Variation::StructuralVariation or
283 Bio::EnsEMBL::Variation::SupportingStructuralVariation
284 Exceptions : throw on incorrect argument
285 Caller : general
286 Status : Stable
287
288 =cut
289
290 sub structural_variation {
291 my $self = shift;
292
293 if(@_) {
294 if(!ref($_[0]) || (!$_[0]->isa('Bio::EnsEMBL::Variation::StructuralVariation') &&
295 !$_[0]->isa('Bio::EnsEMBL::Variation::SupportingStructuralVariation')
296 )) {
297 throw("Bio::EnsEMBL::Variation::StructuralVariation or Bio::EnsEMBL::Variation::SupportingStructuralVariation argument expected");
298 }
299 $self->{'structural_variation'} = shift;
300 }
301 elsif(!defined($self->{'structural_variation'}) && $self->{'adaptor'} &&
302 defined($self->{'structural_variation_id'})) {
303 # lazy-load from database on demand
304 my $sva = $self->{'adaptor'}->db()->get_StructuralVariationAdaptor();
305 $self->{'structural_variation'} = $sva->fetch_by_dbID($self->{'structural_variation_id'});
306 if (!defined($self->{'structural_variation'})) {
307 $sva = $self->{'adaptor'}->db()->get_SupportingStructuralVariationAdaptor();
308 $self->{'structural_variation'} = $sva->fetch_by_dbID($self->{'structural_variation_id'});
309 }
310 }
311
312 return $self->{'structural_variation'};
313 }
314
315
316
317
318
319 =head2 get_all_VariationSets
320
321 Args : none
322 Example : my @vs = @{$svf->get_all_VariationSets()};
323 Description : returns a reference to a list of all the VariationSets this
324 StructuralVariationFeature is a member of
325 ReturnType : reference to list of Bio::EnsEMBL::Variation::VariationSets
326 Exceptions : if no adaptor is attached to this object
327 Caller : general
328 Status : At Risk
329 =cut
330
331 sub get_all_VariationSets {
332 my $self = shift;
333
334 if (!$self->adaptor()) {
335 throw('An adaptor must be attached in order to get all variation sets');
336 }
337 my $vs_adaptor = $self->adaptor()->db()->get_VariationSetAdaptor();
338 my $variation_sets = $vs_adaptor->fetch_all_by_StructuralVariation($self->structural_variation());
339
340 return $variation_sets;
341 }
342
343
344 =head2 get_nearest_Gene
345
346 Example : $svf->get_nearest_Gene($flanking_size);
347 Description : Getter a Gene which is associated to or nearest to the StructuralVariationFeature
348 Returntype : Listref of objects of Bio::EnsEMBL::Gene
349 Exceptions : None
350 Caller : general
351 Status : At Risk
352
353 =cut
354
355 sub get_nearest_Gene{
356
357 my $self = shift;
358 my $flanking_size = shift; #flanking size is optional
359 $flanking_size ||= 0;
360 my $sa = $self->{'adaptor'}->db()->dnadb->get_SliceAdaptor();
361 my $slice = $sa->fetch_by_Feature($self,$flanking_size);
362 my @genes = @{$slice->get_all_Genes};
363 return \@genes if @genes; #$svf is on the gene
364
365 if (! @genes) { #if $svf is not on the gene, increase flanking size
366 warning("flanking_size $flanking_size is not big enough to overlap a gene, increase it by 1,000,000");
367 $flanking_size += 1000000;
368 $slice = $sa->fetch_by_Feature($self,$flanking_size);
369 @genes = @{$slice->get_all_Genes};
370 }
371 if (@genes) {
372 my %distances = ();
373 foreach my $g (@genes) {
374 if ($g->seq_region_start > $self->start) {
375 $distances{$g->seq_region_start-$self->start}=$g;
376 }
377 else {
378 $distances{$self->start-$g->seq_region_end}=$g;
379 }
380 }
381 my @distances = sort {$a<=>$b} keys %distances;
382 my $shortest_distance = $distances[0];
383 if ($shortest_distance) {
384 my $nearest_gene = $distances{$shortest_distance};
385 return [$nearest_gene];
386 }
387 }
388 else {
389 throw("variation_feature with flanking_size $flanking_size is not overlap with a gene, try a bigger flanking_size");
390 }
391 }
392
393
394 =head2 is_somatic
395
396 Arg [1] : boolean $is_somatic (optional)
397 The new value to set the is_somatic flag to
398 Example : $is_somatic = $svf->is_somatic
399 Description: Getter/Setter for the is_somatic flag, which identifies this structural variation feature as either somatic or germline
400 Returntype : boolean
401 Exceptions : none
402 Caller : general
403 Status : Stable
404
405 =cut
406
407 sub is_somatic {
408 my ($self, $is_somatic) = @_;
409 $self->{'is_somatic'} = $is_somatic if defined $is_somatic;
410 return $self->{'is_somatic'};
411 }
412
413
414 =head2 breakpoint_order
415
416 Arg [1] : string $bp_order (optional)
417 The new value to set the breakpoint order to
418 Example : $bp_order = $svf->breakpoint_order()
419 Description: Getter/Setter for the breakpoint_order attribute
420 Returntype : string
421 Exceptions : none
422 Caller : general
423 Status : At Risk
424
425 =cut
426
427 sub breakpoint_order {
428 my $self = shift;
429 return $self->{'breakpoint_order'} = shift if(@_);
430 return $self->{'breakpoint_order'};
431 }
432
433 =head2 get_all_StructuralVariationOverlaps
434
435 Description : Get all the StructuralVariationOverlaps associated with this StructuralVariation, this
436 includes TranscriptStructuralVariations and regulatory feature overlap object.
437 Returntype : listref of Bio::EnsEMBL::Variation::StructuralVariationOverlap objects
438 Exceptions : none
439 Status : At Risk
440
441 =cut
442
443 sub get_all_StructuralVariationOverlaps {
444 my $self = shift;
445
446 my $vfos = [
447 @{ $self->get_all_TranscriptStructuralVariations },
448 @{ $self->get_all_RegulatoryFeatureStructuralVariations },
449 @{ $self->get_all_MotifFeatureStructuralVariations },
450 ];
451
452 if (my $iv = $self->get_IntergenicStructuralVariation) {
453 push @$vfos, $iv;
454 }
455
456 return $vfos;
457 }
458
459 =head2 get_all_TranscriptStructuralVariations
460
461 Arg [1] : (optional) listref of Bio::EnsEMBL::Transcript objects
462 Example : $svf->get_all_TranscriptStructuralVariations;
463 Description : Get all the TranscriptStructuralVariations associated with this
464 StructuralVariationFeature. If the optional list of Transcripts
465 is supplied, get only TranscriptStructuralVariations
466 associated with those Transcripts.
467 Returntype : listref of Bio::EnsEMBL::Variation::TranscriptVariation objects
468 Exceptions : Thrown on wrong argument type
469 Caller : general
470 Status : At Risk
471
472 =cut
473
474 sub get_all_TranscriptStructuralVariations {
475 my ($self, $transcripts) = @_;
476
477 if ($transcripts) {
478 assert_ref($transcripts, 'ARRAY');
479 map { assert_ref($_, 'Bio::EnsEMBL::Transcript') } @$transcripts;
480 }
481
482 elsif (not defined $self->{transcript_structural_variations}) {
483 # this VariationFeature is not in the database so we have to build the
484 # TranscriptVariations ourselves
485
486 unless ($transcripts) {
487 # if the caller didn't supply some transcripts fetch those around this VariationFeature
488 # get a slice around this transcript including the maximum distance up and down-stream
489 # that we still call consequences for
490 my $slice = $self->feature_Slice->expand(
491 MAX_DISTANCE_FROM_TRANSCRIPT,
492 MAX_DISTANCE_FROM_TRANSCRIPT
493 );
494
495 # fetch all transcripts on this slice
496 $transcripts = $slice->get_all_Transcripts(1);
497 }
498
499 my @unfetched_transcripts = grep {
500 not exists $self->{transcript_structural_variations}->{$_->stable_id}
501 } @$transcripts;
502
503 for my $transcript (@unfetched_transcripts) {
504 $self->add_TranscriptStructuralVariation(
505 Bio::EnsEMBL::Variation::TranscriptStructuralVariation->new(
506 -structural_variation_feature => $self,
507 -transcript => $transcript,
508 -adaptor => undef,
509 )
510 );
511 }
512 }
513
514 if ($transcripts) {
515 # just return TranscriptVariations for the requested Transcripts
516 return [ map { $self->{transcript_structural_variations}->{$_->stable_id} } @$transcripts ];
517 }
518 else {
519 # return all TranscriptVariations
520 return [ values %{ $self->{transcript_structural_variations} } ];
521 }
522 }
523
524 =head2 get_all_RegulatoryFeatureStructuralVariations
525
526 Description : Get all the RegulatoryFeatureStructuralVariations associated with this VariationFeature.
527 Returntype : listref of Bio::EnsEMBL::Variation::StructuralVariationOverlap objects
528 Exceptions : none
529 Status : At Risk
530
531 =cut
532
533 sub get_all_RegulatoryFeatureStructuralVariations {
534 my $self = shift;
535 return $self->_get_all_RegulationStructuralVariations('RegulatoryFeature', @_);
536 }
537
538 =head2 get_all_MotifFeatureStructuralVariations
539
540 Description : Get all the MotifFeatureStructuralVariations associated with this VariationFeature.
541 Returntype : listref of Bio::EnsEMBL::Variation::StructuralVariationOverlap objects
542 Exceptions : none
543 Status : At Risk
544
545 =cut
546
547 sub get_all_MotifFeatureStructuralVariations {
548 my $self = shift;
549 return $self->_get_all_RegulationStructuralVariations('MotifFeature', @_);
550 }
551
552 =head2 get_all_ExternalFeatureStructuralVariations
553
554 Description : Get all the ExternalFeatureStructuralVariations associated with this VariationFeature.
555 Returntype : listref of Bio::EnsEMBL::Variation::StructuralVariationOverlap objects
556 Exceptions : none
557 Status : At Risk
558
559 =cut
560
561 sub get_all_ExternalFeatureStructuralVariations {
562 my $self = shift;
563 return $self->_get_all_RegulationStructuralVariations('ExternalFeature', @_);
564 }
565
566 sub _get_all_RegulationStructuralVariations {
567 my ($self, $type) = @_;
568
569 unless ($type && ($type eq 'RegulatoryFeature' || $type eq 'MotifFeature' || $type eq 'ExternalFeature')) {
570 throw("Invalid Ensembl Regulation type '$type'");
571 }
572
573 unless ($self->{regulation_structural_variations}->{$type}) {
574 my $fg_adaptor;
575
576 if (my $adap = $self->adaptor) {
577 if(my $db = $adap->db) {
578 $fg_adaptor = Bio::EnsEMBL::DBSQL::MergedAdaptor->new(
579 -species => $adap->db->species,
580 -type => $type,
581 );
582 }
583
584 unless ($fg_adaptor) {
585 warning("Failed to get adaptor for $type");
586 return [];
587 }
588 }
589 else {
590 warning('Cannot get variation features without attached adaptor');
591 return [];
592 }
593
594 my $slice = $self->feature_Slice;
595
596 my $constructor = 'Bio::EnsEMBL::Variation::StructuralVariationOverlap';
597
598 eval {
599 $self->{regulation_structural_variations}->{$type} = [
600 map {
601 $constructor->new(
602 -structural_variation_feature => $self,
603 -feature => $_,
604 );
605 } map { $_->transfer($self->slice) } @{ $fg_adaptor->fetch_all_by_Slice($slice) }
606 ];
607 };
608
609 $self->{regulation_structural_variations}->{$type} ||= [];
610 }
611
612 return $self->{regulation_structural_variations}->{$type};
613 }
614
615
616 sub get_IntergenicStructuralVariation {
617 my $self = shift;
618 my $no_ref_check = shift;
619
620 unless (exists $self->{intergenic_structural_variation}) {
621 if (scalar(@{ $self->get_all_TranscriptStructuralVariations }) == 0) {
622 $self->{intergenic_structural_variation} = Bio::EnsEMBL::Variation::IntergenicStructuralVariation->new(
623 -structural_variation_feature => $self,
624 -no_ref_check => $no_ref_check,
625 );
626 }
627 else {
628 $self->{intergenic_structural_variation} = undef;
629 }
630 }
631
632 return $self->{intergenic_structural_variation};
633 }
634
635
636
637 =head2 TranscriptStructuralVariation
638
639 Arg [1] : Bio::EnsEMBL::Variation::TranscriptStructuralVariation
640 Example : $vf->add_TranscriptStructuralVariation($tsv);
641 Description : Adds a TranscriptStructuralVariation to the structural variation
642 feature object.
643 Exceptions : thrown on bad argument
644 Caller : Bio::EnsEMBL::Variation::StructuralVariationFeature,
645 Bio::EnsEMBL::Varaition::Utils::VEP
646 Status : Stable
647
648 =cut
649
650 sub add_TranscriptStructuralVariation {
651 my ($self, $tsv) = @_;
652 assert_ref($tsv, 'Bio::EnsEMBL::Variation::TranscriptStructuralVariation');
653 # we need to weaken the reference back to us to avoid a circular reference
654 weaken($tsv->{base_variation_feature});
655 $self->{transcript_structural_variations}->{$tsv->transcript_stable_id} = $tsv;
656 }
657
658
659 =head2 var_class
660
661 Args : None
662 Example : my $sv_class = $svf->var_class()
663 Description : Getter for the class of structural variation
664 ReturnType : String
665 Exceptions : none
666 Caller : General
667 Status : At Risk
668
669 =cut
670
671 sub var_class {
672 my $self = shift;
673
674 unless ($self->{class_display_term}) {
675 my $display_term = $VARIATION_CLASSES{$self->{class_SO_term}}->{display_term};
676
677 warn "No display term for SO term: ".$self->{class_SO_term} unless $display_term;
678
679 $self->{class_display_term} = $display_term || $self->{class_SO_term};
680 }
681
682 return $self->{class_display_term};
683 }
684
685
686 =head2 class_SO_term
687
688 Args : None
689 Example : my $sv_so_term = $svf->class_SO_term()
690 Description : Getter for the class of structural variation, returning the SO term
691 ReturnType : String
692 Exceptions : none
693 Caller : General
694 Status : At Risk
695
696 =cut
697
698 sub class_SO_term {
699 my $self = shift;
700
701 return $self->{class_SO_term};
702 }
703
704
705 =head2 source
706
707 Arg [1] : string $source (optional)
708 The new value to set the source attribute to
709 Example : $source = $svf->source()
710 Description: Getter/Setter for the source attribute
711 Returntype : string
712 Exceptions : none
713 Caller : general
714 Status : At Risk
715
716 =cut
717
718 sub source{
719 my $self = shift;
720 return $self->{'source'} = shift if(@_);
721 return $self->{'source'};
722 }
723
724 =head2 source_version
725
726 Arg [1] : string $source_version (optional)
727 The new value to set the source_version attribute to
728 Example : $source_version = $svf->source_version()
729 Description: Getter/Setter for the source_version attribute
730 Returntype : string
731 Exceptions : none
732 Caller : general
733 Status : At Risk
734
735 =cut
736
737 sub source_version {
738 my $self = shift;
739 return $self->{'source_version'} = shift if(@_);
740 return $self->{'source_version'};
741 }
742
743 =head2 bound_start
744
745 Args : None
746 Example : my $bound_start = $svf->bound_start();
747 Description : Getter/setter for the 5'-most coordinate defined for this StructuralVariationFeature (outer_start or start)
748 ReturnType : int
749 Exceptions : none
750 Caller : general
751 Status : At risk
752 =cut
753
754 sub bound_start{
755 my $self = shift;
756 return $self->{'outer_start'} if (defined($self->{'outer_start'}));
757 return $self->{'start'};
758 }
759
760
761 =head2 bound_end
762
763 Args : None
764 Example : my $bound_end = $svf->bound_end();
765 Description : Getter/setter for the 3'-most coordinate defined for this StructuralVariationFeature (outer_end or end)
766 ReturnType : int
767 Exceptions : none
768 Caller : general
769 Status : At risk
770 =cut
771
772 sub bound_end{
773 my $self = shift;
774 return $self->{'outer_end'} if (defined($self->{'outer_end'}));
775 return $self->{'end'};
776 }
777
778
779 =head2 outer_start
780
781 Arg [1] : int $outer_start (optional)
782 The new value to set the outer_start attribute to
783 Example : my $outer_start = $svf->outer_start();
784 Description : Getter/setter for the 5'-most coordinate defined for this StructuralVariationFeature
785 ReturnType : int
786 Exceptions : none
787 Caller : general
788 Status : At risk
789 =cut
790
791 sub outer_start{
792 my $self = shift;
793 return $self->{'outer_start'} = shift if(@_);
794 return $self->{'outer_start'};
795 }
796
797
798 =head2 outer_end
799
800 Arg [1] : int $outer_end (optional)
801 The new value to set the outer_end attribute to
802 Example : my $outer_end = $svf->outer_end();
803 Description : Getter/setter for the 3'-most coordinate defined for this StructuralVariationFeature
804 ReturnType : int
805 Exceptions : none
806 Caller : general
807 Status : At risk
808 =cut
809
810 sub outer_end{
811 my $self = shift;
812 return $self->{'outer_end'} = shift if(@_);
813 return $self->{'outer_end'};
814 }
815
816
817 =head2 inner_start
818
819 Arg [1] : int $inner_start (optional)
820 The new value to set the inner_start attribute to
821 Example : my $inner_start = $svf->inner_start();
822 Description : Getter/setter for the 5'-less coordinate defined for this StructuralVariationFeature
823 ReturnType : int
824 Exceptions : none
825 Caller : general
826 Status : At Risk
827 =cut
828
829 sub inner_start{
830 my $self = shift;
831 return $self->{'inner_start'} = shift if(@_);
832 return $self->{'inner_start'};
833 }
834
835
836 =head2 inner_end
837
838 Arg [1] : int $inner_end (optional)
839 The new value to set the inner_end attribute to
840 Example : my $inner_end = $svf->inner_end();
841 Description : Getter/setter for the 3'-less coordinate defined for this StructuralVariationFeature
842 ReturnType : int
843 Exceptions : none
844 Caller : general
845 Status : At Risk
846 =cut
847
848 sub inner_end{
849 my $self = shift;
850 return $self->{'inner_end'} = shift if(@_);
851 return $self->{'inner_end'};
852 }
853
854
855 =head2 get_reference_sequence
856
857 Args : none
858 Example : my $seq = $svf->get_reference_sequence
859 Description : returns a string containing the reference sequence for the region
860 covered by this StructuralVariationFeature
861 ReturnType : string
862 Exceptions : none
863 Caller : general
864 Status : At Risk
865 =cut
866
867 sub get_reference_sequence{
868 my $self = shift;
869
870 return $self->feature_Slice->seq();
871 }
872
873
874 sub transform {
875 my $self = shift;
876
877 # run the transform method from the parent class
878 my $transformed = $self->SUPER::transform(@_);
879
880 if(defined $transformed) {
881 # fit the start and end coords to the new coords
882 $transformed->_fix_bounds($self);
883 }
884
885 return $transformed;
886 }
887
888
889 sub transfer {
890 my $self = shift;
891
892 # run the transfer method from the parent class
893 my $transferred = $self->SUPER::transfer(@_);
894
895 if(defined $transferred) {
896 # fit the start and end coords to the new coords
897 $transferred->_fix_bounds($self);
898 }
899
900 return $transferred;
901 }
902
903
904 sub _fix_bounds {
905 my $self = shift;
906 my $old = shift;
907
908 if(defined $old->{'outer_start'}) {
909 $self->{'outer_start'} = $self->start - ($old->start - $old->{'outer_start'});
910 }
911
912 if(defined $old->{'outer_end'}) {
913 $self->{'outer_end'} = $self->end + ($old->{'outer_end'} - $old->end);
914 }
915 }
916
917 sub _sort_svos {
918 my $self = shift;
919
920 return unless defined $self->{structural_variation_overlaps};
921
922 my @svos = @{$self->{structural_variation_overlaps}};
923
924 # define a feature order for sorting
925 my %feature_order = (
926 'Bio::EnsEMBL::Gene' => 1,
927 'Bio::EnsEMBL::Transcript' => 2,
928 'Bio::EnsEMBL::Exon' => 3,
929 );
930
931 # sort them nicely by feature type and position
932 @svos = sort {
933 $feature_order{ref($a->feature)} <=> $feature_order{ref($b->feature)} ||
934 $a->feature->start <=> $b->feature->start
935 } @svos;
936
937 $self->{structural_variation_overlaps} = \@svos;
938 }
939
940 1;