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 )