[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.21, Sat Jul 10 22:43:52 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];
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];                  $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 184  Line 209 
209          return $self->{_data}->id();          return $self->{_data}->id();
210  }  }
211    
212    =head3 get_model_type
213    Definition:
214            string = FIGMODELmodel->get_model_type();
215    Description:
216            Returns the type of the model
217    =cut
218    sub get_model_type {
219            my ($self) = @_;
220            return $self->{_modeltype};
221    }
222    
223  =head3 owner  =head3 owner
224  Definition:  Definition:
225          string = FIGMODELmodel->owner();          string = FIGMODELmodel->owner();
# Line 352  Line 388 
388  =cut  =cut
389  sub get_reaction_data {  sub get_reaction_data {
390          my ($self,$reaction) = @_;          my ($self,$reaction) = @_;
   
391          if (!defined($self->reaction_table())) {          if (!defined($self->reaction_table())) {
392                  return undef;                  return undef;
393          }          }
394          if ($reaction =~ m/^\d+$/) {          if ($reaction =~ m/^\d+$/) {
395                  $self->reaction_table()->get_row($reaction);                  return $self->reaction_table()->get_row($reaction);
396          }          }
397          return $self->reaction_table()->get_row_by_key($reaction,"LOAD");          return $self->reaction_table()->get_row_by_key($reaction,"LOAD");
398  }  }
# Line 444  Line 479 
479  =cut  =cut
480  sub create_table_prototype {  sub create_table_prototype {
481          my ($self,$TableName) = @_;          my ($self,$TableName) = @_;
   
482          #Checking if the table definition exists in the FIGMODELconfig file          #Checking if the table definition exists in the FIGMODELconfig file
483          if (!defined($self->figmodel()->config($TableName))) {          my $tbldef = $self->figmodel()->config($TableName);
484            if (!defined($tbldef)) {
485                  $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);
486                  return undef;                  return undef;
487          }          }
488          #Checking that this is a database table          #Checking that this is a database table
489          if (!defined($self->config($TableName)->{tabletype}) || $self->config($TableName)->{tabletype}->[0] ne "ModelTable") {          if (!defined($tbldef->{tabletype}) || $tbldef->{tabletype}->[0] ne "ModelTable") {
490                  $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!");
491                  return undef;                  return undef;
492          }          }
493          if (!defined($self->config($TableName)->{delimiter})) {          #Setting default values for table parameters
494                  $self->config($TableName)->{delimiter}->[0] = ";";          my $prefix;
495            if (defined($tbldef->{prefix})) {
496                    $prefix = join("\n",@{$self->config($TableName)->{prefix}})."\n";
497            }
498            my $itemDelim = "|";
499            if (defined($tbldef->{itemdelimiter}->[0])) {
500                    $itemDelim = $tbldef->{itemdelimiter}->[0];
501                    if ($itemDelim eq "SC") {
502                            $itemDelim = ";";
503          }          }
         if (!defined($self->config($TableName)->{itemdelimiter})) {  
                 $self->config($TableName)->{itemdelimiter}->[0] = "|";  
504          }          }
505          my $prefix;          my $columnDelim = "\t";
506          if (defined($self->config($TableName)->{prefix})) {          if (defined($tbldef->{columndelimiter}->[0])) {
507                  $prefix = join("\n",@{$self->config($TableName)->{prefix}});                  $columnDelim = $tbldef->{columndelimiter}->[0];
508                    if ($columnDelim eq "SC") {
509                            $columnDelim = ";";
510                    }
511            }
512            my $suffix = ".tbl";
513            if (defined($tbldef->{filename_suffix}->[0])) {
514                    $suffix = $tbldef->{filename_suffix}->[0];
515          }          }
516          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);          my $filename = $self->directory().$TableName."-".$self->id().$self->selected_version().$suffix;
517            if (defined($tbldef->{filename_prefix}->[0])) {
518                    if ($tbldef->{filename_prefix}->[0] eq "NONE") {
519                            $filename = $self->directory().$self->id().$self->selected_version().$suffix;
520                    } else {
521                            $filename = $self->directory().$tbldef->{filename_prefix}->[0]."-".$self->id().$self->selected_version().$suffix;
522                    }
523            }
524            #Creating the table prototype
525            my $tbl = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},$columnDelim,$itemDelim,$prefix);
526          return $tbl;          return $tbl;
527  }  }
528    
# Line 491  Line 548 
548  =cut  =cut
549  sub reaction_table {  sub reaction_table {
550          my ($self,$clear) = @_;          my ($self,$clear) = @_;
551          my $tbl = $self->load_model_table("ModelReactions",$clear);          if (defined($self->{_reaction_table})) {
552                    return $self->{_reaction_table};
553            }
554            $self->{_reaction_table} = $self->load_model_table("ModelReactions",$clear);
555          my $classTbl = $self->reaction_class_table();          my $classTbl = $self->reaction_class_table();
556          if (defined($classTbl)) {          if (defined($classTbl)) {
557                  for (my $i=0; $i < $classTbl->size(); $i++) {                  for (my $i=0; $i < $classTbl->size(); $i++) {
558                          my $row = $classTbl->get_row($i);                          my $row = $classTbl->get_row($i);
559                          if (defined($row->{REACTION})) {                          if (defined($row->{REACTION})) {
560                                  my $rxnRow = $tbl->get_row_by_key($row->{"REACTION"}->[0],"LOAD");                                  my $rxnRow = $self->{_reaction_table}->get_row_by_key($row->{"REACTION"}->[0],"LOAD");
561                                  if (defined($row->{MEDIA})) {                                  if (defined($row->{MEDIA})) {
562                                          for (my $j=0; $j < @{$row->{MEDIA}};$j++) {                                          for (my $j=0; $j < @{$row->{MEDIA}};$j++) {
563                                                  my $class = "Active <=>";                                                  my $class = "Active <=>";
# Line 522  Line 582 
582                          }                          }
583                  }                  }
584          }          }
585            return $self->{_reaction_table};
586    }
587    
588    =head3 essentials_table
589    Definition:
590            FIGMODELTable = FIGMODELmodel->essentials_table();
591    Description:
592            Returns FIGMODELTable with the essential genes for the model
593    =cut
594    sub essentials_table {
595            my ($self,$clear) = @_;
596            my $tbl = $self->load_model_table("ModelEssentialGenes",$clear);
597          return $tbl;          return $tbl;
598  }  }
599    
# Line 587  Line 659 
659                  }                  }
660              }              }
661              #Loading predictions              #Loading predictions
662              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;  
                         }  
663                          for (my $i=0; $i < $self->{_feature_data}->size(); $i++) {                          for (my $i=0; $i < $self->{_feature_data}->size(); $i++) {
664                                  my $Row = $self->{_feature_data}->get_row($i);                                  my $Row = $self->{_feature_data}->get_row($i);
665                                  if ($Row->{ID}->[0] =~ m/(peg\.\d+)/) {                                  if ($Row->{ID}->[0] =~ m/(peg\.\d+)/) {
666                                          my $gene = $1;                                          my $gene = $1;
667                                          if (defined($hash->{$gene})) {                                  my @rows = $esstbl->get_rows_by_key($gene,"ESSENTIAL GENES");
668                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$media.":essential");                                  my $mediahash;
669                                    for (my $j=0; $j < $esstbl->size(); $j++) {
670                                            $mediahash->{$esstbl->get_row($j)->{MEDIA}->[0]} = 0;
671                                    }
672                                    for (my $j=0; $j < @rows; $j++) {
673                                            $mediahash->{$rows[$j]->{MEDIA}->[0]} = 1;
674                                    }
675                                    my @mediaList = keys(%{$mediahash});
676                                    for (my $j=0; $j < @mediaList; $j++) {
677                                            if ($mediahash->{$mediaList[$j]} == 1) {
678                                                    push(@{$Row->{$self->id()."PREDICTIONS"}},$mediaList[$j].":essential");
679                                          } else {                                          } else {
680                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$media.":nonessential");                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$mediaList[$j].":nonessential");
                                         }  
681                                  }                                  }
682                          }                          }
683                  }                  }
# Line 643  Line 716 
716  =cut  =cut
717  sub get_essential_genes {  sub get_essential_genes {
718          my ($self,$media) = @_;          my ($self,$media) = @_;
719            my $tbl = $self->essentials_table();
720          if (!defined($media)) {          my $row = $tbl->get_row_by_key($media,"MEDIA");
721                  $media = "Complete";          if (defined($row)) {
722          }                  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","");  
723                  }                  }
724          }          return undef;
   
         return $self->{_essential_genes}->{$media};  
725  }  }
726    
727  =head3 compound_table  =head3 compound_table
# Line 667  Line 734 
734          my ($self) = @_;          my ($self) = @_;
735    
736          if (!defined($self->{_compound_table})) {          if (!defined($self->{_compound_table})) {
737                  $self->{_compound_table} = $self->figmodel()->database()->GetDBModelCompounds($self->id());                  $self->{_compound_table} = $self->create_table_prototype("ModelCompounds");
738                    #Loading the reactions
739                    my $ReactionTable = $self->figmodel()->database()->get_table("REACTIONS");
740                    my $BiomassTable = $self->figmodel()->database()->get_table("BIOMASS");
741                    #Loading the model
742                    my $ModelTable = $self->reaction_table();
743                    #Checking that the tables were loaded
744                    if (!defined($ModelTable) || !defined($ReactionTable)) {
745                            return undef;
746                    }
747                    #Finding the biomass reaction
748                    for (my $i=0; $i < $ModelTable->size(); $i++) {
749                            my $ID = $ModelTable->get_row($i)->{"LOAD"}->[0];
750                            my $Row = $ReactionTable->get_row_by_key($ID,"DATABASE");
751                            my $IsBiomass = 0;
752                            if (!defined($Row)) {
753                                    $Row = $BiomassTable->get_row_by_key($ID,"DATABASE");
754                                    $IsBiomass = 1;
755                            }
756                            if (defined($Row->{"EQUATION"}->[0])) {
757                                    $_ = $Row->{"EQUATION"}->[0];
758                                    my @OriginalArray = /(cpd\d\d\d\d\d[\[\w]*)/g;
759                                    foreach my $Compound (@OriginalArray) {
760                                            my $ID = substr($Compound,0,8);
761                                            my $NewRow = $self->{_compound_table}->get_row_by_key($ID,"DATABASE",1);
762                                            if ($IsBiomass == 1) {
763                                                    $self->{_compound_table}->add_data($NewRow,"BIOMASS",$Row->{"DATABASE"}->[0],1);
764                                            }
765                                            if (length($Compound) > 8) {
766                                                    #print $Compound."\t".$Row->{"EQUATION"}->[0]."\t".$Row->{"DATABASE"}->[0]."\n";
767                                                    my $Compartment = substr($Compound,8,1);
768                                                    $self->{_compound_table}->add_data($NewRow,"COMPARTMENTS",$Compartment,1);
769                                                    $self->{_compound_table}->add_data($NewRow,"TRANSPORTERS",$Row->{"DATABASE"}->[0],1);
770                                            }
771                                    }
772                            }
773                    }
774          }          }
775    
776          return $self->{_compound_table};          return $self->{_compound_table};
# Line 787  Line 890 
890                  }                  }
891                  my $source = $self->source();                  my $source = $self->source();
892                  if ($source =~ /^MGRAST/) {                  if ($source =~ /^MGRAST/) {
893                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";                          $self->{_directory} = $self->figmodel()->config("mgrast model directory")->[0].$userdirectory.$self->genome()."/";
894                  } elsif ($source =~ /^RAST/) {                  } elsif ($source =~ /^RAST/) {
895                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";
896                  } elsif ($source =~ /^SEED/) {                  } elsif ($source =~ /^SEED/) {
# Line 1015  Line 1118 
1118    
1119          #Assuming complete media if none is provided          #Assuming complete media if none is provided
1120          if (!defined($Media)) {          if (!defined($Media)) {
1121                  $Media = "Complete";                  $Media = $self->autocompleteMedia();
1122          }          }
1123    
1124          #Predicting essentiality          #Predicting essentiality
1125          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]);
1126          #Checking that the table is defined and the output file exists          #Checking that the table is defined and the output file exists
1127          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {
1128                  $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();
1129                    my $row = $tbl->get_row_by_key($Media,"MEDIA",1);
1130                    $row->{"ESSENTIAL GENES"} = $result->get_row(0)->{"ESSENTIALGENES"};
1131                    $tbl->save();
1132          } else {          } else {
1133                  $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().".");
1134                  return $self->figmodel()->fail();                  return $self->figmodel()->fail();
# Line 1132  Line 1238 
1238          #Setting the reaction count          #Setting the reaction count
1239          $self->{_data}->reactions($rxntbl->size());          $self->{_data}->reactions($rxntbl->size());
1240          #Setting the metabolite count          #Setting the metabolite count
1241          $self->{_data}->compounds($rxntbl->size());          $self->{_data}->compounds($cpdtbl->size());
1242          #Setting the gene count          #Setting the gene count
1243          my $geneCount = @genes + @othergenes;          my $geneCount = @genes + @othergenes;
1244          $self->{_data}->associatedGenes($geneCount);          $self->{_data}->associatedGenes($geneCount);
# Line 1215  Line 1321 
1321                          }                          }
1322                  }                  }
1323                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1324                    #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";
1325                  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));
1326                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1327          } else {          } else {
1328                    #print $self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef)."\n";
1329                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef));                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef));
1330          }          }
1331    
# Line 1273  Line 1381 
1381          #Determining why each gap filling reaction was added          #Determining why each gap filling reaction was added
1382          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);
1383          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
                 $self->figmodel()->AddBiologTransporters($self->id());  
