[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.17, Fri May 28 15:26:48 2010 UTC revision 1.21, Sat Jul 10 22:43:52 2010 UTC
# Line 13  Line 13 
13          This is the constructor for the FIGMODELmodel object.          This is the constructor for the FIGMODELmodel object.
14  =cut  =cut
15  sub new {  sub new {
16          my ($class,$figmodel,$id) = @_;          my ($class,$figmodel,$id,$metagenome) = @_;
   
17          #Error checking first          #Error checking first
18          if (!defined($figmodel)) {          if (!defined($figmodel)) {
19                  print STDERR "FIGMODELmodel->new(undef,".$id."):figmodel must be defined to create a model object!\n";                  print STDERR "FIGMODELmodel->new(undef,".$id."):figmodel must be defined to create a model object!\n";
# Line 26  Line 25 
25                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,undef):id must be defined to create a model object");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,undef):id must be defined to create a model object");
26                  return undef;                  return undef;
27          }          }
   
28          #Checking that the id exists          #Checking that the id exists
29            if (!defined($metagenome) || $metagenome != 1) {
30          my $modelHandle = $self->figmodel()->database()->get_object_manager("model");          my $modelHandle = $self->figmodel()->database()->get_object_manager("model");
31          if (!defined($modelHandle)) {                  if (defined($modelHandle)) {
                 $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not load MODELS table. Check database!");  
                 return undef;  
         }  
   
32          #If the id is a number, we get the model row by index          #If the id is a number, we get the model row by index
33          if ($id =~ m/^\d+$/) {          if ($id =~ m/^\d+$/) {
34                  my $objects = $modelHandle->get_objects();                  my $objects = $modelHandle->get_objects();
35                                    if (defined($objects->[$id])) {
36                  $self->{_data} = $objects->[$id];                  $self->{_data} = $objects->[$id];
37                  $self->figmodel()->{_models}->{$id} = $self;                  $self->figmodel()->{_models}->{$id} = $self;
38                                    }
39          } else {          } else {
40                  my $objects = $modelHandle->get_objects({id => $id});                  my $objects = $modelHandle->get_objects({id => $id});
41                  if (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {                                  if (defined($objects->[0])) {
42                                            $self->{_data} = $objects->[0];
43                                    } elsif (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {
44                          $objects = $modelHandle->get_objects({id => $1});                          $objects = $modelHandle->get_objects({id => $1});
45                          if (!defined($objects->[0])) {                                          if (defined($objects->[0])) {
                                 $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");  
                                 return undef;  
                         }  
46                          $self->{_selectedversion} = $2;                          $self->{_selectedversion} = $2;
47                  } elsif (!defined($objects->[0])) {                                                  $self->{_data} = $objects->[0];
48                          $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");                                          }
49                          return undef;                                  }
50                  }                  }
51                    }
52                    if (defined($self->{_data})) {
53                            $self->{_modeltype} = "genome";
54                    }
55            }
56            if (!defined($self->{_data})) {
57                    my $modelHandle = $self->figmodel()->database()->get_object_manager("mgmodel");
58                    if (defined($modelHandle)) {
59                            #If the id is a number, we get the model row by index
60                            if ($id =~ m/^\d+$/) {
61                                    my $objects = $modelHandle->get_objects();
62                                    if (defined($objects->[$id])) {
63                                            $self->{_data} = $objects->[$id];
64                                            $self->figmodel()->{_models}->{"MG".$id} = $self;
65                                    }
66                            } else {
67                                    my $objects = $modelHandle->get_objects({id => $id});
68                                    if (defined($objects->[0])) {
69                  $self->{_data} = $objects->[0];                  $self->{_data} = $objects->[0];
70                                    } elsif (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {
71                                            $objects = $modelHandle->get_objects({id => $1});
72                                            if (defined($objects->[0])) {
73                                                    $self->{_selectedversion} = $2;
74                                                    $self->{_data} = $objects->[0];
75                                            }
76                                    }
77                            }
78                    }
79                    if (defined($self->{_data})) {
80                            $self->{_modeltype} = "metagenome";
81                    }
82          }          }
83          if (!defined($self->{_data})) {          if (!defined($self->{_data})) {
84                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find specified id in database!");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
85                  return undef;                  return undef;
86          }          }
87          $self->figmodel()->{_models}->{$self->id()} = $self;          $self->figmodel()->{_models}->{$self->id()} = $self;
   
88          return $self;          return $self;
89  }  }
90    
# Line 184  Line 209 
209          return $self->{_data}->id();          return $self->{_data}->id();
210  }  }
211    
212    =head3 get_model_type
213    Definition:
214            string = FIGMODELmodel->get_model_type();
215    Description:
216            Returns the type of the model
217    =cut
218    sub get_model_type {
219            my ($self) = @_;
220            return $self->{_modeltype};
221    }
222    
223  =head3 owner  =head3 owner
224  Definition:  Definition:
225          string = FIGMODELmodel->owner();          string = FIGMODELmodel->owner();
# Line 352  Line 388 
388  =cut  =cut
389  sub get_reaction_data {  sub get_reaction_data {
390          my ($self,$reaction) = @_;          my ($self,$reaction) = @_;
   
391          if (!defined($self->reaction_table())) {          if (!defined($self->reaction_table())) {
392                  return undef;                  return undef;
393          }          }
394          if ($reaction =~ m/^\d+$/) {          if ($reaction =~ m/^\d+$/) {
395                  $self->reaction_table()->get_row($reaction);                  return $self->reaction_table()->get_row($reaction);
396          }          }
397          return $self->reaction_table()->get_row_by_key($reaction,"LOAD");          return $self->reaction_table()->get_row_by_key($reaction,"LOAD");
398  }  }
# Line 387  Line 422 
422  =cut  =cut
423  sub load_model_table {  sub load_model_table {
424          my ($self,$name,$refresh) = @_;          my ($self,$name,$refresh) = @_;
425          if (!defined($refresh)) {          if (defined($refresh) && $refresh == 1) {
                 $refresh = 1;  
         }  
         if ($refresh == 1) {  
426                  delete $self->{"_".$name};                  delete $self->{"_".$name};
427          }          }
428          if (!defined($self->{"_".$name})) {          if (!defined($self->{"_".$name})) {
429                  my $tbldef = $self->figmodel()->config("$name");                  my $tbldef = $self->figmodel()->config($name);
430                  if (!defined($tbldef)) {                  if (!defined($tbldef)) {
431                          return undef;                          return undef;
432                  }                  }
433                  my $filename = $self->directory().$name."-".$self->id().$self->selected_version().".tbl";                  my $itemDelim = "|";
434                  $self->{"_".$name} = $self->figmodel()->database()->load_table($filename,"\t","|",$tbldef->{headingline}->[0],$tbldef->{hashcolumns});                  if (defined($tbldef->{itemdelimiter}->[0])) {
435                  if (!defined($self->{"_".$name})) {                          $itemDelim = $tbldef->{itemdelimiter}->[0];
436                            if ($itemDelim eq "SC") {
437                                    $itemDelim = ";";
438                            }
439                    }
440                    my $columnDelim = "\t";
441                    if (defined($tbldef->{columndelimiter}->[0])) {
442                            $columnDelim = $tbldef->{columndelimiter}->[0];
443                            if ($columnDelim eq "SC") {
444                                    $columnDelim = ";";
445                            }
446                    }
447                    my $suffix = ".tbl";
448                    if (defined($tbldef->{filename_suffix}->[0])) {
449                            $suffix = $tbldef->{filename_suffix}->[0];
450                    }
451                    my $filename = $self->directory().$name."-".$self->id().$self->selected_version().$suffix;
452                    if (defined($tbldef->{filename_prefix}->[0])) {
453                            if ($tbldef->{filename_prefix}->[0] eq "NONE") {
454                                    $filename = $self->directory().$self->id().$self->selected_version().$suffix;
455                            } else {
456                                    $filename = $self->directory().$tbldef->{filename_prefix}->[0]."-".$self->id().$self->selected_version().$suffix;
457                            }
458                    }
459                    if (-e $filename) {
460                            $self->{"_".$name} = $self->figmodel()->database()->load_table($filename,$columnDelim,$itemDelim,$tbldef->{headingline}->[0],$tbldef->{hashcolumns});
461                    } else {
462                          if (defined($tbldef->{prefix})) {                          if (defined($tbldef->{prefix})) {
463                                  $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"));
464                          } else {                          } else {
465                                  $self->{"_".$name} = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},"\t","|");                                  $self->{"_".$name} = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},$columnDelim,$itemDelim);
466                          }                          }
467                  }                  }
468          }          }
# Line 421  Line 479 
479  =cut  =cut
480  sub create_table_prototype {  sub create_table_prototype {
481          my ($self,$TableName) = @_;          my ($self,$TableName) = @_;
   
482          #Checking if the table definition exists in the FIGMODELconfig file          #Checking if the table definition exists in the FIGMODELconfig file
483          if (!defined($self->figmodel()->config($TableName))) {          my $tbldef = $self->figmodel()->config($TableName);
484            if (!defined($tbldef)) {
485                  $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:Definition not found for ".$TableName);                  $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:Definition not found for ".$TableName);
486                  return undef;                  return undef;
487          }          }
488          #Checking that this is a database table          #Checking that this is a database table
489          if (!defined($self->config($TableName)->{tabletype}) || $self->config($TableName)->{tabletype}->[0] ne "ModelTable") {          if (!defined($tbldef->{tabletype}) || $tbldef->{tabletype}->[0] ne "ModelTable") {
490                  $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:".$TableName." is not a model table!");                  $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:".$TableName." is not a model table!");
491                  return undef;                  return undef;
492          }          }
493          if (!defined($self->config($TableName)->{delimiter})) {          #Setting default values for table parameters
494                  $self->config($TableName)->{delimiter}->[0] = ";";          my $prefix;
495            if (defined($tbldef->{prefix})) {
496                    $prefix = join("\n",@{$self->config($TableName)->{prefix}})."\n";
497            }
498            my $itemDelim = "|";
499            if (defined($tbldef->{itemdelimiter}->[0])) {
500                    $itemDelim = $tbldef->{itemdelimiter}->[0];
501                    if ($itemDelim eq "SC") {
502                            $itemDelim = ";";
503          }          }
         if (!defined($self->config($TableName)->{itemdelimiter})) {  
                 $self->config($TableName)->{itemdelimiter}->[0] = "|";  
504          }          }
505          my $prefix;          my $columnDelim = "\t";
506          if (defined($self->config($TableName)->{prefix})) {          if (defined($tbldef->{columndelimiter}->[0])) {
507                  $prefix = join("\n",@{$self->config($TableName)->{prefix}});                  $columnDelim = $tbldef->{columndelimiter}->[0];
508                    if ($columnDelim eq "SC") {
509                            $columnDelim = ";";
510                    }
511          }          }
512          my $tbl = FIGMODELTable->new($self->config($TableName)->{columns},$self->directory().$self->config($TableName)->{filename_prefix}->[0]."-".$self->id().$self->selected_version().".txt",$self->config($TableName)->{hashcolumns},$self->config($TableName)->{delimiter}->[0],$self->config($TableName)->{itemdelimiter}->[0],$prefix);          my $suffix = ".tbl";
513            if (defined($tbldef->{filename_suffix}->[0])) {
514                    $suffix = $tbldef->{filename_suffix}->[0];
515            }
516            my $filename = $self->directory().$TableName."-".$self->id().$self->selected_version().$suffix;
517            if (defined($tbldef->{filename_prefix}->[0])) {
518                    if ($tbldef->{filename_prefix}->[0] eq "NONE") {
519                            $filename = $self->directory().$self->id().$self->selected_version().$suffix;
520                    } else {
521                            $filename = $self->directory().$tbldef->{filename_prefix}->[0]."-".$self->id().$self->selected_version().$suffix;
522                    }
523            }
524            #Creating the table prototype
525            my $tbl = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},$columnDelim,$itemDelim,$prefix);
526          return $tbl;          return $tbl;
527  }  }
528    
# Line 467  Line 547 
547          Returns FIGMODELTable with the reaction list for the model          Returns FIGMODELTable with the reaction list for the model
548  =cut  =cut
549  sub reaction_table {  sub reaction_table {
550          my ($self) = @_;          my ($self,$clear) = @_;
551            if (defined($self->{_reaction_table})) {
552          if (!defined($self->{_reaction_data})) {                  return $self->{_reaction_table};
553                  $self->{_reaction_data} = $self->figmodel()->database()->GetDBModel($self->id());          }
554            $self->{_reaction_table} = $self->load_model_table("ModelReactions",$clear);
555                  my $classTbl = $self->reaction_class_table();                  my $classTbl = $self->reaction_class_table();
556            if (defined($classTbl)) {
557                  for (my $i=0; $i < $classTbl->size(); $i++) {                  for (my $i=0; $i < $classTbl->size(); $i++) {
558                          my $row = $classTbl->get_row($i);                          my $row = $classTbl->get_row($i);
559                          my $rxnRow = $self->{_reaction_data}->get_row_by_key($row->{"REACTION"}->[0],"LOAD");                          if (defined($row->{REACTION})) {
560                                    my $rxnRow = $self->{_reaction_table}->get_row_by_key($row->{"REACTION"}->[0],"LOAD");
561                                    if (defined($row->{MEDIA})) {
562                          for (my $j=0; $j < @{$row->{MEDIA}};$j++) {                          for (my $j=0; $j < @{$row->{MEDIA}};$j++) {
563                                  my $class = "Active <=>";                                  my $class = "Active <=>";
564                                  if ($row->{CLASS}->[$j] eq "Positive") {                                  if ($row->{CLASS}->[$j] eq "Positive") {
# Line 496  Line 580 
580                          }                          }
581                  }                  }
582          }          }
583                    }
584            }
585            return $self->{_reaction_table};
586    }
587    
588          return $self->{_reaction_data};  =head3 essentials_table
589    Definition:
590            FIGMODELTable = FIGMODELmodel->essentials_table();
591    Description:
592            Returns FIGMODELTable with the essential genes for the model
593    =cut
594    sub essentials_table {
595            my ($self,$clear) = @_;
596            my $tbl = $self->load_model_table("ModelEssentialGenes",$clear);
597            return $tbl;
598    }
599    
600    =head3 model_history
601    Definition:
602            FIGMODELTable = FIGMODELmodel->model_history();
603    Description:
604            Returns FIGMODELTable with the history of model changes
605    =cut
606    sub model_history {
607            my ($self,$clear) = @_;
608            return $self->load_model_table("ModelHistory",$clear);
609  }  }
610    
611  =head3 feature_table  =head3 feature_table
# Line 551  Line 659 
659                  }                  }
660              }              }
661              #Loading predictions              #Loading predictions
662              my @files = glob($self->directory()."EssentialGenes-".$self->id()."-*");                  my $esstbl = $self->essentials_table();
             foreach my $file (@files) {  
                 if ($file =~ m/\-([^\-]+)\.tbl/) {  
                         my $media = $1;  
                         my $list = $self->figmodel()->database()->load_single_column_file($file,"");  
                         my $hash;  
                         foreach my $gene (@{$list}) {  
                                 $hash->{$gene} = 1;  
                         }  
663                          for (my $i=0; $i < $self->{_feature_data}->size(); $i++) {                          for (my $i=0; $i < $self->{_feature_data}->size(); $i++) {
664                                  my $Row = $self->{_feature_data}->get_row($i);                                  my $Row = $self->{_feature_data}->get_row($i);
665                                  if ($Row->{ID}->[0] =~ m/(peg\.\d+)/) {                                  if ($Row->{ID}->[0] =~ m/(peg\.\d+)/) {
666                                          my $gene = $1;                                          my $gene = $1;
667                                          if (defined($hash->{$gene})) {                                  my @rows = $esstbl->get_rows_by_key($gene,"ESSENTIAL GENES");
668                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$media.":essential");                                  my $mediahash;
669                                    for (my $j=0; $j < $esstbl->size(); $j++) {
670                                            $mediahash->{$esstbl->get_row($j)->{MEDIA}->[0]} = 0;
671                                    }
672                                    for (my $j=0; $j < @rows; $j++) {
673                                            $mediahash->{$rows[$j]->{MEDIA}->[0]} = 1;
674                                    }
675                                    my @mediaList = keys(%{$mediahash});
676                                    for (my $j=0; $j < @mediaList; $j++) {
677                                            if ($mediahash->{$mediaList[$j]} == 1) {
678                                                    push(@{$Row->{$self->id()."PREDICTIONS"}},$mediaList[$j].":essential");
679                                          } else {                                          } else {
680                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$media.":nonessential");                                                  push(@{$Row->{$self->id()."PREDICTIONS"}},$mediaList[$j].":nonessential");
                                         }  
681                                  }                                  }
682                          }                          }
683                  }                  }
# Line 584  Line 693 
693          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
694  =cut  =cut
695  sub reaction_class_table {  sub reaction_class_table {
696          my ($self) = @_;          my ($self,$clear) = @_;
697            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};  
698  }  }
699    
700  =head3 compound_class_table  =head3 compound_class_table
# Line 604  Line 704 
704          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
705  =cut  =cut
706  sub compound_class_table {  sub compound_class_table {
707          my ($self) = @_;          my ($self,$clear) = @_;
708            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};  
709  }  }
710    
711  =head3 get_essential_genes  =head3 get_essential_genes
# Line 625  Line 716 
716  =cut  =cut
717  sub get_essential_genes {  sub get_essential_genes {
718          my ($self,$media) = @_;          my ($self,$media) = @_;
719            my $tbl = $self->essentials_table();
720          if (!defined($media)) {          my $row = $tbl->get_row_by_key($media,"MEDIA");
721                  $media = "Complete";          if (defined($row)) {
722                    return $row->{"ESSENTIAL GENES"};
723          }          }
724          if (!defined($self->{_essential_genes}->{$media})) {          return undef;
                 $self->{_essential_genes}->{$media} = undef;  
                 if (-e $self->directory()."EssentialGenes-".$self->id().$self->selected_version()."-".$media.".tbl") {  
                         $self->{_essential_genes}->{$media} = $self->figmodel()->database()->load_single_column_file($self->directory()."EssentialGenes-".$self->id().$self->selected_version()."-".$media.".tbl","");  
                 }  
         }  
   
         return $self->{_essential_genes}->{$media};  
725  }  }
726    
727  =head3 compound_table  =head3 compound_table
# Line 649  Line 734 
734          my ($self) = @_;          my ($self) = @_;
735    
736          if (!defined($self->{_compound_table})) {          if (!defined($self->{_compound_table})) {
737                  $self->{_compound_table} = $self->figmodel()->database()->GetDBModelCompounds($self->id());                  $self->{_compound_table} = $self->create_table_prototype("ModelCompounds");
738                    #Loading the reactions
739                    my $ReactionTable = $self->figmodel()->database()->get_table("REACTIONS");
740                    my $BiomassTable = $self->figmodel()->database()->get_table("BIOMASS");
741                    #Loading the model
742                    my $ModelTable = $self->reaction_table();
743                    #Checking that the tables were loaded
744                    if (!defined($ModelTable) || !defined($ReactionTable)) {
745                            return undef;
746                    }
747                    #Finding the biomass reaction
748                    for (my $i=0; $i < $ModelTable->size(); $i++) {
749                            my $ID = $ModelTable->get_row($i)->{"LOAD"}->[0];
750                            my $Row = $ReactionTable->get_row_by_key($ID,"DATABASE");
751                            my $IsBiomass = 0;
752                            if (!defined($Row)) {
753                                    $Row = $BiomassTable->get_row_by_key($ID,"DATABASE");
754                                    $IsBiomass = 1;
755                            }
756                            if (defined($Row->{"EQUATION"}->[0])) {
757                                    $_ = $Row->{"EQUATION"}->[0];
758                                    my @OriginalArray = /(cpd\d\d\d\d\d[\[\w]*)/g;
759                                    foreach my $Compound (@OriginalArray) {
760                                            my $ID = substr($Compound,0,8);
761                                            my $NewRow = $self->{_compound_table}->get_row_by_key($ID,"DATABASE",1);
762                                            if ($IsBiomass == 1) {
763                                                    $self->{_compound_table}->add_data($NewRow,"BIOMASS",$Row->{"DATABASE"}->[0],1);
764                                            }
765                                            if (length($Compound) > 8) {
766                                                    #print $Compound."\t".$Row->{"EQUATION"}->[0]."\t".$Row->{"DATABASE"}->[0]."\n";
767                                                    my $Compartment = substr($Compound,8,1);
768                                                    $self->{_compound_table}->add_data($NewRow,"COMPARTMENTS",$Compartment,1);
769                                                    $self->{_compound_table}->add_data($NewRow,"TRANSPORTERS",$Row->{"DATABASE"}->[0],1);
770                                            }
771                                    }
772                            }
773                    }
774          }          }
775    
776          return $self->{_compound_table};          return $self->{_compound_table};
# Line 769  Line 890 
890                  }                  }
891                  my $source = $self->source();                  my $source = $self->source();
892                  if ($source =~ /^MGRAST/) {                  if ($source =~ /^MGRAST/) {
893                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";                          $self->{_directory} = $self->figmodel()->config("mgrast model directory")->[0].$userdirectory.$self->genome()."/";
894                  } elsif ($source =~ /^RAST/) {                  } elsif ($source =~ /^RAST/) {
895                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";                          $self->{_directory} = $self->figmodel()->config("organism directory")->[0].$userdirectory.$self->genome()."/";
896                  } elsif ($source =~ /^SEED/) {                  } elsif ($source =~ /^SEED/) {
# Line 909  Line 1030 
1030          return $self->{_data}->cellwalltype();          return $self->{_data}->cellwalltype();
1031  }  }
1032    
1033    sub autocompleteMedia {
1034            my ($self) = @_;
1035            return $self->{_data}->autoCompleteMedia();
1036    }
1037    
1038  =head3 taxonomy  =head3 taxonomy
1039  Definition:  Definition:
1040          string = FIGMODELmodel->taxonomy();          string = FIGMODELmodel->taxonomy();
# Line 992  Line 1118 
1118    
1119          #Assuming complete media if none is provided          #Assuming complete media if none is provided
1120          if (!defined($Media)) {          if (!defined($Media)) {
1121                  $Media = "Complete";                  $Media = $self->autocompleteMedia();
1122          }          }
1123    
1124          #Predicting essentiality          #Predicting essentiality
1125          my $result = $self->figmodel()->RunFBASimulation($self->id(),"SINGLEKO",undef,undef,[$self->id()],[$Media]);          my $result = $self->figmodel()->RunFBASimulation($self->id(),"SINGLEKO",undef,undef,[$self->id()],[$Media]);
1126          #Checking that the table is defined and the output file exists          #Checking that the table is defined and the output file exists
1127          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {          if (defined($result) && defined($result->get_row(0)->{"ESSENTIALGENES"})) {
1128                  $self->figmodel()->database()->print_array_to_file($self->directory()."EssentialGenes-".$self->id()."-".$Media.".tbl",[join("\n",@{$result->get_row(0)->{"ESSENTIALGENES"}})]);                  my $tbl = $self->essentials_table();
1129                    my $row = $tbl->get_row_by_key($Media,"MEDIA",1);
1130                    $row->{"ESSENTIAL GENES"} = $result->get_row(0)->{"ESSENTIALGENES"};
1131                    $tbl->save();
1132          } else {          } else {
1133                  $self->figmodel()->error_message("FIGMODELmodel:run_default_model_predictions:could not identify essential reactions for model ".$self->id().$self->selected_version().".");                  $self->figmodel()->error_message("FIGMODELmodel:run_default_model_predictions:could not identify essential reactions for model ".$self->id().$self->selected_version().".");
1134                  return $self->figmodel()->fail();                  return $self->figmodel()->fail();
# Line 1109  Line 1238 
1238          #Setting the reaction count          #Setting the reaction count
1239          $self->{_data}->reactions($rxntbl->size());          $self->{_data}->reactions($rxntbl->size());
1240          #Setting the metabolite count          #Setting the metabolite count
1241          $self->{_data}->compounds($rxntbl->size());          $self->{_data}->compounds($cpdtbl->size());
1242          #Setting the gene count          #Setting the gene count
1243          my $geneCount = @genes + @othergenes;          my $geneCount = @genes + @othergenes;
1244          $self->{_data}->associatedGenes($geneCount);          $self->{_data}->associatedGenes($geneCount);
# Line 1159  Line 1288 
1288          my $UniqueFilename = $self->figmodel()->filename();          my $UniqueFilename = $self->figmodel()->filename();
1289          my $StartTime = time();          my $StartTime = time();
1290    
1291          #Archiving the existing model          #Reading original reaction table
1292          $self->ArchiveModel();          my $OriginalRxn = $self->reaction_table();
1293            #Clearing the table
1294            $self->reaction_table(1);
1295    
1296          #Removing any gapfilling reactions that may be currently present in the model          #Removing any gapfilling reactions that may be currently present in the model
1297          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
1298                  my $ModelTable = $self->reaction_table();                  my $ModelTable = $self->reaction_table();
1299                  for (my $i=0; $i < $ModelTable->size(); $i++) {                  for (my $i=0; $i < $ModelTable->size(); $i++) {
1300                          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/) {
1301                                  $ModelTable->delete_row($i);                                  $ModelTable->delete_row($i);
1302                                  $i--;                                  $i--;
1303                          }                          }
# Line 1190  Line 1321 
1321                          }                          }
1322                  }                  }
1323                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1324                    #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";
1325                  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));
1326                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1327          } else {          } else {
1328                    #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";
1329                  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));
1330          }          }
1331    
1332          #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
1333          my $SolutionData = $self->figmodel()->LoadProblemReport($UniqueFilename);          my $SolutionData = $self->figmodel()->LoadProblemReport($UniqueFilename);
1334    
1335          #Clearing the mfatoolkit output and log file          #Clearing the mfatoolkit output and log file
1336          $self->figmodel()->clearing_output($UniqueFilename,"GapFill".$self->id().".log");          $self->figmodel()->clearing_output($UniqueFilename,"GapFill".$self->id().".log");
1337          if (!defined($SolutionData) || $SolutionData->size() == 0) {          if (!defined($SolutionData) || $SolutionData->size() == 0) {
# Line 1233  Line 1367 
1367                                                  push(@{$ReactionList},$ID);                                                  push(@{$ReactionList},$ID);
1368                                          }                                          }
1369                                  }                                  }
1370                                  $self->figmodel()->IntegrateGrowMatchSolution($self->id(),undef,$ReactionList,$DirectionList,"GAP FILLING",0,1);                                  $self->figmodel()->IntegrateGrowMatchSolution($self->id(),undef,$ReactionList,$DirectionList,"AUTOCOMPLETION",0,1);
1371                          }                          }
1372                          last;                          last;
1373                  }                  }
1374          }          }
1375    
1376          #Updating model stats with gap filling results          #Updating model stats with gap filling results
1377          my $ElapsedTime = time() - $StartTime;          my $ElapsedTime = time() - $StartTime;
1378          $self->figmodel()->database()->ClearDBModel($self->id(),1);          $self->reaction_table(1);
1379            $self->calculate_model_changes($OriginalRxn,"AUTOCOMPLETION");
1380    
1381          #Determining why each gap filling reaction was added          #Determining why each gap filling reaction was added
1382          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);          $self->figmodel()->IdentifyDependancyOfGapFillingReactions($self->id(),$Media);
1383          if (!defined($donotclear) || $donotclear != 1) {          if (!defined($donotclear) || $donotclear != 1) {
                 $self->figmodel()->AddBiologTransporters($self->id());  
1384                  if ($self->id() !~ m/MGRast/) {                  if ($self->id() !~ m/MGRast/) {
1385                          $self->update_stats_for_gap_filling($ElapsedTime);                          $self->update_stats_for_gap_filling($ElapsedTime);
1386                  }                  }
# Line 1260  Line 1396 
1396          return $self->success();          return $self->success();
1397  }  }
1398    
1399    =head3 calculate_model_changes
1400    Definition:
1401            FIGMODELmodel->calculate_model_changes(FIGMODELTable:original reaction table,string:modification cause);
1402    Description:
1403    
1404    =cut
1405    
1406    sub calculate_model_changes {
1407            my ($self,$originalReactions,$cause,$tbl,$version) = @_;
1408            my $modTime = time();
1409            if (!defined($version)) {
1410                    $version = $self->selected_version();
1411            }
1412            my $user = $self->figmodel()->user();
1413            #Getting the history table
1414            my $histTbl = $self->model_history();
1415            #Checking for differences
1416            if (!defined($tbl)) {
1417                    $tbl = $self->reaction_table();
1418            }
1419            for (my $i=0; $i < $tbl->size(); $i++) {
1420                    my $row = $tbl->get_row($i);
1421                    my $orgRow = $originalReactions->get_row_by_key($row->{LOAD}->[0],"LOAD");
1422                    if (!defined($orgRow)) {
1423                            $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => $row->{DIRECTIONALITY}, GeneChange => $row->{"ASSOCIATED PEG"}, Action => ["ADDED"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1424                    } else {
1425                            my $geneChanges;
1426                            my $directionChange;
1427                            if ($orgRow->{"DIRECTIONALITY"}->[0] ne $row->{"DIRECTIONALITY"}->[0]) {
1428                                    $directionChange = $orgRow->{"DIRECTIONALITY"}->[0]." to ".$row->{"DIRECTIONALITY"}->[0];
1429                            }
1430                            for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1431                                    my $match = 0;
1432                                    if (defined($orgRow->{"ASSOCIATED PEG"})) {
1433                                            for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1434                                                    if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1435                                                            $match = 1;
1436                                                    }
1437                                            }
1438                                    }
1439                                    if ($match == 0) {
1440                                            push(@{$geneChanges},"Added ".$row->{"ASSOCIATED PEG"}->[$j]);
1441                                    }
1442                            }
1443                            if (defined($orgRow->{"ASSOCIATED PEG"})) {
1444                                    for (my $k=0; $k < @{$orgRow->{"ASSOCIATED PEG"}}; $k++) {
1445                                            my $match = 0;
1446                                            if (defined($row->{"ASSOCIATED PEG"})) {
1447                                                    for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1448                                                            if ($row->{"ASSOCIATED PEG"}->[$j] eq $orgRow->{"ASSOCIATED PEG"}->[$k]) {
1449                                                                    $match = 1;
1450                                                            }
1451                                                    }
1452                                            }
1453                                            if ($match == 0) {
1454                                                    push(@{$geneChanges},"Removed ".$orgRow->{"ASSOCIATED PEG"}->[$k]);
1455                                            }
1456                                    }
1457                            }
1458                            if ((defined($directionChange) && length($directionChange) > 0) || defined($geneChanges) && @{$geneChanges} > 0) {
1459                                    $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => [$directionChange], GeneChange => $geneChanges, Action => ["CHANGE"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1460                            }
1461                    }
1462            }
1463            #Looking for removed reactions
1464            for (my $i=0; $i < $originalReactions->size(); $i++) {
1465                    my $row = $originalReactions->get_row($i);
1466                    my $orgRow = $tbl->get_row_by_key($row->{LOAD}->[0],"LOAD");
1467                    if (!defined($orgRow)) {
1468                            $histTbl->add_row({Reaction => [$row->{LOAD}->[0]], DirectionChange => $row->{DIRECTIONALITY}, GeneChange => $row->{"ASSOCIATED PEG"}, Action => ["REMOVED"], ModificationTime => [$modTime], ModifcationCause => [$cause], User => [$user], Version => [$version]});
1469                    }
1470            }
1471            $histTbl->save();
1472    }
1473    
1474  =head3 GapGenModel  =head3 GapGenModel
1475  Definition:  Definition:
1476          FIGMODELmodel->GapGenModel();          FIGMODELmodel->GapGenModel();
# Line 1497  Line 1708 
1708  =cut  =cut
1709  sub status {  sub status {
1710          my ($self) = @_;          my ($self) = @_;
1711          return $self->{_data}->{status}->[0];          return $self->{_data}->status();
1712  }  }
1713    
1714  =head3 message  =head3 message
# Line 1508  Line 1719 
1719  =cut  =cut
1720  sub message {  sub message {
1721          my ($self) = @_;          my ($self) = @_;
1722          return $self->{_data}->{message}->[0];          return $self->{_data}->message();
1723  }  }
1724    
1725  =head3 set_status  =head3 set_status
# Line 1523  Line 1734 
1734  =cut  =cut
1735  sub set_status {  sub set_status {
1736          my ($self,$NewStatus,$Message) = @_;          my ($self,$NewStatus,$Message) = @_;
1737            $self->{_data}->status($NewStatus);
1738          #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");  
1739          return $self->config("SUCCESS")->[0];          return $self->config("SUCCESS")->[0];
1740  }  }
1741    
# Line 1566  Line 1774 
1774          }          }
1775          #Setting up needed variables          #Setting up needed variables
1776          my $OriginalModelTable = undef;          my $OriginalModelTable = undef;
1777          #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) {  
1778                  $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");  
1779                  return $self->fail();                  return $self->fail();
1780          }elsif ($Row->{status}->[0] == 1) {          }elsif ($self->status() == 1) {
1781                  $OriginalModelTable = $self->reaction_table();                  $OriginalModelTable = $self->reaction_table();
1782                  $self->ArchiveModel();                  $self->set_status(0,"Rebuilding preliminary reconstruction");
                 $Row->{status}->[0] = 0;  
                 $Row->{message}->[0] = "Rebuilding preliminary reconstruction";  
1783          } else {          } else {
1784                  $Row->{status}->[0] = 0;                  $self->set_status(0,"Preliminary reconstruction");
                 $Row->{message}->[0] = "Preliminary reconstruction";  
1785          }          }
         #Updating the status table  
         $self->figmodel()->database()->save_table($ModelTable);  
         $self->figmodel()->database()->UnlockDBTable("MODELS");  
1786          #Sorting GenomeData by gene location on the chromosome          #Sorting GenomeData by gene location on the chromosome
1787            my $ftrTbl = $self->figmodel()->database()->get_table("ROLERXNMAPPING");
1788          $FeatureTable->sort_rows("MIN LOCATION");          $FeatureTable->sort_rows("MIN LOCATION");
1789          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);          my ($ComplexHash,$SuggestedMappings,$UnrecognizedReactions,$ReactionHash);
1790          my %LastGenePosition;          my %LastGenePosition;
# Line 1661  Line 1856 
1856                          }                          }
1857                  }                  }
1858          }          }
   
1859          #Creating nonadjacent complexes          #Creating nonadjacent complexes
1860          my @ReactionList = keys(%{$ReactionHash});          my @ReactionList = keys(%{$ReactionHash});
1861          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
# Line 1767  Line 1961 
1961                  $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"]});
1962          }          }
1963    
1964            #Getting feature rows for features that are lumped
1965            my @rows = $ftrTbl->get_rows_by_key("2","MASTER");
1966            for (my $i=0; $i < @rows; $i++) {
1967                    my $rxn = $rows[$i]->{REACTION}->[0];
1968                    my $role = $rows[$i]->{ROLE}->[0];
1969                    my @orgrows = $FeatureTable->get_rows_by_key($role,"ROLES");
1970                    my $genes;
1971                    for (my $j=0; $j < @orgrows; $j++) {
1972                            if ($orgrows[$j]->{ID}->[0] =~ m/(peg\.\d+)/) {
1973                                    push(@{$genes},$1);
1974                            }
1975                    }
1976                    if (defined($genes) && @{$genes} > 0) {
1977                            my $row = $NewModelTable->get_row_by_key($rxn,"LOAD");
1978                            my $newGeneAssociations;
1979                            for (my $k=0; $k < @{$genes}; $k++) {
1980                                    for (my $j=0; $j < @{$row->{"ASSOCIATED PEG"}}; $j++) {
1981                                            my $peg = $genes->[$k];
1982                                            if ($row->{"ASSOCIATED PEG"}->[$j] !~ m/$peg/) {
1983                                                    push(@{$newGeneAssociations},$row->{"ASSOCIATED PEG"}->[$j]."+".$peg);
1984                                            }
1985                                    }
1986                            }
1987                            $row->{"ASSOCIATED PEG"} = $newGeneAssociations;
1988                    }
1989            }
1990    
1991          #Adding the spontaneous and universal reactions          #Adding the spontaneous and universal reactions
1992          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {          foreach my $ReactionID (@{$self->config("spontaneous reactions")}) {
1993                  #Getting the thermodynamic reversibility from the database                  #Getting the thermodynamic reversibility from the database
# Line 1823  Line 2044 
2044                  }                  }
2045          }          }
2046    
2047            #If an original model exists, we copy the gap filling solution from that model
2048            if (defined($OriginalModelTable)) {
2049                    for (my $i=0; $i < $OriginalModelTable->size(); $i++) {
2050                            if ($OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ && $OriginalModelTable->get_row($i)->{"ASSOCIATED PEG"}->[0] ne "INITIAL GAP FILLING") {
2051                                    my $Row = $NewModelTable->get_row_by_key($OriginalModelTable->get_row($i)->{"LOAD"}->[0],"LOAD");
2052                                    if (!defined($Row)) {
2053                                            $NewModelTable->add_row($OriginalModelTable->get_row($i));
2054                                    }
2055                            }
2056                    }
2057            }
2058    
2059          #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
2060          if (defined($OriginalModelTable)) {          if (defined($OriginalModelTable)) {
2061                  my $PerfectMatch = 1;                  my $PerfectMatch = 1;
# Line 1882  Line 2115 
2115          #Saving the new model to file          #Saving the new model to file
2116          $self->set_status(1,"Preliminary reconstruction complete");          $self->set_status(1,"Preliminary reconstruction complete");
2117          $self->figmodel()->database()->save_table($NewModelTable);          $self->figmodel()->database()->save_table($NewModelTable);
2118          $self->{_reaction_data} = $NewModelTable;          $self->reaction_table(1);
         #Clearing the previous model from the cache  
         $self->figmodel()->database()->ClearDBModel($self->id(),1);  
2119          #Updating the model stats table          #Updating the model stats table
2120          $self->update_stats_for_build();          $self->update_stats_for_build();
2121          $self->PrintSBMLFile();          $self->PrintSBMLFile();
2122            if (defined($OriginalModelTable)) {
2123                    $self->calculate_model_changes($OriginalModelTable,"REBUILD");
2124            }
2125    
2126          #Adding model to gapfilling queue          #Adding model to gapfilling queue
2127          if (defined($RunGapFilling) && $RunGapFilling == 1) {          if (defined($RunGapFilling) && $RunGapFilling == 1) {
# Line 1906  Line 2140 
2140    
2141  sub CreateMetaGenomeReactionList {  sub CreateMetaGenomeReactionList {
2142          my ($self) = @_;          my ($self) = @_;
   
2143          #Checking if the metagenome file exists          #Checking if the metagenome file exists
2144          if (!-e $self->config("raw MGRAST directory")->[0].$self->genome().".summary") {          if (!-e $self->config("raw MGRAST directory")->[0].$self->genome().".summary") {
2145                  $self->error_message("FIGMODEL:CreateMetaGenomeReactionList: could not find raw data file for metagenome ".$self->genome());                  $self->error_message("FIGMODEL:CreateMetaGenomeReactionList: could not find raw data file for metagenome ".$self->genome());
2146                    return $self->fail();
2147          }          }
2148          #Loading metagenome data          #Loading metagenome data
2149          my $MGRASTData = $self->figmodel()->database()->load_multiple_column_file($self->config("raw MGRAST directory")->[0].$self->genome().".summary","\t");          my $MGRASTData = $self->figmodel()->database()->load_multiple_column_file($self->config("raw MGRAST directory")->[0].$self->genome().".summary","\t");
2150          if (!defined($MGRASTData)) {          if (!defined($MGRASTData)) {
2151                  $self->error_message("FIGMODEL:CreateMetaGenomeReactionList: could not find raw data file for metagenome ".$self->genome());                  $self->error_message("FIGMODEL:CreateMetaGenomeReactionList: could not find raw data file for metagenome ".$self->genome());
2152                    return $self->fail();
2153          }          }
   
2154          #Setting up needed variables          #Setting up needed variables
2155          my $OriginalModelTable = undef;          my $OriginalModelTable = undef;
   
2156          #Checking status          #Checking status
2157          if ($self->status() < 0) {          if ($self->status() < 0) {
2158                  $self->set_status(0,"Preliminary reconstruction");                  $self->set_status(0,"Preliminary reconstruction");
# Line 1931  Line 2164 
2164                  $self->ArchiveModel();                  $self->ArchiveModel();
2165                  $self->set_status(0,"Rebuilding preliminary reconstruction");                  $self->set_status(0,"Rebuilding preliminary reconstruction");
2166          }          }
2167            #Creating a hash of escores and pegs associated with each role
2168            my $rolePegHash;
2169            my $roleEscores;
2170            for (my $i=0; $i < @{$MGRASTData};$i++) {
2171                    #MD5,PEG,number of sims,role,sim e-scores,max escore,min escore,ave escore,stdev escore,ave exponent,stddev exponent
2172                    $rolePegHash->{$MGRASTData->[$i]->[3]}->{substr($MGRASTData->[$i]->[1],4)} = 1;
2173                    push(@{$roleEscores->{$MGRASTData->[$i]->[3]}},split(/;/,$MGRASTData->[$i]->[4]));
2174            }
2175          #Getting the reaction table          #Getting the reaction table
2176          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          my $ReactionTable = $self->figmodel()->database()->get_table("REACTIONS");
2177          #Creating model table          #Creating model table
2178          my $ModelTable = FIGMODELTable->new(["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG","SUBSYSTEM","CONFIDENCE","REFERENCE","NOTES"],$self->directory().$self->id().".txt",["LOAD"],";","|","REACTIONS\n");          my $ModelTable = $self->create_table_prototype("ModelReactions");
2179          for (my $i=0; $i < @{$MGRASTData};$i++) {          print $ModelTable->filename();
2180                  #MD5,PEG,number of sims,role,sim e-scores          my @roles = keys(%{$rolePegHash});
2181                  my $Role = $MGRASTData->[$i]->[3];          for (my $i=0; $i < @roles; $i++) {
2182                  my $MD5 = $MGRASTData->[$i]->[0];                  my $min = -1;
2183                  my $peg = $MGRASTData->[$i]->[1];                  my $max = -1;
2184                  my $sims = $MGRASTData->[$i]->[4];                  my $count = @{$roleEscores->{$roles[$i]}};
2185                  $sims =~ s/;/,/g;                  my $ave = 0;
2186                    my $stdev = 0;
2187                    my $aveexp = 0;
2188                    my $stdevexp = 0;
2189                    for (my $j=0; $j < @{$roleEscores->{$roles[$i]}}; $j++) {
2190                            if ($roleEscores->{$roles[$i]} < $min || $min == -1) {
2191                                    $min = $roleEscores->{$roles[$i]};
2192                            }
2193                            if ($roleEscores->{$roles[$i]} > $max || $max == -1) {
2194                                    $max = $roleEscores->{$roles[$i]};
2195                            }
2196                            $ave += $roleEscores->{$roles[$i]}->[$j];
2197                            if ($roleEscores->{$roles[$i]}->[$j] =~ m/e(-\d+$)/) {
2198                                    $aveexp += $1;
2199                            }
2200                    }
2201                    $ave = $ave/$count;
2202                    $aveexp = $aveexp/$count;
2203                    for (my $j=0; $j < @{$roleEscores->{$roles[$i]}}; $j++) {
2204                            $stdev += ($roleEscores->{$roles[$i]}->[$j]-$ave)*($roleEscores->{$roles[$i]}->[$j]-$ave);
2205                            if ($roleEscores->{$roles[$i]}->[$j] =~ m/e(-\d+$)/) {
2206                                    $stdevexp += ($1-$aveexp)*($1-$aveexp);
2207                            }
2208                    }
2209                    $stdev = sqrt($stdev/$count);
2210                    $stdevexp = sqrt($stdevexp/$count);
2211                  #Checking for subsystems                  #Checking for subsystems
2212                  my $GeneSubsystems = $self->figmodel()->subsystems_of_role($Role);                  my $GeneSubsystems = $self->figmodel()->subsystems_of_role($roles[$i]);
2213                  #Checking if there are reactions associated with this role                  #Checking if there are reactions associated with this role
2214                  my $ReactionHashArrayRef = $self->figmodel()->reactions_of_role($Role);                  my $ReactionHashArrayRef = $self->figmodel()->reactions_of_role($roles[$i]);
2215                  if ($ReactionHashArrayRef != 0) {                  if ($ReactionHashArrayRef != 0) {
2216                          foreach my $Mapping (@{$ReactionHashArrayRef}) {                          foreach my $Mapping (@{$ReactionHashArrayRef}) {
2217                                  if (defined($Mapping->{"REACTION"}) && defined($Mapping->{"MASTER"}) && defined($Mapping->{"SUBSYSTEM"}) && defined($Mapping->{"SOURCE"})) {                                  if (defined($Mapping->{"REACTION"}) && defined($Mapping->{"MASTER"}) && defined($Mapping->{"SUBSYSTEM"}) && defined($Mapping->{"SOURCE"})) {
# Line 1959  Line 2223 
2223                                                                  $ReactionRow = {"LOAD" => [$Mapping->{"REACTION"}->[0]],"DIRECTIONALITY" => [$self->figmodel()->reversibility_of_reaction($Mapping->{"REACTION"}->[0])],"COMPARTMENT" => ["c"]};                                                                  $ReactionRow = {"LOAD" => [$Mapping->{"REACTION"}->[0]],"DIRECTIONALITY" => [$self->figmodel()->reversibility_of_reaction($Mapping->{"REACTION"}->[0])],"COMPARTMENT" => ["c"]};
2224                                                                  $ModelTable->add_row($ReactionRow);                                                                  $ModelTable->add_row($ReactionRow);
2225                                                          }                                                          }
2226                                                          push(@{$ReactionRow->{"ASSOCIATED PEG"}},substr($peg,4));                                                          my %pegHash = %{$rolePegHash->{$roles[$i]}};
2227                                                          push(@{$ReactionRow->{"REFERENCE"}},$MD5.":".$Role);                                                          if (defined($ReactionRow->{"ASSOCIATED PEG"})) {
2228                                                          push(@{$ReactionRow->{"CONFIDENCE"}},$sims);                                                                  for (my $j=0; $j < @{$ReactionRow->{"ASSOCIATED PEG"}}; $j++) {
2229                                                                            $pegHash{$ReactionRow->{"ASSOCIATED PEG"}->[$j]} = 1;
2230                                                                    }
2231                                                            }
2232                                                            delete $ReactionRow->{"ASSOCIATED PEG"};
2233                                                            push(@{$ReactionRow->{"ASSOCIATED PEG"}},keys(%pegHash));
2234                                                            push(@{$ReactionRow->{"REFERENCE"}},$count.":".$ave.":".$stdev.":".$aveexp.":".$stdevexp.":".$min.":".$max);
2235                                                          if (defined($GeneSubsystems)) {                                                          if (defined($GeneSubsystems)) {
2236                                                                  push(@{$ReactionRow->{"SUBSYSTEM"}},@{$GeneSubsystems});                                                                  push(@{$ReactionRow->{"SUBSYSTEM"}},@{$GeneSubsystems});
2237                                                          }                                                          }
# Line 2387  Line 2657 
2657          Calculating growth in the input media          Calculating growth in the input media
2658  =cut  =cut
2659  sub calculate_growth {  sub calculate_growth {
2660          my ($self,$Media) = @_;          my ($self,$Media,$outputDirectory,$InParameters,$saveLPFile) = @_;
2661            #Setting the Media
2662            if (!defined($Media) || length($Media) == 0) {
2663                    $Media = $self->autocompleteMedia();
2664            }
2665            #Setting parameters for the run
2666            my $DefaultParameters = $self->figmodel()->defaultParameters();
2667            if (defined($InParameters)) {
2668                    my @parameters = keys(%{$InParameters});
2669                    for (my $i=0; $i < @parameters; $i++) {
2670                            $DefaultParameters->{$parameters[$i]} = $InParameters->{$parameters[$i]};
2671                    }
2672            }
2673            $DefaultParameters->{"optimize metabolite production if objective is zero"} = 1;
2674            #Setting filenames
2675          my $UniqueFilename = $self->figmodel()->filename();          my $UniqueFilename = $self->figmodel()->filename();
2676          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)) {
2677                    $outputDirectory = $self->config("database message file directory")->[0];
2678            }
2679            my $fluxFilename = $outputDirectory."Fluxes-".$self->id()."-".$Media.".txt";
2680            my $cpdFluxFilename = $outputDirectory."CompoundFluxes-".$self->id()."-".$Media.".txt";
2681            #Running FBA
2682            #print $self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version())."\n";
2683            system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$Media,["ProductionMFA"],$DefaultParameters,$self->id()."-".$Media."-GrowthTest.txt",undef,$self->selected_version()));
2684            #Saving LP file if requested
2685            if (defined($saveLPFile) && $saveLPFile == 1 && -e $self->figmodel()->{"MFAToolkit output directory"}->[0].$UniqueFilename."/CurrentProblem.lp") {
2686                    system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/CurrentProblem.lp ".$self->directory().$self->id().".lp");
2687            }
2688          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);          my $ProblemReport = $self->figmodel()->LoadProblemReport($UniqueFilename);
2689          my $Result;          my $Result;
2690          if (defined($ProblemReport)) {          if (defined($ProblemReport)) {
2691                  my $Row = $ProblemReport->get_row(0);                  my $Row = $ProblemReport->get_row(0);
2692                  if (defined($Row) && defined($Row->{"Objective"}->[0])) {                  if (defined($Row) && defined($Row->{"Objective"}->[0])) {
2693                          if ($Row->{"Objective"}->[0] < 0.00000001) {                          if ($Row->{"Objective"}->[0] < 0.00000001 || $Row->{"Objective"}->[0] == 1e7) {
2694                                  $Result = "NOGROWTH:".$Row->{"Individual metabolites with zero production"}->[0];                                  $Result = "NOGROWTH";
2695                                    if (defined($Row->{"Individual metabolites with zero production"}->[0]) && $Row->{"Individual metabolites with zero production"}->[0] =~ m/cpd\d\d\d\d\d/) {
2696                                            $Result .= ":".$Row->{"Individual metabolites with zero production"}->[0];
2697                                    }
2698                          } else {                          } else {
2699                                    if (-e $self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionReactionData0.txt") {
2700                                            system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionReactionData0.txt ".$fluxFilename);
2701                                            system("cp ".$self->figmodel()->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/SolutionCompoundData0.txt ".$cpdFluxFilename);
2702                                    }
2703                                  $Result = $Row->{"Objective"}->[0];                                  $Result = $Row->{"Objective"}->[0];
2704                          }                          }
2705                  }                  }
2706          }          }
2707            #Deleting files if necessary
2708            if ($self->figmodel()->config("preserve all log files")->[0] ne "yes") {
2709                    $self->figmodel()->cleardirectory($UniqueFilename);
2710                    unlink($self->figmodel()->config("database message file directory")->[0].$self->id()."-".$Media."-GrowthTest.txt");
2711            }
2712            #Returning result
2713          return $Result;          return $Result;
2714  }  }
2715    
# Line 3734  Line 4042 
4042          my($self) = @_;          my($self) = @_;
4043    
4044          #Opening the SBML file for printing          #Opening the SBML file for printing
4045          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";  
         }  
4046          if (!open (SBMLOUTPUT, ">$Filename")) {          if (!open (SBMLOUTPUT, ">$Filename")) {
4047                  return;                  return;
4048          }          }
4049    
4050          #Loading and parsing the model data          #Loading and parsing the model data
4051          my $ModelTable = $self->reaction_table();          my $mdlTbl = $self->reaction_table();
4052          if (!defined($ModelTable) || !defined($ModelTable->{"array"})) {          if (!defined($mdlTbl) || !defined($mdlTbl->{"array"})) {
4053                  print "Failed to load ".$self->id()."\n";                  return $self->fail();
                 return;  
4054          }          }
4055            my $rxnTbl = $self->figmodel()->database()->get_table("REACTIONS");
4056            my $bioTbl = $self->figmodel()->database()->get_table("BIOMASS");
4057            my $cpdTbl = $self->figmodel()->database()->get_table("COMPOUNDS");
4058            my $cmpTbl = $self->figmodel()->database()->get_table("COMPARTMENTS");
4059    
4060          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash          #Adding intracellular metabolites that also need exchange fluxes to the exchange hash
4061          my $ExchangeHash = {"cpd11416" => "c"};          my $ExchangeHash = {"cpd11416" => "c"};
   
4062          my %CompartmentsPresent;          my %CompartmentsPresent;
4063          $CompartmentsPresent{"c"} = 1;          $CompartmentsPresent{"c"} = 1;
4064          my %CompoundList;          my %CompoundList;
4065          my @ReactionList;          my @ReactionList;
4066          my $ReactionTable = $self->figmodel()->database()->GetDBTable("REACTIONS");          for (my $i=0; $i < $mdlTbl->size(); $i++) {
4067          for (my $i=0; $i < $ModelTable->size(); $i++) {                  my $Reaction = $mdlTbl->get_row($i)->{"LOAD"}->[0];
4068                  my $Reaction = $ModelTable->get_row($i)->{"LOAD"}->[0];                  my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4069                  if (defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")) && defined($ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0])) {                  if (!defined($row)) {
4070                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4071                            if (!defined($row)) {
4072                                    next;
4073                            }
4074                    }
4075                    if (!defined($row->{"EQUATION"}->[0])) {
4076                            next;
4077                    }
4078                          push(@ReactionList,$Reaction);                          push(@ReactionList,$Reaction);
4079                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
4080                          my @MatchArray = /(cpd\d\d\d\d\d)/g;                          my @MatchArray = /(cpd\d\d\d\d\d)/g;
4081                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
4082                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;                                  $CompoundList{$MatchArray[$j]}->{"c"} = 1;
4083                          }                          }
4084                          $_ = $ReactionTable->get_row_by_key($Reaction,"DATABASE")->{"EQUATION"}->[0];                  $_ = $row->{"EQUATION"}->[0];
4085                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;                          @MatchArray = /(cpd\d\d\d\d\d\[\D\])/g;
4086                          for (my $j=0; $j < @MatchArray; $j++) {                          for (my $j=0; $j < @MatchArray; $j++) {
4087                                  if ($MatchArray[$j] =~ m/(cpd\d\d\d\d\d)\[(\D)\]/) {                                  if ($MatchArray[$j] =~ m/(cpd\d\d\d\d\d)\[(\D)\]/) {
# Line 3778  Line 4090 
4090                                  }                                  }
4091                          }                          }
4092                  }                  }
         }  
4093    
4094          #Printing header to SBML file          #Printing header to SBML file
4095          my $ModelName = $self->id();          my $ModelName = $self->id().$self->selected_version();
4096          $ModelName =~ s/\./_/;          $ModelName =~ s/\./_/;
4097          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";          print SBMLOUTPUT '<?xml version="1.0" encoding="UTF-8"?>'."\n";
4098      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";
4099      if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Organism name"}->[0])) {          if (defined($self->name())) {
4100          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";
4101      } else {      } else {
4102          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";
4103      }      }
4104    
4105          #Printing the unit data          #Printing the unit data
# Line 3805  Line 4116 
4116      #Printing compartments for SBML file      #Printing compartments for SBML file
4117      print SBMLOUTPUT '<listOfCompartments>'."\n";      print SBMLOUTPUT '<listOfCompartments>'."\n";
4118      foreach my $Compartment (keys(%CompartmentsPresent)) {      foreach my $Compartment (keys(%CompartmentsPresent)) {
4119          if (defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0])) {                  my $row = $cmpTbl->get_row_by_key($Compartment,"Abbreviation");
4120                  my @OutsideList = split(/\//,$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Outside"}->[0]);                  if (!defined($row) && !defined($row->{"Name"}->[0])) {
4121                            next;
4122                    }
4123                    my @OutsideList = split(/\//,$row->{"Outside"}->[0]);
4124                  my $Printed = 0;                  my $Printed = 0;
4125                  foreach my $Outside (@OutsideList) {                  foreach my $Outside (@OutsideList) {
4126                                  if (defined($CompartmentsPresent{$Outside}) && defined($self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Outside}->[0]->{"Name"}->[0])) {                          if (defined($CompartmentsPresent{$Outside}) && defined($row->{"Name"}->[0])) {
4127                                  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";
4128                                  $Printed = 1;                                  $Printed = 1;
4129                                  last;                                  last;
4130                          }                          }
4131                  }                  }
4132                  if ($Printed eq 0) {                  if ($Printed eq 0) {
4133                          print SBMLOUTPUT '<compartment id="'.$self->figmodel()->database()->GetDBTable("COMPARTMENTS")->{$Compartment}->[0]->{"Name"}->[0].'"/>'."\n";                          print SBMLOUTPUT '<compartment id="'.$row->{"Name"}->[0].'"/>'."\n";
                         }  
4134          }          }
4135      }      }
4136      print SBMLOUTPUT '</listOfCompartments>'."\n";      print SBMLOUTPUT '</listOfCompartments>'."\n";
# Line 3825  Line 4138 
4138      #Printing the list of metabolites involved in the model      #Printing the list of metabolites involved in the model
4139          print SBMLOUTPUT '<listOfSpecies>'."\n";          print SBMLOUTPUT '<listOfSpecies>'."\n";
4140      foreach my $Compound (keys(%CompoundList)) {      foreach my $Compound (keys(%CompoundList)) {
4141                    my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4142                    if (!defined($row)) {
4143                            next;
4144                    }
4145          my $Name = $Compound;          my $Name = $Compound;
4146                  my $Formula = "";                  my $Formula = "";
4147                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  if (defined($row->{"FORMULA"}->[0])) {
4148                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                          $Formula = $row->{"FORMULA"}->[0];
4149                  }                  }
4150                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4151                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4152                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4153                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4154                  }                  }
4155                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4156                  my $Charge = 0;                  my $Charge = 0;
4157                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4158                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4159                  }                  }
4160                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {                  foreach my $Compartment (keys(%{$CompoundList{$Compound}})) {
4161                  if ($Compartment eq "e") {                  if ($Compartment eq "e") {
4162                          $ExchangeHash->{$Compound} = "e";                          $ExchangeHash->{$Compound} = "e";
4163                  }                  }
4164                  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");
4165                            print SBMLOUTPUT '<species id="'.$Compound.'_'.$Compartment.'" name="'.$Name.'" compartment="'.$cmprow->{"Name"}->[0].'" charge="'.$Charge.'" boundaryCondition="false"/>'."\n";
4166          }          }
4167      }      }
4168    
4169          #Printing the boundary species          #Printing the boundary species
4170          foreach my $Compound (keys(%{$ExchangeHash})) {          foreach my $Compound (keys(%{$ExchangeHash})) {
4171                  my $Name = $Compound;                  my $Name = $Compound;
4172                  my $Formula = "";                  my $Formula = "";
4173                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0])) {                  my $row = $cpdTbl->get_row_by_key($Compound,"DATABASE");
4174                          $Formula = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"FORMULA"}->[0];                  if (!defined($row)) {
4175                            next;
4176                    }
4177                    if (defined($row->{"FORMULA"}->[0])) {
4178                            $Formula = $row->{"FORMULA"}->[0];
4179                  }                  }
4180                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4181                          $Name = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4182                          $Name =~ s/\s/_/;                          $Name =~ s/\s/_/;
4183                          $Name .= "_".$Formula;                          $Name .= "_".$Formula;
4184                  }                  }
4185                  $Name =~ s/[<>;&\*]//;                  $Name =~ s/[<>;&\*]//;
4186                  my $Charge = 0;                  my $Charge = 0;
4187                  if (defined($self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0])) {                  if (defined($row->{"CHARGE"}->[0])) {
4188                          $Charge = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->{$Compound}->[0]->{"CHARGE"}->[0];                          $Charge = $row->{"CHARGE"}->[0];
4189                  }                  }
4190                  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";
4191          }          }
# Line 3871  Line 4194 
4194      #Printing the list of reactions involved in the model      #Printing the list of reactions involved in the model
4195          my $ObjectiveCoef;          my $ObjectiveCoef;
4196      print SBMLOUTPUT '<listOfReactions>'."\n";      print SBMLOUTPUT '<listOfReactions>'."\n";
4197    
4198          foreach my $Reaction (@ReactionList) {          foreach my $Reaction (@ReactionList) {
4199          $ObjectiveCoef = "0.0";          $ObjectiveCoef = "0.0";
4200                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"EQUATION"}->[0])) {                  my $mdlrow = $mdlTbl->get_row_by_key($Reaction,"LOAD");
4201                    my $Reaction = $mdlrow->{"LOAD"}->[0];
4202                    my $row = $rxnTbl->get_row_by_key($Reaction,"DATABASE");
4203                    if (!defined($row)) {
4204                            $row = $bioTbl->get_row_by_key($Reaction,"DATABASE");
4205                            if (!defined($row)) {
4206                                    next;
4207                            }
4208                    }
4209                    if (!defined($row->{"EQUATION"}->[0])) {
4210                            next;
4211                    }
4212                  if ($Reaction =~ m/^bio/) {                  if ($Reaction =~ m/^bio/) {
4213                                  $ObjectiveCoef = "1.0";                                  $ObjectiveCoef = "1.0";
4214                          }                          }
4215                          my $LowerBound = -10000;                          my $LowerBound = -10000;
4216                  my $UpperBound = 10000;                  my $UpperBound = 10000;
4217                          my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateData($Reaction);                  my ($Reactants,$Products) = $self->figmodel()->GetReactionSubstrateDataFromEquation($row->{"EQUATION"}->[0]);
4218                  my $Name = $Reaction;                  my $Name = $Reaction;
4219                  if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0])) {                  if (defined($row->{"NAME"}->[0])) {
4220                          $Name = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"NAME"}->[0];                          $Name = $row->{"NAME"}->[0];
4221                                  $Name =~ s/[<>;&]//g;                                  $Name =~ s/[<>;&]//g;
4222                  }                  }
4223                  my $Reversibility = "true";                  my $Reversibility = "true";
4224                  if (defined($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0])) {                  if (defined($mdlrow->{"DIRECTIONALITY"}->[0])) {
4225                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] ne "<=>") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] ne "<=>") {
4226                                  $LowerBound = 0;                                  $LowerBound = 0;
4227                                          $Reversibility = "false";                                          $Reversibility = "false";
4228                          }                          }
4229                          if ($ModelTable->{$Reaction}->[0]->{"DIRECTIONALITY"}->[0] eq "<=") {                          if ($mdlrow->{"DIRECTIONALITY"}->[0] eq "<=") {
4230                                  my $Temp = $Products;                                  my $Temp = $Products;
4231                                  $Products = $Reactants;                                  $Products = $Reactants;
4232                                  $Reactants = $Temp;                                  $Reactants = $Temp;
# Line 3900  Line 4235 
4235                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";                          print SBMLOUTPUT '<reaction id="'.$Reaction.'" name="'.$Name.'" reversible="'.$Reversibility.'">'."\n";
4236                          print SBMLOUTPUT "<notes>\n";                          print SBMLOUTPUT "<notes>\n";
4237                          my $ECData = "";                          my $ECData = "";
4238                          if (defined($self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0])) {                  if (defined($row->{"ENZYME"}->[0])) {
4239                                  $ECData = $self->figmodel()->database()->GetDBTable("REACTIONS")->{$Reaction}->[0]->{"ENZYME"}->[0];                          $ECData = $row->{"ENZYME"}->[0];
4240                          }                          }
4241                          my $SubsystemData = "";                          my $SubsystemData = "";
4242                          if (defined($ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0])) {                  if (defined($mdlrow->{"SUBSYSTEM"}->[0])) {
4243                                  $SubsystemData = $ModelTable->{$Reaction}->[0]->{"SUBSYSTEM"}->[0];                          $SubsystemData = $mdlrow->{"SUBSYSTEM"}->[0];
4244                          }                          }
4245                          my $GeneAssociation = "";                          my $GeneAssociation = "";
4246                          my $ProteinAssociation = "";                          my $ProteinAssociation = "";
4247                          if (defined($ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0])) {                  if (defined($mdlrow->{"ASSOCIATED PEG"}->[0])) {
4248                                  if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} == 1 && $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {                          if (@{$mdlrow->{"ASSOCIATED PEG"}} == 1 && $mdlrow->{"ASSOCIATED PEG"}->[0] !~ m/\+/) {
4249                                          $GeneAssociation = $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[0];                                  $GeneAssociation = $mdlrow->{"ASSOCIATED PEG"}->[0];
4250                                  } else {                                  } else {
4251                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4252                                                  $GeneAssociation = "( ";                                                  $GeneAssociation = "( ";
4253                                          }                                          }
4254                                          for (my $i=0; $i < @{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}}; $i++) {                                  for (my $i=0; $i < @{$mdlrow->{"ASSOCIATED PEG"}}; $i++) {
4255                                                  if ($i > 0) {                                                  if ($i > 0) {
4256                                                          $GeneAssociation .= " )  or  ( ";                                                          $GeneAssociation .= " )  or  ( ";
4257                                                  }                                                  }
4258                                                  $GeneAssociation .= $ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}->[$i];                                          $GeneAssociation .= $mdlrow->{"ASSOCIATED PEG"}->[$i];
4259                                          }                                          }
4260                                          if (@{$ModelTable->{$Reaction}->[0]->{"ASSOCIATED PEG"}} > 1) {                                  if (@{$mdlrow->{"ASSOCIATED PEG"}} > 1) {
4261                                                  $GeneAssociation .= " )";                                                  $GeneAssociation .= " )";
4262                                          }                                          }
4263                                  }                                  }
# Line 3931  Line 4266 
4266                                          $GeneAssociation = "( ".$GeneAssociation." )";                                          $GeneAssociation = "( ".$GeneAssociation." )";
4267                                  }                                  }
4268                                  $ProteinAssociation = $GeneAssociation;                                  $ProteinAssociation = $GeneAssociation;
4269                                  if (defined($self->figmodel()->database()->GetDBTable("MODEL STATS")->{$self->id()}->[0]->{"Genome ID"}->[0])) {                          if (defined($self->genome())) {
4270                                          $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());
4271                                  }                                  }
4272                          }                          }
4273                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";                          print SBMLOUTPUT "<html:p>GENE_ASSOCIATION:".$GeneAssociation."</html:p>\n";
# Line 3963  Line 4298 
4298              print SBMLOUTPUT "</kineticLaw>\n";              print SBMLOUTPUT "</kineticLaw>\n";
4299                          print SBMLOUTPUT '</reaction>'."\n";                          print SBMLOUTPUT '</reaction>'."\n";
4300                  }                  }
         }  
