Bio-EnsEMBL
view release on metacpan or search on metacpan
lib/Bio/EnsEMBL/DBSQL/SliceAdaptor.pm view on Meta::CPAN
sub fetch_by_transcript_id {
my ($self,$transcriptid,$size) = @_;
throw('Transcript id argument is required.') if(!$transcriptid);
my $transcript_adaptor = $self->db()->get_TranscriptAdaptor();
my $transcript = $transcript_adaptor->fetch_by_dbID($transcriptid);
throw("Transcript [$transcriptid] does not exist in DB.") if(!$transcript);
return $self->fetch_by_Feature($transcript, $size);
}
=head2 fetch_by_gene_stable_id
Arg [1] : string $geneid
The stable id of the gene 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 gene (0 by default)
Example : $slc = $sa->fetch_by_gene_stable_id('ENSG00000012123',10);
Description: Creates a slice around the region of the specified gene.
If a context size is given, the slice is extended by that
number of basepairs on either side of the gene.
The slice will be created in the gene's native coordinate system
and in the forward orientation.
Returntype : Bio::EnsEMBL::Slice
Exceptions : throw on incorrect args
throw if transcript does not exist
Caller : general
Status : Stable
=cut
sub fetch_by_gene_stable_id {
my ($self,$geneid,$size) = @_;
throw('Gene argument is required.') if(!$geneid);
my $gene_adaptor = $self->db->get_GeneAdaptor();
my $gene = $gene_adaptor->fetch_by_stable_id($geneid);
throw("Gene [$geneid] does not exist in DB.") if(!$gene);
return $self->fetch_by_Feature($gene, $size);
}
=head2 fetch_by_Feature
Arg [1] : Bio::EnsEMBL::Feature $feat
The feature to fetch the slice around
Arg [2] : int size (optional)
The desired number of flanking basepairs around the feature.
The size may also be provided as a percentage of the feature
size such as 200% or 80.5%.
Example : $slice = $slice_adaptor->fetch_by_Feature($feat, 100);
Description: Retrieves a slice around a specific feature. All this really
does is return a resized version of the slice that the feature
is already on. Note that slices returned from this method
are always on the forward strand of the seq_region regardless of
the strandedness of the feature passed in.
Returntype : Bio::EnsEMBL::Slice
Exceptions : throw if the feature does not have an attached slice
throw if feature argument is not provided
Caller : fetch_by_gene_stable_id, fetch_by_transcript_stable_id,
fetch_by_gene_id, fetch_by_transcript_id
Status : Stable
=cut
sub fetch_by_Feature{
my ($self, $feature, $size) = @_;
$size ||= 0;
if(!ref($feature) || !$feature->isa('Bio::EnsEMBL::Feature')) {
throw('Feature argument expected.');
}
my $slice = $feature->slice();
if(!$slice || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice') )) {
throw('Feature must be attached to a valid slice.');
}
my $fstart = $feature->start();
my $fend = $feature->end();
if(!defined($fstart) || !defined($fend)) {
throw('Feature must have defined start and end.');
}
#convert the feature slice coordinates to seq_region coordinates
my $slice_start = $slice->start();
my $slice_end = $slice->end();
my $slice_strand = $slice->strand();
if($slice_start != 1 || $slice_strand != 1) {
if($slice_strand == 1) {
$fstart = $fstart + $slice_start - 1;
$fend = $fend + $slice_start - 1;
} else {
my $tmp_start = $fstart;
$fstart = $slice_end - $fend + 1;
$fend = $slice_end - $tmp_start + 1;
}
}
## Size may be stored as a %age of the length of the feature
## Size = 100% gives no context
## Size = 200% gives context - 50% the size of the feature either side of
## feature
$size = int( ($1-100)/200 * ($fend-$fstart+1) ) if( $size =~/([\d+\.]+)%/ );
#return a new slice covering the region of the feature
( run in 2.494 seconds using v1.01-cache-2.11-cpan-f56aa216473 )