1384                  if ($self->id() !~ m/MGRast/) {                  if ($self->id() !~ m/MGRast/) {
1385                          $self->update_stats_for_gap_filling($ElapsedTime);                          $self->update_stats_for_gap_filling($ElapsedTime);
1386                  }                  }
# Line 1297  Line 1404 
1404  =cut  =cut
1405    
1406  sub calculate_model_changes {  sub calculate_model_changes {
1407          my ($self,$originalReactions,$cause) = @_;          my ($self,$originalReactions,$cause,$tbl,$version) = @_;
1408          my $modTime = time();          my $modTime = time();
1409          my $version = $self->selected_version();          if (!defined($version)) {
1410                    $version = $self->selected_version();
1411            }
1412          my $user = $self->figmodel()->user();          my $user = $self->figmodel()->user();
1413          #Getting the history table          #Getting the history table
1414          my $histTbl = $self->model_history();          my $histTbl = $self->model_history();
1415          #Checking for differences          #Checking for differences
1416          my $tbl = $self->reaction_table();          if (!defined($tbl)) {
1417                    $tbl = $self->reaction_table();
1418            }
1419          for (my $i=0; $i < $tbl->size(); $i++) {          for (my $i=0; $i < $tbl->size(); $i++) {
1420                  my $row = $tbl->get_row($i);                  my $row = $tbl->get_row($i);
1421                  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 1429 
1429                          }                          }
1430                          for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {                          for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1431                                  my $match = 0;                                  my $match = 0;
1432                                    if (defined($orgRow->{"ASSOCIATED PEG"})) {
1433                                  for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {                                  for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1434                                          if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {                                          if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1435                                                  $match = 1;                                                  $match = 1;
1436                                          }                                          }
1437                                  }                                  }
1438                                    }
1439                                  if ($match == 0) {                                  if ($match == 0) {
1440                                          push(@{$geneChanges},"Added ".$row->{"ASSOCIATED PEG"}->[$j]);                                          push(@{$geneChanges},"Added ".$row->{"ASSOCIATED PEG"}->[$j]);
1441                                  }                                  }
1442                          }                          }
1443                            if (defined($orgRow->{"ASSOCIATED PEG"})) {
1444                          for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {                          for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1445                                  my $match = 0;                                  my $match = 0;
1446                                            if (defined($row->{"ASSOCIATED PEG"})) {
1447                                  for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {                                  for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1448                                          if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {                                          if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1449                                                  $match = 1;                                                  $match = 1;
1450                                          }                                          }
1451                                  }                                  }
1452                                            }
1453                                  if ($match == 0) {                                  if ($match == 0) {
1454                                          push(@{$geneChanges},"Removed ".$orgRow->{"ASSOCIATED PEG"}->[$k]);                                          push(@{$geneChanges},"Removed ".$orgRow->{"ASSOCIATED PEG"}->[$k]);
1455                                  }                                  }
1456                          }                          }
1457                            }
1458                          if ((defined($directionChange) && length($directionChange) > 0) || defined($geneChanges) && @{$geneChanges} > 0) {                          if ((defined($directionChange) && length($directionChange) > 0) || defined($geneChanges) && @{$geneChanges} > 0) {
1459                                  $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]});
1460                          }                          }
# Line 1667  Line 1784 
1784                  $self->set_status(0,"Preliminary reconstruction");                  $self->set_status(0,"Preliminary reconstruction");
1785          }          }
1786          #Sorting GenomeData by gene location on the chromosome          #Sorting GenomeData by gene location on the chromosome
1787            my $ftrTbl = $self->figmodel()->database()->get_table("ROLERXNMAPPING");
1788          $FeatureTable->sort_rows("MIN LOCATION");          $FeatureTable->sort_rows("MIN LOCATION");
1789          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);
1790          my %LastGenePosition;          my %LastGenePosition;
# Line 1738  Line 1856 
1856                          }                          }
1857                  }                  }
1858          }          }
   
