[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.7, Sat Mar 20 19:01:29 2010 UTC revision 1.13, Mon May 10 21:45:44 2010 UTC
# Line 130  Line 130 
130          return $self->{"_fig"};          return $self->{"_fig"};
131  }  }
132    
133    =head3 aquireModelLock
134    
135    Definition:
136    
137            FIGMODELmodel->aquireModelLock();
138    
139    Description:
140    
141            Locks the database for alterations relating to the current model object
142    
143    =cut
144    sub aquireModelLock {
145            my ($self) = @_;
146            $self->figmodel()->database()->genericLock($self->id());
147    }
148    
149    =head3 releaseModelLock
150    
151    Definition:
152    
153            FIGMODELmodel->releaseModelLock();
154    
155    Description:
156    
157            Unlocks the database for alterations relating to the current model object
158    
159    =cut
160    sub releaseModelLock {
161            my ($self) = @_;
162            $self->figmodel()->database()->genericUnlock($self->id());
163    }
164    
165  =head3 mgdata  =head3 mgdata
166  Definition:  Definition:
167          FIGMODEL = FIGMODELmodel->mgdata();          FIGMODEL = FIGMODELmodel->mgdata();
# Line 241  Line 273 
273                  my $ClassRow = $self->{_reaction_classes}->get_row_by_key($reaction,"REACTION");                  my $ClassRow = $self->{_reaction_classes}->get_row_by_key($reaction,"REACTION");
274                  if (defined($ClassRow) && defined($ClassRow->{CLASS})) {                  if (defined($ClassRow) && defined($ClassRow->{CLASS})) {
275                          my $class;                          my $class;
276                            my $min = $ClassRow->{MIN}->[0];
277                            my $max = $ClassRow->{MAX}->[0];
278                          if ($ClassRow->{CLASS}->[0] eq "Positive") {                          if ($ClassRow->{CLASS}->[0] eq "Positive") {
279                                  $class = "Essential =>";                                  $class = "Essential =>";
280                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
281                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative") {
282                                  $class = "Essential <=";                                  $class = "Essential <=";
283                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
284                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Positive variable") {
285                                  $class = "Active =>";                                  $class = "Active =>";
286                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
287                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Negative variable") {
288                                  $class = "Active <=";                                  $class = "Active <=";
289                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
290                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Variable") {
291                                  $class = "Active <=>";                                  $class = "Active <=>";
292                                    $class.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
293                          } elsif ($ClassRow->{CLASS}->[0] eq "Blocked") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Blocked") {
294                                  $class = "Inactive";                                  $class = "Inactive";
295                          } elsif ($ClassRow->{CLASS}->[0] eq "Dead") {                          } elsif ($ClassRow->{CLASS}->[0] eq "Dead") {
296                                  $class = "Disconnected";                                  $class = "Disconnected";
297                          }                          }
298    
299                          if (!defined($nohtml) || $nohtml ne "1") {                          if (!defined($nohtml) || $nohtml ne "1") {
300                                  $class = "<span title=\"Flux:".$ClassRow->{MIN}->[0]." to ".$ClassRow->{MAX}->[0]."\">".$class."</span>";                                  $class = "<span title=\"Flux:".$min." to ".$max."\">".$class."</span>";
301                          }                          }
302    
303                          return $class;                          return $class;
304                  }                  }
305                  return undef;                  return undef;
# Line 279  Line 320 
320                                  $classstring .= "<br>";                                  $classstring .= "<br>";
321                          }                          }
322                          my $NewClass;                          my $NewClass;
323                            my $min = $ClassRow->{MIN}->[$i];
324                            my $max = $ClassRow->{MAX}->[$i];
325                          if ($ClassRow->{CLASS}->[$i] eq "Positive") {                          if ($ClassRow->{CLASS}->[$i] eq "Positive") {
326                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential =>";
327                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
328                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative") {
329                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Essential <=";
330                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
331                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Positive variable") {
332                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active =>";
333                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
334                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Negative variable") {
335                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=";
336                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
337                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Variable") {
338                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Active <=>";
339                                  if (!defined($nohtml) || $nohtml ne "1") {                                  $NewClass.="<br>[Flux: ".sprintf("%.3g",$min)." to ".sprintf("%.3g",$max)."]<br>";
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
340                          } elsif ($ClassRow->{CLASS}->[$i] eq "Blocked") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Blocked") {
341                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Inactive";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Inactive";
                                 if (!defined($nohtml) || $nohtml ne "1") {  
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
                                 }  
342                          } elsif ($ClassRow->{CLASS}->[$i] eq "Dead") {                          } elsif ($ClassRow->{CLASS}->[$i] eq "Dead") {
343                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Disconnected";                                  $NewClass = $ClassRow->{MEDIA}->[$i].":Disconnected";
                                 if (!defined($nohtml) || $nohtml ne "1") {  
                                         $NewClass = "<span title=\"Flux:".$ClassRow->{MIN}->[$i]." to ".$ClassRow->{MAX}->[$i]."\">".$NewClass."</span>";  
344                                  }                                  }
345    
346                            if (!defined($nohtml) || $nohtml ne "1") {
347                                    $NewClass = "<span title=\"Flux:".$min." to ".$max."\">".$NewClass."</span>";
348                          }                          }
349                          $classstring .= $NewClass;                          $classstring .= $NewClass;
350                  }                  }
# Line 377  Line 408 
408          return $Data->{LOAD}->[0];          return $Data->{LOAD}->[0];
409  }  }
410    
411    =head3 load_model_table
412    
413    Definition: FIGMODELTable = FIGMODELmodel->load_model_table(string:table name,0/1:refresh the table));
414    
415    Description: Returns the table specified by the input filename. Table will be stored in a file in the model directory.
416    
417    =cut
418    sub load_model_table {
419            my ($self,$name,$refresh) = @_;
420            if (!defined($refresh)) {
421                    $refresh = 1;
422            }
423            if ($refresh == 1) {
424                    delete $self->{"_".$name};
425            }
426            if (!defined($self->{"_".$name})) {
427                    my $tbldef = $self->figmodel()->config("$name");
428                    if (!defined($tbldef)) {
429                            return undef;
430                    }
431                    my $filename = $self->directory().$name."-".$self->id().$self->selected_version().".tbl";
432                    $self->{"_".$name} = $self->figmodel()->database()->load_table($filename,"\t","|",$tbldef->{headingline}->[0],$tbldef->{hashcolumns});
433                    if (!defined($self->{"_".$name})) {
434                            if (defined($tbldef->{prefix})) {
435                                    $self->{"_".$name} = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},"\t","|",join(@{$tbldef->{prefix}},"\n"));
436                            } else {
437                                    $self->{"_".$name} = FIGMODELTable->new($tbldef->{columns},$filename,$tbldef->{hashcolumns},"\t","|");
438                            }
439                    }
440            }
441            return $self->{"_".$name};
442    }
443    
444  =head3 get_reaction_number  =head3 get_reaction_number
445  Definition:  Definition:
446          int = FIGMODELmodel->get_reaction_number();          int = FIGMODELmodel->get_reaction_number();
# Line 404  Line 468 
468    
469          if (!defined($self->{_reaction_data})) {          if (!defined($self->{_reaction_data})) {
470                  $self->{_reaction_data} = $self->figmodel()->database()->GetDBModel($self->id());                  $self->{_reaction_data} = $self->figmodel()->database()->GetDBModel($self->id());
471                    my $classTbl = $self->reaction_class_table();
472                    for (my $i=0; $i < $classTbl->size(); $i++) {
473                            my $row = $classTbl->get_row($i);
474                            my $rxnRow = $self->{_reaction_data}->get_row_by_key($row->{"REACTION"}->[0],"LOAD");
475                            for (my $j=0; $j < @{$row->{MEDIA}};$j++) {
476                                    my $class = "Active <=>";
477                                    if ($row->{CLASS}->[$j] eq "Positive") {
478                                            $class = "Essential =>";
479                                    } elsif ($row->{CLASS}->[$j] eq "Negative") {
480                                            $class = "Essential <=";
481                                    } elsif ($row->{CLASS}->[$j] eq "Blocked") {
482                                            $class = "Inactive";
483                                    } elsif ($row->{CLASS}->[$j] eq "Positive variable") {
484                                            $class = "Active =>";
485                                    } elsif ($row->{CLASS}->[$j] eq "Negative variable") {
486                                            $class = "Active <=";
487                                    } elsif ($row->{CLASS}->[$j] eq "Variable") {
488                                            $class = "Active <=>";
489                                    } elsif ($row->{CLASS}->[$j] eq "Dead") {
490                                            $class = "Dead";
491                                    }
492                                    push(@{$rxnRow->{PREDICTIONS}},$row->{MEDIA}->[$j].":".$class);
493                            }
494                    }
495          }          }
496    
497          return $self->{_reaction_data};          return $self->{_reaction_data};
498  }  }
499    
500    =head3 feature_table
501    Definition:
502            FIGMODELTable = FIGMODELmodel->feature_table();
503    Description:
504            Returns FIGMODELTable with the feature list for the model
505    =cut
506    sub feature_table {
507            my ($self) = @_;
508    
509            if (!defined($self->{_feature_data})) {
510                    #Getting the genome feature list
511                    my $FeatureTable = $self->figmodel()->GetGenomeFeatureTable($self->genome());
512                    if (!defined($FeatureTable)) {
513                            print STDERR "FIGMODELmodel:feature_table:Could not get features for genome ".$self->genome()." in database!";
514                            return undef;
515                    }
516                    #Getting the reaction table for the model
517                    my $rxnTable = $self->reaction_table();
518                    if (!defined($rxnTable)) {
519                    print STDERR "FIGMODELmodel:feature_table:Could not get reaction table for model ".$self->id()." in database!";
520                            return undef;
521                }
522                    #Cloning the feature table
523                    $self->{_feature_data} = $FeatureTable->clone_table_def();
524                    $self->{_feature_data}->add_headings(($self->id()."REACTIONS",$self->id()."PREDICTIONS"));
525                for (my $i=0; $i < $rxnTable->size(); $i++) {
526                    my $Row = $rxnTable->get_row($i);
527                    if (defined($Row) && defined($Row->{"ASSOCIATED PEG"})) {
528                            foreach my $GeneSet (@{$Row->{"ASSOCIATED PEG"}}) {
529                                    my $temp = $GeneSet;
530                                    $temp =~ s/\+/|/g;
531                                    $temp =~ s/\sAND\s/|/gi;
532                                    $temp =~ s/\sOR\s/|/gi;
533                                    $temp =~ s/[\(\)\s]//g;
534                                    my @GeneList = split(/\|/,$temp);
535                                    foreach my $Gene (@GeneList) {
536                                    my $FeatureRow = $self->{_feature_data}->get_row_by_key("fig|".$self->genome().".".$Gene,"ID");
537                                                    if (!defined($FeatureRow)) {
538                                                            $FeatureRow = $FeatureTable->get_row_by_key("fig|".$self->genome().".".$Gene,"ID");
539                                                            if (defined($FeatureRow)) {
540                                                                    $self->{_feature_data}->add_row($FeatureRow);
541                                                            }
542                                                    }
543                                                    if (defined($FeatureRow)) {
544                                                            $self->{_feature_data}->add_data($FeatureRow,$self->id()."REACTIONS",$Row->{"LOAD"}->[0],1);
545                                                    }
546                                    }
547                            }
548                    }
549                }
550                #Loading predictions
551                my @files = glob($self->directory()."EssentialGenes-".$self->id()."-*");
552                foreach my $file (@files) {
553                    if ($file =~ m/\-([^\-]+)\.tbl/) {
554                            my $media = $1;
555                            my $list = $self->figmodel()->database()->load_single_column_file($file,"");
556                            my $hash;
557                            foreach my $gene (@{$list}) {
558                                    $hash->{$gene} = 1;
559                            }
560                            for (my $i=0; $i < $self->{_feature_data}->size(); $i++) {
561                                    my $Row = $self->{_feature_data}->get_row($i);
562                                    if ($Row->{ID}->[0] =~ m/(peg\.\d+)/) {
563                                            my $gene = $1;
564                                            if (defined($hash->{$gene})) {
565                                                    push(@{$Row->{$self->id()."PREDICTIONS"}},$media.":essential");
566                                            } else {
567                                                    push(@{$Row->{$self->id()."PREDICTIONS"}},$media.":nonessential");
568                                            }
569                                    }
570                            }
571                    }
572                }
573            }
574            return $self->{_feature_data};
575    }
576    
577  =head3 reaction_class_table  =head3 reaction_class_table
578  Definition:  Definition:
579          FIGMODELTable = FIGMODELmodel->reaction_class_table();          FIGMODELTable = FIGMODELmodel->reaction_class_table();
# Line 489  Line 654 
654    
655  =head3 get_compound_data  =head3 get_compound_data
656  Definition:  Definition:
657          string = FIGMODELmodel->get_compound_data(string::compound ID);          {string:key=>[string]:values} = FIGMODELmodel->get_compound_data(string::compound ID);
658  Description:  Description:
659          Returns model compound data          Returns model compound data
660  =cut  =cut
# Line 500  Line 665 
665                  return undef;                  return undef;
666          }          }
667          if ($compound =~ m/^\d+$/) {          if ($compound =~ m/^\d+$/) {
668                  $self->compound_table()->get_row($compound);                  return $self->compound_table()->get_row($compound);
669          }          }
670          return $self->compound_table()->get_row_by_key($compound,"DATABASE");          return $self->compound_table()->get_row_by_key($compound,"DATABASE");
671  }  }
672    
673    =head3 get_feature_data
674    Definition:
675            {string:key=>[string]:values} = FIGMODELmodel->get_feature_data(string::feature ID);
676    Description:
677            Returns model feature data
678    =cut
679    sub get_feature_data {
680            my ($self,$feature) = @_;
681            if (!defined($self->feature_table())) {
682                    return undef;
683            }
684            if ($feature =~ m/^\d+$/) {
685                    return $self->feature_table()->get_row($feature);
686            }
687            if ($feature =~ m/(peg\.\d+)/) {
688                    $feature = $1;
689            }
690            return $self->feature_table()->get_row_by_key("fig|".$self->genome().".".$feature,"ID");
691    }
692    
693  =head3 genome  =head3 genome
694  Definition:  Definition:
695          string = FIGMODELmodel->genome();          string = FIGMODELmodel->genome();
# Line 1160  Line 1345 
1345                          }                          }
1346                  }                  }
1347                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  $MediaTable->save($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1348                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),$UniqueFilename."TestMedia",["GapFilling"],{"Default max drain flux" => 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));
1349                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");                  unlink($self->config("Media directory")->[0].$UniqueFilename."TestMedia.txt");
1350          } else {          } else {
1351                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id(),undef,["GapFilling"],undef,"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));
1352          }          }
1353    
1354          #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
# Line 1230  Line 1415 
1415          return $self->success();          return $self->success();
1416  }  }
1417    
1418  =head3 datagapfill  =head3 GapGenModel
1419  Definition:  Definition:
1420          success()/fail() = FIGMODELmodel->datagapfill();          FIGMODELmodel->GapGenModel();
1421  Description:  Description:
1422          Run gapfilling on the input run specifications          Runs the gap generation algorithm to correct a single false positive prediction. Results are loaded into a table.
1423  =cut  =cut
1424  sub datagapfill {  
1425          my ($self,$GapFillingRunSpecs,$TansferFileSuffix) = @_;  sub GapGenModel {
1426          my $UniqueFilename = $self->figmodel()->filename();          my ($self,$Media,$KOList,$NoKOList,$Experiment,$SolutionLimit) = @_;
1427          if (defined($GapFillingRunSpecs) && @{$GapFillingRunSpecs} > 0) {  
1428                  system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id().$self->selected_version(),"NoBounds",["DataGapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0],"Gap filling runs" => join(";",@{$GapFillingRunSpecs})},"GapFilling-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,undef));          #Enforcing nonoptional arguments
1429                  #Checking that the solution exists          if (!defined($Media)) {
                 if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt") {  
                         $self->figmodel()->error_message("FIGMODEL:GapFillingAlgorithm: Could not find MFA output file!");  
                         $self->figmodel()->database()->print_array_to_file($self->directory().$self->id().$self->selected_version()."-GFS.txt",["Experiment;Solution index;Solution cost;Solution reactions"]);  
1430                          return undef;                          return undef;
1431                  }                  }
1432                  my $GapFillResultTable = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt",";","",0,undef);          if (!defined($KOList)) {
1433                  if (defined($TansferFileSuffix)) {                  $KOList->[0] = "none";
                         system("cp ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt ".$self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt");  
1434                  }                  }
1435                  #If the system is not configured to preserve all logfiles, then the mfatoolkit output folder is deleted          if (!defined($NoKOList)) {
1436                  $self->figmodel()->clearing_output($UniqueFilename,"GapFilling-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");                  $NoKOList->[0] = "none";
                 return $GapFillResultTable;  
