sub _objs_from_sth
{ my ($self, $sth, $mapper, $dest_slice) = @_;
my @features;
my %analysis_hash;
my %slice_hash;
my %sr_name_hash;
my %sr_cs_hash;
my($dna_align_feature_id, $seq_region_id, $analysis_id, $seq_region_start,
$seq_region_end, $seq_region_strand, $hit_start, $hit_end, $hit_name,
$hit_strand, $cigar_line, $evalue, $perc_ident, $score,
$external_db_id, $hcoverage, $extra_data,
$external_db_name, $external_display_db_name);
$sth->bind_columns(\$
dna_align_feature_id,\$ seq_region_id,\$ analysis_id,\$ seq_region_start,\$
seq_region_end,\$ seq_region_strand,\$ hit_start,\$ hit_end,\$ hit_name,\$
hit_strand,\$ cigar_line,\$ evalue,\$ perc_ident,\$ score,\$
external_db_id,\$ hcoverage,\$ extra_data,\$
external_db_name,\$ external_display_db_name);
my $sa = $dest_slice ? $dest_slice->adaptor() : $self->db()->get_SliceAdaptor();;
my $aa = $self->db->get_AnalysisAdaptor();
my $dafha = $self->db->get_DnaAlignFeatureHistoryAdaptor($seq_region_id,$analysis_id,$dna_align_feature_id);
my $asm_cs;
my $cmp_cs;
my $asm_cs_vers;
my $asm_cs_name;
my $cmp_cs_vers;
my $cmp_cs_name;
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;
my $dest_slice_seq_region_id;
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();
$dest_slice_seq_region_id = $dest_slice->get_seq_region_id();
}
FEATURE: while($sth->fetch()) {
my $analysis = $analysis_hash{$analysis_id} ||=
$aa->fetch_by_dbID($analysis_id);
my $dna_align_feature_history = $dafha->fetch_by_DnaAlignFeature_info($dna_align_feature_id, $seq_region_id, $analysis_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) {
($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));
if($asm_cs == $sr_cs || ($cmp_cs != $sr_cs && $asm_cs->equals($sr_cs))) {
$slice = $slice_hash{"ID:".$seq_region_id} ||=
$sa->fetch_by_seq_region_id($seq_region_id);
} else {
$slice = $slice_hash{"ID:".$seq_region_id} ||=
$sa->fetch_by_seq_region_id($seq_region_id);
}
}
if($dest_slice) {
if($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;
}
if($seq_region_end < 1 || $seq_region_start > $dest_slice_length ||
( $dest_slice_seq_region_id ne $seq_region_id )) {
next FEATURE;
}
}
$slice = $dest_slice;
}
push( @features,
$self->_create_feature(
'Bio::EnsEMBL::Analysis::Tools::Otter::DnaAlignFeature', {
-slice => $slice,
-start => $seq_region_start,
-end => $seq_region_end,
-strand => $seq_region_strand,
-hseqname => $hit_name,
-hstart => $hit_start,
-hend => $hit_end,
-hstrand => $hit_strand,
-score => $score,
-p_value => $evalue,
-percent_id => $perc_ident,
-cigar_string => $cigar_line,
-analysis => $analysis,
-adaptor => $self,
-dbID => $dna_align_feature_id,
-external_db_id => $external_db_id,
-hcoverage => $hcoverage,
-extra_data => $extra_data ? $self->get_dumped_data($extra_data) : '',
-dbname => $external_db_name,
-db_display_name => $external_display_db_name,
-dna_align_feature_history => $dna_align_feature_history,
} ) );
}
return\@ features;
}
1; } |