1859          #Creating nonadjacent complexes          #Creating nonadjacent complexes
1860          my @ReactionList = keys(%{$ReactionHash});          my @ReactionList = keys(%{$ReactionHash});
1861          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
# Line 1844  Line 1961 
1961                  $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"]});
1962          }          }
1963    
1964            #Getting feature rows for features that are lumped
1965            my @rows = $ftrTbl->get_rows_by_key("2","MASTER");
1966            for (my $i=0; $i < @rows; $i++) {
1967                    my $rxn = $rows[$i]->{REACTION}->[0];
1968                    my $role = $rows[$i]->{ROLE}->[0];
1969                    my @orgrows = $FeatureTable->get_rows_by_key($role,"ROLES");
1970                    my $genes;
1971                    for (my $j=0; $j < @orgrows; $j++) {
1972                            if ($orgrows[$j]->{ID}->[0] =~ m/(peg\.\d+)/) {
1973                                    push(@{$genes},$1);
1974                            }
1975                    }
1976                    if (defined($genes) && @{$genes} > 0) {
1977                            my $row = $NewModelTable->get_row_by_key($rxn,"LOAD");
1978                            my $newGeneAssociations;
1979                            for (my $k=0; $k < @{$genes}; $k++) {
1980                                    for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1981                                            my $peg = $genes->[$k];
1982                                            if ($row->{"ASSOCIATED PEG"}->[$j] !~ m/$peg/) {
1983                                                    push(@{$newGeneAssociations},$row->{"ASSOCIATED PEG"}->[$j]."+".$peg);
1984                                            }
1985                                    }
1986                            }
1987                            $row->{"ASSOCIATED PEG"} = $newGeneAssociations;
1988                    }
1989            }
1990    
1991          #Adding the spontaneous and universal reactions          #Adding the spontaneous and universal reactions
1992          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {
1993                  #Getting the thermodynamic reversibility from the database                  #Getting the thermodynamic reversibility from the database
# Line 1900  Line 2044 
2044                  }                  }
2045          }          }
2046    
2047            #If an original model exists, we copy the gap filling solution from that model
2048            if (defined($OriginalModelTable)) {
2049                    for (my $i=0; $i < $OriginalModelTable->size(); $i++) {
2050                            if ($OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ && $OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] ne "INITIAL GAP FILLING") {
2051                                    my $Row = $NewModelTable->get_row_by_key($OriginalModelTable->get_row($i)->{"LOAD"}->[0],"LOAD");
2052                                    if (!defined($Row)) {
2053                                            $NewModelTable->add_row($OriginalModelTable->get_row($i));
2054                                    }
2055                            }
2056                    }
2057            }
2058    
2059          #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
2060          if (defined($OriginalModelTable)) {          if (defined($OriginalModelTable)) {
2061                  my $PerfectMatch = 1;                  my $PerfectMatch = 1;
# Line 1984  Line 2140 
2140    
2141  sub CreateMetaGenomeReactionList {  sub CreateMetaGenomeReactionList {
2142          my ($self) = @_;          my ($self) = @_;
   
2143          #Checking if the metagenome file exists          #Checking if the metagenome file exists
2144          if (!-e $self->config("raw MGRAST directory")->[0].$self->genome().".summary") {          if (!-e $self->config("raw MGRAST directory")->[0].$self->genome().".summary") {
2145                  $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());
2146                    return $self->fail();
2147          }          }
2148          #Loading metagenome data          #Loading metagenome data
2149          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");
2150          if (!defined($MGRASTData)) {          if (!defined($MGRASTData)) {
2151                  $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());
2152                    return $self->fail();
2153          }          }
   
2154          #Setting up needed variables          #Setting up needed variables
2155          my $OriginalModelTable = undef;          my $OriginalModelTable = undef;
   
2156          #Checking status          #Checking status
2157          if ($self->status() < 0) {          if ($self->status() < 0) {
2158                  $self->set_status(0,"Preliminary reconstruction");                  $self->set_status(0,"Preliminary reconstruction");
# Line 2009  Line 2164 
2164                  $self->ArchiveModel();                  $self->ArchiveModel();
2165                  $self->set_status(0,"Rebuilding preliminary reconstruction");                  $self->set_status(0,"Rebuilding preliminary reconstruction");
2166          }          }
2167            #Creating a hash of escores and pegs associated with each role
2168            my $rolePegHash;
2169            my $roleEscores;
2170            for (my $i=0; $i < @{$MGRASTData};$i++) {
2171                    #MD5,PEG,number of sims,role,sim e-scores,max escore,min escore,ave escore,stdev escore,ave exponent,stddev exponent
2172                    $rolePegHash->{$MGRASTData->[$i]->[3]}->{substr($MGRASTData->[$i]->[1],4)} = 1;
2173                    push(@{$roleEscores->{$MGRASTData->[$i]->[3]}},split(/;/,$MGRASTData->[$i]->[4]));
2174            }
2175          #Getting the reaction table          #Getting the reaction table
2176          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          my $ReactionTable = $self->figmodel()->database()->get_table("REACTIONS");
2177          #Creating model table          #Creating model table
2178          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");
2179          for (my $i=0; $i < @{$MGRASTData};$i++) {          print $ModelTable->filename();
2180                  #MD5,PEG,number of sims,role,sim e-scores          my @roles = keys(%{$rolePegHash});
2181                  my $Role = $MGRASTData->[$i]->[3];          for (my $i=0; $i < @roles; $i++) {
2182                  my $MD5 = $MGRASTData->[$i]->[0];                  my $min = -1;
2183                  my $peg = $MGRASTData->[$i]->[1];                  my $max = -1;
2184                  my $sims = $MGRASTData->[$i]->[4];                  my $count = @{$roleEscores->{$roles[$i]}};
2185                  $sims =~ s/;/,/g;                  my $ave = 0;
2186                    my $stdev = 0;
2187                    my $aveexp = 0;
2188                    my $stdevexp = 0;
2189                    for (my $j=0; $j < @{$roleEscores->{$roles[$i]}}; $j++) {
2190                            if ($roleEscores->{$roles[$i]} < $min || $min == -1) {
2191                                    $min = $roleEscores->{$roles[$i]};
2192                            }
2193                            if ($roleEscores->{$roles[$i]} > $max || $max == -1) {
2194                                    $max = $roleEscores->{$roles[$i]};
2195                            }
2196                            $ave += $roleEscores->{$roles[$i]}->[$j];
2197                            if ($roleEscores->{$roles[$i]}->[$j] =~ m/e(-\d+$)/) {
2198                                    $aveexp += $1;
2199                            }
2200                    }
2201                    $ave = $ave/$count;
2202                    $aveexp = $aveexp/$count;
2203                    for (my $j=0; $j < @{$roleEscores->{$roles[$i]}}; $j++) {
2204                            $stdev += ($roleEscores->{$roles[$i]}->[$j]-$ave)*($roleEscores->{$roles[$i]}->[$j]-$ave);
2205                            if ($roleEscores->{$roles[$i]}->[$j] =~ m/e(-\d+$)/) {
2206                                    $stdevexp += ($1-$aveexp)*($1-$aveexp);
2207                            }
2208                    }
2209                    $stdev = sqrt($stdev/$count);
2210                    $stdevexp = sqrt($stdevexp/$count);
2211                  #Checking for subsystems                  #Checking for subsystems
2212                  my $GeneSubsystems = $self->figmodel()->subsystems_of_role($Role);                  my $GeneSubsystems = $self->figmodel()->subsystems_of_role($roles[$i]);
2213                  #Checking if there are reactions associated with this role                  #Checking if there are reactions associated with this role
2214                  my $ReactionHashArrayRef = $self->figmodel()->reactions_of_role($Role);                  my $ReactionHashArrayRef = $self->figmodel()->reactions_of_role($roles[$i]);
2215                  if ($ReactionHashArrayRef != 0) {                  if ($ReactionHashArrayRef != 0) {
2216                          foreach my $Mapping (@{$ReactionHashArrayRef}) {                          foreach my $Mapping (@{$ReactionHashArrayRef}) {
2217                                  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 2223 
2223                                                                  $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"]};
2224                                                                  $ModelTable->add_row($ReactionRow);                                                                  $ModelTable->add_row($ReactionRow);
2225                                                          }                                                          }
2226                                                          push(@{$ReactionRow->{"ASSOCIATED PEG"}},substr($peg,4));                                                          my %pegHash = %{$rolePegHash->{$roles[$i]}};
2227                                                          push(@{$ReactionRow->{"REFERENCE"}},$MD5.":".$Role);                                                          if (defined($ReactionRow->{"ASSOCIATED PEG"})) {
2228                                                          push(@{$ReactionRow->{"CONFIDENCE"}},$sims);                                                                  for (my $j=0; $j < @{$ReactionRow->{"ASSOCIATED PEG"}}; $j++) {
2229                                                                            $pegHash{$ReactionRow->{"ASSOCIATED PEG"}->[$j]} = 1;
2230                                                                    }
2231                                                            }
2232                                                            delete $ReactionRow->{"ASSOCIATED PEG"};
2233                                                            push(@{$ReactionRow->{"ASSOCIATED PEG"}},keys(%pegHash));
2234                                                            push(@{$ReactionRow->{"REFERENCE"}},$count.":".$ave.":".$stdev.":".$aveexp.":".$stdevexp.":".$min.":".$max);
2235                                                          if (defined($GeneSubsystems)) {                                                          if (defined($GeneSubsystems)) {
2236                                                                  push(@{$ReactionRow->{"SUBSYSTEM"}},@{$GeneSubsystems});                                                                  push(@{$ReactionRow->{"SUBSYSTEM"}},@{$GeneSubsystems});
2237                                                          }                                                          }
# Line 2487  Line 2679 
2679          my $fluxFilename = $outputDirectory."Fluxes-".$self->id()."-".$Media.".txt";          my $fluxFilename = $outputDirectory."Fluxes-".$self->id()."-".$Media.".txt";
2680          my $cpdFluxFilename = $outputDirectory."CompoundFluxes-".$self->id()."-".$Media.".txt";          my $cpdFluxFilename = $outputDirectory."CompoundFluxes-".$self->id()."-".$Media.".txt";
2681          #Running FBA          #Running FBA
2682            #print $self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version())."\n";
2683          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()));
2684          #Saving LP file if requested          #Saving LP file if requested
2685          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") {
2686                  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");
2687          }          }
2688          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);
2689          my $Result;          my $Result;
# Line 3849  Line 4042 
4042          my($self) = @_;          my($self) = @_;
4043    
4044          #Opening the SBML file for printing          #Opening the SBML file for printing
4045          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";  
         }  
