Raw content of Bio::EnsEMBL::Compara::AlignedMember =head1 NAME AlignedMember - DESCRIPTION of Object =head1 DESCRIPTION A subclass of Member which extends it to allow it to be aligned with other AlignedMember objects. General enough to allow for global, local, pair-wise and multiple alignments. To be used primarily in NestedSet Tree data-structure. =head1 CONTACT Contact Jessica Severin on module implemetation/design detail: jessica@ebi.ac.uk Contact Abel Ureta-Vidal on EnsEMBL/Compara: abel@ebi.ac.uk Contact Ewan Birney on EnsEMBL in general: birney@sanger.ac.uk =cut =head1 APPENDIX The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _ =cut package Bio::EnsEMBL::Compara::AlignedMember; use strict; #use Time::HiRes qw(time gettimeofday tv_interval); use Bio::EnsEMBL::Utils::Exception; use Bio::EnsEMBL::Compara::Member; our @ISA = qw(Bio::EnsEMBL::Compara::Member); ################################## # overriden superclass methods ################################## sub copy { my $self = shift; my $mycopy = $self->SUPER::copy; bless $mycopy, "Bio::EnsEMBL::Compara::AlignedMember"; $mycopy->cigar_line($self->cigar_line); $mycopy->cigar_start($self->cigar_start); $mycopy->cigar_end($self->cigar_end); $mycopy->perc_cov($self->perc_cov); $mycopy->perc_id($self->perc_id); $mycopy->perc_pos($self->perc_pos); $mycopy->method_link_species_set_id($self->method_link_species_set_id); return $mycopy; } sub print_node { my $self = shift; printf("(%s %d,%d)", $self->node_id, $self->left_index, $self->right_index); printf(" %s", $self->genome_db->name) if($self->genome_db_id and $self->adaptor); if($self->gene_member) { printf(" %s %s %s:%d-%d", $self->gene_member->stable_id, $self->gene_member->display_label || '', $self->gene_member->chr_name, $self->gene_member->chr_start, $self->gene_member->chr_end); } elsif($self->stable_id) { printf(" (%d) %s", $self->member_id, $self->stable_id); } print("\n"); } ##################################################### sub name { my $self = shift; return $self->stable_id(@_); } sub cigar_line { my $self = shift; $self->{'_cigar_line'} = shift if(@_); return $self->{'_cigar_line'}; } sub cigar_start { my $self = shift; $self->{'_cigar_start'} = shift if(@_); return $self->{'_cigar_start'}; } sub cigar_end { my $self = shift; $self->{'_cigar_end'} = shift if(@_); return $self->{'_cigar_end'}; } sub perc_cov { my $self = shift; $self->{'perc_cov'} = shift if(@_); return $self->{'perc_cov'}; } sub perc_id { my $self = shift; $self->{'perc_id'} = shift if(@_); return $self->{'perc_id'}; } sub perc_pos { my $self = shift; $self->{'perc_pos'} = shift if(@_); return $self->{'perc_pos'}; } sub method_link_species_set_id { my $self = shift; $self->{'method_link_species_set_id'} = shift if(@_); $self->{'method_link_species_set_id'} = 0 unless(defined($self->{'method_link_species_set_id'})); return $self->{'method_link_species_set_id'}; } sub alignment_string { my $self = shift; my $exon_cased = shift; unless (defined $self->cigar_line && $self->cigar_line ne "") { throw("To get an alignment_string, the cigar_line needs to be define\n"); } unless (defined $self->{'alignment_string'}) { my $sequence; if ($exon_cased) { $sequence = $self->sequence_exon_cased; } else { $sequence = $self->sequence; } if (defined $self->cigar_start || defined $self->cigar_end) { unless (defined $self->cigar_start && defined $self->cigar_end) { throw("both cigar_start and cigar_end should be defined"); } my $offset = $self->cigar_start - 1; my $length = $self->cigar_end - $self->cigar_start + 1; $sequence = substr($sequence, $offset, $length); } my $cigar_line = $self->cigar_line; $cigar_line =~ s/([MD])/$1 /g; my @cigar_segments = split " ",$cigar_line; my $alignment_string = ""; my $seq_start = 0; foreach my $segment (@cigar_segments) { if ($segment =~ /^(\d*)D$/) { my $length = $1; $length = 1 if ($length eq ""); $alignment_string .= "-" x $length; } elsif ($segment =~ /^(\d*)M$/) { my $length = $1; $length = 1 if ($length eq ""); $alignment_string .= substr($sequence,$seq_start,$length); $seq_start += $length; } } $self->{'alignment_string'} = $alignment_string; } return $self->{'alignment_string'}; } =head2 cdna_alignment_string Arg [1] : none Example : my $cdna_alignment = $aligned_member->cdna_alignment_string(); Description: Converts the peptide alignment string to a cdna alignment string. This only works for EnsEMBL peptides whose cdna can be retrieved from the attached EnsEMBL databse. If the cdna cannot be retrieved undef is returned and a warning is thrown. Returntype : string Exceptions : none Caller : general =cut sub cdna_alignment_string { my $self = shift; throw("can't connect to CORE to get transcript and cdna for " . "genome_db_id:" . $self->genome_db_id ) unless($self->transcript); unless (defined $self->{'cdna_alignment_string'}) { my $cdna = $self->transcript->translateable_seq; if (defined $self->cigar_start || defined $self->cigar_end) { unless (defined $self->cigar_start && defined $self->cigar_end) { throw("both cigar_start and cigar_end should be defined"); } my $offset = $self->cigar_start * 3 - 3; my $length = ($self->cigar_end - $self->cigar_start + 1) * 3; $cdna = substr($cdna, $offset, $length); } my $cdna_len = length($cdna); my $start = 0; my $cdna_align_string = ''; # foreach my $pep (split(//, $self->alignment_string)) { # Speed up below my $alignment_string = $self->alignment_string; foreach my $pep (unpack("A1" x length($alignment_string), $alignment_string)) { if($pep eq '-') { $cdna_align_string .= '--- '; } else { my $codon = substr($cdna, $start, 3); unless (length($codon) == 3) { # sometimes the last codon contains only 1 or 2 nucleotides. # making sure that it has 3 by adding as many Ns as necessary $codon .= 'N' x (3 - length($codon)); } $cdna_align_string .= $codon . ' '; $start += 3; } } $self->{'cdna_alignment_string'} = $cdna_align_string } return $self->{'cdna_alignment_string'}; } ############################################################# # # orthologue and paralogue searching # ############################################################# sub orthologue_in_genome { my $self = shift; my $genomedb = shift; throw("[$genomedb] must be a Bio::EnsEMBL::Compara::GenomeDB object") unless ($genomedb and $genomedb->isa("Bio::EnsEMBL::Compara::GenomeDB")); # my $starttime = time(); my $all_leaves = $self->root->get_all_leaves; foreach my $member (@{$all_leaves}) { } # printf("%1.3f secs to find orthologue\n", (time()-$starttime)); } sub get_leaves_in_genome { my $self = shift; } 1;