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

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3