[Bio] / FigKernelPackages / FIGMODELmodel.pm Repository:
ViewVC logotype

Diff of /FigKernelPackages/FIGMODELmodel.pm

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

revision 1.19, Wed Jun 2 08:05:35 2010 UTC revision 1.23, Mon Jul 26 05:53:06 2010 UTC
# Line 13  Line 13 
13          This is the constructor for the FIGMODELmodel object.          This is the constructor for the FIGMODELmodel object.
14  =cut  =cut
15  sub new {  sub new {
16          my ($class,$figmodel,$id) = @_;          my ($class,$figmodel,$id,$metagenome) = @_;
   
17          #Error checking first          #Error checking first
18          if (!defined($figmodel)) {          if (!defined($figmodel)) {
19                  print STDERR "FIGMODELmodel->new(undef,".$id."):figmodel must be defined to create a model object!\n";                  print STDERR "FIGMODELmodel->new(undef,".$id."):figmodel must be defined to create a model object!\n";
# Line 26  Line 25 
25                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,undef):id must be defined to create a model object");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,undef):id must be defined to create a model object");
26                  return undef;                  return undef;
27          }          }
   
28          #Checking that the id exists          #Checking that the id exists
29            if (!defined($metagenome) || $metagenome != 1) {
30          my $modelHandle = $self->figmodel()->database()->get_object_manager("model");          my $modelHandle = $self->figmodel()->database()->get_object_manager("model");
31          if (!defined($modelHandle)) {                  if (defined($modelHandle)) {
                 $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not load MODELS table. Check database!");  
                 return undef;  
         }  
   
32          #If the id is a number, we get the model row by index          #If the id is a number, we get the model row by index
33          if ($id =~ m/^\d+$/) {          if ($id =~ m/^\d+$/) {
34                  my $objects = $modelHandle->get_objects();                  my $objects = $modelHandle->get_objects();
35                                    if (defined($objects->[$id])) {
36                  $self->{_data} = $objects->[$id];                  $self->{_data} = $objects->[$id];
37                  $self->figmodel()->{_models}->{$id} = $self;                  $self->figmodel()->{_models}->{$id} = $self;
38                                    }
39          } else {          } else {
40                  my $objects = $modelHandle->get_objects({id => $id});                  my $objects = $modelHandle->get_objects({id => $id});
41                  if (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {                                  if (defined($objects->[0])) {
42                                            $self->{_data} = $objects->[0];
43                                    } elsif (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {
44                          $objects = $modelHandle->get_objects({id => $1});                          $objects = $modelHandle->get_objects({id => $1});
45                          if (!defined($objects->[0])) {                                          if (defined($objects->[0])) {
                                 $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");  
                                 return undef;  
                         }  
46                          $self->{_selectedversion} = $2;                          $self->{_selectedversion} = $2;
47                  } elsif (!defined($objects->[0])) {                                                  $self->{_data} = $objects->[0];
48                          $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");                                          }
49                          return undef;                                  }
50                            }
51                    }
52                    if (defined($self->{_data})) {
53                            $self->{_modeltype} = "genome";
54                  }                  }
55            }
56            if (!defined($self->{_data})) {
57                    my $modelHandle = $self->figmodel()->database()->get_object_manager("mgmodel");
58                    if (defined($modelHandle)) {
59                            #If the id is a number, we get the model row by index
60                            if ($id =~ m/^\d+$/) {
61                                    my $objects = $modelHandle->get_objects();
62                                    if (defined($objects->[$id])) {
63                                            $self->{_data} = $objects->[$id];
64                                            $self->figmodel()->{_models}->{"MG".$id} = $self;
65                                    }
66                            } else {
67                                    my $objects = $modelHandle->get_objects({id => $id});
68                                    if (defined($objects->[0])) {
69                  $self->{_data} = $objects->[0];                  $self->{_data} = $objects->[0];
70                                    } elsif (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {
71                                            $objects = $modelHandle->get_objects({id => $1});
72                                            if (defined($objects->[0])) {
73                                                    $self->{_selectedversion} = $2;
74                                                    $self->{_data} = $objects->[0];
75                                            }
76                                    }
77                            }
78                    }
79                    if (defined($self->{_data})) {
80                            $self->{_modeltype} = "metagenome";
81                    }
82          }          }
83          if (!defined($self->{_data})) {          if (!defined($self->{_data})) {
84                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find specified id in database!");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
85                  return undef;                  return undef;
86          }          }
87          $self->figmodel()->{_models}->{$self->id()} = $self;          $self->figmodel()->{_models}->{$self->id()} = $self;
   
88          return $self;          return $self;
89  }  }
90    
# Line 166  Line 191 
191  =cut  =cut
192  sub mgdata {  sub mgdata {
193          my ($self) = @_;          my ($self) = @_;
194          if (!defined($self->{_mgdata}) && $self->source() =~ /^MGRAST/) {          if (!defined($self->{_mgdata})) {
195                  require MGRAST;                  my $mgrastdbhandle = $self->figmodel()->database()->get_object_manager("mgjob");
196                  $self->{_mgdata} = $self->figmodel()->mgrast()->Job->get_objects( { 'genome_id' => $self->genome() } )                  my $objects = $mgrastdbhandle->get_objects( { 'genome_id' => $self->genome() } );
197                    $self->{_mgdata} = $objects->[0];
198          }          }
199          return $self->{_mgdata};          return $self->{_mgdata};
200  }  }
# Line 184  Line 210 
210          return $self->{_data}->id();          return $self->{_data}->id();
211  }  }
212    
213    =head3 get_model_type
214    Definition:
215            string = FIGMODELmodel->get_model_type();
216    Description:
217            Returns the type of the model
218    =cut
219    sub get_model_type {
220            my ($self) = @_;
221            return $self->{_modeltype};
222    }
223    
224  =head3 owner  =head3 owner
225  Definition:  Definition:
226          string = FIGMODELmodel->owner();          string = FIGMODELmodel->owner();
# Line 352  Line 389 
389  =cut  =cut
390  sub get_reaction_data {  sub get_reaction_data {
391          my ($self,$reaction) = @_;          my ($self,$reaction) = @_;
   
392          if (!defined($self->reaction_table())) {          if (!defined($self->reaction_table())) {
393                  return undef;                  return undef;
394          }          }
395          if ($reaction =~ m/^\d+$/) {          if ($reaction =~ m/^\d+$/) {
396                  $self->reaction_table()->get_row($reaction);                  return $self->reaction_table()->get_row($reaction);
397          }          }
398          return $self->reaction_table()->get_row_by_key($reaction,"LOAD");          return $self->reaction_table()->get_row_by_key($reaction,"LOAD");
399  }  }
# Line 444  Line 480 
480  =cut  =cut
481  sub create_table_prototype {  sub create_table_prototype {
482          my ($self,$TableName) = @_;          my ($self,$TableName) = @_;
   
483          #Checking if the table definition exists in the FIGMODELconfig file          #Checking if the table definition exists in the FIGMODELconfig file
484          if (!defined($self->figmodel()->config($TableName))) {          my $tbldef = $self->figmodel()->config($TableName);
485            if (!defined($tbldef)) {
486                  $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:Definition not found for ".$TableName);                  $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:Definition not found for ".$TableName);
487                  return undef;                  return undef;
488          }          }
489          #Checking that this is a database table          #Checking that this is a database table
490          if (!defined($self->config($TableName)->{tabletype}) || $self->config($TableName)->{tabletype}->[0] ne "ModelTable") {          if (!defined($tbldef->{tabletype}) || $tbldef->{tabletype}->[0] ne "ModelTable") {
491                  $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:".$TableName." is not a model table!");                  $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:".$TableName." is not a model table!");
492                  return undef;                  return undef;
493          }          }
494          if (!defined($self->config($TableName)->{delimiter})) {          #Setting default values for table parameters
495                  $self->config($TableName)->{delimiter}->[0] = ";";          my $prefix;
496            if (defined($tbldef->{prefix})) {
497                    $prefix = join("\n",@{$self->config($TableName)->{prefix}})."\n";
498            }
499            my $itemDelim = "|";
500            if (defined($tbldef->{itemdelimiter}->[0])) {
501                    $itemDelim = $tbldef->{itemdelimiter}->[0];
502                    if ($itemDelim eq "SC") {
503                            $itemDelim = ";";
504                    }
505          }          }
506          if (!defined($self->config($TableName)->{itemdelimiter})) {          my $columnDelim = "\t";
507                  $self->config($TableName)->{itemdelimiter}->[0] = "|";          if (defined($tbldef->{columndelimiter}->[0])) {
508                    $columnDelim = $tbldef->{columndelimiter}->[0];
509                    if ($columnDelim eq "SC") {
510                            $columnDelim = ";";
511                    }
512            }
513            my $suffix = ".tbl";
514            if (defined($tbldef->{filename_suffix}->[0])) {
515                    $suffix = $tbldef->{filename_suffix}->[0];
516            }
517            my $filename = $self->directory().$TableName."-".$self->id().$self->selected_version().$suffix;
518            if (defined($tbldef->{filename_prefix}->[0])) {
519                    if ($tbldef->{filename_prefix}->[0] eq "NONE") {
520                            $filename = $self->directory().$self->id().$self->selected_version().$suffix;
521                    } else {
522                            $filename = $self->directory().$tbldef->{filename_prefix}->[0]."-".$self->id().$self->selected_version().$suffix;
523          }          }
         my $prefix;  
         if (defined($self->config($TableName)->{prefix})) {  
                 $prefix = join("\n",@{$self->config($TableName)->{prefix}});  
524          }          }
525          my $tbl = FIGMODELTable->new($self->config($TableName)->{columns},$self->directory().$self->config($TableName)->{filename_prefix}->[0]."-".$self->id().$self->selected_version().".txt",$self->config($TableName)->{hashcolumns},$self->config($TableName)->{delimiter}->[0],$self->config($TableName)->{itemdelimiter}->[0],$prefix);          #Creating the table prototype
526            my $tbl = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},$columnDelim,$itemDelim,$prefix);
527          return $tbl;          return $tbl;
528  }  }
529    
# Line 491  Line 549 
549  =cut  =cut
550  sub reaction_table {  sub reaction_table {
551          my ($self,$clear) = @_;          my ($self,$clear) = @_;
552          my $tbl = $self->load_model_table("ModelReactions",$clear);          if (defined($clear) && $clear == 1) {
553                    delete $self->{_reaction_table};
554            }
555            if (!defined($self->{_reaction_table})) {
556                    $self->{_reaction_table} = $self->load_model_table("ModelReactions",$clear);
557          my $classTbl = $self->reaction_class_table();          my $classTbl = $self->reaction_class_table();
558          if (defined($classTbl)) {          if (defined($classTbl)) {
559                  for (my $i=0; $i < $classTbl->size(); $i++) {                  for (my $i=0; $i < $classTbl->size(); $i++) {
560                          my $row = $classTbl->get_row($i);                          my $row = $classTbl->get_row($i);
561                          if (defined($row->{REACTION})) {                          if (defined($row->{REACTION})) {
562                                  my $rxnRow = $tbl->get_row_by_key($row->{"REACTION"}->[0],"LOAD");                                          my $rxnRow = $self->{_reaction_table}->get_row_by_key($row->{"REACTION"}->[0],"LOAD");
563                                  if (defined($row->{MEDIA})) {                                  if (defined($row->{MEDIA})) {
564                                          for (my $j=0; $j < @{$row->{MEDIA}};$j++) {                                          for (my $j=0; $j < @{$row->{MEDIA}};$j++) {
565                                                  my $class = "Active <=>";                                                  my $class = "Active <=>";
# Line 522  Line 584 
584                          }                          }
585                  }                  }
586          }          }
587            }
588            return $self->{_reaction_table};
589    }
590    
591    =head3 essentials_table
592    Definition:
593            FIGMODELTable = FIGMODELmodel->essentials_table();
594    Description:
595            Returns FIGMODELTable with the essential genes for the model
596    =cut
597    sub essentials_table {
598            my ($self,$clear) = @_;
599            my $tbl = $self->load_model_table("ModelEssentialGenes",$clear);
600          return $tbl;          return $tbl;
601  }  }
602    
# Line 587  Line 662 
662                  }                  }
663              }              }
664              #Loading predictions              #Loading predictions
665              my @files = glob($self->directory()."EssentialGenes-".$self->id()."-*");                  my $esstbl = $self->essentials_table();
             foreach my $file (@files) {  
                 if ($file =~ m/\-([^\-]+)\.tbl/) {  
                         my $media = $1;  
                         my $list = $self->figmodel()->database()->load_single_column_file($file,"");  
                         my $hash;  
                         foreach my $gene (@{$list}) {  
                                 $hash->{$gene} = 1;  
                         }  
666                          for (my $i=0; $i < $self->{_feature_data}->size(); $i++) {                          for (my $i=0; $i < $self->{_feature_data}->size(); $i++) {
667                                  my $Row = $self->{_feature_data}->get_row($i);                                  my $Row = $self->{_feature_data}->get_row($i);
668                                  if ($Row->{ID}->[0] =~ m/(peg\.\d+)/) {                                  if ($Row->{ID}->[0] =~ m/(peg\.\d+)/) {
669                                          my $gene = $1;                                          my $gene = $1;
670                                          if (defined($hash->{$gene})) {                                  my @rows = $esstbl->get_rows_by_key($gene,"ESSENTIAL GENES");
671                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$media.":essential");                                  my $mediahash;
672                                    for (my $j=0; $j < $esstbl->size(); $j++) {
673                                            $mediahash->{$esstbl->get_row($j)->{MEDIA}->[0]} = 0;
674                                    }
675                                    for (my $j=0; $j < @rows; $j++) {
676                                            $mediahash->{$rows[$j]->{MEDIA}->[0]} = 1;
677                                    }
678                                    my @mediaList = keys(%{$mediahash});
679                                    for (my $j=0; $j < @mediaList; $j++) {
680                                            if ($mediahash->{$mediaList[$j]} == 1) {
681                                                    push(@{$Row->{$self->id()."PREDICTIONS"}},$mediaList[$j].":essential");
682                                          } else {                                          } else {
683                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$media.":nonessential");                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$mediaList[$j].":nonessential");
                                         }  
684                                  }                                  }
685                          }                          }
686                  }                  }
# Line 643  Line 719 
719  =cut  =cut
720  sub get_essential_genes {  sub get_essential_genes {
721          my ($self,$media) = @_;          my ($self,$media) = @_;
722            my $tbl = $self->essentials_table();
723          if (!defined($media)) {          my $row = $tbl->get_row_by_key($media,"MEDIA");
724                  $media = "Complete";          if (defined($row)) {
725          }                  return $row->{"ESSENTIAL GENES"};
         if (!defined($self->{_essential_genes}->{$media})) {  
                 $self->{_essential_genes}->{$media} = undef;  
                 if (-e $self->directory()."EssentialGenes-".$self->id().$self->selected_version()."-".$media.".tbl") {  
                         $self->{_essential_genes}->{$media} = $self->figmodel()->database()->load_single_column_file($self->directory()."EssentialGenes-".$self->id().$self->selected_version()."-".$media.".tbl","");  
726                  }                  }
727          }          return undef;
   
         return $self->{_essential_genes}->{$media};  
728  }  }
729    
730  =head3 compound_table  =head3 compound_table
# Line 667  Line 737 
737          my ($self) = @_;          my ($self) = @_;
738    
739          if (!defined($self->{_compound_table})) {          if (!defined($self->{_compound_table})) {
740                  $self->{_compound_table} = $self->figmodel()->database()->GetDBModelCompounds($self->id());                  $self->{_compound_table} = $self->create_table_prototype("ModelCompounds");
741                    #Loading the reactions
742                    my $ReactionTable = $self->figmodel()->database()->get_table("REACTIONS");
743                    my $BiomassTable = $self->figmodel()->database()->get_table("BIOMASS");
744                    #Loading the model
745                    my $ModelTable = $self->reaction_table();
746                    #Checking that the tables were loaded
747                    if (!defined($ModelTable) || !defined($ReactionTable)) {
748                            return undef;
749                    }
750                    #Finding the biomass reaction
751                    for (my $i=0; $i < $ModelTable->size(); $i++) {
752                            my $ID = $ModelTable->get_row($i)->{"LOAD"}->[0];
753                            my $Row = $ReactionTable->get_row_by_key($ID,"DATABASE");
754                            my $IsBiomass = 0;
755                            if (!defined($Row)) {
756                                    $Row = $BiomassTable->get_row_by_key($ID,"DATABASE");
757                                    $IsBiomass = 1;
758                            }
759                            if (defined($Row->{"EQUATION"}->[0])) {
760                                    $_ = $Row->{"EQUATION"}->[0];
761                                    my @OriginalArray = /(cpd\d\d\d\d\d[\[\w]*)/g;
762                                    foreach my $Compound (@OriginalArray) {
763                                            my $ID = substr($Compound,0,8);
764                                            my $NewRow = $self->{_compound_table}->get_row_by_key($ID,"DATABASE",1);
765                                            if ($IsBiomass == 1) {
766                                                    $self->{_compound_table}->add_data($NewRow,"BIOMASS",$Row->{"DATABASE"}->[0],1);
767                                            }
768                                            if (length($Compound) > 8) {
769                                                    #print $Compound."\t".$Row->{"EQUATION"}->[0]."\t".$Row->{"DATABASE"}->[0]."\n";
770                                                    my $Compartment = substr($Compound,8,1);
771                                                    $self->{_compound_table}->add_data($NewRow,"COMPARTMENTS",$Compartment,1);
772                                                    $self->{_compound_table}->add_data($NewRow,"TRANSPORTERS",$Row->{"DATABASE"}->[0],1);
773                                            }
774                                    }
775                            }
776                    }
777          }          }
778    
779          return $self->{_compound_table};          return $self->{_compound_table};
# Line 787  Line 893 
893                  }                  }
894                  my $source = $self->source();                  my $source = $self->source();
895                  if ($source =~ /^MGRAST/) {                  if ($source =~ /^MGRAST/) {
896                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";                          $self->{_directory} = $self->figmodel()->config("mgrast model directory")->[0].$userdirectory.$self->genome()."/";
897                  } elsif ($source =~ /^RAST/) {                  } elsif ($source =~ /^RAST/) {
898                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";
899                  } elsif ($source =~ /^SEED/) {                  } elsif ($source =~ /^SEED/) {
# Line 928  Line 1034 
1034  }  }
1035    
1036  sub autocompleteMedia {  sub autocompleteMedia {
1037          my ($self) = @_;          my ($self,$newMedia) = @_;
1038          return $self->{_data}->autoCompleteMedia();          return $self->{_data}->autoCompleteMedia($newMedia);
1039    }
1040    
1041    sub biomassReaction {
1042            my ($self,$newBiomass) = @_;
1043            if (!defined($newBiomass)) {
1044                    return $self->{_data}->biomassReaction();
1045            } else {
1046                    #Figuring out what the old biomass is
1047                    my $oldBiomass = $self->{_data}->biomassReaction();
1048                    if ($newBiomass ne $oldBiomass) {
1049                            #Figuring out if the new biomass exists
1050                            my $handle = $self->database()->get_object_manager("bof");
1051                            my $objects = $handle->get_objects({"DATABASE" => [$newBiomass]});
1052                            if (!defined($objects) || !defined($objects->[0])) {
1053                                    print STDERR "Could not find new biomass reaction ".$newBiomass."\n";
1054                                    return $oldBiomass;
1055                            }
1056                            #Changing the biomass reaction in the model file
1057                            my $rxnTbl = $self->reaction_table();
1058                            for (my $i=0; $i < $rxnTbl->size(); $i++) {
1059                                    my $row = $rxnTbl->get_row($i);
1060                                    if ($row->{LOAD}->[0] =~ m/^bio/) {
1061                                            $row->{LOAD}->[0] = $newBiomass;
1062                                    }
1063                            }
1064                            $rxnTbl->save();
1065                            #Changing the biomass reaction in the database
1066                            return  $self->{_data}->biomassReaction($newBiomass);
1067                    }
1068            }
1069  }  }
1070    
1071  =head3 taxonomy  =head3 taxonomy
# Line 1015  Line 1151 
1151    
1152          #Assuming complete media if none is provided          #Assuming complete media if none is provided
1153          if (!defined($Media)) {          if (!defined($Media)) {
1154                  $Media = "Complete";                  $Media = $self->autocompleteMedia();
1155          }          }
1156    
1157          #Predicting essentiality          #Predicting essentiality
1158          my $result = $self->figmodel()->RunFBASimulation($self->id(),"SINGLEKO",undef,undef,[$self->id()],[$Media]);          my $result = $self->figmodel()->RunFBASimulation($self->id(),"SINGLEKO",undef,undef,[$self->id()],[$Media]);
1159          #Checking that the table is defined and the output file exists          #Checking that the table is defined and the output file exists
1160          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {
1161                  $self->figmodel()->database()->print_array_to_file($self->directory()."EssentialGenes-".$self->id()."-".$Media.".tbl",[join("\n",@{$result->get_row(0)->{"ESSENTIALGENES"}})]);                  my $tbl = $self->essentials_table();
1162                    my $row = $tbl->get_row_by_key($Media,"MEDIA",1);
1163                    $row->{"ESSENTIAL GENES"} = $result->get_row(0)->{"ESSENTIALGENES"};
1164                    $tbl->save();
1165          } else {          } else {
1166                  $self->figmodel()->error_message("FIGMODELmodel:run_default_model_predictions:could not identify essential reactions for model ".$self->id().$self->selected_version().".");                  $self->figmodel()->error_message("FIGMODELmodel:run_default_model_predictions:could not identify essential reactions for model ".$self->id().$self->selected_version().".");
1167                  return $self->figmodel()->fail();                  return $self->figmodel()->fail();
# Line 1051  Line 1190 
1190          $self->{_data}->modificationDate(time());          $self->{_data}->modificationDate(time());
1191          my $version = $self->{_data}->autocompleteVersion();          my $version = $self->{_data}->autocompleteVersion();
1192          $self->{_data}->autocompleteVersion($version+1);          $self->{_data}->autocompleteVersion($version+1);
1193            $self->update_model_stats();
1194  }  }
1195    
1196  =head3 update_stats_for_build  =head3 update_stats_for_build
# Line 1132  Line 1272 
1272          #Setting the reaction count          #Setting the reaction count
1273          $self->{_data}->reactions($rxntbl->size());          $self->{_data}->reactions($rxntbl->size());
1274          #Setting the metabolite count          #Setting the metabolite count
1275          $self->{_data}->compounds($rxntbl->size());          $self->{_data}->compounds($cpdtbl->size());
1276          #Setting the gene count          #Setting the gene count
1277          my $geneCount = @genes + @othergenes;          my $geneCount = @genes + @othergenes;
1278          $self->{_data}->associatedGenes($geneCount);          $self->{_data}->associatedGenes($geneCount);
# Line 1200  Line 1340 
1340          }          }
1341    
1342          #Calling the MFAToolkit to run the gap filling optimization          #Calling the MFAToolkit to run the gap filling optimization
1343          my $MinimalMediaTable = $self->figmodel()->database()->GetDBTable("MINIMAL MEDIA TABLE");          my $Media = $self->autocompleteMedia();
1344          my $Media = "Complete";          if ($Media eq "Complete") {
1345          if (defined($MinimalMediaTable->get_row_by_key($self->genome(),"Organism"))) {                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef));
1346                  $Media = $MinimalMediaTable->get_row_by_key($self->genome(),"Organism")->{"Minimal media"}->[0];          } else {
1347                  #Loading media, changing bounds, saving media as a test media                  #Loading media, changing bounds, saving media as a test media
1348                  my $MediaTable = FIGMODELTable::load_table($self->config("Media directory")->[0].$Media.".txt",";","",0,["VarName"]);                  my $MediaTable = FIGMODELTable::load_table($self->config("Media directory")->[0].$Media.".txt",";","",0,["VarName"]);
1349                  for (my $i=0; $i < $MediaTable->size(); $i++) {                  for (my $i=0; $i < $MediaTable->size(); $i++) {
# Line 1215  Line 1355 
1355                          }                          }
1356                  }                  }
1357                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1358                    #print $self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$UniqueFilename."TestMedia",["GapFilling"],{"Default max drain flux" => 0,"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef)."\n";
1359                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$UniqueFilename."TestMedia",["GapFilling"],{"Default max drain flux" => 0,"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef));                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$UniqueFilename."TestMedia",["GapFilling"],{"Default max drain flux" => 0,"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef));
1360                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
         } else {  
                 system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef));  