4046          if (!open (SBMLOUTPUT, ">$Filename")) {          if (!open (SBMLOUTPUT, ">$Filename")) {
4047                  return;                  return;
4048          }          }
4049    
4050          #Loading and parsing the model data          #Loading and parsing the model data
4051          my $ModelTable = $self->reaction_table();          my $mdlTbl = $self->reaction_table();
4052          if (!defined($ModelTable) || !defined($ModelTable->{"array"})) {          if (!defined($mdlTbl) || !defined($mdlTbl->{"array"})) {
4053                  print "Failed to load ".$self->id()."\n";                  return $self->fail();
                 return;  
4054          }          }
4055            my $rxnTbl = $self->figmodel()->database()->get_table("REACTIONS");
4056            my $bioTbl = $self->figmodel()->database()->get_table("BIOMASS");
4057            my $cpdTbl = $self->figmodel()->database()->get_table("COMPOUNDS");
4058            my $cmpTbl = $self->figmodel()->database()->get_table("COMPARTMENTS");
4059    
4060          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash
4061          my $ExchangeHash = {"cpd11416" => "c"};          my $ExchangeHash = {"cpd11416" => "c"};
   
4062          my %CompartmentsPresent;          my %CompartmentsPresent;
4063          $CompartmentsPresent{"c"} = 1;          $CompartmentsPresent{"c"} = 1;
4064          my %CompoundList;          my %CompoundList;
4065          my @ReactionList;          my @ReactionList;
4066          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          for (my $i=0; $i < $mdlTbl->size(); $i++) {
4067          for (my $i=0; $i < $ModelTable->size(); $i++) {                  my $Reaction = $mdlTbl->get_row($i)->{"LOAD"}->[0];
4068                  my $Reaction = $ModelTable->get_row($i)->{"LOAD"}->[0];                  my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4069                  if (defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")) && defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0])) {                  if (!defined($row)) {
4070                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4071                            if (!defined($row)) {
4072                                    next;
4073                            }
4074                    }
4075                    if (!defined($row->{"EQUATION"}->[0])) {
4076                            next;
4077                    }
4078                          push(@ReactionList,$Reaction);                          push(@ReactionList,$Reaction);
4079                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
4080                          my @MatchArray = /(cpd\d\d\d\d\d)/g;                          my @MatchArray = /(cpd\d\d\d\d\d)/g;
4081                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
4082                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;
4083                          }                          }
4084                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
4085                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;
4086                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
4087                                  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 4090 
4090                                  }                                  }
4091                          }                          }
4092                  }                  }
         }  
