[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.11, Thu Apr 15 21:51:15 2010 UTC revision 1.18, Mon May 31 18:05:08 2010 UTC
# Line 28  Line 28 
28          }          }
29    
30          #Checking that the id exists          #Checking that the id exists
31          my $tbl = $self->figmodel()->database()->GetDBTable("MODELS");          my $modelHandle = $self->figmodel()->database()->get_object_manager("model");
32          if (!defined($tbl)) {          if (!defined($modelHandle)) {
33                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not load MODELS table. Check database!");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not load MODELS table. Check database!");
34                  return undef;                  return undef;
35          }          }
36    
37          #If the id is a number, we get the model row by index          #If the id is a number, we get the model row by index
         my $index = $id;  
38          if ($id =~ m/^\d+$/) {          if ($id =~ m/^\d+$/) {
39                  $self->{_data} = $tbl->get_row($id);                  my $objects = $modelHandle->get_objects();
40          } else {                  $self->{_data} = $objects->[$id];
41                  $self->{_data} = $tbl->get_row_by_key($id,"id");                  $self->figmodel()->{_models}->{$id} = $self;
42                  if (!defined($self->{_data})) {          } else {
43                          if ($id =~ m/(.+)(V[^V]+)/) {                  my $objects = $modelHandle->get_objects({id => $id});
44                                  $self->{_data} = $tbl->get_row_by_key($1,"id");                  if (!defined($objects->[0]) && $id =~ m/(.+)(V[^V]+)/) {
45                                  if (!defined($self->{_data})) {                          $objects = $modelHandle->get_objects({id => $1});
46                            if (!defined($objects->[0])) {
47                                          $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");                                          $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
48                                          return undef;                                          return undef;
49                                  }                                  }
50                                  $self->{_selectedversion} = $2;                                  $self->{_selectedversion} = $2;
51                          } else {                  } elsif (!defined($objects->[0])) {
52                                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");                                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find model ".$id." in database!");
53                                  return undef;                                  return undef;
54                          }                          }
55                  }                  $self->{_data} = $objects->[0];
                 $index = $tbl->row_index($self->{_data});  
56          }          }
57          if (!defined($self->{_data})) {          if (!defined($self->{_data})) {
58                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find specified id in database!");                  $self->figmodel()->error_message("FIGMODELmodel->new(figmodel,".$id."):could not find specified id in database!");
59                  return undef;                  return undef;
60          }          }
         $self->{_index} = $index;  
61          $self->figmodel()->{_models}->{$self->id()} = $self;          $self->figmodel()->{_models}->{$self->id()} = $self;
62          $self->figmodel()->{_models}->{$self->index()} = $self;  
63          return $self;          return $self;
64  }  }
65    
# Line 118  Line 116 
116  =cut  =cut
117  sub fig {  sub fig {
118          my ($self) = @_;          my ($self) = @_;
   
119          if (!defined($self->{_fig}) && $self->source() !~ /^MGRAST/) {          if (!defined($self->{_fig}) && $self->source() !~ /^MGRAST/) {
120                  if ($self->source() =~ /^RAST/) {                  if ($self->source() =~ /^RAST/) {
121                          $self->{"_fig"} = $self->figmodel()->fig();#$self->genome());                          $self->{"_fig"} = $self->figmodel()->fig();#$self->genome());
# Line 126  Line 123 
123                          $self->{"_fig"} = $self->figmodel()->fig();                          $self->{"_fig"} = $self->figmodel()->fig();
124                  }                  }
125          }          }
   
126          return $self->{"_fig"};          return $self->{"_fig"};
127  }  }
128    
# Line 170  Line 166 
166  =cut  =cut
167  sub mgdata {  sub mgdata {
168          my ($self) = @_;          my ($self) = @_;
   
169          if (!defined($self->{_mgdata}) && $self->source() =~ /^MGRAST/) {          if (!defined($self->{_mgdata}) && $self->source() =~ /^MGRAST/) {
170                  require MGRAST;                  require MGRAST;
171                  $self->{_mgdata} = $self->figmodel()->mgrast()->Job->get_objects( { 'genome_id' => $self->genome() } )                  $self->{_mgdata} = $self->figmodel()->mgrast()->Job->get_objects( { 'genome_id' => $self->genome() } )
172          }          }
   
173          return $self->{_mgdata};          return $self->{_mgdata};
174  }  }
175    
# Line 187  Line 181 
181  =cut  =cut
182  sub id {  sub id {
183          my ($self) = @_;          my ($self) = @_;
184          return $self->{_data}->{id}->[0];          return $self->{_data}->id();
185  }  }
186    
187  =head3 owner  =head3 owner
# Line 198  Line 192 
192  =cut  =cut
193  sub owner {  sub owner {
194          my ($self) = @_;          my ($self) = @_;
195          return $self->{_data}->{owner}->[0];          return $self->{_data}->owner();
 }  
   
 =head3 index  
 Definition:  
         string = FIGMODELmodel->index();  
 Description:  
         Returns model index  
 =cut  
 sub index {  
         my ($self) = @_;  
         return $self->{_index};  
196  }  }
197    
198  =head3 name  =head3 name
# Line 228  Line 211 
211                          if (defined($self->mgdata())) {                          if (defined($self->mgdata())) {
212                                  $self->{_name} = $self->mgdata()->genome_name;                                  $self->{_name} = $self->mgdata()->genome_name;
213                          }                          }
                 } elsif (defined($self->stats())) {  
                         $self->{_name} = $self->stats()->{'Organism name'}->[0];  
214                  } elsif ($source !~ /^RAST/) {                  } elsif ($source !~ /^RAST/) {
215                          $self->{_name} = $self->fig()->orgname_of_orgid($self->genome());                          $self->{_name} = $self->fig()->orgname_of_orgid($self->genome());
216                    } else {
217                            $self->{_name} = $self->figmodel()->get_genome_stats($self->genome())->{NAME}->[0];
218                  }                  }
219          }          }
220    
221          return $self->{_name};          return $self->{_name};
222  }  }
223    
 =head3 stats  
 Definition:  
         string = FIGMODELmodel->stats();  
 Description:  
         Returns model stats  
 =cut  
 sub stats {  
         my ($self) = @_;  
   
         if (!defined($self->{_stats})) {  
                 $self->{_stats} = $self->figmodel()->database()->GetDBTable("MODEL STATS")->get_row_by_key($self->id(),"Model ID");  
         }  
         return $self->{_stats};  
 }  
   