1361          }          }
1362    
1363          #Parse the solutions file for the model and get the reaction list from it          #Parse the solutions file for the model and get the reaction list from it
# Line 1231  Line 1370 
1370                  $self->figmodel()->error_message("FIGMODEL:GapFillModel: Gap filling report not found!");                  $self->figmodel()->error_message("FIGMODEL:GapFillModel: Gap filling report not found!");
1371                  return $self->fail();                  return $self->fail();
1372          }          }
         $SolutionData->save("/home/chenry/Solution.txt");  
1373    
1374          #Looking for the last printed recursive MILP solution          #Looking for the last printed recursive MILP solution
1375          for (my $i=($SolutionData->size()-1); $i >=0; $i--) {          for (my $i=($SolutionData->size()-1); $i >=0; $i--) {
# Line 1273  Line 1411 
1411          #Determining why each gap filling reaction was added          #Determining why each gap filling reaction was added
1412          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);
1413          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
                 $self->figmodel()->AddBiologTransporters($self->id());  
1414                  if ($self->id() !~ m/MGRast/) {                  if ($self->id() !~ m/MGRast/) {
1415                          $self->update_stats_for_gap_filling($ElapsedTime);                          $self->update_stats_for_gap_filling($ElapsedTime);
1416                  }                  }
# Line 1297  Line 1434 
1434  =cut  =cut
1435    
1436  sub calculate_model_changes {  sub calculate_model_changes {
1437          my ($self,$originalReactions,$cause) = @_;          my ($self,$originalReactions,$cause,$tbl,$version) = @_;
1438          my $modTime = time();          my $modTime = time();
1439          my $version = $self->selected_version();          if (!defined($version)) {
1440                    $version = $self->selected_version();
1441            }
1442          my $user = $self->figmodel()->user();          my $user = $self->figmodel()->user();
1443          #Getting the history table          #Getting the history table
1444          my $histTbl = $self->model_history();          my $histTbl = $self->model_history();
1445          #Checking for differences          #Checking for differences
1446          my $tbl = $self->reaction_table();          if (!defined($tbl)) {
1447                    $tbl = $self->reaction_table();
1448            }
1449          for (my $i=0; $i < $tbl->size(); $i++) {          for (my $i=0; $i < $tbl->size(); $i++) {
1450                  my $row = $tbl->get_row($i);                  my $row = $tbl->get_row($i);
1451                  my $orgRow = $originalReactions->get_row_by_key($row->{LOAD}->[0],"LOAD");                  my $orgRow = $originalReactions->get_row_by_key($row->{LOAD}->[0],"LOAD");
# Line 1318  Line 1459 
1459                          }                          }
1460                          for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {                          for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1461                                  my $match = 0;                                  my $match = 0;
1462                                    if (defined($orgRow->{"ASSOCIATED PEG"})) {
1463                                  for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {                                  for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1464                                          if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {                                          if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1465                                                  $match = 1;                                                  $match = 1;
1466                                          }                                          }
1467                                  }                                  }
1468                                    }
1469                                  if ($match == 0) {                                  if ($match == 0) {
1470                                          push(@{$geneChanges},"Added ".$row->{"ASSOCIATED PEG"}->[$j]);                                          push(@{$geneChanges},"Added ".$row->{"ASSOCIATED PEG"}->[$j]);
1471                                  }                                  }
1472                          }                          }
1473                            if (defined($orgRow->{"ASSOCIATED PEG"})) {
1474                          for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {                          for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1475                                  my $match = 0;                                  my $match = 0;
1476                                            if (defined($row->{"ASSOCIATED PEG"})) {
1477                                  for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {                                  for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1478                                          if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {                                          if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1479                                                  $match = 1;                                                  $match = 1;
1480                                          }                                          }
1481                                  }                                  }
1482                                            }
1483                                  if ($match == 0) {                                  if ($match == 0) {
1484                                          push(@{$geneChanges},"Removed ".$orgRow->{"ASSOCIATED PEG"}->[$k]);                                          push(@{$geneChanges},"Removed ".$orgRow->{"ASSOCIATED PEG"}->[$k]);
1485                                  }                                  }
1486                          }                          }
1487                            }
1488                          if ((defined($directionChange) && length($directionChange) > 0) || defined($geneChanges) && @{$geneChanges} > 0) {                          if ((defined($directionChange) && length($directionChange) > 0) || defined($geneChanges) && @{$geneChanges} > 0) {
1489                                  $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => [$directionChange], GeneChange => $geneChanges, Action => ["CHANGE"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});                                  $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => [$directionChange], GeneChange => $geneChanges, Action => ["CHANGE"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1490                          }                          }
# Line 1667  Line 1814 
1814                  $self->set_status(0,"Preliminary reconstruction");                  $self->set_status(0,"Preliminary reconstruction");
1815          }          }
1816          #Sorting GenomeData by gene location on the chromosome          #Sorting GenomeData by gene location on the chromosome
1817            my $ftrTbl = $self->figmodel()->database()->get_table("ROLERXNMAPPING");
1818          $FeatureTable->sort_rows("MIN LOCATION");          $FeatureTable->sort_rows("MIN LOCATION");
1819          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);
1820          my %LastGenePosition;          my %LastGenePosition;
# Line 1738  Line 1886 
1886                          }                          }
1887                  }                  }
1888          }          }
   
