Bio::Das::ProServer::SourceAdaptor::all_in_group - Bio::Das::ProServer::SourceAdaptor::all_in_group documentation


Bio-Das-ProServer documentation Contained in the Bio-Das-ProServer distribution.

Index


Code Index:

NAME

Top

Bio::Das::ProServer::SourceAdaptor::all_in_group

VERSION

Top

$LastChangedRevision: 549 $

SYNOPSIS

Top

DESCRIPTION

Top

 Returns all features in groups represented in the range.  First
 fetches all groups represented in the range, then retrieves all
 features in those groups.  Features outside the range are hacked to
 be one bp features on the edge of the range, with a style of hidden.

 All this is so that grouped DAS displays can draw group lines to
 features 'off the edge' off the display

 schema at eof

SUBROUTINES/METHODS

Top

capabilities

build_features

DIAGNOSTICS

Top

CONFIGURATION AND ENVIRONMENT

Top

DEPENDENCIES

Top

Bio::Das::ProServer::SourceAdaptor
strict
warnings
base

INCOMPATIBILITIES

Top

BUGS AND LIMITATIONS

Top

AUTHOR

Top

$Author: jws, dj3$

LICENSE AND COPYRIGHT

Top


Bio-Das-ProServer documentation Contained in the Bio-Das-ProServer distribution.

#########
# Author:        jws, dj3
# Maintainer:    $Author: zerojinx $
# Created:       2005-04-19
# Last Modified: $Date: 2008-12-03 23:35:54 +0000 (Wed, 03 Dec 2008) $
# Id:            $Id: all_in_group.pm 549 2008-12-03 23:35:54Z zerojinx $
# Source:        $Source: /nfs/team117/rmp/tmp/Bio-Das-ProServer/Bio-Das-ProServer/lib/Bio/Das/ProServer/SourceAdaptor/all_in_group.pm,v $
# $HeadURL: https://proserver.svn.sf.net/svnroot/proserver/trunk/lib/Bio/Das/ProServer/SourceAdaptor/all_in_group.pm $
#
package Bio::Das::ProServer::SourceAdaptor::all_in_group;
use strict;
use warnings;
use base qw(Bio::Das::ProServer::SourceAdaptor);
use Readonly;

our $VERSION = do { my ($v) = (q$Revision: 549 $ =~ /\d+/mxg); $v; };
Readonly::Scalar our $SHORT_SEG_LEN => 4;

sub capabilities {
  return {
	  features   => '1.0',
	  stylesheet => '1.0',
	 };
}

sub build_features {
  my ($self, $opts) = @_;
  my $seg     = $opts->{segment};
  my $start   = $opts->{start};
  my $end     = $opts->{end};
  my $dbh     = $self->transport->dbh();
  my $shortsegnamehack = (defined $self->config->{shortsegnamehack})?$self->config->{shortsegnamehack}:1; #e.g. 1 (default) or 0

  if($shortsegnamehack and (CORE::length($seg) > $SHORT_SEG_LEN)) {# speedup - only handle chromosomes or haplotypes
    return;
  }

  # To include group members that are outside the range of the request, first
  # pull back the groups that are within the range, and then retrieve all the
  # features in those groups.

  my $qbounds = q();

  if(defined $start && defined $end) {
    $qbounds = q(AND start <= ) . $dbh->quote($end) .
               q( AND end >= )  . $dbh->quote($start);
  }

  my $query   = qq(SELECT group_id FROM feature
                                      WHERE  segment = ? $qbounds);

  my @groups = @{$self->transport->query($query, $seg)};

  if(!scalar @groups) {
    return;
  }

  my $groupstring = qq( AND feature.group_id IN (@{[join q(, ), map { $dbh->quote($_->{group_id}) } @groups]}));
  $query          = qq(SELECT * FROM feature, fgroup
                                              WHERE  segment          = ? $groupstring
                                              AND    feature.group_id = fgroup.group_id
                                              ORDER BY start);
  my @results;

  for ( @{$self->transport->query($query, $seg)} ) {
    my $fstart = $_->{start};
    my $fend   = $_->{end};
    my $type   = $_->{type_id};
    my $method = $_->{method};

    #fake features outside the range - das code will filter these otherwise
    if ($fend < $start) {
      $fend = $fstart = $start;
      $type = "$method:hidden";
    }

    if ($fstart > $end) {
      $fend = $fstart = $end;
      $type = "$method:hidden";
    }

    push @results, {
		    id           => $_->{id},
		    start        => $fstart,
		    end          => $fend,
		    label        => $_->{label},
		    score        => $_->{score},
		    ori          => $_->{orient},
		    phase        => $_->{phase},
		    type         => $type,
		    typecategory => $_->{type_category},
		    method       => $method,
		    group        => $_->{group_id},
		    grouptype    => $_->{group_type},
		    grouplabel   => $_->{group_label},
		    groupnote    => $_->{group_note},
		    grouplink    => $_->{group_link_url},
		    grouplinktxt => $_->{group_link_text},
		    target_start => $_->{target_start},
		    target_stop  => $_->{target_end},
		    target_id    => $_->{target_id},
		    link         => $_->{link_url},
		    linktxt      => $_->{link_text},
		    note         => $_->{note},
		   };
  }

  return @results;
}

1;

# SCHEMA
# Generic MySQL schema to hold DAS feature data for ProServer
#
#	feature
#		id		varchar(30)
#		label		varchar(30)
#		segment		varchar(30)
#		start		int(11)
#		end		int(11)
#		score		float
#		orient		enum('0', '+', '-')
#		phase		enum('0','1','2')
#		type_id		varchar(30)
#		type_category	varchar(30)
#		method		varchar(30)
#		group_id	varchar(30)
#		target_id	varchar(30)
#		target_start	int(11)
#		target_end	int(11)
#		link_url	varchar(255)
#		link_text	varchar(30)
#		note		text
#
#	fgroup
#		group_id	varchar(30)
#		group_label	varchar(30)
#		group_type	varchar(30)
#		group_note	text
#		group_link_url	varchar(255)
#		group_link_text	varchar(30)
#
#	Note that spec allows multiple groups, targets, and links per feature,
#	but these aren't implemented here.
#

__END__