224  =head3 get_reaction_class  =head3 get_reaction_class
225  Definition:  Definition:
226          string = FIGMODELmodel->get_reaction_class(string::reaction ID);          string = FIGMODELmodel->get_reaction_class(string::reaction ID);
# Line 260  Line 228 
228          Returns reaction class          Returns reaction class
229  =cut  =cut
230  sub get_reaction_class {  sub get_reaction_class {
231          my ($self,$reaction,$nohtml) = @_;          my ($self,$reaction,$nohtml,$brief_flux) = @_;
232    
233          if (!-e $self->directory()."ReactionClassification-".$self->id().".tbl") {          if (!-e $self->directory()."ReactionClassification-".$self->id().".tbl") {
234                  if (!defined($self->{_reaction_classes})) {                  if (!defined($self->{_reaction_classes})) {
# Line 277  Line 245 
245                          my $max = $ClassRow->{MAX}->[0];                          my $max = $ClassRow->{MAX}->[0];
246                          if ($ClassRow->{CLASS}->[0] eq "Positive") {                          if ($ClassRow->{CLASS}->[0] eq "Positive") {
247                                  $class = "Essential =>";                                  $class = "Essential =>";
248                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
249                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {
250                                  $class = "Essential <=";                                  $class = "Essential <=";
251                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
252                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {
253                                  $class = "Active =>";                                  $class = "Active =>";
254                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
255                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {
256                                  $class = "Active <=";                                  $class = "Active <=";
257                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
258                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {
259                                  $class = "Active <=>";                                  $class = "Active <=>";
260                                  $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $class.="<br>[Flux: ".$min." to ".$max."]<br>";
261                          } elsif ($ClassRow->{CLASS}->[0] eq "Blocked") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Blocked") {
262                                  $class = "Inactive";                                  $class = "Inactive";
263                          } elsif ($ClassRow->{CLASS}->[0] eq "Dead") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Dead") {
# Line 324  Line 292 
292                          my $max = $ClassRow->{MAX}->[$i];                          my $max = $ClassRow->{MAX}->[$i];
293                          if ($ClassRow->{CLASS}->[$i] eq "Positive") {                          if ($ClassRow->{CLASS}->[$i] eq "Positive") {
294                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential =>";
295                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
296                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {
297                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";
298                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
299                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {
300                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";
301                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
302                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {
303                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";
304                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
305                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {
306                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";
307                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";                                  $brief_flux ? $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>" : $NewClass.="<br>[Flux: ".$min." to ".$max."]<br>";
308                          } elsif ($ClassRow->{CLASS}->[$i] eq "Blocked") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Blocked") {
309                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Inactive";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Inactive";
310                          } elsif ($ClassRow->{CLASS}->[$i] eq "Dead") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Dead") {
# Line 363  Line 331 
331    
332          if (!defined($self->{_biomass})) {          if (!defined($self->{_biomass})) {
333                  my $rxntbl = $self->reaction_table();                  my $rxntbl = $self->reaction_table();
334                    if (defined($rxntbl)) {
335                  for (my $i=0; $i < $rxntbl->size(); $i++) {                  for (my $i=0; $i < $rxntbl->size(); $i++) {
336                          if ($rxntbl->get_row($i)->{"LOAD"}->[0] =~ m/bio\d\d\d\d\d/) {                          if ($rxntbl->get_row($i)->{"LOAD"}->[0] =~ m/bio\d\d\d\d\d/) {
337                                  $self->{_biomass} = $rxntbl->get_row($i)->{"LOAD"}->[0];                                  $self->{_biomass} = $rxntbl->get_row($i)->{"LOAD"}->[0];
# Line 370  Line 339 
339                          }                          }
340                  }                  }
341          }          }
342            }
343    
344          return $self->get_reaction_data($self->{_biomass});          return $self->get_reaction_data($self->{_biomass});
345  }  }
# Line 441  Line 411 
411          return $self->{"_".$name};          return $self->{"_".$name};
412  }  }
413    
414    =head3 create_table_prototype
415    
416    Definition:
417            FIGMODELTable::table = FIGMODELmodel->create_table_prototype(string::table);
418    Description:
419            Returns a empty FIGMODELTable with all the metadata associated with the input table name
420    
421    =cut
422    sub create_table_prototype {
423            my ($self,$TableName) = @_;
424    
425            #Checking if the table definition exists in the FIGMODELconfig file
426            if (!defined($self->figmodel()->config($TableName))) {
427                    $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:Definition not found for ".$TableName);
428                    return undef;
429            }
430            #Checking that this is a database table
431            if (!defined($self->config($TableName)->{tabletype}) || $self->config($TableName)->{tabletype}->[0] ne "ModelTable") {
432                    $self->figmodel()->error_message("FIGMODELdatabase:create_table_prototype:".$TableName." is not a model table!");
433                    return undef;
434            }
435            if (!defined($self->config($TableName)->{delimiter})) {
436                    $self->config($TableName)->{delimiter}->[0] = ";";
437            }
438            if (!defined($self->config($TableName)->{itemdelimiter})) {
439                    $self->config($TableName)->{itemdelimiter}->[0] = "|";
440            }
441            my $prefix;
442            if (defined($self->config($TableName)->{prefix})) {
443                    $prefix = join("\n",@{$self->config($TableName)->{prefix}});
444            }
445            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);
446            return $tbl;
447    }
448    
449  =head3 get_reaction_number  =head3 get_reaction_number
450  Definition:  Definition:
451          int = FIGMODELmodel->get_reaction_number();          int = FIGMODELmodel->get_reaction_number();
# Line 449  Line 454 
454  =cut  =cut
455  sub get_reaction_number {  sub get_reaction_number {
456          my ($self) = @_;          my ($self) = @_;
   
457          if (!defined($self->reaction_table())) {          if (!defined($self->reaction_table())) {
458                  return 0;                  return 0;
459          }          }
   
460          return $self->reaction_table()->size();          return $self->reaction_table()->size();
461  }  }
462    
# Line 526  Line 529 
529                  my $Row = $rxnTable->get_row($i);                  my $Row = $rxnTable->get_row($i);
530                  if (defined($Row) && defined($Row->{"ASSOCIATED PEG"})) {                  if (defined($Row) && defined($Row->{"ASSOCIATED PEG"})) {
531                          foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {                          foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {
532                                  $GeneSet =~ s/\+/|/g;                                  my $temp = $GeneSet;
533                                  $GeneSet =~ s/\sAND\s/|/gi;                                  $temp =~ s/\+/|/g;
534                                  $GeneSet =~ s/\sOR\s/|/gi;                                  $temp =~ s/\sAND\s/|/gi;
535                                  $GeneSet =~ s/[\(\)\s]//g;                                  $temp =~ s/\sOR\s/|/gi;
536                                  my @GeneList = split(/\|/,$GeneSet);                                  $temp =~ s/[\(\)\s]//g;
537                                    my @GeneList = split(/\|/,$temp);
538                                  foreach my $Gene (@GeneList) {                                  foreach my $Gene (@GeneList) {
539                                  my $FeatureRow = $self->{_feature_data}->get_row_by_key("fig|".$self->genome().".".$Gene,"ID");                                  my $FeatureRow = $self->{_feature_data}->get_row_by_key("fig|".$self->genome().".".$Gene,"ID");
540                                                  if (!defined($FeatureRow)) {                                                  if (!defined($FeatureRow)) {
# Line 697  Line 701 
701  =cut  =cut
702  sub genome {  sub genome {
703          my ($self) = @_;          my ($self) = @_;
704          return $self->{_data}->{genome}->[0];          return $self->{_data}->genome();
705  }  }
706    
707  =head3 source  =head3 source
# Line 708  Line 712 
712  =cut  =cut
713  sub source {  sub source {
714          my ($self) = @_;          my ($self) = @_;
715          return $self->{_data}->{source}->[0];          return $self->{_data}->source();
716  }  }
717    
718  =head3 rights  =head3 rights
# Line 719  Line 723 
723  =cut  =cut
724  sub rights {  sub rights {
725          my ($self,$username) = @_;          my ($self,$username) = @_;
   
726          if ($self->public()) {          if ($self->public()) {
727                  return 1;                  return 1;
728          }          }
# Line 727  Line 730 
730                  return 0;                  return 0;
731          }          }
732          if (!defined($self->{_userrights}->{$username})) {          if (!defined($self->{_userrights}->{$username})) {
733                  if (defined($self->{_data}->{master})) {                  $self->{_userrights}->{$self->{_data}->owner()} = 1;
734                          for (my $i=0; $i < @{$self->{_data}->{master}};$i++) {                  my @users = split(/\|/,$self->{_data}->users());
735                                  $self->{_userrights}->{$self->{_data}->{master}->[$i]} = 1;                  for (my $i=0; $i < @users;$i++) {
736                          }                          $self->{_userrights}->{$users[$i]} = 1;
                 }  
                 if (defined($self->{_data}->{users})) {  
                         for (my $i=0; $i < @{$self->{_data}->{users}};$i++) {  
                                 $self->{_userrights}->{$self->{_data}->{users}->[$i]} = 1;  
                         }  
737                  }                  }
738          }          }
739          return $self->{_userrights}->{$username};          return $self->{_userrights}->{$username};
# Line 749  Line 747 
747  =cut  =cut
748  sub public {  sub public {
749          my ($self) = @_;          my ($self) = @_;
750            if ($self->{_data}->users() eq "all") {
751          if (!defined($self->{_public})) {                  return 1;
                 $self->{_public} = 0;  
                 if (defined($self->{_data}->{users}->[0]) && $self->{_data}->{users}->[0] eq "all") {  
                         $self->{_public} = 1;  
                 }  
752          }          }
753          return $self->{_public};          return 0;
754  }  }
755    
756  =head3 directory  =head3 directory
# Line 804  Line 798 
798          return $self->directory().$self->id().$self->selected_version().".txt";          return $self->directory().$self->id().$self->selected_version().".txt";
799  }  }
800    
 =head3 set_metagenome_stats  
 Definition:  
         string = FIGMODELmodel->set_metagenome_stats();  
 Description:  
         Sets the values of many model stats for a metagenome  
 =cut  
 sub set_metagenome_stats {  
         my ($self) = @_;  
   
         $self->{_total_compounds} = 0;  
         if (defined($self->compound_table())) {  
                 $self->{_total_compounds} = $self->compound_table()->size();  
         }  
         $self->{_gene_reactions} = 0;  
         $self->{_gapfilling_reactions} = 0;  
         $self->{_model_genes} = 0;  
         $self->{_total_reactions} = 0;  
         if (defined($self->reaction_table())) {  
                 $self->{_total_reactions} = $self->reaction_table()->size();  
                 my $tbl = $self->reaction_table();  
                 my $spontaneous = 0;  
                 for (my $i=0; $i < $tbl->size(); $i++) {  
                         my $row = $tbl->get_row($i);  
                         if (!defined($row->{"ASSOCIATED PEG"}->[0]) || $row->{"ASSOCIATED PEG"}->[0] !~ m/peg/) {  
                                 if ($row->{"ASSOCIATED PEG"}->[0] =~ m/SPONTANEOUS/) {  
                                         $spontaneous++;  
                                 } else {  
                                         $self->{_gapfilling_reactions}++;  
                                 }  
                         } else {  
                                 for (my $j=0; $j < @{$row->{"CONFIDENCE"}}; $j++) {  
                                         my @ecores = split(/;/,$row->{"CONFIDENCE"}->[$j]);  
                                         $self->{_model_genes} += @ecores;  
                                 }  
                         }  
                 }  
                 $self->{_gene_reactions} = $tbl->size() - $spontaneous - $self->{_gapfilling_reactions};  
         }  
 }  
   
801  =head3 version  =head3 version
802  Definition:  Definition:
803          string = FIGMODELmodel->version();          string = FIGMODELmodel->version();
# Line 855  Line 809 
809    
810          if (!defined($self->{_version})) {          if (!defined($self->{_version})) {
811                  if (!defined($self->{_selectedversion})) {                  if (!defined($self->{_selectedversion})) {
812                          if (defined($self->stats())) {                          $self->{_version} = "V".$self->{_data}->version().".".$self->{_data}->autocompleteVersion();
                                 $self->{_version} = "V".$self->stats()->{"Version"}->[0].".".$self->stats()->{"Gap fill version"}->[0];  
                         }  
813                  } else {                  } else {
814                          $self->{_version} = $self->{_selectedversion};                          $self->{_version} = $self->{_selectedversion};
815                  }                  }
# Line 888  Line 840 
840  =cut  =cut
841  sub modification_time {  sub modification_time {
842          my ($self) = @_;          my ($self) = @_;
843          if (!defined($self->{_modification_time})) {          return $self->{_data}->modificationDate();
                 my $stats = $self->stats();  
                 if (defined($stats)) {  
                         $self->{_modification_time} = 0;  
                         if (defined($stats->{"Build date"}->[0]) && $self->{_modification_time} < $stats->{"Build date"}->[0]) {  
                                 $self->{_modification_time} = $stats->{"Build date"}->[0];  
                         } elsif (defined($stats->{"Gap fill date"}->[0]) && $self->{_modification_time} < $stats->{"Gap fill date"}->[0]) {  
                                 $self->{_modification_time} = $stats->{"Gap fill date"}->[0];  
                         }  
                 } else {  
                         $self->{_modification_time} = $self->{_data}->{date}->[0];  
                 }  
         }  
         return $self->{_modification_time};  
844  }  }
845    
846  =head3 gene_reactions  =head3 gene_reactions
# Line 912  Line 851 
851  =cut  =cut
852  sub gene_reactions {  sub gene_reactions {
853          my ($self) = @_;          my ($self) = @_;
854            return ($self->{_data}->reactions() - $self->{_data}->autoCompleteReactions() - $self->{_data}->spontaneousReactions() - $self->{_data}->gapFillReactions());
         if (!defined($self->{_gene_reactions})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_gene_reactions} = $self->total_reactions() - $self->gapfilling_reactions() - $self->stats()->{'Spontaneous'}->[0] - $self->stats()->{'Growmatch reactions'}->[0] - $self->stats()->{'Biolog gap filling reactions'}->[0];  
                 }  
         }  
         return $self->{_gene_reactions};  
855  }  }
856    
857  =head3 total_compounds  =head3 total_compounds
# Line 931  Line 862 
862  =cut  =cut
863  sub total_compounds {  sub total_compounds {
864          my ($self) = @_;          my ($self) = @_;
865            return $self->{_data}->compounds();
         if (!defined($self->{_total_compounds})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_total_compounds} = $self->stats()->{'Metabolites'}->[0];  
                 }  
         }  
         return $self->{_total_compounds};  
866  }  }
867    
868  =head3 gapfilling_reactions  =head3 gapfilling_reactions
# Line 950  Line 873 
873  =cut  =cut
874  sub gapfilling_reactions {  sub gapfilling_reactions {
875          my ($self) = @_;          my ($self) = @_;
876            return ($self->{_data}->autoCompleteReactions()+$self->{_data}->gapFillReactions());
         if (!defined($self->{_gapfilling_reactions})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_gapfilling_reactions} = $self->stats()->{'Gap filling reactions'}->[0];  
                 }  
         }  
         return $self->{_gapfilling_reactions};  
877  }  }
878    
879  =head3 total_reactions  =head3 total_reactions
# Line 969  Line 884 
884  =cut  =cut
885  sub total_reactions {  sub total_reactions {
886          my ($self) = @_;          my ($self) = @_;
887            return $self->{_data}->reactions();
         if (!defined($self->{_total_reactions})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_total_reactions} = $self->stats()->{'Number of reactions'}->[0];  
                 }  
         }  
         return $self->{_total_reactions};  
888  }  }
889    
890  =head3 model_genes  =head3 model_genes
# Line 988  Line 895 
895  =cut  =cut
896  sub model_genes {  sub model_genes {
897          my ($self) = @_;          my ($self) = @_;
898            return $self->{_data}->associatedGenes();
         if (!defined($self->{_model_genes})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->set_metagenome_stats();  
                 } elsif (defined($self->stats())) {  
                         $self->{_model_genes} = $self->stats()->{'Genes with reactions'}->[0];  
                 }  
         }  
         return $self->{_model_genes};  
899  }  }
900    
901  =head3 class  =head3 class
# Line 1007  Line 906 
906  =cut  =cut
907  sub class {  sub class {
908          my ($self) = @_;          my ($self) = @_;
909            return $self->{_data}->cellwalltype();
         if (!defined($self->{_class})) {  
                 if ($self->source() =~ /^MGRAST/) {  
                         $self->{_class} = "Other";  
                 } elsif (defined($self->stats())) {  
                         $self->{_class} = $self->stats()->{Class}->[0];  
                 }  
         }  
         return $self->{_class};  
910  }  }
911    
912  =head3 taxonomy  =head3 taxonomy
# Line 1083  Line 974 
974                          if (defined($self->mgdata())) {                          if (defined($self->mgdata())) {
975                                  $self->{_genome_genes} = $self->mgdata()->genome_contig_count;                                  $self->{_genome_genes} = $self->mgdata()->genome_contig_count;
976                          }                          }
977                  } elsif (defined($self->stats())) {                  } else {
978                          $self->{_genome_genes} = $self->stats()->{'Total genes'}->[0];                          $self->{_genome_genes} = $self->figmodel()->get_genome_stats($self->genome())->{"TOTAL GENES"}->[0];
979                  }                  }
980          }          }
981    
# Line 1125  Line 1016 
1016          return $self->figmodel()->success();          return $self->figmodel()->success();
1017  }  }
1018    
 =head3 save_obsolete_stats  
 Definition:  
         FIGMODELmodel->save_obsolete_stats();  
 Description:  
 =cut  
 sub save_obsolete_stats {  
         my ($self) = @_;  
   
         #checking if stats exists  
         my $stats = $self->stats();  
         if (defined($stats)) {  
                 $stats->{"Model ID"}->[0] = $self->id()."V".$stats->{"Version"}->[0].".".$stats->{"Gap fill version"}->[0];  
                 $self->figmodel()->database()->update_row("OBSOLETE MODEL STATS",$stats,"Model ID");  
                 $stats->{"Model ID"}->[0] = $self->id();  
         }  
 }  
   
1019  =head3 update_stats_for_gap_filling  =head3 update_stats_for_gap_filling
1020  Definition:  Definition:
1021          {string => [string]} = FIGMODELmodel->update_stats_for_gap_filling(int::gapfill time);          {string => [string]} = FIGMODELmodel->update_stats_for_gap_filling(int::gapfill time);
# Line 1149  Line 1023 
1023  =cut  =cut
1024  sub update_stats_for_gap_filling {  sub update_stats_for_gap_filling {
1025          my ($self,$gapfilltime) = @_;          my ($self,$gapfilltime) = @_;
1026            $self->{_data}->autoCompleteTime($gapfilltime);
1027          #preserving the stats for the now obselete model          $self->{_data}->autocompleteDate(time());
1028          $self->save_obsolete_stats();          $self->{_data}->modificationDate(time());
1029          my $stats = $self->update_model_stats(0);          my $version = $self->{_data}->autocompleteVersion();
1030          $stats->{"Gap filling time"}->[0] = $gapfilltime;          $self->{_data}->autocompleteVersion($version+1);
         $stats->{"Gap fill date"}->[0] = time();  
         if (!defined($stats->{"Gap fill version"}->[0])) {  
                 $stats->{"Gap fill version"}->[0] = 0;  
         }  
         $stats->{"Gap fill version"}->[0]++;  
   
         #Updating the stats stored in the table  
         $self->figmodel()->database()->update_row("MODEL STATS",$stats,"Model ID");  
         return $stats;  
1031  }  }
1032    
1033  =head3 update_stats_for_build  =head3 update_stats_for_build
# Line 1172  Line 1037 
1037  =cut  =cut
1038  sub update_stats_for_build {  sub update_stats_for_build {
1039          my ($self) = @_;          my ($self) = @_;
1040            $self->{_data}->builtDate(time());
1041          #preserving the stats for the now obselete model          $self->{_data}->modificationDate(time());
1042          $self->save_obsolete_stats();          my $version = $self->{_data}->version();
1043          my $stats = $self->update_model_stats(0);          $self->{_data}->version($version+1);
         $stats->{"Build date"}->[0] = time();  
         if (!defined($stats->{"Version"}->[0])) {  
                 $stats->{"Version"}->[0] = 0;  
         }  
         $stats->{"Version"}->[0]++;  
   
         #Updating the stats stored in the table  
         $self->figmodel()->database()->update_row("MODEL STATS",$stats,"Model ID");  
         return $stats;  
1044  }  }
1045    
1046  =head3 update_model_stats  =head3 update_model_stats
# Line 1203  Line 1059 
1059          }          }
1060          my $cpdtbl = $self->compound_table();          my $cpdtbl = $self->compound_table();
1061    
1062          #Creating empty status row          #Calculating all necessary stats
         my $CurrentStats = {"Genes with reactions" => [0],  
                                                  "Metabolites" => [$cpdtbl->size()],  
                                                  "Growmatch reactions" => [0],  
                                                  "Spontaneous" => [0],  
                                                  "Biolog gap filling reactions" => [0],  
                                                  "Number of reactions" => [$rxntbl->size()],  
                                                  "Transport reaction"=>[0],  
                                                  "Gap filling reactions" => [0],  
                                                  "Model ID" => [$self->id()],  
                                                  "Subsystem genes with reactions" => [0],  
                                                  "Nonsubsystem genes with reactions" => [0],  
                                                  Version => [0],  
                                                  "Gap fill version" => [0],  
                                                  Source => [$self->source()],  
                                                  "Genes with one reaction" => [0],  
                                                  "Genome ID" => [$self->genome()]};  
   
         my $genomestats = $self->figmodel()->get_genome_stats($self->genome());  
         if (defined($genomestats)) {  
                 $CurrentStats->{SOURCE}->[0] = $genomestats->{SOURCE}->[0];  
                 $CurrentStats->{"Organism name"}->[0] = $genomestats->{NAME}->[0];  
                 $CurrentStats->{"Total genes"}->[0] = $genomestats->{"TOTAL GENES"}->[0];  
                 $CurrentStats->{"Gram positive genes"}->[0] = $genomestats->{"GRAM POSITIVE GENES"}->[0];  
                 $CurrentStats->{"Gram negative genes"}->[0] = $genomestats->{"GRAM NEGATIVE GENES"}->[0];  
                 $CurrentStats->{"Class"}->[0] = $genomestats->{CLASS}->[0];  
                 $CurrentStats->{"Genes with functions"}->[0] = $genomestats->{"GENES WITH FUNCTIONS"}->[0];  
                 $CurrentStats->{"Subsystem genes"}->[0] = $genomestats->{"SUBSYSTEM GENES"}->[0];  
                 $CurrentStats->{"Nonsubsystem genes"}->[0] = $genomestats->{"NON SUBSYSTEM GENES"}->[0];  
                 if (defined($genomestats->{TAXONOMY})) {  
                         $CurrentStats->{"Taxonomy 0"}->[0] = $genomestats->{TAXONOMY}->[0];  
                         $CurrentStats->{"Taxonomy 1"}->[0] = $genomestats->{TAXONOMY}->[1];  
                         $CurrentStats->{"Taxonomy 2"}->[0] = $genomestats->{TAXONOMY}->[2];  
                         $CurrentStats->{"Taxonomy 3"}->[0] = $genomestats->{TAXONOMY}->[3];  
                         $CurrentStats->{"Taxonomy 4"}->[0] = $genomestats->{TAXONOMY}->[4];  
                         $CurrentStats->{"Taxonomy 5"}->[0] = $genomestats->{TAXONOMY}->[5];  
                 }  
         }  
   
         #Transfering build, version, and gap fill data from existing stats  
         if (defined($self->stats())) {  
                 $CurrentStats->{Version}->[0] = $self->stats()->{Version}->[0];  
                 $CurrentStats->{"Gap fill version"}->[0] = $self->stats()->{"Gap fill version"}->[0];  
                 $CurrentStats->{"Gap filling time"}->[0] = $self->stats()->{"Gap filling time"}->[0];  
                 $CurrentStats->{"Gap fill date"}->[0] = $self->stats()->{"Gap fill date"}->[0];  
                 $CurrentStats->{"Build date"}->[0] = $self->stats()->{"Build date"}->[0];  
         }  
   