1889          #Creating nonadjacent complexes          #Creating nonadjacent complexes
1890          my @ReactionList = keys(%{$ReactionHash});          my @ReactionList = keys(%{$ReactionHash});
1891          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
# Line 1844  Line 1991 
1991                  $NewModelTable->add_row({"LOAD" => [$ReactionID],"DIRECTIONALITY" => [$Directionality],"COMPARTMENT" => ["c"],"ASSOCIATED PEG" => [join("|",@{$ReactionHash->{$ReactionID}->{"GENES"}})],"SUBSYSTEM" => [$Subsystem],"CONFIDENCE" => [$ReactionHash->{$ReactionID}->{"CONFIDENCE"}->[0]],"REFERENCE" => [$Source],"NOTES" => ["NONE"]});                  $NewModelTable->add_row({"LOAD" => [$ReactionID],"DIRECTIONALITY" => [$Directionality],"COMPARTMENT" => ["c"],"ASSOCIATED PEG" => [join("|",@{$ReactionHash->{$ReactionID}->{"GENES"}})],"SUBSYSTEM" => [$Subsystem],"CONFIDENCE" => [$ReactionHash->{$ReactionID}->{"CONFIDENCE"}->[0]],"REFERENCE" => [$Source],"NOTES" => ["NONE"]});
1992          }          }
1993    
1994            #Getting feature rows for features that are lumped
1995            my @rows = $ftrTbl->get_rows_by_key("2","MASTER");
1996            for (my $i=0; $i < @rows; $i++) {
1997                    my $rxn = $rows[$i]->{REACTION}->[0];
1998                    my $role = $rows[$i]->{ROLE}->[0];
1999                    my @orgrows = $FeatureTable->get_rows_by_key($role,"ROLES");
2000                    my $genes;
2001                    for (my $j=0; $j < @orgrows; $j++) {
2002                            if ($orgrows[$j]->{ID}->[0] =~ m/(peg\.\d+)/) {
2003                                    push(@{$genes},$1);
2004                            }
2005                    }
2006                    if (defined($genes) && @{$genes} > 0) {
2007                            my $row = $NewModelTable->get_row_by_key($rxn,"LOAD");
2008                            my $newGeneAssociations;
2009                            for (my $k=0; $k < @{$genes}; $k++) {
2010                                    for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
2011                                            my $peg = $genes->[$k];
2012                                            if ($row->{"ASSOCIATED PEG"}->[$j] !~ m/$peg/) {
2013                                                    push(@{$newGeneAssociations},$row->{"ASSOCIATED PEG"}->[$j]."+".$peg);
2014                                            }
2015                                    }
2016                            }
2017                            $row->{"ASSOCIATED PEG"} = $newGeneAssociations;
2018                    }
2019            }
2020    
2021          #Adding the spontaneous and universal reactions          #Adding the spontaneous and universal reactions
2022          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {
2023                  #Getting the thermodynamic reversibility from the database                  #Getting the thermodynamic reversibility from the database
# Line 1900  Line 2074 
2074                  }                  }
2075          }          }
2076    
2077            #If an original model exists, we copy the gap filling solution from that model
2078            if (defined($OriginalModelTable)) {
2079                    for (my $i=0; $i < $OriginalModelTable->size(); $i++) {
2080                            if ($OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ && $OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] ne "INITIAL GAP FILLING") {
2081                                    my $Row = $NewModelTable->get_row_by_key($OriginalModelTable->get_row($i)->{"LOAD"}->[0],"LOAD");
2082                                    if (!defined($Row)) {
2083                                            $NewModelTable->add_row($OriginalModelTable->get_row($i));
2084                                    }
2085                            }
2086                    }
2087            }
2088    
2089          #Now we compare the model to the previous model to determine if any differences exist that aren't gap filling reactions          #Now we compare the model to the previous model to determine if any differences exist that aren't gap filling reactions
2090          if (defined($OriginalModelTable)) {          if (defined($OriginalModelTable)) {
2091                  my $PerfectMatch = 1;                  my $PerfectMatch = 1;
# Line 1984  Line 2170 
2170    
2171  sub CreateMetaGenomeReactionList {  sub CreateMetaGenomeReactionList {
2172          my ($self) = @_;          my ($self) = @_;
   
2173          #Checking if the metagenome file exists          #Checking if the metagenome file exists
2174          if (!-e $self->config("raw MGRAST directory")->[0].$self->genome().".summary") {          if (!-e $self->config("raw MGRAST directory")->[0].$self->genome().".summary") {
2175                  $self->error_message("FIGMODEL:CreateMetaGenomeReactionList: could not find raw data file for metagenome ".$self->genome());                  $self->error_message("FIGMODEL:CreateMetaGenomeReactionList: could not find raw data file for metagenome ".$self->genome());
2176                    return $self->fail();
2177          }          }
2178          #Loading metagenome data          #Loading metagenome data
2179          my $MGRASTData = $self->figmodel()->database()->load_multiple_column_file($self->config("raw MGRAST directory")->[0].$self->genome().".summary","\t");          my $MGRASTData = $self->figmodel()->database()->load_multiple_column_file($self->config("raw MGRAST directory")->[0].$self->genome().".summary","\t");
2180          if (!defined($MGRASTData)) {          if (!defined($MGRASTData)) {
2181                  $self->error_message("FIGMODEL:CreateMetaGenomeReactionList: could not find raw data file for metagenome ".$self->genome());                  $self->error_message("FIGMODEL:CreateMetaGenomeReactionList: could not find raw data file for metagenome ".$self->genome());
2182                    return $self->fail();
2183          }          }
   
2184          #Setting up needed variables          #Setting up needed variables
2185          my $OriginalModelTable = undef;          my $OriginalModelTable = undef;
   
2186          #Checking status          #Checking status
2187          if ($self->status() < 0) {          if ($self->status() < 0) {
2188                  $self->set_status(0,"Preliminary reconstruction");                  $self->set_status(0,"Preliminary reconstruction");
# Line 2009  Line 2194 
2194                  $self->ArchiveModel();                  $self->ArchiveModel();
2195                  $self->set_status(0,"Rebuilding preliminary reconstruction");                  $self->set_status(0,"Rebuilding preliminary reconstruction");
2196          }          }
2197            #Creating a hash of escores and pegs associated with each role
2198            my $rolePegHash;
2199            my $roleEscores;
2200            for (my $i=0; $i < @{$MGRASTData};$i++) {
2201                    #MD5,PEG,number of sims,role,sim e-scores,max escore,min escore,ave escore,stdev escore,ave exponent,stddev exponent
2202                    $rolePegHash->{$MGRASTData->[$i]->[3]}->{substr($MGRASTData->[$i]->[1],4)} = 1;
2203                    push(@{$roleEscores->{$MGRASTData->[$i]->[3]}},split(/;/,$MGRASTData->[$i]->[4]));
2204            }
2205          #Getting the reaction table          #Getting the reaction table
2206          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          my $ReactionTable = $self->figmodel()->database()->get_table("REACTIONS");
2207          #Creating model table          #Creating model table
2208          my $ModelTable = FIGMODELTable->new(["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG","SUBSYSTEM","CONFIDENCE","REFERENCE","NOTES"],$self->directory().$self->id().".txt",["LOAD"],";","|","REACTIONS\n");          my $ModelTable = $self->create_table_prototype("ModelReactions");
2209          for (my $i=0; $i < @{$MGRASTData};$i++) {          print $ModelTable->filename();
2210                  #MD5,PEG,number of sims,role,sim e-scores          my @roles = keys(%{$rolePegHash});
2211                  my $Role = $MGRASTData->[$i]->[3];          for (my $i=0; $i < @roles; $i++) {
2212                  my $MD5 = $MGRASTData->[$i]->[0];                  my $min = -1;
2213                  my $peg = $MGRASTData->[$i]->[1];                  my $max = -1;
2214                  my $sims = $MGRASTData->[$i]->[4];                  my $count = @{$roleEscores->{$roles[$i]}};
2215                  $sims =~ s/;/,/g;                  my $ave = 0;
2216                    my $stdev = 0;
2217                    my $aveexp = 0;
2218                    my $stdevexp = 0;
2219                    for (my $j=0; $j < @{$roleEscores->{$roles[$i]}}; $j++) {
2220                            if ($roleEscores->{$roles[$i]} < $min || $min == -1) {
2221                                    $min = $roleEscores->{$roles[$i]};
2222                            }
2223                            if ($roleEscores->{$roles[$i]} > $max || $max == -1) {
2224                                    $max = $roleEscores->{$roles[$i]};
2225                            }
2226                            $ave += $roleEscores->{$roles[$i]}->[$j];
2227                            if ($roleEscores->{$roles[$i]}->[$j] =~ m/e(-\d+$)/) {
2228                                    $aveexp += $1;
2229                            }
2230                    }
2231                    $ave = $ave/$count;
2232                    $aveexp = $aveexp/$count;
2233                    for (my $j=0; $j < @{$roleEscores->{$roles[$i]}}; $j++) {
2234                            $stdev += ($roleEscores->{$roles[$i]}->[$j]-$ave)*($roleEscores->{$roles[$i]}->[$j]-$ave);
2235                            if ($roleEscores->{$roles[$i]}->[$j] =~ m/e(-\d+$)/) {
2236                                    $stdevexp += ($1-$aveexp)*($1-$aveexp);
2237                            }
2238                    }
2239                    $stdev = sqrt($stdev/$count);
2240                    $stdevexp = sqrt($stdevexp/$count);
2241                  #Checking for subsystems                  #Checking for subsystems
2242                  my $GeneSubsystems = $self->figmodel()->subsystems_of_role($Role);                  my $GeneSubsystems = $self->figmodel()->subsystems_of_role($roles[$i]);
2243                  #Checking if there are reactions associated with this role                  #Checking if there are reactions associated with this role
2244                  my $ReactionHashArrayRef = $self->figmodel()->reactions_of_role($Role);                  my $ReactionHashArrayRef = $self->figmodel()->reactions_of_role($roles[$i]);
2245                  if ($ReactionHashArrayRef != 0) {                  if ($ReactionHashArrayRef != 0) {
2246                          foreach my $Mapping (@{$ReactionHashArrayRef}) {                          foreach my $Mapping (@{$ReactionHashArrayRef}) {
2247                                  if (defined($Mapping->{"REACTION"}) && defined($Mapping->{"MASTER"}) && defined($Mapping->{"SUBSYSTEM"}) && defined($Mapping->{"SOURCE"})) {                                  if (defined($Mapping->{"REACTION"}) && defined($Mapping->{"MASTER"}) && defined($Mapping->{"SUBSYSTEM"}) && defined($Mapping->{"SOURCE"})) {
# Line 2037  Line 2253 
2253                                                                  $ReactionRow = {"LOAD" => [$Mapping->{"REACTION"}->[0]],"DIRECTIONALITY" => [$self->figmodel()->reversibility_of_reaction($Mapping->{"REACTION"}->[0])],"COMPARTMENT" => ["c"]};                                                                  $ReactionRow = {"LOAD" => [$Mapping->{"REACTION"}->[0]],"DIRECTIONALITY" => [$self->figmodel()->reversibility_of_reaction($Mapping->{"REACTION"}->[0])],"COMPARTMENT" => ["c"]};
2254                                                                  $ModelTable->add_row($ReactionRow);                                                                  $ModelTable->add_row($ReactionRow);
2255                                                          }                                                          }
2256                                                          push(@{$ReactionRow->{"ASSOCIATED PEG"}},substr($peg,4));                                                          my %pegHash = %{$rolePegHash->{$roles[$i]}};
2257                                                          push(@{$ReactionRow->{"REFERENCE"}},$MD5.":".$Role);                                                          if (defined($ReactionRow->{"ASSOCIATED PEG"})) {
2258                                                          push(@{$ReactionRow->{"CONFIDENCE"}},$sims);                                                                  for (my $j=0; $j < @{$ReactionRow->{"ASSOCIATED PEG"}}; $j++) {
2259                                                                            $pegHash{$ReactionRow->{"ASSOCIATED PEG"}->[$j]} = 1;
2260                                                                    }
2261                                                            }
2262                                                            delete $ReactionRow->{"ASSOCIATED PEG"};
2263                                                            push(@{$ReactionRow->{"ASSOCIATED PEG"}},keys(%pegHash));
2264                                                            push(@{$ReactionRow->{"REFERENCE"}},$count.":".$ave.":".$stdev.":".$aveexp.":".$stdevexp.":".$min.":".$max);
2265                                                          if (defined($GeneSubsystems)) {                                                          if (defined($GeneSubsystems)) {
2266                                                                  push(@{$ReactionRow->{"SUBSYSTEM"}},@{$GeneSubsystems});                                                                  push(@{$ReactionRow->{"SUBSYSTEM"}},@{$GeneSubsystems});
2267                                                          }                                                          }
# Line 2487  Line 2709 
2709          my $fluxFilename = $outputDirectory."Fluxes-".$self->id()."-".$Media.".txt";          my $fluxFilename = $outputDirectory."Fluxes-".$self->id()."-".$Media.".txt";
2710          my $cpdFluxFilename = $outputDirectory."CompoundFluxes-".$self->id()."-".$Media.".txt";          my $cpdFluxFilename = $outputDirectory."CompoundFluxes-".$self->id()."-".$Media.".txt";
2711          #Running FBA          #Running FBA
2712            #print $self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version())."\n";
2713          system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version()));          system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version()));
2714          #Saving LP file if requested          #Saving LP file if requested
2715          if (defined($saveLPFile) && $saveLPFile == 1 && -e $self->figmodel()->{"MFAToolkit output directory"}->[0].$UniqueFilename."/CurrentProblem.lp") {          if (defined($saveLPFile) && $saveLPFile == 1 && -e $self->figmodel()->{"MFAToolkit output directory"}->[0].$UniqueFilename."/CurrentProblem.lp") {
2716                  system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/CurrentProblem.lp ".$self->figmodel()->config("SBML files")->[0].$self->id().".lp");                  system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/CurrentProblem.lp ".$self->directory().$self->id().".lp");
2717          }          }
2718          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);
2719          my $Result;          my $Result;
# Line 3849  Line 4072 
4072          my($self) = @_;          my($self) = @_;
4073    
4074          #Opening the SBML file for printing          #Opening the SBML file for printing
4075          my $Filename = $self->config("SBML files")->[0].$self->id().".xml";          my $Filename = $self->directory().$self->id().".xml";
         if ($self->owner() ne "master") {  
                 if (!-d $self->config("SBML files")->[0].$self->owner()."/") {  
                         system("mkdir ".$self->config("SBML files")->[0].$self->owner()."/");  
                 }  
                 $Filename = $self->config("SBML files")->[0].$self->owner()."/".$self->id().".xml";  
         }  
4076          if (!open (SBMLOUTPUT, ">$Filename")) {          if (!open (SBMLOUTPUT, ">$Filename")) {
4077                  return;                  return;
4078          }          }
4079    
4080          #Loading and parsing the model data          #Loading and parsing the model data
4081          my $ModelTable = $self->reaction_table();          my $mdlTbl = $self->reaction_table();
4082          if (!defined($ModelTable) || !defined($ModelTable->{"array"})) {          if (!defined($mdlTbl) || !defined($mdlTbl->{"array"})) {
4083                  print "Failed to load ".$self->id()."\n";                  return $self->fail();
                 return;  
4084          }          }
4085            my $rxnTbl = $self->figmodel()->database()->get_table("REACTIONS");
4086            my $bioTbl = $self->figmodel()->database()->get_table("BIOMASS");
4087            my $cpdTbl = $self->figmodel()->database()->get_table("COMPOUNDS");
4088            my $cmpTbl = $self->figmodel()->database()->get_table("COMPARTMENTS");
4089    
4090          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash
4091          my $ExchangeHash = {"cpd11416" => "c"};          my $ExchangeHash = {"cpd11416" => "c"};
   
4092          my %CompartmentsPresent;          my %CompartmentsPresent;
4093          $CompartmentsPresent{"c"} = 1;          $CompartmentsPresent{"c"} = 1;
4094          my %CompoundList;          my %CompoundList;
4095          my @ReactionList;          my @ReactionList;
4096          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          for (my $i=0; $i < $mdlTbl->size(); $i++) {
4097          for (my $i=0; $i < $ModelTable->size(); $i++) {                  my $Reaction = $mdlTbl->get_row($i)->{"LOAD"}->[0];
4098                  my $Reaction = $ModelTable->get_row($i)->{"LOAD"}->[0];                  my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4099                  if (defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")) && defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0])) {                  if (!defined($row)) {
4100                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4101                            if (!defined($row)) {
4102                                    next;
4103                            }
4104                    }
4105                    if (!defined($row->{"EQUATION"}->[0])) {
4106                            next;
4107                    }
4108                          push(@ReactionList,$Reaction);                          push(@ReactionList,$Reaction);
4109                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
4110                          my @MatchArray = /(cpd\d\d\d\d\d)/g;                          my @MatchArray = /(cpd\d\d\d\d\d)/g;
4111                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
4112                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;
4113                          }                          }
4114                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
4115                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;
4116                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
4117                                  if ($MatchArray[$j] =~ m/(cpd\d\d\d\d\d)\[(\D)\]/) {                                  if ($MatchArray[$j] =~ m/(cpd\d\d\d\d\d)\[(\D)\]/) {
# Line 3893  Line 4120 
4120                                  }                                  }
4121                          }                          }
4122                  }                  }
         }  
