[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.26, Thu Aug 5 07:52:30 2010 UTC
# Line 13  Line 13 
13          This is the constructor for the FIGMODELmodel object.          This is the constructor for the FIGMODELmodel object.
14  =cut  =cut
15  sub new {  sub new {
16          my ($class,$figmodel,$id) = @_;          my ($class,$figmodel,$id,$metagenome) = @_;
   
17          #Error checking first          #Error checking first
18          if (!defined($figmodel)) {          if (!defined($figmodel)) {
19                  print STDERR "FIGMODELmodel->new(undef,".$id."):figmodel must be defined to create a model object!\n";                  print STDERR "FIGMODELmodel->new(undef,".$id."):figmodel must be defined to create a model object!\n";
# Line 26  Line 25 
25                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,undef):id must be defined to create a model object");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,undef):id must be defined to create a model object");
26                  return undef;                  return undef;
27          }          }
   
28          #Checking that the id exists          #Checking that the id exists
29            if (!defined($metagenome) || $metagenome != 1) {
30          my $modelHandle = $self->figmodel()->database()->get_object_manager("model");          my $modelHandle = $self->figmodel()->database()->get_object_manager("model");
31          if (!defined($modelHandle)) {                  if (defined($modelHandle)) {
                 $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not load MODELS table. Check database!");  
                 return undef;  
         }  
   
32          #If the id is a number, we get the model row by index          #If the id is a number, we get the model row by index
33          if ($id =~ m/^\d+$/) {          if ($id =~ m/^\d+$/) {
34                  my $objects = $modelHandle->get_objects();                  my $objects = $modelHandle->get_objects();
35                                    if (defined($objects->[$id])) {
36                  $self->{_data} = $objects->[$id];                  $self->{_data} = $objects->[$id];
37                  $self->figmodel()->{_models}->{$id} = $self;                  $self->figmodel()->{_models}->{$id} = $self;
38                                    }
39          } else {          } else {
40                  my $objects = $modelHandle->get_objects({id => $id});                  my $objects = $modelHandle->get_objects({id => $id});
41                  if (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {                                  if (defined($objects->[0])) {
42                                            $self->{_data} = $objects->[0];
43                                    } elsif (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {
44                          $objects = $modelHandle->get_objects({id => $1});                          $objects = $modelHandle->get_objects({id => $1});
45                          if (!defined($objects->[0])) {                                          if (defined($objects->[0])) {
                                 $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");  
                                 return undef;  
                         }  
46                          $self->{_selectedversion} = $2;                          $self->{_selectedversion} = $2;
47                  } elsif (!defined($objects->[0])) {                                                  $self->{_data} = $objects->[0];
48                          $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");                                          }
49                          return undef;                                  }
50                            }
51                    }
52                    if (defined($self->{_data})) {
53                            $self->{_modeltype} = "genome";
54                    }
55            }
56            if (!defined($self->{_data})) {
57                    my $modelHandle = $self->figmodel()->database()->get_object_manager("mgmodel");
58                    if (defined($modelHandle)) {
59                            #If the id is a number, we get the model row by index
60                            if ($id =~ m/^\d+$/) {
61                                    my $objects = $modelHandle->get_objects();
62                                    if (defined($objects->[$id])) {
63                                            $self->{_data} = $objects->[$id];
64                                            $self->figmodel()->{_models}->{"MG".$id} = $self;
65                  }                  }
66                            } else {
67                                    my $objects = $modelHandle->get_objects({id => $id});
68                                    if (defined($objects->[0])) {
69                                            $self->{_data} = $objects->[0];
70                                    } elsif (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {
71                                            $objects = $modelHandle->get_objects({id => $1});
72                                            if (defined($objects->[0])) {
73                                                    $self->{_selectedversion} = $2;
74                  $self->{_data} = $objects->[0];                  $self->{_data} = $objects->[0];
75          }          }
76                                    }
77                            }
78                    }
79                    if (defined($self->{_data})) {
80                            $self->{_modeltype} = "metagenome";
81                    }
82            }
83          if (!defined($self->{_data})) {          if (!defined($self->{_data})) {
84                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find specified id in database!");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
85                  return undef;                  return undef;
86          }          }
87          $self->figmodel()->{_models}->{$self->id()} = $self;          $self->figmodel()->{_models}->{$self->id()} = $self;
   
88          return $self;          return $self;
89  }  }
90    
# Line 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 248  Line 285 
285                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
286                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {
287                                  $class = "Essential <=";                                  $class = "Essential <=";
288                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$max)." to ".sprintf("%.3g",$min)."]<br>" : $class.="<br>[Flux: ".$max." to ".$min."]<br>";
289                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {
290                                  $class = "Active =>";                                  $class = "Active =>";
291                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
292                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {
293                                  $class = "Active <=";                                  $class = "Active <=";
294                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$max)." to ".sprintf("%.3g",$min)."]<br>" : $class.="<br>[Flux: ".$max." to ".$min."]<br>";
295                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {
296                                  $class = "Active <=>";                                  $class = "Active <=>";
297                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
# Line 295  Line 332 
332                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
333                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {
334                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";
335                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$max)." to ".sprintf("%.3g",$min)."]<br>" : $NewClass.="<br>[Flux: ".$max." to ".$min."]<br>";
336                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {
337                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";
338                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
339                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {
340                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";
341                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$max)." to ".sprintf("%.3g",$min)."]<br>" : $NewClass.="<br>[Flux: ".$max." to ".$min."]<br>";
342                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {
343                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";
344                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
# 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          }          }
         my $prefix;  
         if (defined($self->config($TableName)->{prefix})) {  
                 $prefix = join("\n",@{$self->config($TableName)->{prefix}});  
505          }          }
506          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 $columnDelim = "\t";
507            if (defined($tbldef->{columndelimiter}->[0])) {
508                    $columnDelim = $tbldef->{columndelimiter}->[0];
509                    if ($columnDelim eq "SC") {
510                            $columnDelim = ";";
511                    }
512            }
513            my $suffix = ".tbl";
514            if (defined($tbldef->{filename_suffix}->[0])) {
515                    $suffix = $tbldef->{filename_suffix}->[0];
516            }
517            my $filename = $self->directory().$TableName."-".$self->id().$self->selected_version().$suffix;
518            if (defined($tbldef->{filename_prefix}->[0])) {
519                    if ($tbldef->{filename_prefix}->[0] eq "NONE") {
520                            $filename = $self->directory().$self->id().$self->selected_version().$suffix;
521                    } else {
522                            $filename = $self->directory().$tbldef->{filename_prefix}->[0]."-".$self->id().$self->selected_version().$suffix;
523                    }
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          return $self->{_reaction_data};  =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    =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            if (defined($newMedia)) {
1039                    return $self->{_data}->autoCompleteMedia($newMedia);
1040            }
1041            return $self->{_data}->autoCompleteMedia();
1042    }
1043    
1044    sub biomassReaction {
1045            my ($self,$newBiomass) = @_;
1046            if (!defined($newBiomass)) {
1047                    return $self->{_data}->biomassReaction();
1048            } else {
1049                    #Figuring out what the old biomass is
1050                    my $oldBiomass = $self->{_data}->biomassReaction();
1051                    if ($newBiomass ne $oldBiomass) {
1052                            #Figuring out if the new biomass exists
1053                            my $handle = $self->database()->get_object_manager("bof");
1054                            my $objects = $handle->get_objects({"DATABASE" => [$newBiomass]});
1055                            if (!defined($objects) || !defined($objects->[0])) {
1056                                    print STDERR "Could not find new biomass reaction ".$newBiomass."\n";
1057                                    return $oldBiomass;
1058                            }
1059                            #Changing the biomass reaction in the model file
1060                            my $rxnTbl = $self->reaction_table();
1061                            for (my $i=0; $i < $rxnTbl->size(); $i++) {
1062                                    my $row = $rxnTbl->get_row($i);
1063                                    if ($row->{LOAD}->[0] =~ m/^bio/) {
1064                                            $row->{LOAD}->[0] = $newBiomass;
1065                                    }
1066                            }
1067                            $rxnTbl->save();
1068                            #Changing the biomass reaction in the database
1069                            return  $self->{_data}->biomassReaction($newBiomass);
1070                    }
1071            }
1072    }
1073    
1074  =head3 taxonomy  =head3 taxonomy
1075  Definition:  Definition:
1076          string = FIGMODELmodel->taxonomy();          string = FIGMODELmodel->taxonomy();
# Line 992  Line 1154 
1154    
1155          #Assuming complete media if none is provided          #Assuming complete media if none is provided
1156          if (!defined($Media)) {          if (!defined($Media)) {
1157                  $Media = "Complete";                  $Media = $self->autocompleteMedia();
1158          }          }
1159    
1160          #Predicting essentiality          #Predicting essentiality
1161          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]);
1162          #Checking that the table is defined and the output file exists          #Checking that the table is defined and the output file exists
1163          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {
1164                  $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();
1165                    my $row = $tbl->get_row_by_key($Media,"MEDIA",1);
1166                    $row->{"ESSENTIAL GENES"} = $result->get_row(0)->{"ESSENTIALGENES"};
1167                    $tbl->save();
1168          } else {          } else {
1169                  $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().".");
1170                  return $self->figmodel()->fail();                  return $self->figmodel()->fail();
# Line 1028  Line 1193 
1193          $self->{_data}->modificationDate(time());          $self->{_data}->modificationDate(time());
1194          my $version = $self->{_data}->autocompleteVersion();          my $version = $self->{_data}->autocompleteVersion();
1195          $self->{_data}->autocompleteVersion($version+1);          $self->{_data}->autocompleteVersion($version+1);
1196            $self->update_model_stats();
1197  }  }
1198    
1199  =head3 update_stats_for_build  =head3 update_stats_for_build
# Line 1109  Line 1275 
1275          #Setting the reaction count          #Setting the reaction count
1276          $self->{_data}->reactions($rxntbl->size());          $self->{_data}->reactions($rxntbl->size());
1277          #Setting the metabolite count          #Setting the metabolite count
1278          $self->{_data}->compounds($rxntbl->size());          $self->{_data}->compounds($cpdtbl->size());
1279          #Setting the gene count          #Setting the gene count
1280          my $geneCount = @genes + @othergenes;          my $geneCount = @genes + @othergenes;
1281          $self->{_data}->associatedGenes($geneCount);          $self->{_data}->associatedGenes($geneCount);
# Line 1159  Line 1325 
1325          my $UniqueFilename = $self->figmodel()->filename();          my $UniqueFilename = $self->figmodel()->filename();
1326          my $StartTime = time();          my $StartTime = time();
1327    
1328          #Archiving the existing model          #Reading original reaction table
1329          $self->ArchiveModel();          my $OriginalRxn = $self->reaction_table();
1330            #Clearing the table
1331            $self->reaction_table(1);
1332    
1333          #Removing any gapfilling reactions that may be currently present in the model          #Removing any gapfilling reactions that may be currently present in the model
1334          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
1335                  my $ModelTable = $self->reaction_table();                  my $ModelTable = $self->reaction_table();
1336                  for (my $i=0; $i < $ModelTable->size(); $i++) {                  for (my $i=0; $i < $ModelTable->size(); $i++) {
1337                          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/) {
1338                                  $ModelTable->delete_row($i);                                  $ModelTable->delete_row($i);
1339                                  $i--;                                  $i--;
1340                          }                          }
# Line 1175  Line 1343 
1343          }          }
1344    
1345          #Calling the MFAToolkit to run the gap filling optimization          #Calling the MFAToolkit to run the gap filling optimization
1346          my $MinimalMediaTable = $self->figmodel()->database()->GetDBTable("MINIMAL MEDIA TABLE");          my $Media = $self->autocompleteMedia();
1347          my $Media = "Complete";          if ($Media eq "Complete") {
1348          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));
1349                  $Media = $MinimalMediaTable->get_row_by_key($self->genome(),"Organism")->{"Minimal media"}->[0];          } else {
1350                  #Loading media, changing bounds, saving media as a test media                  #Loading media, changing bounds, saving media as a test media
1351                  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"]);
1352                  for (my $i=0; $i < $MediaTable->size(); $i++) {                  for (my $i=0; $i < $MediaTable->size(); $i++) {
# Line 1190  Line 1358 
1358                          }                          }
1359                  }                  }
1360                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1361                    #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";
1362                  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));
1363                  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));  
1364          }          }
1365    
1366          #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
1367          my $SolutionData = $self->figmodel()->LoadProblemReport($UniqueFilename);          my $SolutionData = $self->figmodel()->LoadProblemReport($UniqueFilename);
1368    
1369          #Clearing the mfatoolkit output and log file          #Clearing the mfatoolkit output and log file
1370          $self->figmodel()->clearing_output($UniqueFilename,"GapFill".$self->id().".log");          $self->figmodel()->clearing_output($UniqueFilename,"GapFill".$self->id().".log");
1371          if (!defined($SolutionData) || $SolutionData->size() == 0) {          if (!defined($SolutionData) || $SolutionData->size() == 0) {
# Line 1205  Line 1373 
1373                  $self->figmodel()->error_message("FIGMODEL:GapFillModel: Gap filling report not found!");                  $self->figmodel()->error_message("FIGMODEL:GapFillModel: Gap filling report not found!");
1374                  return $self->fail();                  return $self->fail();
1375          }          }
         $SolutionData->save("/home/chenry/Solution.txt");  
