Bio-Das-ProServer
view release on metacpan or search on metacpan
lib/Bio/Das/ProServer/SourceAdaptor/bed12.pm view on Meta::CPAN
WHERE name = ?', $self->transport()->tablename();
my $rows = $self->transport()->query( $query, $name );
return grep {
$_->{feature_id} eq $featureid
} @{ $self->_build_features_from_rows( $rows ) };
}
# Querying by group ID and not segment ID
elsif ( $groupid ) {
# Assume that the 'name' field refers to the group ID
$self->{'debug'} && carp $self->dsn.": querying by group ID $groupid";
my $query = sprintf
'SELECT chrom, chromStart, chromEnd,
name, score, strand,
blockCount, blockSizes, blockStarts
FROM %s
WHERE name = ?', $self->transport()->tablename();
my $rows = $self->transport()->query( $query, $groupid );
# Still need to check that the name field doesn't actually refer to the feature ID
return grep {
$_->{group_id} eq $groupid
} @{ $self->_build_features_from_rows( $rows ) };
}
# Querying by segment ID
elsif ( $segmentid ) {
$self->{'debug'} && carp $self->dsn.": querying by segment $segmentid:$start,$end";
my $query = sprintf
'SELECT chrom, chromStart, chromEnd,
name, score, strand,
blockCount, blockSizes, blockStarts
FROM %s
WHERE chrom = ?', $self->transport()->tablename();
my @args = ("chr$segmentid");
if ( defined $start && defined $end ) {
$query .= ' AND chromEnd >= ? AND chromStart <= ?';
push @args, $start-1, $end; # BED start position is zero-based
}
my $rows = $self->transport()->query( $query, @args );
return @{ $self->_build_features_from_rows( $rows ) };
}
# Not specified...
carp $self->dsn.': no segment ID, group ID or feature ID given';
return ();
}
sub _build_features_from_rows {
my $self = shift;
my $rows = shift;
my @features = ();
for my $row ( @{ $rows } ) {
defined $row->{'chromStart'} || next;
my $segment = $row->{'chrom'};
$segment =~ s/^chr//mxs;
# One feature line can represent several features
if ( my $block_count = $row->{'blockCount'} ) {
my @block_sizes = split m/,/mxs, $row->{'blockSizes'} , $block_count;
my @block_starts = split m/,/mxs, $row->{'blockStarts'}, $block_count;
my $i = 0;
while ($i<$block_count) {
push @features, {
'segment' => $segment,
'start' => $block_starts[$i] + $row->{'chromStart'} + 1,
'end' => $block_starts[$i] + $row->{'chromStart'} + $block_sizes[$i],
'ori' => $row->{'strand'},
'score' => $row->{'score'},
'group_id' => $row->{'name'},
'feature_id' => $row->{'name'} . q[:] . ++$i,
'type' => $row->{'name'},
'method' => 'BED conversion',
};
}
} else {
push @features, {
'segment' => $segment,
'start' => $row->{'chromStart'} + 1,
'end' => $row->{'chromEnd'},
'ori' => $row->{'strand'},
'score' => $row->{'score'},
'group_id' => $row->{'name'},
'feature_id' => $row->{'name'} . ':1',
'type' => $row->{'name'},
'method' => 'BED conversion',
};
}
}
$self->{'debug'} && printf "%s: returning %d features\n", $self->dsn, scalar @features;
return \@features;
}
1;
__END__
=head1 NAME
Bio::Das::ProServer::SourceAdaptor::bed12
=head1 VERSION
$Revision: 688 $
=head1 SYNOPSIS
Features by segment:
<host>/das/<source>/features?segment=X:1,100
Features by group ID:
<host>/das/<source>/features?group_id=TRAN1
Features by feature ID:
<host>/das/<source>/features?feature_id=TRAN1:4
=head1 DESCRIPTION
Serves up features DAS responses from BED files.
( run in 2.427 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )