roro
04-13-2009, 07:27 PM
Hello,
Whenever I try to run this script, I get the following error on command line: "Can't call method "parse" on an undefined value at....". Also, my debugger keeps telling me that "$orthomclparser requires explicit package name". Any help would be appreciated as I am very new to Perl.
#!/usr/bin/perl
use OBO::Core::RelationshipType;
use OBO::Core::Relationship;
use OBO::Core::Term;
use OBO::CCO::CCO_ID_Term_Map;
use OBO::Core::Ontology;
use strict;
use warnings;
use Carp;
$OrthoMCLParser->parse();
$OrthoMCLParser-> work();
sub new {
my $class = $_[0];
my $self = {};
bless( $self, $class );
return $self;
}
sub parse {
my $self = shift;
# get orthoMCL data file
my $omclDataFile = shift;
open(my $FH, '<', $omclDataFile) || die "Cannot open file '$omclDataFile': $!";
# parse orthoMCL output
my %clusters; # %clusters{protein_name}{taxon_label}
while(<$FH>){
my ($cluster, $proteins) = split /:\s+/xms;
my $cluster_num = $.-1;
$cluster = $cluster_num;
my @proteins = split /\s/xms, $proteins;
foreach ( @proteins) {
$_ =~/\A(\w+?)\((\w+?)\)/xms; # $1 is protein name, $2 is taxon label (e.g Hsa)
$clusters{$cluster}->{$1} = $2;
}
}
close $FH;
return \%clusters;
}
sub work {
my ($self, $clust, $files, $tax) = @_;
my %clusters = %{$clust};
my %taxa = %{$tax};
# input/output files
my ($new_OBO_file, $u_map_file, $t_map_file, $o_map_file, $b_map_file) = @{$files};
# Initialize maps (OBO::CCO::CCO_ID_Term_Map objects)
my $u_map = OBO::CCO::CCO_ID_Term_Map->new($u_map_file); # map for Upper Level Ontology terms
my $t_map = OBO::CCO::CCO_ID_Term_Map->new($t_map_file); # map for taxonomy terms
my $o_map = OBO::CCO::CCO_ID_Term_Map->new($o_map_file); # map for orthologous groups terms
my $b_map = OBO::CCO::CCO_ID_Term_Map->new($b_map_file); # map for biomolecule terms
# taxon specific maps for biolmolecule terms
foreach (keys %taxa) {
push @{$taxa{$_}}, OBO::CCO::CCO_ID_Term_Map->new($taxa{$_}->[1]);
}
# @{$taxa{taxon_label}} contains now taxon name, taxon specific map file, taxon specific map object
my $ontology = OBO::Core::Ontology->new();
# populate ontology
$ontology->add_relationship_type_as_string ('is_a', 'is_a');
$ontology->add_relationship_type_as_string ('has_source', 'has_source');
#$ontology->add_relationship_type_as_string ('source_of', 'source_of');
my $protein = OBO::Core::Term->new();# upper level ontology term
$protein->name('protein');
$protein->id(assign_term_id($u_map, 'U', 'protein'));
if ($u_map->contains_value('protein')) {
$protein->id($u_map->get_cco_id_by_term('protein'));
}else{
$protein->id(assign_term_id($u_map, 'U', 'protein'));
}
$ontology->add_term($protein);
foreach (keys %taxa) {
my $taxon = OBO::Core::Term->new();
my $taxon_lab = $_;
my $tax_name = $taxa{$taxon_lab}->[0];
$taxon->name($tax_name);
$taxon->id(assign_term_id($t_map, 'T', $tax_name));
$ontology->add_term($taxon);
push @{$taxa{$taxon_lab}}, $taxon;
#@{$taxa{$taxon_lab}} contains now taxon name, taxon specific map file, taxon specific map object, taxon term object
}
foreach (keys %clusters) {
my $cluster = OBO::Core::Term->new();
my $clust_num = $_;
my $clust_name = "Type $_ protein";
$cluster->name($clust_name);
$cluster->id(assign_term_id($o_map, 'O', $clust_name));
$cluster->def_as_string("A protein belonging to the orthological type $_ produced by orthoMCL", "[CCO:vm]");
$ontology->create_rel($cluster, 'is_a', $protein);
foreach (keys %{$clusters{$clust_num}}) { # for each protein in the cluster
my $prot_name = $_;
my $taxon_lab = $clusters{$clust_num}{$prot_name};
my $clust_protein = OBO::Core::Term->new();
$clust_protein->name($prot_name);
$clust_protein->id(assign_biomol_id($taxa{$taxon_lab}[2], $b_map, $prot_name));
my $short_map = $taxa{$taxon_lab}[2];
if ($short_map->contains_value($prot_name)) {
$clust_protein->id($short_map->get_cco_id_by_term($prot_name));
} else {
$clust_protein->id(assign_biomol_id($short_map, $b_map, $prot_name));
}
$ontology->add_term($clust_protein);
$ontology->create_rel($clust_protein, 'is_a', $cluster);
$ontology->create_rel($clust_protein, 'has_source', $taxa{$taxon_lab}->[3]);
#$ontology->create_rel($taxa{$taxon_lab}->[3], 'source_of', $clust_protein);
}
}
# Write the new ontology and maps to disk
open (my $FH, ">".$new_OBO_file) || die "Cannot write OBO file: ", $!;
$ontology->export(\*$FH);
close $FH;
foreach ((keys %taxa)) {
$taxa{$_}[2] -> write_map();
}
$b_map -> write_map();
$o_map -> write_map();
$t_map -> write_map();
$u_map -> write_map();
return $ontology;
}
Whenever I try to run this script, I get the following error on command line: "Can't call method "parse" on an undefined value at....". Also, my debugger keeps telling me that "$orthomclparser requires explicit package name". Any help would be appreciated as I am very new to Perl.
#!/usr/bin/perl
use OBO::Core::RelationshipType;
use OBO::Core::Relationship;
use OBO::Core::Term;
use OBO::CCO::CCO_ID_Term_Map;
use OBO::Core::Ontology;
use strict;
use warnings;
use Carp;
$OrthoMCLParser->parse();
$OrthoMCLParser-> work();
sub new {
my $class = $_[0];
my $self = {};
bless( $self, $class );
return $self;
}
sub parse {
my $self = shift;
# get orthoMCL data file
my $omclDataFile = shift;
open(my $FH, '<', $omclDataFile) || die "Cannot open file '$omclDataFile': $!";
# parse orthoMCL output
my %clusters; # %clusters{protein_name}{taxon_label}
while(<$FH>){
my ($cluster, $proteins) = split /:\s+/xms;
my $cluster_num = $.-1;
$cluster = $cluster_num;
my @proteins = split /\s/xms, $proteins;
foreach ( @proteins) {
$_ =~/\A(\w+?)\((\w+?)\)/xms; # $1 is protein name, $2 is taxon label (e.g Hsa)
$clusters{$cluster}->{$1} = $2;
}
}
close $FH;
return \%clusters;
}
sub work {
my ($self, $clust, $files, $tax) = @_;
my %clusters = %{$clust};
my %taxa = %{$tax};
# input/output files
my ($new_OBO_file, $u_map_file, $t_map_file, $o_map_file, $b_map_file) = @{$files};
# Initialize maps (OBO::CCO::CCO_ID_Term_Map objects)
my $u_map = OBO::CCO::CCO_ID_Term_Map->new($u_map_file); # map for Upper Level Ontology terms
my $t_map = OBO::CCO::CCO_ID_Term_Map->new($t_map_file); # map for taxonomy terms
my $o_map = OBO::CCO::CCO_ID_Term_Map->new($o_map_file); # map for orthologous groups terms
my $b_map = OBO::CCO::CCO_ID_Term_Map->new($b_map_file); # map for biomolecule terms
# taxon specific maps for biolmolecule terms
foreach (keys %taxa) {
push @{$taxa{$_}}, OBO::CCO::CCO_ID_Term_Map->new($taxa{$_}->[1]);
}
# @{$taxa{taxon_label}} contains now taxon name, taxon specific map file, taxon specific map object
my $ontology = OBO::Core::Ontology->new();
# populate ontology
$ontology->add_relationship_type_as_string ('is_a', 'is_a');
$ontology->add_relationship_type_as_string ('has_source', 'has_source');
#$ontology->add_relationship_type_as_string ('source_of', 'source_of');
my $protein = OBO::Core::Term->new();# upper level ontology term
$protein->name('protein');
$protein->id(assign_term_id($u_map, 'U', 'protein'));
if ($u_map->contains_value('protein')) {
$protein->id($u_map->get_cco_id_by_term('protein'));
}else{
$protein->id(assign_term_id($u_map, 'U', 'protein'));
}
$ontology->add_term($protein);
foreach (keys %taxa) {
my $taxon = OBO::Core::Term->new();
my $taxon_lab = $_;
my $tax_name = $taxa{$taxon_lab}->[0];
$taxon->name($tax_name);
$taxon->id(assign_term_id($t_map, 'T', $tax_name));
$ontology->add_term($taxon);
push @{$taxa{$taxon_lab}}, $taxon;
#@{$taxa{$taxon_lab}} contains now taxon name, taxon specific map file, taxon specific map object, taxon term object
}
foreach (keys %clusters) {
my $cluster = OBO::Core::Term->new();
my $clust_num = $_;
my $clust_name = "Type $_ protein";
$cluster->name($clust_name);
$cluster->id(assign_term_id($o_map, 'O', $clust_name));
$cluster->def_as_string("A protein belonging to the orthological type $_ produced by orthoMCL", "[CCO:vm]");
$ontology->create_rel($cluster, 'is_a', $protein);
foreach (keys %{$clusters{$clust_num}}) { # for each protein in the cluster
my $prot_name = $_;
my $taxon_lab = $clusters{$clust_num}{$prot_name};
my $clust_protein = OBO::Core::Term->new();
$clust_protein->name($prot_name);
$clust_protein->id(assign_biomol_id($taxa{$taxon_lab}[2], $b_map, $prot_name));
my $short_map = $taxa{$taxon_lab}[2];
if ($short_map->contains_value($prot_name)) {
$clust_protein->id($short_map->get_cco_id_by_term($prot_name));
} else {
$clust_protein->id(assign_biomol_id($short_map, $b_map, $prot_name));
}
$ontology->add_term($clust_protein);
$ontology->create_rel($clust_protein, 'is_a', $cluster);
$ontology->create_rel($clust_protein, 'has_source', $taxa{$taxon_lab}->[3]);
#$ontology->create_rel($taxa{$taxon_lab}->[3], 'source_of', $clust_protein);
}
}
# Write the new ontology and maps to disk
open (my $FH, ">".$new_OBO_file) || die "Cannot write OBO file: ", $!;
$ontology->export(\*$FH);
close $FH;
foreach ((keys %taxa)) {
$taxa{$_}[2] -> write_map();
}
$b_map -> write_map();
$o_map -> write_map();
$t_map -> write_map();
$u_map -> write_map();
return $ontology;
}