diff --git a/modules/Bio/EnsEMBL/DBSQL/SliceAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/SliceAdaptor.pm index d60da8a320cfb5dc3c071bee732976a721ce9bf6..a76b9dcef9a5f49fafe52a143e2dba616cb0a781 100644 --- a/modules/Bio/EnsEMBL/DBSQL/SliceAdaptor.pm +++ b/modules/Bio/EnsEMBL/DBSQL/SliceAdaptor.pm @@ -647,6 +647,36 @@ sub deleteObj { +=head2 fetch_by_band + + Title : fetch_by_band + Usage : + Function: create a Slice representing a series of bands + Example : + Returns : + Args : the band name + +=cut + +sub fetch_by_band { + my ($self,$band) = @_; + + my $sth = $self->db->prepare + ("select s.name,max(k.seq_region_id)-min(k.seq_region_id, min(k.seq_region_start), max(k.seq_region_id) " . + "from karyotype as k " . + "where k.band like ? and k.seq_region_id = s.seq_region_id"); + + $sth->execute( "$band%" ); + my ( $seq_region_name, $discrepancy, $seq_region_start, $seq_region_end) = $sth->fetchrow_array; + + if($seq_region_name && $discrepancy>0) { + throw("Band maps to multiple seq_regions"); + } else { + return $self->fetch_by_region('toplevel',$seq_region_name,$seq_region_start,$seq_region_end); + } + throw("Band not recognised in database"); +} + =head2 fetch_by_chr_band Title : fetch_by_chr_band @@ -661,12 +691,12 @@ sub deleteObj { sub fetch_by_chr_band { my ($self,$chr,$band) = @_; - my $chr_slice = $self->fetch_by_region('chromosome', $chr); + my $chr_slice = $self->fetch_by_region('toplevel', $chr); my $seq_region_id = $self->get_seq_region_id($chr_slice); my $sth = $self->db->prepare - ("select min(k.chr_start), max(k.chr_end) " . + ("select min(k.seq_region_start), max(k.seq_region_end) " . "from karyotype as k " . "where k.seq_region_id = ? and k.band like ?"); @@ -674,7 +704,7 @@ sub fetch_by_chr_band { my ( $slice_start, $slice_end) = $sth->fetchrow_array; if(defined $slice_start) { - return $self->fetch_by_region('chromosome',$chr,$slice_start,$slice_end); + return $self->fetch_by_region('toplevel',$chr,$slice_start,$slice_end); } throw("Band not recognised in database"); @@ -682,6 +712,38 @@ sub fetch_by_chr_band { +=head2 fetch_by_exon_stable_id + + Arg [1] : string $exonid + The stable id of the exon around which the slice is + desired + Arg [2] : (optional) int $size + The length of the flanking regions the slice should encompass + on either side of the exon (0 by default) + Example : $slc = $sa->fetch_by_exon_stable_id('ENSE00000302930',10); + Description: Creates a slice around the region of the specified exon. + If a context size is given, the slice is extended by that + number of basepairs on either side of the + transcript. + Returntype : Bio::EnsEMBL::Slice + Exceptions : Thrown if the exon is not in the database. + Caller : general + +=cut + +sub fetch_by_exon_stable_id{ + my ($self,$exonid,$size) = @_; + + throw('Exon argument is required.') if(!$exonid); + + my $ea = $self->db->get_ExonAdaptor; + my $exon = $ea->fetch_by_stable_id($exonid); + + throw("Exon [$exonid] does not exist in DB.") if(!$exon); + + return $self->fetch_by_Feature($exon, $size); +} + =head2 fetch_by_transcript_stable_id Arg [1] : string $transcriptid @@ -912,7 +974,6 @@ sub fetch_by_misc_feature_attribute { return $self->fetch_by_Feature($feat, $size); } - =head2 fetch_normalized_slice_projection Arg [1] : Bio::EnsEMBL::Slice $slice