[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.13, Mon May 10 21:45:44 2010 UTC revision 1.20, Tue Jun 15 04:04:01 2010 UTC
# Line 28  Line 28 
28          }          }
29    
30          #Checking that the id exists          #Checking that the id exists
31          my $tbl = $self->figmodel()->database()->GetDBTable("MODELS");          my $modelHandle = $self->figmodel()->database()->get_object_manager("model");
32          if (!defined($tbl)) {          if (!defined($modelHandle)) {
33                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not load MODELS table. Check database!");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not load MODELS table. Check database!");
34                  return undef;                  return undef;
35          }          }
36    
37          #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
         my $index = $id;  
38          if ($id =~ m/^\d+$/) {          if ($id =~ m/^\d+$/) {
39                  $self->{_data} = $tbl->get_row($id);                  my $objects = $modelHandle->get_objects();
40          } else {                  $self->{_data} = $objects->[$id];
41                  $self->{_data} = $tbl->get_row_by_key($id,"id");                  $self->figmodel()->{_models}->{$id} = $self;
42                  if (!defined($self->{_data})) {          } else {
43                          if ($id =~ m/(.+)(V[^V]+)/) {                  my $objects = $modelHandle->get_objects({id => $id});
44                                  $self->{_data} = $tbl->get_row_by_key($1,"id");                  if (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {
45                                  if (!defined($self->{_data})) {                          $objects = $modelHandle->get_objects({id => $1});
46                            if (!defined($objects->[0])) {
47                                          $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");                                          $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
48                                          return undef;                                          return undef;
49                                  }                                  }
50                                  $self->{_selectedversion} = $2;                                  $self->{_selectedversion} = $2;
51                          } else {                  } elsif (!defined($objects->[0])) {
52                                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");                                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
53                                  return undef;                                  return undef;
54                          }                          }
55                  }                  $self->{_data} = $objects->[0];
                 $index = $tbl->row_index($self->{_data});  
56          }          }
57          if (!defined($self->{_data})) {          if (!defined($self->{_data})) {
58                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find specified id in database!");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find specified id in database!");
59                  return undef;                  return undef;
60          }          }
         $self->{_index} = $index;  
61          $self->figmodel()->{_models}->{$self->id()} = $self;          $self->figmodel()->{_models}->{$self->id()} = $self;
62          $self->figmodel()->{_models}->{$self->index()} = $self;  
63          return $self;          return $self;
64  }  }
65    
# Line 118  Line 116 
116  =cut  =cut
117  sub fig {  sub fig {
118          my ($self) = @_;          my ($self) = @_;
   
119          if (!defined($self->{_fig}) && $self->source() !~ /^MGRAST/) {          if (!defined($self->{_fig}) && $self->source() !~ /^MGRAST/) {
120                  if ($self->source() =~ /^RAST/) {                  if ($self->source() =~ /^RAST/) {
121                          $self->{"_fig"} = $self->figmodel()->fig();#$self->genome());                          $self->{"_fig"} = $self->figmodel()->fig();#$self->genome());
# Line 126  Line 123 
123                          $self->{"_fig"} = $self->figmodel()->fig();                          $self->{"_fig"} = $self->figmodel()->fig();
124                  }                  }
125          }          }
   
126          return $self->{"_fig"};          return $self->{"_fig"};
127  }  }
128    
# Line 170  Line 166 
166  =cut  =cut
167  sub mgdata {  sub mgdata {
168          my ($self) = @_;          my ($self) = @_;
   
169          if (!defined($self->{_mgdata}) && $self->source() =~ /^MGRAST/) {          if (!defined($self->{_mgdata}) && $self->source() =~ /^MGRAST/) {
170                  require MGRAST;                  require MGRAST;
171                  $self->{_mgdata} = $self->figmodel()->mgrast()->Job->get_objects( { 'genome_id' => $self->genome() } )                  $self->{_mgdata} = $self->figmodel()->mgrast()->Job->get_objects( { 'genome_id' => $self->genome() } )
172          }          }
   
173          return $self->{_mgdata};          return $self->{_mgdata};
174  }  }
175    
# Line 187  Line 181 
181  =cut  =cut
182  sub id {  sub id {
183          my ($self) = @_;          my ($self) = @_;
184          return $self->{_data}->{id}->[0];          return $self->{_data}->id();
185  }  }
186    
187  =head3 owner  =head3 owner
# Line 198  Line 192 
192  =cut  =cut
193  sub owner {  sub owner {
194          my ($self) = @_;          my ($self) = @_;
195          return $self->{_data}->{owner}->[0];          return $self->{_data}->owner();
 }  
   
 =head3 index  
 Definition:  
         string = FIGMODELmodel->index();  
 Description:  
         Returns model index  
 =cut  
 sub index {  
         my ($self) = @_;  
         return $self->{_index};  
196  }  }
197    
198  =head3 name  =head3 name
# Line 228  Line 211 
211                          if (defined($self->mgdata())) {                          if (defined($self->mgdata())) {
212                                  $self->{_name} = $self->mgdata()->genome_name;                                  $self->{_name} = $self->mgdata()->genome_name;
213                          }                          }
                 } elsif (defined($self->stats())) {  
                         $self->{_name} = $self->stats()->{'Organism name'}->[0];  
214                  } elsif ($source !~ /^RAST/) {                  } elsif ($source !~ /^RAST/) {
215                          $self->{_name} = $self->fig()->orgname_of_orgid($self->genome());                          $self->{_name} = $self->fig()->orgname_of_orgid($self->genome());
216                    } else {
217                            $self->{_name} = $self->figmodel()->get_genome_stats($self->genome())->{NAME}->[0];
218                  }                  }
219          }          }
220    
221          return $self->{_name};          return $self->{_name};
222  }  }
223    
 =head3 stats  
 Definition:  
         string = FIGMODELmodel->stats();  
 Description:  
         Returns model stats  
 =cut  
 sub stats {  
         my ($self) = @_;  
   
         if (!defined($self->{_stats})) {  
                 $self->{_stats} = $self->figmodel()->database()->GetDBTable("MODEL STATS")->get_row_by_key($self->id(),"Model ID");  
         }  
         return $self->{_stats};  
 }  
   
224  =head3 get_reaction_class  =head3 get_reaction_class
225  Definition:  Definition:
226          string = FIGMODELmodel->get_reaction_class(string::reaction ID);          string = FIGMODELmodel->get_reaction_class(string::reaction ID);
# Line 260  Line 228 
228          Returns reaction class          Returns reaction class
229  =cut  =cut
230  sub get_reaction_class {  sub get_reaction_class {
231          my ($self,$reaction,$nohtml) = @_;          my ($self,$reaction,$nohtml,$brief_flux) = @_;
232    
233          if (!-e $self->directory()."ReactionClassification-".$self->id().".tbl") {          if (!-e $self->directory()."ReactionClassification-".$self->id().".tbl") {
234                  if (!defined($self->{_reaction_classes})) {                  if (!defined($self->{_reaction_classes})) {
# Line 277  Line 245 
245                          my $max = $ClassRow->{MAX}->[0];                          my $max = $ClassRow->{MAX}->[0];
246                          if ($ClassRow->{CLASS}->[0] eq "Positive") {                          if ($ClassRow->{CLASS}->[0] eq "Positive") {
247                                  $class = "Essential =>";                                  $class = "Essential =>";
248                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
249                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {
250                                  $class = "Essential <=";                                  $class = "Essential <=";
251                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
252                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {
253                                  $class = "Active =>";                                  $class = "Active =>";
254                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
255                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {
256                                  $class = "Active <=";                                  $class = "Active <=";
257                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
258                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {
259                                  $class = "Active <=>";                                  $class = "Active <=>";
260                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
261                          } elsif ($ClassRow->{CLASS}->[0] eq "Blocked") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Blocked") {
262                                  $class = "Inactive";                                  $class = "Inactive";
263                          } elsif ($ClassRow->{CLASS}->[0] eq "Dead") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Dead") {
# Line 324  Line 292 
292                          my $max = $ClassRow->{MAX}->[$i];                          my $max = $ClassRow->{MAX}->[$i];
293                          if ($ClassRow->{CLASS}->[$i] eq "Positive") {                          if ($ClassRow->{CLASS}->[$i] eq "Positive") {
294                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential =>";
295                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
296                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {
297                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";
298                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
299                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {
300                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";
301                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
302                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {
303                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";
304                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
305                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {
306                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";
307                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
308                          } elsif ($ClassRow->{CLASS}->[$i] eq "Blocked") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Blocked") {
309                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Inactive";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Inactive";
310                          } elsif ($ClassRow->{CLASS}->[$i] eq "Dead") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Dead") {
# Line 363  Line 331 
331    
332          if (!defined($self->{_biomass})) {          if (!defined($self->{_biomass})) {
333                  my $rxntbl = $self->reaction_table();                  my $rxntbl = $self->reaction_table();
334                    if (defined($rxntbl)) {
335                  for (my $i=0; $i < $rxntbl->size(); $i++) {                  for (my $i=0; $i < $rxntbl->size(); $i++) {
336                          if ($rxntbl->get_row($i)->{"LOAD"}->[0] =~ m/bio\d\d\d\d\d/) {                          if ($rxntbl->get_row($i)->{"LOAD"}->[0] =~ m/bio\d\d\d\d\d/) {
337                                  $self->{_biomass} = $rxntbl->get_row($i)->{"LOAD"}->[0];                                  $self->{_biomass} = $rxntbl->get_row($i)->{"LOAD"}->[0];
# Line 370  Line 339 
339                          }                          }
340                  }                  }
341          }          }
342            }
343    
344          return $self->get_reaction_data($self->{_biomass});          return $self->get_reaction_data($self->{_biomass});
345  }  }
# Line 417  Line 387 
387  =cut  =cut
388  sub load_model_table {  sub load_model_table {
389          my ($self,$name,$refresh) = @_;          my ($self,$name,$refresh) = @_;
390          if (!defined($refresh)) {          if (defined($refresh) && $refresh == 1) {
                 $refresh = 1;  
         }  
         if ($refresh == 1) {  
391                  delete $self->{"_".$name};                  delete $self->{"_".$name};
392          }          }
393          if (!defined($self->{"_".$name})) {          if (!defined($self->{"_".$name})) {
394                  my $tbldef = $self->figmodel()->config("$name");                  my $tbldef = $self->figmodel()->config($name);
395                  if (!defined($tbldef)) {                  if (!defined($tbldef)) {
396                          return undef;                          return undef;
397                  }                  }
398                  my $filename = $self->directory().$name."-".$self->id().$self->selected_version().".tbl";                  my $itemDelim = "|";
399                  $self->{"_".$name} = $self->figmodel()->database()->load_table($filename,"\t","|",$tbldef->{headingline}->[0],$tbldef->{hashcolumns});                  if (defined($tbldef->{itemdelimiter}->[0])) {
400                  if (!defined($self->{"_".$name})) {                          $itemDelim = $tbldef->{itemdelimiter}->[0];
401                            if ($itemDelim eq "SC") {
402                                    $itemDelim = ";";
403                            }
404                    }
405                    my $columnDelim = "\t";
406                    if (defined($tbldef->{columndelimiter}->[0])) {
407                            $columnDelim = $tbldef->{columndelimiter}->[0];
408                            if ($columnDelim eq "SC") {
409                                    $columnDelim = ";";
410                            }
411                    }
412                    my $suffix = ".tbl";
413                    if (defined($tbldef->{filename_suffix}->[0])) {
414                            $suffix = $tbldef->{filename_suffix}->[0];
415                    }
416                    my $filename = $self->directory().$name."-".$self->id().$self->selected_version().$suffix;
417                    if (defined($tbldef->{filename_prefix}->[0])) {
418                            if ($tbldef->{filename_prefix}->[0] eq "NONE") {
419                                    $filename = $self->directory().$self->id().$self->selected_version().$suffix;
420                            } else {
421                                    $filename = $self->directory().$tbldef->{filename_prefix}->[0]."-".$self->id().$self->selected_version().$suffix;
422                            }
423                    }
424                    if (-e $filename) {
425                            $self->{"_".$name} = $self->figmodel()->database()->load_table($filename,$columnDelim,$itemDelim,$tbldef->{headingline}->[0],$tbldef->{hashcolumns});
426                    } else {
427                          if (defined($tbldef->{prefix})) {                          if (defined($tbldef->{prefix})) {
428                                  $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"));
429                          } else {                          } else {
430                                  $self->{"_".$name} = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},"\t","|");                                  $self->{"_".$name} = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},$columnDelim,$itemDelim);
431                          }                          }
432                  }                  }
433          }          }
434          return $self->{"_".$name};          return $self->{"_".$name};
435  }  }
436    
437    =head3 create_table_prototype
438    
439    Definition:
440            FIGMODELTable::table = FIGMODELmodel->create_table_prototype(string::table);
441    Description:
442            Returns a empty FIGMODELTable with all the metadata associated with the input table name
443    
444    =cut
445    sub create_table_prototype {
446            my ($self,$TableName) = @_;
447    
448            #Checking if the table definition exists in the FIGMODELconfig file
449            if (!defined($self->figmodel()->config($TableName))) {
450                    $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:Definition not found for ".$TableName);
451                    return undef;
452            }
453            #Checking that this is a database table
454            if (!defined($self->config($TableName)->{tabletype}) || $self->config($TableName)->{tabletype}->[0] ne "ModelTable") {
455                    $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:".$TableName." is not a model table!");
456                    return undef;
457            }
458            if (!defined($self->config($TableName)->{delimiter})) {
459                    $self->config($TableName)->{delimiter}->[0] = ";";
460            }
461            if (!defined($self->config($TableName)->{itemdelimiter})) {
462                    $self->config($TableName)->{itemdelimiter}->[0] = "|";
463            }
464            my $prefix;
465            if (defined($self->config($TableName)->{prefix})) {
466                    $prefix = join("\n",@{$self->config($TableName)->{prefix}});
467            }
468            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);
469            return $tbl;
470    }
471    
472  =head3 get_reaction_number  =head3 get_reaction_number
473  Definition:  Definition:
474          int = FIGMODELmodel->get_reaction_number();          int = FIGMODELmodel->get_reaction_number();
# Line 449  Line 477 
477  =cut  =cut
478  sub get_reaction_number {  sub get_reaction_number {
479          my ($self) = @_;          my ($self) = @_;
   
480          if (!defined($self->reaction_table())) {          if (!defined($self->reaction_table())) {
481                  return 0;                  return 0;
482          }          }
   
483          return $self->reaction_table()->size();          return $self->reaction_table()->size();
484  }  }
485    
# Line 464  Line 490 
490          Returns FIGMODELTable with the reaction list for the model          Returns FIGMODELTable with the reaction list for the model
491  =cut  =cut
492  sub reaction_table {  sub reaction_table {
493          my ($self) = @_;          my ($self,$clear) = @_;
494            my $tbl = $self->load_model_table("ModelReactions",$clear);
         if (!defined($self->{_reaction_data})) {  
                 $self->{_reaction_data} = $self->figmodel()->database()->GetDBModel($self->id());  
495                  my $classTbl = $self->reaction_class_table();                  my $classTbl = $self->reaction_class_table();
496            if (defined($classTbl)) {
497                  for (my $i=0; $i < $classTbl->size(); $i++) {                  for (my $i=0; $i < $classTbl->size(); $i++) {
498                          my $row = $classTbl->get_row($i);                          my $row = $classTbl->get_row($i);
499                          my $rxnRow = $self->{_reaction_data}->get_row_by_key($row->{"REACTION"}->[0],"LOAD");                          if (defined($row->{REACTION})) {
500                                    my $rxnRow = $tbl->get_row_by_key($row->{"REACTION"}->[0],"LOAD");
501                                    if (defined($row->{MEDIA})) {
502                          for (my $j=0; $j < @{$row->{MEDIA}};$j++) {                          for (my $j=0; $j < @{$row->{MEDIA}};$j++) {
503                                  my $class = "Active <=>";                                  my $class = "Active <=>";
504                                  if ($row->{CLASS}->[$j] eq "Positive") {                                  if ($row->{CLASS}->[$j] eq "Positive") {
# Line 493  Line 520 
520                          }                          }
521                  }                  }
522          }          }
523                    }
524            }
525            return $tbl;
526    }
527    
528          return $self->{_reaction_data};  =head3 model_history
529    Definition:
530            FIGMODELTable = FIGMODELmodel->model_history();
531    Description:
532            Returns FIGMODELTable with the history of model changes
533    =cut
534    sub model_history {
535            my ($self,$clear) = @_;
536            return $self->load_model_table("ModelHistory",$clear);
537  }  }
538    
539  =head3 feature_table  =head3 feature_table
# Line 581  Line 620 
620          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
621  =cut  =cut
622  sub reaction_class_table {  sub reaction_class_table {
623          my ($self) = @_;          my ($self,$clear) = @_;
624            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};  
625  }  }
626    
627  =head3 compound_class_table  =head3 compound_class_table
# Line 601  Line 631 
631          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
632  =cut  =cut
633  sub compound_class_table {  sub compound_class_table {
634          my ($self) = @_;          my ($self,$clear) = @_;
635            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};  
636  }  }
637    
638  =head3 get_essential_genes  =head3 get_essential_genes
# Line 698  Line 719 
719  =cut  =cut
720  sub genome {  sub genome {
721          my ($self) = @_;          my ($self) = @_;
722          return $self->{_data}->{genome}->[0];          return $self->{_data}->genome();
723  }  }
724    
725  =head3 source  =head3 source
# Line 709  Line 730 
730  =cut  =cut
731  sub source {  sub source {
732          my ($self) = @_;          my ($self) = @_;
733          return $self->{_data}->{source}->[0];          return $self->{_data}->source();
734  }  }
735    
736  =head3 rights  =head3 rights
# Line 720  Line 741 
741  =cut  =cut
742  sub rights {  sub rights {
743          my ($self,$username) = @_;          my ($self,$username) = @_;
   
744          if ($self->public()) {          if ($self->public()) {
745                  return 1;                  return 1;
746          }          }
# Line 728  Line 748 
748                  return 0;                  return 0;
749          }          }
750          if (!defined($self->{_userrights}->{$username})) {          if (!defined($self->{_userrights}->{$username})) {
751                  if (defined($self->{_data}->{master})) {                  $self->{_userrights}->{$self->{_data}->owner()} = 1;
752                          for (my $i=0; $i < @{$self->{_data}->{master}};$i++) {                  my @users = split(/\|/,$self->{_data}->users());
753                                  $self->{_userrights}->{$self->{_data}->{master}->[$i]} = 1;                  for (my $i=0; $i < @users;$i++) {
754                          }                          $self->{_userrights}->{$users[$i]} = 1;
                 }  
                 if (defined($self->{_data}->{users})) {  
                         for (my $i=0; $i < @{$self->{_data}->{users}};$i++) {  
                                 $self->{_userrights}->{$self->{_data}->{users}->[$i]} = 1;  
                         }  
755                  }                  }
756          }          }
757          return $self->{_userrights}->{$username};          return $self->{_userrights}->{$username};
# Line 750  Line 765 
765  =cut  =cut
766  sub public {  sub public {
767          my ($self) = @_;          my ($self) = @_;
768            if ($self->{_data}->users() eq "all") {
769          if (!defined($self->{_public})) {                  return 1;
                 $self->{_public} = 0;  
                 if (defined($self->{_data}->{users}->[0]) && $self->{_data}->{users}->[0] eq "all") {  
                         $self->{_public} = 1;  
                 }  
770          }          }
771          return $self->{_public};          return 0;
772  }  }
773    
774  =head3 directory  =head3 directory
# Line 805  Line 816 
816          return $self->directory().$self->id().$self->selected_version().".txt";          return $self->directory().$self->id().$self->selected_version().".txt";
817  }  }
818    
 =head3 set_metagenome_stats  
 Definition:  
         string = FIGMODELmodel->set_metagenome_stats();  
 Description:  
         Sets the values of many model stats for a metagenome  
 =cut  
 sub set_metagenome_stats {  
         my ($self) = @_;  
   
         $self->{_total_compounds} = 0;  
         if (defined($self->compound_table())) {  
                 $self->{_total_compounds} = $self->compound_table()->size();  
         }  
         $self->{_gene_reactions} = 0;  
         $self->{_gapfilling_reactions} = 0;  
         $self->{_model_genes} = 0;  
         $self->{_total_reactions} = 0;  
         if (defined($self->reaction_table())) {  
                 $self->{_total_reactions} = $self->reaction_table()->size();  
                 my $tbl = $self->reaction_table();  
                 my $spontaneous = 0;  
                 for (my $i=0; $i < $tbl->size(); $i++) {  
                         my $row = $tbl->get_row($i);  
                         if (!defined($row->{"ASSOCIATED PEG"}->[0]) || $row->{"ASSOCIATED PEG"}->[0] !~ m/peg/) {  
                                 if ($row->{"ASSOCIATED PEG"}->[0] =~ m/SPONTANEOUS/) {  
                                         $spontaneous++;  
                                 } else {  
                                         $self->{_gapfilling_reactions}++;  
                                 }  
                         } else {  
                                 for (my $j=0; $j < @{$row->{"CONFIDENCE"}}; $j++) {  
                                         my @ecores = split(/;/,$row->{"CONFIDENCE"}->[$j]);  
                                         $self->{_model_genes} += @ecores;  
                                 }  
                         }  
                 }  
                 $self->{_gene_reactions} = $tbl->size() - $spontaneous - $self->{_gapfilling_reactions};  
         }  
 }  
   
819  =head3 version  =head3 version
820  Definition:  Definition:
821          string = FIGMODELmodel->version();          string = FIGMODELmodel->version();
# Line 856  Line 827 
827    
828          if (!defined($self->{_version})) {          if (!defined($self->{_version})) {
829                  if (!defined($self->{_selectedversion})) {                  if (!defined($self->{_selectedversion})) {
830                          if (defined($self->stats())) {                          $self->{_version} = "V".$self->{_data}->version().".".$self->{_data}->autocompleteVersion();
                                 $self->{_version} = "V".$self->stats()->{"Version"}->[0].".".$self->stats()->{"Gap fill version"}->[0];  
                         }  
831                  } else {                  } else {
832                          $self->{_version} = $self->{_selectedversion};                          $self->{_version} = $self->{_selectedversion};
833                  }                  }
# Line 889  Line 858 
858  =cut  =cut
859  sub modification_time {  sub modification_time {
860          my ($self) = @_;          my ($self) = @_;
861          if (!defined($self->{_modification_time})) {          return $self->{_data}->modificationDate();
                 my $stats = $self->stats();  
                 if (defined($stats)) {  
                         $self->{_modification_time} = 0;  
                         if (defined($stats->{"Build date"}->[0]) && $self->{_modification_time} < $stats->{"Build date"}->[0]) {  
                                 $self->{_modification_time} = $stats->{"Build date"}->[0];  
                         } elsif (defined($stats->{"Gap fill date"}->[0]) && $self->{_modification_time} < $stats->{"Gap fill date"}->[0]) {  
                                 $self->{_modification_time} = $stats->{"Gap fill date"}->[0];  
                         }  
                 } else {  
                         $self->{_modification_time} = $self->{_data}->{date}->[0];  
                 }  
         }  
         return $self->{_modification_time};  
862  }  }
863    
864  =head3 gene_reactions  =head3 gene_reactions
# Line 913  Line 869 
869  =cut  =cut
870  sub gene_reactions {  sub gene_reactions {
871          my ($self) = @_;          my ($self) = @_;
872            return ($self->{_data}->reactions() - $self->{_data}->autoCompleteReactions() - $self->{_data}->spontaneousReactions() - $self->{_data}->gapFillReactions());
         if (!defined($self->{_gene_reactions})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_gene_reactions} = $self->total_reactions() - $self->gapfilling_reactions() - $self->stats()->{'Spontaneous'}->[0] - $self->stats()->{'Growmatch reactions'}->[0] - $self->stats()->{'Biolog gap filling reactions'}->[0];  
                 }  
         }  
         return $self->{_gene_reactions};  
873  }  }
874    
875  =head3 total_compounds  =head3 total_compounds
# Line 932  Line 880 
880  =cut  =cut
881  sub total_compounds {  sub total_compounds {
882          my ($self) = @_;          my ($self) = @_;
883            return $self->{_data}->compounds();
         if (!defined($self->{_total_compounds})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_total_compounds} = $self->stats()->{'Metabolites'}->[0];  
                 }  
         }  
         return $self->{_total_compounds};  
884  }  }
885    
886  =head3 gapfilling_reactions  =head3 gapfilling_reactions
# Line 951  Line 891 
891  =cut  =cut
892  sub gapfilling_reactions {  sub gapfilling_reactions {
893          my ($self) = @_;          my ($self) = @_;
894            return ($self->{_data}->autoCompleteReactions()+$self->{_data}->gapFillReactions());
         if (!defined($self->{_gapfilling_reactions})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_gapfilling_reactions} = $self->stats()->{'Gap filling reactions'}->[0];  
                 }  
         }  
         return $self->{_gapfilling_reactions};  
895  }  }
896    
897  =head3 total_reactions  =head3 total_reactions
# Line 970  Line 902 
902  =cut  =cut
903  sub total_reactions {  sub total_reactions {
904          my ($self) = @_;          my ($self) = @_;
905            return $self->{_data}->reactions();
         if (!defined($self->{_total_reactions})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_total_reactions} = $self->stats()->{'Number of reactions'}->[0];  
                 }  
         }  
         return $self->{_total_reactions};  
906  }  }
907    
908  =head3 model_genes  =head3 model_genes
# Line 989  Line 913 
913  =cut  =cut
914  sub model_genes {  sub model_genes {
915          my ($self) = @_;          my ($self) = @_;
916            return $self->{_data}->associatedGenes();
         if (!defined($self->{_model_genes})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_model_genes} = $self->stats()->{'Genes with reactions'}->[0];  
                 }  
         }  
         return $self->{_model_genes};  
