Commit 3693a3cb authored by Alessandro Vullo's avatar Alessandro Vullo
Browse files

Debugged handling of negative strand slices on circular chromosomes

parent ea7bbdf6
......@@ -646,6 +646,8 @@ FEATURE: while ( $sth->fetch() ) {
# If a destination slice was provided convert the coords.
#
if ( defined($dest_slice) ) {
my $seq_region_len = $dest_slice->seq_region_length();
if ( $dest_slice_strand == 1 ) {
# On the positive strand.
......@@ -685,58 +687,63 @@ FEATURE: while ( $sth->fetch() ) {
} else {
# On the negative strand.
if ( $seq_region_start > $seq_region_end && $dest_slice->is_circular() )
{
# Handle circular chromosomes.
my $start = $dest_slice_end - $seq_region_end + 1;
my $end = $dest_slice_end - $seq_region_start + 1;
if ( $dest_slice_start > $dest_slice_end ) {
my $tmp_seq_region_start = $seq_region_start;
$seq_region_start = $dest_slice_end - $seq_region_end + 1;
$seq_region_end =
$dest_slice_end +
$dest_slice->seq_region_length() -
$tmp_seq_region_start + 1;
} else {
if ($dest_slice->is_circular()) {
if ( $seq_region_end > $dest_slice_start ) {
# Looking at the region in the beginning of the
# chromosome.
$seq_region_start = $dest_slice_end - $seq_region_end + 1;
$seq_region_end =
$seq_region_end -
$dest_slice->seq_region_length() -
$dest_slice_start + 1;
} else {
my $tmp_seq_region_start = $seq_region_start;
$seq_region_start =
$dest_slice_end -
$seq_region_end -
$dest_slice->seq_region_length() + 1;
$seq_region_end =
$dest_slice_end - $tmp_seq_region_start + 1;
}
if ($dest_slice_start > $dest_slice_end) {
# slice spans origin or replication
}
if ($seq_region_start >= $dest_slice_start) {
$end += $seq_region_len;
$start += $seq_region_len
if $seq_region_end > $dest_slice_start;
} else {
# Non-circular chromosome.
} elsif ($seq_region_start <= $dest_slice_end) {
# do nothing
} elsif ($seq_region_end >= $dest_slice_start) {
$start += $seq_region_len;
$end += $seq_region_len;
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;
}
} elsif ($seq_region_end <= $dest_slice_end) {
$seq_region_strand = -$seq_region_strand;
$end += $seq_region_len
if $end < 0;
} ## end else [ if ( $dest_slice_strand...)]
} elsif ($seq_region_start > $seq_region_end) {
$end += $seq_region_len;
# Throw away features off the end of the requested slice.
if ( $seq_region_end < 1
|| $seq_region_start > $dest_slice_length
|| ( $dest_slice_sr_id != $seq_region_id ) )
{
next FEATURE;
}
} else {
}
} else {
if ($seq_region_start <= $dest_slice_end and $seq_region_end >= $dest_slice_start) {
# do nothing
} 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;
} else {
}
}
}
}
$seq_region_start = $start;
$seq_region_end = $end;
$seq_region_strand *= -1;
} ## end else [ if ( $dest_slice_strand...)]
$slice = $dest_slice;
} ## end if ( defined($dest_slice...))
......
......@@ -1607,9 +1607,10 @@ FEATURE: while ($sth->fetch()) {
# If a destination slice was provided convert the coords.
#
if (defined($dest_slice)) {
if ($dest_slice_strand == 1) {
# Positive strand.
my $seq_region_len = $dest_slice->seq_region_length();
if ($dest_slice_strand == 1) { # Positive strand
$seq_region_start = $seq_region_start - $dest_slice_start + 1;
$seq_region_end = $seq_region_end - $dest_slice_start + 1;
......@@ -1620,13 +1621,14 @@ FEATURE: while ($sth->fetch()) {
# Looking at a feature overlapping the chromsome origin.
if ($seq_region_end > $dest_slice_start) {
# Looking at the region in the beginning of the
# chromosome.
$seq_region_start -= $dest_slice->seq_region_length();
$seq_region_start -= $seq_region_len;
}
if ($seq_region_end < 0) {
$seq_region_end += $dest_slice->seq_region_length();
$seq_region_end += $seq_region_len;
}
} else {
......@@ -1637,53 +1639,72 @@ FEATURE: while ($sth->fetch()) {
# Looking at the region overlapping the chromosome
# origin and a feature which is at the beginning of the
# chromosome.
$seq_region_start += $dest_slice->seq_region_length();
$seq_region_end += $dest_slice->seq_region_length();
$seq_region_start += $seq_region_len;
$seq_region_end += $seq_region_len;
}
}
} ## end if ($dest_slice->is_circular...)
} else {
# Negative strand.
} else { # Negative strand
if ( $dest_slice->is_circular()
&& $seq_region_start > $seq_region_end)
{
# Handle cicular chromosomes.
my $start = $dest_slice_end - $seq_region_end + 1;
my $end = $dest_slice_end - $seq_region_start + 1;
if ($seq_region_end > $dest_slice_start) {
# Looking at the region in the beginning of the
# chromosome.
$seq_region_start = $dest_slice_end - $seq_region_end + 1;
$seq_region_end = $seq_region_end - $dest_slice->seq_region_length - $dest_slice_start + 1;
} else {
my $tmp_seq_region_start = $seq_region_start;
$seq_region_start = $dest_slice_end - $seq_region_end - $dest_slice->seq_region_length + 1;
$seq_region_end = $dest_slice_end - $tmp_seq_region_start + 1;
}
if ($dest_slice->is_circular()) {
} else {
# Non-circular chromosome.
if ($dest_slice_start > $dest_slice_end) {
# slice spans origin or replication
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) {
# do nothing
} 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;
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;
} else {
}
} else {
$seq_region_strand = -$seq_region_strand;
if ($seq_region_start <= $dest_slice_end and $seq_region_end >= $dest_slice_start) {
# do nothing
} elsif ($seq_region_start > $seq_region_end) {
if ($seq_region_start <= $dest_slice_end) {
$start -= $seq_region_len;
} ## end else [ if ($dest_slice_strand...)]
} elsif ($seq_region_end >= $dest_slice_start) {
$end += $seq_region_len;
} else {
}
}
}
# Throw away features off the end of the requested slice or on
# different seq_region.
}
if ( $seq_region_end < 1
|| $seq_region_start > $dest_slice_length
|| ($dest_slice_sr_id ne $seq_region_id))
{
next FEATURE;
}
$seq_region_start = $start;
$seq_region_end = $end;
$seq_region_strand *= -1;
} ## end else [ if ($dest_slice_strand...)]
$slice = $dest_slice;
} ## end if (defined($dest_slice...))
......
......@@ -1606,6 +1606,8 @@ sub _objs_from_sth {
# If a destination slice was provided convert the coords.
#
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;
......@@ -1633,42 +1635,63 @@ sub _objs_from_sth {
}
}
} else {
if ( $dest_slice->is_circular()
&& $seq_region_start > $seq_region_end )
{
if ( $seq_region_end > $dest_slice_start ) {
# Looking at the region in the beginning of the chromosome.
$seq_region_start = $dest_slice_end - $seq_region_end + 1;
$seq_region_end =
$seq_region_end -
$dest_slice->seq_region_length() -
$dest_slice_start + 1;
} else {
my $tmp_seq_region_start = $seq_region_start;
$seq_region_start =
$dest_slice_end -
$seq_region_end -
$dest_slice->seq_region_length() + 1;
$seq_region_end =
$dest_slice_end - $tmp_seq_region_start + 1;
}
my $start = $dest_slice_end - $seq_region_end + 1;
my $end = $dest_slice_end - $seq_region_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;
}
if ($dest_slice->is_circular()) {
$seq_region_strand = -$seq_region_strand;
} ## end else [ if ( $dest_slice_strand...)]
if ($dest_slice_start > $dest_slice_end) {
# slice spans origin or replication
# Throw away features off the end of the requested slice
if ( $seq_region_end < 1
|| $seq_region_start > $dest_slice_length
|| ( $dest_slice_sr_id ne $seq_region_id ) )
{
next FEATURE;
}
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) {
# do nothing
} 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 {
}
} else {
if ($seq_region_start <= $dest_slice_end and $seq_region_end >= $dest_slice_start) {
# do nothing
} 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;
} else {
}
}
}
}
$seq_region_start = $start;
$seq_region_end = $end;
$seq_region_strand *= -1;
} ## end else [ if ( $dest_slice_strand...)]
$slice = $dest_slice;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment