Mercurial > repos > mahtabm > ensemb_rep_gvl
diff variant_effect_predictor/Bio/Variation/DNAMutation.pm @ 0:2bc9b66ada89 draft default tip
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 06:29:17 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/Variation/DNAMutation.pm Thu Apr 11 06:29:17 2013 -0400 @@ -0,0 +1,391 @@ +# $Id: DNAMutation.pm,v 1.11 2002/10/22 07:38:49 lapp Exp $ +# +# BioPerl module for Bio::Variation::DNAMutation +# +# Cared for by Heikki Lehvaslaiho <heikki@ebi.ac.uk> +# +# Copyright Heikki Lehvaslaiho +# +# You may distribute this module under the same terms as perl itself + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::Variation::DNAMutation - DNA level mutation class + +=head1 SYNOPSIS + + $dnamut = Bio::Variation::DNAMutation->new + ('-start' => $start, + '-end' => $end, + '-length' => $len, + '-upStreamSeq' => $upflank, + '-dnStreamSeq' => $dnflank, + '-proof' => $proof, + '-isMutation' => 1, + '-mut_number' => $mut_number + ); + $a1 = Bio::Variation::Allele->new; + $a1->seq('a'); + $dnamut->allele_ori($a1); + my $a2 = Bio::Variation::Allele->new; + $a2->seq('t'); + $dnamut->add_Allele($a2); + + print "Restriction changes are ", $dnamut->restriction_changes, "\n"; + + # add it to a SeqDiff container object + $seqdiff->add_Variant($dnamut); + + +=head1 DESCRIPTION + +The instantiable class Bio::Variation::DNAMutation describes basic +sequence changes in genomic DNA level. It uses methods defined in +superclass Bio::Variation::VariantI. See L<Bio::Variation::VariantI> +for details. + +If the variation described by a DNAMutation object is transcibed, link +the corresponding Bio::Variation::RNAChange object to it using +method RNAChange(). See L<Bio::Variation::RNAChange> for more information. + +=head1 FEEDBACK + +=head2 Mailing Lists + +User feedback is an integral part of the evolution of this and other +Bioperl modules. Send your comments and suggestions preferably to the +Bioperl mailing lists Your participation is much appreciated. + + bioperl-l@bioperl.org - General discussion + http://bio.perl.org/MailList.html - About the mailing lists + +=head2 Reporting Bugs + +report bugs to the Bioperl bug tracking system to help us keep track + the bugs and their resolution. Bug reports can be submitted via + email or the web: + + bioperl-bugs@bio.perl.org + http://bugzilla.bioperl.org/ + +=head1 AUTHOR - Heikki Lehvaslaiho + +Email: heikki@ebi.ac.uk +Address: + + EMBL Outstation, European Bioinformatics Institute + Wellcome Trust Genome Campus, Hinxton + Cambs. CB10 1SD, United Kingdom + +=head1 APPENDIX + +The rest of the documentation details each of the object +methods. Internal methods are usually preceded with a _ + +=cut + + +# Let the code begin... + + +package Bio::Variation::DNAMutation; +my $VERSION=1.0; +use vars qw(@ISA); +use strict; + +# Object preamble - inheritance +use Bio::Variation::VariantI; + +@ISA = qw( Bio::Variation::VariantI ); + +sub new { + my($class,@args) = @_; + my $self = $class->SUPER::new(@args); + + my ($start, $end, $length, $strand, $primary, $source, + $frame, $score, $gff_string, + $allele_ori, $allele_mut, $upstreamseq, $dnstreamseq, + $label, $status, $proof, $region, $region_value, $region_dist, $numbering, + $cpg, $mut_number, $ismutation) = + $self->_rearrange([qw(START + END + LENGTH + STRAND + PRIMARY + SOURCE + FRAME + SCORE + GFF_STRING + ALLELE_ORI + ALLELE_MUT + UPSTREAMSEQ + DNSTREAMSEQ + LABEL + STATUS + PROOF + REGION + REGION_VALUE + REGION_DIST + NUMBERING + CPG + MUT_NUMBER + ISMUTATION + )], + @args); + + $self->primary_tag("Variation"); + + $self->{ 'alleles' } = []; + + $start && $self->start($start); + $end && $self->end($end); + $length && $self->length($length); + $strand && $self->strand($strand); + $primary && $self->primary_tag($primary); + $source && $self->source_tag($source); + $frame && $self->frame($frame); + $score && $self->score($score); + $gff_string && $self->_from_gff_string($gff_string); + + $allele_ori && $self->allele_ori($allele_ori); + $allele_mut && $self->allele_mut($allele_mut); + $upstreamseq && $self->upStreamSeq($upstreamseq); + $dnstreamseq && $self->dnStreamSeq($dnstreamseq); + + $label && $self->label($label); + $status && $self->status($status); + $proof && $self->proof($proof); + $region && $self->region($region); + $region_value && $self->region_value($region_value); + $region_dist && $self->region_dist($region_dist); + $numbering && $self->numbering($numbering); + $mut_number && $self->mut_number($mut_number); + $ismutation && $self->isMutation($ismutation); + + $cpg && $self->CpG($cpg); + + return $self; # success - we hope! +} + + +=head2 CpG + + Title : CpG + Usage : $obj->CpG() + Function: sets and returns boolean values for variation + hitting a CpG site. Unset value return -1. + Example : $obj->CpG() + Returns : boolean + Args : optional true of false value + + +=cut + + +sub CpG { + my ($obj,$value) = @_; + if( defined $value) { + $value ? ($value = 1) : ($value = 0); + $obj->{'cpg'} = $value; + } + elsif (not defined $obj->{'label'}) { + $obj->{'cpg'} = $obj->_CpG_value; + } + else { + return $obj->{'cpg'}; + } +} + + + +sub _CpG_value { + my ($self) = @_; + if ($self->allele_ori eq $self->allele_mut and length ($self->allele_ori) == 1 ) { + + # valid only for point mutations + # CpG methylation-mediated deamination: + # CG -> TG | CG -> CA substitutions + # implementation here is less strict: if CpG dinucleotide was hit + + if ( ( ($self->allele_ori eq 'c') && (substr($self->upStreamSeq, 0, 1) eq 'g') ) || + ( ($self->allele_ori eq 'g') && (substr($self->dnStreamSeq, -1, 1) eq 'c') ) ) { + return 1; + } + else { + return 0; + } + } else { + $self->warn('CpG makes sense only in the context of point mutation'); + return undef; + } +} + + +=head2 RNAChange + + Title : RNAChange + Usage : $mutobj = $obj->RNAChange; + : $mutobj = $obj->RNAChange($objref); + Function: Returns or sets the link-reference to a mutation/change object. + If there is no link, it will return undef + Returns : an obj_ref or undef + +=cut + + +sub RNAChange { + my ($self,$value) = @_; + if (defined $value) { + if( ! $value->isa('Bio::Variation::RNAChange') ) { + $self->throw("Is not a Bio::Variation::RNAChange object but a [$self]"); + return (undef); + } + else { + $self->{'RNAChange'} = $value; + } + } + unless (exists $self->{'RNAChange'}) { + return (undef); + } else { + return $self->{'RNAChange'}; + } +} + + +=head2 label + + Title : label + Usage : $obj->label(); + Function: + + Sets and returns mutation event label(s). If value is not + set, or no argument is given returns false. Each + instantiable subclass of L<Bio::Variation::VariantI> needs + to implement this method. Valid values are listed in + 'Mutation event controlled vocabulary' in + http://www.ebi.ac.uk/mutations/recommendations/mutevent.html. + + Example : + Returns : string + Args : string + +=cut + + +sub label { + my ($self, $value) = @_; + my ($o, $m, $type); + $o = $self->allele_ori->seq if $self->allele_ori and $self->allele_ori->seq; + $m = $self->allele_mut->seq if $self->allele_mut and $self->allele_mut->seq; + + if (not $o and not $m ) { + $self->warn("[DNAMutation, label] Both alleles should not be empty!\n"); + $type = 'no change'; # is this enough? + } + elsif ($o && $m && length($o) == length($m) && length($o) == 1) { + $type = 'point'; + $type .= ", ". _point_type_label($o, $m); + } + elsif (not $o ) { + $type = 'insertion'; + } + elsif (not $m ) { + $type = 'deletion'; + } + else { + $type = 'complex'; + } + $self->{'label'} = $type; + return $self->{'label'}; +} + + +sub _point_type_label { + my ($o, $m) = @_; + my ($type); + my %transition = ('a' => 'g', + 'g' => 'a', + 'c' => 't', + 't' => 'c'); + $o = lc $o; + $m = lc $m; + if ($o eq $m) { + $type = 'no change'; + } + elsif ($transition{$o} eq $m ) { + $type = 'transition'; + } + else { + $type = 'transversion'; + } +} + + +=head2 sysname + + Title : sysname + Usage : $self->sysname + Function: + + This subroutine creates a string corresponding to the + 'systematic name' of the mutation. Systematic name is + specified in Antonorakis & MDI Nomenclature Working Group: + Human Mutation 11:1-3, 1998. + http://www.interscience.wiley.com/jpages/1059-7794/nomenclature.html + Returns : string + +=cut + + +sub sysname { + my ($self,$value) = @_; + if( defined $value) { + $self->{'sysname'} = $value; + } else { + $self->warn('Mutation start position is not defined') + if not defined $self->start; + my $sysname = ''; + # show the alphabet only if $self->SeqDiff->alphabet is set; + my $mol = ''; + if ($self->SeqDiff->alphabet && $self->SeqDiff->alphabet eq 'dna') { + $mol = 'g.'; + } + elsif ($self->SeqDiff->alphabet && $self->SeqDiff->alphabet eq 'rna') { + $mol = 'c.'; + } + my $sep; + if ($self->isMutation) { + $sep = '>'; + } else { + $sep = '|'; + } + my $sign = '+'; + $sign = '' if $self->start < 1; + $sysname .= $mol ;#if $mol; + $sysname .= $sign. $self->start; + + my @alleles = $self->each_Allele; + $self->allele_mut($alleles[0]); + + $sysname .= 'del' if $self->label =~ /deletion/; + $sysname .= 'ins' if $self->label =~ /insertion/; + $sysname .= uc $self->allele_ori->seq if $self->allele_ori->seq; + + + + #push @alleles, $self->allele_mut if $self->allele_mut; + foreach my $allele (@alleles) { + $self->allele_mut($allele); + $sysname .= $sep if $self->label =~ /point/ or $self->label =~ /complex/; + $sysname .= uc $self->allele_mut->seq if $self->allele_mut->seq; + } + $self->{'sysname'} = $sysname; + #$self->{'sysname'} = $sign. $self->start. + # uc $self->allele_ori->seq. $sep. uc $self->allele_mut->seq; + } + return $self->{'sysname'}; +} + +1;