917  }  }
918    
919  =head3 class  =head3 class
# Line 1008  Line 924 
924  =cut  =cut
925  sub class {  sub class {
926          my ($self) = @_;          my ($self) = @_;
927            return $self->{_data}->cellwalltype();
         if (!defined($self->{_class})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->{_class} = "Other";  
                 } elsif (defined($self->stats())) {  
                         $self->{_class} = $self->stats()->{Class}->[0];  
                 }  
928          }          }
929          return $self->{_class};  
930    sub autocompleteMedia {
931            my ($self) = @_;
932            return $self->{_data}->autoCompleteMedia();
933  }  }
934    
935  =head3 taxonomy  =head3 taxonomy
# Line 1084  Line 997 
997                          if (defined($self->mgdata())) {                          if (defined($self->mgdata())) {
998                                  $self->{_genome_genes} = $self->mgdata()->genome_contig_count;                                  $self->{_genome_genes} = $self->mgdata()->genome_contig_count;
999                          }                          }
1000                  } elsif (defined($self->stats())) {                  } else {
1001                          $self->{_genome_genes} = $self->stats()->{'Total genes'}->[0];                          $self->{_genome_genes} = $self->figmodel()->get_genome_stats($self->genome())->{"TOTAL GENES"}->[0];
1002                  }                  }
1003          }          }
1004    
# Line 1126  Line 1039 
1039          return $self->figmodel()->success();          return $self->figmodel()->success();
1040  }  }
1041    
 =head3 save_obsolete_stats  
 Definition:  
         FIGMODELmodel->save_obsolete_stats();  
 Description:  
 =cut  
 sub save_obsolete_stats {  
         my ($self) = @_;  
   
         #checking if stats exists  
         my $stats = $self->stats();  
         if (defined($stats)) {  
                 $stats->{"Model ID"}->[0] = $self->id()."V".$stats->{"Version"}->[0].".".$stats->{"Gap fill version"}->[0];  
                 $self->figmodel()->database()->update_row("OBSOLETE MODEL STATS",$stats,"Model ID");  
                 $stats->{"Model ID"}->[0] = $self->id();  
         }  
 }  
   
