[Bio] / FigWebServices / subsystem_server_sapling.cgi Repository:
ViewVC logotype

Diff of /FigWebServices/subsystem_server_sapling.cgi

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.9, Mon Aug 24 17:35:56 2009 UTC revision 1.10, Thu Aug 27 19:51:59 2009 UTC
# Line 1  Line 1 
1  use strict;  use strict;
2  use Data::Dumper;  use ServerThing;
3  use FIG;  use constant POD => "http://servers.nmpdr.org/subsystem/server.cgi?pod=";
 use CGI::Fast;  
 use CGI;  
 use Sapling;  
 use SaplingSubsys;  
 use YAML;  
 use ERDB;  
4    
5  my $fig = new FIG;  ServerThing::RunServer(SS => $ARGV[0], POD);
 my $sapling = ERDB::GetDatabase('Sapling');  
6    
7    
8  #  1;
 # If no CGI vars, assume we are invoked as a fastcgi service.  
 #  
 if ($ENV{REQUEST_METHOD} eq '')  
 {  
     while (my $cgi = new CGI::Fast())  
     {  
         eval {  
             &process_request($cgi);  
         };  
         if ($@)  
         {  
             if (ref($@) ne 'ARRAY')  
             {  
                 warn "code died, returning error\n";  
                 print $cgi->header(-status => '500 error in body of cgi processing');  
                 print $@;  
             }  
         }  
     }  
 }  
 else  
 {  
     my $cgi = new CGI();  
     print $cgi->header();  
     &process_request($cgi);  
 }  
   
 exit;  
   
 sub process_request  
 {  
     my($cgi) = @_;  
   
   
 my $i = 0;  
     my $result = [];  
     my $function = $cgi->param('function');  
     $function or myerror($cgi, "500 missing argument", "subsystem server missing function argument");  
   
   
     if ($function eq "is_in_subsystem") {  
         my $ids = &YAML::Load($cgi->param('args'));  
         $ids or myerror($cgi, "500 missing id", "subsystem server missing id argument");  
         foreach my $fid (@$ids) {  
                 my @resultRows = $sapling->GetAll("Subsystem Includes  Role IsRoleOf MachineRole Contains Feature",  
                                       'Feature(id) = ?', [$fid],  
                                       [qw(Subsystem(id) Role(id) Feature(id))]);  
                 push (@$result, \@resultRows);  
         }  
         print $cgi->header();  
         print &YAML::Dump($result);  
   
     } elsif ($function eq "is_in_subsystem_with") {  
         print $cgi->header();  
         my $ids = &YAML::Load($cgi->param('args'));  
         $ids or myerror($cgi, "500 missing id", "subsystem server missing id argument");  
         my $result = [];  
         foreach my $fid (@$ids) {  
                 # if this is not a fig id, look up the fig id equivalent  
                 my @resultRows = $sapling->GetAll("Feature IsContainedIn MachineRole IsRoleFor MolecularMachine Implements Variant IsDescribedBy Subsystem AND MolecularMachine IsMachineOf MachineRole2 Contains Feature2 AND MachineRole2 HasRole Role",  
                                       'Feature(id) = ? ',  
                                       [$fid], [qw(Subsystem(id)  
                                       Variant(id) Feature(id) Feature2(id) Feature2(function) Role(id))]);  
                 push (@$result, \@resultRows);  
         }  
         print &YAML::Dump($result);  
   
     } elsif  ($function eq "all_subsystems") {  
         #print $cgi->header();  
   
         my @resultRows = $sapling->GetAll("Subsystem Includes Role",  
                                       'ORDER BY Subsystem(id)', [], [qw(Subsystem(id) Subsystem(curator)  
                                       Role(id))]);  
         print &YAML::Dump(\@resultRows);  
   
     } elsif ($function eq "subsystem_spreadsheet") {  
         print $cgi->header();  
         my $names = &YAML::Load($cgi->param('args'));  
         $names or myerror($cgi, "500 missing id", "subsystem server missing id argument");  
         my $result = [];  
         foreach my $subsysName (@$names) {  
                 my @resultRows = $sapling->GetAll("Subsystem Describes Variant IsImplementedBy MolecularMachine IsMachineOf MachineRole Contains Feature AND MachineRole HasRole Role",  
                                       'Subsystem(id) = ? ORDER BY Feature(id)',  
                                       [$subsysName], [qw(Subsystem(id) Variant(id)  
                                       Feature(id) Feature(function) Role(id))]);  
                 push (@$result, \@resultRows);  
         }  
         print &YAML::Dump($result);  
   
     } elsif ($function eq "pegs_in_subsystems") {  
         my $result = [];  
         my (@args)  = &YAML::Load($cgi->param('args'));  
         my $genomes = $args[0];  
         my $subs = $args[1];  
         foreach my $sub (@{$subs}) {  
                 my $ss = SaplingSubsys->new($sub, $sapling);  
                 foreach my $g (@{$genomes}) {  
                         my @roles = $ss->get_roles_for_genome($g, 1);  
                         foreach my $role (@roles) {  
                                 push (@$result, [$sub, $role]);  
                         }  
                 }  
         }  
         print &YAML::Dump($result);  
   
    } elsif ($function eq "pegs_implementing_roles") {  
         my $result = [];  
         my (@args)  = &YAML::Load($cgi->param('args'));  
         my $subsys = $args[0];  
         my @roles = @{$args[1]};  
         my $ss = SaplingSubsys->new($subsys, $sapling);  
         foreach my $role (@roles) {  
                 my @pegs = $ss->pegs_for_role($role);  
 print STDERR Dumper $role, \@pegs;  
                 push (@$result, [$role, \@pegs]);  
         }  
   
         print &YAML::Dump($result);  
   
     } elsif ($function eq "metabolic_reconstruction") {  
   
         #print $cgi->header();  
         my %big;  
         my $id_display = 1;  
         my $result = [];  
   
         my @id_roles = &YAML::Load($cgi->param('args'));  
         #map {push(@{$big{$_}}, 1)} @id_roles;  
         #map {push(@{$big{$_->[0]}}, 1)} @id_roles;  
         map {push(@{$big{$_->[0]}}, $_->[1])} @id_roles;  
         #my @resultRows = $sapling->GetFlat("Subsystem", '', [], 'Subsystem(id)');  
   
   
   
   
         my @resultRows = $sapling->GetAll("Subsystem Includes Role",  
                                 'ORDER BY Subsystem(id), Includes(sequence)', [],  
                                 [qw(Subsystem(id) Role(id) Includes(abbreviation))]);  
   
         my %ss_roles;  
         foreach my $row (@resultRows) {  
                 my ($sub, $role, $abbr) = @$row;  
                 $ss_roles{$sub}->{$role} = $abbr;  
         }  
   
         foreach my $sub (keys %ss_roles) {  
                 my $roles = $ss_roles{$sub};  
   
                 my @abbr = map{$roles->{$_}} grep { $big{$_}} keys %$roles;  
                 my $set =  join(" ",  @abbr);  
                 if (@abbr > 0) {  
                         my ($variant, $size) = get_max_subset($sub, $set);  
                         if ($variant) {  
                                 foreach my $role (keys %$roles) {  
                                         if ($id_display) {  
                                                 foreach my $id (@{$big{$role}}) {  
                                                         push (@$result, [$variant, $role, $id]);  
                                                 }  
                                         } else {  
                                                 push (@$result, [$variant, $role]);  
                                         }  
                                 }  
                         }  
                 }  
   
 #if ($i++ > 10) {  
     #print &YAML::Dump($result);  
         #exit;  
 #}  
   
         }  
     print &YAML::Dump($result);  
     } else {  
         myerror($cgi, "500 bad function argument $function", "usage:subsystem_server function=[is-in-subsystem | is-in-subsystem-with | all-subsystems | subsystem-spreadsheet");  
     }  
 }  
   
   
   
   
   
 sub get_max_subset {  
         my ($sub, $setA) = @_;  
         my $max_size = 0;  
         my $max_set;  
         my $max_variant;  
         my %set_hash;  
         my $qh = $sapling->Get("Subsystem Describes Variant", 'Subsystem(id) = ? AND Variant(type) = ?', [$sub, 'normal']);  
         while (my $resultRow = $qh->Fetch()) {  
             my @variantRoleRule = $resultRow->Value('Variant(role-rule)');  
             my ($variantCode) = $resultRow->Value('Variant(code)');  
             my $variantId = $sub.":".$variantCode;  
             foreach my $setB (@variantRoleRule) {  
                         my $size = is_A_a_superset_of_B($setA, $setB);  
                         if ($size  && $size > $max_size) {  
                                 $max_size = $size;  
                                 $max_set = $setB;  
                                 $max_variant = $variantId;  
                         }  
             }  
         }  
         #if ($max_size) {  
                 #print STDERR "Success $max_variant, $max_set\n";  
         #}  
         return($max_variant, $max_size);  
 }  
   
   
   
 sub is_A_a_superset_of_B {  
         my ($a, $b) = @_;  
         my @a = split(" ", $a);  
         my @b = split(" ", $b);  
         if (@b > @a) {  
                 return(0);  
         }  
         my %given;  
         map { $given{$_} = 1} @a;  
         map { if (! $given{$_}) {return 0}} split(" ", $b);  
         my $l = scalar(@b);  
         return scalar(@b);  
 }  
   
   
 sub myerror  
 {  
     my($cgi, $stat, $msg) = @_;  
     print $cgi->header(-status =>  $stat);  
   
     print "$msg\n";  
     die ['cgi error returned'];  
 }  

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3