Bio-Polloc
view release on metacpan or search on metacpan
lib/Bio/Polloc/LocusIO/gff3.pm view on Meta::CPAN
my $family = $self->_gff3_decode($row[2]);
my $from = $self->_gff3_decode($row[3]);
my $to = $self->_gff3_decode($row[4]);
my $score= $self->_gff3_decode($row[5]);
my $strand = $self->_gff3_decode($row[6]);
my $frame = $self->_gff3_decode($row[7]);
my @compl = split /;/, $row[8];
my %atts = ();
for my $c (@compl){
$c =~ /(.+?)=(.*)/ or next;
my ($k,$v) = ($1, $2);
$atts{lc $k} = $self->_gff3_decode($v);
}
my $id = $atts{'id'};
my $name = $atts{'name'};
my $genome_name = $atts{'organism_name'};
my @comments = ();
@comments = split /,/, $atts{'note'} if defined $atts{'note'};
my $f = Bio::Polloc::LocusI->_qualify_type($family);
my $type = ($f eq 'amplicon' or $f eq 'amplification') ? 'amplicon' :
($f eq 'composition') ? 'composition' :
($f eq 'crispr') ? 'crispr' :
($f eq 'pattern' or $f eq 'domain') ? 'pattern' :
($f eq 'repeat' or $f eq 'vntr' or $f =~ /tandem.?repeat/
or lc $source eq 'trf' or lc $source eq 'mreps') ? 'repeat' :
'generic';
$type = "extend" if grep{ /Extended feature/ } @comments;
my $locus = Bio::Polloc::LocusI->new(
-id=>$id, -name=>$name,
-type=>$type,
-from=>$from, -to=>$to, -strand=>$strand,
-source=>$source, -family=>$family,
-score=>$score,
-seqname=>$seqid);
# Parse comments
for my $comm (@comments){
if($comm =~ m/^(.+?)=(.+)$/){
my ($k, $v) = (lc $1, $2);
if($k and $v and $locus->can($k)){
$self->debug("Setting $k to $v");
$locus->$k($v);
next;
}
$genome_name = $v if not defined $genome_name and
($k =~ /^organism(?:_name)?$/ or $k =~ /^genome(?:_name)?$/);
}elsif($type eq 'extend' and $comm =~ m/Based on group [^:]+: (.*)/){
for my $b (split /\s/, $1){
$locus->basefeature($self->_locus_by_id($b)) if defined $self->_locus_by_id($b);
}
}
}
if(defined $genomes){
my $genome;
# Search the genome by name:
if(defined $genome_name){
for my $g (@$genomes){
$genome = $g if $g->name eq $genome_name;
last if defined $genome;
}
}
# Search the genome by sequence name (prone to errors, but it's a guess):
unless(defined $genome){
for my $g (@$genomes){
$genome = $g if defined $g->search_sequence($seqid);
last if defined $genome;
}
}
$locus->genome($genome);
}
$locus->comments(@comments);
return $self->_save_locus($locus);
}
=head2 _write_locus_impl
=cut
sub _write_locus_impl {
my $self = shift;
my $line = $self->gff3_line(@_);
unless($self->{'_header'}){
$self->_print("##gff-version 3\n\n");
$self->{'_header'} = 1;
}
$self->_print($line);
}
=head2 _gff3_attribute
Properly escapes an attribute for GFF3 (an attribute the value of one of
the colon-separated entries in the ninth column)
=head3 Purpose
To simplify the code of L<Bio::Polloc::LocusI::gff3_line>
=head3 Arguments
The value to escape
=head3 Returns
The escaped value
=cut
sub _gff3_attribute {
my($self,$value) = @_;
return unless defined $value;
if(ref($value) && ref($value) =~ m/array/i){
my $out = "";
for my $att (@{$value}){
$out.= "," . $self->_gff3_value($att);
}
$out = substr($out, 1) if $out;
return $out;
}
return $self->_gff3_value($value);
}
=head2 _gff3_value
( run in 0.616 second using v1.01-cache-2.11-cpan-39bf76dae61 )