4123    
4124          #Printing header to SBML file          #Printing header to SBML file
4125          my $ModelName = $self->id();          my $ModelName = $self->id().$self->selected_version();
4126          $ModelName =~ s/\./_/;          $ModelName =~ s/\./_/;
4127          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";
4128      print SBMLOUTPUT '<sbml xmlns="http://www.sbml.org/sbml/level2" level="2" version="1" xmlns:html="http://www.w3.org/1999/xhtml">' . "\n";      print SBMLOUTPUT '<sbml xmlns="http://www.sbml.org/sbml/level2" level="2" version="1" xmlns:html="http://www.w3.org/1999/xhtml">' . "\n";
4129      if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Organism name"}->[0])) {          if (defined($self->name())) {
4130          print SBMLOUTPUT '<model id="'.$ModelName.'" name="'.$self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Organism name"}->[0].' SEED model">'."\n";                  print SBMLOUTPUT '<model id="'.$ModelName.'" name="'.$self->name().' SEED model">'."\n";
4131      } else {      } else {
4132          print SBMLOUTPUT '<model id="'.$ModelName.'" name="'.$self->id().' SEED model">'."\n";                  print SBMLOUTPUT '<model id="'.$ModelName.'" name="'.$self->id().$self->selected_version().' SEED model">'."\n";
4133      }      }
4134    
4135          #Printing the unit data          #Printing the unit data
# Line 3920  Line 4146 
4146      #Printing compartments for SBML file      #Printing compartments for SBML file
4147      print SBMLOUTPUT '<listOfCompartments>'."\n";      print SBMLOUTPUT '<listOfCompartments>'."\n";
4148      foreach my $Compartment (keys(%CompartmentsPresent)) {      foreach my $Compartment (keys(%CompartmentsPresent)) {
4149          if (defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0])) {                  my $row = $cmpTbl->get_row_by_key($Compartment,"Abbreviation");
4150                  my @OutsideList = split(/\//,$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Outside"}->[0]);                  if (!defined($row) && !defined($row->{"Name"}->[0])) {
4151                            next;
4152                    }
4153                    my @OutsideList = split(/\//,$row->{"Outside"}->[0]);
4154                  my $Printed = 0;                  my $Printed = 0;
4155                  foreach my $Outside (@OutsideList) {                  foreach my $Outside (@OutsideList) {
4156                                  if (defined($CompartmentsPresent{$Outside}) && defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Outside}->[0]->{"Name"}->[0])) {                          if (defined($CompartmentsPresent{$Outside}) && defined($row->{"Name"}->[0])) {
4157                                  print SBMLOUTPUT '<compartment id="'.$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0].'" outside="'.$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Outside}->[0]->{"Name"}->[0].'"/>'."\n";                                  print SBMLOUTPUT '<compartment id="'.$row->{"Name"}->[0].'" outside="'.$row->{"Name"}->[0].'"/>'."\n";
4158                                  $Printed = 1;                                  $Printed = 1;
4159                                  last;                                  last;
4160                          }                          }
4161                  }                  }
4162                  if ($Printed eq 0) {                  if ($Printed eq 0) {
4163                          print SBMLOUTPUT '<compartment id="'.$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0].'"/>'."\n";                          print SBMLOUTPUT '<compartment id="'.$row->{"Name"}->[0].'"/>'."\n";
                         }  
