Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/SearchIO/chado.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/SearchIO/chado.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,254 @@ +# $Id: chado.pm,v 1.1 2002/12/03 08:13:55 cjm Exp $ +# +# BioPerl module for Bio::SearchIO::chado +# +# Chris Mungall <cjm@fruitfly.org> +# +# You may distribute this module under the same terms as perl itself + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::SearchIO::chado - chado sequence input/output stream + +=head1 SYNOPSIS + +It is probably best not to use this object directly, but +rather go through the SearchIO handler system. Go: + + $stream = Bio::SearchIO->new(-file => $filename, -format => 'chado'); + + while ( my $seq = $stream->next_seq() ) { + # do something with $seq + } + +=head1 DESCRIPTION + +This object can transform Bio::Seq objects to and from chado flat +file databases. CURRENTLY ONLY TO + + +=head2 Optional functions + +=over 3 + +=item _show_dna() + +(output only) shows the dna or not + +=item _post_sort() + +(output only) provides a sorting func which is applied to the FTHelpers +before printing + + +=back + +=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://www.bioperl.org/MailList.shtml - 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://bio.perl.org/bioperl-bugs/ + +=head1 AUTHOR - Chris Mungall + +Email cjm@fruitfly.org + +=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::SearchIO::chado; +use vars qw(@ISA); +use strict; + +use Bio::SearchIO; +use Bio::SeqFeature::Generic; +use Bio::Seq::SeqFactory; +use Bio::Annotation::Collection; +use Bio::Annotation::Comment; +use Bio::Annotation::Reference; +use Bio::Annotation::DBLink; + + +use Bio::SeqIO::chado; + +use Data::Stag qw(:all); + +# should really inherit off of a chado helper... +@ISA = qw(Bio::SearchIO Bio::SeqIO::chado); + +sub _initialize { + my($self,@args) = @_; + + $self->SUPER::_initialize(@args); + my $wclass = $self->default_handler_class; + $self->handler($wclass->new); + $self->{_end_of_data} = 0; + $self->handler->S("chado"); + return; +} + +sub DESTROY { + my $self = shift; + $self->end_of_data(); + $self->SUPER::DESTROY(); +} + +sub end_of_data { + my $self = shift; + $self->{_end_of_data} = 1; + $self->handler->E("chado"); +} + +sub default_handler_class { + return "Data::Stag::BaseHandler"; +} + +=head2 write_result + + Title : write_result + Usage : $stream->write_result($result) + Function: writes the $result object (must be result) to the stream + Returns : 1 for success and 0 for error + Args : Bio::Result + + +=cut + +sub write_result { + my ($self,$result) = @_; + + if( !defined $result ) { + $self->throw("Attempting to write with no result!"); + } + + my $w = $self->handler; + $w->S("result"); +# my $result_temp_uid = $self->get_temp_uid($result); + + my @stats = + (map { + [analysisprop=>[ + [pkey=>$_], + [pval=>$result->get_statistic($_)]]] + } $result->available_statistics); + my @params = + (map { + [analysisprop=>[ + [pkey=>$_], + [pval=>$result->get_parameter($_)]]] + } $result->available_parameters); + + my $cid = $self->get_temp_uid($result); + $w->ev(companalysis=>[ + [companalysis_id=>$cid], + [datasource=>$result->database_name], + @stats, + @params, + ] + ); + while( my $hit = $result->next_hit ) { + # process the Bio::Search::Hit::HitI object + $self->write_hit($hit, $cid); + } + $w->E("result"); + return 1; +} + +sub write_hit { + my $self = shift; + my $hit = shift; + my $cid = shift; + + my $w = $self->handler; + my $hit_id = $self->get_temp_uid($hit); + + # we should determine the type by the type of blast; + # eg blastx gives CDS for hit and CDS_exon for HSP + my $fnode = + [feature=> [ + [feature_id=>$hit_id], + [name=>$hit->name], + [typename=>"hit"], + [analysisfeature=>[ + [rawscore=>$hit->raw_score], + [significance=>$hit->significance], + [analysis_id=>$cid]]]]]; + $w->ev(@$fnode); + foreach my $hsp ( $hit->hsps) { + $self->write_hsp($hsp, $hit_id); + } + return 1; +} + +sub write_hsp { + my $self = shift; + my $hsp = shift; + my $hid = shift; + + my $w = $self->handler; + my $hsp_id = $self->get_temp_uid($hsp); + my $order = 0; + my @lnodes = + map { + my ($nbeg, $nend, $strand) = + $self->bp2ib([$hsp->start($_), + $hsp->end($_), + $hsp->strand($_) + ]); + my $src = $_ eq 'query' ? $hsp->query->seq_id : $hsp->hit->seq_id; + [featureloc=>[ + [nbeg=>$nbeg], + [nend=>$nend], + [strand=>$strand], + [srcfeature=>$src], + [group=>0], + [order=>$order++], + ] + ] + } qw(query subject); + my $fnode = + [feature => [ + + [feature_id=>$hsp_id], + [typename=>"hsp"], + [analysisfeature=>[ + [rawscore=>$hsp->score], + [significance=>$hsp->significance], + ] + ], + @lnodes, + ] + ]; + $w->ev(@$fnode); + $w->ev(feature_relationship=>[ + [subjfeature_id=>$hsp_id], + [objfeature_id=>$hid] + ] + ); + return 1; +} + + +1;