comparison variant_effect_predictor/Bio/EnsEMBL/Variation/Variation.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:21066c0abaf5
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::Variation
22 #
23 # Copyright (c) 2004 Ensembl
24 #
25
26
27 =head1 NAME
28
29 Bio::EnsEMBL::Variation::Variation - Ensembl representation of a nucleotide variation.
30
31 =head1 SYNOPSIS
32
33 $v = Bio::EnsEMBL::Variation::Variation->new(-name => 'rs123',
34 -source => 'dbSNP');
35
36 # add additional synonyms for the same SNP
37 $v->add_synonym('dbSNP', 'ss3242');
38 $v->add_synonym('TSC', '53253');
39
40 # add some validation states for this SNP
41 $v->add_validation_status('freq');
42 $v->add_validation_status('cluster');
43
44 # add alleles associated with this SNP
45 $a1 = Bio::EnsEMBL::Allele->new(...);
46 $a2 = Bio::EnsEMBL::Allele->new(...);
47 $v->add_Allele($a1);
48 $v->add_Allele($a2);
49
50 # set the flanking sequences
51 $v->five_prime_flanking_seq($seq);
52 $v->three_prime_flanking_seq($seq);
53
54
55 ...
56
57 # print out the default name and source of the variation and the version
58 print $v->source(), ':',$v->name(), ".",$v->version,"\n";
59
60 # print out every synonym associated with this variation
61 @synonyms = @{$v->get_all_synonyms()};
62 print "@synonyms\n";
63
64 # print out synonyms and their database associations
65 my $sources = $v->get_all_synonym_sources();
66 foreach my $src (@$sources) {
67 @synonyms = $v->get_all_synonyms($src);
68 print "$src: @synonyms\n";
69 }
70
71
72 # print out validation states
73 my @vstates = @{$v->get_all_validation_states()};
74 print "@validation_states\n";
75
76 # print out flanking sequences
77 print "5' flanking: ", $v->five_prime_flanking_seq(), "\n";
78 print "3' flanking: ", $v->three_prime_flanking_seq(), "\n";
79
80
81 =head1 DESCRIPTION
82
83 This is a class representing a nucleotide variation from the
84 ensembl-variation database. A variation may be a SNP a multi-base substitution
85 or an insertion/deletion. The objects Alleles associated with a Variation
86 object describe the nucleotide change that Variation represents.
87
88 A Variation object has an associated identifier and 0 or more additional
89 synonyms. The position of a Variation object on the Genome is represented
90 by the B<Bio::EnsEMBL::Variation::VariationFeature> class.
91
92 =head1 METHODS
93
94 =cut
95
96
97 use strict;
98 use warnings;
99
100 package Bio::EnsEMBL::Variation::Variation;
101
102 use Bio::EnsEMBL::Storable;
103 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
104 use Bio::EnsEMBL::Utils::Scalar qw(assert_ref wrap_array);
105 use Bio::EnsEMBL::Variation::Utils::Sequence qw(ambiguity_code SO_variation_class);
106 use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning);
107 use Bio::EnsEMBL::Variation::Utils::Sequence;
108 use Bio::EnsEMBL::Variation::Utils::Constants qw(%VARIATION_CLASSES);
109 use Bio::EnsEMBL::Variation::Failable;
110 use vars qw(@ISA);
111 use Scalar::Util qw(weaken);
112
113 @ISA = qw(Bio::EnsEMBL::Storable Bio::EnsEMBL::Variation::Failable);
114
115 =head2 new
116
117 Arg [-dbID] :
118 int - unique internal identifier for snp
119
120 Arg [-ADAPTOR] :
121 Bio::EnsEMBL::Variation::DBSQL::VariationAdaptor
122 Adaptor which provides database connectivity for this Variation object
123
124 Arg [-NAME] :
125 string - the name of this SNP
126
127 Arg [-SOURCE] :
128 string - the source of this SNP
129
130 Arg [-SOURCE_DESCRIPTION] :
131 string - description of the SNP source
132
133 Arg [-SOURCE_TYPE] :
134 string - the source type of this variant
135
136 Arg [-SYNONYMS] :
137 reference to hash with list reference values - keys are source
138 names and values are lists of identifiers from that db.
139 e.g.: {'dbSNP' => ['ss1231', '1231'], 'TSC' => ['1452']}
140
141 Arg [-ANCESTRAL_ALLELES] :
142 string - the ancestral allele of this SNP
143
144 Arg [-ALLELES] :
145 reference to list of Bio::EnsEMBL::Variation::Allele objects
146
147 Arg [-VALIDATION_STATES] :
148 reference to list of strings
149
150 Arg [-MOLTYPE] :
151 string - the moltype of this SNP
152
153 Arg [-FIVE_PRIME_FLANKING_SEQ] :
154 string - the five prime flanking nucleotide sequence
155
156 Arg [-THREE_PRIME_FLANKING_SEQ] :
157 string - the three prime flanking nucleotide sequence
158
159 Example : $v = Bio::EnsEMBL::Variation::Variation->new
160 (-name => 'rs123',
161 -source => 'dbSNP');
162
163 Description: Constructor. Instantiates a new Variation object.
164 Returntype : Bio::EnsEMBL::Variation::Variation
165 Exceptions : none
166 Caller : general
167 Status : At Risk
168
169 =cut
170
171
172 sub new {
173 my $caller = shift;
174 my $class = ref($caller) || $caller;
175
176 my ($dbID, $adaptor, $name, $class_so_term, $src, $src_desc, $src_url, $src_type, $is_somatic, $flipped, $syns, $ancestral_allele,
177 $alleles, $valid_states, $moltype, $five_seq, $three_seq, $flank_flag, $minor_allele, $minor_allele_frequency, $minor_allele_count,
178 $clinical_significance) =
179 rearrange([qw(dbID ADAPTOR NAME CLASS_SO_TERM SOURCE SOURCE_DESCRIPTION SOURCE_URL SOURCE_TYPE IS_SOMATIC
180 FLIPPED SYNONYMS ANCESTRAL_ALLELE ALLELES VALIDATION_STATES MOLTYPE FIVE_PRIME_FLANKING_SEQ
181 THREE_PRIME_FLANKING_SEQ FLANK_FLAG MINOR_ALLELE MINOR_ALLELE_FREQUENCY MINOR_ALLELE_COUNT
182 CLINICAL_SIGNIFICANCE)],@_);
183
184 # convert the validation state strings into a bit field
185 # this preserves the same order and representation as in the database
186 # and filters out invalid states
187 my $vcode = Bio::EnsEMBL::Variation::Utils::Sequence::get_validation_code($valid_states);
188
189 my $self = bless {
190 'dbID' => $dbID,
191 'adaptor' => $adaptor,
192 'name' => $name,
193 'class_SO_term' => $class_so_term,
194 'source' => $src,
195 'source_description' => $src_desc,
196 'source_url' => $src_url,
197 'source_type'=> $src_type,
198 'is_somatic' => $is_somatic,
199 'flipped' => $flipped,
200 'synonyms' => $syns || {},
201 'ancestral_allele' => $ancestral_allele,
202 'validation_code' => $vcode,
203 'moltype' => $moltype,
204 'five_prime_flanking_seq' => $five_seq,
205 'three_prime_flanking_seq' => $three_seq,
206 'flank_flag' => $flank_flag,
207 'minor_allele' => $minor_allele,
208 'minor_allele_frequency' => $minor_allele_frequency,
209 'minor_allele_count' => $minor_allele_count,
210 'clinical_significance' => $clinical_significance,
211 }, $class;
212
213 $self->add_Allele($alleles) if defined($alleles);
214
215 return $self;
216 }
217
218 sub new_fast {
219 my $class = shift;
220 my $hashref = shift;
221 return bless $hashref, $class;
222 }
223
224 =head2 has_failed_subsnps
225
226 Description: DEPRECATED: Use has_failed_alleles instead.
227 Status : DEPRECATED
228
229 =cut
230
231 sub has_failed_subsnps {
232 my $self = shift;
233
234 deprecate("has_failed_subsnps should no longer be used, use has_failed_alleles instead\n");
235 return $self->has_failed_alleles();
236 }
237
238 =head2 has_failed_alleles
239
240 Example : print "Variation '" . $var->name() . "' has " . ($var->has_failed_alleles() ? "" : "no ") . " failed alleles\n";
241 Description: Returns true if this variation has alleles that are flagged as failed
242 Returntype : int
243 Exceptions : none
244 Caller : general
245 Status : At risk
246
247 =cut
248
249 sub has_failed_alleles {
250 my $self = shift;
251
252 map {return 1 if ($_->is_failed())} @{$self->get_all_Alleles()};
253 return 0;
254 }
255
256
257 =head2 add_Allele
258
259 Arg [1] : Bio::EnsEMBL::Variation::Allele $allele
260 Example : $v->add_allele(Bio::EnsEMBL::Variation::Allele->new(...));
261 Description: Add an Allele to this variation.
262 Returntype : none
263 Exceptions : throw on incorrect argument
264 Caller : general
265 Status : At Risk
266
267 =cut
268
269 sub add_Allele {
270 my $self = shift;
271 my $allele = shift;
272
273 # This method also accepts a list of alleles so wrap the argument in an array and treat as such
274 $allele = wrap_array($allele);
275 map {assert_ref($_,'Bio::EnsEMBL::Variation::Allele')} @{$allele};
276
277 # Store the allele in the private hash
278 $self->{alleles} = [] unless (exists($self->{alleles}));
279 push(@{$self->{alleles}},@{$allele});
280
281 }
282
283 =head2 name
284
285 Arg [1] : string $newval (optional)
286 The new value to set the name attribute to
287 Example : $name = $obj->name()
288 Description: Getter/Setter for the name attribute
289 Returntype : string
290 Exceptions : none
291 Caller : general
292 Status : Stable
293
294 =cut
295
296 sub name{
297 my $self = shift;
298 return $self->{'name'} = shift if(@_);
299 return $self->{'name'};
300 }
301
302
303 =head2 get_all_Genes
304
305 Args : None
306 Example : $genes = $v->get_all_genes();
307 Description : Retrieves all the genes where this Variation
308 has a consequence.
309 ReturnType : reference to list of Bio::EnsEMBL::Gene
310 Exceptions : None
311 Caller : general
312 Status : At Risk
313
314 =cut
315
316 sub get_all_Genes{
317 my $self = shift;
318 my $genes;
319 if (defined $self->{'adaptor'}){
320 my $UPSTREAM = 5000;
321 my $DOWNSTREAM = 5000;
322 my $vf_adaptor = $self->adaptor()->db()->get_VariationFeatureAdaptor();
323 my $vf_list = $vf_adaptor->fetch_all_by_Variation($self);
324 #foreach vf, get the slice is on, us ethe USTREAM and DOWNSTREAM limits to get all the genes, and see if SNP is within the gene
325 my $new_slice;
326 my $gene_list;
327 my $gene_hash;
328
329 foreach my $vf (@{$vf_list}){
330 #expand the slice UPSTREAM and DOWNSTREAM
331 $new_slice = $vf->feature_Slice()->expand($UPSTREAM,$DOWNSTREAM);
332 #get the genes in the new slice
333 $gene_list = $new_slice->get_all_Genes();
334 foreach my $gene (@{$gene_list}){
335 if (($vf->start >= $gene->seq_region_start - $UPSTREAM) && ($vf->start <= $gene->seq_region_end + $DOWNSTREAM) && ($vf->end <= $gene->seq_region_end + $DOWNSTREAM)){
336 #the vf is affecting the gene, add to the hash if not present already
337 if (!exists $gene_hash->{$gene->dbID}){
338 $gene_hash->{$gene->dbID} = $gene;
339 }
340 }
341 }
342 }
343 #and return all the genes
344 push @{$genes}, values %{$gene_hash};
345 }
346 return $genes;
347 }
348
349
350
351
352 =head2 get_all_VariationFeatures
353
354 Args : None
355 Example : $vfs = $v->get_all_VariationFeatures();
356 Description : Retrieves all VariationFeatures for this Variation
357 ReturnType : reference to list of Bio::EnsEMBL::Variation::VariationFeature
358 Exceptions : None
359 Caller : general
360 Status : At Risk
361
362 =cut
363
364 sub get_all_VariationFeatures{
365 my $self = shift;
366
367 if(defined $self->adaptor) {
368
369 # get variation feature adaptor
370 my $vf_adaptor = $self->adaptor()->db()->get_VariationFeatureAdaptor();
371
372 return $vf_adaptor->fetch_all_by_Variation($self);
373 }
374
375 else {
376 warn("No variation database attached");
377 return [];
378 }
379 }
380
381 =head2 get_VariationFeature_by_dbID
382
383 Args : None
384 Example : $vf = $v->get_VariationFeature_by_dbID();
385 Description : Retrieves a VariationFeature for this Variation by it's internal
386 database identifier
387 ReturnType : Bio::EnsEMBL::Variation::VariationFeature
388 Exceptions : None
389 Caller : general
390 Status : At Risk
391
392 =cut
393
394 sub get_VariationFeature_by_dbID{
395 my $self = shift;
396 my $dbID = shift;
397
398 throw("No dbID defined") unless defined $dbID;
399
400 if(defined $self->adaptor) {
401
402 # get variation feature adaptor
403 my $vf_adaptor = $self->adaptor()->db()->get_VariationFeatureAdaptor();
404
405 my $vf = $vf_adaptor->fetch_by_dbID($dbID);
406
407 # check defined
408 if(defined($vf)) {
409
410 # check it is the same variation ID
411 if($vf->{_variation_id} == $self->dbID) {
412 return $vf;
413 }
414
415 else {
416 warn("Variation dbID for Variation Feature does not match this Variation's dbID");
417 return undef;
418 }
419 }
420
421 else {
422 return undef;
423 }
424 }
425
426 else {
427 warn("No variation database attached");
428 return undef;
429 }
430 }
431
432
433
434 =head2 get_all_synonyms
435
436 Arg [1] : (optional) string $source - the source of the synonyms to
437 return.
438 Example : @dbsnp_syns = @{$v->get_all_synonyms('dbSNP')};
439 @all_syns = @{$v->get_all_synonyms()};
440 Description: Retrieves synonyms for this Variation. If a source argument
441 is provided all synonyms from that source are returned,
442 otherwise all synonyms are returned.
443 Returntype : reference to list of strings
444 Exceptions : none
445 Caller : general
446 Status : At Risk
447
448 =cut
449
450 sub get_all_synonyms {
451 my $self = shift;
452 my $source = shift;
453
454 if ($source) {
455 $source = [$source];
456 }
457 else {
458 $source = $self->get_all_synonym_sources();
459 }
460
461 my @synonyms;
462 map {push(@synonyms,keys(%{$self->{synonyms}{$_}}))} @{$source};
463
464 return \@synonyms;
465 }
466
467
468
469 =head2 get_all_synonym_sources
470
471 Arg [1] : none
472 Example : my @sources = @{$v->get_all_synonym_sources()};
473 Description: Retrieves a list of all the sources for synonyms of this
474 Variation.
475 Returntype : reference to a list of strings
476 Exceptions : none
477 Caller : general
478 Status : At Risk
479
480 =cut
481
482 sub get_all_synonym_sources {
483 my $self = shift;
484 my @sources = keys %{$self->{'synonyms'}};
485 return \@sources;
486 }
487
488
489
490 =head2 add_synonym
491
492 Arg [1] : string $source
493 Arg [2] : string $syn
494 Example : $v->add_synonym('dbSNP', 'ss55331');
495 Description: Adds a synonym to this variation.
496 Returntype : none
497 Exceptions : throw if $source argument is not provided
498 throw if $syn argument is not provided
499 Caller : general
500 Status : At Risk
501
502 =cut
503
504 sub add_synonym {
505 my $self = shift;
506 my $source = shift;
507 my $syn = shift;
508
509 throw("source argument is required") if(!$source);
510 throw("syn argument is required") if(!$syn);
511
512 $self->{'synonyms'}{$source}{$syn}++;
513
514 return;
515 }
516
517
518
519 =head2 get_all_validation_states
520
521 Arg [1] : none
522 Example : my @vstates = @{$v->get_all_validation_states()};
523 Description: Retrieves all validation states for this variation. Current
524 possible validation statuses are 'cluster','freq','submitter',
525 'doublehit', 'hapmap'
526 Returntype : reference to list of strings
527 Exceptions : none
528 Caller : general
529 Status : At Risk
530
531 =cut
532
533 sub get_all_validation_states {
534 my $self = shift;
535
536 return Bio::EnsEMBL::Variation::Utils::Sequence::get_all_validation_states($self->{'validation_code'});
537 }
538
539
540
541
542 =head2 add_validation_state
543
544 Arg [1] : string $state
545 Example : $v->add_validation_state('cluster');
546 Description: Adds a validation state to this variation.
547 Returntype : none
548 Exceptions : warning if validation state is not a recognised type
549 Caller : general
550 Status : At Risk
551
552 =cut
553
554 sub add_validation_state {
555 Bio::EnsEMBL::Variation::Utils::Sequence::add_validation_state(@_);
556 }
557
558
559
560 =head2 source
561
562 Arg [1] : string $source (optional)
563 The new value to set the source attribute to
564 Example : $source = $v->source()
565 Description: Getter/Setter for the source attribute
566 Returntype : string
567 Exceptions : none
568 Caller : general
569 Status : Stable
570
571 =cut
572
573 sub source{
574 my $self = shift;
575 return $self->{'source'} = shift if(@_);
576 return $self->{'source'};
577 }
578
579
580 =head2 source_type
581
582 Arg [1] : string $source_type (optional)
583 The new value to set the source type attribute to
584 Example : $source_type = $v->source_type()
585 Description: Getter/Setter for the source type attribute
586 Returntype : string
587 Exceptions : none
588 Caller : general
589 Status : At risk
590
591 =cut
592
593 sub source_type{
594 my $self = shift;
595 return $self->{'source_type'} = shift if(@_);
596 return $self->{'source_type'};
597 }
598
599
600 =head2 source_description
601
602 Arg [1] : string $source_description (optional)
603 The new value to set the source description attribute to
604 Example : $source_description = $v->source_description()
605 Description: Getter/Setter for the source description attribute
606 Returntype : string
607 Exceptions : none
608 Caller : general
609 Status : Stable
610
611 =cut
612
613 sub source_description{
614 my $self = shift;
615 return $self->{'source_description'} = shift if(@_);
616 return $self->{'source_description'};
617 }
618
619
620
621 =head2 source_url
622
623 Arg [1] : string $source_url (optional)
624 The new value to set the source URL attribute to
625 Example : $source_url = $v->source_url()
626 Description: Getter/Setter for the source URL attribute
627 Returntype : string
628 Exceptions : none
629 Caller : general
630 Status : Stable
631
632 =cut
633
634 sub source_url{
635 my $self = shift;
636 return $self->{'source_url'} = shift if(@_);
637 return $self->{'source_url'};
638 }
639
640 =head2 is_somatic
641
642 Arg [1] : boolean $is_somatic (optional)
643 The new value to set the is_somatic flag to
644 Example : $is_somatic = $v->is_somatic
645 Description: Getter/Setter for the is_somatic flag, which identifies this variation as either somatic or germline
646 Returntype : boolean
647 Exceptions : none
648 Caller : general
649 Status : Stable
650
651 =cut
652
653 sub is_somatic {
654 my ($self, $is_somatic) = @_;
655 $self->{is_somatic} = $is_somatic if defined $is_somatic;
656 return $self->{is_somatic};
657 }
658
659 =head2 flipped
660
661 Arg [1] : boolean $flipped (optional)
662 The new value to set the flipped flag to
663 Example : $flipped = $v->flipped
664 Description: Getter/Setter for the flipped flag, which identifies if this
665 variation's strand has been flipped during the import process
666 Returntype : boolean
667 Exceptions : none
668 Caller : general
669 Status : Stable
670
671 =cut
672
673 sub flipped {
674 my ($self, $flipped) = @_;
675 $self->{flipped} = $flipped if defined $flipped;
676 return $self->{flipped};
677 }
678
679 =head2 get_all_Alleles
680
681 Arg [1] : none
682 Example : @alleles = @{$v->get_all_Alleles()};
683 Description: Retrieves all Alleles associated with this variation
684 Returntype : reference to list of Bio::EnsEMBL::Variation::Allele objects
685 Exceptions : none
686 Caller : general
687 Status : Stable
688
689 =cut
690
691 sub get_all_Alleles {
692 my $self = shift;
693
694 # If the private hash key 'alleles' does not exist, no attempt has been made to load them, so do that
695 unless (exists($self->{alleles})) {
696
697 # Get an AlleleAdaptor
698 assert_ref($self->adaptor(),'Bio::EnsEMBL::Variation::DBSQL::BaseAdaptor');
699 my $allele_adaptor = $self->adaptor->db->get_AlleleAdaptor();
700
701 $self->add_Allele($allele_adaptor->fetch_all_by_Variation($self));
702 }
703
704 return $self->{alleles};
705 }
706
707
708
709 =head2 ancestral_allele
710
711 Arg [1] : string $ancestral_allele (optional)
712 Example : $ancestral_allele = v->ancestral_allele();
713 Description: Getter/Setter ancestral allele associated with this variation
714 Returntype : string
715 Exceptions : none
716 Caller : general
717 Status : At Risk
718
719 =cut
720
721 sub ancestral_allele {
722 my $self = shift;
723 return $self->{'ancestral_allele'} = shift if(@_);
724 return $self->{'ancestral_allele'};
725 }
726
727 =head2 moltype
728
729 Arg [1] : string $moltype (optional)
730 The new value to set the moltype attribute to
731 Example : $moltype = v->moltype();
732 Description: Getter/Setter moltype associated with this variation
733 Returntype : string
734 Exceptions : none
735 Caller : general
736 Status : At Risk
737
738 =cut
739
740 sub moltype {
741 my $self = shift;
742 return $self->{'moltype'} = shift if(@_);
743 return $self->{'moltype'};
744 }
745
746
747 =head2 five_prime_flanking_seq
748
749 Arg [1] : string $newval (optional)
750 The new value to set the five_prime_flanking_seq attribute to
751 Example : $five_prime_flanking_seq = $obj->five_prime_flanking_seq()
752 Description: Getter/Setter for the five_prime_flanking_seq attribute
753 Returntype : string
754 Exceptions : none
755 Caller : general
756 Status : Stable
757
758 =cut
759
760 sub five_prime_flanking_seq{
761 my $self = shift;
762
763 #setter of the flanking sequence
764 return $self->{'five_prime_flanking_seq'} = shift if(@_);
765 #lazy-load the flanking sequence from the database
766 if (!defined $self->{'five_prime_flanking_seq'} && $self->{'adaptor'}){
767 my $variation_adaptor = $self->adaptor()->db()->get_VariationAdaptor();
768 ($self->{'three_prime_flanking_seq'},$self->{'five_prime_flanking_seq'}) = @{$variation_adaptor->get_flanking_sequence($self->{'dbID'})};
769 }
770 return $self->{'five_prime_flanking_seq'};
771 }
772
773
774
775
776 =head2 three_prime_flanking_seq
777
778 Arg [1] : string $newval (optional)
779 The new value to set the three_prime_flanking_seq attribute to
780 Example : $three_prime_flanking_seq = $obj->three_prime_flanking_seq()
781 Description: Getter/Setter for the three_prime_flanking_seq attribute
782 Returntype : string
783 Exceptions : none
784 Caller : general
785 Status : Stable
786
787 =cut
788
789 sub three_prime_flanking_seq{
790 my $self = shift;
791
792 #setter of the flanking sequence
793 return $self->{'three_prime_flanking_seq'} = shift if(@_);
794 #lazy-load the flanking sequence from the database
795 if (!defined $self->{'three_prime_flanking_seq'} && $self->{'adaptor'}){
796 my $variation_adaptor = $self->adaptor()->db()->get_VariationAdaptor();
797 ($self->{'three_prime_flanking_seq'},$self->{'five_prime_flanking_seq'}) = @{$variation_adaptor->get_flanking_sequence($self->{'dbID'})};
798 }
799 return $self->{'three_prime_flanking_seq'};
800 }
801
802
803 =head2 get_all_IndividualGenotypes
804
805 Args : none
806 Example : $ind_genotypes = $var->get_all_IndividualGenotypes()
807 Description: Getter for IndividualGenotypes for this Variation, returns empty list if
808 there are none
809 Returntype : listref of IndividualGenotypes
810 Exceptions : none
811 Caller : general
812 Status : At Risk
813
814 =cut
815
816 sub get_all_IndividualGenotypes {
817 my $self = shift;
818 my $individual = shift;
819 if (defined ($self->{'adaptor'})){
820 my $igtya = $self->{'adaptor'}->db()->get_IndividualGenotypeAdaptor();
821
822 return $igtya->fetch_all_by_Variation($self, $individual);
823 }
824 return [];
825 }
826
827 =head2 get_all_PopulationGenotypes
828
829 Args : none
830 Example : $pop_genotypes = $var->get_all_PopulationGenotypes()
831 Description: Getter for PopulationGenotypes for this Variation, returns empty list if
832 there are none.
833 Returntype : listref of PopulationGenotypes
834 Exceptions : none
835 Caller : general
836 Status : At Risk
837
838 =cut
839
840 sub get_all_PopulationGenotypes {
841 my $self = shift;
842
843 #simulate a lazy-load on demand situation, used by the Glovar team
844 if (!defined($self->{'populationGenotypes'}) && defined ($self->{'adaptor'})){
845 my $pgtya = $self->{'adaptor'}->db()->get_PopulationGenotypeAdaptor();
846
847 return $pgtya->fetch_all_by_Variation($self);
848 }
849 return $self->{'populationGenotypes'};
850
851 }
852
853
854 =head2 add_PopulationGenotype
855
856 Arg [1] : Bio::EnsEMBL::Variation::PopulationGenotype
857 Example : $v->add_PopulationGenotype($pop_genotype)
858 Description : Adds another PopulationGenotype to the Variation object
859 Exceptions : thrown on bad argument
860 Caller : general
861 Status : At Risk
862
863 =cut
864
865 sub add_PopulationGenotype{
866 my $self = shift;
867
868 if (@_){
869 if(!ref($_[0]) || !$_[0]->isa('Bio::EnsEMBL::Variation::PopulationGenotype')) {
870 throw("Bio::EnsEMBL::Variation::PopulationGenotype argument expected");
871 }
872 #a variation can have multiple PopulationGenotypes
873 push @{$self->{'populationGenotypes'}},shift;
874 }
875
876 }
877
878
879 =head2 ambig_code
880
881 Args : None
882 Example : my $ambiguity_code = $v->ambig_code()
883 Description : Returns the ambigutiy code for the alleles in the Variation
884 ReturnType : String $ambiguity_code
885 Exceptions : none
886 Caller : General
887 Status : At Risk
888
889 =cut
890
891 sub ambig_code{
892 my $self = shift;
893
894 my $code;
895
896 # first try via VF
897 if(my @vfs = @{$self->get_all_VariationFeatures}) {
898 if(scalar @vfs) {
899 $code = $vfs[0]->ambig_code;
900 }
901 }
902
903 # otherwise get it via alleles attatched to this object already
904 if(!defined($code)) {
905 my $alleles = $self->get_all_Alleles(); #get all Allele objects
906 my %alleles; #to get all the different alleles in the Variation
907 map {$alleles{$_->allele}++} @{$alleles};
908 my $allele_string = join "|",keys %alleles;
909 $code = &ambiguity_code($allele_string);
910 }
911
912 return $code;
913 }
914
915 =head2 var_class
916
917 Args : None
918 Example : my $variation_class = $vf->var_class()
919 Description : returns the class for the variation, according to dbSNP classification
920 ReturnType : String $variation_class
921 Exceptions : none
922 Caller : General
923 Status : At Risk
924
925 =cut
926
927 sub var_class{
928 my $self = shift;
929
930 unless ($self->{class_display_term}) {
931
932 unless ($self->{class_SO_term}) {
933 # work out the term from the alleles
934
935 my $alleles = $self->get_all_Alleles(); #get all Allele objects
936 my %alleles; #to get all the different alleles in the Variation
937 map {$alleles{$_->allele}++} @{$alleles};
938 my $allele_string = join '/',keys %alleles;
939
940 $self->{class_SO_term} = SO_variation_class($allele_string);
941 }
942
943 # convert the SO term to the ensembl display term
944
945 $self->{class_display_term} = $self->is_somatic ?
946 $VARIATION_CLASSES{$self->{class_SO_term}}->{somatic_display_term} :
947 $VARIATION_CLASSES{$self->{class_SO_term}}->{display_term};
948 }
949
950 return $self->{class_display_term};
951 }
952
953 =head2 derived_allele_frequency
954
955 Arg[1] : Bio::EnsEMBL::Variation::Population $population
956 Example : $daf = $variation->derived_allele_frequency($population);
957 Description: Gets the derived allele frequency for the population.
958 The DAF is the frequency of the reference allele that is
959 different from the allele in Chimp. If none of the alleles
960 is the same as the ancestral, will return reference allele
961 frequency
962 Returntype : float
963 Exceptions : none
964 Caller : general
965 Status : At Risk
966
967 =cut
968
969 sub derived_allele_frequency{
970 my $self = shift;
971 my $population = shift;
972 my $daf;
973
974 if(!ref($population) || !$population->isa('Bio::EnsEMBL::Variation::Population')) {
975 throw('Bio::EnsEMBL::Variation::Population argument expected.');
976 }
977 my $ancestral_allele = $self->ancestral_allele();
978 if (defined $ancestral_allele){
979 #get reference allele
980 my $vf_adaptor = $self->adaptor->db->get_VariationFeatureAdaptor();
981 my $vf = shift @{$vf_adaptor->fetch_all_by_Variation($self)};
982 my $ref_freq;
983 #get allele in population
984 my $alleles = $self->get_all_Alleles();
985
986 foreach my $allele (@{$alleles}){
987 next unless defined $allele->population;
988
989 if (($allele->allele eq $vf->ref_allele_string) and ($allele->population->name eq $population->name)){
990 $ref_freq = $allele->frequency;
991 }
992 }
993
994 if(defined $ref_freq) {
995 if ($ancestral_allele eq $vf->ref_allele_string){
996 $daf = 1 - $ref_freq
997 }
998 elsif ($ancestral_allele ne $vf->ref_allele_string){
999 $daf = $ref_freq;
1000 }
1001 }
1002 }
1003
1004 return $daf;
1005 }
1006
1007 =head2 derived_allele
1008
1009 Arg[1] : Bio::EnsEMBL::Variation::Population $population
1010 Example : $da = $variation->derived_allele($population);
1011 Description: Gets the derived allele for the population.
1012 Returntype : float
1013 Exceptions : none
1014 Caller : general
1015 Status : At Risk
1016
1017 =cut
1018
1019 sub derived_allele {
1020 my $self = shift();
1021 my $population = shift();
1022
1023 my $population_dbID = $population->dbID();
1024 my $ancestral_allele_str = $self->ancestral_allele();
1025
1026 if (not defined($ancestral_allele_str)) {
1027 return;
1028 }
1029
1030 my $alleles = $self->get_all_Alleles();
1031
1032 my $derived_allele_str;
1033
1034 foreach my $allele (@{$alleles}) {
1035 my $allele_population = $allele->population();
1036
1037 if (defined($allele_population) and
1038 $allele_population->dbID() == $population_dbID)
1039 {
1040 my $allele_str = $allele->allele();
1041
1042 if ($ancestral_allele_str ne $allele_str) {
1043 if (defined($derived_allele_str)) {
1044 return;
1045 } else {
1046 $derived_allele_str = $allele_str;
1047 }
1048 }
1049 }
1050 }
1051 return $derived_allele_str;
1052 }
1053
1054 =head2 minor_allele
1055
1056 Arg [1] : string $minor_allele (optional)
1057 The new minor allele string
1058 Example : $ma = $obj->minor_allele()
1059 Description: Get/set the minor allele of this variation, as reported by dbSNP
1060 Returntype : string
1061 Exceptions : none
1062 Caller : general
1063 Status : Stable
1064
1065 =cut
1066
1067 sub minor_allele {
1068 my ($self, $minor_allele) = @_;
1069 $self->{minor_allele} = $minor_allele if defined $minor_allele;
1070 return $self->{minor_allele}
1071 }
1072
1073 =head2 minor_allele_frequency
1074
1075 Arg [1] : float $minor_allele_frequency (optional)
1076 The new minor allele frequency
1077 Example : $maf = $obj->minor_allele_frequency()
1078 Description: Get/set the frequency of the minor allele of this variation, as reported by dbSNP
1079 Returntype : float
1080 Exceptions : none
1081 Caller : general
1082 Status : Stable
1083
1084 =cut
1085
1086 sub minor_allele_frequency {
1087 my ($self, $minor_allele_frequency) = @_;
1088 $self->{minor_allele_frequency} = $minor_allele_frequency if defined $minor_allele_frequency;
1089 return $self->{minor_allele_frequency}
1090 }
1091
1092 =head2 minor_allele_count
1093
1094 Arg [1] : int $minor_allele_count (optional)
1095 The new minor allele count
1096 Example : $maf_count = $obj->minor_allele_count()
1097 Description: Get/set the sample count of the minor allele of this variation, as reported by dbSNP
1098 Returntype : int
1099 Exceptions : none
1100 Caller : general
1101 Status : Stable
1102
1103 =cut
1104
1105 sub minor_allele_count {
1106 my ($self, $minor_allele_count) = @_;
1107 $self->{minor_allele_count} = $minor_allele_count if defined $minor_allele_count;
1108 return $self->{minor_allele_count}
1109 }
1110
1111 =head2 clinical_significance
1112
1113 Arg [1] : string $clinical_significance (optional)
1114 The new clinical significance string
1115 Example : $ma = $obj->clinical_significance()
1116 Description: Get/set the clinical significance of this variation, as reported by dbSNP.
1117 When available, this will be one of the following strings:
1118 unknown
1119 untested
1120 non-pathogenic
1121 probable-non-pathogenic
1122 probable-pathogenic
1123 pathogenic
1124 drug-response
1125 histocompatibility
1126 other
1127 Returntype : string
1128 Exceptions : none
1129 Caller : general
1130 Status : Stable
1131
1132 =cut
1133
1134 sub clinical_significance {
1135 my ($self, $clinical_significance) = @_;
1136 $self->{clinical_significance} = $clinical_significance if defined $clinical_significance;
1137 return $self->{clinical_significance}
1138 }
1139
1140 =head2 get_all_VariationAnnotations
1141
1142 Args : none
1143 Example : my $annotations = $var->get_all_VariationAnnotations()
1144 Description: Getter for VariationAnnotations for this Variation, returns empty list if
1145 there are none.
1146 Returntype : listref of VariationAnnotations
1147 Exceptions : none
1148 Caller : general
1149
1150 =cut
1151
1152 sub get_all_VariationAnnotations {
1153 my $self = shift;
1154
1155 #ÊAssert the adaptor reference
1156 assert_ref($self->adaptor(),'Bio::EnsEMBL::Variation::DBSQL::BaseAdaptor');
1157
1158 # Get the annotations from the database
1159 return $self->adaptor->db->get_VariationAnnotationAdaptor()->fetch_all_by_Variation($self);
1160
1161 }
1162
1163 1;