Bio::EnsEMBL::DBSQL::Funcgen::AnnotatedFeatureAdaptor - A database adaptor for fetching and
storing AnnotatedFeature objects.
sub _objs_from_sth
{ my ($self, $sth, $mapper, $dest_slice) = @_;
my ($sa, $seq_region_id);
$sa = $dest_slice->adaptor->db->get_SliceAdaptor() if($dest_slice); $sa ||= $self->db->get_SliceAdaptor();
my $fset_adaptor = $self->db->get_FeatureSetAdaptor();
my @features;
my (%fset_hash, %slice_hash, %sr_name_hash, %sr_cs_hash);
my (
$annotated_feature_id, $efg_seq_region_id,
$seq_region_start, $seq_region_end,
$seq_region_strand, $fset_id,
$display_label, $score
);
$sth->bind_columns(\$
annotated_feature_id,\$ efg_seq_region_id,\$
seq_region_start,\$ seq_region_end,\$
seq_region_strand,\$ fset_id,\$
display_label,\$ score
);
my $asm_cs;
my $cmp_cs;
my $asm_cs_name;
my $asm_cs_vers;
my $cmp_cs_name;
my $cmp_cs_vers;
if ($mapper) {
$asm_cs = $mapper->assembled_CoordSystem();
$cmp_cs = $mapper->component_CoordSystem();
$asm_cs_name = $asm_cs->name();
$asm_cs_vers = $asm_cs->version();
$cmp_cs_name = $cmp_cs->name();
$cmp_cs_vers = $cmp_cs->version();
}
my $dest_slice_start;
my $dest_slice_end;
my $dest_slice_strand;
my $dest_slice_length;
my $dest_slice_sr_name;
if ($dest_slice) {
$dest_slice_start = $dest_slice->start();
$dest_slice_end = $dest_slice->end();
$dest_slice_strand = $dest_slice->strand();
$dest_slice_length = $dest_slice->length();
$dest_slice_sr_name = $dest_slice->seq_region_name();
}
FEATURE: while ( $sth->fetch() ) {
$seq_region_id = $self->get_core_seq_region_id($efg_seq_region_id);
if(! $seq_region_id){
warn "Cannot get slice for eFG seq_region_id $efg_seq_region_id\n".
"The region you are using is not present in the cuirrent dna DB";
next;
}
$fset_hash{$fset_id} = $fset_adaptor->fetch_by_dbID($fset_id) if(! exists $fset_hash{$fset_id});
my $slice = $slice_hash{'ID:'.$seq_region_id};
if (! $slice) {
$slice = $sa->fetch_by_seq_region_id($seq_region_id);
$slice_hash{'ID:'.$seq_region_id} = $slice;
$sr_name_hash{$seq_region_id} = $slice->seq_region_name();
$sr_cs_hash{$seq_region_id} = $slice->coord_system();
}
my $sr_name = $sr_name_hash{$seq_region_id};
my $sr_cs = $sr_cs_hash{$seq_region_id};
if ($mapper) {
throw("Not yet implmented mapper, check equals are Funcgen calls too!");
($sr_name, $seq_region_start, $seq_region_end, $seq_region_strand)
= $mapper->fastmap($sr_name, $seq_region_start, $seq_region_end, $seq_region_strand, $sr_cs);
next FEATURE if !defined $sr_name;
if ( $asm_cs == $sr_cs || ( $cmp_cs != $sr_cs && $asm_cs->equals($sr_cs) ) ) {
$slice = $slice_hash{"NAME:$sr_name:$cmp_cs_name:$cmp_cs_vers"}
||= $sa->fetch_by_region($cmp_cs_name, $sr_name, undef, undef, undef, $cmp_cs_vers);
} else {
$slice = $slice_hash{"NAME:$sr_name:$asm_cs_name:$asm_cs_vers"}
||= $sa->fetch_by_region($asm_cs_name, $sr_name, undef, undef, undef, $asm_cs_vers);
}
}
if ($dest_slice) {
unless ($dest_slice_start == 1 && $dest_slice_strand == 1) {
if ($dest_slice_strand == 1) {
$seq_region_start = $seq_region_start - $dest_slice_start + 1;
$seq_region_end = $seq_region_end - $dest_slice_start + 1;
} else {
my $tmp_seq_region_start = $seq_region_start;
$seq_region_start = $dest_slice_end - $seq_region_end + 1;
$seq_region_end = $dest_slice_end - $tmp_seq_region_start + 1;
$seq_region_strand *= -1;
}
}
next FEATURE if $seq_region_end < 1 || $seq_region_start > $dest_slice_length
|| ( $dest_slice_sr_name ne $sr_name );
$slice = $dest_slice;
}
push @features, $self->_new_fast( {
'start' => $seq_region_start,
'end' => $seq_region_end,
'strand' => $seq_region_strand,
'slice' => $slice,
'analysis' => $fset_hash{$fset_id}->analysis(),
'adaptor' => $self,
'dbID' => $annotated_feature_id,
'score' => $score,
'display_label' => $display_label,
'feature_set' => $fset_hash{$fset_id},
} );
}
return\@ features; } |
sub fetch_all_by_Slice_Experiment
{ my ($self, $slice, $exp, $logic_name) = @_;
if (! ($exp && $exp->isa("Bio::EnsEMBL::Funcgen::Experiment"))){
throw("Need to pass a valid Bio::EnsEMBL::Funcgen::Experiment");
}
throw("Need to write DataSet and ResultSet to track back to experiment");
my $constraint = qq( af.feature_set_id = fs.feature_set_id AND ep.experiment_id='$exp->dbID()' ); $constraint = $self->_logic_name_to_constraint($constraint, $logic_name); return $self->SUPER::fetch_all_by_Slice_constraint($slice, $constraint); } |
sub store
{ my ($self, @pfs) = @_;
if (scalar(@pfs) == 0) {
throw('Must call store with a list of AnnotatedFeature objects');
}
my $sth = $self->prepare("
INSERT INTO annotated_feature (
seq_region_id, seq_region_start,
seq_region_end, seq_region_strand,
feature_set_id, display_label, score
) VALUES (?, ?, ?, ?, ?, ?, ?)
");
my $db = $self->db();
FEATURE: foreach my $pf (@pfs) {
if( !ref $pf || !$pf->isa('Bio::EnsEMBL::Funcgen::AnnotatedFeature') ) {
throw('Feature must be an AnnotatedFeature object');
}
if ( $pf->is_stored($db) ) {
warning('AnnotatedFeature [' . $pf->dbID() . '] is already stored in the database');
next FEATURE;
}
if ( ! $pf->analysis->is_stored($db)) {
throw('A stored Bio::EnsEMBL::Analysis must be attached to the AnnotatedFeature objects to be stored.');
}
if (! $pf->feature_set->is_stored($db)) {
throw('A stored Bio::EnsEMBL::Funcgen::FeatureSet must be attached to the AnnotatedFeature objects to be stored.');
}
if($pf->analysis->dbID() != $pf->feature_set->analysis->dbID()){
throw("AnnotatedFeature analysis(".$pf->analysis->logic_name().") does not match FeatureSet analysis(".$pf->feature_set->analysis->logic_name().")\n".
"Cannot store mixed analysis sets");
}
my $seq_region_id;
($pf, $seq_region_id) = $self->_pre_store($pf);
$sth->bind_param(1, $seq_region_id, SQL_INTEGER);
$sth->bind_param(2, $pf->start(), SQL_INTEGER);
$sth->bind_param(3, $pf->end(), SQL_INTEGER);
$sth->bind_param(4, $pf->strand(), SQL_TINYINT);
$sth->bind_param(5, $pf->feature_set->dbID(), SQL_INTEGER);
$sth->bind_param(6, $pf->display_label(), SQL_VARCHAR);
$sth->bind_param(7, $pf->score(), SQL_DOUBLE);
$sth->execute();
$pf->dbID( $sth->{'mysql_insertid'} );
$pf->adaptor($self);
}
return\@ pfs;
}
1; } |