1376    
1377          #Looking for the last printed recursive MILP solution          #Looking for the last printed recursive MILP solution
1378          for (my $i=($SolutionData->size()-1); $i >=0; $i--) {          for (my $i=($SolutionData->size()-1); $i >=0; $i--) {
# Line 1233  Line 1400 
1400                                                  push(@{$ReactionList},$ID);                                                  push(@{$ReactionList},$ID);
1401                                          }                                          }
1402                                  }                                  }
1403                                  $self->figmodel()->IntegrateGrowMatchSolution($self->id(),undef,$ReactionList,$DirectionList,"GAP FILLING",0,1);                                  $self->figmodel()->IntegrateGrowMatchSolution($self->id(),undef,$ReactionList,$DirectionList,"AUTOCOMPLETION",0,1);
1404                          }                          }
1405                          last;                          last;
1406                  }                  }
1407          }          }
1408    
1409          #Updating model stats with gap filling results          #Updating model stats with gap filling results
1410          my $ElapsedTime = time() - $StartTime;          my $ElapsedTime = time() - $StartTime;
1411          $self->figmodel()->database()->ClearDBModel($self->id(),1);          $self->reaction_table(1);
1412            $self->calculate_model_changes($OriginalRxn,"AUTOCOMPLETION");
1413    
1414          #Determining why each gap filling reaction was added          #Determining why each gap filling reaction was added
1415          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);
1416          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
                 $self->figmodel()->AddBiologTransporters($self->id());  
