Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/Coordinate/Utils.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/Coordinate/Utils.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,157 @@ +# $Id: Utils.pm,v 1.1.2.1 2003/02/20 05:11:45 heikki Exp $ +# +# BioPerl module for Bio::Coordinate::Utils +# +# 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::Coordinate::Utils - Additional methods to create Bio::Coordinate objects + +=head1 SYNOPSIS + + use Bio::Coordinate::Utils; + # get a Bio::Align::AlignI compliant object, $aln, somehow + # it could be a Bio::SimpleAlign + + $mapper = Bio::Coordinate::Utils->from_align($aln, 1); + +=head1 DESCRIPTION + +This class is a holder of methods that work on or create +Bio::Coordinate::MapperI- compliant objects. . These methods are not +part of the Bio::Coordinate::MapperI interface and should in general +not be essential to the primary function of sequence objects. If you +are thinking of adding essential functions, it might be better to +create your own sequence class. See L<Bio::PrimarySeqI>, +L<Bio::PrimarySeq>, and L<Bio::Seq> for more. + +=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 one +of 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::Coordinate::Utils; +use vars qw(@ISA); + +use Bio::Location::Simple; +use Bio::Coordinate::Pair; +use Bio::Coordinate::Collection; + +use strict; + +@ISA = qw(Bio::Root::Root); +# new inherited from Root + +=head2 from_align + + Title : from_align + Usage : $mapper = Bio::Coordinate::Utils->from_align($aln, 1); + Function: + Create a mapper out of an alignment. + The mapper will return a value only when both ends of + the input range find a match. + + Note: This implementation works only on pairwise alignments + and is not yet well tested! + + Returns : A Bio::Coordinate::MapperI + Args : Bio::Align::AlignI object + Id for the reference sequence, optional + +=cut + +sub from_align { + my ($self, $aln, $ref ) = @_; + + $aln->isa('Bio::Align::AlignI') || + $self->throw('Not a Bio::Align::AlignI object but ['. ref($self). ']'); + + # default reference sequence to the first sequence + $ref ||= 1; + + my $collection = Bio::Coordinate::Collection->new(-return_match=>1); + + # this works only for pairs, so split the MSA + # take the ref + #foreach remaining seq in aln, do: + + my $cs = $aln->consensus_string(49); + while ( $cs =~ /([^-]+)/g) { + + # alignment coordinates + my $start = pos($cs) - length($1) + 1; + my $end = $start+length($1)-1; + + my $seq1 = $aln->get_seq_by_pos(1); + my $seq2 = $aln->get_seq_by_pos(2); + + my $match1 = Bio::Location::Simple->new + (-seq_id => $seq1->id, + -start => $seq1->location_from_column($start)->start, + -end => $seq1->location_from_column($end)->start, + -strand => $seq1->strand ); + + my $match2 = Bio::Location::Simple->new + (-seq_id => $seq2->id, + -start => $seq2->location_from_column($start)->start, + -end => $seq2->location_from_column($end)->start, + -strand => $seq2->strand ); + + my $pair = Bio::Coordinate::Pair-> + new(-in => $match1, + -out => $match2 + ); + + $collection->add_mapper($pair); + } + + return @{$collection->each_mapper}[0] if $collection->each_mapper == 1; + return $collection; + +} + + + +1;