package Bio::DB::Sam::Segment;
use strict;
sub new {
my $class = shift;
my ($db,$seqid,$start,$end) = @_;
return bless {
db => $db,
seqid => $seqid,
start => $start,
end => $end},ref $class || $class;
}
sub db { shift->{db} };
sub features {
my $self = shift;
my $db = $self->db;
my @args;
if (@_ && $_[0] !~ /^-/) { # type list
@args = (-types=>\@_);
} else {
@args = @_;
}
return $db->features(-seq_id => $self->seq_id,
-start => $self->start,
-end => $self->end,
@args);
}
#required by GBrowse1
sub get_feature_stream {
my $self = shift;
my @args = @_;
my @features = $self->features(@args);
return Bio::DB::Sam::Segment::Iterator->new(\@features);
}
# required by api
sub seq_id { shift->{seqid} };
# required by GBrowse1
*ref = *abs_ref = *sourceseq = \&seq_id;
# required by api
sub start { shift->{start} };
# required by api
sub end { shift->{end} };
# required by api
sub strand { 0 };
# required by api
sub length {
my $self = shift;
return $self->end - $self->start + 1;
}
# required by api
sub seq {
my $self = shift;
return Bio::PrimarySeq->new(-seq => $self->dna,
-id => $self->seq_id);
}
sub primary_id {
shift->seq_id;
}
# required by api
sub primary_tag {
my $self = shift;
return 'region';
}
sub dna {
my $self = shift;
my $db = $self->db;
$db->seq($self->seq_id,$self->start,$self->end);
}
# required by api
sub source_tag { return 'sam/bam' }
# required by api
sub name { shift->seq_id }
# required by api
sub display_name { shift->seq_id }
# required by api
sub factory { shift->db }
# required by api
sub get_SeqFeatures { return; }
# required by api
sub method { shift->primary_tag }
# required by GBrowse1
sub type { shift->primary_tag }
# required by api
sub get_tag_values { return; }
# required by api
sub score { return; }
# required by api
sub class { 'sequence' }
package Bio::DB::Sam::Segment::Iterator;
sub new {
my $package = shift;
my $features = shift;
return bless $features,$package;
}
sub next_seq {
my $self = shift;
return unless @$self;
my $next_feature = shift @$self;
return $next_feature;
}
1;