1417                  if ($self->id() !~ m/MGRast/) {                  if ($self->id() !~ m/MGRast/) {
1418                          $self->update_stats_for_gap_filling($ElapsedTime);                          $self->update_stats_for_gap_filling($ElapsedTime);
1419                  }                  }
# Line 1260  Line 1429 
1429          return $self->success();          return $self->success();
1430  }  }
1431    
1432    =head3 calculate_model_changes
1433    Definition:
1434            FIGMODELmodel->calculate_model_changes(FIGMODELTable:original reaction table,string:modification cause);
1435    Description:
1436    
1437    =cut
1438    
1439    sub calculate_model_changes {
1440            my ($self,$originalReactions,$cause,$tbl,$version) = @_;
1441            my $modTime = time();
1442            if (!defined($version)) {
1443                    $version = $self->selected_version();
1444            }
1445            my $user = $self->figmodel()->user();
1446            #Getting the history table
1447            my $histTbl = $self->model_history();
1448            #Checking for differences
1449            if (!defined($tbl)) {
1450                    $tbl = $self->reaction_table();
1451            }
1452            for (my $i=0; $i < $tbl->size(); $i++) {
1453                    my $row = $tbl->get_row($i);
1454                    my $orgRow = $originalReactions->get_row_by_key($row->{LOAD}->[0],"LOAD");
1455                    if (!defined($orgRow)) {
1456                            $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => $row->{DIRECTIONALITY}, GeneChange => $row->{"ASSOCIATED PEG"}, Action => ["ADDED"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1457                    } else {
1458                            my $geneChanges;
1459                            my $directionChange;
1460                            if ($orgRow->{"DIRECTIONALITY"}->[0] ne $row->{"DIRECTIONALITY"}->[0]) {
1461                                    $directionChange = $orgRow->{"DIRECTIONALITY"}->[0]." to ".$row->{"DIRECTIONALITY"}->[0];
1462                            }
1463                            for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1464                                    my $match = 0;
1465                                    if (defined($orgRow->{"ASSOCIATED PEG"})) {
1466                                            for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1467                                                    if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1468                                                            $match = 1;
1469                                                    }
1470                                            }
1471                                    }
1472                                    if ($match == 0) {
1473                                            push(@{$geneChanges},"Added ".$row->{"ASSOCIATED PEG"}->[$j]);
1474                                    }
1475                            }
1476                            if (defined($orgRow->{"ASSOCIATED PEG"})) {
1477                                    for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1478                                            my $match = 0;
1479                                            if (defined($row->{"ASSOCIATED PEG"})) {
1480                                                    for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1481                                                            if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1482                                                                    $match = 1;
1483                                                            }
1484                                                    }
1485                                            }
1486                                            if ($match == 0) {
1487                                                    push(@{$geneChanges},"Removed ".$orgRow->{"ASSOCIATED PEG"}->[$k]);
1488                                            }
1489                                    }
1490                            }
1491                            if ((defined($directionChange) && length($directionChange) > 0) || defined($geneChanges) && @{$geneChanges} > 0) {
1492                                    $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => [$directionChange], GeneChange => $geneChanges, Action => ["CHANGE"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1493                            }
1494                    }
1495            }
1496            #Looking for removed reactions
1497            for (my $i=0; $i < $originalReactions->size(); $i++) {
1498                    my $row = $originalReactions->get_row($i);
1499                    my $orgRow = $tbl->get_row_by_key($row->{LOAD}->[0],"LOAD");
1500                    if (!defined($orgRow)) {
1501                            $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => $row->{DIRECTIONALITY}, GeneChange => $row->{"ASSOCIATED PEG"}, Action => ["REMOVED"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1502                    }
1503            }
1504            $histTbl->save();
1505    }
1506    
1507  =head3 GapGenModel  =head3 GapGenModel
1508  Definition:  Definition:
1509          FIGMODELmodel->GapGenModel();          FIGMODELmodel->GapGenModel();
# Line 1497  Line 1741 
1741  =cut  =cut
1742  sub status {  sub status {
1743          my ($self) = @_;          my ($self) = @_;
1744          return $self->{_data}->{status}->[0];          return $self->{_data}->status();
1745  }  }
1746    
1747  =head3 message  =head3 message
# Line 1508  Line 1752 
1752  =cut  =cut
1753  sub message {  sub message {
1754          my ($self) = @_;          my ($self) = @_;
1755          return $self->{_data}->{message}->[0];          return $self->{_data}->message();
1756  }  }
1757    
1758  =head3 set_status  =head3 set_status
# Line 1523  Line 1767 
1767  =cut  =cut
1768  sub set_status {  sub set_status {
1769          my ($self,$NewStatus,$Message) = @_;          my ($self,$NewStatus,$Message) = @_;
1770            $self->{_data}->status($NewStatus);
1771          #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");  
1772          return $self->config("SUCCESS")->[0];          return $self->config("SUCCESS")->[0];
1773  }  }
1774    
# Line 1566  Line 1807 
1807          }          }
1808          #Setting up needed variables          #Setting up needed variables
1809          my $OriginalModelTable = undef;          my $OriginalModelTable = undef;
1810          #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) {  
1811                  $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");  
1812                  return $self->fail();                  return $self->fail();
1813          }elsif ($Row->{status}->[0] == 1) {          }elsif ($self->status() == 1) {
1814                  $OriginalModelTable = $self->reaction_table();                  $OriginalModelTable = $self->reaction_table();
1815                  $self->ArchiveModel();                  $self->set_status(0,"Rebuilding preliminary reconstruction");
                 $Row->{status}->[0] = 0;  
                 $Row->{message}->[0] = "Rebuilding preliminary reconstruction";  
1816          } else {          } else {
1817                  $Row->{status}->[0] = 0;                  $self->set_status(0,"Preliminary reconstruction");
                 $Row->{message}->[0] = "Preliminary reconstruction";  
1818          }          }
         #Updating the status table  
         $self->figmodel()->database()->save_table($ModelTable);  
         $self->figmodel()->database()->UnlockDBTable("MODELS");  
1819          #Sorting GenomeData by gene location on the chromosome          #Sorting GenomeData by gene location on the chromosome
1820            my $ftrTbl = $self->figmodel()->database()->get_table("ROLERXNMAPPING");
1821          $FeatureTable->sort_rows("MIN LOCATION");          $FeatureTable->sort_rows("MIN LOCATION");
1822          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);
1823          my %LastGenePosition;          my %LastGenePosition;
# Line 1661  Line 1889 
1889                          }                          }
1890                  }                  }
1891          }          }
   