1042  =head3 update_stats_for_gap_filling  =head3 update_stats_for_gap_filling
1043  Definition:  Definition:
1044          {string => [string]} = FIGMODELmodel->update_stats_for_gap_filling(int::gapfill time);          {string => [string]} = FIGMODELmodel->update_stats_for_gap_filling(int::gapfill time);
# Line 1150  Line 1046 
1046  =cut  =cut
1047  sub update_stats_for_gap_filling {  sub update_stats_for_gap_filling {
1048          my ($self,$gapfilltime) = @_;          my ($self,$gapfilltime) = @_;
1049            $self->{_data}->autoCompleteTime($gapfilltime);
1050          #preserving the stats for the now obselete model          $self->{_data}->autocompleteDate(time());
1051          $self->save_obsolete_stats();          $self->{_data}->modificationDate(time());
1052          my $stats = $self->update_model_stats(0);          my $version = $self->{_data}->autocompleteVersion();
1053          $stats->{"Gap filling time"}->[0] = $gapfilltime;          $self->{_data}->autocompleteVersion($version+1);
         $stats->{"Gap fill date"}->[0] = time();  
         if (!defined($stats->{"Gap fill version"}->[0])) {  
                 $stats->{"Gap fill version"}->[0] = 0;  
         }  
         $stats->{"Gap fill version"}->[0]++;  
   
         #Updating the stats stored in the table  
         $self->figmodel()->database()->update_row("MODEL STATS",$stats,"Model ID");  
         return $stats;  
1054  }  }
1055    
1056  =head3 update_stats_for_build  =head3 update_stats_for_build
# Line 1173  Line 1060 
1060  =cut  =cut
1061  sub update_stats_for_build {  sub update_stats_for_build {
1062          my ($self) = @_;          my ($self) = @_;
1063            $self->{_data}->builtDate(time());
1064          #preserving the stats for the now obselete model          $self->{_data}->modificationDate(time());
1065          $self->save_obsolete_stats();          my $version = $self->{_data}->version();
1066          my $stats = $self->update_model_stats(0);          $self->{_data}->version($version+1);
         $stats->{"Build date"}->[0] = time();  
         if (!defined($stats->{"Version"}->[0])) {  
                 $stats->{"Version"}->[0] = 0;  
         }  
         $stats->{"Version"}->[0]++;  
   
         #Updating the stats stored in the table  
         $self->figmodel()->database()->update_row("MODEL STATS",$stats,"Model ID");  
         return $stats;  
1067  }  }
1068    
1069  =head3 update_model_stats  =head3 update_model_stats
# Line 1204  Line 1082 
1082          }          }
1083          my $cpdtbl = $self->compound_table();          my $cpdtbl = $self->compound_table();
1084    
1085          #Creating empty status row          #Calculating all necessary stats
         my $CurrentStats = {"Genes with reactions" => [0],  
                                                  "Metabolites" => [$cpdtbl->size()],  
                                                  "Growmatch reactions" => [0],  
                                                  "Spontaneous" => [0],  
                                                  "Biolog gap filling reactions" => [0],  
                                                  "Number of reactions" => [$rxntbl->size()],  
                                                  "Transport reaction"=>[0],  
                                                  "Gap filling reactions" => [0],  
                                                  "Model ID" => [$self->id()],  
                                                  "Subsystem genes with reactions" => [0],  
                                                  "Nonsubsystem genes with reactions" => [0],  
                                                  Version => [0],  
                                                  "Gap fill version" => [0],  
                                                  Source => [$self->source()],  
                                                  "Genes with one reaction" => [0],  
                                                  "Genome ID" => [$self->genome()]};  
   
         my $genomestats = $self->figmodel()->get_genome_stats($self->genome());  
         if (defined($genomestats)) {  
                 $CurrentStats->{SOURCE}->[0] = $genomestats->{SOURCE}->[0];  
                 $CurrentStats->{"Organism name"}->[0] = $genomestats->{NAME}->[0];  
                 $CurrentStats->{"Total genes"}->[0] = $genomestats->{"TOTAL GENES"}->[0];  
                 $CurrentStats->{"Gram positive genes"}->[0] = $genomestats->{"GRAM POSITIVE GENES"}->[0];  
                 $CurrentStats->{"Gram negative genes"}->[0] = $genomestats->{"GRAM NEGATIVE GENES"}->[0];  
                 $CurrentStats->{"Class"}->[0] = $genomestats->{CLASS}->[0];  
                 $CurrentStats->{"Genes with functions"}->[0] = $genomestats->{"GENES WITH FUNCTIONS"}->[0];  
                 $CurrentStats->{"Subsystem genes"}->[0] = $genomestats->{"SUBSYSTEM GENES"}->[0];  
                 $CurrentStats->{"Nonsubsystem genes"}->[0] = $genomestats->{"NON SUBSYSTEM GENES"}->[0];  
                 if (defined($genomestats->{TAXONOMY})) {  
                         $CurrentStats->{"Taxonomy 0"}->[0] = $genomestats->{TAXONOMY}->[0];  
                         $CurrentStats->{"Taxonomy 1"}->[0] = $genomestats->{TAXONOMY}->[1];  
                         $CurrentStats->{"Taxonomy 2"}->[0] = $genomestats->{TAXONOMY}->[2];  
                         $CurrentStats->{"Taxonomy 3"}->[0] = $genomestats->{TAXONOMY}->[3];  
                         $CurrentStats->{"Taxonomy 4"}->[0] = $genomestats->{TAXONOMY}->[4];  
                         $CurrentStats->{"Taxonomy 5"}->[0] = $genomestats->{TAXONOMY}->[5];  
                 }  
         }  
   
         #Transfering build, version, and gap fill data from existing stats  
         if (defined($self->stats())) {  
                 $CurrentStats->{Version}->[0] = $self->stats()->{Version}->[0];  
                 $CurrentStats->{"Gap fill version"}->[0] = $self->stats()->{"Gap fill version"}->[0];  
                 $CurrentStats->{"Gap filling time"}->[0] = $self->stats()->{"Gap filling time"}->[0];  
                 $CurrentStats->{"Gap fill date"}->[0] = $self->stats()->{"Gap fill date"}->[0];  
                 $CurrentStats->{"Build date"}->[0] = $self->stats()->{"Build date"}->[0];  
         }  
   