4301    
4302          my @ExchangeList = keys(%{$ExchangeHash});          my @ExchangeList = keys(%{$ExchangeHash});
4303          foreach my $ExCompound (@ExchangeList) {          foreach my $ExCompound (@ExchangeList) {
4304                  my $ExCompoundName = $ExCompound;                  my $ExCompoundName = $ExCompound;
4305                  my $Row = $self->figmodel()->database()->GetDBTable("COMPOUNDS")->get_row_by_key($ExCompound,"DATABASE");                  my $Row = $cpdTbl->get_row_by_key($ExCompound,"DATABASE");
4306                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {                  if (defined($Row) && defined($Row->{"NAME"}->[0])) {
4307                          $ExCompoundName = $Row->{"NAME"}->[0];                          $ExCompoundName = $Row->{"NAME"}->[0];
4308                          $ExCompoundName =~ s/[<>;&]//g;                          $ExCompoundName =~ s/[<>;&]//g;
# Line 4025  Line 4359 
4359                  $tbl->add_row($row);                  $tbl->add_row($row);
4360          }          }
4361          $tbl->save();          $tbl->save();
         system("cp ".$tbl->filename()." ".$self->figmodel()->config("Model table download directory")->[0].$self->figmodel()->config("ModelSimpleReactionTable")->{filename_prefix}->[0]."-".$self->id().".txt");  
4362  }  }
4363    
4364  =head3 PrintModelLPFile  =head3 PrintModelLPFile
# Line 4354  Line 4687 
4687          }          }
4688  }  }
4689    
4690    =pod
4691    
4692    =item * [string]:I<list of essential genes> = B<run_geneKO_slow> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4693    
4694    =cut
4695    
4696    sub run_geneKO_slow {
4697            my ($self,$media,$maxGrowth,$save) = @_;
4698            my $output;
4699            my $UniqueFilename = $self->figmodel()->filename();
4700            if (defined($maxGrowth) && $maxGrowth == 1) {
4701                    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()));
4702            } else {
4703                    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()));
4704            }
4705            if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt") {
4706                    print "Deletion study file not found!.\n";
4707                    return undef;
4708            }
4709            my $deltbl = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."DeletionStudyResults.txt",";","|",1,["Experiment"]);
4710            for (my $i=0; $i < $deltbl->size(); $i++) {
4711                    my $row = $deltbl->get_row($i);
4712                    if ($row->{"Insilico growth"}->[0] < 0.0000001) {
4713                            push(@{$output},$row->{Experiment}->[0]);
4714                    }
4715            }
4716            if (defined($output)) {
4717                    if (defined($save) && $save == 1) {
4718                            my $tbl = $self->essentials_table();
4719                            my $row = $tbl->get_row_by_key($media,"MEDIA",1);
4720                            $row->{"ESSENTIAL GENES"} = $output;
4721                            $tbl->save();
4722                    }
4723            }
4724            return $output;
4725    }
4726    
4727    =pod
4728    
4729    =item * [string]:I<list of minimal genes> = B<run_gene_minimization> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4730    
4731    =cut
4732    
4733    sub run_gene_minimization {
4734            my ($self,$media,$maxGrowth,$save) = @_;
4735            my $output;
4736    
4737            #Running the MFAToolkit
4738            my $UniqueFilename = $self->figmodel()->filename();
4739            if (defined($maxGrowth) && $maxGrowth == 1) {
4740                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$media,["ProductionMFA"],{"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()));
4741            } else {
4742                    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()));
4743            }
4744            my $tbl = $self->figmodel()->LoadProblemReport($UniqueFilename);
4745            if (!defined($tbl)) {
4746                    return undef;
4747            }
4748            for (my $i=0; $i < $tbl->size(); $i++) {
4749                    my $row = $tbl->get_row($i);
4750                    if ($row->{Notes}->[0] =~ m/Recursive\sMILP\sGENE_USE\soptimization/) {
4751                            my @array = split(/\|/,$row->{Notes}->[0]);
4752                            my $solution = $array[0];
4753                            $_ = $solution;
4754                            my @OriginalArray = /(peg\.\d+)/g;
4755                            push(@{$output},@OriginalArray);
4756                            last;
4757                    }
4758            }
4759    
4760            if (defined($output)) {
4761                    if (defined($save) && $save == 1) {
4762                            my $tbl = $self->load_model_table("MinimalGenes");
4763                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4764                            if (defined($row)) {
4765                                    $row->{GENES} = $output;
4766                            } else {
4767                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4768                            }
4769                            $tbl->save();
4770                    }
4771            }
4772            return $output;
4773    }
4774    
4775    =pod
4776    
4777    =item * [string]:I<list of inactive genes> = B<identify_inactive_genes> (string:I<media>,0/1:I<max growth>,0/1:I<save results>);
4778    
4779    =cut
4780    
4781    sub identify_inactive_genes {
4782            my ($self,$media,$maxGrowth,$save) = @_;
4783            my $output;
4784            #Running the MFAToolkit
4785            my $UniqueFilename = $self->figmodel()->filename();
4786            if (defined($maxGrowth) && $maxGrowth == 1) {
4787                    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()));
4788            } else {
4789                    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()));
4790            }
4791            #Reading in the output bounds file
4792            my $ReactionTB;
4793            if (-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt") {
4794                    $ReactionTB = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/MFAOutput/TightBoundsReactionData0.txt",";","|",1,["DATABASE ID"]);
4795            }
4796            if (!defined($ReactionTB)) {
4797                    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";
4798                    return undef;
4799            }
4800            #Clearing output
4801            $self->figmodel()->clearing_output($UniqueFilename,"Classify-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");
4802            my $geneHash;
4803            my $activeGeneHash;
4804            for (my $i=0; $i < $ReactionTB->size(); $i++) {
4805                    my $Row = $ReactionTB->get_row($i);
4806                    if (defined($Row->{"Min FLUX"}) && defined($Row->{"Max FLUX"}) && defined($Row->{"DATABASE ID"}) && $Row->{"DATABASE ID"}->[0] =~ m/rxn\d\d\d\d\d/) {
4807                            my $data = $self->get_reaction_data($Row->{"DATABASE ID"}->[0]);
4808                            if (defined($data->{"ASSOCIATED PEG"})) {
4809                                    my $active = 0;
4810                                    if ($Row->{"Min FLUX"}->[0] > 0.00000001 || $Row->{"Max FLUX"}->[0] < -0.00000001 || ($Row->{"Max FLUX"}->[0]-$Row->{"Min FLUX"}->[0]) > 0.00000001) {
4811                                            $active = 1;
4812                                    }
4813                                    for (my $j=0; $j < @{$data->{"ASSOCIATED PEG"}}; $j++) {
4814                                            $_ = $data->{"ASSOCIATED PEG"}->[$j];
4815                                            my @OriginalArray = /(peg\.\d+)/g;
4816                                            for (my $k=0; $k < @OriginalArray; $k++) {
4817                                                    if ($active == 1) {
4818                                                            $activeGeneHash->{$OriginalArray[$k]} = 1;
4819                                                    }
4820                                                    $geneHash->{$OriginalArray[$k]} = 1;
4821                                            }
4822                                    }
4823                            }
4824                    }
4825            }
4826            my @allGenes = keys(%{$geneHash});
4827            for (my $i=0; $i < @allGenes; $i++) {
4828                    if (!defined($activeGeneHash->{$allGenes[$i]})) {
4829                            push(@{$output},$allGenes[$i]);
4830                    }
4831            }
4832            if (defined($output)) {
4833                    if (defined($save) && $save == 1) {
4834                            my $tbl = $self->load_model_table("InactiveGenes");
4835                            my $row = $tbl->get_table_by_key("MEDIA",$media)->get_row_by_key("MAXGROWTH",$maxGrowth);
4836                            if (defined($row)) {
4837                                    $row->{GENES} = $output;
4838                            } else {
4839                                    $tbl->add_row({GENES => $output,MEDIA => [$media],MAXGROWTH => [$maxGrowth]});
4840                            }
4841                            $tbl->save();
4842                    }
4843            }
4844            return $output;
4845    }
4846    
4847    sub ConvertVersionsToHistoryFile {
4848            my ($self) = @_;
4849            my $vone = 0;
4850            my $vtwo = 0;
4851            my $continue = 1;
4852            my $lastTable;
4853            my $currentTable;
4854            my $cause;
4855            my $lastChanged = 0;
4856            my $noHitCount = 0;
4857            while ($continue == 1) {
4858                    $cause = "NONE";
4859                    $currentTable = undef;
4860                    if (-e $self->directory().$self->id()."V".($vone+1).".".$vtwo.".txt") {
4861                            $noHitCount = 0;
4862                            $lastChanged = 0;
4863                            $vone = $vone+1;
4864                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4865                            $cause = "RECONSTRUCTION";
4866                    } elsif (-e $self->directory().$self->id()."V".$vone.".".($vtwo+1).".txt") {
4867                            $noHitCount = 0;
4868                            $lastChanged = 0;
4869                            $vtwo = $vtwo+1;
4870                            $currentTable = $self->figmodel()->database()->load_table($self->directory().$self->id()."V".$vone.".".$vtwo.".txt",";","|",1,["LOAD","DIRECTIONALITY","COMPARTMENT","ASSOCIATED PEG"]);
4871                            $cause = "AUTOCOMPLETION";
4872                    } elsif ($lastChanged == 0) {
4873                            $lastChanged = 1;
4874                            $vone = $vone+1;
4875                            $cause = "RECONSTRUCTION";
4876                    } elsif ($lastChanged == 1) {
4877                            $lastChanged = 2;
4878                            $vone = $vone-1;
4879                            $vtwo = $vtwo+1;
4880                            $cause = "AUTOCOMPLETION";
4881                    } elsif ($lastChanged == 2) {
4882                            $lastChanged = 0;
4883                            $vone = $vone+1;
4884                            $cause = "RECONSTRUCTION";
4885                    }
4886                    if (defined($currentTable)) {
4887                            if (defined($lastTable)) {
4888                                    print $cause."\t".$self->directory().$self->id()."V".$vone.".".$vtwo.".txt\n";
4889                                    $self->calculate_model_changes($lastTable,$cause,$currentTable,"V".$vone.".".$vtwo);
4890                            }
4891                            $lastTable = $currentTable;
4892                    } else {
4893                            $noHitCount++;
4894                            if ($noHitCount >= 40) {
4895                                    last;
4896                            }
4897                    }
4898            }
4899    }
4900    
4901  1;  1;

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.21

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3