1892          #Creating nonadjacent complexes          #Creating nonadjacent complexes
1893          my @ReactionList = keys(%{$ReactionHash});          my @ReactionList = keys(%{$ReactionHash});
1894          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
# Line 1767  Line 1994 
1994                  $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"]});
1995          }          }
1996    
1997            #Getting feature rows for features that are lumped
1998            my @rows = $ftrTbl->get_rows_by_key("2","MASTER");
1999            for (my $i=0; $i < @rows; $i++) {
2000                    my $rxn = $rows[$i]->{REACTION}->[0];
2001                    my $role = $rows[$i]->{ROLE}->[0];
2002                    my @orgrows = $FeatureTable->get_rows_by_key($role,"ROLES");
2003                    my $genes;
2004                    for (my $j=0; $j < @orgrows; $j++) {
2005                            if ($orgrows[$j]->{ID}->[0] =~ m/(peg\.\d+)/) {
2006                                    push(@{$genes},$1);
2007                            }
2008                    }
2009                    if (defined($genes) && @{$genes} > 0) {
2010                            my $row = $NewModelTable->get_row_by_key($rxn,"LOAD");
2011                            my $newGeneAssociations;
2012                            for (my $k=0; $k < @{$genes}; $k++) {
2013                                    for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
2014                                            my $peg = $genes->[$k];
2015                                            if ($row->{"ASSOCIATED PEG"}->[$j] !~ m/$peg/) {
2016                                                    push(@{$newGeneAssociations},$row->{"ASSOCIATED PEG"}->[$j]."+".$peg);
2017                                            }
2018                                    }
2019                            }
2020                            $row->{"ASSOCIATED PEG"} = $newGeneAssociations;
2021                    }
2022            }
2023    
2024          #Adding the spontaneous and universal reactions          #Adding the spontaneous and universal reactions
2025          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {
2026                  #Getting the thermodynamic reversibility from the database                  #Getting the thermodynamic reversibility from the database
# Line 1823  Line 2077 
2077                  }                  }
2078          }          }
2079    
2080            #If an original model exists, we copy the gap filling solution from that model
2081            if (defined($OriginalModelTable)) {
2082                    for (my $i=0; $i < $OriginalModelTable->size(); $i++) {
2083                            if ($OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ && $OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] ne "INITIAL GAP FILLING") {
2084                                    my $Row = $NewModelTable->get_row_by_key($OriginalModelTable->get_row($i)->{"LOAD"}->[0],"LOAD");
2085                                    if (!defined($Row)) {
2086                                            $NewModelTable->add_row($OriginalModelTable->get_row($i));
2087                                    }
2088                            }
2089                    }
2090            }
2091    
2092          #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
2093          if (defined($OriginalModelTable)) {          if (defined($OriginalModelTable)) {
2094                  my $PerfectMatch = 1;                  my $PerfectMatch = 1;
# Line 1882  Line 2148 
2148          #Saving the new model to file          #Saving the new model to file
2149          $self->set_status(1,"Preliminary reconstruction complete");          $self->set_status(1,"Preliminary reconstruction complete");
2150          $self->figmodel()->database()->save_table($NewModelTable);          $self->figmodel()->database()->save_table($NewModelTable);
2151          $self->{_reaction_data} = $NewModelTable;          $self->reaction_table(1);
         #Clearing the previous model from the cache  
         $self->figmodel()->database()->ClearDBModel($self->id(),1);  
2152          #Updating the model stats table          #Updating the model stats table
2153          $self->update_stats_for_build();          $self->update_stats_for_build();
2154          $self->PrintSBMLFile();          $self->PrintSBMLFile();
2155            if (defined($OriginalModelTable)) {
2156                    $self->calculate_model_changes($OriginalModelTable,"REBUILD");
2157            }
2158    
2159          #Adding model to gapfilling queue          #Adding model to gapfilling queue
2160          if (defined($RunGapFilling) && $RunGapFilling == 1) {          if (defined($RunGapFilling) && $RunGapFilling == 1) {
# Line 1906  Line 2173 
2173    
2174  sub CreateMetaGenomeReactionList {  sub CreateMetaGenomeReactionList {
2175          my ($self) = @_;          my ($self) = @_;
   
2176          #Checking if the metagenome file exists          #Checking if the metagenome file exists
2177          if (!-e $self->config("raw MGRAST directory")->[0].$self->genome().".summary") {          if (!-e $self->config("raw MGRAST directory")->[0].$self->genome().".summary") {
2178                  $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());
2179                    return $self->fail();
2180          }          }
2181          #Loading metagenome data          #Loading metagenome data
2182          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");
2183          if (!defined($MGRASTData)) {          if (!defined($MGRASTData)) {
2184                  $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());
2185                    return $self->fail();
2186          }          }
   
2187          #Setting up needed variables          #Setting up needed variables
2188          my $OriginalModelTable = undef;          my $OriginalModelTable = undef;
   
2189          #Checking status          #Checking status
2190          if ($self->status() < 0) {          if ($self->status() < 0) {
2191                  $self->set_status(0,"Preliminary reconstruction");                  $self->set_status(0,"Preliminary reconstruction");
# Line 1931  Line 2197 
2197                  $self->ArchiveModel();                  $self->ArchiveModel();
2198                  $self->set_status(0,"Rebuilding preliminary reconstruction");                  $self->set_status(0,"Rebuilding preliminary reconstruction");
2199          }          }
2200            #Creating a hash of escores and pegs associated with each role
2201            my $rolePegHash;
2202            my $roleEscores;
2203            for (my $i=0; $i < @{$MGRASTData};$i++) {
2204                    #MD5,PEG,number of sims,role,sim e-scores,max escore,min escore,ave escore,stdev escore,ave exponent,stddev exponent
2205                    $rolePegHash->{$MGRASTData->[$i]->[3]}->{substr($MGRASTData->[$i]->[1],4)} = 1;
2206                    push(@{$roleEscores->{$MGRASTData->[$i]->[3]}},split(/;/,$MGRASTData->[$i]->[4]));
2207            }
2208          #Getting the reaction table          #Getting the reaction table
2209          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          my $ReactionTable = $self->figmodel()->database()->get_table("REACTIONS");
2210          #Creating model table          #Creating model table
2211          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");
2212          for (my $i=0; $i < @{$MGRASTData};$i++) {          print $ModelTable->filename();
2213                  #MD5,PEG,number of sims,role,sim e-scores          my @roles = keys(%{$rolePegHash});
2214                  my $Role = $MGRASTData->[$i]->[3];          for (my $i=0; $i < @roles; $i++) {
2215                  my $MD5 = $MGRASTData->[$i]->[0];                  my $min = -1;
2216                  my $peg = $MGRASTData->[$i]->[1];                  my $max = -1;
2217                  my $sims = $MGRASTData->[$i]->[4];                  my $count = @{$roleEscores->{$roles[$i]}};
2218                  $sims =~ s/;/,/g;                  my $ave = 0;
2219                    my $stdev = 0;
2220                    my $aveexp = 0;
2221                    my $stdevexp = 0;
2222                    for (my $j=0; $j < @{$roleEscores->{$roles[$i]}}; $j++) {
2223                            if ($roleEscores->{$roles[$i]} < $min || $min == -1) {
2224                                    $min = $roleEscores->{$roles[$i]};
2225                            }
2226                            if ($roleEscores->{$roles[$i]} > $max || $max == -1) {
2227                                    $max = $roleEscores->{$roles[$i]};
2228                            }
2229                            $ave += $roleEscores->{$roles[$i]}->[$j];
2230                            if ($roleEscores->{$roles[$i]}->[$j] =~ m/e(-\d+$)/) {
2231                                    $aveexp += $1;
2232                            }
2233                    }
2234                    $ave = $ave/$count;
2235                    $aveexp = $aveexp/$count;
2236                    for (my $j=0; $j < @{$roleEscores->{$roles[$i]}}; $j++) {
2237                            $stdev += ($roleEscores->{$roles[$i]}->[$j]-$ave)*($roleEscores->{$roles[$i]}->[$j]-$ave);
2238                            if ($roleEscores->{$roles[$i]}->[$j] =~ m/e(-\d+$)/) {
2239                                    $stdevexp += ($1-$aveexp)*($1-$aveexp);
2240                            }
2241                    }
2242                    $stdev = sqrt($stdev/$count);
2243                    $stdevexp = sqrt($stdevexp/$count);
2244                  #Checking for subsystems                  #Checking for subsystems
2245                  my $GeneSubsystems = $self->figmodel()->subsystems_of_role($Role);                  my $GeneSubsystems = $self->figmodel()->subsystems_of_role($roles[$i]);
2246                  #Checking if there are reactions associated with this role                  #Checking if there are reactions associated with this role
2247                  my $ReactionHashArrayRef = $self->figmodel()->reactions_of_role($Role);                  my $ReactionHashArrayRef = $self->figmodel()->reactions_of_role($roles[$i]);
2248                  if ($ReactionHashArrayRef != 0) {                  if ($ReactionHashArrayRef != 0) {
2249                          foreach my $Mapping (@{$ReactionHashArrayRef}) {                          foreach my $Mapping (@{$ReactionHashArrayRef}) {
2250                                  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 2256 
2256                                                                  $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"]};
2257                                                                  $ModelTable->add_row($ReactionRow);                                                                  $ModelTable->add_row($ReactionRow);
2258                                                          }                                                          }
2259                                                          push(@{$ReactionRow->{"ASSOCIATED PEG"}},substr($peg,4));                                                          my %pegHash = %{$rolePegHash->{$roles[$i]}};
2260                                                          push(@{$ReactionRow->{"REFERENCE"}},$MD5.":".$Role);                                                          if (defined($ReactionRow->{"ASSOCIATED PEG"})) {
2261                                                          push(@{$ReactionRow->{"CONFIDENCE"}},$sims);                                                                  for (my $j=0; $j < @{$ReactionRow->{"ASSOCIATED PEG"}}; $j++) {
2262                                                                            $pegHash{$ReactionRow->{"ASSOCIATED PEG"}->[$j]} = 1;
2263                                                                    }
2264                                                            }
2265                                                            delete $ReactionRow->{"ASSOCIATED PEG"};
2266                                                            push(@{$ReactionRow->{"ASSOCIATED PEG"}},keys(%pegHash));
2267                                                            push(@{$ReactionRow->{"REFERENCE"}},$count.":".$ave.":".$stdev.":".$aveexp.":".$stdevexp.":".$min.":".$max);
2268                                                          if (defined($GeneSubsystems)) {                                                          if (defined($GeneSubsystems)) {
2269                                                                  push(@{$ReactionRow->{"SUBSYSTEM"}},@{$GeneSubsystems});                                                                  push(@{$ReactionRow->{"SUBSYSTEM"}},@{$GeneSubsystems});
2270                                                          }                                                          }
# Line 2387  Line 2690 
2690          Calculating growth in the input media          Calculating growth in the input media
2691  =cut  =cut
2692  sub calculate_growth {  sub calculate_growth {
2693          my ($self,$Media) = @_;          my ($self,$Media,$outputDirectory,$InParameters,$saveLPFile) = @_;
2694            #Setting the Media
2695            if (!defined($Media) || length($Media) == 0) {
2696                    $Media = $self->autocompleteMedia();
2697            }
2698            #Setting parameters for the run
2699            my $DefaultParameters = $self->figmodel()->defaultParameters();
2700            if (defined($InParameters)) {
2701                    my @parameters = keys(%{$InParameters});
2702                    for (my $i=0; $i < @parameters; $i++) {
2703                            $DefaultParameters->{$parameters[$i]} = $InParameters->{$parameters[$i]};
2704                    }
2705            }
2706            $DefaultParameters->{"optimize metabolite production if objective is zero"} = 1;
2707            #Setting filenames
2708          my $UniqueFilename = $self->figmodel()->filename();          my $UniqueFilename = $self->figmodel()->filename();
2709          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)) {
2710                    $outputDirectory = $self->config("database message file directory")->[0];
2711            }
2712            my $fluxFilename = $outputDirectory."Fluxes-".$self->id()."-".$Media.".txt";
2713            my $cpdFluxFilename = $outputDirectory."CompoundFluxes-".$self->id()."-".$Media.".txt";
2714            #Running FBA
2715            #print $self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version())."\n";
2716            system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version()));
2717            #Saving LP file if requested
2718            if (defined($saveLPFile) && $saveLPFile == 1 && -e $self->figmodel()->{"MFAToolkit output directory"}->[0].$UniqueFilename."/CurrentProblem.lp") {
2719                    system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/CurrentProblem.lp ".$self->directory().$self->id().".lp");
2720            }
2721          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);
2722          my $Result;          my $Result;
2723          if (defined($ProblemReport)) {          if (defined($ProblemReport)) {
2724                  my $Row = $ProblemReport->get_row(0);                  my $Row = $ProblemReport->get_row(0);
2725                  if (defined($Row) && defined($Row->{"Objective"}->[0])) {                  if (defined($Row) && defined($Row->{"Objective"}->[0])) {
2726                          if ($Row->{"Objective"}->[0] < 0.00000001) {                          if ($Row->{"Objective"}->[0] < 0.00000001 || $Row->{"Objective"}->[0] == 1e7) {
2727                                  $Result = "NOGROWTH:".$Row->{"Individual metabolites with zero production"}->[0];                                  $Result = "NOGROWTH";
2728                                    if (defined($Row->{"Individual metabolites with zero production"}->[0]) && $Row->{"Individual metabolites with zero production"}->[0] =~ m/cpd\d\d\d\d\d/) {
2729                                            $Result .= ":".$Row->{"Individual metabolites with zero production"}->[0];
2730                                    }
2731                          } else {                          } else {
2732                                    if (-e $self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionReactionData0.txt") {
2733                                            system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionReactionData0.txt ".$fluxFilename);
2734                                            system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionCompoundData0.txt ".$cpdFluxFilename);
2735                                    }
2736                                  $Result = $Row->{"Objective"}->[0];                                  $Result = $Row->{"Objective"}->[0];
2737                          }                          }
2738                  }                  }
2739          }          }
2740            #Deleting files if necessary
2741            if ($self->figmodel()->config("preserve all log files")->[0] ne "yes") {
2742                    $self->figmodel()->cleardirectory($UniqueFilename);
2743                    unlink($self->figmodel()->config("database message file directory")->[0].$self->id()."-".$Media."-GrowthTest.txt");
2744            }
2745            #Returning result
2746          return $Result;          return $Result;
2747  }  }
2748    
# Line 3426  Line 3767 
3767          #Checking for a biomass override          #Checking for a biomass override
3768          if (defined($self->config("biomass reaction override")->{$OrganismID})) {          if (defined($self->config("biomass reaction override")->{$OrganismID})) {
3769                  my $biomassID = $self->config("biomass reaction override")->{$OrganismID};                  my $biomassID = $self->config("biomass reaction override")->{$OrganismID};
3770                  my $tbl = $self->database()->get_table("BIOMASS",1);                  my $tbl = $self->figmodel()->database()->get_table("BIOMASS",1);
3771                  $biomassrxn = $tbl->get_row_by_key($biomassID,"DATABASE");                  $biomassrxn = $tbl->get_row_by_key($biomassID,"DATABASE");
3772                  print "Overriding biomass template and selecting ".$biomassID." for ".$OrganismID.".\n";                  print "Overriding biomass template and selecting ".$biomassID." for ".$OrganismID.".\n";
3773          } else {#Creating biomass reaction from the template          } else {#Creating biomass reaction from the template
# Line 3734  Line 4075 
4075          my($self) = @_;          my($self) = @_;
4076    
4077          #Opening the SBML file for printing          #Opening the SBML file for printing
4078          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";  
         }  
4079          if (!open (SBMLOUTPUT, ">$Filename")) {          if (!open (SBMLOUTPUT, ">$Filename")) {
4080                  return;                  return;
4081          }          }
4082    
4083          #Loading and parsing the model data          #Loading and parsing the model data
4084          my $ModelTable = $self->reaction_table();          my $mdlTbl = $self->reaction_table();
4085          if (!defined($ModelTable) || !defined($ModelTable->{"array"})) {          if (!defined($mdlTbl) || !defined($mdlTbl->{"array"})) {
4086                  print "Failed to load ".$self->id()."\n";                  return $self->fail();
                 return;  
4087          }          }
4088            my $rxnTbl = $self->figmodel()->database()->get_table("REACTIONS");
4089            my $bioTbl = $self->figmodel()->database()->get_table("BIOMASS");
4090            my $cpdTbl = $self->figmodel()->database()->get_table("COMPOUNDS");
4091            my $cmpTbl = $self->figmodel()->database()->get_table("COMPARTMENTS");
4092    
4093          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash
4094          my $ExchangeHash = {"cpd11416" => "c"};          my $ExchangeHash = {"cpd11416" => "c"};
   
4095          my %CompartmentsPresent;          my %CompartmentsPresent;
4096          $CompartmentsPresent{"c"} = 1;          $CompartmentsPresent{"c"} = 1;
4097          my %CompoundList;          my %CompoundList;
4098          my @ReactionList;          my @ReactionList;
4099          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          for (my $i=0; $i < $mdlTbl->size(); $i++) {
4100          for (my $i=0; $i < $ModelTable->size(); $i++) {                  my $Reaction = $mdlTbl->get_row($i)->{"LOAD"}->[0];
4101                  my $Reaction = $ModelTable->get_row($i)->{"LOAD"}->[0];                  my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4102                  if (defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")) && defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0])) {                  if (!defined($row)) {
4103                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4104                            if (!defined($row)) {
4105                                    next;
4106                            }
4107                    }
4108                    if (!defined($row->{"EQUATION"}->[0])) {
4109                            next;
4110                    }
4111                          push(@ReactionList,$Reaction);                          push(@ReactionList,$Reaction);
4112                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
4113                          my @MatchArray = /(cpd\d\d\d\d\d)/g;                          my @MatchArray = /(cpd\d\d\d\d\d)/g;
4114                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
4115                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;
4116                          }                          }
4117                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
4118                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;
4119                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
4120                                  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 4123 
4123                                  }                                  }
4124                          }                          }
4125                  }                  }
         }  