1437          }          }
1438          if (defined($TansferFileSuffix)) {          if (!defined($Experiment)) {
1439                  $self->figmodel()->database()->print_array_to_file($self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt",["Experiment;Solution index;Solution cost;Solution reactions"]);                  $Experiment= "ReactionKO";
1440          }          }
1441          return undef;          if (!defined($SolutionLimit)) {
1442                    $SolutionLimit = "10";
1443  }  }
1444    
1445  =head3 datagapgen          #Translating the KO lists into arrays
1446  Definition:          if (ref($KOList) ne "ARRAY") {
1447          $model->datagapgen($NumberOfProcessors,$ProcessorIndex,$Filename);                  my $temp = $KOList;
1448  =cut                  $KOList = ();
1449                    push(@{$KOList},split(/[,;]/,$temp));
1450            }
1451            my $noKOHash;
1452            if (defined($NoKOList) && ref($NoKOList) ne "ARRAY") {
1453                    my $temp = $NoKOList;
1454                    $NoKOList = ();
1455                    push(@{$NoKOList},split(/[,;]/,$temp));
1456                    foreach my $rxn (@{$NoKOList}) {
1457                            $noKOHash->{$rxn} = 1;
1458                    }
1459            }
1460    
1461  sub datagapgen {          #Checking if solutions exist for the input parameters
1462          my ($self,$Media,$KOList,$NoKOList,$suffix) = @_;          $self->aquireModelLock();
1463          #Setting default values for inputs          my $tbl = $self->load_model_table("GapGenSolutions");
1464          if (!defined($NoKOList)) {          my $solutionRow = $tbl->get_table_by_key($Experiment,"Experiment")->get_table_by_key($Media,"Media")->get_row_by_key(join(",",@{$KOList}),"KOlist");
1465                  $NoKOList = "none";          my $solutions;
1466            if (defined($solutionRow)) {
1467                    #Checking if any solutions conform to the no KO list
1468                    foreach my $solution (@{$solutionRow->{Solutions}}) {
1469                            my @reactions = split(/,/,$solution);
1470                            my $include = 1;
1471                            foreach my $rxn (@reactions) {
1472                                    if ($rxn =~ m/(rxn\d\d\d\d\d)/) {
1473                                            if (defined($noKOHash->{$1})) {
1474                                                    $include = 0;
1475                                            }
1476                                    }
1477                            }
1478                            if ($include == 1) {
1479                                    push(@{$solutions},$solution);
1480          }          }
         if (!defined($KOList)) {  
                 $KOList = "none";  
1481          }          }
1482            } else {
1483                    $solutionRow = {Media => [$Media],Experiment => [$Experiment],KOlist => [join(",",@{$KOList})]};
1484                    $tbl->add_row($solutionRow);
1485                    $self->figmodel()->database()->save_table($tbl);
1486            }
1487            $self->releaseModelLock();
1488    
1489            #Returning solution list of solutions were found
1490            if (defined($solutions) && @{$solutions} > 0) {
1491                    return $solutions;
1492            }
1493    
1494          #Getting unique filename          #Getting unique filename
1495          my $Filename = $self->figmodel()->filename();          my $Filename = $self->figmodel()->filename();
1496          if (!defined($suffix)) {  
                 $suffix = "-".$Media."-".$KOList."-S";  
         }  
         $KOList =~ s/,/;/g;  
         $NoKOList =~ s/,/;/g;  
1497          #Running the gap generation          #Running the gap generation
1498          system($self->figmodel()->GenerateMFAToolkitCommandLineCall($Filename,$self->id().$self->selected_version(),$Media,["GapGeneration"],{"Reactions that should always be active" => $NoKOList,"Reactions to knockout" => $KOList,"Reactions that are always blocked" => "none"},"Gapgeneration-".$self->id().$self->selected_version()."-".$Filename.".log",undef,undef));          system($self->figmodel()->GenerateMFAToolkitCommandLineCall($Filename,$self->id().$self->selected_version(),$Media,["GapGeneration"],{"Recursive MILP solution limit" => $SolutionLimit ,"Reactions that should always be active" => join(";",@{$NoKOList}),"Reactions to knockout" => join(";",@{$KOList}),"Reactions that are always blocked" => "none"},"Gapgeneration-".$self->id().$self->selected_version()."-".$Filename.".log",undef,undef));
1499          my $ProblemReport = $self->figmodel()->LoadProblemReport($Filename);          my $ProblemReport = $self->figmodel()->LoadProblemReport($Filename);
1500          if (!defined($ProblemReport)) {          if (!defined($ProblemReport)) {
1501                  $self->figmodel()->error_message("FIGMODEL:GapGenerationAlgorithm;No problem report;".$Filename.";".$self->id().$self->selected_version().";".$Media.";".$KOList.";".$NoKOList);                  $self->figmodel()->error_message("FIGMODEL:GapGenerationAlgorithm;No problem report;".$Filename.";".$self->id().$self->selected_version().";".$Media.";".$KOList.";".$NoKOList);
1502                  return undef;                  return undef;
1503          }          }
1504    
1505          #Clearing the output folder and log file          #Clearing the output folder and log file
1506          $self->figmodel()->clearing_output($Filename,$self->directory()."Gapgeneration-".$self->id().$self->selected_version()."-".$Filename.".log");          $self->figmodel()->clearing_output($Filename,"Gapgeneration-".$self->id().$self->selected_version()."-".$Filename.".log");
1507          #Scheduling the testing of this gap filling solution  
1508          my $Tbl = FIGMODELTable->new(["Experiment","Solution index","Solution cost","Solution reactions"],$self->directory().$self->id().$self->selected_version()."-GG".$suffix.".txt",undef,";","|",undef);          #Saving the solution
1509            $self->aquireModelLock();
1510            $tbl = $self->load_model_table("GapGenSolutions");
1511            $solutionRow = $tbl->get_table_by_key($Experiment,"Experiment")->get_table_by_key($Media,"Media")->get_row_by_key(join(",",@{$KOList}),"KOlist");
1512          for (my $j=0; $j < $ProblemReport->size(); $j++) {          for (my $j=0; $j < $ProblemReport->size(); $j++) {
1513                  if ($ProblemReport->get_row($j)->{"Notes"}->[0] =~ m/^Recursive\sMILP\s([^)]+)/) {                  if ($ProblemReport->get_row($j)->{"Notes"}->[0] =~ m/^Recursive\sMILP\s([^)]+)/) {
1514                          my @SolutionList = split(/\|/,$1);                          my @SolutionList = split(/\|/,$1);
1515                          for (my $k=0; $k < @SolutionList; $k++) {                          for (my $k=0; $k < @SolutionList; $k++) {
1516                                  if ($SolutionList[$k] =~ m/(\d+):(.+)/) {                                  if ($SolutionList[$k] =~ m/(\d+):(.+)/) {
1517                                          $Tbl->add_row({"Experiment"=>[$Media],"Solution index"=>[$k],"Solution cost"=>[$1],"Solution reactions"=>[$2]});                                          push(@{$solutionRow->{Solutions}},$2);
1518                                            push(@{$solutions},$2);
1519                                  }                                  }
1520                          }                          }
1521                  }                  }
1522          }          }
1523          return $Tbl;          $self->figmodel()->database()->save_table($tbl);
1524            $self->releaseModelLock();
1525    
1526            return $solutions;
1527    }
1528    
1529    =head3 datagapfill
1530    Definition:
1531            success()/fail() = FIGMODELmodel->datagapfill();
1532    Description:
1533            Run gapfilling on the input run specifications
1534    =cut
1535    sub datagapfill {
1536            my ($self,$GapFillingRunSpecs,$TansferFileSuffix) = @_;
1537            my $UniqueFilename = $self->figmodel()->filename();
1538            if (defined($GapFillingRunSpecs) && @{$GapFillingRunSpecs} > 0) {
1539                    system($self->figmodel()->GenerateMFAToolkitCommandLineCall($UniqueFilename,$self->id().$self->selected_version(),"NoBounds",["DataGapFilling"],{"Reactions to knockout" => $self->config("permanently knocked out reactions")->[0],"Gap filling runs" => join(";",@{$GapFillingRunSpecs})},"GapFilling-".$self->id().$self->selected_version()."-".$UniqueFilename.".log",undef,undef));
1540                    #Checking that the solution exists
1541                    if (!-e $self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt") {
1542                            $self->figmodel()->error_message("FIGMODEL:GapFillingAlgorithm: Could not find MFA output file!");
1543                            $self->figmodel()->database()->print_array_to_file($self->directory().$self->id().$self->selected_version()."-GFS.txt",["Experiment;Solution index;Solution cost;Solution reactions"]);
1544                            return undef;
1545                    }
1546                    my $GapFillResultTable = $self->figmodel()->database()->load_table($self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt",";","",0,undef);
1547                    if (defined($TansferFileSuffix)) {
1548                            system("cp ".$self->config("MFAToolkit output directory")->[0].$UniqueFilename."/GapFillingSolutionTable.txt ".$self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt");
1549                    }
1550                    #If the system is not configured to preserve all logfiles, then the mfatoolkit output folder is deleted
1551                    $self->figmodel()->clearing_output($UniqueFilename,"GapFilling-".$self->id().$self->selected_version()."-".$UniqueFilename.".log");
1552                    return $GapFillResultTable;
1553            }
1554            if (defined($TansferFileSuffix)) {
1555                    $self->figmodel()->database()->print_array_to_file($self->directory().$self->id().$self->selected_version()."-".$TansferFileSuffix.".txt",["Experiment;Solution index;Solution cost;Solution reactions"]);
1556            }
1557            return undef;
1558  }  }
1559    
1560  =head3 TestSolutions  =head3 TestSolutions
# Line 1690  Line 1941 
1941          }          }
1942    
1943          #Checking if a biomass reaction already exists          #Checking if a biomass reaction already exists
1944          my $BiomassReactionRow = $self->figmodel()->database()->get_row_by_key("BIOMASS TABLE",$self->id(),"MODELS");          my $BiomassReactionRow = $self->BuildSpecificBiomassReaction();
         if (!defined($BiomassReactionRow)) {  
                 $BiomassReactionRow = $self->BuildSpecificBiomassReaction();  
1945                  if (!defined($BiomassReactionRow)) {                  if (!defined($BiomassReactionRow)) {
1946                          $self->set_status(-2,"Preliminary reconstruction failed: could not generate biomass reaction");                          $self->set_status(-2,"Preliminary reconstruction failed: could not generate biomass reaction");
1947                          $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()."!");
1948                          return $self->fail();                          return $self->fail();
1949                  }                  }
         }  
