package EnsEMBL::Web::Text::Feature::GFF; use strict; use warnings; no warnings 'uninitialized'; use base qw(EnsEMBL::Web::Text::Feature); sub new { my( $class, $hash_ref ) = @_; my $extra = {}; if( $hash_ref->[16] =~ /=/ ) { my @T = split /;\s*/, $hash_ref->[16]; foreach (@T) { if( /=/ ) { my($k,$v)= split /=/, $_, 2; $k =~ s/^\s+//; $k =~ s/\s+$//; $v =~ s/^\s+//; $v =~ s/\s+$//; $v =~ s/^"([^"]+)"$/$1/; push @{$extra->{$k}},$v; $extra->{'_type'} = ['transcript'] if $k eq 'transcript_id'; $extra->{'_type'} = ['prediction_transcript'] if $k eq 'genscan'; $extra->{'_type'} = ['alignment'] if $k eq 'hid'; } else { push @{$extra->{'notes'}},$_; } } } $extra->{'source'} = [ $hash_ref->[2] ]; $extra->{'feature_type'} = [ $hash_ref->[4] ]; $extra->{'frame'} = [ $hash_ref->[14]]; return bless { '__raw__' => $hash_ref, '__extra__' => $extra }, $class; } sub _seqname { my $self = shift; return $self->{'__raw__'}[0]; } sub strand { my $self = shift; return $self->_strand( $self->{'__raw__'}[12] ); } sub rawstart { my $self = shift; return $self->{'__raw__'}[6]; } sub rawend { my $self = shift; return $self->{'__raw__'}[8]; } sub id { my $self = shift; # use Data::Dumper; local $Data::Dumper::Indent = 0; warn Dumper($self->{'__extra__'}); return $self->{'__extra__'}{'transcript_id'} ? $self->{'__extra__'}{'transcript_id'}[0] : $self->{'__extra__'}{'genscan' } ? $self->{'__extra__'}{'genscan'}[0] : $self->{'__extra__'}{'hid' } ? $self->{'__extra__'}{'hid'}[0] : $self->{'__raw__'}[16] ? $self->{'__raw__'}[16] : $self->{'__raw__'}[4] ; } sub hstart { my $self = shift; return $self->{'__extra__'}{'hstart'} ? $self->{'__extra__'}{'hstart'}[0] : undef ; } sub hend { my $self = shift; return $self->{'__extra__'}{'hend'} ? $self->{'__extra__'}{'hend'}[0] : undef ; } sub hstrand { my $self = shift; return $self->{'__extra__'}{'hstrand'} ? $self->{'__extra__'}{'hstrand'}[0] : undef ; } sub slide { my $self = shift; my $offset = shift; $self->{'start'} = $self->{'__raw__'}[6]+ $offset; $self->{'end'} = $self->{'__raw__'}[8]+ $offset; } sub cigar_string { my $self = shift; return $self->{'_cigar'}||=($self->{'__raw__'}[8]-$self->{'__raw__'}[6]+1)."M"; } sub extra_data { my $self = shift; my @skip = $self->{__extra__}{'transcript_id'} ? qw(transcript_id) : $self->{__extra__}{'genscan'} ? qw(genscan) : $self->{__extra__}{'hid'} ? qw(hid) : () ; push @skip,qw(hstart hend hstrand); my %skip = map {($_,1)} @skip; my %extra = map { $skip{$_}?():($_,$self->{__extra__}{$_}) } keys %{$self->{__extra__}||{}}; return \%extra; } 1;