4126    
4127          #Printing header to SBML file          #Printing header to SBML file
4128          my $ModelName = $self->id();          my $ModelName = $self->id().$self->selected_version();
4129          $ModelName =~ s/\./_/;          $ModelName =~ s/\./_/;
4130          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";
4131      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";
4132      if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Organism name"}->[0])) {          if (defined($self->name())) {
4133          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";
4134      } else {      } else {
4135          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";
4136      }      }
4137    
4138          #Printing the unit data          #Printing the unit data
# Line 3805  Line 4149 
4149      #Printing compartments for SBML file      #Printing compartments for SBML file
4150      print SBMLOUTPUT '<listOfCompartments>'."\n";      print SBMLOUTPUT '<listOfCompartments>'."\n";
4151      foreach my $Compartment (keys(%CompartmentsPresent)) {      foreach my $Compartment (keys(%CompartmentsPresent)) {
4152          if (defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0])) {                  my $row = $cmpTbl->get_row_by_key($Compartment,"Abbreviation");
4153                  my @OutsideList = split(/\//,$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Outside"}->[0]);                  if (!defined($row) && !defined($row->{"Name"}->[0])) {
4154                            next;
4155                    }
4156                    my @OutsideList = split(/\//,$row->{"Outside"}->[0]);
4157                  my $Printed = 0;                  my $Printed = 0;
4158                  foreach my $Outside (@OutsideList) {                  foreach my $Outside (@OutsideList) {
4159                                  if (defined($CompartmentsPresent{$Outside}) && defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Outside}->[0]->{"Name"}->[0])) {                          if (defined($CompartmentsPresent{$Outside}) && defined($row->{"Name"}->[0])) {
4160                                  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";
4161                                  $Printed = 1;                                  $Printed = 1;
4162                                  last;                                  last;
4163                          }                          }
4164                  }                  }
4165                  if ($Printed eq 0) {                  if ($Printed eq 0) {
4166                          print SBMLOUTPUT '<compartment id="'.$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0].'"/>'."\n";                          print SBMLOUTPUT '<compartment id="'.$row->{"Name"}->[0].'"/>'."\n";
                         }  