1063          my %GeneHash;          my %GeneHash;
1064          my %NonpegHash;          my %NonpegHash;
1065          my %CompoundHash;          my %CompoundHash;
1066            my $spontaneousReactions = 0;
1067            my $gapFillReactions = 0;
1068            my $biologReactions = 0;
1069            my $transporters = 0;
1070            my $autoCompleteReactions = 0;
1071            my $associatedSubsystemGenes = 0;
1072          for (my $i=0; $i < $rxntbl->size(); $i++) {          for (my $i=0; $i < $rxntbl->size(); $i++) {
1073                  my $Row = $rxntbl->get_row($i);                  my $Row = $rxntbl->get_row($i);
1074                  if (defined($Row) && defined($Row->{"ASSOCIATED PEG"})) {                  if (defined($Row) && defined($Row->{"ASSOCIATED PEG"})) {
# Line 1261  Line 1076 
1076                          if (defined($ReactionRow->{"EQUATION"}->[0])) {                          if (defined($ReactionRow->{"EQUATION"}->[0])) {
1077                                  #Checking for extracellular metabolites which indicate that this is a transporter                                  #Checking for extracellular metabolites which indicate that this is a transporter
1078                                  if ($ReactionRow->{"EQUATION"}->[0] =~ m/\[e\]/) {                                  if ($ReactionRow->{"EQUATION"}->[0] =~ m/\[e\]/) {
1079                                          $CurrentStats->{"Transport reaction"}->[0]++;                                          $transporters++;
1080                                  }                                  }
1081                          }                          }
1082                          #Identifying spontaneous/biolog/gapfilling/gene associated reactions                          #Identifying spontaneous/biolog/gapfilling/gene associated reactions
1083                          if ($Row->{"ASSOCIATED PEG"}->[0] =~ m/BIOLOG/i) {                          if ($Row->{"ASSOCIATED PEG"}->[0] =~ m/BIOLOG/i) {
1084                                  $CurrentStats->{"Biolog gap filling reactions"}->[0]++;                                  $biologReactions++;
1085                            } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/GROW/i) {
1086                                    $gapFillReactions++;
1087                          } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/SPONTANEOUS/i) {                          } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/SPONTANEOUS/i) {
1088                                  $CurrentStats->{"Spontaneous"}->[0]++;                                  $spontaneousReactions++;
1089                          } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ || $Row->{"ASSOCIATED PEG"}->[0] =~ m/UNIVERSAL/i || $Row->{"ASSOCIATED PEG"}->[0] =~ m/UNKNOWN/i) {                          } elsif ($Row->{"ASSOCIATED PEG"}->[0] =~ m/GAP/ || $Row->{"ASSOCIATED PEG"}->[0] =~ m/UNIVERSAL/i || $Row->{"ASSOCIATED PEG"}->[0] =~ m/UNKNOWN/i) {
1090                                  $CurrentStats->{"Gap filling reactions"}->[0]++;                                  $autoCompleteReactions++;
1091                          } else {                          } else {
1092                                  foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {                                  foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {
1093                                          $_ = $GeneSet;                                          $_ = $GeneSet;
# Line 1288  Line 1105 
1105          }          }
1106          my @genes = keys(%GeneHash);          my @genes = keys(%GeneHash);
1107          my @othergenes = keys(%NonpegHash);          my @othergenes = keys(%NonpegHash);
         $CurrentStats->{"Genes with reactions"}->[0] = @genes + @othergenes;  
1108    
1109          #Updating the stats stored in the table          #Setting the reaction count
1110          $self->figmodel()->database()->update_row("MODEL STATS",$CurrentStats,"Model ID");          $self->{_data}->reactions($rxntbl->size());
1111          $self->{_stats} = $CurrentStats;          #Setting the metabolite count
1112          return $CurrentStats;          $self->{_data}->compounds($rxntbl->size());
1113            #Setting the gene count
1114            my $geneCount = @genes + @othergenes;
1115            $self->{_data}->associatedGenes($geneCount);
1116            #Setting remaining stats
1117            $self->{_data}->spontaneousReactions($spontaneousReactions);
1118            $self->{_data}->gapFillReactions($gapFillReactions);
1119            $self->{_data}->biologReactions($biologReactions);
1120            $self->{_data}->transporters($transporters);
1121            $self->{_data}->autoCompleteReactions($autoCompleteReactions);
1122            $self->{_data}->associatedSubsystemGenes($associatedSubsystemGenes);
1123            #Setting the model class
1124            my $class = "";
1125            for (my $i=0; $i < @{$self->figmodel()->config("class list")}; $i++) {
1126                    if (defined($self->figmodel()->config($self->figmodel()->config("class list")->[$i]))) {
1127                            if (defined($self->figmodel()->config($self->figmodel()->config("class list")->[$i])->{$self->id()})) {
1128                                    $class = $self->figmodel()->config("class list")->[$i];
1129                                    last;
1130                            }
1131                            if ($class eq "" && defined($self->figmodel()->config($self->figmodel()->config("class list")->[$i])->{$self->genome()})) {
1132                                    $class = $self->figmodel()->config("class list")->[$i];
1133                            }
1134                    }
1135            }
1136            if ($class eq "") {
1137                    $class = $self->figmodel()->get_genome_stats($self->genome())->{CLASS}->[0];
1138            }
1139            if ($class eq "") {
1140                    $class = "unknown";
1141            }
1142            $self->{_data}->cellwalltype($class);
1143  }  }
1144    
1145  =head3 GapFillModel  =head3 GapFillModel
# Line 1940  Line 1786 
1786          }          }
1787    
1788          #Checking if a biomass reaction already exists          #Checking if a biomass reaction already exists
1789          my $BiomassReactionRow = $self->figmodel()->database()->get_row_by_key("BIOMASS TABLE",$self->id(),"MODELS");          my $BiomassReactionRow = $self->BuildSpecificBiomassReaction();
         if (!defined($BiomassReactionRow)) {  
                 $BiomassReactionRow = $self->BuildSpecificBiomassReaction();  
1790                  if (!defined($BiomassReactionRow)) {                  if (!defined($BiomassReactionRow)) {
1791                          $self->set_status(-2,"Preliminary reconstruction failed: could not generate biomass reaction");                          $self->set_status(-2,"Preliminary reconstruction failed: could not generate biomass reaction");
1792                          $self->figmodel()->error_message("FIGMODEL:CreateModelReactionList: Could not generate biomass function for ".$self->id()."!");                          $self->figmodel()->error_message("FIGMODEL:CreateModelReactionList: Could not generate biomass function for ".$self->id()."!");
1793                          return $self->fail();                          return $self->fail();
1794                  }                  }
         }  