4164          }          }
4165      }      }
4166      print SBMLOUTPUT '</listOfCompartments>'."\n";      print SBMLOUTPUT '</listOfCompartments>'."\n";
# Line 3940  Line 4168 
4168      #Printing the list of metabolites involved in the model      #Printing the list of metabolites involved in the model
4169          print SBMLOUTPUT '<listOfSpecies>'."\n";          print SBMLOUTPUT '<listOfSpecies>'."\n";
4170      foreach my $Compound (keys(%CompoundList)) {      foreach my $Compound (keys(%CompoundList)) {
4171                    my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4172                    if (!defined($row)) {
4173                            next;
4174                    }
4175          my $Name = $Compound;          my $Name = $Compound;
4176                  my $Formula = "";                  my $Formula = "";
4177                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  if (defined($row->{"FORMULA"}->[0])) {
4178                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                          $Formula = $row->{"FORMULA"}->[0];
4179                  }                  }
4180                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4181                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4182                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4183                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4184                  }                  }
4185                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4186                  my $Charge = 0;                  my $Charge = 0;
4187                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4188                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4189                  }                  }
4190                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {
4191                  if ($Compartment eq "e") {                  if ($Compartment eq "e") {
4192                          $ExchangeHash->{$Compound} = "e";                          $ExchangeHash->{$Compound} = "e";
4193                  }                  }
4194                  print SBMLOUTPUT '<species id="'.$Compound.'_'.$Compartment.'" name="'.$Name.'" compartment="'.$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0].'" charge="'.$Charge.'" boundaryCondition="false"/>'."\n";                          my $cmprow = $cmpTbl->get_row_by_key($Compartment,"Abbreviation");
4195                            print SBMLOUTPUT '<species id="'.$Compound.'_'.$Compartment.'" name="'.$Name.'" compartment="'.$cmprow->{"Name"}->[0].'" charge="'.$Charge.'" boundaryCondition="false"/>'."\n";
4196          }          }
4197      }      }
4198    
4199          #Printing the boundary species          #Printing the boundary species
4200          foreach my $Compound (keys(%{$ExchangeHash})) {          foreach my $Compound (keys(%{$ExchangeHash})) {
4201                  my $Name = $Compound;                  my $Name = $Compound;
4202                  my $Formula = "";                  my $Formula = "";
4203                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4204                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                  if (!defined($row)) {
4205                            next;
4206                    }
4207                    if (defined($row->{"FORMULA"}->[0])) {
4208                            $Formula = $row->{"FORMULA"}->[0];
4209                  }                  }
4210                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4211                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4212                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4213                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4214                  }                  }
4215                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4216                  my $Charge = 0;                  my $Charge = 0;
4217                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4218                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4219                  }                  }
4220                  print SBMLOUTPUT '<species id="'.$Compound.'_b" name="'.$Name.'" compartment="Extracellular" charge="'.$Charge.'" boundaryCondition="true"/>'."\n";                  print SBMLOUTPUT '<species id="'.$Compound.'_b" name="'.$Name.'" compartment="Extracellular" charge="'.$Charge.'" boundaryCondition="true"/>'."\n";
4221          }          }
# Line 3986  Line 4224 
4224      #Printing the list of reactions involved in the model      #Printing the list of reactions involved in the model
4225          my $ObjectiveCoef;          my $ObjectiveCoef;
4226      print SBMLOUTPUT '<listOfReactions>'."\n";      print SBMLOUTPUT '<listOfReactions>'."\n";
4227    
4228          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
4229          $ObjectiveCoef = "0.0";          $ObjectiveCoef = "0.0";
4230                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"EQUATION"}->[0])) {                  my $mdlrow = $mdlTbl->get_row_by_key($Reaction,"LOAD");
4231                    my $Reaction = $mdlrow->{"LOAD"}->[0];
4232                    my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4233                    if (!defined($row)) {
4234                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4235                            if (!defined($row)) {
4236                                    next;
4237                            }
4238                    }
4239                    if (!defined($row->{"EQUATION"}->[0])) {
4240                            next;
4241                    }
4242                  if ($Reaction =~ m/^bio/) {                  if ($Reaction =~ m/^bio/) {
4243                                  $ObjectiveCoef = "1.0";                                  $ObjectiveCoef = "1.0";
4244                          }                          }
4245                          my $LowerBound = -10000;                          my $LowerBound = -10000;
4246                  my $UpperBound = 10000;                  my $UpperBound = 10000;
4247                          my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateData($Reaction);                  my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateDataFromEquation($row->{"EQUATION"}->[0]);
4248                  my $Name = $Reaction;                  my $Name = $Reaction;
4249                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4250                          $Name = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4251                                  $Name =~ s/[<>;&]//g;                                  $Name =~ s/[<>;&]//g;
4252                  }                  }
4253                  my $Reversibility = "true";                  my $Reversibility = "true";
4254                  if (defined($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0])) {                  if (defined($mdlrow->{"DIRECTIONALITY"}->[0])) {
4255                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] ne "<=>") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] ne "<=>") {
4256                                  $LowerBound = 0;                                  $LowerBound = 0;
4257                                          $Reversibility = "false";                                          $Reversibility = "false";
4258                          }                          }
4259                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] eq "<=") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] eq "<=") {
4260                                  my $Temp = $Products;                                  my $Temp = $Products;
4261                                  $Products = $Reactants;                                  $Products = $Reactants;
4262                                  $Reactants = $Temp;                                  $Reactants = $Temp;
# Line 4015  Line 4265 
4265                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";
4266                          print SBMLOUTPUT "<notes>\n";                          print SBMLOUTPUT "<notes>\n";
4267                          my $ECData = "";                          my $ECData = "";
4268                          if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0])) {                  if (defined($row->{"ENZYME"}->[0])) {
4269                                  $ECData = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0];                          $ECData = $row->{"ENZYME"}->[0];
4270                          }                          }
4271                          my $SubsystemData = "";                          my $SubsystemData = "";
4272                          if (defined($ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0])) {                  if (defined($mdlrow->{"SUBSYSTEM"}->[0])) {
4273                                  $SubsystemData = $ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0];                          $SubsystemData = $mdlrow->{"SUBSYSTEM"}->[0];
4274                          }                          }
4275                          my $GeneAssociation = "";                          my $GeneAssociation = "";
4276                          my $ProteinAssociation = "";                          my $ProteinAssociation = "";
4277                          if (defined($ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0])) {                  if (defined($mdlrow->{"ASSOCIATED PEG"}->[0])) {
4278                                  if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} == 1 && $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {                          if (@{$mdlrow->{"ASSOCIATED PEG"}} == 1 && $mdlrow->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {
4279                                          $GeneAssociation = $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0];                                  $GeneAssociation = $mdlrow->{"ASSOCIATED PEG"}->[0];
4280                                  } else {                                  } else {
4281                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4282                                                  $GeneAssociation = "( ";                                                  $GeneAssociation = "( ";
4283                                          }                                          }
4284                                          for (my $i=0; $i < @{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}}; $i++) {                                  for (my $i=0; $i < @{$mdlrow->{"ASSOCIATED PEG"}}; $i++) {
4285                                                  if ($i > 0) {                                                  if ($i > 0) {
4286                                                          $GeneAssociation .= " )  or  ( ";                                                          $GeneAssociation .= " )  or  ( ";
4287                                                  }                                                  }
4288                                                  $GeneAssociation .= $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[$i];                                          $GeneAssociation .= $mdlrow->{"ASSOCIATED PEG"}->[$i];
4289                                          }                                          }
4290                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4291                                                  $GeneAssociation .= " )";                                                  $GeneAssociation .= " )";
4292                                          }                                          }
4293                                  }                                  }
# Line 4046  Line 4296 
4296                                          $GeneAssociation = "( ".$GeneAssociation." )";                                          $GeneAssociation = "( ".$GeneAssociation." )";
4297                                  }                                  }
4298                                  $ProteinAssociation = $GeneAssociation;                                  $ProteinAssociation = $GeneAssociation;
4299                                  if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Genome ID"}->[0])) {                          if (defined($self->genome())) {
4300                                          $ProteinAssociation = $self->figmodel()->translate_gene_to_protein($ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0],$self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Genome ID"}->[0]);                                  $ProteinAssociation = $self->figmodel()->translate_gene_to_protein($mdlrow->{"ASSOCIATED PEG"}->[0],$self->genome());
4301                                  }                                  }
4302                          }                          }
4303                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";
# Line 4078  Line 4328 
4328              print SBMLOUTPUT "</kineticLaw>\n";              print SBMLOUTPUT "</kineticLaw>\n";
4329                          print SBMLOUTPUT '</reaction>'."\n";                          print SBMLOUTPUT '</reaction>'."\n";
4330                  }                  }
         }  