4093    
4094          #Printing header to SBML file          #Printing header to SBML file
4095          my $ModelName = $self->id();          my $ModelName = $self->id().$self->selected_version();
4096          $ModelName =~ s/\./_/;          $ModelName =~ s/\./_/;
4097          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";
4098      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";
4099      if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Organism name"}->[0])) {          if (defined($self->name())) {
4100          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";
4101      } else {      } else {
4102          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";
4103      }      }
4104    
4105          #Printing the unit data          #Printing the unit data
# Line 3920  Line 4116 
4116      #Printing compartments for SBML file      #Printing compartments for SBML file
4117      print SBMLOUTPUT '<listOfCompartments>'."\n";      print SBMLOUTPUT '<listOfCompartments>'."\n";
4118      foreach my $Compartment (keys(%CompartmentsPresent)) {      foreach my $Compartment (keys(%CompartmentsPresent)) {
4119          if (defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0])) {                  my $row = $cmpTbl->get_row_by_key($Compartment,"Abbreviation");
4120                  my @OutsideList = split(/\//,$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Outside"}->[0]);                  if (!defined($row) && !defined($row->{"Name"}->[0])) {
4121                            next;
4122                    }
4123                    my @OutsideList = split(/\//,$row->{"Outside"}->[0]);
4124                  my $Printed = 0;                  my $Printed = 0;
4125                  foreach my $Outside (@OutsideList) {                  foreach my $Outside (@OutsideList) {
4126                                  if (defined($CompartmentsPresent{$Outside}) && defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Outside}->[0]->{"Name"}->[0])) {                          if (defined($CompartmentsPresent{$Outside}) && defined($row->{"Name"}->[0])) {
4127                                  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";
4128                                  $Printed = 1;                                  $Printed = 1;
4129                                  last;                                  last;
4130                          }                          }
4131                  }                  }
4132                  if ($Printed eq 0) {                  if ($Printed eq 0) {
4133                          print SBMLOUTPUT '<compartment id="'.$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0].'"/>'."\n";                          print SBMLOUTPUT '<compartment id="'.$row->{"Name"}->[0].'"/>'."\n";
                         }  
4134          }          }
4135      }      }
4136      print SBMLOUTPUT '</listOfCompartments>'."\n";      print SBMLOUTPUT '</listOfCompartments>'."\n";
# Line 3940  Line 4138 
4138      #Printing the list of metabolites involved in the model      #Printing the list of metabolites involved in the model
4139          print SBMLOUTPUT '<listOfSpecies>'."\n";          print SBMLOUTPUT '<listOfSpecies>'."\n";
4140      foreach my $Compound (keys(%CompoundList)) {      foreach my $Compound (keys(%CompoundList)) {
4141                    my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4142                    if (!defined($row)) {
4143                            next;
4144                    }
4145          my $Name = $Compound;          my $Name = $Compound;
4146                  my $Formula = "";                  my $Formula = "";
4147                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  if (defined($row->{"FORMULA"}->[0])) {
4148                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                          $Formula = $row->{"FORMULA"}->[0];
4149                  }                  }
4150                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4151                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4152                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4153                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4154                  }                  }
4155                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4156                  my $Charge = 0;                  my $Charge = 0;
4157                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4158                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4159                  }                  }
4160                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {
4161                  if ($Compartment eq "e") {                  if ($Compartment eq "e") {
4162                          $ExchangeHash->{$Compound} = "e";                          $ExchangeHash->{$Compound} = "e";
4163                  }                  }
4164                  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");
4165                            print SBMLOUTPUT '<species id="'.$Compound.'_'.$Compartment.'" name="'.$Name.'" compartment="'.$cmprow->{"Name"}->[0].'" charge="'.$Charge.'" boundaryCondition="false"/>'."\n";
4166          }          }
4167      }      }
4168    
4169          #Printing the boundary species          #Printing the boundary species
4170          foreach my $Compound (keys(%{$ExchangeHash})) {          foreach my $Compound (keys(%{$ExchangeHash})) {
4171                  my $Name = $Compound;                  my $Name = $Compound;
4172                  my $Formula = "";                  my $Formula = "";
4173                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4174                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                  if (!defined($row)) {
4175                            next;
4176                    }
4177                    if (defined($row->{"FORMULA"}->[0])) {
4178                            $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                  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";
4191          }          }
# Line 3986  Line 4194 
4194      #Printing the list of reactions involved in the model      #Printing the list of reactions involved in the model
4195          my $ObjectiveCoef;          my $ObjectiveCoef;
4196      print SBMLOUTPUT '<listOfReactions>'."\n";      print SBMLOUTPUT '<listOfReactions>'."\n";
4197    
4198          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
4199          $ObjectiveCoef = "0.0";          $ObjectiveCoef = "0.0";
4200                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"EQUATION"}->[0])) {                  my $mdlrow = $mdlTbl->get_row_by_key($Reaction,"LOAD");
4201                    my $Reaction = $mdlrow->{"LOAD"}->[0];
4202                    my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4203                    if (!defined($row)) {
4204                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4205                            if (!defined($row)) {
4206                                    next;
4207                            }
4208                    }
4209                    if (!defined($row->{"EQUATION"}->[0])) {
4210                            next;
4211                    }
4212                  if ($Reaction =~ m/^bio/) {                  if ($Reaction =~ m/^bio/) {
4213                                  $ObjectiveCoef = "1.0";                                  $ObjectiveCoef = "1.0";
4214                          }                          }
4215                          my $LowerBound = -10000;                          my $LowerBound = -10000;
4216                  my $UpperBound = 10000;                  my $UpperBound = 10000;
4217                          my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateData($Reaction);                  my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateDataFromEquation($row->{"EQUATION"}->[0]);
4218                  my $Name = $Reaction;                  my $Name = $Reaction;
4219                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4220                          $Name = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4221                                  $Name =~ s/[<>;&]//g;                                  $Name =~ s/[<>;&]//g;
4222                  }                  }
4223                  my $Reversibility = "true";                  my $Reversibility = "true";
4224                  if (defined($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0])) {                  if (defined($mdlrow->{"DIRECTIONALITY"}->[0])) {
4225                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] ne "<=>") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] ne "<=>") {
4226                                  $LowerBound = 0;                                  $LowerBound = 0;
4227                                          $Reversibility = "false";                                          $Reversibility = "false";
4228                          }                          }
4229                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] eq "<=") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] eq "<=") {
4230                                  my $Temp = $Products;                                  my $Temp = $Products;
4231                                  $Products = $Reactants;                                  $Products = $Reactants;
4232                                  $Reactants = $Temp;                                  $Reactants = $Temp;
# Line 4015  Line 4235 
4235                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";
4236                          print SBMLOUTPUT "<notes>\n";                          print SBMLOUTPUT "<notes>\n";
4237                          my $ECData = "";                          my $ECData = "";
4238                          if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0])) {                  if (defined($row->{"ENZYME"}->[0])) {
4239                                  $ECData = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0];                          $ECData = $row->{"ENZYME"}->[0];
4240                          }                          }
4241                          my $SubsystemData = "";                          my $SubsystemData = "";
4242                          if (defined($ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0])) {                  if (defined($mdlrow->{"SUBSYSTEM"}->[0])) {
4243                                  $SubsystemData = $ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0];                          $SubsystemData = $mdlrow->{"SUBSYSTEM"}->[0];
4244                          }                          }
4245                          my $GeneAssociation = "";                          my $GeneAssociation = "";
4246                          my $ProteinAssociation = "";                          my $ProteinAssociation = "";
4247                          if (defined($ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0])) {                  if (defined($mdlrow->{"ASSOCIATED PEG"}->[0])) {
4248                                  if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} == 1 && $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {                          if (@{$mdlrow->{"ASSOCIATED PEG"}} == 1 && $mdlrow->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {
4249                                          $GeneAssociation = $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0];                                  $GeneAssociation = $mdlrow->{"ASSOCIATED PEG"}->[0];
4250                                  } else {                                  } else {
4251                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4252                                                  $GeneAssociation = "( ";                                                  $GeneAssociation = "( ";
4253                                          }                                          }
4254                                          for (my $i=0; $i < @{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}}; $i++) {                                  for (my $i=0; $i < @{$mdlrow->{"ASSOCIATED PEG"}}; $i++) {
4255                                                  if ($i > 0) {                                                  if ($i > 0) {
4256                                                          $GeneAssociation .= " )  or  ( ";                                                          $GeneAssociation .= " )  or  ( ";
4257                                                  }                                                  }
4258                                                  $GeneAssociation .= $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[$i];                                          $GeneAssociation .= $mdlrow->{"ASSOCIATED PEG"}->[$i];
4259                                          }                                          }
4260                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4261                                                  $GeneAssociation .= " )";                                                  $GeneAssociation .= " )";
4262                                          }                                          }
4263                                  }                                  }
# Line 4046  Line 4266 
4266                                          $GeneAssociation = "( ".$GeneAssociation." )";                                          $GeneAssociation = "( ".$GeneAssociation." )";
4267                                  }                                  }
4268                                  $ProteinAssociation = $GeneAssociation;                                  $ProteinAssociation = $GeneAssociation;
4269                                  if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Genome ID"}->[0])) {                          if (defined($self->genome())) {
4270                                          $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());
4271                                  }                                  }
4272                          }                          }
4273                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";
# Line 4078  Line 4298 
4298              print SBMLOUTPUT "</kineticLaw>\n";              print SBMLOUTPUT "</kineticLaw>\n";
4299                          print SBMLOUTPUT '</reaction>'."\n";                          print SBMLOUTPUT '</reaction>'."\n";
4300                  }                  }
         }  
