Raw content of Bio::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor
# Copyright EnsEMBL 1999-2003
#
# Ensembl module for Bio::EnsEMBL::DBSQL::GenomicAlignAdaptor
#
# Cared for by Ewan Birney
#
#
# You may distribute this module under the same terms as perl itself
# POD documentation - main docs before the code
=head1 NAME
Bio::EnsEMBL::DBSQL::GenomicAlignAdaptor - Object adaptor to access data in the genomic_align table
=head1 SYNOPSIS
Please, consider using the Bio::EnsEMBL::Compara::DBSQL::GenomicAlignBlockAdaptor instead.
=head2 Get the adaptor from the Registry
use Bio::EnsEMBL::Registry;
my $reg = "Bio::EnsEMBL::Registry";
$reg->load_registry_from_db(
-host => "ensembldb.ensembl.org",
-user => "anonymous");
my $genomic_align_adaptor = $reg->get_adaptor(
"Multi", "compara", "GenomicAlign");
=head2 Store method
$genomic_align_adaptor->store($synteny_region);
=head2 Fetching methods
my $genomic_align = $genomic_align_adaptor->fetch_by_dbID(1);
my $genomic_aligns = $genomic_align_adaptor->
fetch_by_GenomicAlignBlock($genomic_align_block);
my $genomic_aligns = $genomic_align_adaptor->
fetch_by_genomic_align_block_id(1001);
=head2 Other methods
$genomic_align_adaptor->delete_by_genomic_align_block_id(1001);
$genomic_align = $genomic_align_adaptor->
retrieve_all_direct_attributes($genomic_align);
$genomic_align_adaptor->use_autoincrement(0);
=head1 DESCRIPTION
This module is intended to access data in the genomic_align table. In most cases, you want to use
the Bio::EnsEMBL::Compara::DBSQL::GenomicAlignBlockAdaptor instead.
Each alignment is represented by Bio::EnsEMBL::Compara::GenomicAlignBlock. Each GenomicAlignBlock
contains several Bio::EnsEMBL::Compara::GenomicAlign, one per sequence included in the alignment.
The GenomicAlign contains information about the coordinates of the sequence and the sequence of
gaps, information needed to rebuild the aligned sequence. By combining all the aligned sequences
of the GenomicAlignBlock, it is possible to get the orignal alignment back.
=head1 INHERITANCE
This class inherits all the methods and attributes from Bio::EnsEMBL::DBSQL::BaseAdaptor
=head1 SEE ALSO
- Bio::EnsEMBL::Registry
- Bio::EnsEMBL::DBSQL::BaseAdaptor
- Bio::EnsEMBL::Compara::DBSQL::GenomicAlignBlockAdaptor
- Bio::EnsEMBL::Compara::GenomicAlignBlock
- Bio::EnsEMBL::Compara::GenomicAlign
- Bio::EnsEMBL::Compara::DnaFrag;
=head1 AUTHOR
Javier Herrero (jherrero@ebi.ac.uk)
This modules is part of the Ensembl project
=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::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor;
use vars qw(@ISA);
use strict;
use Bio::EnsEMBL::DBSQL::BaseAdaptor;
use Bio::EnsEMBL::Compara::GenomicAlign;
use Bio::EnsEMBL::Compara::DnaFrag;
use Bio::EnsEMBL::Utils::Exception;
@ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor);
=head2 new
Arg [1] : list of args to super class constructor
Example : $ga_a = new Bio::EnsEMBL::Compara::GenomicAlignAdaptor($dbobj);
Description: Creates a new GenomicAlignAdaptor. This
class should be instantiated through the get method on the
DBAdaptor rather than calling this method directly.
Returntype : none
Exceptions : none
Caller : Bio::EnsEMBL::DBSQL::DBConnection
Status : Stable
=cut
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{_use_autoincrement} = 1;
return $self;
}
=head2 store
Arg 1 : listref Bio::EnsEMBL::Compara::GenomicAlign $ga
The things you want to store
Example : none
Description: It stores the given GA in the database. Attached
objects are not stored. Make sure you store them first.
Returntype : none
Exceptions : throw if the linked Bio::EnsEMBL::Compara::DnaFrag object or
the linked Bio::EnsEMBL::Compara::GenomicAlignBlock or
the linked Bio::EnsEMBL::Compara::MethodLinkSpeciesSet
are not in the database
Caller : $object->methodname
Status : Stable
=cut
sub store {
my ( $self, $genomic_aligns ) = @_;
my $genomic_align_sql = qq{INSERT INTO genomic_align (
genomic_align_id,
genomic_align_block_id,
method_link_species_set_id,
dnafrag_id,
dnafrag_start,
dnafrag_end,
dnafrag_strand,
cigar_line,
level_id
) VALUES (?,?,?, ?,?,?, ?,?,?)};
my $genomic_align_sth = $self->prepare($genomic_align_sql);
for my $ga ( @$genomic_aligns ) {
if(!defined($ga->dnafrag) or !defined($ga->dnafrag->dbID)) {
throw( "dna_fragment in GenomicAlign is not in DB" );
}
if(!defined($ga->genomic_align_block) or !defined($ga->genomic_align_block->dbID)) {
throw( "genomic_align_block in GenomicAlign is not in DB" );
}
if(!defined($ga->method_link_species_set) or !defined($ga->method_link_species_set->dbID)) {
throw( "method_link_species_set in GenomicAlign is not in DB" );
}
my $lock_tables = 0;
if (!$ga->dbID and !$self->use_autoincrement()) {
## Lock tables
$lock_tables = 1;
$self->dbc->do(qq{ LOCK TABLES genomic_align WRITE });
my $sql =
"SELECT MAX(genomic_align_id) FROM genomic_align WHERE".
" genomic_align_block_id > ".$ga->method_link_species_set->dbID.
"0000000000 AND genomic_align_block_id < ".
($ga->method_link_species_set->dbID + 1)."0000000000";
my $sth = $self->prepare($sql);
$sth->execute();
my $genomic_align_id = ($sth->fetchrow_array() or
($ga->method_link_species_set->dbID * 10000000000));
$ga->dbID($genomic_align_id + 1);
}
$genomic_align_sth->execute(
($ga->dbID or "NULL"),
$ga->genomic_align_block->dbID,
$ga->method_link_species_set->dbID,
$ga->dnafrag->dbID,
$ga->dnafrag_start,
$ga->dnafrag_end,
$ga->dnafrag_strand,
($ga->cigar_line or "NULL"),
($ga->level_id or 1)
);
if ($lock_tables) {
## Unlock tables
$self->dbc->do("UNLOCK TABLES");
}
if (!$ga->dbID) {
$ga->dbID($genomic_align_sth->{'mysql_insertid'});
}
info("Stored Bio::EnsEMBL::Compara::GenomicAlign ".
($ga->dbID or "NULL").
", gab=".$ga->genomic_align_block->dbID.
", mlss=".$ga->method_link_species_set->dbID.
", dnaf=".$ga->dnafrag->dbID.
" [".$ga->dnafrag_start.
"-".$ga->dnafrag_end."]".
" (".$ga->dnafrag_strand.")".
", cgr=".($ga->cigar_line or "NULL").
", lvl=".($ga->level_id or 1));
}
}
=head2 delete_by_genomic_align_block_id
Arg 1 : integer $genomic_align_block_id
Example : $gen_ali_blk_adaptor->delete_by_genomic_align_block_id(352158763);
Description: It removes the matching GenomicAlign objects from the database
Returntype : none
Exceptions : none
Caller : general
Status : Stable
=cut
sub delete_by_genomic_align_block_id {
my ($self, $genomic_align_block_id) = @_;
my $genomic_align_sql =
qq{DELETE FROM genomic_align WHERE genomic_align_block_id = ?};
## Deletes genomic_block entries
my $sth = $self->prepare($genomic_align_sql);
$sth->execute($genomic_align_block_id);
}
=head2 fetch_by_dbID
Arg 1 : integer $dbID
Example : my $genomic_align = $genomic_align_adaptor->fetch_by_dbID(23134);
Description: Retrieve the corresponding
Bio::EnsEMBL::Compara::GenomicAlign object
Returntype : Bio::EnsEMBL::Compara::GenomicAlign object
Exceptions : Returns undef if no matching entry is found in the database.
Caller : object::methodname
Status : Stable
=cut
sub fetch_by_dbID {
my ($self, $dbID) = @_;
my $genomic_align;
my $sql = qq{
SELECT
genomic_align_id,
genomic_align_block_id,
method_link_species_set_id,
dnafrag_id,
dnafrag_start,
dnafrag_end,
dnafrag_strand,
cigar_line,
level_id
FROM
genomic_align
WHERE
genomic_align_id = ?
};
my $sth = $self->prepare($sql);
$sth->execute($dbID);
my @values = $sth->fetchrow_array();
$genomic_align = new Bio::EnsEMBL::Compara::GenomicAlign(
-dbID => $values[0],
-adaptor => $self,
-genomic_align_block_id => $values[1],
-method_link_species_set_id => $values[2],
-dnafrag_id => $values[3],
-dnafrag_start => $values[4],
-dnafrag_end => $values[5],
-dnafrag_strand => $values[6],
-cigar_line => $values[7],
-level_id => $values[8],
);
return $genomic_align;
}
=head2 fetch_all_by_GenomicAlignBlock
Arg 1 : Bio::EnsEMBL::Compara::GenomicAlignBlock object with a valid dbID
Example : my $genomic_aligns =
$genomic_align_adaptor->fetch_all_by_GenomicAlignBlock($genomic_align_block);
Description: Retrieve the corresponding
Bio::EnsEMBL::Compara::GenomicAlign objects
Returntype : ref. to an array of Bio::EnsEMBL::Compara::GenomicAlign objects
Exceptions : Returns a ref. to an empty array if there are no matching entries
Exceptions : Thrown if $genomic_align_block is not a
Bio::EnsEMBL::Compara::GenomicAlignBlock object
Caller : object::methodname
Status : Stable
=cut
sub fetch_all_by_GenomicAlignBlock {
my ($self, $genomic_align_block) = @_;
my $genomic_aligns = [];
throw("$genomic_align_block is not a Bio::EnsEMBL::Compara::GenomicAlignBlock object")
if (!$genomic_align_block->isa("Bio::EnsEMBL::Compara::GenomicAlignBlock"));
my $genomic_align_block_id = $genomic_align_block->dbID;
return $self->fetch_all_by_genomic_align_block_id($genomic_align_block_id);
}
=head2 fetch_all_by_genomic_align_block_id
Arg 1 : integer $genomic_align_block_id
Example : my $genomic_aligns =
$genomic_align_adaptor->fetch_all_by_genomic_align_block_id(23134);
Description: Retrieve the corresponding
Bio::EnsEMBL::Compara::GenomicAlign objects
Returntype : ref. to an array of Bio::EnsEMBL::Compara::GenomicAlign objects
Exceptions : Returns a ref. to an empty array if there are no matching entries
Exceptions : Thrown if $genomic_align_block is neither a number
Caller : object::methodname
Status : Stable
=cut
sub fetch_all_by_genomic_align_block_id {
my ($self, $genomic_align_block_id) = @_;
my $genomic_aligns = [];
my $sql = qq{
SELECT
genomic_align_id,
genomic_align_block_id,
method_link_species_set_id,
dnafrag_id,
dnafrag_start,
dnafrag_end,
dnafrag_strand,
cigar_line,
level_id
FROM
genomic_align
WHERE
genomic_align_block_id = ?
};
my $sth = $self->prepare($sql);
$sth->execute($genomic_align_block_id);
while (my @values = $sth->fetchrow_array()) {
my $this_genomic_align = new Bio::EnsEMBL::Compara::GenomicAlign(
-dbID => $values[0],
-adaptor => $self,
-genomic_align_block_id => $values[1],
-method_link_species_set_id => $values[2],
-dnafrag_id => $values[3],
-dnafrag_start => $values[4],
-dnafrag_end => $values[5],
-dnafrag_strand => $values[6],
-cigar_line => $values[7],
-level_id => $values[8],
);
push(@$genomic_aligns, $this_genomic_align);
}
return $genomic_aligns;
}
=head2 store_daf (UNDER DEVELOPMENT)
Arg 1 :
Example :
Description:
Returntype :
Exceptions :
Caller :
=cut
sub store_daf {
my ($self, $dafs, $dnafrag, $hdnafrag, $alignment_type) = @_;
my @gas;
foreach my $daf (@{$dafs}) {
my $ga = Bio::EnsEMBL::Compara::GenomicAlign->new_fast
('consensus_dnafrag' => $dnafrag,
'consensus_start' => $daf->start,
'consensus_end' => $daf->end,
'query_dnafrag' => $hdnafrag,
'query_start' => $daf->hstart,
'query_end' => $daf->hend,
'query_strand' => $daf->hstrand,
'alignment_type' => $alignment_type,
'score' => $daf->score,
'perc_id' => $daf->percent_id,
'group_id' => $daf->group_id,
'level_id' => $daf->level_id,
'cigar_line' => $daf->cigar_string
);
push @gas, $ga;
}
$self->store(\@gas);
}
=head2 retrieve_all_direct_attributes
Arg 1 : Bio::EnsEMBL::Compara::GenomicAlign $genomic_align
Example : $genomic_align_adaptor->retrieve_all_direct_attributes($genomic_align)
Description: Retrieve the all the direct attibutes corresponding to the dbID of the
Bio::EnsEMBL::Compara::GenomicAlign object. It is used after lazy fetching
of the object for populating it when required.
Returntype : Bio::EnsEMBL::Compara::GenomicAlign object
Exceptions :
Caller : none
Status : Stable
=cut
sub retrieve_all_direct_attributes {
my ($self, $genomic_align) = @_;
my $sql = qq{
SELECT
genomic_align_block_id,
method_link_species_set_id,
dnafrag_id,
dnafrag_start,
dnafrag_end,
dnafrag_strand,
cigar_line,
level_id
FROM
genomic_align
WHERE
genomic_align_id = ?
};
my $sth = $self->prepare($sql);
$sth->execute($genomic_align->dbID);
my ($genomic_align_block_id, $method_link_species_set_id, $dnafrag_id, $dnafrag_start, $dnafrag_end,
$dnfrag_strand, $cigar_line, $level_id) = $sth->fetchrow_array();
## Populate the object
$genomic_align->adaptor($self);
$genomic_align->genomic_align_block_id($genomic_align_block_id) if (defined($genomic_align_block_id));
$genomic_align->method_link_species_set_id($method_link_species_set_id) if (defined($method_link_species_set_id));
$genomic_align->dnafrag_id($dnafrag_id) if (defined($dnafrag_id));
$genomic_align->dnafrag_start($dnafrag_start) if (defined($dnafrag_start));
$genomic_align->dnafrag_end($dnafrag_end) if (defined($dnafrag_end));
$genomic_align->dnafrag_strand($dnfrag_strand) if (defined($dnfrag_strand));
$genomic_align->cigar_line($cigar_line) if (defined($cigar_line));
$genomic_align->level_id($level_id) if (defined($level_id));
return $genomic_align;
}
=head2 use_autoincrement
[Arg 1] : (optional)int value
Example : $genomic_align_adaptor->use_autoincrement(0);
Description: Getter/setter for the _use_autoincrement flag. This flag
is used when storing new objects with no dbID in the
database. If the flag is ON (default), the adaptor will
let the DB set the dbID using the AUTO_INCREMENT ability.
If you unset the flag, then the adaptor will look for the
first available dbID after 10^10 times the
method_link_species_set_id.
Returntype : integer
Exceptions :
Caller : none
Status : Stable
=cut
sub use_autoincrement {
my ($self, $value) = @_;
if (defined $value) {
$self->{_use_autoincrement} = $value;
}
return $self->{_use_autoincrement};
}
1;