4331    
4332          my @ExchangeList = keys(%{$ExchangeHash});          my @ExchangeList = keys(%{$ExchangeHash});
4333          foreach my $ExCompound (@ExchangeList) {          foreach my $ExCompound (@ExchangeList) {
4334                  my $ExCompoundName = $ExCompound;                  my $ExCompoundName = $ExCompound;
4335                  my $Row = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->get_row_by_key($ExCompound,"DATABASE");                  my $Row = $cpdTbl->get_row_by_key($ExCompound,"DATABASE");
4336                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {
4337                          $ExCompoundName = $Row->{"NAME"}->[0];                          $ExCompoundName = $Row->{"NAME"}->[0];
4338                          $ExCompoundName =~ s/[<>;&]//g;                          $ExCompoundName =~ s/[<>;&]//g;
# Line 4140  Line 4389 
4389                  $tbl->add_row($row);                  $tbl->add_row($row);
4390          }          }
4391          $tbl->save();          $tbl->save();
         system("cp ".$tbl->filename()." ".$self->figmodel()->config("Model table download directory")->[0].$self->figmodel()->config("ModelSimpleReactionTable")->{filename_prefix}->[0]."-".$self->id().".txt");  
4392  }  }
4393    
4394  =head3 PrintModelLPFile  =head3 PrintModelLPFile
# Line 4469  Line 4717 
4717          }          }
4718  }  }
4719    
4720    =pod
4721    
4722    =item * [string]:I<list of essential genes> = B<run_geneKO_slow> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4723    
4724    =cut
4725    
4726    sub run_geneKO_slow {
4727            my ($self,$media,$maxGrowth,$save) = @_;
4728            my $output;
4729            my $UniqueFilename = $self->figmodel()->filename();
4730            if (defined($maxGrowth) && $maxGrowth == 1) {
4731                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$media,["ProductionMFA"],{"perform single KO experiments" => 1,"MFASolver" => "GLPK","Constrain objective to this fraction of the optimal value" => 0.999},"SlowGeneKO-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,$self->selected_version()));
4732            } else {
4733                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$media,["ProductionMFA"],{"perform single KO experiments" => 1,"MFASolver" => "GLPK","Constrain objective to this fraction of the optimal value" => 0.1},"SlowGeneKO-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,$self->selected_version()));
4734            }
4735            if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt") {
4736                    print "Deletion study file not found!.\n";
4737                    return undef;
4738            }
4739            my $deltbl = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt",";","|",1,["Experiment"]);
4740            for (my $i=0; $i < $deltbl->size(); $i++) {
4741                    my $row = $deltbl->get_row($i);
4742                    if ($row->{"Insilico growth"}->[0] < 0.0000001) {
4743                            push(@{$output},$row->{Experiment}->[0]);
4744                    }
4745            }
4746            if (defined($output)) {
4747                    if (defined($save) && $save == 1) {
4748                            my $tbl = $self->essentials_table();
4749                            my $row = $tbl->get_row_by_key($media,"MEDIA",1);
4750                            $row->{"ESSENTIAL GENES"} = $output;
4751                            $tbl->save();
4752                    }
4753            }
4754            return $output;
4755    }
4756    
4757    =pod
4758    
4759    =item * [string]:I<list of minimal genes> = B<run_gene_minimization> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4760    
4761    =cut
4762    
4763    sub run_gene_minimization {
4764            my ($self,$media,$maxGrowth,$save) = @_;
4765            my $output;
4766    
4767            #Running the MFAToolkit
4768            my $UniqueFilename = $self->figmodel()->filename();
4769            if (defined($maxGrowth) && $maxGrowth == 1) {
4770                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$media,["ProductionMFA"],{"optimize organism genes" => 1,"MFASolver" => "CPLEX","Constrain objective to this fraction of the optimal value" => 0.999},"MinimizeGenes-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,$self->selected_version()));
4771            } else {
4772                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$media,["ProductionMFA"],{"optimize organism genes" => 1,"MFASolver" => "CPLEX","Constrain objective to this fraction of the optimal value" => 0.1},"MinimizeGenes-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,$self->selected_version()));
4773            }
4774            my $tbl = $self->figmodel()->LoadProblemReport($UniqueFilename);
4775            if (!defined($tbl)) {
4776                    return undef;
4777            }
4778            for (my $i=0; $i < $tbl->size(); $i++) {
4779                    my $row = $tbl->get_row($i);
4780                    if ($row->{Notes}->[0] =~ m/Recursive\sMILP\sGENE_USE\soptimization/) {
4781                            my @array = split(/\|/,$row->{Notes}->[0]);
4782                            my $solution = $array[0];
4783                            $_ = $solution;
4784                            my @OriginalArray = /(peg\.\d+)/g;
4785                            push(@{$output},@OriginalArray);
4786                            last;
4787                    }
4788            }
4789    
4790            if (defined($output)) {
4791                    if (defined($save) && $save == 1) {
4792                            my $tbl = $self->load_model_table("MinimalGenes");
4793                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4794                            if (defined($row)) {
4795                                    $row->{GENES} = $output;
4796                            } else {
4797                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4798                            }
4799                            $tbl->save();
4800                    }
4801            }
4802            return $output;
4803    }
4804    
4805    =pod
4806    
4807    =item * [string]:I<list of inactive genes> = B<identify_inactive_genes> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4808    
4809    =cut
4810    
4811    sub identify_inactive_genes {
4812            my ($self,$media,$maxGrowth,$save) = @_;
4813            my $output;
4814            #Running the MFAToolkit
4815            my $UniqueFilename = $self->figmodel()->filename();
4816            if (defined($maxGrowth) && $maxGrowth == 1) {
4817                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$media,["ProductionMFA"],{"find tight bounds" => 1,"MFASolver" => "GLPK","Constrain objective to this fraction of the optimal value" => 0.999},"Classify-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,$self->selected_version()));
4818            } else {
4819                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$media,["ProductionMFA"],{"find tight bounds" => 1,"MFASolver" => "GLPK","Constrain objective to this fraction of the optimal value" => 0.1},"Classify-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,$self->selected_version()));
4820            }
4821            #Reading in the output bounds file
4822            my $ReactionTB;
4823            if (-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt") {
4824                    $ReactionTB = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt",";","|",1,["DATABASE ID"]);
4825            }
4826            if (!defined($ReactionTB)) {
4827                    print STDERR "FIGMODEL:ClassifyModelReactions: Classification file not found when classifying reactions in ".$self->id().$self->selected_version()." with ".$media." media. Most likely the model did not grow.\n";
4828                    return undef;
4829            }
4830            #Clearing output
4831            $self->figmodel()->clearing_output($UniqueFilename,"Classify-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");
4832            my $geneHash;
4833            my $activeGeneHash;
4834            for (my $i=0; $i < $ReactionTB->size(); $i++) {
4835                    my $Row = $ReactionTB->get_row($i);
4836                    if (defined($Row->{"Min FLUX"}) && defined($Row->{"Max FLUX"}) && defined($Row->{"DATABASE ID"}) && $Row->{"DATABASE ID"}->[0] =~ m/rxn\d\d\d\d\d/) {
4837                            my $data = $self->get_reaction_data($Row->{"DATABASE ID"}->[0]);
4838                            if (defined($data->{"ASSOCIATED PEG"})) {
4839                                    my $active = 0;
4840                                    if ($Row->{"Min FLUX"}->[0] > 0.00000001 || $Row->{"Max FLUX"}->[0] < -0.00000001 || ($Row->{"Max FLUX"}->[0]-$Row->{"Min FLUX"}->[0]) > 0.00000001) {
4841                                            $active = 1;
4842                                    }
4843                                    for (my $j=0; $j < @{$data->{"ASSOCIATED PEG"}}; $j++) {
4844                                            $_ = $data->{"ASSOCIATED PEG"}->[$j];
4845                                            my @OriginalArray = /(peg\.\d+)/g;
4846                                            for (my $k=0; $k < @OriginalArray; $k++) {
4847                                                    if ($active == 1) {
4848                                                            $activeGeneHash->{$OriginalArray[$k]} = 1;
4849                                                    }
4850                                                    $geneHash->{$OriginalArray[$k]} = 1;
4851                                            }
4852                                    }
4853                            }
4854                    }
4855            }
4856            my @allGenes = keys(%{$geneHash});
4857            for (my $i=0; $i < @allGenes; $i++) {
4858                    if (!defined($activeGeneHash->{$allGenes[$i]})) {
4859                            push(@{$output},$allGenes[$i]);
4860                    }
4861            }
4862            if (defined($output)) {
4863                    if (defined($save) && $save == 1) {
4864                            my $tbl = $self->load_model_table("InactiveGenes");
4865                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4866                            if (defined($row)) {
4867                                    $row->{GENES} = $output;
4868                            } else {
4869                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4870                            }
4871                            $tbl->save();
4872                    }
4873            }
4874            return $output;
4875    }
4876    
4877    sub ConvertVersionsToHistoryFile {
4878            my ($self) = @_;
4879            my $vone = 0;
4880            my $vtwo = 0;
4881            my $continue = 1;
4882            my $lastTable;
4883            my $currentTable;
4884            my $cause;
4885            my $lastChanged = 0;
4886            my $noHitCount = 0;
4887            while ($continue == 1) {
4888                    $cause = "NONE";
4889                    $currentTable = undef;
4890                    if (-e $self->directory().$self->id()."V".($vone+1).".".$vtwo.".txt") {
4891                            $noHitCount = 0;
4892                            $lastChanged = 0;
4893                            $vone = $vone+1;
4894                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4895                            $cause = "RECONSTRUCTION";
4896                    } elsif (-e $self->directory().$self->id()."V".$vone.".".($vtwo+1).".txt") {
4897                            $noHitCount = 0;
4898                            $lastChanged = 0;
4899                            $vtwo = $vtwo+1;
4900                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4901                            $cause = "AUTOCOMPLETION";
4902                    } elsif ($lastChanged == 0) {
4903                            $lastChanged = 1;
4904                            $vone = $vone+1;
4905                            $cause = "RECONSTRUCTION";
4906                    } elsif ($lastChanged == 1) {
4907                            $lastChanged = 2;
4908                            $vone = $vone-1;
4909                            $vtwo = $vtwo+1;
4910                            $cause = "AUTOCOMPLETION";
4911                    } elsif ($lastChanged == 2) {
4912                            $lastChanged = 0;
4913                            $vone = $vone+1;
4914                            $cause = "RECONSTRUCTION";
4915                    }
4916                    if (defined($currentTable)) {
4917                            if (defined($lastTable)) {
4918                                    print $cause."\t".$self->directory().$self->id()."V".$vone.".".$vtwo.".txt\n";
4919                                    $self->calculate_model_changes($lastTable,$cause,$currentTable,"V".$vone.".".$vtwo);
4920                            }
4921                            $lastTable = $currentTable;
4922                    } else {
4923                            $noHitCount++;
4924                            if ($noHitCount >= 40) {
4925                                    last;
4926                            }
4927                    }
4928            }
4929    }
4930    
4931  1;  1;

Legend:
Removed from v.1.19  
changed lines
  Added in v.1.23

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3