Bio-FeatureIO
view release on metacpan or search on metacpan
lib/Bio/FeatureIO/gff.pm view on Meta::CPAN
} else {
if($type =~ /^\D+:\d+$/){
#looks like an identifier
$fta->identifier($type)
} else {
$fta->name($type);
}
}
$feat->type($fta);
my %attr = ();
chomp $attribute_string;
unless ( $attribute_string eq '.' ) {
my @attributes = split ';', $attribute_string;
foreach my $attribute (@attributes){
my($key,$values) = split '=', $attribute;
# remove leading and trailing quotes from values
$values =~ s/^["']//;
$values =~ s/["']$//; #' terminate the quote for emacs
my @values = map{uri_unescape($_)} split ',', $values;
#minor hack to allow for multiple instances of the same tag
if ($attr{$key}) {
my @tmparray = @{$attr{$key}};
push @tmparray, @values;
$attr{$key} = [@tmparray];
} else {
$attr{$key} = [@values];
}
}
}
#Handle Dbxref attributes
if($attr{Dbxref} or $attr{dbxref}){
foreach my $value (@{ $attr{Dbxref} }, @{ $attr{dbxref} }){
my $a = Bio::Annotation::DBLink->new();
my($db,$accession) = $value =~ /^(.+?):(.+)$/;
if(!$db or !$accession){ #dbxref malformed
$self->throw("Error in line:\n$feature_string\nDbxref value '$value' did not conform to GFF3 specification");
next;
}
$a->database($db);
$a->primary_id($accession);
$feat->add_Annotation('Dbxref',$a);
}
}
#Handle Ontology_term attributes
if($attr{Ontology_term}){
foreach my $id (@{ $attr{Ontology_term} }){
my $a = Bio::Annotation::OntologyTerm->new();
if($self->validate()){
my $ont_name = Bio::Ontology::OntologyStore->guess_ontology($id);
my $ont = Bio::Ontology::OntologyStore->get_ontology($ont_name);
my($term) = $ont->find_terms(-identifier => $id);
$a->term($term);
} else {
$a->identifier($id);
}
$feat->add_Annotation('Ontology_term',$a);
}
}
#Handle Gap attributes
if($attr{Gap}){
for my $value (@{ $attr{Gap} }) {
my $a = Bio::Annotation::SimpleValue->new();
$a->value($value);
$feat->add_Annotation('Gap',$a);
}
}
#Handle Target attributes
if($attr{Target}){
my $target_collection = Bio::Annotation::Collection->new();
foreach my $target_string (@{ $attr{Target} } ) {
#only replace + for space if + has been used in place of it
#that is, + could also mean plus strand, and we don't want
#to accidentally remove it
#presumably you can't use + for space and + for strand in the same string.
$target_string =~ s/\+/ /g unless $target_string =~ / /;
my ($t_id,$tstart,$tend,$strand,$extra) = split /\s+/, $target_string;
if (!$tend || $extra) { # too much or too little stuff in the string
$self->throw("The value in the Target string, $target_string, does not conform to the GFF3 specification");
}
my $a = Bio::Annotation::Target->new(
-target_id => $t_id,
-start => $tstart,
-end => $tend,
);
if ($strand && $strand eq '+') {
$strand = 1;
} elsif ($strand && $strand eq '-') {
$strand = -1;
} else {
$strand = '';
}
$a->strand($strand) if $strand;
$feat->add_Annotation('Target',$a);
}
}
#Handle ID attribute. May only have one ID, throw error otherwise
if($attr{ID}){
( run in 1.638 second using v1.01-cache-2.11-cpan-39bf76dae61 )