1086          my %GeneHash;          my %GeneHash;
1087          my %NonpegHash;          my %NonpegHash;
1088          my %CompoundHash;          my %CompoundHash;
1089            my $spontaneousReactions = 0;
1090            my $gapFillReactions = 0;
1091            my $biologReactions = 0;
1092            my $transporters = 0;
1093            my $autoCompleteReactions = 0;
1094            my $associatedSubsystemGenes = 0;
1095          for (my $i=0; $i < $rxntbl->size(); $i++) {          for (my $i=0; $i < $rxntbl->size(); $i++) {
1096                  my $Row = $rxntbl->get_row($i);                  my $Row = $rxntbl->get_row($i);
1097                  if (defined($Row) && defined($Row->{"ASSOCIATED PEG"})) {                  if (defined($Row) && defined($Row->{"ASSOCIATED PEG"})) {
# Line 1262  Line 1099 
1099                          if (defined($ReactionRow->{"EQUATION"}->[0])) {                          if (defined($ReactionRow->{"EQUATION"}->[0])) {
1100                                  #Checking for extracellular metabolites which indicate that this is a transporter                                  #Checking for extracellular metabolites which indicate that this is a transporter
1101                                  if ($ReactionRow->{"EQUATION"}->[0] =~ m/\[e\]/) {                                  if ($ReactionRow->{"EQUATION"}->[0] =~ m/\[e\]/) {
1102                                          $CurrentStats->{"Transport reaction"}->[0]++;                                          $transporters++;
1103                                  }                                  }
1104                          }                          }
1105                          #Identifying spontaneous/biolog/gapfilling/gene associated reactions                          #Identifying spontaneous/biolog/gapfilling/gene associated reactions
1106                          if ($Row->{"ASSOCIATED PEG"}->[0] =~ m/BIOLOG/i) {                          if ($Row->{"ASSOCIATED PEG"}->[0] =~ m/BIOLOG/i) {
1107                                  $CurrentStats->{"Biolog gap filling reactions"}->[0]++;                                  $biologReactions++;
1108                            } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/GROW/i) {
1109                                    $gapFillReactions++;
1110                          } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/SPONTANEOUS/i) {                          } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/SPONTANEOUS/i) {
1111                                  $CurrentStats->{"Spontaneous"}->[0]++;                                  $spontaneousReactions++;
1112                          } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ || $Row->{"ASSOCIATED PEG"}->[0] =~ m/UNIVERSAL/i || $Row->{"ASSOCIATED PEG"}->[0] =~ m/UNKNOWN/i) {                          } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ || $Row->{"ASSOCIATED PEG"}->[0] =~ m/UNIVERSAL/i || $Row->{"ASSOCIATED PEG"}->[0] =~ m/UNKNOWN/i) {
1113                                  $CurrentStats->{"Gap filling reactions"}->[0]++;                                  $autoCompleteReactions++;
1114                          } else {                          } else {
1115                                  foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {                                  foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {
1116                                          $_ = $GeneSet;                                          $_ = $GeneSet;
# Line 1289  Line 1128 
1128          }          }
1129          my @genes = keys(%GeneHash);          my @genes = keys(%GeneHash);
1130          my @othergenes = keys(%NonpegHash);          my @othergenes = keys(%NonpegHash);
         $CurrentStats->{"Genes with reactions"}->[0] = @genes + @othergenes;  
1131    
1132          #Updating the stats stored in the table          #Setting the reaction count
1133          $self->figmodel()->database()->update_row("MODEL STATS",$CurrentStats,"Model ID");          $self->{_data}->reactions($rxntbl->size());
1134          $self->{_stats} = $CurrentStats;          #Setting the metabolite count
1135          return $CurrentStats;          $self->{_data}->compounds($rxntbl->size());
1136            #Setting the gene count
1137            my $geneCount = @genes + @othergenes;
1138            $self->{_data}->associatedGenes($geneCount);
1139            #Setting remaining stats
1140            $self->{_data}->spontaneousReactions($spontaneousReactions);
1141            $self->{_data}->gapFillReactions($gapFillReactions);
1142            $self->{_data}->biologReactions($biologReactions);
1143            $self->{_data}->transporters($transporters);
1144            $self->{_data}->autoCompleteReactions($autoCompleteReactions);
1145            $self->{_data}->associatedSubsystemGenes($associatedSubsystemGenes);
1146            #Setting the model class
1147            my $class = "";
1148            for (my $i=0; $i < @{$self->figmodel()->config("class list")}; $i++) {
1149                    if (defined($self->figmodel()->config($self->figmodel()->config("class list")->[$i]))) {
1150                            if (defined($self->figmodel()->config($self->figmodel()->config("class list")->[$i])->{$self->id()})) {
1151                                    $class = $self->figmodel()->config("class list")->[$i];
1152                                    last;
1153                            }
1154                            if ($class eq "" && defined($self->figmodel()->config($self->figmodel()->config("class list")->[$i])->{$self->genome()})) {
1155                                    $class = $self->figmodel()->config("class list")->[$i];
1156                            }
1157                    }
1158            }
1159            if ($class eq "") {
1160                    $class = $self->figmodel()->get_genome_stats($self->genome())->{CLASS}->[0];
1161            }
1162            if ($class eq "") {
1163                    $class = "unknown";
1164            }
1165            $self->{_data}->cellwalltype($class);
1166  }  }
1167    
1168  =head3 GapFillModel  =head3 GapFillModel
# Line 1314  Line 1182 
1182          my $UniqueFilename = $self->figmodel()->filename();          my $UniqueFilename = $self->figmodel()->filename();
1183          my $StartTime = time();          my $StartTime = time();
1184    
1185          #Archiving the existing model          #Reading original reaction table
1186          $self->ArchiveModel();          my $OriginalRxn = $self->reaction_table();
1187            #Clearing the table
1188            $self->reaction_table(1);
1189    
1190          #Removing any gapfilling reactions that may be currently present in the model          #Removing any gapfilling reactions that may be currently present in the model
1191          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
1192                  my $ModelTable = $self->reaction_table();                  my $ModelTable = $self->reaction_table();
1193                  for (my $i=0; $i < $ModelTable->size(); $i++) {                  for (my $i=0; $i < $ModelTable->size(); $i++) {
1194                          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/) {
1195                                  $ModelTable->delete_row($i);                                  $ModelTable->delete_row($i);
1196                                  $i--;                                  $i--;
1197                          }                          }
# Line 1345  Line 1215 
1215                          }                          }
1216                  }                  }
1217                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1218                    #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";
1219                  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));
1220                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1221          } else {          } else {
1222                    #print $self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef)."\n";
1223                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef));                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0]},"GapFill".$self->id().".log",undef));
1224          }          }
1225    
1226          #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
1227          my $SolutionData = $self->figmodel()->LoadProblemReport($UniqueFilename);          my $SolutionData = $self->figmodel()->LoadProblemReport($UniqueFilename);
1228    
1229          #Clearing the mfatoolkit output and log file          #Clearing the mfatoolkit output and log file
1230          $self->figmodel()->clearing_output($UniqueFilename,"GapFill".$self->id().".log");          $self->figmodel()->clearing_output($UniqueFilename,"GapFill".$self->id().".log");
1231          if (!defined($SolutionData) || $SolutionData->size() == 0) {          if (!defined($SolutionData) || $SolutionData->size() == 0) {
# Line 1388  Line 1261 
1261                                                  push(@{$ReactionList},$ID);                                                  push(@{$ReactionList},$ID);
1262                                          }                                          }
1263                                  }                                  }
1264                                  $self->figmodel()->IntegrateGrowMatchSolution($self->id(),undef,$ReactionList,$DirectionList,"GAP FILLING",0,1);                                  $self->figmodel()->IntegrateGrowMatchSolution($self->id(),undef,$ReactionList,$DirectionList,"AUTOCOMPLETION",0,1);
1265                          }                          }
1266                          last;                          last;
1267                  }                  }
1268          }          }
1269    
1270          #Updating model stats with gap filling results          #Updating model stats with gap filling results
1271          my $ElapsedTime = time() - $StartTime;          my $ElapsedTime = time() - $StartTime;
1272          $self->figmodel()->database()->ClearDBModel($self->id(),1);          $self->reaction_table(1);
1273            $self->calculate_model_changes($OriginalRxn,"AUTOCOMPLETION");
1274    
1275          #Determining why each gap filling reaction was added          #Determining why each gap filling reaction was added
1276          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);
1277          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
# Line 1415  Line 1291 
1291          return $self->success();          return $self->success();
1292  }  }
1293    
1294    =head3 calculate_model_changes
1295    Definition:
1296            FIGMODELmodel->calculate_model_changes(FIGMODELTable:original reaction table,string:modification cause);
1297    Description:
1298    
1299    =cut
1300    
1301    sub calculate_model_changes {
1302            my ($self,$originalReactions,$cause,$tbl,$version) = @_;
1303            my $modTime = time();
1304            if (!defined($version)) {
1305                    $version = $self->selected_version();
1306            }
1307            my $user = $self->figmodel()->user();
1308            #Getting the history table
1309            my $histTbl = $self->model_history();
1310            #Checking for differences
1311            if (!defined($tbl)) {
1312                    $tbl = $self->reaction_table();
1313            }
1314            for (my $i=0; $i < $tbl->size(); $i++) {
1315                    my $row = $tbl->get_row($i);
1316                    my $orgRow = $originalReactions->get_row_by_key($row->{LOAD}->[0],"LOAD");
1317                    if (!defined($orgRow)) {
1318                            $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => $row->{DIRECTIONALITY}, GeneChange => $row->{"ASSOCIATED PEG"}, Action => ["ADDED"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1319                    } else {
1320                            my $geneChanges;
1321                            my $directionChange;
1322                            if ($orgRow->{"DIRECTIONALITY"}->[0] ne $row->{"DIRECTIONALITY"}->[0]) {
1323                                    $directionChange = $orgRow->{"DIRECTIONALITY"}->[0]." to ".$row->{"DIRECTIONALITY"}->[0];
1324                            }
1325                            for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1326                                    my $match = 0;
1327                                    if (defined($orgRow->{"ASSOCIATED PEG"})) {
1328                                            for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1329                                                    if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1330                                                            $match = 1;
1331                                                    }
1332                                            }
1333                                    }
1334                                    if ($match == 0) {
1335                                            push(@{$geneChanges},"Added ".$row->{"ASSOCIATED PEG"}->[$j]);
1336                                    }
1337                            }
1338                            if (defined($orgRow->{"ASSOCIATED PEG"})) {
1339                                    for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1340                                            my $match = 0;
1341                                            if (defined($row->{"ASSOCIATED PEG"})) {
1342                                                    for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1343                                                            if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1344                                                                    $match = 1;
1345                                                            }
1346                                                    }
1347                                            }
1348                                            if ($match == 0) {
1349                                                    push(@{$geneChanges},"Removed ".$orgRow->{"ASSOCIATED PEG"}->[$k]);
1350                                            }
1351                                    }
1352                            }
1353                            if ((defined($directionChange) && length($directionChange) > 0) || defined($geneChanges) && @{$geneChanges} > 0) {
1354                                    $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => [$directionChange], GeneChange => $geneChanges, Action => ["CHANGE"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1355                            }
1356                    }
1357            }
1358            #Looking for removed reactions
1359            for (my $i=0; $i < $originalReactions->size(); $i++) {
1360                    my $row = $originalReactions->get_row($i);
1361                    my $orgRow = $tbl->get_row_by_key($row->{LOAD}->[0],"LOAD");
1362                    if (!defined($orgRow)) {
1363                            $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => $row->{DIRECTIONALITY}, GeneChange => $row->{"ASSOCIATED PEG"}, Action => ["REMOVED"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1364                    }
1365            }
1366            $histTbl->save();
1367    }
1368    
1369  =head3 GapGenModel  =head3 GapGenModel
1370  Definition:  Definition:
1371          FIGMODELmodel->GapGenModel();          FIGMODELmodel->GapGenModel();
# Line 1652  Line 1603 
1603  =cut  =cut
1604  sub status {  sub status {
1605          my ($self) = @_;          my ($self) = @_;
1606          return $self->{_data}->{status}->[0];          return $self->{_data}->status();
1607  }  }
1608    
1609  =head3 message  =head3 message
# Line 1663  Line 1614 
1614  =cut  =cut
1615  sub message {  sub message {
1616          my ($self) = @_;          my ($self) = @_;
1617          return $self->{_data}->{message}->[0];          return $self->{_data}->message();
1618  }  }
1619    
1620  =head3 set_status  =head3 set_status
# Line 1678  Line 1629 
1629  =cut  =cut
1630  sub set_status {  sub set_status {
1631          my ($self,$NewStatus,$Message) = @_;          my ($self,$NewStatus,$Message) = @_;
1632            $self->{_data}->status($NewStatus);
1633          #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");  
1634          return $self->config("SUCCESS")->[0];          return $self->config("SUCCESS")->[0];
1635  }  }
1636    
# Line 1721  Line 1669 
1669          }          }
1670          #Setting up needed variables          #Setting up needed variables
1671          my $OriginalModelTable = undef;          my $OriginalModelTable = undef;
1672          #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) {  
1673                  $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");  
1674                  return $self->fail();                  return $self->fail();
1675          }elsif ($Row->{status}->[0] == 1) {          }elsif ($self->status() == 1) {
1676                  $OriginalModelTable = $self->reaction_table();                  $OriginalModelTable = $self->reaction_table();
1677                  $self->ArchiveModel();                  $self->set_status(0,"Rebuilding preliminary reconstruction");
                 $Row->{status}->[0] = 0;  
                 $Row->{message}->[0] = "Rebuilding preliminary reconstruction";  
1678          } else {          } else {
1679                  $Row->{status}->[0] = 0;                  $self->set_status(0,"Preliminary reconstruction");
                 $Row->{message}->[0] = "Preliminary reconstruction";  
1680          }          }
         #Updating the status table  
         $self->figmodel()->database()->save_table($ModelTable);  
         $self->figmodel()->database()->UnlockDBTable("MODELS");  
1681          #Sorting GenomeData by gene location on the chromosome          #Sorting GenomeData by gene location on the chromosome
1682            my $ftrTbl = $self->figmodel()->database()->get_table("ROLERXNMAPPING");
1683          $FeatureTable->sort_rows("MIN LOCATION");          $FeatureTable->sort_rows("MIN LOCATION");
1684          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);
1685          my %LastGenePosition;          my %LastGenePosition;
# Line 1816  Line 1751 
1751                          }                          }
1752                  }                  }
1753          }          }
   