4167          }          }
4168      }      }
4169      print SBMLOUTPUT '</listOfCompartments>'."\n";      print SBMLOUTPUT '</listOfCompartments>'."\n";
# Line 3825  Line 4171 
4171      #Printing the list of metabolites involved in the model      #Printing the list of metabolites involved in the model
4172          print SBMLOUTPUT '<listOfSpecies>'."\n";          print SBMLOUTPUT '<listOfSpecies>'."\n";
4173      foreach my $Compound (keys(%CompoundList)) {      foreach my $Compound (keys(%CompoundList)) {
4174                    my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4175                    if (!defined($row)) {
4176                            next;
4177                    }
4178          my $Name = $Compound;          my $Name = $Compound;
4179                  my $Formula = "";                  my $Formula = "";
4180                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  if (defined($row->{"FORMULA"}->[0])) {
4181                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                          $Formula = $row->{"FORMULA"}->[0];
4182                  }                  }
4183                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4184                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4185                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4186                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4187                  }                  }
4188                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4189                  my $Charge = 0;                  my $Charge = 0;
4190                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4191                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4192                  }                  }
4193                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {
4194                  if ($Compartment eq "e") {                  if ($Compartment eq "e") {
4195                          $ExchangeHash->{$Compound} = "e";                          $ExchangeHash->{$Compound} = "e";
4196                  }                  }
4197                  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");
4198                            print SBMLOUTPUT '<species id="'.$Compound.'_'.$Compartment.'" name="'.$Name.'" compartment="'.$cmprow->{"Name"}->[0].'" charge="'.$Charge.'" boundaryCondition="false"/>'."\n";
4199          }          }
4200      }      }
4201    
4202          #Printing the boundary species          #Printing the boundary species
4203          foreach my $Compound (keys(%{$ExchangeHash})) {          foreach my $Compound (keys(%{$ExchangeHash})) {
4204                  my $Name = $Compound;                  my $Name = $Compound;
4205                  my $Formula = "";                  my $Formula = "";
4206                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4207                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                  if (!defined($row)) {
4208                            next;
4209                    }
4210                    if (defined($row->{"FORMULA"}->[0])) {
4211                            $Formula = $row->{"FORMULA"}->[0];
4212                  }                  }
4213                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4214                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4215                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4216                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4217                  }                  }
4218                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4219                  my $Charge = 0;                  my $Charge = 0;
4220                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4221                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4222                  }                  }
4223                  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";
4224          }          }
# Line 3871  Line 4227 
4227      #Printing the list of reactions involved in the model      #Printing the list of reactions involved in the model
4228          my $ObjectiveCoef;          my $ObjectiveCoef;
4229      print SBMLOUTPUT '<listOfReactions>'."\n";      print SBMLOUTPUT '<listOfReactions>'."\n";
4230    
4231          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
4232          $ObjectiveCoef = "0.0";          $ObjectiveCoef = "0.0";
4233                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"EQUATION"}->[0])) {                  my $mdlrow = $mdlTbl->get_row_by_key($Reaction,"LOAD");
4234                    my $Reaction = $mdlrow->{"LOAD"}->[0];
4235                    my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4236                    if (!defined($row)) {
4237                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4238                            if (!defined($row)) {
4239                                    next;
4240                            }
4241                    }
4242                    if (!defined($row->{"EQUATION"}->[0])) {
4243                            next;
4244                    }
4245                  if ($Reaction =~ m/^bio/) {                  if ($Reaction =~ m/^bio/) {
4246                                  $ObjectiveCoef = "1.0";                                  $ObjectiveCoef = "1.0";
4247                          }                          }
4248                          my $LowerBound = -10000;                          my $LowerBound = -10000;
4249                  my $UpperBound = 10000;                  my $UpperBound = 10000;
4250                          my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateData($Reaction);                  my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateDataFromEquation($row->{"EQUATION"}->[0]);
4251                  my $Name = $Reaction;                  my $Name = $Reaction;
4252                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4253                          $Name = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4254                                  $Name =~ s/[<>;&]//g;                                  $Name =~ s/[<>;&]//g;
4255                  }                  }
4256                  my $Reversibility = "true";                  my $Reversibility = "true";
4257                  if (defined($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0])) {                  if (defined($mdlrow->{"DIRECTIONALITY"}->[0])) {
4258                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] ne "<=>") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] ne "<=>") {
4259                                  $LowerBound = 0;                                  $LowerBound = 0;
4260                                          $Reversibility = "false";                                          $Reversibility = "false";
4261                          }                          }
4262                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] eq "<=") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] eq "<=") {
4263                                  my $Temp = $Products;                                  my $Temp = $Products;
4264                                  $Products = $Reactants;                                  $Products = $Reactants;
4265                                  $Reactants = $Temp;                                  $Reactants = $Temp;
# Line 3900  Line 4268 
4268                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";
4269                          print SBMLOUTPUT "<notes>\n";                          print SBMLOUTPUT "<notes>\n";
4270                          my $ECData = "";                          my $ECData = "";
4271                          if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0])) {                  if (defined($row->{"ENZYME"}->[0])) {
4272                                  $ECData = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0];                          $ECData = $row->{"ENZYME"}->[0];
4273                          }                          }
4274                          my $SubsystemData = "";                          my $SubsystemData = "";
4275                          if (defined($ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0])) {                  if (defined($mdlrow->{"SUBSYSTEM"}->[0])) {
4276                                  $SubsystemData = $ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0];                          $SubsystemData = $mdlrow->{"SUBSYSTEM"}->[0];
4277                          }                          }
4278                          my $GeneAssociation = "";                          my $GeneAssociation = "";
4279                          my $ProteinAssociation = "";                          my $ProteinAssociation = "";
4280                          if (defined($ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0])) {                  if (defined($mdlrow->{"ASSOCIATED PEG"}->[0])) {
4281                                  if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} == 1 && $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {                          if (@{$mdlrow->{"ASSOCIATED PEG"}} == 1 && $mdlrow->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {
4282                                          $GeneAssociation = $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0];                                  $GeneAssociation = $mdlrow->{"ASSOCIATED PEG"}->[0];
4283                                  } else {                                  } else {
4284                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4285                                                  $GeneAssociation = "( ";                                                  $GeneAssociation = "( ";
4286                                          }                                          }
4287                                          for (my $i=0; $i < @{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}}; $i++) {                                  for (my $i=0; $i < @{$mdlrow->{"ASSOCIATED PEG"}}; $i++) {
4288                                                  if ($i > 0) {                                                  if ($i > 0) {
4289                                                          $GeneAssociation .= " )  or  ( ";                                                          $GeneAssociation .= " )  or  ( ";
4290                                                  }                                                  }
4291                                                  $GeneAssociation .= $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[$i];                                          $GeneAssociation .= $mdlrow->{"ASSOCIATED PEG"}->[$i];
4292                                          }                                          }
4293                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4294                                                  $GeneAssociation .= " )";                                                  $GeneAssociation .= " )";
4295                                          }                                          }
4296                                  }                                  }
# Line 3931  Line 4299 
4299                                          $GeneAssociation = "( ".$GeneAssociation." )";                                          $GeneAssociation = "( ".$GeneAssociation." )";
4300                                  }                                  }
4301                                  $ProteinAssociation = $GeneAssociation;                                  $ProteinAssociation = $GeneAssociation;
4302                                  if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Genome ID"}->[0])) {                          if (defined($self->genome())) {
4303                                          $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());
4304                                  }                                  }
4305                          }                          }
4306                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";
# Line 3963  Line 4331 
4331              print SBMLOUTPUT "</kineticLaw>\n";              print SBMLOUTPUT "</kineticLaw>\n";
4332                          print SBMLOUTPUT '</reaction>'."\n";                          print SBMLOUTPUT '</reaction>'."\n";
4333                  }                  }
         }  
