$Bio::EnsEMBL::DBSQL::RepeatFeatureAdaptor::VERSION
=
'112.0.0_58'
;
$Bio::EnsEMBL::DBSQL::RepeatFeatureAdaptor::VERSION
=
'112.0.058'
;
@ISA
=
qw(Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor)
;
sub
fetch_all_by_Slice {
my
$self
=
shift
;
my
$slice
=
shift
;
my
$logic_name
=
shift
;
my
$repeat_type
=
shift
;
my
$constraint
=
''
;
$self
->_straight_join(1);
if
(
$repeat_type
) {
my
$rta
= wrap_array(
$repeat_type
);
if
(
scalar
(@{
$rta
}) > 1) {
$constraint
.=
sprintf
(
'rc.repeat_type IN (%s)'
,
join
(
q{,}
,
map
{
"'${_}'"
} @{
$rta
}));
}
else
{
$constraint
.=
"rc.repeat_type = '${repeat_type}'"
;
}
}
my
$result
=
$self
->fetch_all_by_Slice_constraint(
$slice
,
$constraint
,
$logic_name
);
$self
->_straight_join(0);
return
$result
;
}
sub
_tables {
my
$self
=
shift
;
return
([
'repeat_feature'
,
'r'
], [
'repeat_consensus'
,
'rc'
]);
}
sub
_columns {
my
$self
=
shift
;
return
qw (r.repeat_feature_id
r.seq_region_id
r.seq_region_start
r.seq_region_end
r.seq_region_strand
r.repeat_consensus_id
r.repeat_start
r.repeat_end
r.analysis_id
r.score
rc.repeat_name
rc.repeat_class
rc.repeat_type
rc.repeat_consensus);
}
sub
_default_where_clause {
my
$self
=
shift
;
return
'r.repeat_consensus_id = rc.repeat_consensus_id'
;
}
sub
_objs_from_sth {
my
(
$self
,
$sth
,
$mapper
,
$dest_slice
) =
@_
;
my
$rca
=
$self
->db()->get_RepeatConsensusAdaptor();
my
$sa
=
$self
->db()->get_SliceAdaptor();
my
$aa
=
$self
->db()->get_AnalysisAdaptor();
my
@features
;
my
%rc_hash
;
my
%analysis_hash
;
my
%slice_hash
;
my
%sr_name_hash
;
my
%sr_cs_hash
;
my
(
$repeat_feature_id
,
$seq_region_id
,
$seq_region_start
,
$seq_region_end
,
$seq_region_strand
,
$repeat_consensus_id
,
$repeat_start
,
$repeat_end
,
$analysis_id
,
$score
,
$repeat_name
,
$repeat_class
,
$repeat_type
,
$repeat_consensus
);
$sth
->bind_columns( \
$repeat_feature_id
, \
$seq_region_id
, \
$seq_region_start
,
\
$seq_region_end
, \
$seq_region_strand
,
\
$repeat_consensus_id
, \
$repeat_start
,\
$repeat_end
,
\
$analysis_id
, \
$score
, \
$repeat_name
, \
$repeat_class
,
\
$repeat_type
, \
$repeat_consensus
);
my
$dest_slice_start
;
my
$dest_slice_end
;
my
$dest_slice_strand
;
my
$dest_slice_length
;
my
$dest_slice_cs
;
my
$dest_slice_sr_name
;
my
$dest_slice_sr_id
;
my
$asma
;
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_cs
=
$dest_slice
->coord_system();
$dest_slice_sr_name
=
$dest_slice
->seq_region_name();
$dest_slice_sr_id
=
$dest_slice
->get_seq_region_id();
$asma
=
$self
->db->get_AssemblyMapperAdaptor();
}
FEATURE:
while
(
$sth
->fetch()) {
my
$rc
=
$rc_hash
{
$repeat_consensus_id
} ||=
Bio::EnsEMBL::RepeatConsensus->new_fast
({
'dbID'
=>
$repeat_consensus_id
,
'adaptor'
=>
$rca
,
'name'
=>
$repeat_name
,
'repeat_class'
=>
$repeat_class
,
'repeat_type'
=>
$repeat_type
,
'repeat_consensus'
=>
$repeat_consensus
,
'length'
=>
length
(
$repeat_consensus
)});
my
$analysis
=
$analysis_hash
{
$analysis_id
} ||=
$aa
->fetch_by_dbID(
$analysis_id
);
$analysis_hash
{
$analysis_id
} =
$analysis
;
$seq_region_id
=
$self
->get_seq_region_id_internal(
$seq_region_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();
}
if
(!
$mapper
&&
$dest_slice
&& !
$dest_slice_cs
->equals(
$slice
->coord_system)) {
$mapper
=
$asma
->fetch_by_CoordSystems(
$dest_slice_cs
,
$slice
->coord_system);
}
my
$sr_name
=
$sr_name_hash
{
$seq_region_id
};
my
$sr_cs
=
$sr_cs_hash
{
$seq_region_id
};
if
(
$mapper
) {
if
(
defined
$dest_slice
&&
$mapper
->isa(
'Bio::EnsEMBL::ChainedAssemblyMapper'
) ) {
(
$seq_region_id
,
$seq_region_start
,
$seq_region_end
,
$seq_region_strand
) =
$mapper
->
map
(
$sr_name
,
$seq_region_start
,
$seq_region_end
,
$seq_region_strand
,
$sr_cs
, 1,
$dest_slice
);
}
else
{
(
$seq_region_id
,
$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
(
$seq_region_id
));
$slice
=
$slice_hash
{
"ID:"
.
$seq_region_id
} ||=
$sa
->fetch_by_seq_region_id(
$seq_region_id
);
}
if
(
defined
(
$dest_slice
)) {
my
$seq_region_len
=
$dest_slice
->seq_region_length();
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;
if
(
$dest_slice
->is_circular ) {
if
(
$seq_region_start
>
$seq_region_end
) {
if
(
$seq_region_end
>
$dest_slice_start
) {
$seq_region_start
-=
$seq_region_len
;
}
if
(
$seq_region_end
< 0 ) {
$seq_region_end
+=
$seq_region_len
;
}
}
else
{
if
(
$dest_slice_start
>
$dest_slice_end
&&
$seq_region_end
< 0) {
$seq_region_start
+=
$seq_region_len
;
$seq_region_end
+=
$seq_region_len
;
}
}
}
}
else
{
my
$start
=
$dest_slice_end
-
$seq_region_end
+ 1;
my
$end
=
$dest_slice_end
-
$seq_region_start
+ 1;
if
(
$dest_slice
->is_circular()) {
if
(
$dest_slice_start
>
$dest_slice_end
) {
if
(
$seq_region_start
>=
$dest_slice_start
) {
$end
+=
$seq_region_len
;
$start
+=
$seq_region_len
if
$seq_region_end
>
$dest_slice_start
;
}
elsif
(
$seq_region_start
<=
$dest_slice_end
) {
}
elsif
(
$seq_region_end
>=
$dest_slice_start
) {
$start
+=
$seq_region_len
;
$end
+=
$seq_region_len
;
}
elsif
(
$seq_region_end
<=
$dest_slice_end
) {
$end
+=
$seq_region_len
if
$end
< 0;
}
elsif
(
$seq_region_start
>
$seq_region_end
) {
$end
+=
$seq_region_len
;
}
}
else
{
if
(
$seq_region_start
<=
$dest_slice_end
and
$seq_region_end
>=
$dest_slice_start
) {
}
elsif
(
$seq_region_start
>
$seq_region_end
) {
if
(
$seq_region_start
<=
$dest_slice_end
) {
$start
-=
$seq_region_len
;
}
elsif
(
$seq_region_end
>=
$dest_slice_start
) {
$end
+=
$seq_region_len
;
}
}
}
}
$seq_region_start
=
$start
;
$seq_region_end
=
$end
;
$seq_region_strand
*= -1;
}
if
(
$seq_region_end
< 1
||
$seq_region_start
>
$dest_slice_length
|| (
$dest_slice_sr_id
!=
$seq_region_id
)) {
next
FEATURE;
}
$slice
=
$dest_slice
;
}
push
(
@features
,
$self
->_create_feature_fast(
'Bio::EnsEMBL::RepeatFeature'
, {
'dbID'
=>
$repeat_feature_id
,
'analysis'
=>
$analysis
,
'start'
=>
$seq_region_start
,
'end'
=>
$seq_region_end
,
'strand'
=>
$seq_region_strand
,
'score'
=>
$score
,
'hstart'
=>
$repeat_start
,
'hend'
=>
$repeat_end
,
'repeat_consensus'
=>
$rc
,
'adaptor'
=>
$self
,
'slice'
=>
$slice
} ) );
}
return
\
@features
;
}
sub
store {
my
(
$self
,
@repeats
) =
@_
;
my
$db
=
$self
->db();
my
$rca
=
$db
->get_RepeatConsensusAdaptor();
my
$sa
=
$db
->get_SliceAdaptor();
my
(
$cons
,
$db_id
);
my
$sth
=
$self
->prepare(
qq{
INSERT into repeat_feature( repeat_feature_id
, seq_region_id
, seq_region_start
, seq_region_end
, seq_region_strand
, repeat_consensus_id
, repeat_start
, repeat_end
, score
, analysis_id )
VALUES(NULL, ?,?,?,?,?,?,?,?,?)
}
);
FEATURE:
foreach
my
$rf
(
@repeats
) {
if
(!
ref
(
$rf
) || !
$rf
->isa(
'Bio::EnsEMBL::RepeatFeature'
)) {
throw(
'Expected RepeatFeature argument not ['
.
ref
(
$rf
) .
'].'
);
}
if
(
$rf
->is_stored(
$db
)) {
warning(
"RepeatFeature ["
.
$rf
->dbID.
"] is already stored in this DB."
);
next
FEATURE;
}
my
$cons
=
$rf
->repeat_consensus();
throw(
"Must have a RepeatConsensus attached"
)
if
(!
defined
(
$cons
));
if
(
$cons
->repeat_class eq
'trf'
) {
my
@match
= @{
$rca
->fetch_all_by_class_seq(
'trf'
,
$cons
->repeat_consensus)};
if
(
@match
) {
$cons
->dbID(
$match
[0]->dbID());
}
else
{
$rca
->store(
$cons
);
}
}
elsif
(
$cons
->repeat_class eq
'Simple_repeat'
) {
my
$rcon
=
$cons
->name;
$rcon
=~ s/\((\S+)\)n/$1/;
$cons
->repeat_consensus(
$rcon
);
my
$match
=
$rca
->fetch_by_name_class(
$cons
->name,
'Simple_repeat'
);
if
(
$match
) {
$cons
->dbID(
$match
->dbID());
}
else
{
$rca
->store(
$cons
);
}
}
else
{
if
(!
$cons
->dbID) {
my
$match
= (
$rca
->fetch_by_name(
$cons
->name));
if
(
$match
) {
$cons
->dbID(
$match
->dbID());
}
else
{
warning(
"Can't find "
.
$cons
->name .
"\n"
);
$cons
->repeat_consensus(
"N"
);
$rca
->store(
$cons
);
}
}
}
my
$slice
=
$rf
->slice();
if
(!
ref
(
$slice
) || !(
$slice
->isa(
"Bio::EnsEMBL::Slice"
) or
$slice
->isa(
'Bio::EnsEMBL::LRGSlice'
))) {
throw(
"RepeatFeature cannot be stored without an associated slice."
);
}
if
(!
$rf
->analysis->is_stored(
$db
)) {
$db
->get_AnalysisAdaptor->store(
$rf
->analysis());
}
my
$original
=
$rf
;
my
$seq_region_id
;
(
$rf
,
$seq_region_id
) =
$self
->_pre_store(
$rf
);
$sth
->bind_param(1,
$seq_region_id
,SQL_INTEGER);
$sth
->bind_param(2,
$rf
->start,SQL_INTEGER);
$sth
->bind_param(3,
$rf
->end,SQL_INTEGER);
$sth
->bind_param(4,
$rf
->strand,SQL_TINYINT);
$sth
->bind_param(5,
$rf
->repeat_consensus->dbID,SQL_INTEGER);
$sth
->bind_param(6,
$rf
->hstart,SQL_INTEGER);
$sth
->bind_param(7,
$rf
->hend,SQL_INTEGER);
$sth
->bind_param(8,
$rf
->score,SQL_DOUBLE);
$sth
->bind_param(9,
$rf
->analysis->dbID,SQL_INTEGER);
$sth
->execute();
my
$db_id
=
$self
->last_insert_id(
'repeat_feature_id'
,
undef
,
'repeat_feature'
)
or throw(
"Didn't get an insertid from the INSERT statement"
);
$original
->dbID(
$db_id
);
$original
->adaptor(
$self
);
}
}
sub
list_dbIDs {
my
(
$self
,
$ordered
) =
@_
;
return
$self
->_list_dbIDs(
"repeat_feature"
,
undef
,
$ordered
);
}
1;