1754          #Creating nonadjacent complexes          #Creating nonadjacent complexes
1755          my @ReactionList = keys(%{$ReactionHash});          my @ReactionList = keys(%{$ReactionHash});
1756          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
# Line 1922  Line 1856 
1856                  $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"]});
1857          }          }
1858    
1859            #Getting feature rows for features that are lumped
1860            my @rows = $ftrTbl->get_rows_by_key("2","MASTER");
1861            for (my $i=0; $i < @rows; $i++) {
1862                    my $rxn = $rows[$i]->{REACTION}->[0];
1863                    my $role = $rows[$i]->{ROLE}->[0];
1864                    my @orgrows = $FeatureTable->get_rows_by_key($role,"ROLES");
1865                    my $genes;
1866                    for (my $j=0; $j < @orgrows; $j++) {
1867                            if ($orgrows[$j]->{ID}->[0] =~ m/(peg\.\d+)/) {
1868                                    push(@{$genes},$1);
1869                            }
1870                    }
1871                    if (defined($genes) && @{$genes} > 0) {
1872                            my $row = $NewModelTable->get_row_by_key($rxn,"LOAD");
1873                            my $newGeneAssociations;
1874                            for (my $k=0; $k < @{$genes}; $k++) {
1875                                    for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1876                                            my $peg = $genes->[$k];
1877                                            if ($row->{"ASSOCIATED PEG"}->[$j] !~ m/$peg/) {
1878                                                    push(@{$newGeneAssociations},$row->{"ASSOCIATED PEG"}->[$j]."+".$peg);
1879                                            }
1880                                    }
1881                            }
1882                            $row->{"ASSOCIATED PEG"} = $newGeneAssociations;
1883                    }
1884            }
1885    
1886          #Adding the spontaneous and universal reactions          #Adding the spontaneous and universal reactions
1887          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {
1888                  #Getting the thermodynamic reversibility from the database                  #Getting the thermodynamic reversibility from the database
# Line 1978  Line 1939 
1939                  }                  }
1940          }          }
1941    
1942            #If an original model exists, we copy the gap filling solution from that model
1943            if (defined($OriginalModelTable)) {
1944                    for (my $i=0; $i < $OriginalModelTable->size(); $i++) {
1945                            if ($OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ && $OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] ne "INITIAL GAP FILLING") {
1946                                    my $Row = $NewModelTable->get_row_by_key($OriginalModelTable->get_row($i)->{"LOAD"}->[0],"LOAD");
1947                                    if (!defined($Row)) {
1948                                            $NewModelTable->add_row($OriginalModelTable->get_row($i));
1949                                    }
1950                            }
1951                    }
1952            }
1953    
1954          #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
1955          if (defined($OriginalModelTable)) {          if (defined($OriginalModelTable)) {
1956                  my $PerfectMatch = 1;                  my $PerfectMatch = 1;
# Line 2037  Line 2010 
2010          #Saving the new model to file          #Saving the new model to file
2011          $self->set_status(1,"Preliminary reconstruction complete");          $self->set_status(1,"Preliminary reconstruction complete");
2012          $self->figmodel()->database()->save_table($NewModelTable);          $self->figmodel()->database()->save_table($NewModelTable);
2013          $self->{_reaction_data} = $NewModelTable;          $self->reaction_table(1);
         #Clearing the previous model from the cache  
         $self->figmodel()->database()->ClearDBModel($self->id(),1);  
2014          #Updating the model stats table          #Updating the model stats table
2015          $self->update_stats_for_build();          $self->update_stats_for_build();
2016          $self->PrintSBMLFile();          $self->PrintSBMLFile();
2017            if (defined($OriginalModelTable)) {
2018                    $self->calculate_model_changes($OriginalModelTable,"REBUILD");
2019            }
2020    
2021          #Adding model to gapfilling queue          #Adding model to gapfilling queue
2022          if (defined($RunGapFilling) && $RunGapFilling == 1) {          if (defined($RunGapFilling) && $RunGapFilling == 1) {
# Line 2176  Line 2150 
2150  sub ArchiveModel {  sub ArchiveModel {
2151          my ($self) = @_;          my ($self) = @_;
2152    
         #Making sure the model exists  
         if (!defined($self->stats())) {  
                 $self->figmodel()->error_message("FIGMODEL:ArchiveModel: Could not find specified ".$self->id()." in database!");  
                 return $self->fail();  
         }  
   
2153          #Checking that the model file exists          #Checking that the model file exists
2154          if (!(-e $self->filename())) {          if (!(-e $self->filename())) {
2155                  $self->figmodel()->error_message("FIGMODEL:ArchiveModel: Model file ".$self->filename()." not found!");                  $self->figmodel()->error_message("FIGMODEL:ArchiveModel: Model file ".$self->filename()." not found!");
# Line 2548  Line 2516 
2516          Calculating growth in the input media          Calculating growth in the input media
2517  =cut  =cut
2518  sub calculate_growth {  sub calculate_growth {
2519          my ($self,$Media) = @_;          my ($self,$Media,$outputDirectory,$InParameters,$saveLPFile) = @_;
2520            #Setting the Media
2521            if (!defined($Media) || length($Media) == 0) {
2522                    $Media = $self->autocompleteMedia();
2523            }
2524            #Setting parameters for the run
2525            my $DefaultParameters = $self->figmodel()->defaultParameters();
2526            if (defined($InParameters)) {
2527                    my @parameters = keys(%{$InParameters});
2528                    for (my $i=0; $i < @parameters; $i++) {
2529                            $DefaultParameters->{$parameters[$i]} = $InParameters->{$parameters[$i]};
2530                    }
2531            }
2532            $DefaultParameters->{"optimize metabolite production if objective is zero"} = 1;
2533            #Setting filenames
2534          my $UniqueFilename = $self->figmodel()->filename();          my $UniqueFilename = $self->figmodel()->filename();
2535          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)) {
2536                    $outputDirectory = $self->config("database message file directory")->[0];
2537            }
2538            my $fluxFilename = $outputDirectory."Fluxes-".$self->id()."-".$Media.".txt";
2539            my $cpdFluxFilename = $outputDirectory."CompoundFluxes-".$self->id()."-".$Media.".txt";
2540            #Running FBA
2541            #print $self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version())."\n";
2542            system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version()));
2543            #Saving LP file if requested
2544            if (defined($saveLPFile) && $saveLPFile == 1 && -e $self->figmodel()->{"MFAToolkit output directory"}->[0].$UniqueFilename."/CurrentProblem.lp") {
2545                    system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/CurrentProblem.lp ".$self->directory().$self->id().".lp");
2546            }
2547          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);
2548          my $Result;          my $Result;
2549          if (defined($ProblemReport)) {          if (defined($ProblemReport)) {
2550                  my $Row = $ProblemReport->get_row(0);                  my $Row = $ProblemReport->get_row(0);
2551                  if (defined($Row) && defined($Row->{"Objective"}->[0])) {                  if (defined($Row) && defined($Row->{"Objective"}->[0])) {
2552                          if ($Row->{"Objective"}->[0] < 0.00000001) {                          if ($Row->{"Objective"}->[0] < 0.00000001 || $Row->{"Objective"}->[0] == 1e7) {
2553                                  $Result = "NOGROWTH:".$Row->{"Individual metabolites with zero production"}->[0];                                  $Result = "NOGROWTH";
2554                                    if (defined($Row->{"Individual metabolites with zero production"}->[0]) && $Row->{"Individual metabolites with zero production"}->[0] =~ m/cpd\d\d\d\d\d/) {
2555                                            $Result .= ":".$Row->{"Individual metabolites with zero production"}->[0];
2556                                    }
2557                          } else {                          } else {
2558                                    if (-e $self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionReactionData0.txt") {
2559                                            system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionReactionData0.txt ".$fluxFilename);
2560                                            system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionCompoundData0.txt ".$cpdFluxFilename);
2561                                    }
2562                                  $Result = $Row->{"Objective"}->[0];                                  $Result = $Row->{"Objective"}->[0];
2563                          }                          }
2564                  }                  }
2565          }          }
2566            #Deleting files if necessary
2567            if ($self->figmodel()->config("preserve all log files")->[0] ne "yes") {
2568                    $self->figmodel()->cleardirectory($UniqueFilename);
2569                    unlink($self->figmodel()->config("database message file directory")->[0].$self->id()."-".$Media."-GrowthTest.txt");
2570            }
2571            #Returning result
2572          return $Result;          return $Result;
2573  }  }
2574    
# Line 3895  Line 3901 
3901          my($self) = @_;          my($self) = @_;
3902    
3903          #Opening the SBML file for printing          #Opening the SBML file for printing
3904          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";  
         }  
3905          if (!open (SBMLOUTPUT, ">$Filename")) {          if (!open (SBMLOUTPUT, ">$Filename")) {
3906                  return;                  return;
3907          }          }
3908    
3909          #Loading and parsing the model data          #Loading and parsing the model data
3910          my $ModelTable = $self->reaction_table();          my $mdlTbl = $self->reaction_table();
3911          if (!defined($ModelTable) || !defined($ModelTable->{"array"})) {          if (!defined($mdlTbl) || !defined($mdlTbl->{"array"})) {
3912                  print "Failed to load ".$self->id()."\n";                  return $self->fail();
                 return;  
3913          }          }
3914            my $rxnTbl = $self->figmodel()->database()->get_table("REACTIONS");
3915            my $bioTbl = $self->figmodel()->database()->get_table("BIOMASS");
3916            my $cpdTbl = $self->figmodel()->database()->get_table("COMPOUNDS");
3917            my $cmpTbl = $self->figmodel()->database()->get_table("COMPARTMENTS");
3918    
3919          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash
3920          my $ExchangeHash = {"cpd11416" => "c"};          my $ExchangeHash = {"cpd11416" => "c"};
   
3921          my %CompartmentsPresent;          my %CompartmentsPresent;
3922          $CompartmentsPresent{"c"} = 1;          $CompartmentsPresent{"c"} = 1;
3923          my %CompoundList;          my %CompoundList;
3924          my @ReactionList;          my @ReactionList;
3925          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          for (my $i=0; $i < $mdlTbl->size(); $i++) {
3926          for (my $i=0; $i < $ModelTable->size(); $i++) {                  my $Reaction = $mdlTbl->get_row($i)->{"LOAD"}->[0];
3927                  my $Reaction = $ModelTable->get_row($i)->{"LOAD"}->[0];                  my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
3928                  if (defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")) && defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0])) {                  if (!defined($row)) {
3929                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
3930                            if (!defined($row)) {
3931                                    next;
3932                            }
3933                    }
3934                    if (!defined($row->{"EQUATION"}->[0])) {
3935                            next;
3936                    }
3937                          push(@ReactionList,$Reaction);                          push(@ReactionList,$Reaction);
3938                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
3939                          my @MatchArray = /(cpd\d\d\d\d\d)/g;                          my @MatchArray = /(cpd\d\d\d\d\d)/g;
3940                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
3941                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;
3942                          }                          }
3943                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
3944                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;
3945                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
3946                                  if ($MatchArray[$j] =~ m/(cpd\d\d\d\d\d)\[(\D)\]/) {                                  if ($MatchArray[$j] =~ m/(cpd\d\d\d\d\d)\[(\D)\]/) {
# Line 3939  Line 3949 
3949                                  }                                  }
3950                          }                          }
3951                  }                  }
         }  