4334    
4335          my @ExchangeList = keys(%{$ExchangeHash});          my @ExchangeList = keys(%{$ExchangeHash});
4336          foreach my $ExCompound (@ExchangeList) {          foreach my $ExCompound (@ExchangeList) {
4337                  my $ExCompoundName = $ExCompound;                  my $ExCompoundName = $ExCompound;
4338                  my $Row = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->get_row_by_key($ExCompound,"DATABASE");                  my $Row = $cpdTbl->get_row_by_key($ExCompound,"DATABASE");
4339                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {
4340                          $ExCompoundName = $Row->{"NAME"}->[0];                          $ExCompoundName = $Row->{"NAME"}->[0];
4341                          $ExCompoundName =~ s/[<>;&]//g;                          $ExCompoundName =~ s/[<>;&]//g;
# Line 4025  Line 4392 
4392                  $tbl->add_row($row);                  $tbl->add_row($row);
4393          }          }
4394          $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");  
4395  }  }
4396    
4397  =head3 PrintModelLPFile  =head3 PrintModelLPFile
# Line 4054  Line 4420 
4420    
4421  =head3 patch_model  =head3 patch_model
4422  Definition:  Definition:
4423          FIGMODELTable:patch results = FIGMODELmodel->patch_model(FIGMODELTable:patch table);          FIGMODELmodel->patch_model([] -or- {} of patch arguments);
4424  Description:  Description:
4425  =cut  =cut
4426  sub patch_model {  sub patch_model {
4427          my ($self,$tbl) = @_;          my ($self,$arguments) = @_;
4428    
4429          #Instantiating table          #Remove rxn00574
         my $results = FIGMODELTable->new(["Reactions","New genes","Old genes","Genes","Roles","Status"],$self->directory()."PatchResults-".$self->id().$self->selected_version().".tbl",["Reaction"],"\t",";",undef);  
         #Getting genome annotations  
         my $features = $self->figmodel()->database()->get_genome_feature_table($self->genome());  
         #Gettubg reaction table  
         my $reactions = $self->reaction_table();  
         #Checking for patched roles  
         for (my $i=0; $i < $tbl->size(); $i++) {  
                 my $row = $tbl->get_row($i);  
                 my @genes = $features->get_rows_by_key($row->{ROLE}->[0],"ROLES");  
                 if (@genes > 0) {  
                         for (my $j=0; $j < @{$row->{REACTIONS}};$j++) {  
                                 my $resultrxn = $results->get_row_by_key($row->{REACTIONS}->[$j],"Reactions");  
                                 if (!defined($resultrxn)) {  
                                         $resultrxn = $results->add_row({"Reactions"=>[$row->{REACTIONS}->[$j]],"Roles"=>[$row->{ROLE}->[0]]});  
                                 }  
                                 my $rxnrow = $reactions->get_row_by_key($row->{REACTIONS}->[$j],"LOAD");  
                                 if (defined($rxnrow) && !defined($resultrxn->{"Old genes"})) {  
                                         $resultrxn->{"Old genes"} = $rxnrow->{"ASSOCIATED PEG"};  
                                         if ($resultrxn->{"Old genes"}->[0] !~ m/GAP|BOF|UNIVERSAL|SPONTANEOUS/) {  
                                                 push(@{$resultrxn->{"Genes"}},@{$resultrxn->{"Old genes"}});  
                                         }  
                                 }  
                                 delete $resultrxn->{"Current gene set"};  
                                 if (defined($resultrxn->{"Genes"})) {  
                                         push(@{$resultrxn->{"Current gene set"}},@{$resultrxn->{"Genes"}});  
                                 }  
                                 for (my $k=0; $k < @genes; $k++) {  
                                         if ($genes[$k]->{ID}->[0] =~ m/(peg\.\d+)/) {  
                                                 my $gene = $1;  
                                                 my $addgene = 1;  
                                                 if (defined($resultrxn->{"Old genes"})) {  
                                                         for (my $m=0; $m < @{$resultrxn->{"Old genes"}}; $m++) {  
                                                                 if ($resultrxn->{"Old genes"}->[$m] =~ m/$gene/) {  
                                                                         $addgene = 0;  
                                                                 }  
                                                         }  
                                                 }  
                                                 if ($addgene == 1) {  
                                                         push(@{$resultrxn->{"New genes"}},$gene);  
                                                         if ($row->{COMPLEX}->[0] ne "0" && defined($resultrxn->{"Current gene set"})) {  
                                                                 my $added = 0;  
                                                                 for (my $m=0; $m < @{$resultrxn->{"Current gene set"}}; $m++) {  
                                                                         if ($row->{COMPLEX}->[0] eq "1") {  
                                                                                 $resultrxn->{"Current gene set"}->[$m] = $resultrxn->{"Current gene set"}->[$m]."+".$gene;  
                                                                                 $added = 1;  
                                                                         } else {  
                                                                                 my @geneset = split(/\+/,$resultrxn->{"Current gene set"}->[$m]);  
                                                                                 for (my $n=0; $n < @geneset;$n++) {  
                                                                                         if ($self->figmodel()->colocalized_genes($geneset[$n],$gene,$self->genome()) == 1) {  
                                                                                                 $resultrxn->{"Current gene set"}->[$m] = $resultrxn->{"Current gene set"}->[$m]."+".$gene;  
                                                                                                 $added = 1;  
                                                                                                 last;  
                                                                                         }  
                                                                                 }  
                                                                         }  
                                                                 }  
                                                                 if ($added == 0) {  
                                                                         push(@{$resultrxn->{"Current gene set"}},$gene);  
                                                                 }  
                                                         } else {  
                                                                 push(@{$resultrxn->{"Current gene set"}},$gene);  
                                                         }  
                                                 }  
                                         }  
                                 }  
                                 delete $resultrxn->{"Genes"};  
                                 push(@{$resultrxn->{"Genes"}},@{$resultrxn->{"Current gene set"}});  
                         }  
                 }  
         }  
4430    
4431          #Ensuring that the old model is preserved          #Adjust biomass reaction
4432          $self->ArchiveModel();  
4433          #Modifing the reaction list  
4434          for (my $i=0; $i < $results->size();$i++) {  
4435                  my $row = $results->get_row($i);          #Check for growth
4436                  my $rxnrow = $reactions->get_row_by_key($row->{"Reactions"}->[0],"LOAD");  
4437                  if (defined($rxnrow)) {          #Regapfill if necessary
4438                          $rxnrow->{"ASSOCIATED PEG"} = $row->{"Genes"};  
4439                  } else {          #Save model changes in history file
                         $reactions->add_row({LOAD=>[$row->{"Reactions"}->[0]],DIRECTIONALITY=>[$self->figmodel()->reversibility_of_reaction($row->{"Reactions"}->[0])],COMPARTMENT=>["c"],"ASSOCIATED PEG"=>$row->{"Genes"},SUBSYSTEM=>["NONE"],CONFIDENCE=>[2],REFERENCE=>["NONE"],NOTES=>["PATCH"]});  
                 }  
         }  
         $reactions->save();  
         $results->save();  
         $self->update_model_stats();  
         $self->PrintModelLPFile();  
         $self->run_default_model_predictions();  
         #Returning results  
         return $results;  
4440  }  }
4441    
4442  =head3 translate_genes  =head3 translate_genes
# Line 4354  Line 4640 
4640          }          }
4641  }  }
4642    
4643    =pod
4644    
4645    =item * [string]:I<list of essential genes> = B<run_geneKO_slow> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4646    
4647    =cut
4648    
4649    sub run_geneKO_slow {
4650            my ($self,$media,$maxGrowth,$save) = @_;
4651            my $output;
4652            my $UniqueFilename = $self->figmodel()->filename();
4653            if (defined($maxGrowth) && $maxGrowth == 1) {
4654                    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()));
4655            } else {
4656                    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()));
4657            }
4658            if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt") {
4659                    print "Deletion study file not found!.\n";
4660                    return undef;
4661            }
4662            my $deltbl = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt",";","|",1,["Experiment"]);
4663            for (my $i=0; $i < $deltbl->size(); $i++) {
4664                    my $row = $deltbl->get_row($i);
4665                    if ($row->{"Insilico growth"}->[0] < 0.0000001) {
4666                            push(@{$output},$row->{Experiment}->[0]);
4667                    }
4668            }
4669            if (defined($output)) {
4670                    if (defined($save) && $save == 1) {
4671                            my $tbl = $self->essentials_table();
4672                            my $row = $tbl->get_row_by_key($media,"MEDIA",1);
4673                            $row->{"ESSENTIAL GENES"} = $output;
4674                            $tbl->save();
4675                    }
4676            }
4677            return $output;
4678    }
4679    
4680    =pod
4681    
4682    =item * [string]:I<list of minimal genes> = B<run_gene_minimization> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4683    
4684    =cut
4685    
4686    sub run_gene_minimization {
4687            my ($self,$media,$maxGrowth,$save) = @_;
4688            my $output;
4689    
4690            #Running the MFAToolkit
4691            my $UniqueFilename = $self->figmodel()->filename();
4692            if (defined($maxGrowth) && $maxGrowth == 1) {
4693                    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()));
4694            } else {
4695                    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()));
4696            }
4697            my $tbl = $self->figmodel()->LoadProblemReport($UniqueFilename);
4698            if (!defined($tbl)) {
4699                    return undef;
4700            }
4701            for (my $i=0; $i < $tbl->size(); $i++) {
4702                    my $row = $tbl->get_row($i);
4703                    if ($row->{Notes}->[0] =~ m/Recursive\sMILP\sGENE_USE\soptimization/) {
4704                            my @array = split(/\|/,$row->{Notes}->[0]);
4705                            my $solution = $array[0];
4706                            $_ = $solution;
4707                            my @OriginalArray = /(peg\.\d+)/g;
4708                            push(@{$output},@OriginalArray);
4709                            last;
4710                    }
4711            }
4712    
4713            if (defined($output)) {
4714                    if (defined($save) && $save == 1) {
4715                            my $tbl = $self->load_model_table("MinimalGenes");
4716                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4717                            if (defined($row)) {
4718                                    $row->{GENES} = $output;
4719                            } else {
4720                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4721                            }
4722                            $tbl->save();
4723                    }
4724            }
4725            return $output;
4726    }
4727    
4728    =pod
4729    
4730    =item * [string]:I<list of inactive genes> = B<identify_inactive_genes> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4731    
4732    =cut
4733    
4734    sub identify_inactive_genes {
4735            my ($self,$media,$maxGrowth,$save) = @_;
4736            my $output;
4737            #Running the MFAToolkit
4738            my $UniqueFilename = $self->figmodel()->filename();
4739            if (defined($maxGrowth) && $maxGrowth == 1) {
4740                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$media,["ProductionMFA"],{"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()));
4741            } else {
4742                    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()));
4743            }
4744            #Reading in the output bounds file
4745            my $ReactionTB;
4746            if (-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt") {
4747                    $ReactionTB = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt",";","|",1,["DATABASE ID"]);
4748            }
4749            if (!defined($ReactionTB)) {
4750                    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";
4751                    return undef;
4752            }
4753            #Clearing output
4754            $self->figmodel()->clearing_output($UniqueFilename,"Classify-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");
4755            my $geneHash;
4756            my $activeGeneHash;
4757            for (my $i=0; $i < $ReactionTB->size(); $i++) {
4758                    my $Row = $ReactionTB->get_row($i);
4759                    if (defined($Row->{"Min FLUX"}) && defined($Row->{"Max FLUX"}) && defined($Row->{"DATABASE ID"}) && $Row->{"DATABASE ID"}->[0] =~ m/rxn\d\d\d\d\d/) {
4760                            my $data = $self->get_reaction_data($Row->{"DATABASE ID"}->[0]);
4761                            if (defined($data->{"ASSOCIATED PEG"})) {
4762                                    my $active = 0;
4763                                    if ($Row->{"Min FLUX"}->[0] > 0.00000001 || $Row->{"Max FLUX"}->[0] < -0.00000001 || ($Row->{"Max FLUX"}->[0]-$Row->{"Min FLUX"}->[0]) > 0.00000001) {
4764                                            $active = 1;
4765                                    }
4766                                    for (my $j=0; $j < @{$data->{"ASSOCIATED PEG"}}; $j++) {
4767                                            $_ = $data->{"ASSOCIATED PEG"}->[$j];
4768                                            my @OriginalArray = /(peg\.\d+)/g;
4769                                            for (my $k=0; $k < @OriginalArray; $k++) {
4770                                                    if ($active == 1) {
4771                                                            $activeGeneHash->{$OriginalArray[$k]} = 1;
4772                                                    }
4773                                                    $geneHash->{$OriginalArray[$k]} = 1;
4774                                            }
4775                                    }
4776                            }
4777                    }
4778            }
4779            my @allGenes = keys(%{$geneHash});
4780            for (my $i=0; $i < @allGenes; $i++) {
4781                    if (!defined($activeGeneHash->{$allGenes[$i]})) {
4782                            push(@{$output},$allGenes[$i]);
4783                    }
4784            }
4785            if (defined($output)) {
4786                    if (defined($save) && $save == 1) {
4787                            my $tbl = $self->load_model_table("InactiveGenes");
4788                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4789                            if (defined($row)) {
4790                                    $row->{GENES} = $output;
4791                            } else {
4792                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4793                            }
4794                            $tbl->save();
4795                    }
4796            }
4797            return $output;
4798    }
4799    
4800    sub ConvertVersionsToHistoryFile {
4801            my ($self) = @_;
4802            my $vone = 0;
4803            my $vtwo = 0;
4804            my $continue = 1;
4805            my $lastTable;
4806            my $currentTable;
4807            my $cause;
4808            my $lastChanged = 0;
4809            my $noHitCount = 0;
4810            while ($continue == 1) {
4811                    $cause = "NONE";
4812                    $currentTable = undef;
4813                    if (-e $self->directory().$self->id()."V".($vone+1).".".$vtwo.".txt") {
4814                            $noHitCount = 0;
4815                            $lastChanged = 0;
4816                            $vone = $vone+1;
4817                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4818                            $cause = "RECONSTRUCTION";
4819                    } elsif (-e $self->directory().$self->id()."V".$vone.".".($vtwo+1).".txt") {
4820                            $noHitCount = 0;
4821                            $lastChanged = 0;
4822                            $vtwo = $vtwo+1;
4823                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4824                            $cause = "AUTOCOMPLETION";
4825                    } elsif ($lastChanged == 0) {
4826                            $lastChanged = 1;
4827                            $vone = $vone+1;
4828                            $cause = "RECONSTRUCTION";
4829                    } elsif ($lastChanged == 1) {
4830                            $lastChanged = 2;
4831                            $vone = $vone-1;
4832                            $vtwo = $vtwo+1;
4833                            $cause = "AUTOCOMPLETION";
4834                    } elsif ($lastChanged == 2) {
4835                            $lastChanged = 0;
4836                            $vone = $vone+1;
4837                            $cause = "RECONSTRUCTION";
4838                    }
4839                    if (defined($currentTable)) {
4840                            if (defined($lastTable)) {
4841                                    print $cause."\t".$self->directory().$self->id()."V".$vone.".".$vtwo.".txt\n";
4842                                    $self->calculate_model_changes($lastTable,$cause,$currentTable,"V".$vone.".".$vtwo);
4843                            }
4844                            $lastTable = $currentTable;
4845                    } else {
4846                            $noHitCount++;
4847                            if ($noHitCount >= 40) {
4848                                    last;
4849                            }
4850                    }
4851            }
4852    }
4853    
4854  1;  1;

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3