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

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3