sub parse_next_gene
{ my ($self,$return_gene) = @_;
return $self->_parse_gene_struct if $return_gene;
my $seensegment = 0;
my @features;
my ($qstrand,$hstrand) = (1,1);
my $lasthseqname;
while( defined($_ = $self->_readline) ) {
if( /Note Best alignment is between (reversed|forward) est and (reversed|forward) genome, (but|and) splice\s+sites imply\s+(forward gene|REVERSED GENE)/) {
if( $seensegment ) {
$self->_pushback($_);
return wantarray ? @features :\@ features;
}
$hstrand = -1 if $1 eq 'reversed';
$qstrand = -1 if $4 eq 'REVERSED GENE';
}
elsif( /^Exon/ ) {
my ($name,$len,$score,$qstart,$qend,$qseqname,
$hstart,$hend, $hseqname) = split;
$lasthseqname = $hseqname;
my $query = new Bio::SeqFeature::Similarity(-primary => $name,
-source => $self->analysis_method,
-seq_id => $qseqname, -start => $qstart,
-end => $qend,
-strand => $qstrand,
-score => $score,
-tag => {
'Sequence' => "$hseqname",
}
);
my $hit = new Bio::SeqFeature::Similarity(-primary => 'exon_hit',
-source => $self->analysis_method,
-seq_id => $hseqname,
-start => $hstart,
-end => $hend,
-strand => $hstrand,
-score => $score,
-tag => {
'Sequence' => "$qseqname",
}
);
push @features, new Bio::SeqFeature::SimilarityPair
(-query => $query,
-hit => $hit,
-source => $self->analysis_method);
} elsif( /^([\-\+\?])(Intron)/) {
my ($name,$len,$score,$qstart,$qend,$qseqname) = split;
push @features, new Bio::SeqFeature::Generic(-primary => $2,
-source => $self->analysis_method,
-start => $qstart,
-end => $qend,
-strand => $qstrand,
-score => $score,
-seq_id => $qseqname,
-tag => {
'Sequence' => $lasthseqname});
} elsif( /^Span/ ) {
} elsif( /^Segment/ ) {
$seensegment = 1;
} elsif( /^\s+$/ ) { } else {
$self->warn( "unknown line $_\n");
}
}
return unless( @features );
return wantarray ? @features :\@ features;} |
sub _parse_gene_struct
{ my ($self) = @_;
my $seensegment = 0;
my @features;
my ($qstrand,$hstrand) = (1,1);
my $lasthseqname;
my $gene = new Bio::SeqFeature::Gene::GeneStructure(-source => $self->analysis_method);
my $transcript = new Bio::SeqFeature::Gene::Transcript(-source => $self->analysis_method);
my @suppf;
my @exon;
while( defined($_ = $self->_readline) ) {
if( /Note Best alignment is between (reversed|forward) est and (reversed|forward) genome, (but|and) splice\s+sites imply\s+(forward gene|REVERSED GENE)/) {
if( $seensegment ) {
$self->_pushback($_);
return $gene;
}
$hstrand = -1 if $1 eq 'reversed';
$qstrand = -1 if $4 eq 'REVERSED GENE';
}
elsif( /^Exon/ ) {
my ($name,$len,$score,$qstart,$qend,$qseqname,$hstart,$hend, $hseqname) = split;
$lasthseqname = $hseqname;
my $exon = new Bio::SeqFeature::Gene::Exon(-primary => $name,
-source => $self->analysis_method,
-seq_id => $qseqname, -start => $qstart,
-end => $qend,
-strand => $qstrand,
-score => $score,
-tag => {
'Sequence' => "$hseqname",
}
);
$transcript->seq_id($qseqname) unless $transcript->seq_id;
$exon->add_tag_value('phase',0);
push @exon, $exon;
} elsif( /^([\-\+\?])(Intron)/) {
next; } elsif( /^Span/ ) {
} elsif( /^Segment/ ) {
my ($name,$len,$score,$qstart,$qend,$qseqname,$hstart,$hend, $hseqname) = split;
my $query = new Bio::SeqFeature::Similarity(-primary => $name,
-source => $self->analysis_method,
-seq_id => $qseqname, -start => $qstart,
-end => $qend,
-strand => $qstrand,
-score => $score,
-tag => {
'Sequence' => "$hseqname",
}
);
my $hit = new Bio::SeqFeature::Similarity(-primary => 'exon_hit',
-source => $self->analysis_method,
-seq_id => $hseqname,
-start => $hstart,
-end => $hend,
-strand => $hstrand,
-score => $score,
-tag => {
'Sequence' => "$qseqname",
}
);
my $support = new Bio::SeqFeature::SimilarityPair (-query => $query,
-hit => $hit,
-source => $self->analysis_method);
push @suppf, $support;
} elsif( /^\s+$/ ) { } else {
$self->warn( "unknown line $_\n");
}
}
return unless $#exon >=0;
foreach my $e(@exon){
my @add;
foreach my $sf(@suppf){
if($sf->overlaps($e)){
push @add,$sf;
}
}
$e->add_tag_value('supporting_feature',@add);
$transcript->add_exon($e);
}
$gene->add_transcript($transcript);
$gene->seq_id($transcript->seq_id);
return $gene;} |
The rest of the documentation details each of the object methods.
Internal methods are usually preceded with a _