1950          my $ReactionList = $BiomassReactionRow->{"ESSENTIAL REACTIONS"};          my $ReactionList = $BiomassReactionRow->{"ESSENTIAL REACTIONS"};
1951          push(@{$ReactionList},$BiomassReactionRow->{DATABASE}->[0]);          push(@{$ReactionList},$BiomassReactionRow->{DATABASE}->[0]);
1952    
# Line 2120  Line 2368 
2368          }          }
2369    
2370          #Writing output to file          #Writing output to file
2371          $self->figmodel()->database()->print_array_to_file($self->directory()."MinimalPathways-".$media."-".$objective."-".$self->id()."-".$AllReversible."-".$self->selected_version().".txt",[join(",",@Array)]);          $self->figmodel()->database()->print_array_to_file($self->directory()."MinimalPathways-".$media."-".$objective."-".$self->id()."-".$AllReversible."-".$self->selected_version().".txt",[join("|",@Array)]);
2372  }  }
2373    
2374  =head3 find_minimal_pathways  =head3 find_minimal_pathways
# Line 2238  Line 2486 
2486          }          }
2487    
2488          #Writing output to file          #Writing output to file
2489          $self->figmodel()->database()->print_array_to_file($self->directory()."MinimalPathways-".$media."-".$objective."-".$self->id()."-".$AllReversible."-".$self->selected_version().".txt",[join(",",@Array)]);          $self->figmodel()->database()->print_array_to_file($self->directory()."MinimalPathways-".$media."-".$objective."-".$self->id()."-".$AllReversible."-".$self->selected_version().".txt",[join("|",@Array)]);
2490  }  }
2491    
2492  sub combine_minimal_pathways {  sub combine_minimal_pathways {
# Line 3338  Line 3586 
3586          my $OrganismID = $self->genome();          my $OrganismID = $self->genome();
3587          #Checking for a biomass override          #Checking for a biomass override
3588          if (defined($self->config("biomass reaction override")->{$OrganismID})) {          if (defined($self->config("biomass reaction override")->{$OrganismID})) {
3589                  $biomassrxn = $self->config("biomass reaction override")->{$OrganismID};                  my $biomassID = $self->config("biomass reaction override")->{$OrganismID};
3590                  print "Overriding biomass template and selecting ".$biomassrxn." for ".$OrganismID.".\n";                  my $tbl = $self->database()->get_table("BIOMASS",1);
3591                    $biomassrxn = $tbl->get_row_by_key($biomassID,"DATABASE");
3592                    print "Overriding biomass template and selecting ".$biomassID." for ".$OrganismID.".\n";
3593          } else {#Creating biomass reaction from the template          } else {#Creating biomass reaction from the template
3594                  #Getting the genome stats                  #Getting the genome stats
3595                  my $genomestats = $self->figmodel()->get_genome_stats($self->genome());                  my $genomestats = $self->figmodel()->get_genome_stats($self->genome());
# Line 3630  Line 3880 
3880    
3881                  #Adding the biomass equation to the biomass table                  #Adding the biomass equation to the biomass table
3882                  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());
3883                  $biomassrxn = $NewRow->{DATABASE}->[0];                  $biomassrxn = $NewRow;
                 print $biomassrxn."\n";  
3884          }          }
3885          print $biomassrxn."\n";          return $biomassrxn;
         my $BiomassRow = $self->figmodel()->add_model_to_biomass_reaction($biomassrxn,$self->id());  
         return $BiomassRow;  
3886  }  }
3887    
3888  =head3 PrintSBMLFile  =head3 PrintSBMLFile
# Line 4109  Line 4356 
4356          $self->reaction_table()->save();          $self->reaction_table()->save();
4357  }  }
4358    
4359    =head3 feature_web_data
4360    Definition:
4361            string:web output for feature/model connection = FIGMODELmodel->feature_web_data(FIGMODELfeature:feature);
4362    Description:
4363    =cut
4364    sub feature_web_data {
4365            my ($self,$feature) = @_;
4366    
4367            #First checking if the feature is in the model
4368            my $data = $self->get_feature_data($feature->{ID}->[0]);
4369            if (!defined($data)) {
4370                    return "Not in model";
4371            }
4372    
4373            my $output;
4374            #Printing predictions
4375            if (defined($data->{$self->id()."PREDICTIONS"})) {
4376                    #Parsing essentiality data
4377                    my $essentialityData;
4378                    if (defined($feature->{ESSENTIALITY})) {
4379                            for (my $i=0; $i < @{$feature->{ESSENTIALITY}};$i++) {
4380                                    my @temp = split(/:/,$feature->{ESSENTIALITY}->[$i]);
4381                                    $essentialityData->{$temp[0]} = $temp[1];
4382                            }
4383                    }
4384                    my $predictionHash;
4385                    for (my $i=0; $i < @{$data->{$self->id()."PREDICTIONS"}};$i++) {
4386                            my @temp = split(/:/,$data->{$self->id()."PREDICTIONS"}->[$i]);
4387                            if (defined($essentialityData->{$temp[0]})) {
4388                                    if ($temp[1] eq "essential" && $essentialityData->{$temp[0]} eq "essential") {
4389                                            push(@{$predictionHash->{"Correct negative"}},$temp[0]);
4390                                    } elsif ($temp[1] eq "nonessential" && $essentialityData->{$temp[0]} eq "essential") {
4391                                            push(@{$predictionHash->{"False positive"}},$temp[0]);
4392                                    } elsif ($temp[1] eq "essential" && $essentialityData->{$temp[0]} eq "nonessential") {
4393                                            push(@{$predictionHash->{"False negative"}},$temp[0]);
4394                                    } elsif ($temp[1] eq "nonessential" && $essentialityData->{$temp[0]} eq "nonessential") {
4395                                            push(@{$predictionHash->{"Correct positive"}},$temp[0]);
4396                                    }
4397                            } else {
4398                                    push(@{$predictionHash->{$temp[1]}},$temp[0]);
4399                            }
4400                    }
4401                    foreach my $key (keys(%{$predictionHash})) {
4402                            my $string = $key;
4403                            $string = ucfirst($string);
4404                            push(@{$output},'<span title="'.join(", ",@{$predictionHash->{$key}}).'">'.$string.'</span>');
4405                    }
4406            }
4407    
4408            #Printing reactions
4409            if (defined($data->{$self->id()."REACTIONS"})) {
4410                    for (my $i=0; $i < @{$data->{$self->id()."REACTIONS"}};$i++) {
4411                            my $rxnData = $self->get_reaction_data($data->{$self->id()."REACTIONS"}->[$i]);
4412                            my $reactionString = $self->figmodel()->web()->create_reaction_link($data->{$self->id()."REACTIONS"}->[$i],join(" or ",@{$rxnData->{"ASSOCIATED PEG"}}),$self->id());
4413                            if (defined($rxnData->{PREDICTIONS})) {
4414                                    my $predictionHash;
4415                                    for (my $i=0; $i < @{$rxnData->{PREDICTIONS}};$i++) {
4416                                            my @temp = split(/:/,$rxnData->{PREDICTIONS}->[$i]);
4417                                            push(@{$predictionHash->{$temp[1]}},$temp[0]);
4418                                    }
4419                                    $reactionString .= "(";
4420                                    foreach my $key (keys(%{$predictionHash})) {
4421                                            if ($key eq "Essential =>") {
4422                                                    $reactionString .= '<span title="Essential in '.join(",",@{$predictionHash->{$key}}).'">E=></span>,';
4423                                            } elsif ($key eq "Essential <=") {
4424                                                    $reactionString .= '<span title="Essential in '.join(",",@{$predictionHash->{$key}}).'">E<=</span>,';
4425                                            } elsif ($key eq "Active =>") {
4426                                                    $reactionString .= '<span title="Active in '.join(",",@{$predictionHash->{$key}}).'">A=></span>,';
4427                                            } elsif ($key eq "Active <=") {
4428                                                    $reactionString .= '<span title="Active in '.join(",",@{$predictionHash->{$key}}).'">A<=</span>,';
4429                                            } elsif ($key eq "Active <=>") {
4430                                                    $reactionString .= '<span title="Active in '.join(",",@{$predictionHash->{$key}}).'">A</span>,';
4431                                            } elsif ($key eq "Inactive") {
4432                                                    $reactionString .= '<span title="Inactive in '.join(",",@{$predictionHash->{$key}}).'">I</span>,';
4433                                            } elsif ($key eq "Dead") {
4434                                                    $reactionString .= '<span title="Dead">D</span>,';
4435                                            }
4436                                    }
4437                                    $reactionString =~ s/,$/)/;
4438                            }
4439                            push(@{$output},$reactionString);
4440                    }
4441            }
4442    
4443            #Returning output
4444            return join("<br>",@{$output});
4445    }
4446    
4447    =head3 remove_obsolete_reactions
4448    Definition:
4449            void FIGMODELmodel->remove_obsolete_reactions();
4450    Description:
4451    =cut
4452    sub remove_obsolete_reactions {
4453            my ($self) = @_;
4454    
4455            (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"));
4456            my $rxnTbl = $self->reaction_table();
4457            if (defined($rxnTbl)) {
4458                    for (my $i=0; $i < $rxnTbl->size(); $i++) {
4459                            my $row = $rxnTbl->get_row($i);
4460                            if (defined($translation->{$row->{LOAD}->[0]}) || defined($translation->{$row->{LOAD}->[0]."r"})) {
4461                                    my $direction = $row->{DIRECTION}->[0];
4462                                    my $newRxn;
4463                                    if (defined($translation->{$row->{LOAD}->[0]."r"})) {
4464                                            $newRxn = $translation->{$row->{LOAD}->[0]."r"};
4465                                            if ($direction eq "<=") {
4466                                                    $direction = "=>";
4467                                            } elsif ($direction eq "=>") {
4468                                                    $direction = "<=";
4469                                            }
4470                                    } else {
4471                                            $newRxn = $translation->{$row->{LOAD}->[0]};
4472                                    }
4473                                    #Checking if the new reaction is already in the model
4474                                    my $newRow = $rxnTbl->get_row_by_key($newRxn,"LOAD");
4475                                    if (defined($newRow)) {
4476                                            #Handling direction
4477                                            if ($newRow->{DIRECTION}->[0] ne $direction) {
4478                                                    $newRow->{DIRECTION}->[0] = "<=>";
4479                                            }
4480                                            push(@{$row->{"ASSOCIATED PEG"}},@{$rxnTbl->get_row($i)->{"ASSOCIATED PEG"}});
4481                                    } else {
4482                                            $rxnTbl->get_row($i)->{LOAD}->[0] = $newRxn;
4483                                            $rxnTbl->get_row($i)->{DIRECTION}->[0] = $direction;
4484                                    }
4485                            }
4486                    }
4487                    $rxnTbl->save();
4488            }
4489    }
4490    
4491  1;  1;

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3