3952    
3953          #Printing header to SBML file          #Printing header to SBML file
3954          my $ModelName = $self->id();          my $ModelName = $self->id().$self->selected_version();
3955          $ModelName =~ s/\./_/;          $ModelName =~ s/\./_/;
3956          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";
3957      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";
3958      if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Organism name"}->[0])) {          if (defined($self->name())) {
3959          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";
3960      } else {      } else {
3961          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";
3962      }      }
3963    
3964          #Printing the unit data          #Printing the unit data
# Line 3966  Line 3975 
3975      #Printing compartments for SBML file      #Printing compartments for SBML file
3976      print SBMLOUTPUT '<listOfCompartments>'."\n";      print SBMLOUTPUT '<listOfCompartments>'."\n";
3977      foreach my $Compartment (keys(%CompartmentsPresent)) {      foreach my $Compartment (keys(%CompartmentsPresent)) {
3978          if (defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0])) {                  my $row = $cmpTbl->get_row_by_key($Compartment,"Abbreviation");
3979                  my @OutsideList = split(/\//,$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Outside"}->[0]);                  if (!defined($row) && !defined($row->{"Name"}->[0])) {
3980                            next;
3981                    }
3982                    my @OutsideList = split(/\//,$row->{"Outside"}->[0]);
3983                  my $Printed = 0;                  my $Printed = 0;
3984                  foreach my $Outside (@OutsideList) {                  foreach my $Outside (@OutsideList) {
3985                                  if (defined($CompartmentsPresent{$Outside}) && defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Outside}->[0]->{"Name"}->[0])) {                          if (defined($CompartmentsPresent{$Outside}) && defined($row->{"Name"}->[0])) {
3986                                  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";
3987                                  $Printed = 1;                                  $Printed = 1;
3988                                  last;                                  last;
3989                          }                          }
3990                  }                  }
3991                  if ($Printed eq 0) {                  if ($Printed eq 0) {
3992                          print SBMLOUTPUT '<compartment id="'.$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0].'"/>'."\n";                          print SBMLOUTPUT '<compartment id="'.$row->{"Name"}->[0].'"/>'."\n";
                         }  
3993          }          }
3994      }      }
3995      print SBMLOUTPUT '</listOfCompartments>'."\n";      print SBMLOUTPUT '</listOfCompartments>'."\n";
# Line 3986  Line 3997 
3997      #Printing the list of metabolites involved in the model      #Printing the list of metabolites involved in the model
3998          print SBMLOUTPUT '<listOfSpecies>'."\n";          print SBMLOUTPUT '<listOfSpecies>'."\n";
3999      foreach my $Compound (keys(%CompoundList)) {      foreach my $Compound (keys(%CompoundList)) {
4000                    my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4001                    if (!defined($row)) {
4002                            next;
4003                    }
4004          my $Name = $Compound;          my $Name = $Compound;
4005                  my $Formula = "";                  my $Formula = "";
4006                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  if (defined($row->{"FORMULA"}->[0])) {
4007                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                          $Formula = $row->{"FORMULA"}->[0];
4008                  }                  }
4009                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4010                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4011                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4012                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4013                  }                  }
4014                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4015                  my $Charge = 0;                  my $Charge = 0;
4016                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4017                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4018                  }                  }
4019                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {
4020                  if ($Compartment eq "e") {                  if ($Compartment eq "e") {
4021                          $ExchangeHash->{$Compound} = "e";                          $ExchangeHash->{$Compound} = "e";
4022                  }                  }
4023                  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");
4024                            print SBMLOUTPUT '<species id="'.$Compound.'_'.$Compartment.'" name="'.$Name.'" compartment="'.$cmprow->{"Name"}->[0].'" charge="'.$Charge.'" boundaryCondition="false"/>'."\n";
4025          }          }
4026      }      }
4027    
4028          #Printing the boundary species          #Printing the boundary species
4029          foreach my $Compound (keys(%{$ExchangeHash})) {          foreach my $Compound (keys(%{$ExchangeHash})) {
4030                  my $Name = $Compound;                  my $Name = $Compound;
4031                  my $Formula = "";                  my $Formula = "";
4032                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4033                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                  if (!defined($row)) {
4034                            next;
4035                    }
4036                    if (defined($row->{"FORMULA"}->[0])) {
4037                            $Formula = $row->{"FORMULA"}->[0];
4038                  }                  }
4039                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4040                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4041                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4042                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4043                  }                  }
4044                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4045                  my $Charge = 0;                  my $Charge = 0;
4046                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4047                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4048                  }                  }
4049                  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";
4050          }          }
# Line 4032  Line 4053 
4053      #Printing the list of reactions involved in the model      #Printing the list of reactions involved in the model
4054          my $ObjectiveCoef;          my $ObjectiveCoef;
4055      print SBMLOUTPUT '<listOfReactions>'."\n";      print SBMLOUTPUT '<listOfReactions>'."\n";
4056    
4057          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
4058          $ObjectiveCoef = "0.0";          $ObjectiveCoef = "0.0";
4059                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"EQUATION"}->[0])) {                  my $mdlrow = $mdlTbl->get_row_by_key($Reaction,"LOAD");
4060                    my $Reaction = $mdlrow->{"LOAD"}->[0];
4061                    my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4062                    if (!defined($row)) {
4063                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4064                            if (!defined($row)) {
4065                                    next;
4066                            }
4067                    }
4068                    if (!defined($row->{"EQUATION"}->[0])) {
4069                            next;
4070                    }
4071                  if ($Reaction =~ m/^bio/) {                  if ($Reaction =~ m/^bio/) {
4072                                  $ObjectiveCoef = "1.0";                                  $ObjectiveCoef = "1.0";
4073                          }                          }
4074                          my $LowerBound = -10000;                          my $LowerBound = -10000;
4075                  my $UpperBound = 10000;                  my $UpperBound = 10000;
4076                          my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateData($Reaction);                  my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateDataFromEquation($row->{"EQUATION"}->[0]);
4077                  my $Name = $Reaction;                  my $Name = $Reaction;
4078                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4079                          $Name = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4080                                  $Name =~ s/[<>;&]//g;                                  $Name =~ s/[<>;&]//g;
4081                  }                  }
4082                  my $Reversibility = "true";                  my $Reversibility = "true";
4083                  if (defined($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0])) {                  if (defined($mdlrow->{"DIRECTIONALITY"}->[0])) {
4084                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] ne "<=>") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] ne "<=>") {
4085                                  $LowerBound = 0;                                  $LowerBound = 0;
4086                                          $Reversibility = "false";                                          $Reversibility = "false";
4087                          }                          }
4088                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] eq "<=") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] eq "<=") {
4089                                  my $Temp = $Products;                                  my $Temp = $Products;
4090                                  $Products = $Reactants;                                  $Products = $Reactants;
4091                                  $Reactants = $Temp;                                  $Reactants = $Temp;
# Line 4061  Line 4094 
4094                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";
4095                          print SBMLOUTPUT "<notes>\n";                          print SBMLOUTPUT "<notes>\n";
4096                          my $ECData = "";                          my $ECData = "";
4097                          if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0])) {                  if (defined($row->{"ENZYME"}->[0])) {
4098                                  $ECData = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0];                          $ECData = $row->{"ENZYME"}->[0];
4099                          }                          }
4100                          my $SubsystemData = "";                          my $SubsystemData = "";
4101                          if (defined($ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0])) {                  if (defined($mdlrow->{"SUBSYSTEM"}->[0])) {
4102                                  $SubsystemData = $ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0];                          $SubsystemData = $mdlrow->{"SUBSYSTEM"}->[0];
4103                          }                          }
4104                          my $GeneAssociation = "";                          my $GeneAssociation = "";
4105                          my $ProteinAssociation = "";                          my $ProteinAssociation = "";
4106                          if (defined($ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0])) {                  if (defined($mdlrow->{"ASSOCIATED PEG"}->[0])) {
4107                                  if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} == 1 && $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {                          if (@{$mdlrow->{"ASSOCIATED PEG"}} == 1 && $mdlrow->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {
4108                                          $GeneAssociation = $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0];                                  $GeneAssociation = $mdlrow->{"ASSOCIATED PEG"}->[0];
4109                                  } else {                                  } else {
4110                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4111                                                  $GeneAssociation = "( ";                                                  $GeneAssociation = "( ";
4112                                          }                                          }
4113                                          for (my $i=0; $i < @{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}}; $i++) {                                  for (my $i=0; $i < @{$mdlrow->{"ASSOCIATED PEG"}}; $i++) {
4114                                                  if ($i > 0) {                                                  if ($i > 0) {
4115                                                          $GeneAssociation .= " )  or  ( ";                                                          $GeneAssociation .= " )  or  ( ";
4116                                                  }                                                  }
4117                                                  $GeneAssociation .= $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[$i];                                          $GeneAssociation .= $mdlrow->{"ASSOCIATED PEG"}->[$i];
4118                                          }                                          }
4119                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4120                                                  $GeneAssociation .= " )";                                                  $GeneAssociation .= " )";
4121                                          }                                          }
4122                                  }                                  }
# Line 4092  Line 4125 
4125                                          $GeneAssociation = "( ".$GeneAssociation." )";                                          $GeneAssociation = "( ".$GeneAssociation." )";
4126                                  }                                  }
4127                                  $ProteinAssociation = $GeneAssociation;                                  $ProteinAssociation = $GeneAssociation;
4128                                  if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Genome ID"}->[0])) {                          if (defined($self->genome())) {
4129                                          $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());
4130                                  }                                  }
4131                          }                          }
4132                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";
# Line 4124  Line 4157 
4157              print SBMLOUTPUT "</kineticLaw>\n";              print SBMLOUTPUT "</kineticLaw>\n";
4158                          print SBMLOUTPUT '</reaction>'."\n";                          print SBMLOUTPUT '</reaction>'."\n";
4159                  }                  }
         }  