4301    
4302          my @ExchangeList = keys(%{$ExchangeHash});          my @ExchangeList = keys(%{$ExchangeHash});
4303          foreach my $ExCompound (@ExchangeList) {          foreach my $ExCompound (@ExchangeList) {
4304                  my $ExCompoundName = $ExCompound;                  my $ExCompoundName = $ExCompound;
4305                  my $Row = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->get_row_by_key($ExCompound,"DATABASE");                  my $Row = $cpdTbl->get_row_by_key($ExCompound,"DATABASE");
4306                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {
4307                          $ExCompoundName = $Row->{"NAME"}->[0];                          $ExCompoundName = $Row->{"NAME"}->[0];
4308                          $ExCompoundName =~ s/[<>;&]//g;                          $ExCompoundName =~ s/[<>;&]//g;
# Line 4140  Line 4359 
4359                  $tbl->add_row($row);                  $tbl->add_row($row);
4360          }          }
4361          $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");  
4362  }  }
4363    
4364  =head3 PrintModelLPFile  =head3 PrintModelLPFile
# Line 4469  Line 4687 
4687          }          }
4688  }  }
4689    
4690    =pod
4691    
4692    =item * [string]:I<list of essential genes> = B<run_geneKO_slow> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4693    
4694    =cut
4695    
4696    sub run_geneKO_slow {
4697            my ($self,$media,$maxGrowth,$save) = @_;
4698            my $output;
4699            my $UniqueFilename = $self->figmodel()->filename();
4700            if (defined($maxGrowth) && $maxGrowth == 1) {
4701                    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()));
4702            } else {
4703                    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()));
4704            }
4705            if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt") {
4706                    print "Deletion study file not found!.\n";
4707                    return undef;
4708            }
4709            my $deltbl = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt",";","|",1,["Experiment"]);
4710            for (my $i=0; $i < $deltbl->size(); $i++) {
4711                    my $row = $deltbl->get_row($i);
4712                    if ($row->{"Insilico growth"}->[0] < 0.0000001) {
4713                            push(@{$output},$row->{Experiment}->[0]);
4714                    }
4715            }
4716            if (defined($output)) {
4717                    if (defined($save) && $save == 1) {
4718                            my $tbl = $self->essentials_table();
4719                            my $row = $tbl->get_row_by_key($media,"MEDIA",1);
4720                            $row->{"ESSENTIAL GENES"} = $output;
4721                            $tbl->save();
4722                    }
4723            }
4724            return $output;
4725    }
4726    
4727    =pod
4728    
4729    =item * [string]:I<list of minimal genes> = B<run_gene_minimization> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4730    
4731    =cut
4732    
4733    sub run_gene_minimization {
4734            my ($self,$media,$maxGrowth,$save) = @_;
4735            my $output;
4736    
4737            #Running the MFAToolkit
4738            my $UniqueFilename = $self->figmodel()->filename();
4739            if (defined($maxGrowth) && $maxGrowth == 1) {
4740                    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()));
4741            } else {
4742                    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()));
4743            }
4744            my $tbl = $self->figmodel()->LoadProblemReport($UniqueFilename);
4745            if (!defined($tbl)) {
4746                    return undef;
4747            }
4748            for (my $i=0; $i < $tbl->size(); $i++) {
4749                    my $row = $tbl->get_row($i);
4750                    if ($row->{Notes}->[0] =~ m/Recursive\sMILP\sGENE_USE\soptimization/) {
4751                            my @array = split(/\|/,$row->{Notes}->[0]);
4752                            my $solution = $array[0];
4753                            $_ = $solution;
4754                            my @OriginalArray = /(peg\.\d+)/g;
4755                            push(@{$output},@OriginalArray);
4756                            last;
4757                    }
4758            }
4759    
4760            if (defined($output)) {
4761                    if (defined($save) && $save == 1) {
4762                            my $tbl = $self->load_model_table("MinimalGenes");
4763                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4764                            if (defined($row)) {
4765                                    $row->{GENES} = $output;
4766                            } else {
4767                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4768                            }
4769                            $tbl->save();
4770                    }
4771            }
4772            return $output;
4773    }
4774    
4775    =pod
4776    
4777    =item * [string]:I<list of inactive genes> = B<identify_inactive_genes> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4778    
4779    =cut
4780    
4781    sub identify_inactive_genes {
4782            my ($self,$media,$maxGrowth,$save) = @_;
4783            my $output;
4784            #Running the MFAToolkit
4785            my $UniqueFilename = $self->figmodel()->filename();
4786            if (defined($maxGrowth) && $maxGrowth == 1) {
4787                    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()));
4788            } else {
4789                    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()));
4790            }
4791            #Reading in the output bounds file
4792            my $ReactionTB;
4793            if (-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt") {
4794                    $ReactionTB = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt",";","|",1,["DATABASE ID"]);
4795            }
4796            if (!defined($ReactionTB)) {
4797                    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";
4798                    return undef;
4799            }
4800            #Clearing output
4801            $self->figmodel()->clearing_output($UniqueFilename,"Classify-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");
4802            my $geneHash;
4803            my $activeGeneHash;
4804            for (my $i=0; $i < $ReactionTB->size(); $i++) {
4805                    my $Row = $ReactionTB->get_row($i);
4806                    if (defined($Row->{"Min FLUX"}) && defined($Row->{"Max FLUX"}) && defined($Row->{"DATABASE ID"}) && $Row->{"DATABASE ID"}->[0] =~ m/rxn\d\d\d\d\d/) {
4807                            my $data = $self->get_reaction_data($Row->{"DATABASE ID"}->[0]);
4808                            if (defined($data->{"ASSOCIATED PEG"})) {
4809                                    my $active = 0;
4810                                    if ($Row->{"Min FLUX"}->[0] > 0.00000001 || $Row->{"Max FLUX"}->[0] < -0.00000001 || ($Row->{"Max FLUX"}->[0]-$Row->{"Min FLUX"}->[0]) > 0.00000001) {
4811                                            $active = 1;
4812                                    }
4813                                    for (my $j=0; $j < @{$data->{"ASSOCIATED PEG"}}; $j++) {
4814                                            $_ = $data->{"ASSOCIATED PEG"}->[$j];
4815                                            my @OriginalArray = /(peg\.\d+)/g;
4816                                            for (my $k=0; $k < @OriginalArray; $k++) {
4817                                                    if ($active == 1) {
4818                                                            $activeGeneHash->{$OriginalArray[$k]} = 1;
4819                                                    }
4820                                                    $geneHash->{$OriginalArray[$k]} = 1;
4821                                            }
4822                                    }
4823                            }
4824                    }
4825            }
4826            my @allGenes = keys(%{$geneHash});
4827            for (my $i=0; $i < @allGenes; $i++) {
4828                    if (!defined($activeGeneHash->{$allGenes[$i]})) {
4829                            push(@{$output},$allGenes[$i]);
4830                    }
4831            }
4832            if (defined($output)) {
4833                    if (defined($save) && $save == 1) {
4834                            my $tbl = $self->load_model_table("InactiveGenes");
4835                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4836                            if (defined($row)) {
4837                                    $row->{GENES} = $output;
4838                            } else {
4839                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4840                            }
4841                            $tbl->save();
4842                    }
4843            }
4844            return $output;
4845    }
4846    
4847    sub ConvertVersionsToHistoryFile {
4848            my ($self) = @_;
4849            my $vone = 0;
4850            my $vtwo = 0;
4851            my $continue = 1;
4852            my $lastTable;
4853            my $currentTable;
4854            my $cause;
4855            my $lastChanged = 0;
4856            my $noHitCount = 0;
4857            while ($continue == 1) {
4858                    $cause = "NONE";
4859                    $currentTable = undef;
4860                    if (-e $self->directory().$self->id()."V".($vone+1).".".$vtwo.".txt") {
4861                            $noHitCount = 0;
4862                            $lastChanged = 0;
4863                            $vone = $vone+1;
4864                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4865                            $cause = "RECONSTRUCTION";
4866                    } elsif (-e $self->directory().$self->id()."V".$vone.".".($vtwo+1).".txt") {
4867                            $noHitCount = 0;
4868                            $lastChanged = 0;
4869                            $vtwo = $vtwo+1;
4870                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4871                            $cause = "AUTOCOMPLETION";
4872                    } elsif ($lastChanged == 0) {
4873                            $lastChanged = 1;
4874                            $vone = $vone+1;
4875                            $cause = "RECONSTRUCTION";
4876                    } elsif ($lastChanged == 1) {
4877                            $lastChanged = 2;
4878                            $vone = $vone-1;
4879                            $vtwo = $vtwo+1;
4880                            $cause = "AUTOCOMPLETION";
4881                    } elsif ($lastChanged == 2) {
4882                            $lastChanged = 0;
4883                            $vone = $vone+1;
4884                            $cause = "RECONSTRUCTION";
4885                    }
4886                    if (defined($currentTable)) {
4887                            if (defined($lastTable)) {
4888                                    print $cause."\t".$self->directory().$self->id()."V".$vone.".".$vtwo.".txt\n";
4889                                    $self->calculate_model_changes($lastTable,$cause,$currentTable,"V".$vone.".".$vtwo);
4890                            }
4891                            $lastTable = $currentTable;
4892                    } else {
4893                            $noHitCount++;
4894                            if ($noHitCount >= 40) {
4895                                    last;
4896                            }
4897                    }
4898            }
4899    }
4900    
4901  1;  1;

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3