1795          my $ReactionList = $BiomassReactionRow->{"ESSENTIAL REACTIONS"};          my $ReactionList = $BiomassReactionRow->{"ESSENTIAL REACTIONS"};
1796          push(@{$ReactionList},$BiomassReactionRow->{DATABASE}->[0]);          push(@{$ReactionList},$BiomassReactionRow->{DATABASE}->[0]);
1797    
# Line 2178  Line 2021 
2021  sub ArchiveModel {  sub ArchiveModel {
2022          my ($self) = @_;          my ($self) = @_;
2023    
         #Making sure the model exists  
         if (!defined($self->stats())) {  
                 $self->figmodel()->error_message("FIGMODEL:ArchiveModel: Could not find specified ".$self->id()." in database!");  
                 return $self->fail();  
         }  
   
2024          #Checking that the model file exists          #Checking that the model file exists
2025          if (!(-e $self->filename())) {          if (!(-e $self->filename())) {
2026                  $self->figmodel()->error_message("FIGMODEL:ArchiveModel: Model file ".$self->filename()." not found!");                  $self->figmodel()->error_message("FIGMODEL:ArchiveModel: Model file ".$self->filename()." not found!");
# Line 3588  Line 3425 
3425          my $OrganismID = $self->genome();          my $OrganismID = $self->genome();
3426          #Checking for a biomass override          #Checking for a biomass override
3427          if (defined($self->config("biomass reaction override")->{$OrganismID})) {          if (defined($self->config("biomass reaction override")->{$OrganismID})) {
3428                  $biomassrxn = $self->config("biomass reaction override")->{$OrganismID};                  my $biomassID = $self->config("biomass reaction override")->{$OrganismID};
3429                  print "Overriding biomass template and selecting ".$biomassrxn." for ".$OrganismID.".\n";                  my $tbl = $self->database()->get_table("BIOMASS",1);
3430                    $biomassrxn = $tbl->get_row_by_key($biomassID,"DATABASE");
3431                    print "Overriding biomass template and selecting ".$biomassID." for ".$OrganismID.".\n";
3432          } else {#Creating biomass reaction from the template          } else {#Creating biomass reaction from the template
3433                  #Getting the genome stats                  #Getting the genome stats
3434                  my $genomestats = $self->figmodel()->get_genome_stats($self->genome());                  my $genomestats = $self->figmodel()->get_genome_stats($self->genome());
# Line 3880  Line 3719 
3719    
3720                  #Adding the biomass equation to the biomass table                  #Adding the biomass equation to the biomass table
3721                  my $NewRow = $self->figmodel()->add_biomass_reaction($Equation,$self->id(),"Template:".$self->genome());                  my $NewRow = $self->figmodel()->add_biomass_reaction($Equation,$self->id(),"Template:".$self->genome());
3722                  $biomassrxn = $NewRow->{DATABASE}->[0];                  $biomassrxn = $NewRow;
                 print $biomassrxn."\n";  
3723          }          }
3724          print $biomassrxn."\n";          return $biomassrxn;
         my $BiomassRow = $self->figmodel()->add_model_to_biomass_reaction($biomassrxn,$self->id());  
         return $BiomassRow;  
3725  }  }
3726    
3727  =head3 PrintSBMLFile  =head3 PrintSBMLFile
# Line 4172  Line 4008 
4008          close(SBMLOUTPUT);          close(SBMLOUTPUT);
4009  }  }
4010    
4011    =head3 PrintModelSimpleReactionTable
4012    Definition:
4013            success()/fail() FIGMODELmodel->PrintModelSimpleReactionTable();
4014    Description:
4015            Prints the table of model data
4016    =cut
4017    sub PrintModelSimpleReactionTable {
4018            my ($self) = @_;
4019    
4020            my $rxntbl = $self->reaction_table();
4021            my $tbl = $self->create_table_prototype("ModelSimpleReactionTable");
4022            for (my $i=0; $i < $rxntbl->size(); $i++) {
4023                    my $row = $rxntbl->get_row($i);
4024                    $row->{DATABASE} = $row->{LOAD};
4025                    $tbl->add_row($row);
4026            }
4027            $tbl->save();
4028            system("cp ".$tbl->filename()." ".$self->figmodel()->config("Model table download directory")->[0].$self->figmodel()->config("ModelSimpleReactionTable")->{filename_prefix}->[0]."-".$self->id().".txt");
4029    }
4030    
4031  =head3 PrintModelLPFile  =head3 PrintModelLPFile
4032  Definition:  Definition:
4033          success()/fail() FIGMODELmodel->PrintModelLPFile();          success()/fail() FIGMODELmodel->PrintModelLPFile();
# Line 4368  Line 4224 
4224          my ($self,$feature) = @_;          my ($self,$feature) = @_;
4225    
4226          #First checking if the feature is in the model          #First checking if the feature is in the model
4227            my $featureGenome = $feature->{GENOME}->[0];
4228            if ($feature->{GENOME}->[0] =~ m/\>(\d+\.\d+)\</) {
4229                    $featureGenome = $1;
4230            }
4231            if ($featureGenome ne $self->genome()) {
4232                    return "Not in model";
4233            }
4234          my $data = $self->get_feature_data($feature->{ID}->[0]);          my $data = $self->get_feature_data($feature->{ID}->[0]);
4235          if (!defined($data)) {          if (!defined($data)) {
4236                  return "Not in model";                  return "Not in model";
# Line 4447  Line 4310 
4310          return join("<br>",@{$output});          return join("<br>",@{$output});
4311  }  }
4312    
4313    =head3 remove_obsolete_reactions
4314    Definition:
4315            void FIGMODELmodel->remove_obsolete_reactions();
4316    Description:
4317    =cut
4318    sub remove_obsolete_reactions {
4319            my ($self) = @_;
4320    
4321            (my $dummy,my $translation) = $self->figmodel()->put_two_column_array_in_hash($self->figmodel()->database()->load_multiple_column_file($self->figmodel()->config("Translation directory")->[0]."ObsoleteRxnIDs.txt","\t"));
4322            my $rxnTbl = $self->reaction_table();
4323            if (defined($rxnTbl)) {
4324                    for (my $i=0; $i < $rxnTbl->size(); $i++) {
4325                            my $row = $rxnTbl->get_row($i);
4326                            if (defined($translation->{$row->{LOAD}->[0]}) || defined($translation->{$row->{LOAD}->[0]."r"})) {
4327                                    my $direction = $row->{DIRECTION}->[0];
4328                                    my $newRxn;
4329                                    if (defined($translation->{$row->{LOAD}->[0]."r"})) {
4330                                            $newRxn = $translation->{$row->{LOAD}->[0]."r"};
4331                                            if ($direction eq "<=") {
4332                                                    $direction = "=>";
4333                                            } elsif ($direction eq "=>") {
4334                                                    $direction = "<=";
4335                                            }
4336                                    } else {
4337                                            $newRxn = $translation->{$row->{LOAD}->[0]};
4338                                    }
4339                                    #Checking if the new reaction is already in the model
4340                                    my $newRow = $rxnTbl->get_row_by_key($newRxn,"LOAD");
4341                                    if (defined($newRow)) {
4342                                            #Handling direction
4343                                            if ($newRow->{DIRECTION}->[0] ne $direction) {
4344                                                    $newRow->{DIRECTION}->[0] = "<=>";
4345                                            }
4346                                            push(@{$row->{"ASSOCIATED PEG"}},@{$rxnTbl->get_row($i)->{"ASSOCIATED PEG"}});
4347                                    } else {
4348                                            $rxnTbl->get_row($i)->{LOAD}->[0] = $newRxn;
4349                                            $rxnTbl->get_row($i)->{DIRECTION}->[0] = $direction;
4350                                    }
4351                            }
4352                    }
4353                    $rxnTbl->save();
4354            }
4355    }
4356    
4357  1;  1;

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3