4160    
4161          my @ExchangeList = keys(%{$ExchangeHash});          my @ExchangeList = keys(%{$ExchangeHash});
4162          foreach my $ExCompound (@ExchangeList) {          foreach my $ExCompound (@ExchangeList) {
4163                  my $ExCompoundName = $ExCompound;                  my $ExCompoundName = $ExCompound;
4164                  my $Row = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->get_row_by_key($ExCompound,"DATABASE");                  my $Row = $cpdTbl->get_row_by_key($ExCompound,"DATABASE");
4165                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {
4166                          $ExCompoundName = $Row->{"NAME"}->[0];                          $ExCompoundName = $Row->{"NAME"}->[0];
4167                          $ExCompoundName =~ s/[<>;&]//g;                          $ExCompoundName =~ s/[<>;&]//g;
# Line 4169  Line 4201 
4201          close(SBMLOUTPUT);          close(SBMLOUTPUT);
4202  }  }
4203    
4204    =head3 PrintModelSimpleReactionTable
4205    Definition:
4206            success()/fail() FIGMODELmodel->PrintModelSimpleReactionTable();
4207    Description:
4208            Prints the table of model data
4209    =cut
4210    sub PrintModelSimpleReactionTable {
4211            my ($self) = @_;
4212    
4213            my $rxntbl = $self->reaction_table();
4214            my $tbl = $self->create_table_prototype("ModelSimpleReactionTable");
4215            for (my $i=0; $i < $rxntbl->size(); $i++) {
4216                    my $row = $rxntbl->get_row($i);
4217                    $row->{DATABASE} = $row->{LOAD};
4218                    $tbl->add_row($row);
4219            }
4220            $tbl->save();
4221    }
4222    
4223  =head3 PrintModelLPFile  =head3 PrintModelLPFile
4224  Definition:  Definition:
4225          success()/fail() FIGMODELmodel->PrintModelLPFile();          success()/fail() FIGMODELmodel->PrintModelLPFile();
# Line 4365  Line 4416 
4416          my ($self,$feature) = @_;          my ($self,$feature) = @_;
4417    
4418          #First checking if the feature is in the model          #First checking if the feature is in the model
4419            my $featureGenome = $feature->{GENOME}->[0];
4420            if ($feature->{GENOME}->[0] =~ m/\>(\d+\.\d+)\</) {
4421                    $featureGenome = $1;
4422            }
4423            if ($featureGenome ne $self->genome()) {
4424                    return "Not in model";
4425            }
4426          my $data = $self->get_feature_data($feature->{ID}->[0]);          my $data = $self->get_feature_data($feature->{ID}->[0]);
4427          if (!defined($data)) {          if (!defined($data)) {
4428                  return "Not in model";                  return "Not in model";
# Line 4488  Line 4546 
4546          }          }
4547  }  }
4548    
4549    =pod
4550    
4551    =item * [string]:I<list of essential genes> = B<run_geneKO_slow> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4552    
4553    =cut
4554    
4555    sub run_geneKO_slow {
4556            my ($self,$media,$maxGrowth,$save) = @_;
4557            my $output;
4558            my $UniqueFilename = $self->figmodel()->filename();
4559            if (defined($maxGrowth) && $maxGrowth == 1) {
4560                    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()));
4561            } else {
4562                    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()));
4563            }
4564            if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt") {
4565                    print "Deletion study file not found!.\n";
4566                    return undef;
4567            }
4568            my $deltbl = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt",";","|",1,["Experiment"]);
4569            for (my $i=0; $i < $deltbl->size(); $i++) {
4570                    my $row = $deltbl->get_row($i);
4571                    if ($row->{"Insilico growth"}->[0] < 0.0000001) {
4572                            push(@{$output},$row->{Experiment}->[0]);
4573                    }
4574            }
4575            if (defined($output)) {
4576                    if (defined($save) && $save == 1) {
4577                            my $tbl = $self->load_model_table("EssentialGenes");
4578                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4579                            if (defined($row)) {
4580                                    $row->{GENES} = $output;
4581                            } else {
4582                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4583                            }
4584                            $tbl->save();
4585                    }
4586            }
4587            return $output;
4588    }
4589    
4590    =pod
4591    
4592    =item * [string]:I<list of minimal genes> = B<run_gene_minimization> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4593    
4594    =cut
4595    
4596    sub run_gene_minimization {
4597            my ($self,$media,$maxGrowth,$save) = @_;
4598            my $output;
4599    
4600            #Running the MFAToolkit
4601            my $UniqueFilename = $self->figmodel()->filename();
4602            if (defined($maxGrowth) && $maxGrowth == 1) {
4603                    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()));
4604            } else {
4605                    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()));
4606            }
4607            my $tbl = $self->figmodel()->LoadProblemReport($UniqueFilename);
4608            if (!defined($tbl)) {
4609                    return undef;
4610            }
4611            for (my $i=0; $i < $tbl->size(); $i++) {
4612                    my $row = $tbl->get_row($i);
4613                    if ($row->{Notes}->[0] =~ m/Recursive\sMILP\sGENE_USE\soptimization/) {
4614                            my @array = split(/\|/,$row->{Notes}->[0]);
4615                            my $solution = $array[0];
4616                            $_ = $solution;
4617                            my @OriginalArray = /(peg\.\d+)/g;
4618                            push(@{$output},@OriginalArray);
4619                            last;
4620                    }
4621            }
4622    
4623            if (defined($output)) {
4624                    if (defined($save) && $save == 1) {
4625                            my $tbl = $self->load_model_table("MinimalGenes");
4626                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4627                            if (defined($row)) {
4628                                    $row->{GENES} = $output;
4629                            } else {
4630                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4631                            }
4632                            $tbl->save();
4633                    }
4634            }
4635            return $output;
4636    }
4637    
4638    =pod
4639    
4640    =item * [string]:I<list of inactive genes> = B<identify_inactive_genes> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4641    
4642    =cut
4643    
4644    sub identify_inactive_genes {
4645            my ($self,$media,$maxGrowth,$save) = @_;
4646            my $output;
4647            #Running the MFAToolkit
4648            my $UniqueFilename = $self->figmodel()->filename();
4649            if (defined($maxGrowth) && $maxGrowth == 1) {
4650                    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()));
4651            } else {
4652                    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()));
4653            }
4654            #Reading in the output bounds file
4655            my $ReactionTB;
4656            if (-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt") {
4657                    $ReactionTB = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt",";","|",1,["DATABASE ID"]);
4658            }
4659            if (!defined($ReactionTB)) {
4660                    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";
4661                    return undef;
4662            }
4663            #Clearing output
4664            $self->figmodel()->clearing_output($UniqueFilename,"Classify-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");
4665            my $geneHash;
4666            my $activeGeneHash;
4667            for (my $i=0; $i < $ReactionTB->size(); $i++) {
4668                    my $Row = $ReactionTB->get_row($i);
4669                    if (defined($Row->{"Min FLUX"}) && defined($Row->{"Max FLUX"}) && defined($Row->{"DATABASE ID"}) && $Row->{"DATABASE ID"}->[0] =~ m/rxn\d\d\d\d\d/) {
4670                            my $data = $self->get_reaction_data($Row->{"DATABASE ID"}->[0]);
4671                            if (defined($data->{"ASSOCIATED PEG"})) {
4672                                    my $active = 0;
4673                                    if ($Row->{"Min FLUX"}->[0] > 0.00000001 || $Row->{"Max FLUX"}->[0] < -0.00000001 || ($Row->{"Max FLUX"}->[0]-$Row->{"Min FLUX"}->[0]) > 0.00000001) {
4674                                            $active = 1;
4675                                    }
4676                                    for (my $j=0; $j < @{$data->{"ASSOCIATED PEG"}}; $j++) {
4677                                            $_ = $data->{"ASSOCIATED PEG"}->[$j];
4678                                            my @OriginalArray = /(peg\.\d+)/g;
4679                                            for (my $k=0; $k < @OriginalArray; $k++) {
4680                                                    if ($active == 1) {
4681                                                            $activeGeneHash->{$OriginalArray[$k]} = 1;
4682                                                    }
4683                                                    $geneHash->{$OriginalArray[$k]} = 1;
4684                                            }
4685                                    }
4686                            }
4687                    }
4688            }
4689            my @allGenes = keys(%{$geneHash});
4690            for (my $i=0; $i < @allGenes; $i++) {
4691                    if (!defined($activeGeneHash->{$allGenes[$i]})) {
4692                            push(@{$output},$allGenes[$i]);
4693                    }
4694            }
4695            if (defined($output)) {
4696                    if (defined($save) && $save == 1) {
4697                            my $tbl = $self->load_model_table("InactiveGenes");
4698                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4699                            if (defined($row)) {
4700                                    $row->{GENES} = $output;
4701                            } else {
4702                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4703                            }
4704                            $tbl->save();
4705                    }
4706            }
4707            return $output;
4708    }
4709    
4710    sub ConvertVersionsToHistoryFile {
4711            my ($self) = @_;
4712            my $vone = 0;
4713            my $vtwo = 0;
4714            my $continue = 1;
4715            my $lastTable;
4716            my $currentTable;
4717            my $cause;
4718            my $lastChanged = 0;
4719            my $noHitCount = 0;
4720            while ($continue == 1) {
4721                    $cause = "NONE";
4722                    $currentTable = undef;
4723                    if (-e $self->directory().$self->id()."V".($vone+1).".".$vtwo.".txt") {
4724                            $noHitCount = 0;
4725                            $lastChanged = 0;
4726                            $vone = $vone+1;
4727                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4728                            $cause = "RECONSTRUCTION";
4729                    } elsif (-e $self->directory().$self->id()."V".$vone.".".($vtwo+1).".txt") {
4730                            $noHitCount = 0;
4731                            $lastChanged = 0;
4732                            $vtwo = $vtwo+1;
4733                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4734                            $cause = "AUTOCOMPLETION";
4735                    } elsif ($lastChanged == 0) {
4736                            $lastChanged = 1;
4737                            $vone = $vone+1;
4738                            $cause = "RECONSTRUCTION";
4739                    } elsif ($lastChanged == 1) {
4740                            $lastChanged = 2;
4741                            $vone = $vone-1;
4742                            $vtwo = $vtwo+1;
4743                            $cause = "AUTOCOMPLETION";
4744                    } elsif ($lastChanged == 2) {
4745                            $lastChanged = 0;
4746                            $vone = $vone+1;
4747                            $cause = "RECONSTRUCTION";
4748                    }
4749                    if (defined($currentTable)) {
4750                            if (defined($lastTable)) {
4751                                    print $cause."\t".$self->directory().$self->id()."V".$vone.".".$vtwo.".txt\n";
4752                                    $self->calculate_model_changes($lastTable,$cause,$currentTable,"V".$vone.".".$vtwo);
4753                            }
4754                            $lastTable = $currentTable;
4755                    } else {
4756                            $noHitCount++;
4757                            if ($noHitCount >= 40) {
4758                                    last;
4759                            }
4760                    }
4761            }
4762    }
4763    
4764  1;  1;

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.20

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3