diff variant_effect_predictor/Bio/Cluster/SequenceFamily.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/Cluster/SequenceFamily.pm	Thu Apr 11 06:29:17 2013 -0400
@@ -0,0 +1,445 @@
+# $Id: SequenceFamily.pm,v 1.4 2002/12/01 00:34:58 jason Exp $
+#
+# BioPerl module for Bio::Cluster::SequenceFamily
+#
+# Cared for by Shawn Hoon <shawnh@fugu-sg.org>
+#
+# Copyright Shawn Hoon
+#
+# You may distribute this module under the same terms as perl itself
+
+# POD documentation - main docs before the code
+
+=head1 NAME
+
+Bio::Cluster::SequenceFamily - Sequence Family object 
+
+=head1 SYNOPSIS
+
+  use Bio::Cluster::SequenceFamily
+
+  use Bio::SeqIO;
+  use Bio::Cluster::SequenceFamily;
+
+  my $file =  Bio::Root::IO->catfile('t','data','swiss.dat');
+  my $seqio= new Bio::SeqIO('-format' => 'swiss',
+                          '-file'   => $file);
+  my @mem;
+  while(my $seq = $seqio->next_seq){
+    push @mem, $seq;
+  }
+
+  #create the family
+  my $family = Bio::Cluster::SequenceFamily->new(-family_id=>"Family_1",
+                                                 -description=>"Family Description Here",
+                                                 -annotation_score=>"100",
+                                               -members=>\@mem);
+
+  #access the family
+
+  foreach my $mem ($family->get_members){
+    print $mem->display_id."\t".$mem->desc."\n";
+  }
+
+  #select members if members have a Bio::Species Object
+
+  my @mem = $family->get_members(-binomial=>"Homo sapiens");
+  @mem = $family->get_members(-ncbi_taxid => 9606);
+  @mem = $family->get_members(-common_name=>"Human");
+  @mem = $family->get_members(-species=>"sapiens");
+  @mem = $family->get_members(-genus=>"Homo");
+
+
+
+=head1 DESCRIPTION
+
+This is a simple Family object that may hold any group of object. For more
+specific families, one should derive from FamilyI.
+
+=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@bioperl.org
+  http://bugzilla.bioperl.org/
+
+=head1 AUTHOR - Shawn Hoon 
+
+Email shawnh@fugu-sg.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::Cluster::SequenceFamily;
+
+use strict;
+use vars qw(@ISA);
+
+
+use Bio::Root::Root;
+use Bio::Cluster::FamilyI;
+
+@ISA = qw(Bio::Root::Root Bio::Cluster::FamilyI);
+
+
+=head2 new
+
+ Title   : new
+ Usage   : my $family = Bio::Cluster::SequenceFamily->new(-family_id=>"Family_1",
+                                       -description=>"Family Description Here",
+                                       -annotation_score=>"100",
+                                       -members=>\@mem);
+ Function: Constructor for SequenceFamily object
+ Returns : L<Bio::Cluster::SequenceFamily> object
+
+=cut
+
+sub new {
+	my ($class,@args) = @_;
+  my $self = $class->SUPER::new(@args);
+  my ($id,$description,$version,$annot_score,
+  $family_score,$members) = $self->_rearrange([qw(FAMILY_ID DESCRIPTION VERSION 
+                                                   ANNOTATION_SCORE 
+                                                   FAMILY_SCORE MEMBERS)],@args);
+  $self->{'_members'} = [];
+  $id && $self->family_id($id);
+  $description && $self->description($description);
+  $version && $self->version($version);
+  $annot_score && $self->annotation_score($annot_score);
+  $family_score && $self->family_score($family_score);
+  $members && $self->add_members($members);
+
+  return $self;
+
+}
+
+=head2 version
+
+ Title   : version
+ Usage   : $family->version("1.0");
+ Function: get/set for version
+ Returns : a string version of the family generated. 
+
+=cut
+
+sub version{
+  my ($self,$value) = @_;
+  if($value){
+    $self->{'_version'} =$value;
+  }
+  return $self->{'_version'};
+}
+
+=head2 annotation_score
+
+ Title   : annotation_score
+ Usage   : $family->annotation_score(100);
+ Function: get/set for annotation_score which
+           represent the confidence in which the 
+           consensus description has been assigned
+           to the family.
+ Returns : L<Bio::SimpleAlign> 
+
+=cut
+
+sub annotation_score{
+  my ($self,$score) = @_;
+  if($score){
+    $self->{'_annotation_score'} = $score;
+  }
+  return $self->{'_annotation_score'};
+}
+
+=head2 alignment
+
+ Title   : alignment
+ Usage   : $family->alignment($align);
+ Function: get/set for an alignment object representing
+           the multiple alignment of the members of the family.
+ Returns : L<Bio::SimpleAlign>
+
+=cut
+
+sub alignment {
+	my ($self,$align) = @_;
+  if($align){
+    $self->{'_alignment'} = $align;
+  }
+    return $self->{'_alignment'};
+}
+
+=head2 tree
+
+ Title   : tree
+ Usage   : $family->tree($tree);
+ Function: get/set for an tree object representing
+           the phylogenetic tree of the family. 
+ Returns : L<Bio::Tree> 
+
+=cut
+
+sub tree {
+  my ($self,$tree) = @_;
+  if($tree) {
+    $self->{'_tree'} = $tree;
+  }
+  return $self->{'_tree'};
+}
+
+=head1 L<Bio::Cluster::FamilyI> methods
+
+=cut
+
+=head2 family_score
+
+ Title   : family_score
+ Usage   : Bio::Cluster::FamilyI->family_score(95);
+ Function: get/set for the score of algorithm used to generate
+           the family if present
+
+           This is aliased to cluster_score().
+
+ Returns : the score
+ Args    : the score
+
+=cut
+
+sub family_score {
+    return shift->cluster_score(@_);
+}
+
+
+=head2 family_id
+
+ Title   : family_id
+ Usage   : $family->family_id("Family_1"); 
+ Function: get/set for family id 
+
+           This is aliased to display_id().
+
+ Returns : a string specifying identifier of the family 
+
+=cut
+
+sub family_id{
+    return shift->display_id(@_);
+}
+
+=head1 L<Bio::ClusterI> methods
+
+=cut
+
+=head2 display_id
+
+ Title   : display_id
+ Usage   : 
+ Function: Get/set the display name or identifier for the cluster
+ Returns : a string
+ Args    : optional, on set the display ID ( a string)
+
+=cut
+
+sub display_id{
+    my ($self,$id) = @_;
+    if($id){
+	$self->{'_cluster_id'} = $id;
+    }
+    return $self->{'_cluster_id'};
+}
+
+=head2 description
+
+ Title   : description
+ Usage   : $fam->description("POLYUBIQUITIN")
+ Function: get/set for the consensus description of the cluster
+ Returns : the description string 
+ Args    : Optional the description string 
+
+=cut
+
+sub description{
+  my ($self,$desc) = @_;
+  if($desc){
+    $self->{'_description'} = $desc;
+  }
+  return $self->{'_description'};
+}
+
+=head2 get_members
+
+ Title   : get_members
+ Usage   : Valid criteria:
+           -common_name
+           -binomial
+           -ncbi_taxid
+           -organelle
+           -genus
+           $family->get_members(-common_name =>"human");
+           $family->get_members(-species     =>"homo sapiens");
+           $family->get_members(-ncbi_taxid  => 9606);
+           For now, multiple critieria are ORed.
+
+           Will return all members if no criteria are provided.
+
+ Function: get members using methods from L<Bio::Species>
+           the phylogenetic tree of the family.
+ Returns : an array of objects that are member of this family. 
+
+=cut
+
+sub get_members {
+    my $self = shift;
+    my @ret;
+    
+    if(@_) {
+	my %hash = @_;
+	foreach my $mem ( @{$self->{'_members'}} ) {
+	    foreach my $key ( keys %hash){
+		my $method = $key;
+		$method=~s/-//g;
+		if($mem->can('species')){
+		    my $species = $mem->species;
+		    $species->can($method) ||
+			$self->throw("$method is an invalid criteria");
+		    if($species->$method() eq $hash{$key} ){
+			push @ret, $mem;
+		    }
+		}
+	    }
+	}
+	return @ret;
+    }
+    return @{$self->{'_members'}};    
+}
+
+=head2 size
+
+ Title   : size
+ Usage   : $fam->size();
+ Function: get/set for the size of the family, 
+           calculated from the number of members
+ Returns : the size of the family 
+ Args    : 
+
+=cut
+
+sub size {
+  my ($self) = @_;
+
+  return scalar(@{$self->{'_members'}});
+
+}
+
+=head2 cluster_score
+
+ Title   : cluster_score
+ Usage   : $fam->cluster_score(100);
+ Function: get/set for cluster_score which
+           represent the score in which the clustering
+           algorithm assigns to this cluster.
+ Returns : a number
+
+=cut
+
+sub cluster_score{
+  my ($self,$score) = @_;
+  if($score){
+    $self->{'_cluster_score'} = $score;
+  }
+  return $self->{'_cluster_score'};
+}
+
+
+=head1 Implementation specific methods
+
+  These are mostly for adding/removing/changing.
+
+=cut
+
+=head2 add_members
+
+ Title   : add_members
+ Usage   : $fam->add_member([$seq1,$seq1]);
+ Function: add members to a family
+ Returns : 
+ Args    : the member(s) to add, as an array or arrayref
+
+=cut
+
+sub add_members{
+    my ($self,@mems) = @_;
+
+    my $mem = shift(@mems);
+    if(ref($mem) eq "ARRAY"){
+	push @{$self->{'_members'}},@{$mem};
+    } else {
+	push @{$self->{'_members'}},$mem;
+    }
+    push @{$self->{'_members'}}, @mems;
+
+    return 1;
+}
+
+=head2 remove_members
+
+ Title   : remove_members
+ Usage   : $fam->remove_members();
+ Function: remove all members from a family 
+ Returns : the previous array of members
+ Args    : none
+
+=cut
+
+sub remove_members{
+    my ($self) =  @_;
+    my $mems = $self->{'_members'};
+    $self->{'_members'} = [];
+    return @$mems;
+}
+
+#####################################################################
+# aliases for naming consistency or other reasons                   #
+#####################################################################
+
+*flush_members = \&remove_members;
+*add_member = \&add_members;
+
+sub members{
+    my $self = shift;
+    if(@_) {
+	# this is in set mode
+	$self->warn("setting members() in ".ref($self)." is deprecated.\n".
+		    "Use add_members() instead.");
+	return $self->add_members(@_);
+    } else {
+	# get mode
+	$self->warn("members() in ".ref($self)." is deprecated.\n".
+		    "Use get_members() instead.");
+	return $self->get_members();
+    }
+}
+
+1;