[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.2, Fri Dec 11 21:37:02 2009 UTC revision 1.9, Wed Apr 7 13:17:07 2010 UTC
# Line 1  Line 1 
 package FIGMODELmodel;  
1  use strict;  use strict;
2    package FIGMODELmodel;
3    
4  =head1 FIGMODELmodel object  =head1 FIGMODELmodel object
5  =head2 Introduction  =head2 Introduction
# Line 14  Line 14 
14  =cut  =cut
15  sub new {  sub new {
16          my ($class,$figmodel,$id) = @_;          my ($class,$figmodel,$id) = @_;
17    
18          #Error checking first          #Error checking first
19          if (!defined($figmodel)) {          if (!defined($figmodel)) {
20                  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 39  Line 40 
40                  $self->{_data} = $tbl->get_row($id);                  $self->{_data} = $tbl->get_row($id);
41          } else {          } else {
42                  $self->{_data} = $tbl->get_row_by_key($id,"id");                  $self->{_data} = $tbl->get_row_by_key($id,"id");
43                  if (defined($self->{_data})) {                  if (!defined($self->{_data})) {
44                          $index = $tbl->row_index($self->{_data});                          if ($id =~ m/(.+)(V[^V]+)/) {
45                                    $self->{_data} = $tbl->get_row_by_key($1,"id");
46                                    if (!defined($self->{_data})) {
47                                            $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
48                                            return undef;
49                                    }
50                                    $self->{_selectedversion} = $2;
51                            } else {
52                                    $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
53                                    return undef;
54                            }
55                  }                  }
56                    $index = $tbl->row_index($self->{_data});
57          }          }
58          if (!defined($self->{_data})) {          if (!defined($self->{_data})) {
59                  $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 specified id in database!");
# Line 50  Line 62 
62          $self->{_index} = $index;          $self->{_index} = $index;
63          $self->figmodel()->{_models}->{$self->id()} = $self;          $self->figmodel()->{_models}->{$self->id()} = $self;
64          $self->figmodel()->{_models}->{$self->index()} = $self;          $self->figmodel()->{_models}->{$self->index()} = $self;
   
65          return $self;          return $self;
66  }  }
67    
# Line 230  Line 241 
241                  my $ClassRow = $self->{_reaction_classes}->get_row_by_key($reaction,"REACTION");                  my $ClassRow = $self->{_reaction_classes}->get_row_by_key($reaction,"REACTION");
242                  if (defined($ClassRow) && defined($ClassRow->{CLASS})) {                  if (defined($ClassRow) && defined($ClassRow->{CLASS})) {
243                          my $class;                          my $class;
244                            my $min = $ClassRow->{MIN}->[0];
245                            my $max = $ClassRow->{MAX}->[0];
246                          if ($ClassRow->{CLASS}->[0] eq "Positive") {                          if ($ClassRow->{CLASS}->[0] eq "Positive") {
247                                  $class = "Essential =>";                                  $class = "Essential =>";
248                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
249                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {
250                                  $class = "Essential <=";                                  $class = "Essential <=";
251                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
252                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {
253                                  $class = "Active =>";                                  $class = "Active =>";
254                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
255                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {
256                                  $class = "Active <=";                                  $class = "Active <=";
257                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
258                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {
259                                  $class = "Active <=>";                                  $class = "Active <=>";
260                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
261                          } elsif ($ClassRow->{CLASS}->[0] eq "Blocked") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Blocked") {
262                                  $class = "Inactive";                                  $class = "Inactive";
263                          } elsif ($ClassRow->{CLASS}->[0] eq "Dead") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Dead") {
264                                  $class = "Disconnected";                                  $class = "Disconnected";
265                          }                          }
266    
267                          if (!defined($nohtml) || $nohtml ne "1") {                          if (!defined($nohtml) || $nohtml ne "1") {
268                                  $class = "<span title=\"Flux:".$ClassRow->{MIN}->[0]." to ".$ClassRow->{MAX}->[0]."\">".$class."</span>";                                  $class = "<span title=\"Flux:".$min." to ".$max."\">".$class."</span>";
269                          }                          }
270    
271                          return $class;                          return $class;
272                  }                  }
273                  return undef;                  return undef;
# Line 268  Line 288 
288                                  $classstring .= "<br>";                                  $classstring .= "<br>";
289                          }                          }
290                          my $NewClass;                          my $NewClass;
291                            my $min = $ClassRow->{MIN}->[$i];
292                            my $max = $ClassRow->{MAX}->[$i];
293                          if ($ClassRow->{CLASS}->[$i] eq "Positive") {                          if ($ClassRow->{CLASS}->[$i] eq "Positive") {
294                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential =>";
295                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
296                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {
297                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";
298                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
299                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {
300                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";
301                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
302                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {
303                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";
304                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
305                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {
306                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";
307                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
308                          } elsif ($ClassRow->{CLASS}->[$i] eq "Blocked") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Blocked") {
309                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Inactive";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Inactive";
                                 if (!defined($nohtml) || $nohtml ne "1") {  
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
310                          } elsif ($ClassRow->{CLASS}->[$i] eq "Dead") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Dead") {
311                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Disconnected";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Disconnected";
                                 if (!defined($nohtml) || $nohtml ne "1") {  
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
312                                  }                                  }
313    
314                            if (!defined($nohtml) || $nohtml ne "1") {
315                                    $NewClass = "<span title=\"Flux:".$min." to ".$max."\">".$NewClass."</span>";
316                          }                          }
317                          $classstring .= $NewClass;                          $classstring .= $NewClass;
318                  }                  }
# Line 438  Line 448 
448          return $self->{_compound_class_table};          return $self->{_compound_class_table};
449  }  }
450    
451    =head3 get_essential_genes
452    Definition:
453            [string::peg ID] = FIGMODELmodel->get_essential_genes(string::media condition);
454    Description:
455            Returns an reference to an array of the predicted essential genes during growth in the input media condition
456    =cut
457    sub get_essential_genes {
458            my ($self,$media) = @_;
459    
460            if (!defined($media)) {
461                    $media = "Complete";
462            }
463            if (!defined($self->{_essential_genes}->{$media})) {
464                    $self->{_essential_genes}->{$media} = undef;
465                    if (-e $self->directory()."EssentialGenes-".$self->id().$self->selected_version()."-".$media.".tbl") {
466                            $self->{_essential_genes}->{$media} = $self->figmodel()->database()->load_single_column_file($self->directory()."EssentialGenes-".$self->id().$self->selected_version()."-".$media.".tbl","");
467                    }
468            }
469    
470            return $self->{_essential_genes}->{$media};
471    }
472    
473  =head3 compound_table  =head3 compound_table
474  Definition:  Definition:
475          FIGMODELTable = FIGMODELmodel->compound_table();          FIGMODELTable = FIGMODELmodel->compound_table();
# Line 681  Line 713 
713                                  $self->{_modification_time} = $stats->{"Gap fill date"}->[0];                                  $self->{_modification_time} = $stats->{"Gap fill date"}->[0];
714                          }                          }
715                  } else {                  } else {
716                          $self->{_modification_time} = 0;                          $self->{_modification_time} = $self->{_data}->{date}->[0];
717                  }                  }
718          }          }
719          return $self->{_modification_time};          return $self->{_modification_time};
# Line 892  Line 924 
924          #Checking that the table is defined and the output file exists          #Checking that the table is defined and the output file exists
925          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {
926                  $self->figmodel()->database()->print_array_to_file($self->directory()."EssentialGenes-".$self->id()."-".$Media.".tbl",[join("\n",@{$result->get_row(0)->{"ESSENTIALGENES"}})]);                  $self->figmodel()->database()->print_array_to_file($self->directory()."EssentialGenes-".$self->id()."-".$Media.".tbl",[join("\n",@{$result->get_row(0)->{"ESSENTIALGENES"}})]);
927            } else {
928                    $self->figmodel()->error_message("FIGMODELmodel:run_default_model_predictions:could not identify essential reactions for model ".$self->id().$self->selected_version().".");
929                    return $self->figmodel()->fail();
930          }          }
931    
932          #Classifying reactions and compounds          #Classifying reactions and compounds
933          my $tbl = $self->classify_model_reactions($Media);          my $tbl = $self->classify_model_reactions($Media);
934            if (!defined($tbl)) {
935                    $self->figmodel()->error_message("FIGMODELmodel:run_default_model_predictions:could not classify reactions for model ".$self->id().$self->selected_version().".");
936                    return $self->figmodel()->fail();
937            }
938          $tbl->save();          $tbl->save();
939    
940          return $self->figmodel()->success();          return $self->figmodel()->success();
# Line 1049  Line 1088 
1088                                  $CurrentStats->{"Gap filling reactions"}->[0]++;                                  $CurrentStats->{"Gap filling reactions"}->[0]++;
1089                          } else {                          } else {
1090                                  foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {                                  foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {
1091                                          my @GeneList = split(/\+/,$GeneSet);                                          $_ = $GeneSet;
1092                                            my @GeneList = /(peg\.\d+)/g;
1093                                          foreach my $Gene (@GeneList) {                                          foreach my $Gene (@GeneList) {
1094                                                  if ($Gene =~ m/(peg\.\d+)/) {                                                  if ($Gene =~ m/(peg\.\d+)/) {
1095                                                          $GeneHash{$1} = 1;                                                          $GeneHash{$1} = 1;
# Line 1140  Line 1180 
1180          for (my $i=($SolutionData->size()-1); $i >=0; $i--) {          for (my $i=($SolutionData->size()-1); $i >=0; $i--) {
1181                  if (defined($SolutionData->get_row($i)->{"Notes"}) && $SolutionData->get_row($i)->{"Notes"}->[0] =~ m/^Recursive/) {                  if (defined($SolutionData->get_row($i)->{"Notes"}) && $SolutionData->get_row($i)->{"Notes"}->[0] =~ m/^Recursive/) {
1182                          my $AllSolutions = substr($SolutionData->get_row($i)->{"Notes"}->[0],15);                          my $AllSolutions = substr($SolutionData->get_row($i)->{"Notes"}->[0],15);
                         print "Solution:".$AllSolutions."\n";  
1183                          my @TempThree = split(/\|/,$AllSolutions);                          my @TempThree = split(/\|/,$AllSolutions);
1184                          if (@TempThree > 0 && $TempThree[0] =~ m/.+:(.+)/) {                          if (@TempThree > 0 && $TempThree[0] =~ m/.+:(.+)/) {
1185                                  my @TempFour = split(/,/,$1);                                  my @TempFour = split(/,/,$1);
# Line 1163  Line 1202 
1202                                                  push(@{$ReactionList},$ID);                                                  push(@{$ReactionList},$ID);
1203                                          }                                          }
1204                                  }                                  }
                                 print "Solution:".$TempThree[0]."\n";  
1205                                  $self->figmodel()->IntegrateGrowMatchSolution($self->id(),undef,$ReactionList,$DirectionList,"GAP FILLING",0,1);                                  $self->figmodel()->IntegrateGrowMatchSolution($self->id(),undef,$ReactionList,$DirectionList,"GAP FILLING",0,1);
1206                          }                          }
1207                          last;                          last;
# Line 1171  Line 1209 
1209          }          }
1210          #Updating model stats with gap filling results          #Updating model stats with gap filling results
1211          my $ElapsedTime = time() - $StartTime;          my $ElapsedTime = time() - $StartTime;
1212          $self->figmodel()->ClearDBModel($self->id(),1);          $self->figmodel()->database()->ClearDBModel($self->id(),1);
1213          #Determining why each gap filling reaction was added          #Determining why each gap filling reaction was added
1214          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);
1215          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
# Line 1201  Line 1239 
1239          my ($self,$GapFillingRunSpecs,$TansferFileSuffix) = @_;          my ($self,$GapFillingRunSpecs,$TansferFileSuffix) = @_;
1240          my $UniqueFilename = $self->figmodel()->filename();          my $UniqueFilename = $self->figmodel()->filename();
1241          if (defined($GapFillingRunSpecs) && @{$GapFillingRunSpecs} > 0) {          if (defined($GapFillingRunSpecs) && @{$GapFillingRunSpecs} > 0) {
                 print "Gap filling specs:\n".join("\n",@{$GapFillingRunSpecs})."\n\n";  
1242                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id().$self->selected_version(),"NoBounds",["DataGapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0],"Gap filling runs" => join(";",@{$GapFillingRunSpecs})},"GapFilling-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,undef));                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id().$self->selected_version(),"NoBounds",["DataGapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0],"Gap filling runs" => join(";",@{$GapFillingRunSpecs})},"GapFilling-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,undef));
   
1243                  #Checking that the solution exists                  #Checking that the solution exists
1244                  if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt") {                  if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt") {
1245                          $self->figmodel()->error_message("FIGMODEL:GapFillingAlgorithm: Could not find MFA output file!");                          $self->figmodel()->error_message("FIGMODEL:GapFillingAlgorithm: Could not find MFA output file!");
# Line 1213  Line 1249 
1249                  my $GapFillResultTable = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt",";","",0,undef);                  my $GapFillResultTable = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt",";","",0,undef);
1250                  if (defined($TansferFileSuffix)) {                  if (defined($TansferFileSuffix)) {
1251                          system("cp ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt ".$self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt");                          system("cp ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt ".$self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt");
                         system("cp ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingReport.txt ".$self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt");  
1252                  }                  }
   
1253                  #If the system is not configured to preserve all logfiles, then the mfatoolkit output folder is deleted                  #If the system is not configured to preserve all logfiles, then the mfatoolkit output folder is deleted
1254                  $self->figmodel()->clearing_output($UniqueFilename,"GapFilling-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");                  $self->figmodel()->clearing_output($UniqueFilename,"GapFilling-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");
1255                  return $GapFillingRunSpecs;                  return $GapFillResultTable;
1256          }          }
1257          if (defined($TansferFileSuffix)) {          if (defined($TansferFileSuffix)) {
1258                  $self->figmodel()->database()->print_array_to_file($self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt",["Experiment;Solution index;Solution cost;Solution reactions"]);                  $self->figmodel()->database()->print_array_to_file($self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt",["Experiment;Solution index;Solution cost;Solution reactions"]);
# Line 1226  Line 1260 
1260          return undef;          return undef;
1261  }  }
1262    
1263    =head3 datagapgen
1264    Definition:
1265            $model->datagapgen($NumberOfProcessors,$ProcessorIndex,$Filename);
1266    =cut
1267    
1268    sub datagapgen {
1269            my ($self,$Media,$KOList,$NoKOList,$suffix) = @_;
1270            #Setting default values for inputs
1271            if (!defined($NoKOList)) {
1272                    $NoKOList = "none";
1273            }
1274            if (!defined($KOList)) {
1275                    $KOList = "none";
1276            }
1277            #Getting unique filename
1278            my $Filename = $self->figmodel()->filename();
1279            if (!defined($suffix)) {
1280                    $suffix = "-".$Media."-".$KOList."-S";
1281            }
1282            $KOList =~ s/,/;/g;
1283            $NoKOList =~ s/,/;/g;
1284            #Running the gap generation
1285            system($self->figmodel()->GenerateMFAToolkitCommandLineCall($Filename,$self->id().$self->selected_version(),$Media,["GapGeneration"],{"Reactions that should always be active" => $NoKOList,"Reactions to knockout" => $KOList,"Reactions that are always blocked" => "none"},"Gapgeneration-".$self->id().$self->selected_version()."-".$Filename.".log",undef,undef));
1286            my $ProblemReport = $self->figmodel()->LoadProblemReport($Filename);
1287            if (!defined($ProblemReport)) {
1288                    $self->figmodel()->error_message("FIGMODEL:GapGenerationAlgorithm;No problem report;".$Filename.";".$self->id().$self->selected_version().";".$Media.";".$KOList.";".$NoKOList);
1289                    return undef;
1290            }
1291            #Clearing the output folder and log file
1292            $self->figmodel()->clearing_output($Filename,$self->directory()."Gapgeneration-".$self->id().$self->selected_version()."-".$Filename.".log");
1293            #Scheduling the testing of this gap filling solution
1294            my $Tbl = FIGMODELTable->new(["Experiment","Solution index","Solution cost","Solution reactions"],$self->directory().$self->id().$self->selected_version()."-GG".$suffix.".txt",undef,";","|",undef);
1295            for (my $j=0; $j < $ProblemReport->size(); $j++) {
1296                    if ($ProblemReport->get_row($j)->{"Notes"}->[0] =~ m/^Recursive\sMILP\s([^)]+)/) {
1297                            my @SolutionList = split(/\|/,$1);
1298                            for (my $k=0; $k < @SolutionList; $k++) {
1299                                    if ($SolutionList[$k] =~ m/(\d+):(.+)/) {
1300                                            $Tbl->add_row({"Experiment"=>[$Media],"Solution index"=>[$k],"Solution cost"=>[$1],"Solution reactions"=>[$2]});
1301                                    }
1302                            }
1303                    }
1304            }
1305            return $Tbl;
1306    }
1307    
1308  =head3 TestSolutions  =head3 TestSolutions
1309  Definition:  Definition:
1310          $model->TestSolutions($ModelID,$NumProcessors,$ProcessorIndex,$GapFill);          $model->TestSolutions($ModelID,$NumProcessors,$ProcessorIndex,$GapFill);
# Line 1284  Line 1363 
1363                          push(@{$DirectionArray},$SolutionHash{$ReactionList[$k]});                          push(@{$DirectionArray},$SolutionHash{$ReactionList[$k]});
1364                  }                  }
1365                  print "Integrating solution!\n";                  print "Integrating solution!\n";
1366                  $self->IntegrateGrowMatchSolution($self->id().$self->selected_version(),$self->directory().$self->id().$TempVersion.".txt",$ReactionArray,$DirectionArray,"Gapfilling ".$GapFillResultTable->get_row($i)->{"Experiment"}->[0],1,1);                  $self->figmodel()->IntegrateGrowMatchSolution($self->id().$self->selected_version(),$self->directory().$self->id().$TempVersion.".txt",$ReactionArray,$DirectionArray,"Gapfilling ".$GapFillResultTable->get_row($i)->{"Experiment"}->[0],1,1);
1367                  my $model = $self->get_model($self->id().$TempVersion);                  $self->PrintModelLPFile();
                 $model->PrintModelLPFile();  
