$Bio::EnsEMBL::DBSQL::SupportingFeatureAdaptor::VERSION
=
'113.0.0'
;
@ISA
=
qw(Bio::EnsEMBL::DBSQL::BaseAdaptor)
;
sub
fetch_all_by_Exon {
my
(
$self
,
$exon
) =
@_
;
my
$out
= [];
unless
(
$exon
->dbID) {
warning(
"Cannot retrieve evidence for exon without dbID"
);
return
[];
}
my
$sth
=
$self
->prepare("SELECT sf.feature_type, sf.feature_id
FROM supporting_feature sf
WHERE exon_id = ?");
$sth
->bind_param(1,
$exon
->dbID,SQL_INTEGER);
$sth
->execute();
my
$prot_adp
=
$self
->db->get_ProteinAlignFeatureAdaptor;
my
$dna_adp
=
$self
->db->get_DnaAlignFeatureAdaptor;
my
$feature
;
while
(
my
(
$type
,
$feature_id
) =
$sth
->fetchrow){
if
(
$type
eq
'protein_align_feature'
){
$feature
=
$prot_adp
->fetch_by_dbID(
$feature_id
);
}
elsif
(
$type
eq
'dna_align_feature'
){
$feature
=
$dna_adp
->fetch_by_dbID(
$feature_id
);
}
else
{
warning(
"Unknown feature type [$type]\n"
);
}
if
(!
$feature
) {
warning(
"Supporting feature $type $feature_id does not exist in DB"
);
}
else
{
my
$new_feature
=
$feature
->transfer(
$exon
->slice());
push
@$out
,
$new_feature
if
(
$new_feature
);
}
}
$sth
->finish();
return
$out
;
}
sub
store {
my
(
$self
,
$exon_dbID
,
$aln_objs
) =
@_
;
my
$pep_check_sql
=
"SELECT protein_align_feature_id "
.
"FROM protein_align_feature "
.
"WHERE seq_region_id = ? "
.
"AND seq_region_start = ? "
.
"AND seq_region_end = ? "
.
"AND seq_region_strand = ? "
.
"AND hit_name = ? "
.
"AND hit_start = ? "
.
"AND hit_end = ? "
.
"AND analysis_id = ? "
.
"AND cigar_line = ? "
;
my
$dna_check_sql
=
"SELECT dna_align_feature_id "
.
"FROM dna_align_feature "
.
"WHERE seq_region_id = ? "
.
"AND seq_region_start = ? "
.
"AND seq_region_end = ? "
.
"AND seq_region_strand = ? "
.
"AND hit_name = ? "
.
"AND hit_start = ? "
.
"AND hit_end = ? "
.
"AND analysis_id = ? "
.
"AND cigar_line = ? "
.
"AND hit_strand = ? "
;
my
$assoc_check_sql
=
"SELECT * "
.
"FROM supporting_feature "
.
"WHERE exon_id = $exon_dbID "
.
"AND feature_type = ? "
.
"AND feature_id = ? "
;
my
$assoc_write_sql
=
"INSERT into supporting_feature "
.
"(exon_id, feature_id, feature_type) "
.
"values(?, ?, ?)"
;
my
$pep_check_sth
=
$self
->prepare(
$pep_check_sql
);
my
$dna_check_sth
=
$self
->prepare(
$dna_check_sql
);
my
$assoc_check_sth
=
$self
->prepare(
$assoc_check_sql
);
my
$sf_sth
=
$self
->prepare(
$assoc_write_sql
);
my
$dna_adaptor
=
$self
->db->get_DnaAlignFeatureAdaptor();
my
$pep_adaptor
=
$self
->db->get_ProteinAlignFeatureAdaptor();
foreach
my
$f
(
@$aln_objs
) {
if
(
$f
->slice->start != 1 ||
$f
->slice->strand != 1) {
my
$tls
=
$self
->db->get_sliceAdaptor->fetch_by_region(
$f
->slice->coord_system->name(),
$f
->slice->seq_region_name(),
undef
,
undef
,
undef
,
$f
->slice->coord_system->version());
$f
=
$f
->transfer(
$tls
);
if
(!
$f
) {
throw(
'Could not transfer Feature to slice of '
.
'entire seq_region prior to storing'
);
}
}
if
(!
$f
->isa(
"Bio::EnsEMBL::BaseAlignFeature"
)){
throw(
"$f must be an align feature otherwise"
.
"it can't be stored"
);
}
my
(
$sf_dbID
,
$type
,
$adap
,
$check_sth
);
my
@check_args
= (
$self
->db->get_SliceAdaptor->get_seq_region_id(
$f
->slice),
$f
->start,
$f
->end,
$f
->strand,
$f
->hseqname,
$f
->hstart,
$f
->hend,
$f
->analysis->dbID,
$f
->cigar_string);
if
(
$f
->isa(
"Bio::EnsEMBL::DnaDnaAlignFeature"
)){
$adap
=
$dna_adaptor
;
$check_sth
=
$dna_check_sth
;
$type
=
'dna_align_feature'
;
push
@check_args
,
$f
->hstrand;
}
elsif
(
$f
->isa(
"Bio::EnsEMBL::DnaPepAlignFeature"
)){
$adap
=
$pep_adaptor
;
$check_sth
=
$pep_check_sth
;
$type
=
'protein_align_feature'
;
}
else
{
warning(
"Supporting feature of unknown type. Skipping : [$f]\n"
);
next
;
}
$check_sth
->execute(
@check_args
);
$sf_dbID
=
$check_sth
->fetchrow_array;
if
(not
$sf_dbID
) {
$adap
->store(
$f
);
$sf_dbID
=
$f
->dbID;
}
$assoc_check_sth
->execute(
$type
,
$sf_dbID
);
if
(not
$assoc_check_sth
->fetchrow_array) {
$sf_sth
->bind_param(1,
$exon_dbID
, SQL_INTEGER);
$sf_sth
->bind_param(2,
$sf_dbID
, SQL_INTEGER);
$sf_sth
->bind_param(3,
$type
, SQL_VARCHAR);
$sf_sth
->execute();
}
}
$dna_check_sth
->finish;
$pep_check_sth
->finish;
$assoc_check_sth
->finish;
$sf_sth
->finish;
}
1;