Mercurial > repos > willmclaren > ensembl_vep
diff variant_effect_predictor/Bio/SeqIO/game/seqHandler.pm @ 0:21066c0abaf5 draft
Uploaded
author | willmclaren |
---|---|
date | Fri, 03 Aug 2012 10:04:48 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/SeqIO/game/seqHandler.pm Fri Aug 03 10:04:48 2012 -0400 @@ -0,0 +1,289 @@ +# $Id: seqHandler.pm,v 1.15 2002/06/24 04:29:31 jason Exp $ +# +# BioPerl module for Bio::SeqIO::game::seqHandler +# +# Cared for by Brad Marshall <bradmars@yahoo.com> +# +# Copyright Brad Marshall +# +# You may distribute this module under the same terms as perl itself +# _history +# June 25, 2000 written by Brad Marshall +# +# POD documentation - main docs before the code + +=head1 NAME + +Bio::SeqIO::game::seqHandler - GAME helper via PerlSAX helper. + +=head1 SYNOPSIS + +GAME helper for parsing new Sequence objects from GAME XML. Do not use directly + +=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 - Bioperl list + bioxml-dev@bioxml.org - Technical discussion - Moderate volume + bioxml-announce@bioxml.org - General Announcements - Pretty dead + http://www.bioxml.org/MailingLists/ - About the mailing lists + +=head1 AUTHOR - Brad Marshall + +Email: bradmars@yahoo.com + +=head1 APPENDIX + +The rest of the documentation details each of the object +methods. Internal methods are usually preceded with a _ + +=cut + +# This template file is in the Public Domain. +# You may do anything you want with this file. +# + +package Bio::SeqIO::game::seqHandler; +use vars qw{ $AUTOLOAD @ISA }; + +use XML::Handler::Subs; +use Bio::Root::Root; +use Bio::Seq::SeqFactory; + +@ISA = qw(Bio::Root::Root XML::Handler::Subs); + +sub new { + my ($class,@args) = @_; + my $self = $class->SUPER::new(@args); + my ($seq,$sb) = $self->_rearrange([qw(SEQ SEQBUILDER)], @args); + $self->{'string'} = ''; + $self->{'seq'} = $seq; + $self->sequence_factory($sb || new Bio::Seq::SeqFactory(-type => 'Bio::Seq')); + return $self; +} + +=head2 sequence_factory + + Title : sequence_factory + Usage : $seqio->sequence_factory($builder) + Function: Get/Set the Bio::Factory::SequenceFactoryI + Returns : Bio::Factory::SequenceFactoryI + Args : [optional] Bio::Factory::SequenceFactoryI + + +=cut + +sub sequence_factory{ + my ($self,$obj) = @_; + if( defined $obj ) { + if( ! ref($obj) || ! $obj->isa('Bio::Factory::SequenceFactoryI') ) { + $self->throw("Must provide a valid Bio::Factory::SequenceFactoryI object to ".ref($self)." sequence_factory()"); + } + $self->{'_seqio_seqfactory'} = $obj; + } + if( ! defined $self->{'_seqio_seqfactory'} ) { + $self->throw("No SequenceBuilder defined for SeqIO::game::seqHandler object"); + } + + return $self->{'_seqio_seqfactory'}; +} + +=head2 start_document + + Title : start_document + Usage : $obj->start_document + Function: PerlSAX method called when a new document is initialized + Returns : nothing + Args : document name + +=cut + +# Basic PerlSAX +sub start_document { + my ($self, $document) = @_; + $self->{'in_current_seq'} = 'false'; + $self->{'Names'} = []; + $self->{'string'} = ''; +} + +=head2 end_document + + Title : end_document + Usage : $obj->end_document + Function: PerlSAX method called when a document is finished for cleaning up + Returns : list of sequences seen + Args : document name + +=cut + +sub end_document { + my ($self, $document) = @_; + delete $self->{'Names'}; + return $self->sequence_factory->create + ( -seq => $self->{'residues'}, + -alphabet => $self->{'alphabet'}, + -id => $self->{'seq'}, + -accession => $self->{'accession'}, + -desc => $self->{'desc'}, + -length => $self->{'length'}, + ); +} + + +=head2 start_element + + Title : start_element + Usage : $obj->start_element + Function: PerlSAX method called when a new element is reached + Returns : nothing + Args : element object + +=cut + +sub start_element { + my ($self, $element) = @_; + + push @{$self->{'Names'}}, $element->{'Name'}; + $self->{'string'} = ''; + + if ($element->{'Name'} eq 'bx-seq:seq') { + if ($element->{'Attributes'}->{'bx-seq:id'} eq $self->{'seq'}) { + $self->{'in_current_seq'} = 'true'; + $self->{'alphabet'} = $element->{'Attributes'}->{'bx-seq:type'}; + $self->{'length'} = $element->{'Attributes'}->{'bx-seq:length'}; + } else { + #This is not the sequence we want to import, but that's ok + } + } + return 0; +} + +=head2 end_element + + Title : end_element + Usage : $obj->end_element + Function: PerlSAX method called when an element is finished + Returns : nothing + Args : element object + +=cut + +sub end_element { + my ($self, $element) = @_; + + if ($self->{'in_current_seq'} eq 'true') { + if ($self->in_element('bx-seq:residues')) { + while ($self->{'string'} =~ s/\s+//) {}; + $self->{'residues'} = $self->{'string'}; + } + + + if ($self->in_element('bx-seq:name')) { + $self->{'string'} =~ s/^\s+//g; + $self->{'string'} =~ s/\s+$//; + $self->{'string'} =~ s/\n//g; + $self->{'name'} = $self->{'string'}; + } + + + if ($self->in_element('bx-link:id') && $self->within_element('bx-link:dbxref')) { + $self->{'string'} =~ s/^\s+//g; + $self->{'string'} =~ s/\s+$//; + $self->{'string'} =~ s/\n//g; + $self->{'accession'} = $self->{'string'}; + } + + if ($self->in_element('bx-seq:description')) { + $self->{'desc'} = $self->{'string'}; + } + + if ($self->in_element('bx-seq:seq')) { + $self->{'in_current_seq'} = 'false'; + } + } + + pop @{$self->{'Names'}}; + +} + +=head2 characters + + Title : characters + Usage : $obj->end_element + Function: PerlSAX method called when text between XML tags is reached + Returns : nothing + Args : text + +=cut + +sub characters { + my ($self, $text) = @_; + $self->{'string'} .= $text->{'Data'}; +} + +=head2 in_element + + Title : in_element + Usage : $obj->in_element + Function: PerlSAX method called to test if state is in a specific element + Returns : boolean + Args : name of element + +=cut + +sub in_element { + my ($self, $name) = @_; + + return ($self->{'Names'}[-1] eq $name); +} + +=head2 within_element + + Title : within_element + Usage : $obj->within_element + Function: PerlSAX method called to list depth within specific element + Returns : boolean + Args : name of element + +=cut + +sub within_element { + my ($self, $name) = @_; + + my $count = 0; + foreach my $el_name (@{$self->{'Names'}}) { + $count ++ if ($el_name eq $name); + } + + return $count; +} + +=head2 AUTOLOAD + + Title : AUTOLOAD + Usage : do not use directly + Function: autoload handling of missing DESTROY method + Returns : nothing + Args : text + +=cut + +# Others +sub AUTOLOAD { + my $self = shift; + + my $method = $AUTOLOAD; + $method =~ s/.*:://; + return if $method eq 'DESTROY'; + + print "UNRECOGNIZED $method\n"; +} + +1; + +__END__