1368                  #Running the model against all available experimental data                  #Running the model against all available experimental data
1369                  print "Running test model!\n";                  print "Running test model!\n";
1370                  my ($FalsePostives,$FalseNegatives,$CorrectNegatives,$CorrectPositives,$Errorvector,$HeadingVector) = $self->RunAllStudiesWithDataFast("All");                  my ($FalsePostives,$FalseNegatives,$CorrectNegatives,$CorrectPositives,$Errorvector,$HeadingVector) = $self->RunAllStudiesWithDataFast("All");
# Line 1367  Line 1445 
1445  sub CreateSingleGenomeReactionList {  sub CreateSingleGenomeReactionList {
1446          my ($self,$RunGapFilling) = @_;          my ($self,$RunGapFilling) = @_;
1447    
1448            #Creating directory
1449            if ($self->owner() ne "master" && !-d $self->figmodel()->config("organism directory")->[0].$self->owner()."/") {
1450                    system("mkdir ".$self->figmodel()->config("organism directory")->[0].$self->owner()."/");
1451            } elsif ($self->owner() eq "master" && !-d $self->figmodel()->config("organism directory")->[0].$self->genome()."/") {
1452                    system("mkdir ".$self->figmodel()->config("organism directory")->[0].$self->genome()."/");
1453            }
1454            if ($self->owner() ne "master" && !-d $self->figmodel()->config("organism directory")->[0].$self->owner()."/".$self->genome()."/") {
1455                    system("mkdir ".$self->figmodel()->config("organism directory")->[0].$self->owner()."/".$self->genome()."/");
1456            }
1457    
1458          #Getting genome stats          #Getting genome stats
1459          my $genomestats = $self->figmodel()->get_genome_stats($self->genome());          my $genomestats = $self->figmodel()->get_genome_stats($self->genome());
1460          my $FeatureTable = $self->figmodel()->GetGenomeFeatureTable($self->genome());          my $FeatureTable = $self->figmodel()->GetGenomeFeatureTable($self->genome());
# Line 1702  Line 1790 
1790          $self->figmodel()->database()->save_table($NewModelTable);          $self->figmodel()->database()->save_table($NewModelTable);
1791          $self->{_reaction_data} = $NewModelTable;          $self->{_reaction_data} = $NewModelTable;
1792          #Clearing the previous model from the cache          #Clearing the previous model from the cache
1793          $self->figmodel()->ClearDBModel($self->id(),1);          $self->figmodel()->database()->ClearDBModel($self->id(),1);
1794          #Updating the model stats table          #Updating the model stats table
1795          $self->update_stats_for_build();          $self->update_stats_for_build();
1796          $self->PrintSBMLFile();          $self->PrintSBMLFile();
# Line 1823  Line 1911 
1911          }          }
1912    
1913          #Clearing the previous model from the cache          #Clearing the previous model from the cache
1914          $self->figmodel()->ClearDBModel($self->id(),1);          $self->figmodel()->database()->ClearDBModel($self->id(),1);
1915          $ModelTable->save();          $ModelTable->save();
1916    
1917          return $self->success();          return $self->success();
# Line 1895  Line 1983 
1983          Runs microarray analysis attempting to turn off genes that are inactive in the microarray          Runs microarray analysis attempting to turn off genes that are inactive in the microarray
1984  =cut  =cut
1985  sub run_microarray_analysis {  sub run_microarray_analysis {
1986          my ($self,$media,$jobid,$index,$genecall) = @_;          my ($self,$media,$label,$index,$genecall) = @_;
1987          $genecall =~ s/_/:/g;          $genecall =~ s/_/:/g;
1988          $genecall =~ s/\//;/g;          $genecall =~ s/\//;/g;
1989          #print "\n\n".$genecall."\n\n";          my $uniqueFilename = $self->figmodel()->filename();
1990          my $command = $self->figmodel()->GenerateMFAToolkitCommandLineCall($jobid,$self->id(),$media,["MFA","MicroarrayAssertions"],{"Microarray assertions" => $self->id().";".$index.";".$genecall,"MFASolver" => "CPLEX","Network output location" => "/scratch/"},"MicroarrayAnalysis-".$jobid.".txt",undef,$self->selected_version());          my $command = $self->figmodel()->GenerateMFAToolkitCommandLineCall($uniqueFilename,$self->id(),$media,["ProductionMFA","ShewenellaExperiment"],{"Microarray assertions" => $label.";".$index.";".$genecall,"MFASolver" => "CPLEX","Network output location" => "/scratch/"},"MicroarrayAnalysis-".$uniqueFilename.".txt",undef,$self->selected_version());
         #print $command."\n";  
1991          system($command);          system($command);
1992          #system("/home/chenry/Software/MFAToolkitRepository/Linux/mfatoolkit resetparameter \"user bounds filename\" \"Carbon-D-Glucose.txt\" resetparameter output_folder \"32749.354149.0/\" resetparameter \"Microarray assertions\" \"Seed83333.1;0;peg.3130:-1;peg.4035:-1\" resetparameter \"MFASolver\" \"CPLEX\" resetparameter \"Network output location\" \"/scratch/\" LoadCentralSystem \"/vol/model-dev/MODEL_DEV_DB/Models/83333.1/Seed83333.1.txt\" > \"/vol/model-dev/MODEL_DEV_DB/ReactionDB/log/MicroarrayAnalysis-32749.354149.0.txt\"");          my $filename = $self->figmodel()->config("MFAToolkit output directory")->[0].$uniqueFilename."/MicroarrayOutput-".$index.".txt";
1993        if (-e $filename) {
1994            my $output = $self->figmodel()->database()->load_single_column_file($filename);
1995            if (defined($output->[0])) {
1996                    my @array = split(/;/,$output->[0]);
1997                    $self->figmodel()->clearing_output($uniqueFilename,"MicroarrayAnalysis-".$uniqueFilename.".txt");
1998                    return ($array[0],$array[1],$array[8].":".$array[2],$array[9].":".$array[3],$array[10].":".$array[4],$array[11].":".$array[5],$array[12].":".$array[6],$array[13].":".$array[7]);
1999            }
2000            print STDERR $filename." is empty!";
2001        }
2002        print STDERR $filename." not found!";
2003        $self->figmodel()->clearing_output($uniqueFilename,"MicroarrayAnalysis-".$uniqueFilename.".txt");
2004    
2005            return undef;
2006  }  }
2007    
2008  =head3 find_minimal_pathways  =head3 find_minimal_pathways
# Line 1912  Line 2012 
2012          Runs microarray analysis attempting to turn off genes that are inactive in the microarray          Runs microarray analysis attempting to turn off genes that are inactive in the microarray
2013  =cut  =cut
2014  sub find_minimal_pathways {  sub find_minimal_pathways {
2015          my ($self,$media,$objective,$solutionnum) = @_;          my ($self,$media,$objective,$solutionnum,$AllReversible,$additionalexchange) = @_;
2016    
2017          #Setting default media          #Setting default media
2018          if (!defined($media)) {          if (!defined($media)) {
# Line 1924  Line 2024 
2024                  $solutionnum = "5";                  $solutionnum = "5";
2025          }          }
2026    
2027            #Setting additional exchange fluxes
2028            if (!defined($additionalexchange) || length($additionalexchange) == 0) {
2029                    if ($self->id() eq "iAF1260") {
2030                            $additionalexchange = "cpd03422[c]:-100:100;cpd01997[c]:-100:100;cpd11416[c]:-100:0;cpd15378[c]:-100:0;cpd15486[c]:-100:0";
2031                    } else {
2032                            $additionalexchange = $self->figmodel()->config("default exchange fluxes")->[0];
2033                    }
2034            }
2035    
2036          #Translating objective          #Translating objective
2037          my $objectivestring;          my $objectivestring;
2038          if ($objective eq "ALL") {          if ($objective eq "ALL") {
# Line 1944  Line 2053 
2053                          }                          }
2054                  }                  }
2055                  for (my $i=0; $i < @objectives; $i++) {                  for (my $i=0; $i < @objectives; $i++) {
2056                          $self->find_minimal_pathways($media,$objectives[$i])                          $self->find_minimal_pathways($media,$objectives[$i]);
2057                  }                  }
2058                    return;
2059          } elsif ($objective eq "ENERGY") {          } elsif ($objective eq "ENERGY") {
2060                  $objectivestring = "MAX;FLUX;rxn00062;c;1";                  $objectivestring = "MAX;FLUX;rxn00062;c;1";
2061          } elsif ($objective =~ m/cpd\d\d\d\d\d/) {          } elsif ($objective =~ m/cpd\d\d\d\d\d/) {
2062                    if ($objective =~ m/\[(\w)\]/) {
2063                            $objectivestring = "MIN;DRAIN_FLUX;".$objective.";".$1.";1";
2064                            $additionalexchange .= ";".$objective."[".$1."]:-100:0";
2065                    } else {
2066                  $objectivestring = "MIN;DRAIN_FLUX;".$objective.";c;1";                  $objectivestring = "MIN;DRAIN_FLUX;".$objective.";c;1";
2067                            $additionalexchange .= ";".$objective."[c]:-100:0";
2068                    }
2069            } elsif ($objective =~ m/(rxn\d\d\d\d\d)/) {
2070                    my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateData($objective);
2071                    for (my $i=0; $i < @{$Products};$i++) {
2072                            my $temp = $Products->[$i]->{"DATABASE"}->[0];
2073                            if ($additionalexchange !~ m/$temp/) {
2074                                    #$additionalexchange .= ";".$temp."[c]:-100:0";
2075                            }
2076                    }
2077                    for (my $i=0; $i < @{$Reactants};$i++) {
2078                            print $Reactants->[$i]->{"DATABASE"}->[0]." started\n";
2079                            $self->find_minimal_pathways($media,$Reactants->[$i]->{"DATABASE"}->[0],$additionalexchange);
2080                            print $Reactants->[$i]->{"DATABASE"}->[0]." done\n";
2081                    }
2082                    return;
2083            }
2084    
2085            #Adding additional drains
2086            if (($objective eq "cpd15665" || $objective eq "cpd15667" || $objective eq "cpd15668" || $objective eq "cpd15669") && $additionalexchange !~ m/cpd15666/) {
2087                    $additionalexchange .= ";cpd15666[c]:0:100";
2088            } elsif ($objective eq "cpd11493" && $additionalexchange !~ m/cpd12370/) {
2089                    $additionalexchange .= ";cpd12370[c]:0:100";
2090            } elsif ($objective eq "cpd00166" && $additionalexchange !~ m/cpd01997/) {
2091                    $additionalexchange .= ";cpd01997[c]:0:100;cpd03422[c]:0:100";
2092            }
2093    
2094            #Running MFAToolkit
2095            my $filename = $self->figmodel()->filename();
2096            my $command;
2097            if (defined($AllReversible) && $AllReversible == 1) {
2098                    $command = $self->figmodel()->GenerateMFAToolkitCommandLineCall($filename,$self->id(),$media,["ProductionMFA"],{"Make all reactions reversible in MFA"=>1, "Recursive MILP solution limit" => $solutionnum,"Generate pathways to objective" => 1,"MFASolver" => "CPLEX","objective" => $objectivestring,"exchange species" => $additionalexchange},"MinimalPathways-".$media."-".$self->id().$self->selected_version().".txt",undef,$self->selected_version());
2099            } else {
2100                    $command = $self->figmodel()->GenerateMFAToolkitCommandLineCall($filename,$self->id(),$media,["ProductionMFA"],{"Make all reactions reversible in MFA"=>0, "Recursive MILP solution limit" => $solutionnum,"Generate pathways to objective" => 1,"MFASolver" => "CPLEX","objective" => $objectivestring,"exchange species" => $additionalexchange},"MinimalPathways-".$media."-".$self->id().$self->selected_version().".txt",undef,$self->selected_version());
2101            }
2102            system($command);
2103    
2104            #Loading problem report
2105            my $results = $self->figmodel()->LoadProblemReport($filename);
2106            #Clearing output
2107            $self->figmodel()->clearing_output($filename,"MinimalPathways-".$media."-".$self->id()."-".$objective.".txt");
2108            if (!defined($results)) {
2109                    print STDERR $objective." pathway results not found!\n";
2110                    return;
2111            }
2112    
2113            #Parsing output
2114            my @Array;
2115            my $row = $results->get_row(1);
2116            if (defined($row->{"Notes"}->[0])) {
2117                    $_ = $row->{"Notes"}->[0];
2118                    @Array = /\d+:([^\|]+)\|/g;
2119            }
2120    
2121            #Writing output to file
2122            $self->figmodel()->database()->print_array_to_file($self->directory()."MinimalPathways-".$media."-".$objective."-".$self->id()."-".$AllReversible."-".$self->selected_version().".txt",[join("|",@Array)]);
2123    }
2124    
2125    =head3 find_minimal_pathways
2126    Definition:
2127            int::status = FIGMODEL->find_minimal_pathways(string::media,string::objective);
2128    Description:
2129            Runs microarray analysis attempting to turn off genes that are inactive in the microarray
2130    =cut
2131    sub find_minimal_pathways_two {
2132            my ($self,$media,$objective,$solutionnum,$AllReversible,$additionalexchange) = @_;
2133    
2134            #Setting default media
2135            if (!defined($media)) {
2136                    $media = "Complete";
2137            }
2138    
2139            #Setting default solution number
2140            if (!defined($solutionnum)) {
2141                    $solutionnum = "5";
2142          }          }
2143    
2144          #Setting additional exchange fluxes          #Setting additional exchange fluxes
2145          my $additionalexchange = $self->config("default exchange fluxes")->[0];          if (!defined($additionalexchange) || length($additionalexchange) == 0) {
2146          if ($objective eq "cpd15665" || $objective eq "cpd15667" || $objective eq "cpd15668" || $objective eq "cpd15669") {                  if ($self->id() eq "iAF1260") {
2147                            $additionalexchange = "cpd03422[c]:-100:100;cpd01997[c]:-100:100;cpd11416[c]:-100:0;cpd15378[c]:-100:0;cpd15486[c]:-100:0";
2148                    } else {
2149                            $additionalexchange = $self->figmodel()->config("default exchange fluxes")->[0];
2150                    }
2151            }
2152    
2153            #Translating objective
2154            my $objectivestring;
2155            if ($objective eq "ALL") {
2156                    #Getting the list of universal building blocks
2157                    my $buildingblocks = $self->config("universal building blocks");
2158                    my @objectives = keys(%{$buildingblocks});
2159                    #Getting the nonuniversal building blocks
2160                    my $otherbuildingblocks = $self->config("nonuniversal building blocks");
2161                    my @array = keys(%{$otherbuildingblocks});
2162                    if (defined($self->get_biomass()) && defined($self->figmodel()->get_reaction($self->get_biomass()->{"LOAD"}->[0]))) {
2163                            my $equation = $self->figmodel()->get_reaction($self->get_biomass()->{"LOAD"}->[0])->{"EQUATION"}->[0];
2164                            if (defined($equation)) {
2165                                    for (my $i=0; $i < @array; $i++) {
2166                                            if (CORE::index($equation,$array[$i]) > 0) {
2167                                                    push(@objectives,$array[$i]);
2168                                            }
2169                                    }
2170                            }
2171                    }
2172                    for (my $i=0; $i < @objectives; $i++) {
2173                            $self->find_minimal_pathways($media,$objectives[$i]);
2174                    }
2175                    return;
2176            } elsif ($objective eq "ENERGY") {
2177                    $objectivestring = "MAX;FLUX;rxn00062;c;1";
2178            } elsif ($objective =~ m/cpd\d\d\d\d\d/) {
2179                    if ($objective =~ m/\[(\w)\]/) {
2180                            $objectivestring = "MIN;DRAIN_FLUX;".$objective.";".$1.";1";
2181                            $additionalexchange .= ";".$objective."[".$1."]:-100:0";
2182                    } else {
2183                            $objectivestring = "MIN;DRAIN_FLUX;".$objective.";c;1";
2184                            $additionalexchange .= ";".$objective."[c]:-100:0";
2185                    }
2186            } elsif ($objective =~ m/(rxn\d\d\d\d\d)/) {
2187                    my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateData($objective);
2188                    for (my $i=0; $i < @{$Products};$i++) {
2189                            my $temp = $Products->[$i]->{"DATABASE"}->[0];
2190                            if ($additionalexchange !~ m/$temp/) {
2191                                    #$additionalexchange .= ";".$temp."[c]:-100:0";
2192                            }
2193                    }
2194                    for (my $i=0; $i < @{$Reactants};$i++) {
2195                            print $Reactants->[$i]->{"DATABASE"}->[0]." started\n";
2196                            $self->find_minimal_pathways($media,$Reactants->[$i]->{"DATABASE"}->[0],$additionalexchange);
2197                            print $Reactants->[$i]->{"DATABASE"}->[0]." done\n";
2198                    }
2199                    return;
2200            }
2201    
2202            #Adding additional drains
2203            if (($objective eq "cpd15665" || $objective eq "cpd15667" || $objective eq "cpd15668" || $objective eq "cpd15669") && $additionalexchange !~ m/cpd15666/) {
2204                  $additionalexchange .= ";cpd15666[c]:0:100";                  $additionalexchange .= ";cpd15666[c]:0:100";
2205          } elsif ($objective eq "cpd11493") {          } elsif ($objective eq "cpd11493" && $additionalexchange !~ m/cpd12370/) {
2206                  $additionalexchange .= ";cpd12370[c]:0:100";                  $additionalexchange .= ";cpd12370[c]:0:100";
2207          } elsif ($objective eq "cpd00166") {          } elsif ($objective eq "cpd00166" && $additionalexchange !~ m/cpd01997/) {
2208                  $additionalexchange .= ";cpd01997[c]:0:100;cpd03422[c]:0:100";                  $additionalexchange .= ";cpd01997[c]:0:100;cpd03422[c]:0:100";
2209          }          }
2210    
2211          #Running MFAToolkit          #Running MFAToolkit
2212          my $filename = $self->figmodel()->filename();          my $filename = $self->figmodel()->filename();
2213          my $command = $self->figmodel()->GenerateMFAToolkitCommandLineCall($filename,$self->id(),$media,["MFA"],{"Recursive MILP solution limit" => $solutionnum,"Generate pathways to objective" => 1,"MFASolver" => "CPLEX","objective" => $objectivestring,"exchange species" => $additionalexchange},"MinimalPathways-".$media."-".$self->id().$self->selected_version().".txt",undef,$self->selected_version());          my $command;
2214            if (defined($AllReversible) && $AllReversible == 1) {
2215                    $command = $self->figmodel()->GenerateMFAToolkitCommandLineCall($filename,$self->id(),$media,["ProductionMFA"],{"use simple variable and constraint names"=>1,"Make all reactions reversible in MFA"=>1, "Recursive MILP solution limit" => $solutionnum,"Generate pathways to objective" => 1,"MFASolver" => "SCIP","objective" => $objectivestring,"exchange species" => $additionalexchange},"MinimalPathways-".$media."-".$self->id().$self->selected_version().".txt",undef,$self->selected_version());
2216            } else {
2217                    $command = $self->figmodel()->GenerateMFAToolkitCommandLineCall($filename,$self->id(),$media,["ProductionMFA"],{"use simple variable and constraint names"=>1,"Make all reactions reversible in MFA"=>0, "Recursive MILP solution limit" => $solutionnum,"Generate pathways to objective" => 1,"MFASolver" => "SCIP","objective" => $objectivestring,"exchange species" => $additionalexchange},"MinimalPathways-".$media."-".$self->id().$self->selected_version().".txt",undef,$self->selected_version());
2218            }
2219            print $command."\n";
2220          system($command);          system($command);
2221    
2222          #Loading problem report          #Loading problem report
# Line 1972  Line 2224 
2224          #Clearing output          #Clearing output
2225          $self->figmodel()->clearing_output($filename,"MinimalPathways-".$media."-".$self->id()."-".$objective.".txt");          $self->figmodel()->clearing_output($filename,"MinimalPathways-".$media."-".$self->id()."-".$objective.".txt");
2226          if (!defined($results)) {          if (!defined($results)) {
2227                    print STDERR $objective." pathway results not found!\n";
2228                  return;                  return;
2229          }          }
2230    
# Line 1983  Line 2236 
2236                  @Array = /\d+:([^\|]+)\|/g;                  @Array = /\d+:([^\|]+)\|/g;
2237          }          }
2238    
2239          # Storing data in a figmodel table          #Writing output to file
2240          my $TableObject;          $self->figmodel()->database()->print_array_to_file($self->directory()."MinimalPathways-".$media."-".$objective."-".$self->id()."-".$AllReversible."-".$self->selected_version().".txt",[join("|",@Array)]);
2241          if (-e $self->directory()."MinimalPathways-".$media."-".$self->id().$self->selected_version().".txt") {  }
2242                  $TableObject->load_table($self->directory()."MinimalPathways-".$media."-".$self->id().$self->selected_version().".txt",";","|",0,["OBJECTIVE"]);  
2243          } else {  sub combine_minimal_pathways {
2244                  $TableObject = FIGMODELTable->new(["OBJECTIVE","REACTIONS"],$self->directory()."MinimalPathways-".$media."-".$self->id().$self->selected_version().".txt",["OBJECTIVE"],";","|",undef);          my ($self) = @_;
2245          }  
2246          my $tablerow = $TableObject->get_row_by_key($objective,"OBJECTIVE",1);          my $tbl;
2247          push(@{$tablerow->{"REACTIONS"}},@Array);          if (-e $self->directory()."MinimalPathwayTable-".$self->id().$self->selected_version().".tbl") {
2248          $TableObject->save();                  $tbl = FIGMODELTable::load_table($self->directory()."MinimalPathwayTable-".$self->id().$self->selected_version().".tbl",";","|",0,["Objective","Media","Reversible"]);
2249            } else {
2250                    $tbl = FIGMODELTable->new(["Objective","Media","Reactions","Reversible","Shortest path","Number of essentials","Essentials","Length"],$self->directory()."MinimalPathwayTable-".$self->id().$self->selected_version().".tbl",["Objective","Media","Reversible"],";","|");
2251            }
2252            my @files = glob($self->directory()."MinimalPathways-*");
2253            for (my $i=0; $i < @files;$i++) {
2254                    if ($files[$i] =~ m/MinimalPathways\-(\S+)\-(cpd\d\d\d\d\d)\-(\w+)\-(\d)\-/ || $files[$i] =~ m/MinimalPathways\-(\S+)\-(ENERGY)\-(\w+)\-(\d)\-/) {
2255                            my $reactions = $self->figmodel()->database()->load_single_column_file($files[$i],"");
2256                            if (defined($reactions) && @{$reactions} > 0 && length($reactions->[0]) > 0) {
2257                                    my $newrow = {"Objective"=>[$2],"Media"=>[$1],"Reversible"=>[$4]};
2258                                    my $row = $tbl->get_table_by_key($newrow->{"Objective"}->[0],"Objective")->get_table_by_key($newrow->{"Media"}->[0],"Media")->get_row_by_key($newrow->{"Reversible"}->[0],"Reversible");
2259                                    if (!defined($row)) {
2260                                            $row = $tbl->add_row($newrow);
2261                                    }
2262                                    $row->{Reactions} = $self->figmodel()->database()->load_single_column_file($files[$i],"");
2263                                    delete($row->{"Shortest path"});
2264                                    delete($row->{"Number of essentials"});
2265                                    delete($row->{"Essentials"});
2266                                    delete($row->{"Length"});
2267                                    for (my $j=0; $j < @{$row->{Reactions}}; $j++) {
2268                                            my @array = split(/,/,$row->{Reactions}->[$j]);
2269                                            $row->{"Length"}->[$j] = @array;
2270                                            if (!defined($row->{"Shortest path"}->[0]) || $row->{"Length"}->[$j] < $row->{"Shortest path"}->[0]) {
2271                                                    $row->{"Shortest path"}->[0] = $row->{"Length"}->[$j];
2272                                            }
2273                                            $row->{"Number of essentials"}->[0] = 0;
2274                                            for (my $k=0; $k < @array;$k++) {
2275                                                    if ($array[$k] =~ m/(rxn\d\d\d\d\d)/) {
2276                                                            my $class = $self->get_reaction_class($1,1);
2277                                                            my $temp = $row->{Media}->[0].":Essential";
2278                                                            if ($class =~ m/$temp/) {
2279                                                                    $row->{"Number of essentials"}->[$j]++;
2280                                                                    if (!defined($row->{"Essentials"}->[$j]) && length($row->{"Essentials"}->[$j]) > 0) {
2281                                                                            $row->{"Essentials"}->[$j] = $array[$k];
2282                                                                    } else {
2283                                                                            $row->{"Essentials"}->[$j] .= ",".$array[$k];
2284                                                                    }
2285                                                            }
2286                                                    }
2287                                            }
2288                                    }
2289                            }
2290                    }
2291            }
2292            $tbl->save();
2293  }  }
2294    
2295  =head3 calculate_growth  =head3 calculate_growth
# Line 2036  Line 2333 
2333          7.) Dead: these reactions are disconnected from the network.          7.) Dead: these reactions are disconnected from the network.
2334  =cut  =cut
2335  sub classify_model_reactions {  sub classify_model_reactions {
2336          my ($self,$Media) = @_;          my ($self,$Media,$SaveChanges) = @_;
2337    
2338          #Getting unique file for printing model output          #Getting unique file for printing model output
2339          my $UniqueFilename = $self->figmodel()->filename();          my $UniqueFilename = $self->figmodel()->filename();
# Line 2123  Line 2420 
2420                                  $CpdRow->{MEDIA}->[$index] = $Media;                                  $CpdRow->{MEDIA}->[$index] = $Media;
2421                          }                          }
2422                  }                  }
2423                    if (!defined($SaveChanges) || $SaveChanges == 1) {
2424                  $cpdclasstable->save();                  $cpdclasstable->save();
2425          }          }
2426            }
2427          if (defined($ReactionTB)) {          if (defined($ReactionTB)) {
2428                  for (my $i=0; $i < $ReactionTB->size(); $i++) {                  for (my $i=0; $i < $ReactionTB->size(); $i++) {
2429                          my $Row = $ReactionTB->get_row($i);                          my $Row = $ReactionTB->get_row($i);
# Line 2179  Line 2478 
2478                                  $RxnRow->{MEDIA}->[$index] = $Media;                                  $RxnRow->{MEDIA}->[$index] = $Media;
2479                          }                          }
2480                  }                  }
2481                    if (!defined($SaveChanges) || $SaveChanges == 1) {
2482                  $rxnclasstable->save();                  $rxnclasstable->save();
2483          }          }
2484            }
2485          return ($rxnclasstable,$cpdclasstable);          return ($rxnclasstable,$cpdclasstable);
2486  }  }
2487    
# Line 2212  Line 2513 
2513    
2514          #Running simulations          #Running simulations
2515          system($self->config("mfalite executable")->[0]." ".$self->config("Reaction database directory")->[0]."masterfiles/MediaTable.txt ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/Jobfile.txt ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/Output.txt");          system($self->config("mfalite executable")->[0]." ".$self->config("Reaction database directory")->[0]."masterfiles/MediaTable.txt ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/Jobfile.txt ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/Output.txt");
         print "simulation complete for ".$self->id().$self->selected_version()."\n";  
