Raw content of Bio::EnsEMBL::Funcgen::DBSQL::ExperimentalSetAdaptor
#
# Ensembl module for Bio::EnsEMBL::DBSQL::Funcgen::ExperimentalSetAdaptor
#
# You may distribute this module under the same terms as Perl itself
=head1 NAME
Bio::EnsEMBL::DBSQL::Funcgen::ExperimentalSetAdaptor - A database adaptor for fetching and
storing ExperimentalSet objects.
=head1 SYNOPSIS
my $rset_adaptor = $db->get_ExperimentalSetAdaptor();
my @rsets = @{$rset_adaptor->fetch_all_ExperimentalSets_by_Experiment()};
my @displayable_rsets = @{$rset_adaptor->fetch_all_displayable_ExperimentalSets()};
#Other methods?
#by FeatureType, CellType all with displayable flag?
=head1 DESCRIPTION
The ExperimentalSetAdaptor is a database adaptor for storing and retrieving
ExperimentalSet objects.
=head1 AUTHOR
This module was created by Nathan Johnson.
This module is part of the Ensembl project: /
=head1 CONTACT
Post comments or questions to the Ensembl development list: ensembl-dev@ebi.ac.uk
=head1 METHODS
=cut
use strict;
use warnings;
package Bio::EnsEMBL::Funcgen::DBSQL::ExperimentalSetAdaptor;
use Bio::EnsEMBL::Utils::Exception qw( throw warning );
use Bio::EnsEMBL::Funcgen::ExperimentalSet;
use Bio::EnsEMBL::Funcgen::ResultFeature;
use Bio::EnsEMBL::Funcgen::DBSQL::BaseAdaptor;
use Bio::EnsEMBL::Funcgen::Utils::EFGUtils qw(mean median);
use vars qw(@ISA);
@ISA = qw(Bio::EnsEMBL::Funcgen::DBSQL::BaseAdaptor);
=head2 fetch_all_by_FeatureType
Arg [1] : Bio::EnsEMBL::Funcgen::FeatureType
Example :
Description: Retrieves a list of features on a given slice that are created
by probes from the specified type of array.
Returntype : Listref of Bio::EnsEMBL::OligoFeature objects
Exceptions : Throws if no array type is provided
Caller : General
Status : At Risk
=cut
sub fetch_all_by_FeatureType {
my ($self, $ftype) = @_;
if( !(ref($ftype) && $ftype->isa("Bio::EnsEMBL::Funcgen::FeatureType") && $ftype->dbID())){
throw("Need to pass a valid stored Bio::EnsEMBL::Funcgen::FeatureType");
}
my $constraint = "es.feature_type_id =".$ftype->dbID();
return $self->generic_fetch($constraint);
}
=head2 fetch_all_by_CellType
Arg [1] : Bio::EnsEMBL::Funcgen::CellType
Example :
Description:
Returntype : Arrayref of Bio::EnsEMBL::Funcgen::ExperimentalSet objects
Exceptions : Throws if no CellType is provided
Caller : General
Status : At Risk
=cut
sub fetch_all_by_CellType {
my ($self, $ctype) = @_;
if( !(ref($ctype) && $ctype->isa("Bio::EnsEMBL::Funcgen::CellType") && $ctype->dbID())){
throw("Need to pass a valid stored Bio::EnsEMBL::Funcgen::CellType");
}
my $constraint = "es.cell_type_id =".$ctype->dbID();
return $self->generic_fetch($constraint);
}
=head2 fetch_all_by_Experiment
Arg [1] : Bio::EnsEMBL::Funcgen::Experiment
Example : $exp_set = $eseta->fetch_by_Experiment($exp);
Description: Retrieves a ExperimentalSet based on the given Experiment
Returntype : Bio::EnsEMBL::Funcgen::ExperimentalSet
Exceptions : Throws if no valid stored Experiment provided
Caller : General
Status : At Risk
=cut
sub fetch_all_by_Experiment {
my ($self, $exp) = @_;
if( ! ( ref($exp) &&
$exp->isa('Bio::EnsEMBL::Funcgen::Experiment') &&
$exp->dbID())){
throw('Need to pass a valid stored Bio::EnsEMBL::Funcgen::Experiment');
}
return $self->generic_fetch('es.experiment_id = '.$exp->dbID());
}
=head2 fetch_by_name
Arg [1] : string - ExperimentalSet name
Example : $exp_set = $eseta->fetch_by_Experiment('exp_set_1');
Description: Retrieves a ExperimentalSet based on the ExperimetnalSet name
Returntype : Bio::EnsEMBL::Funcgen::ExperimentalSet
Exceptions : Throws if no name provided
Caller : General
Status : At Risk
=cut
sub fetch_by_name {
my ($self, $name) = @_;
throw('Need to pass a name argument') if( ! defined $name);
return $self->generic_fetch("es.name ='${name}'")->[0];
}
=head2 _tables
Args : None
Example : None
Description: PROTECTED implementation of superclass abstract method.
Returns the names and aliases of the tables to use for queries.
Returntype : List of listrefs of strings
Exceptions : None
Caller : Internal
Status : At Risk
=cut
sub _tables {
my $self = shift;
return (
[ 'experimental_set', 'es' ],
[ 'experimental_subset', 'ess' ],
);
}
=head2 _columns
Args : None
Example : None
Description: PROTECTED implementation of superclass abstract method.
Returns a list of columns to use for queries.
Returntype : List of strings
Exceptions : None
Caller : Internal
Status : At Risk
=cut
sub _columns {
my $self = shift;
return qw(
es.experimental_set_id es.experiment_id
es.feature_type_id es.cell_type_id
es.format es.vendor
es.name ess.name
ess.experimental_subset_id
);
}
=head2 _default_where_clause
Args : None
Example : None
Description: PROTECTED implementation of superclass abstract method.
Returns an additional table joining constraint to use for
queries.
Returntype : List of strings
Exceptions : None
Caller : Internal
Status : At Risk
=cut
#sub _default_where_clause {
# my $self = shift;
# return 'es.experimental_set_id = ess.experimental_set_id';
#}
=head2 _left_join
Args : None
Example : None
Description: PROTECTED implementation of superclass abstract method.
Returns an additional table joining constraint to use for
queries.
Returntype : List
Exceptions : None
Caller : Internal
Status : At Risk
=cut
sub _left_join {
my $self = shift;
return (['experimental_subset', 'es.experimental_set_id = ess.experimental_set_id']);
}
=head2 _objs_from_sth
Arg [1] : DBI statement handle object
Example : None
Description: PROTECTED implementation of superclass abstract method.
Creates Array objects from an executed DBI statement
handle.
Returntype : Listref of Bio::EnsEMBL::Funcgen::Experiment objects
Exceptions : None
Caller : Internal
Status : At Risk
=cut
sub _objs_from_sth {
my ($self, $sth) = @_;
my ($dbid, $exp_id, $ftype_id, $ctype_id, $format, $vendor, $name, $ess_name, $ess_id);
my ($eset, @esets, $ftype, $ctype);
my $ft_adaptor = $self->db->get_FeatureTypeAdaptor();
my $ct_adaptor = $self->db->get_CellTypeAdaptor();
my $exp_adaptor = $self->db->get_ExperimentAdaptor();
$sth->bind_columns(\$dbid, \$exp_id, \$ftype_id, \$ctype_id, \$format, \$vendor, \$name, \$ess_name, \$ess_id);
#this fails if we delete entries from the joined tables
#causes problems if we then try and store an rs which is already stored
while ( $sth->fetch() ) {
if(! $eset || ($eset->dbID() != $dbid)){
push @esets, $eset if $eset;
$ftype = (defined $ftype_id) ? $ft_adaptor->fetch_by_dbID($ftype_id) : undef;
$ctype = (defined $ctype_id) ? $ct_adaptor->fetch_by_dbID($ctype_id) : undef;
$eset = Bio::EnsEMBL::Funcgen::ExperimentalSet->new(
-DBID => $dbid,
-EXPERIMENT => $exp_adaptor->fetch_by_dbID($exp_id),
-FORMAT => $format,
-VENDOR => $vendor,
-FEATURE_TYPE => $ftype,
-CELL_TYPE => $ctype,
-ADAPTOR => $self,
-NAME => $name,
);
}
#This assumes logical association between chip from the same exp, confer in store method?????????????????
#we're not controlling ctype and ftype during creating new ExperimentalSets to store.
#we should change add_table_id to add_ExperimentalChip and check in that method
if(defined $ess_name){
$eset->add_new_subset($ess_name, Bio::EnsEMBL::Funcgen::ExperimentalSubset->new( -name => $ess_name,
-dbID => $ess_id,
-adaptor => $self,
-experimental_set => $eset,
));
}
}
push @esets, $eset if $eset;
return \@esets;
}
=head2 store
Args : List of Bio::EnsEMBL::Funcgen::ExperimentalSet objects
Example : $rsa->store(@esets);
Description: Stores or updates previously stored ExperimentalSet objects in the database.
Returntype : None
Exceptions : Throws if a List of ExperimentalSet objects is not provided or if
an analysis is not attached to any of the objects
Caller : General
Status : At Risk
=cut
sub store{
my ($self, @exp_sets) = @_;
throw("Must provide a list of ExperimentalSet objects") if(scalar(@exp_sets == 0));
my $sth = $self->prepare('INSERT INTO experimental_set (experiment_id, feature_type_id,
cell_type_id, format, vendor, name)
VALUES (?, ?, ?, ?, ?, ?)');
my $db = $self->db();
foreach my $set (@exp_sets) {
if( ! ref $set || ! $set->isa('Bio::EnsEMBL::Funcgen::ExperimentalSet') ) {
throw('Must be an ExperimentalSet object to store');
}
if ( $set->is_stored($db) ) {
throw('ExperimentalSet [' . $set->dbID() . '] is already stored in the database\nExperimentalSetAdaptor does not yet accomodate updating ExperimentalSets');
#would need to retrive stored result set and update table_ids
}
my $ct_id = (defined $set->cell_type()) ? $set->cell_type->dbID() : undef;
my $ft_id = (defined $set->feature_type()) ? $set->feature_type->dbID() : undef;
$sth->bind_param(1, $set->get_Experiment->dbID(), SQL_INTEGER);
$sth->bind_param(2, $ft_id, SQL_INTEGER);
$sth->bind_param(3, $ct_id, SQL_INTEGER);
$sth->bind_param(4, $set->format, SQL_VARCHAR);
$sth->bind_param(5, $set->vendor, SQL_VARCHAR);
$sth->bind_param(6, $set->name, SQL_VARCHAR);
$sth->execute();
$set->dbID( $sth->{'mysql_insertid'} );
$set->adaptor($self);
$self->store_ExperimentalSubsets($set->get_subsets()) if @{$set->get_subsets()};
}
return \@exp_sets;
}
=head2 store_ExperimentalSubsets
Args : Bio::EnsEMBL::Funcgen::ExperimentalSet
Example : $esa->store_ExperimentalSubsets(\@e_subsets);
Description: Convenience methods extracted from store to allow updating of ExperimentalSubset entries
during inline result processing which would otherwise be troublesome due to the need
for an ExperimentalSet
Returntype : Bio::EnsEMBL::Funcgen::ExperimentalSet
Exceptions : Throws if a stored ExperimentalSet object is not provided
Throws if no ExperimentalSubsets present
Caller : General
Status : At Risk
=cut
sub store_ExperimentalSubsets{
my ($self, $ssets) = @_;
my $sth = $self->prepare("
INSERT INTO experimental_subset (
experimental_set_id, name
) VALUES (?, ?)
");
throw('Must provide at least one ExperimentalSubset') if(! @$ssets);
#Store and set all previously unstored table_ids
foreach my $sset(@$ssets){
#use is_stored here?
if($sset->dbID()){
warn "Skipping ExperimentalSubset ".$sset->name()." - already stored in the DB";
next;
}
$sth->bind_param(1, $sset->experimental_set->dbID(), SQL_INTEGER);
$sth->bind_param(2, $sset->name(), SQL_VARCHAR);
$sth->execute();
$sset->dbID($sth->{'mysql_insertid'});
$sset->adaptor($self);
#No need to set it as we're working on the hasref here, so should be updated in the class.
#add directly to avoid name clash warnings
#$exp_set->{'subsets'}{$sub_set_name} = Bio::EnsEMBL::Funcgen::ExperimentalSubset->new
# (
# -dbID => $sth->{'mysql_insertid'},
# -name => $sub_set_name,
# -adaptor => $self,
# #-experimental_set_id?
# );
}
#don't really need to return as we're passing the ref
return $ssets;
}
=head2 list_dbIDs
Args : None
Example : my @sets_ids = @{$esa->list_dbIDs()};
Description: Gets an array of internal IDs for all ExperimentalSet objects in
the current database.
Returntype : List of ints
Exceptions : None
Caller : general
Status : stable
=cut
sub list_dbIDs {
my $self = shift;
return $self->_list_dbIDs('result_set');
}
1;