2516          #Parsing the results          #Parsing the results
2517          my $Results = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/Output.txt",";","\\|",0,undef);          my $Results = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/Output.txt",";","\\|",0,undef);
2518          if (!defined($Results)) {          if (!defined($Results)) {
# Line 2619  Line 2919 
2919                                          if (length($GapFillingRunSpecs) > 0) {                                          if (length($GapFillingRunSpecs) > 0) {
2920                                                  $GapFillingRunSpecs .= ";";                                                  $GapFillingRunSpecs .= ";";
2921                                          }                                          }
2922                                          $GapFillingRunSpecs .= $HeadingDataArray[2].":".$HeadingDataArray[1].".txt:".$HeadingDataArray[3];                                          $GapFillingRunSpecs .= $HeadingDataArray[2].":".$HeadingDataArray[1].":".$HeadingDataArray[3];
2923                                  } else {                                  } else {
2924                                          $SolutionExistedCount++;                                          $SolutionExistedCount++;
2925                                  }                                  }
# Line 2644  Line 2944 
2944          my $SolutionsFound = 0;          my $SolutionsFound = 0;
2945          my $GapFillingArray;          my $GapFillingArray;
2946          push(@{$GapFillingArray},split(/;/,$GapFillingRunSpecs));          push(@{$GapFillingArray},split(/;/,$GapFillingRunSpecs));
2947          $self->datagapfill($GapFillingArray);          my $GapFillingResults = $self->datagapfill($GapFillingArray,"GFS");
2948            if (defined($GapFillingResults)) {
2949                    $SolutionsFound = 1;
2950            }
2951    
2952          if (defined($RescuedPreviousResults) && @{$RescuedPreviousResults} > 0) {          if (defined($RescuedPreviousResults) && @{$RescuedPreviousResults} > 0) {
2953                  #Printing previous solutions to GFS file                  #Printing previous solutions to GFS file
# Line 2667  Line 2970 
2970          return $self->success();          return $self->success();
2971  }  }
2972    
2973    =head3 SolutionReconciliation
2974    Definition:
2975            FIGMODELmodel->SolutionReconciliation();
2976    Description:
2977            This is a wrapper for running the solution reconciliation algorithm on any model in the database.
2978            The algorithm performs a reconciliation of any gap filling solutions to identify the combination of solutions that results in the optimal model.
2979            This function prints out one output file in the Model directory: ReconciliationOutput.txt: this is a summary of the results of the reconciliation analysis
2980    =cut
2981    
2982    sub SolutionReconciliation {
2983            my ($self,$GapFill,$Stage) = @_;
2984    
2985            #Setting the output filenames
2986            my $OutputFilename;
2987            my $OutputFilenameTwo;
2988            if ($GapFill == 1) {
2989                    $OutputFilename = $self->directory().$self->id().$self->selected_version()."-GFReconciliation.txt";
2990                    $OutputFilenameTwo = $self->directory().$self->id().$self->selected_version()."-GFSRS.txt";
2991            } else {
2992                    $OutputFilename = $self->directory().$self->id().$self->selected_version()."-GGReconciliation.txt";
2993                    $OutputFilenameTwo = $self->directory().$self->id().$self->selected_version()."-GGSRS.txt";
2994            }
2995    
2996            #In stage one, we run the reconciliation and create a test file to check combined solution performance
2997            if (!defined($Stage) || $Stage == 1) {
2998                    my $GrowMatchTable = $self->figmodel()->database()->LockDBTable("GROWMATCH TABLE");
2999                    my $Row = $GrowMatchTable->get_row_by_key($self->genome(),"ORGANISM",1);
3000                    $Row->{"GF RECONCILATION TIMING"}->[0] = time()."-";
3001                    $GrowMatchTable->save();
3002                    $self->figmodel()->database()->UnlockDBTable("GROWMATCH TABLE");
3003    
3004                    #Getting a unique filename
3005                    my $UniqueFilename = $self->figmodel()->filename();
3006    
3007                    #Copying over the necessary files
3008                    if ($GapFill == 1) {
3009                            if (!-e $self->directory().$self->id().$self->selected_version()."-GFEM.txt") {
3010                                    print STDERR "FIGMODEL:SolutionReconciliation:".$self->directory().$self->id().$self->selected_version()."-GFEM.txt file not found. Could not reconcile!";
3011                                    return 0;
3012                            }
3013                            if (!-e $self->directory().$self->id().$self->selected_version()."-OPEM.txt") {
3014                                    print STDERR "FIGMODEL:SolutionReconciliation:".$self->directory().$self->id().$self->selected_version()."-OPEM.txt file not found. Could not reconcile!";
3015                                    return 0;
3016                            }
3017                            system("cp ".$self->directory().$self->id().$self->selected_version()."-GFEM.txt ".$self->figmodel()->config("MFAToolkit input files")->[0].$UniqueFilename."-GFEM.txt");
3018                            system("cp ".$self->directory().$self->id().$self->selected_version()."-OPEM.txt ".$self->figmodel()->config("MFAToolkit input files")->[0].$UniqueFilename."-OPEM.txt");
3019                            #Backing up and deleting the existing reconciliation file
3020                            if (-e $OutputFilename) {
3021                                    system("cp ".$OutputFilename." ".$self->directory().$self->id().$self->selected_version()."-OldGFReconciliation.txt");
3022                                    unlink($OutputFilename);
3023                            }
3024                    } else {
3025                            if (!-e $self->directory().$self->id().$self->selected_version()."-GGEM.txt") {
3026                                    print STDERR "FIGMODEL:SolutionReconciliation:".$self->directory().$self->id().$self->selected_version()."-GGEM.txt file not found. Could not reconcile!";
3027                                    return 0;
3028                            }
3029                            if (!-e $self->directory().$self->id().$self->selected_version()."-GGOPEM.txt") {
3030                                    print STDERR "FIGMODEL:SolutionReconciliation:".$self->directory().$self->id().$self->selected_version()."-GGOPEM.txt file not found. Could not reconcile!";
3031                                    return 0;
3032                            }
3033                            system("cp ".$self->directory().$self->id().$self->selected_version()."-GGEM.txt ".$self->figmodel()->config("MFAToolkit input files")->[0].$UniqueFilename."-GGEM.txt");
3034                            system("cp ".$self->directory().$self->id().$self->selected_version()."-GGOPEM.txt ".$self->figmodel()->config("MFAToolkit input files")->[0].$UniqueFilename."-OPEM.txt");
3035                            #Backing up and deleting the existing reconciliation file
3036                            if (-e $OutputFilename) {
3037                                    system("cp ".$OutputFilename." ".$self->directory().$self->id().$self->selected_version()."-OldGGReconciliation.txt");
3038                                    unlink($OutputFilename);
3039                            }
3040                    }
3041    
3042                    #Running the reconciliation
3043                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),"NONE",["SolutionReconciliation"],{"Solution data for model optimization" => $UniqueFilename},"Reconciliation".$UniqueFilename.".log",undef,$self->selected_version()));
3044                    $GrowMatchTable = $self->figmodel()->database()->LockDBTable("GROWMATCH TABLE");
3045                    $Row = $GrowMatchTable->get_row_by_key($self->genome(),"ORGANISM",1);
3046                    $Row->{"GF RECONCILATION TIMING"}->[0] .= time();
3047                    $GrowMatchTable->save();
3048                    $self->figmodel()->database()->UnlockDBTable("GROWMATCH TABLE");
3049    
3050                    #Loading the problem report from the reconciliation run
3051                    my $ReconciliatonOutput = $self->figmodel()->LoadProblemReport($UniqueFilename);
3052                    print $UniqueFilename."\n";
3053                    #Clearing output files
3054                    $self->figmodel()->clearing_output($UniqueFilename,"Reconciliation".$UniqueFilename.".log");
3055                    $ReconciliatonOutput->save("/home/chenry/Test.txt");
3056    
3057                    #Checking the a problem report was found and was loaded
3058                    if (!defined($ReconciliatonOutput) || $ReconciliatonOutput->size() < 1 || !defined($ReconciliatonOutput->get_row(0)->{"Notes"}->[0])) {
3059                            print STDERR "FIGMODEL:SolutionReconciliation: MFAToolkit output from SolutionReconciliation of ".$self->id()." not found!\n\n";
3060                            return 0;
3061                    }
3062    
3063                    #Processing the solutions
3064                    my $SolutionCount = 0;
3065                    my $ReactionSetHash;
3066                    my $SingleReactionHash;
3067                    my $ReactionDataHash;
3068                    for (my $n=0; $n < $ReconciliatonOutput->size(); $n++) {
3069                            if (defined($ReconciliatonOutput->get_row($n)->{"Notes"}->[0]) && $ReconciliatonOutput->get_row($n)->{"Notes"}->[0] =~ m/^Recursive\sMILP\s([^;]+)/) {
3070                                    #Breaking up the solution into reaction sets
3071                                    my @ReactionSets = split(/\|/,$1);
3072                                    #Creating reaction lists for each set
3073                                    my $SolutionHash;
3074                                    for (my $i=0; $i < @ReactionSets; $i++) {
3075                                            if (length($ReactionSets[$i]) > 0) {
3076                                                    my @Alternatives = split(/:/,$ReactionSets[$i]);
3077                                                    for (my $j=1; $j < @Alternatives; $j++) {
3078                                                            if (length($Alternatives[$j]) > 0) {
3079                                                                    push(@{$SolutionHash->{$Alternatives[$j]}},$Alternatives[0]);
3080                                                            }
3081                                                    }
3082                                                    if (@Alternatives == 1) {
3083                                                            $SingleReactionHash->{$Alternatives[0]}->{$SolutionCount} = 1;
3084                                                            if (!defined($SingleReactionHash->{$Alternatives[0]}->{"COUNT"})) {
3085                                                                    $SingleReactionHash->{$Alternatives[0]}->{"COUNT"} = 0;
3086                                                            }
3087                                                            $SingleReactionHash->{$Alternatives[0]}->{"COUNT"}++;
3088                                                    }
3089                                            }
3090                                    }
3091                                    #Identifying reactions sets and storing the sets in the reactions set hash
3092                                    foreach my $Solution (keys(%{$SolutionHash})) {
3093                                            my $SetKey = join(",",sort(@{$SolutionHash->{$Solution}}));
3094                                            if (!defined($ReactionSetHash->{$SetKey}->{$SetKey}->{$SolutionCount})) {
3095                                                    $ReactionSetHash->{$SetKey}->{$SetKey}->{$SolutionCount} = 1;
3096                                                    if (!defined($ReactionSetHash->{$SetKey}->{$SetKey}->{"COUNT"})) {
3097                                                            $ReactionSetHash->{$SetKey}->{$SetKey}->{"COUNT"} = 0;
3098                                                    }
3099                                                    $ReactionSetHash->{$SetKey}->{$SetKey}->{"COUNT"}++;
3100                                            }
3101                                            $ReactionSetHash->{$SetKey}->{$Solution}->{$SolutionCount} = 1;
3102                                            if (!defined($ReactionSetHash->{$SetKey}->{$Solution}->{"COUNT"})) {
3103                                                    $ReactionSetHash->{$SetKey}->{$Solution}->{"COUNT"} = 0;
3104                                            }
3105                                            $ReactionSetHash->{$SetKey}->{$Solution}->{"COUNT"}++;
3106                                    }
3107                                    $SolutionCount++;
3108                            }
3109                    }
3110    
3111                    #Handling the scenario where no solutions were found
3112                    if ($SolutionCount == 0) {
3113                            print STDERR "FIGMODEL:SolutionReconciliation: Reconciliation unsuccessful. No solution found.\n\n";
3114                            return 0;
3115                    }
3116    
3117                    #Printing results without solution performance figures. Also printing solution test file
3118                    open (RECONCILIATION, ">$OutputFilename");
3119                    #Printing the file heading
3120                    print RECONCILIATION "DATABASE;DEFINITION;REVERSIBLITY;DELTAG;DIRECTION;NUMBER OF SOLUTIONS";
3121                    for (my $i=0; $i < $SolutionCount; $i++) {
3122                            print RECONCILIATION ";Solution ".$i;
3123                    }
3124                    print RECONCILIATION "\n";
3125                    #Printing the singlet reactions first
3126                    my $Solutions;
3127                    print RECONCILIATION "SINGLET REACTIONS\n";
3128                    my @SingletReactions = keys(%{$SingleReactionHash});
3129                    for (my $j=0; $j < $SolutionCount; $j++) {
3130                            $Solutions->[$j]->{"BASE"} = $j;
3131                    }
3132                    for (my $i=0; $i < @SingletReactions; $i++) {
3133                            my $ReactionData;
3134                            if (defined($ReactionDataHash->{$SingletReactions[$i]})) {
3135                                    $ReactionData = $ReactionDataHash->{$SingletReactions[$i]};
3136                            } else {
3137                                    my $Direction = substr($SingletReactions[$i],0,1);
3138                                    if ($Direction eq "+") {
3139                                            $Direction = "=>";
3140                                    } else {
3141                                            $Direction = "<=";
3142                                    }
3143                                    my $Reaction = substr($SingletReactions[$i],1);
3144                                    $ReactionData = FIGMODELObject->load($self->figmodel()->config("reaction directory")->[0].$Reaction,"\t");
3145                                    $ReactionData->{"DIRECTIONS"}->[0] = $Direction;
3146                                    $ReactionData->{"REACTIONS"}->[0] = $Reaction;
3147                                    if (!defined($ReactionData->{"DEFINITION"}->[0])) {
3148                                            $ReactionData->{"DEFINITION"}->[0] = "UNKNOWN";
3149                                    }
3150                                    if (!defined($ReactionData->{"THERMODYNAMIC REVERSIBILITY"}->[0])) {
3151                                            $ReactionData->{"THERMODYNAMIC REVERSIBILITY"}->[0] = "UNKNOWN";
3152                                    }
3153                                    if (!defined($ReactionData->{"DELTAG"}->[0])) {
3154                                            $ReactionData->{"DELTAG"}->[0] = "UNKNOWN";
3155                                    }
3156                                    $ReactionDataHash->{$SingletReactions[$i]} = $ReactionData;
3157                            }
3158                            print RECONCILIATION $ReactionData->{"REACTIONS"}->[0].";".$ReactionData->{"DEFINITION"}->[0].";".$ReactionData->{"THERMODYNAMIC REVERSIBILITY"}->[0].";".$ReactionData->{"DELTAG"}->[0].";".$ReactionData->{"DIRECTIONS"}->[0].";".$SingleReactionHash->{$SingletReactions[$i]}->{"COUNT"};
3159                            for (my $j=0; $j < $SolutionCount; $j++) {
3160                                    print RECONCILIATION ";";
3161                                    if (defined($SingleReactionHash->{$SingletReactions[$i]}->{$j})) {
3162                                            $Solutions->[$j]->{$SingletReactions[$i]} = 1;
3163                                            $Solutions->[$j]->{"BASE"} = $j;
3164                                            print RECONCILIATION "|".$j."|";
3165                                    }
3166                            }
3167                            print RECONCILIATION "\n";
3168                    }
3169                    #Printing the reaction sets with alternatives
3170                    print RECONCILIATION "Reaction sets with alternatives\n";
3171                    my @ReactionSets = keys(%{$ReactionSetHash});
3172                    foreach my $ReactionSet (@ReactionSets) {
3173                            my $NewSolutions;
3174                            my $BaseReactions;
3175                            my $AltList = [$ReactionSet];
3176                            push(@{$AltList},keys(%{$ReactionSetHash->{$ReactionSet}}));
3177                            for (my $j=0; $j < @{$AltList}; $j++) {
3178                                    my $CurrentNewSolutions;
3179                                    my $Index;
3180                                    if ($j == 0) {
3181                                            print RECONCILIATION "NEW SET\n";
3182                                    } elsif ($AltList->[$j] ne $ReactionSet) {
3183                                            print RECONCILIATION "ALTERNATIVE SET\n";
3184                                            #For each base solution in which this set is represented, we copy the base solution to the new solution
3185                                            my $NewSolutionCount = 0;
3186                                            for (my $k=0; $k < $SolutionCount; $k++) {
3187                                                    if (defined($ReactionSetHash->{$ReactionSet}->{$AltList->[$j]}->{$k})) {
3188                                                            if (defined($Solutions)) {
3189                                                                    $Index->{$k} = @{$Solutions} + $NewSolutionCount;
3190                                                            } else {
3191                                                                    $Index->{$k} = $NewSolutionCount;
3192                                                            }
3193                                                            if (defined($NewSolutions) && @{$NewSolutions} > 0) {
3194                                                                    $Index->{$k} += @{$NewSolutions};
3195                                                            }
3196                                                            $CurrentNewSolutions->[$NewSolutionCount] = {};
3197                                                            foreach my $Reaction (keys(%{$Solutions->[$k]})) {
3198                                                                    $CurrentNewSolutions->[$NewSolutionCount]->{$Reaction} = $Solutions->[$k]->{$Reaction};
3199                                                            }
3200                                                            $NewSolutionCount++;
3201                                                    }
3202                                            }
3203                                    }
3204                                    if ($j == 0 || $AltList->[$j] ne $ReactionSet) {
3205                                            my @SingletReactions = split(/,/,$AltList->[$j]);
3206                                            for (my $i=0; $i < @SingletReactions; $i++) {
3207                                                    #Adding base reactions to base solutions and set reactions the new solutions
3208                                                    if ($j == 0) {
3209                                                            push(@{$BaseReactions},$SingletReactions[$i]);
3210                                                    } else {
3211                                                            for (my $k=0; $k < @{$CurrentNewSolutions}; $k++) {
3212                                                                    $CurrentNewSolutions->[$k]->{$SingletReactions[$i]} = 1;
3213                                                            }
3214                                                    }
3215                                                    #Getting reaction data and printing reaction in output file
3216                                                    my $ReactionData;
3217                                                    if (defined($ReactionDataHash->{$SingletReactions[$i]})) {
3218                                                            $ReactionData = $ReactionDataHash->{$SingletReactions[$i]};
3219                                                    } else {
3220                                                            my $Direction = substr($SingletReactions[$i],0,1);
3221                                                            if ($Direction eq "+") {
3222                                                                    $Direction = "=>";
3223                                                            } else {
3224                                                                    $Direction = "<=";
3225                                                            }
3226                                                            my $Reaction = substr($SingletReactions[$i],1);
3227                                                            $ReactionData = FIGMODELObject->load($self->figmodel()->config("reaction directory")->[0].$Reaction,"\t");
3228                                                            $ReactionData->{"DIRECTIONS"}->[0] = $Direction;
3229                                                            $ReactionData->{"REACTIONS"}->[0] = $Reaction;
3230                                                            if (!defined($ReactionData->{"DEFINITION"}->[0])) {
3231                                                                    $ReactionData->{"DEFINITION"}->[0] = "UNKNOWN";
3232                                                            }
3233                                                            if (!defined($ReactionData->{"THERMODYNAMIC REVERSIBILITY"}->[0])) {
3234                                                                    $ReactionData->{"THERMODYNAMIC REVERSIBILITY"}->[0] = "UNKNOWN";
3235                                                            }
3236                                                            if (!defined($ReactionData->{"DELTAG"}->[0])) {
3237                                                                    $ReactionData->{"DELTAG"}->[0] = "UNKNOWN";
3238                                                            }
3239                                                            $ReactionDataHash->{$SingletReactions[$i]} = $ReactionData;
3240                                                    }
3241                                                    print RECONCILIATION $ReactionData->{"REACTIONS"}->[0].";".$ReactionData->{"DEFINITION"}->[0].";".$ReactionData->{"THERMODYNAMIC REVERSIBILITY"}->[0].";".$ReactionData->{"DELTAG"}->[0].";".$ReactionData->{"DIRECTIONS"}->[0].";".$ReactionSetHash->{$ReactionSet}->{$AltList->[$j]}->{"COUNT"};
3242                                                    for (my $k=0; $k < $SolutionCount; $k++) {
3243                                                            print RECONCILIATION ";";
3244                                                            if (defined($ReactionSetHash->{$ReactionSet}->{$AltList->[$j]}->{$k})) {
3245                                                                    if ($j == 0) {
3246                                                                            print RECONCILIATION "|".$k."|";
3247                                                                    } else {
3248                                                                            print RECONCILIATION "|".$Index->{$k}."|";
3249                                                                    }
3250                                                            }
3251                                                    }
3252                                                    print RECONCILIATION "\n";
3253                                            }
3254                                            #Adding the current new solutions to the new solutions array
3255                                            if (defined($CurrentNewSolutions) && @{$CurrentNewSolutions} > 0) {
3256                                                    push(@{$NewSolutions},@{$CurrentNewSolutions});
3257                                            }
3258                                    }
3259                            }
3260                            #Adding the base reactions to all existing solutions
3261                            for (my $j=0; $j < @{$Solutions}; $j++) {
3262                                    if (defined($ReactionSetHash->{$ReactionSet}->{$ReactionSet}->{$Solutions->[$j]->{"BASE"}})) {
3263                                            foreach my $SingleReaction (@{$BaseReactions}) {
3264                                                    $Solutions->[$j]->{$SingleReaction} = 1;
3265                                            }
3266                                    }
3267                            }
3268                            #Adding the new solutions to the set of existing solutions
3269                            push(@{$Solutions},@{$NewSolutions});
3270                    }
3271                    close(RECONCILIATION);
3272                    #Now printing a file that defines all of the solutions in a format the testsolutions function understands
3273                    open (RECONCILIATION, ">$OutputFilenameTwo");
3274                    print RECONCILIATION "Experiment;Solution index;Solution cost;Solution reactions\n";
3275                    for (my $i=0; $i < @{$Solutions}; $i++) {
3276                            delete($Solutions->[$i]->{"BASE"});
3277                            print RECONCILIATION "SR".$i.";".$i.";10;".join(",",keys(%{$Solutions->[$i]}))."\n";
3278                    }
3279                    close(RECONCILIATION);
3280    
3281                    $GrowMatchTable = $self->figmodel()->database()->LockDBTable("GROWMATCH TABLE");
3282                    $Row = $GrowMatchTable->get_row_by_key($self->genome(),"ORGANISM",1);
3283                    $Row->{"GF RECON TESTING TIMING"}->[0] = time()."-";
3284                    $Row->{"GF RECON SOLUTIONS"}->[0] = @{$Solutions};
3285                    $GrowMatchTable->save();
3286                    $self->figmodel()->database()->UnlockDBTable("GROWMATCH TABLE");
3287    
3288                    #Scheduling the solution testing
3289                    if ($GapFill == 1) {
3290                            system($self->figmodel()->config("scheduler executable")->[0]." \"add:testsolutions?".$self->id().$self->selected_version()."?-1?GFSR:BACK:fast:QSUB\"");
3291                    } else {
3292                            system($self->figmodel()->config("scheduler executable")->[0]." \"add:testsolutions?".$self->id().$self->selected_version()."?-1?GGSR:BACK:fast:QSUB\"");
3293                    }
3294            } else {
3295                    #Reading in the solution testing results
3296                    my $Data;
3297                    if ($GapFill == 1) {
3298                            $Data = $self->figmodel()->database()->load_single_column_file($self->directory().$self->id().$self->selected_version()."-GFSREM.txt","");
3299                    } else {
3300                            $Data = $self->figmodel()->database()->load_single_column_file($self->directory().$self->id().$self->selected_version()."-GGSREM.txt","");
3301                    }
3302    
3303                    #Reading in the preliminate reconciliation report
3304                    my $OutputData = $self->figmodel()->database()->load_single_column_file($OutputFilename,"");
3305                    #Replacing the file tags with actual performance data
3306                    my $Count = 0;
3307                    for (my $i=0; $i < @{$Data}; $i++) {
3308                            if ($Data->[$i] =~ m/^SR(\d+);.+;(\d+\/\d+);/) {
3309                                    my $Index = $1;
3310                                    my $Performance = $Index."/".$2;
3311                                    for (my $j=0; $j < @{$OutputData}; $j++) {
3312                                            $OutputData->[$j] =~ s/\|$Index\|/$Performance/g;
3313                                    }
3314                            }
3315                    }
3316                    $self->figmodel()->database()->print_array_to_file($OutputFilename,$OutputData);
3317    
3318                    my $GrowMatchTable = $self->figmodel()->database()->LockDBTable("GROWMATCH TABLE");
3319                    my $Row = $GrowMatchTable->get_row_by_key($self->genome(),"ORGANISM",1);
3320                    $Row->{"GF RECON TESTING TIMING"}->[0] .= time();
3321                    $GrowMatchTable->save();
3322                    $self->figmodel()->database()->UnlockDBTable("GROWMATCH TABLE");
3323            }
3324    
3325            return 1;
3326    }
3327    
3328  =head3 BuildSpecificBiomassReaction  =head3 BuildSpecificBiomassReaction
3329  Definition:  Definition:
3330          FIGMODELmodel->BuildSpecificBiomassReaction();          FIGMODELmodel->BuildSpecificBiomassReaction();
# Line 3287  Line 3945 
3945          $self->figmodel()->clearing_output($UniqueFilename,"FBA-".$self->id().$self->selected_version().".lp");          $self->figmodel()->clearing_output($UniqueFilename,"FBA-".$self->id().$self->selected_version().".lp");
3946  }  }
3947    
3948    =head3 patch_model
3949    Definition:
3950            FIGMODELTable:patch results = FIGMODELmodel->patch_model(FIGMODELTable:patch table);
3951    Description:
3952    =cut
3953    sub patch_model {
3954            my ($self,$tbl) = @_;
3955    
3956            #Instantiating table
3957            my $results = FIGMODELTable->new(["Reactions","New genes","Old genes","Genes","Roles","Status"],$self->directory()."PatchResults-".$self->id().$self->selected_version().".tbl",["Reaction"],"\t",";",undef);
3958            #Getting genome annotations
3959            my $features = $self->figmodel()->database()->get_genome_feature_table($self->genome());
3960            #Gettubg reaction table
3961            my $reactions = $self->reaction_table();
3962            #Checking for patched roles
3963            for (my $i=0; $i < $tbl->size(); $i++) {
3964                    my $row = $tbl->get_row($i);
3965                    my @genes = $features->get_rows_by_key($row->{ROLE}->[0],"ROLES");
3966                    if (@genes > 0) {
3967                            for (my $j=0; $j < @{$row->{REACTIONS}};$j++) {
3968                                    my $resultrxn = $results->get_row_by_key($row->{REACTIONS}->[$j],"Reactions");
3969                                    if (!defined($resultrxn)) {
3970                                            $resultrxn = $results->add_row({"Reactions"=>[$row->{REACTIONS}->[$j]],"Roles"=>[$row->{ROLE}->[0]]});
3971                                    }
3972                                    my $rxnrow = $reactions->get_row_by_key($row->{REACTIONS}->[$j],"LOAD");
3973                                    if (defined($rxnrow) && !defined($resultrxn->{"Old genes"})) {
3974                                            $resultrxn->{"Old genes"} = $rxnrow->{"ASSOCIATED PEG"};
3975                                            if ($resultrxn->{"Old genes"}->[0] !~ m/GAP|BOF|UNIVERSAL|SPONTANEOUS/) {
3976                                                    push(@{$resultrxn->{"Genes"}},@{$resultrxn->{"Old genes"}});
3977                                            }
3978                                    }
3979                                    delete $resultrxn->{"Current gene set"};
3980                                    if (defined($resultrxn->{"Genes"})) {
3981                                            push(@{$resultrxn->{"Current gene set"}},@{$resultrxn->{"Genes"}});
3982                                    }
3983                                    for (my $k=0; $k < @genes; $k++) {
3984                                            if ($genes[$k]->{ID}->[0] =~ m/(peg\.\d+)/) {
3985                                                    my $gene = $1;
3986                                                    my $addgene = 1;
3987                                                    if (defined($resultrxn->{"Old genes"})) {
3988                                                            for (my $m=0; $m < @{$resultrxn->{"Old genes"}}; $m++) {
3989                                                                    if ($resultrxn->{"Old genes"}->[$m] =~ m/$gene/) {
3990                                                                            $addgene = 0;
3991                                                                    }
3992                                                            }
3993                                                    }
3994                                                    if ($addgene == 1) {
3995                                                            push(@{$resultrxn->{"New genes"}},$gene);
3996                                                            if ($row->{COMPLEX}->[0] ne "0" && defined($resultrxn->{"Current gene set"})) {
3997                                                                    my $added = 0;
3998                                                                    for (my $m=0; $m < @{$resultrxn->{"Current gene set"}}; $m++) {
3999                                                                            if ($row->{COMPLEX}->[0] eq "1") {
4000                                                                                    $resultrxn->{"Current gene set"}->[$m] = $resultrxn->{"Current gene set"}->[$m]."+".$gene;
4001                                                                                    $added = 1;
4002                                                                            } else {
4003                                                                                    my @geneset = split(/\+/,$resultrxn->{"Current gene set"}->[$m]);
4004                                                                                    for (my $n=0; $n < @geneset;$n++) {
4005                                                                                            if ($self->figmodel()->colocalized_genes($geneset[$n],$gene,$self->genome()) == 1) {
4006                                                                                                    $resultrxn->{"Current gene set"}->[$m] = $resultrxn->{"Current gene set"}->[$m]."+".$gene;
4007                                                                                                    $added = 1;
4008                                                                                                    last;
4009                                                                                            }
4010                                                                                    }
4011                                                                            }
4012                                                                    }
4013                                                                    if ($added == 0) {
4014                                                                            push(@{$resultrxn->{"Current gene set"}},$gene);
4015                                                                    }
4016                                                            } else {
4017                                                                    push(@{$resultrxn->{"Current gene set"}},$gene);
4018                                                            }
4019                                                    }
4020                                            }
4021                                    }
4022                                    delete $resultrxn->{"Genes"};
4023                                    push(@{$resultrxn->{"Genes"}},@{$resultrxn->{"Current gene set"}});
4024                            }
4025                    }
4026            }
4027    
4028            #Ensuring that the old model is preserved
4029            $self->ArchiveModel();
4030            #Modifing the reaction list
4031            for (my $i=0; $i < $results->size();$i++) {
4032                    my $row = $results->get_row($i);
4033                    my $rxnrow = $reactions->get_row_by_key($row->{"Reactions"}->[0],"LOAD");
4034                    if (defined($rxnrow)) {
4035                            $rxnrow->{"ASSOCIATED PEG"} = $row->{"Genes"};
4036                    } else {
4037                            $reactions->add_row({LOAD=>[$row->{"Reactions"}->[0]],DIRECTIONALITY=>[$self->figmodel()->reversibility_of_reaction($row->{"Reactions"}->[0])],COMPARTMENT=>["c"],"ASSOCIATED PEG"=>$row->{"Genes"},SUBSYSTEM=>["NONE"],CONFIDENCE=>[2],REFERENCE=>["NONE"],NOTES=>["PATCH"]});
4038                    }
4039            }
4040            $reactions->save();
4041            $results->save();
4042            $self->update_model_stats();
4043            $self->PrintModelLPFile();
4044            $self->run_default_model_predictions();
4045            #Returning results
4046            return $results;
4047    }
4048    
4049    =head3 translate_genes
4050    Definition:
4051            FIGMODELmodel->translate_genes();
4052    Description:
4053    =cut
4054    sub translate_genes {
4055            my ($self) = @_;
4056    
4057            #Loading gene translations
4058            if (!defined($self->{_gene_aliases})) {
4059                    #Loading gene aliases from feature table
4060                    my $tbl = $self->figmodel()->GetGenomeFeatureTable($self->genome());
4061                    if (defined($tbl)) {
4062                            for (my $i=0; $i < $tbl->size(); $i++) {
4063                                    my $row = $tbl->get_row($i);
4064                                    if ($row->{ID}->[0] =~ m/(peg\.\d+)/) {
4065                                            my $geneID = $1;
4066                                            for (my $j=0; $j < @{$row->{ALIASES}}; $j++) {
4067                                                    $self->{_gene_aliases}->{$row->{ALIASES}->[$j]} = $geneID;
4068                                            }
4069                                    }
4070                            }
4071                    }
4072                    #Loading additional gene aliases from the database
4073                    if (-e $self->figmodel()->config("Translation directory")->[0]."AdditionalAliases/".$self->genome().".txt") {
4074                            my $AdditionalAliases = $self->figmodel()->database()->load_multiple_column_file($self->figmodel()->config("Translation directory")->[0]."AdditionalAliases/".$self->genome().".txt","\t");
4075                            for (my $i=0; $i < @{$AdditionalAliases}; $i++) {
4076                                    $self->{_gene_aliases}->{$AdditionalAliases->[$i]->[1]} = $AdditionalAliases->[$i]->[0];
4077                            }
4078                    }
4079            }
4080    
4081            #Cycling through reactions and translating genes
4082            for (my $i=0; $i < $self->reaction_table()->size(); $i++) {
4083                    my $row = $self->reaction_table()->get_row($i);
4084                    if (defined($row->{"ASSOCIATED PEG"})) {
4085                            for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
4086                                    my $Original = $row->{"ASSOCIATED PEG"}->[$j];
4087                                    $Original =~ s/\sand\s/:/g;
4088                                    $Original =~ s/\sor\s/;/g;
4089                                    my @GeneNames = split(/[,\+\s\(\):;]/,$Original);
4090                                    foreach my $Gene (@GeneNames) {
4091                                            if (length($Gene) > 0 && defined($self->{_gene_aliases}->{$Gene})) {
4092                                                    my $Replace = $self->{_gene_aliases}->{$Gene};
4093                                                    $Original =~ s/([^\w])$Gene([^\w])/$1$Replace$2/g;
4094                                                    $Original =~ s/^$Gene([^\w])/$Replace$1/g;
4095                                                    $Original =~ s/([^\w])$Gene$/$1$Replace/g;
4096                                                    $Original =~ s/^$Gene$/$Replace/g;
4097                                            }
4098                                    }
4099                                    $Original =~ s/:/ and /g;
4100                                    $Original =~ s/;/ or /g;
4101                                    $row->{"ASSOCIATED PEG"}->[$j] = $Original;
4102                            }
4103                    }
4104            }
4105    
4106            #Archiving model and saving reaction table
4107            $self->ArchiveModel();
4108            $self->reaction_table()->save();
4109    }
4110    
4111  1;  1;

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3