[Bio] / Sprout / ModelSaplingLoader.pm Repository:
ViewVC logotype

Diff of /Sprout/ModelSaplingLoader.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.9, Sat Mar 27 15:19:26 2010 UTC revision 1.14, Sat Feb 26 19:05:32 2011 UTC
# Line 16  Line 16 
16  # Genomes at veronika@thefig.info or download a copy from  # Genomes at veronika@thefig.info or download a copy from
17  # http://www.theseed.org/LICENSE.TXT.  # http://www.theseed.org/LICENSE.TXT.
18  #  #
19  use FIGMODEL;  #use FIGMODEL;
20    
21  package ModelSaplingLoader;  package ModelSaplingLoader;
22      use strict;      use strict;
23      use Tracer;      use Tracer;
24      use ERDB;      use ERDB;
     use HTTP::Date;  
25      use base 'BaseSaplingLoader';      use base 'BaseSaplingLoader';
26    
27  =head1 Sapling ModelLoader Load Group Class  =head1 Sapling Model Load Group Class
28    
29  =head2 Introduction  =head2 Introduction
30    
31  The ModelLoader Load Group includes all of the major mdl tables.  The Model Load Group includes a small set of tables that describe reactions and compounds
32    and how they relate to the models in the main model database.
33    
34  =head3 new  =head3 new
35    
36      my $sl = ModelLoaderSaplingLoader->new($erdb, $options, @tables);      my $sl = ModelSaplingLoader->new($erdb, $options, @tables);
37    
38  Construct a new ModelLoaderSaplingLoader object.  Construct a new ModelSaplingLoader object.
39    
40  =over 4  =over 4
41    
# Line 59  Line 59 
59      # Get the parameters.      # Get the parameters.
60      my ($class, $erdb, $options) = @_;      my ($class, $erdb, $options) = @_;
61      # Create the table list.      # Create the table list.
62      my @tables = sort qw(StructuralCue IsFoundIn Compound HasAliasOf AliasType HasReactionAliasOf Reaction Involves IsTriggeredBy RoleSet IsCombinationOf IsCategorizedInto EcNumber IsConsistentWith IsStimulatedBy  FeatureSet IsSetOf IsRequiredBy Model IsModeledBy); # Encompasses);      my @tables = qw(Compound Reaction EcNumber Model Media IsTriggeredBy
63                        IsCategorizedInto IsConsistentWith IsModeledBy Involves
64                        IsRequiredBy);
65      # Create the BaseSaplingLoader object.      # Create the BaseSaplingLoader object.
66      my $retVal = BaseSaplingLoader::new($class, $erdb, $options, @tables);      my $retVal = BaseSaplingLoader::new($class, $erdb, $options, @tables);
67        # Create the reaction tracking hash.
68        $retVal->{reactions} = {};
69      # Return it.      # Return it.
70      return $retVal;      return $retVal;
71  }  }
# Line 72  Line 76 
76    
77      $sl->Generate();      $sl->Generate();
78    
79  Generate the data for the mdl files.  Generate the data for the model files.
80    
81  =cut  =cut
82    
# Line 81  Line 85 
85      my ($self) = @_;      my ($self) = @_;
86      # Get the database object.      # Get the database object.
87      my $erdb = $self->db();      my $erdb = $self->db();
     # Get the source object.  
     my $fig = $self->source();  
88      # Is this the global section?      # Is this the global section?
     my $model = new FIGMODEL;  
89      if ($self->global()) {      if ($self->global()) {
90          #Loading the model entities and relationships          # Load the tables from the model dump files.
91          $self->LoadModels($model);          $self->LoadModelFiles();
         #Loading structural cues first  
         $self->LoadStructuralCues($model);  
         #Loading the compound entities and relationships  
         $self->LoadCompounds($model);  
         #Loading the reaction, and EC number entities and relationships  
         $self->LoadReactions($model);  
         #Loading the role set entity and relationships  
         $self->LoadRoleSets($model);  
92      } else {      } else {
93          # Get the section ID.          # Get the section ID.
94          my $genomeID = $self->section();          my $genomeID = $self->section();
# Line 103  Line 96 
96      }      }
97  }  }
98    
99  #This function loads all of the StructuralCue entities  =head3 LoadModelFiles
 sub LoadStructuralCues {  
     my ($self,$model) = @_;  
100    
101      #Getting the list of structural cue filenames      $sl->LoadModelFiles();
102      my @CuesList = glob($model->{"Reaction database directory"}->[0]."cues/");  
103      my %CuePriorities;  Load the data from the six model dump files.
104      #TODO:NEED TO POPULATE THE PRIORITIES HASH  
105      foreach my $CueFile (@CuesList) {  =cut
106          my $Object = FIGMODELObject->load($CueFile,"\t");  
107          if (defined($Object) && defined($Object->{"NAME"}->[0])) {  sub LoadModelFiles {
108              my @LoadingArray = ($Object->{"NAME"}->[0],-1,0,0,"","","","");      # Get the parameters.
109              if (defined($CuePriorities{$Object->{"NAME"}->[0]})) {      my ($self) = @_;
110                  $LoadingArray[1] = $CuePriorities{$Object->{"NAME"}->[0]};      # Get the model dump file directory.
111              }      my $dir = $self->db()->LoadDirectory() . "/models";
112              if (defined($Object->{"SMALL_MOLECULE"}->[0])) {      # First we read the compounds.
113                  $LoadingArray[2] = $Object->{"SMALL_MOLECULE"}->[0];      my $ih = $self->CheckFile("$dir/CompoundName.txt", qw(CompoundID Name));
114              }      while (! eof $ih) {
115              if (defined($Object->{"CHARGE"}->[0])) {          # Get the next compound.
116                  $LoadingArray[3] = $Object->{"CHARGE"}->[0];          my ($id, $label) = $self->ReadLine($ih);
117              }          # Create a compound record for it.
118              if (defined($Object->{"FORMULA"}->[0])) {          $self->PutE(Compound => $id, label => $label);
119                  $LoadingArray[4] = $Object->{"FORMULA"}->[0];      }
120              }      # Next, the compound-reactions relationship. We create the reactions here, too.
121              if (defined($Object->{"ENERGY"}->[0])) {      $ih = $self->CheckFile("$dir/CompoundReaction.txt", qw(CompoundID ReactionID
122                  $LoadingArray[5] = $Object->{"ENERGY"}->[0];                             Stoichiometry));
123              }      while (! eof $ih) {
124              if (defined($Object->{"ERROR"}->[0])) {          # Get the next link.
125                  $LoadingArray[6] = $Object->{"ERROR"}->[0];          my ($compound, $reaction, $stoich) = $self->ReadLine($ih);
126              }          # Insure the reaction exists.
127              if (defined($Object->{"STRUCTURAL_CUES"}->[0])) {          $self->CreateReaction($reaction);
128                  $LoadingArray[7] = join(";",@{$Object->{"STRUCTURAL_CUES"}});          # Check for product or substrate.
129            my $product;
130            if ($stoich < 0) {
131                $product = 0;
132                $stoich = -$stoich;
133            } else {
134                $product = 1;
135              }              }
136              $self->PutE(StructuralCue => $LoadingArray[0], priority => $LoadingArray[1], smallMolecule => $LoadingArray[2], charge => $LoadingArray[3], formula => $LoadingArray[4],deltaG => $LoadingArray[5], deltaGerr => $LoadingArray[6], subgroups => $LoadingArray[7]);          # Connect the reaction to the compound.
137            $self->PutR(Involves => $reaction, $compound, product => $product,
138                        stoichiometry => $stoich);
139        }
140        # Now we connect the reactions to roles.
141        $ih = $self->CheckFile("$dir/ReactionRole.txt", qw(ReactionID Role));
142        while (! eof $ih) {
143            # Get the next reaction/role pair. We don't need to create roles here because
144            # they are built in the Feature module.
145            my ($reaction, $role) = $self->ReadLine($ih);
146            # Insure the reaction exists.
147            $self->CreateReaction($reaction);
148            # Connect the reaction to the role.
149            $self->PutR(IsTriggeredBy => $reaction, $role);
150        }
151        # Now we create the models.
152        $ih = $self->CheckFile("$dir/ModelGenome.txt", qw(ModelID GenomeID));
153        while (! eof $ih) {
154            # Get the next model.
155            my ($model, $genome) = $self->ReadLine($ih);
156            # Create the model.
157            $self->PutE(Model => $model);
158            # Connect it to the genome. Again, the genomes are created elsewhere.
159            $self->PutR(IsModeledBy => $genome, $model);
160        }
161        # Next we connect the reactions to models.
162        $ih = $self->CheckFile("$dir/ModelReaction.txt", qw(ModelID ReactionID));
163        while (! eof $ih) {
164            # Get the next line.
165            my ($model, $reaction) = $self->ReadLine($ih);
166            # Only proceed if a reaction is present.
167            if ($reaction) {
168                # Insure the reaction exists.
169                $self->CreateReaction($reaction);
170                # Connect the reaction to the model.
171                $self->PutR(IsRequiredBy => $reaction, $model);
172          }          }
173      }      }
174  }  }
175    
176  sub LoadCompounds {  =head3 StartFile
177      my ($self,$model) = @_;  
178        my $ih = $sl->CheckFile($fileName, @fieldNames);
179    
180    Read the header record of the specified file and verify that the field names match
181    the names in the input list. If they do not, an error will be thrown; if they do, an
182    open file handle will be returned, positioned on the first data record.
183    
184      #First getting the compound table which has a list of all compounds in the database as well as alot of compound information  =over 4
     my $CompoundTable = $model->database()->GetDBTable("COMPOUNDS");  
185    
186      #Adding the universal AliasType that will always exist  =item fileName
     $self->PutE(AliasType => "NAME", source => "NONE");  
     $self->PutE(AliasType => "SEARCHNAME", source => "NONE");  
     $self->PutE(AliasType => "KEGG", source => "http://www.kegg.com/");  
     $self->PutE(AliasType => "ARGONNE", source => "OBSOLETE IDs");  
187    
188      #Cycling through the compound list and adding each individual compound entity  Name for the input file. The file is in standard tab-delimited format. The first record
189      for (my $i=0; $i < $CompoundTable->size(); $i++) {  contains the field names and the remaining records contain the data.
         my $Row = $CompoundTable->get_row($i);  
         if (defined($Row) && defined($Row->{"DATABASE"}->[0]) && $Row->{"DATABASE"}->[0] =~ m/cpd\d\d\d\d\d/) {  
             my $Object = FIGMODELObject->load($model->{"compound directory"}->[0].$Row->{"DATABASE"}->[0],"\t");  
             my @LoadingArray = ($Row->{"DATABASE"}->[0],$Row->{"DATABASE"}->[0],0,"",0,"",0,10000000,10000000,"");  
             $self->Track(compoundRow => $LoadingArray[0], 1000);  
             if (defined($Row->{"NAME"}->[0])) {  
                 $LoadingArray[1] = $Row->{"NAME"}->[0];  
             }  
             if (defined($Object->{"MASS"}->[0])) {  
                 $LoadingArray[2] = $Object->{"MASS"}->[0];  
             }  
             if (defined($Object->{"FORMULA"}->[0])) {  
                 $LoadingArray[3] = $Object->{"FORMULA"}->[0];  
             }  
             if (defined($Object->{"CHARGE"}->[0])) {  
                 $LoadingArray[4] = $Object->{"CHARGE"}->[0];  
             }  
             if (defined($Object->{"CHARGE"}->[0]) && defined($Object->{"FORMULA"}->[0])) {  
                 $LoadingArray[5] = FIGMODEL::ConvertToNeutralFormula($Object->{"FORMULA"}->[0],$Object->{"CHARGE"}->[0]);  
             }  
             if (-e $model->{"Argonne molfile directory"}->[0].$Row->{"DATABASE"}->[0].".mol" || -e $model->{"Argonne molfile directory"}->[0]."pH7/".$Row->{"DATABASE"}->[0].".mol") {  
                 $LoadingArray[6] = 1;  
             }  
             if (defined($Object->{"DELTAG"}->[0])) {  
                 $LoadingArray[7] = $Object->{"DELTAG"}->[0];  
             }  
             if (defined($Object->{"DELTAGERR"}->[0])) {  
                 $LoadingArray[8] = $Object->{"DELTAGERR"}->[0];  
             }  
             if (defined($Row->{"STRINGCODE"}->[0])) {  
                 $LoadingArray[9] = $Row->{"STRINGCODE"}->[0];  
             }  
             $self->PutE(Compound => $LoadingArray[0], label => $LoadingArray[1], mass => $LoadingArray[2], chargedFormula => $LoadingArray[3], charge => $LoadingArray[4],neutralFormula => $LoadingArray[5], hasMolfile => $LoadingArray[6], deltaG => $LoadingArray[7], deltaGerr => $LoadingArray[8], stringcode => $LoadingArray[9]);  
             #Adding the relationship between compound and structural cue  
             if (defined($Object->{"STRUCTURAL_CUES"})) {  
                 foreach my $Cue (@{$Object->{"STRUCTURAL_CUES"}}) {  
                     my @TempArray = split(/:/,$Cue);  
                     if (@TempArray == 2) {  
                         $self->PutR(IsFoundIn => $TempArray[0],$LoadingArray[0],count => $TempArray[1]);  
                     }  
                 }  
             }  
             #Adding the relationship between compound and alias type  
             if (defined($Object->{"NAME"})) {  
                 foreach my $Name (@{$Object->{"NAME"}}) {  
                     $self->PutR(HasAliasOf => $LoadingArray[0],"NAME",alias => $Name);  
                     my @SearchNames = FIGMODEL::ConvertToSearchNames($Name);  
                     foreach my $SearchName (@SearchNames) {  
                         $self->PutR(HasAliasOf => $LoadingArray[0],"SEARCHNAME",alias => $SearchName);  
                     }  
                 }  
             }  
             if (defined($Object->{"DBLINKS"})) {  
                 foreach my $Link (@{$Object->{"DBLINKS"}}) {  
                     my @TempArray = split(/:/,$Link);  
                     if (@TempArray >= 2) {  
                         if ($TempArray[0] ne "KEGG" && $TempArray[0] ne "ARGONNE") {  
                             $self->PutE(AliasType => $TempArray[0], source => "PUBLISHED MODEL");  
                         }  
                         if ($TempArray[0] eq "ARGONNE") {  
                             splice(@TempArray,1,1);  
                         }  
                         for (my $j=1; $j < @TempArray; $j++) {  
                             $self->PutR(HasAliasOf => $LoadingArray[0],$TempArray[0],alias => $TempArray[$j]);  
                         }  
                     }  
                 }  
             }  
         }  
     }  
 }  
190    
191  sub LoadReactions {  =item fieldNames
     my ($self,$model) = @_;  
     #First getting the reaction table which has a list of all reactions in the database as well as alot of reaction information  
     my $ReactionTable = $model->database()->GetDBTable("REACTIONS");  
192    
193      #Cycling through the compound list and adding each individual compound entity  List of the field names expected, in order.
     my $Count = 0;  
     for (my $i=0; $i < $ReactionTable->size(); $i++) {  
         my $Row = $ReactionTable->get_row($i);  
         if (defined($Row) && defined($Row->{"DATABASE"}->[0]) && $Row->{"DATABASE"}->[0] =~ m/rxn\d\d\d\d\d/) {  
             my $Object = FIGMODELObject->load($model->{"reaction directory"}->[0].$Row->{"DATABASE"}->[0],"\t");  
             my @LoadingArray = ($Row->{"DATABASE"}->[0],"","","","","",10000000,10000000,10000000,"R");  
             $self->Track(reactionRow => $LoadingArray[0], 1000);  
             if (defined($Object->{"DEFINITION"}->[0])) {  
                 $LoadingArray[1] = $Object->{"DEFINITION"}->[0];  
             }  
             if (defined($Object->{"EQUATION"}->[0])) {  
                 my ($Direction,$Equation,$ReverseEquation,$FullEquation,$EquationCompartment,$Error) = $model->ConvertEquationToCode($Object->{"EQUATION"}->[0],{"Test" => "Test"});  
                 $LoadingArray[2] = $Equation;  
             }  
             if (defined($Object->{"OPERATOR"}->[0])) {  
                 $LoadingArray[3] = $Object->{"OPERATOR"}->[0];  
             }  
             if (defined($Object->{"PATHWAY"}->[0])) {  
                 $LoadingArray[4] = join(";",@{$Object->{"PATHWAY"}});  
             }  
             if (defined($Row->{"KEGG MAPS"}->[0])) {  
                 $LoadingArray[5] = join(";",@{$Row->{"KEGG MAPS"}});  
             }  
             if (defined($Object->{"DELTAG"}->[0])) {  
                 $LoadingArray[6] = $Object->{"DELTAG"}->[0];  
             }  
             if (defined($Object->{"MMDELTAG"}->[0])) {  
                 $LoadingArray[7] = $Object->{"MMDELTAG"}->[0];  
             }  
             if (defined($Object->{"DELTAGERR"}->[0])) {  
                 $LoadingArray[8] = $Object->{"DELTAGERR"}->[0];  
             }  
             if (defined($Object->{"THERMODYNAMIC REVERSIBILITY"}->[0])) {  
                 my $code = $Object->{"THERMODYNAMIC REVERSIBILITY"}->[0];  
                 if ($code eq '<=>') {  
                     $LoadingArray[9] = "R";  
                 } elsif ($code eq '<=') {  
                     $LoadingArray[9] = "B";  
                 } elsif ($code eq '=>') {  
                     $LoadingArray[9] = "F";  
                 }  
             }  
             $self->PutE(Reaction => $LoadingArray[0], definition => $LoadingArray[1], code => $LoadingArray[2], operator => $LoadingArray[3], pathway => $LoadingArray[4],keggMap => $LoadingArray[5], deltaG => $LoadingArray[6], MMdeltaG => $LoadingArray[7], deltaGerr => $LoadingArray[8], predictedReversibility => $LoadingArray[9]);  
             #Adding relationship between compounds and reactions  
             my ($Reactants,$Products) = $model->GetReactionSubstrateData($LoadingArray[0]);  
             if (! defined $Reactants) {  
                 $self->Add(missingReactants => 1);  
             } else {  
                 for (my $j=0; $j < @{$Reactants}; $j++) {  
                     $self->PutR(Involves => $LoadingArray[0],$Reactants->[$j]->{"DATABASE"}->[0],product => 0,stoichiometry => $Reactants->[$j]->{"COEFFICIENT"}->[0],main => 1,compartment => $Reactants->[$j]->{"COMPARTMENT"}->[0],discriminator => $Count);  
                     #TODO:Properly identify main reactants in reactions  
                     $Count++;  
                 }  
             }  
             if (! defined $Products) {  
                 $self->Add(missingProducts => 1);  
             } else {  
                 for (my $j=0; $j < @{$Products}; $j++) {  
                     $self->PutR(Involves => $LoadingArray[0],$Products->[$j]->{"DATABASE"}->[0],product => 1,stoichiometry => $Products->[$j]->{"COEFFICIENT"}->[0],main => 1,compartment => $Products->[$j]->{"COMPARTMENT"}->[0],discriminator => $Count);  
                     #TODO:Properly identify main reactants in reactions  
                     $Count++;  
                 }  
             }  
             #Adding relationship between EC number and reactions  
             if (defined($Object->{"ENZYME"})) {  
                 foreach my $Enzyme (@{$Object->{"ENZYME"}}) {  
                    if ($Enzyme =~ /,/) {  
                     #TODO:Invalid enzyme  
                    } else {  
                     $Enzyme =~ s/\s//g;  
                     $self->PutE(EcNumber => $Enzyme, obsolete => 0, replacedby => "NONE");  
                     $self->PutR(IsCategorizedInto => $LoadingArray[0],$Enzyme,source => "KEGG");  
                    }  
                 }  
             }  
             #Adding the relationship between reaction and alias type  
             if (defined($Object->{"NAME"})) {  
                 foreach my $Name (@{$Object->{"NAME"}}) {  
                     $self->PutR(HasReactionAliasOf => $LoadingArray[0],"NAME",alias => $Name);  
                 }  
             }  
             if (defined($Object->{"DBLINKS"})) {  
                 foreach my $Link (@{$Object->{"DBLINKS"}}) {  
                     my @TempArray = split(/:/,$Link);  
                     if (@TempArray >= 2) {  
                         if ($TempArray[0] ne "KEGG" && $TempArray[0] ne "ARGONNE") {  
                             $self->PutE(AliasType => $TempArray[0], source => "PUBLISHED MODEL");  
                         }  
                         if ($TempArray[0] eq "ARGONNE") {  
                             splice(@TempArray,1,1);  
                         }  
                         for (my $j=1; $j < @TempArray; $j++) {  
                             $self->PutR(HasReactionAliasOf => $LoadingArray[0],$TempArray[0],alias => $TempArray[$j]);  
                         }  
                     }  
                 }  
             }  
         }  
     }  
 }  
194    
195  sub LoadRoleSets {  =item RETURN
     my ($self,$model) = @_;  
     my $sapling =$self->db();  
     my $RoleMappings = $model->database()->GetDBTable("CURATED ROLE MAPPINGS");  
     my $NewSet;  
     my $SetHash;  
     my $LastComplex = -1;  
     my $LastReaction = "";  
     my $LastRole = "";  
     for (my $i=0; $i < $RoleMappings->size(); $i++) {  
         my $Row = $RoleMappings->get_row($i);  
         if (defined($Row) && defined($Row->{"REACTION"}->[0]) && defined($Row->{"ROLE"}->[0]) && defined($Row->{"COMPLEX"}->[0]) && defined($Row->{"MASTER"}->[0])) {  
             if ($Row->{"REACTION"}->[0] ne $LastReaction || $LastComplex ne $Row->{"COMPLEX"}->[0]) {  
                 if (defined($NewSet->{"ROLES"}) && defined($NewSet->{"REACTIONS"})) {  
                     my @RoleList = sort(keys(%{$NewSet->{"ROLES"}}));  
                     my @ReactionList = keys(%{$NewSet->{"REACTIONS"}});  
                     foreach my $Reaction (@ReactionList) {  
                         $SetHash->{join("+",@RoleList)}->{"REACTIONS"}->{$Reaction}->{"MASTER"}->[0] = $NewSet->{"REACTIONS"}->{$Reaction}->{"MASTER"}->[0];  
                         if (defined($NewSet->{"REACTIONS"}->{$Reaction}->{"SUBSYSTEMS"})) {  
                             foreach my $Subsystem (@{$NewSet->{"REACTIONS"}->{$Reaction}->{"SUBSYSTEMS"}}) {  
                                 if (defined($SetHash->{join("+",@RoleList)}->{"REACTIONS"}->{$Reaction}->{"SUBSYSTEMS"})) {  
                                     foreach my $OtherSubsystem (@{$SetHash->{join("+",@RoleList)}->{"REACTIONS"}->{$Reaction}->{"SUBSYSTEMS"}}) {  
                                         if ($Subsystem eq $OtherSubsystem) {  
                                             $Subsystem = "";  
                                             last;  
                                         }  
                                     }  
                                 }  
                                 if ($Subsystem ne "") {  
                                     push(@{$SetHash->{join("+",@RoleList)}->{"REACTIONS"}->{$Reaction}->{"SUBSYSTEMS"}},$Subsystem);  
                                 }  
                             }  
                         }  
                     }  
                     foreach my $Role (@RoleList) {  
                         $SetHash->{join("+",@RoleList)}->{"ROLES"}->{$Role} = 1;  
                     }  
                 }  
                 $NewSet = {};  
             }  
             $NewSet->{"ROLES"}->{$Row->{"ROLE"}->[0]} = 1;  
             $NewSet->{"REACTIONS"}->{$Row->{"REACTION"}->[0]}->{"MASTER"}->[0] = $Row->{"MASTER"}->[0];  
             if (defined($Row->{"SUBSYSTEM"}->[0])) {  
                 push(@{$NewSet->{"REACTIONS"}->{$Row->{"REACTION"}->[0]}->{"SUBSYSTEMS"}},$Row->{"SUBSYSTEM"}->[0]);  
             }  
             $LastRole = $Row->{"ROLE"}->[0];  
             $LastReaction = $Row->{"REACTION"}->[0];  
             $LastComplex = $Row->{"COMPLEX"}->[0];  
         }  
     }  
196    
197      my @RoleSets = keys(%{$SetHash});  Returns the open file handle if successful. If there is a mismatch, throws an error.
     foreach my $RoleSet (@RoleSets) {  
         my $Digested = $sapling->DigestKey($RoleSet);  
         $self->PutE(RoleSet => $Digested, source => "NONE");  
         my @ReactionList = keys(%{$SetHash->{$RoleSet}->{"REACTIONS"}});  
         foreach my $Reaction (@ReactionList) {  
             $self->PutR(IsTriggeredBy => $Reaction,$Digested, source => "NONE",master => $SetHash->{$RoleSet}->{"REACTIONS"}->{$Reaction}->{"MASTER"}->[0],subsystem => join(";",@{$SetHash->{$RoleSet}->{"REACTIONS"}->{$Reaction}->{"SUBSYSTEMS"}}));  
         }  
         my @RoleList = keys(%{$SetHash->{$RoleSet}->{"ROLES"}});  
         foreach my $Role (@RoleList) {  
             $self->PutR(IsCombinationOf => $Digested,$Role, local => 0);  
         }  
     }  
 }  
198    
199  sub LoadModels {  =back
200      my ($self,$model) = @_;  
201      my $sapling = $self->db();  =cut
202      ## TRS: Get hash of valid genome IDs.  
203      my $genomeHash = $sapling->GenomeHash();  sub CheckFile {
204      my $ModelList = $model->database()->GetDBTable("MODEL LIST");      # Get the parameters.
205      my $ModelStats = $model->database()->GetDBTable("MODEL STATS");      my ($self, $fileName, @fieldNames) = @_;
206      for (my $i=0; $i < $ModelStats->size(); $i++) {      # Open the file.
207          my $Row = $ModelStats->get_row($i);      my $retVal = Open(undef, "<$fileName");
208          if (defined($Row) && defined($Row->{"Model ID"}->[0])) {      $self->Add(files => 1);
209              my @LoadingArray = ($Row->{"Model ID"}->[0],"","",0,0,0,"",0,0,0,0,0,0,0,0,0,0,0,0,"","",0,0,"",0,0);      # Read in the file header.
210              if (defined($Row->{"Genome ID"}->[0]) && $genomeHash->{$Row->{"Genome ID"}->[0]}) {      my @actualFields = Tracer::GetLine($retVal);
211                  if (defined($Row->{"Organism name"}->[0])) {      # This will be set to TRUE if there's a mismatch.
212                      $LoadingArray[1] = $Row->{"Organism name"}->[0];      my $error = 0;
213                  }      for (my $i = 0; $i <= $#fieldNames; $i++) {
214                  if (defined($Row->{"Source"}->[0])) {          if ($fieldNames[$i] ne $actualFields[$i]) {
215                      $LoadingArray[2] = $Row->{"Source"}->[0];              Trace("Field match error: expected $fieldNames[$i], found $actualFields[$i].") if T(0);
216                  }              $error = 1;
217                  if (defined($Row->{"Total genes"}->[0])) {          }
218                      $LoadingArray[3] = $Row->{"Total genes"}->[0];      }
219                  }      # Was there an error?
220                  if (defined($Row->{"Gram positive genes"}->[0])) {      if ($error) {
221                      $LoadingArray[4] = $Row->{"Gram positive genes"}->[0];          # Yes, so abort.
222                  }          Confess("Invalid field name header in $fileName.");
                 if (defined($Row->{"Gram negative genes"}->[0])) {  
                     $LoadingArray[5] = $Row->{"Gram negative genes"}->[0];  
                 }  
                 if (defined($Row->{"Class"}->[0])) {  
                     $LoadingArray[6] = $Row->{"Class"}->[0];  
                 }  
                 if (defined($Row->{"Genes with functions"}->[0])) {  
                     $LoadingArray[7] = $Row->{"Genes with functions"}->[0];  
                 }  
                 if (defined($Row->{"Genes with reactions"}->[0])) {  
                     $LoadingArray[8] = $Row->{"Genes with reactions"}->[0];  
                 }  
                 if (defined($Row->{"Subsystem genes"}->[0])) {  
                     $LoadingArray[9] = $Row->{"Subsystem genes"}->[0];  
                 }  
                 if (defined($Row->{"Subsystem genes with reactions"}->[0])) {  
                     $LoadingArray[10] = $Row->{"Subsystem genes with reactions"}->[0];  
                 }  
                 if (defined($Row->{"Nonsubsystem genes"}->[0])) {  
                     $LoadingArray[11] = $Row->{"Nonsubsystem genes"}->[0];  
                 }  
                 if (defined($Row->{"Nonsubsystem genes with reactions"}->[0])) {  
                     $LoadingArray[12] = $Row->{"Nonsubsystem genes with reactions"}->[0];  
                 }  
                 if (defined($Row->{"Number of reactions"}->[0])) {  
                     $LoadingArray[13] = $Row->{"Number of reactions"}->[0];  
                 }  
                 if (defined($Row->{"Transport reaction"}->[0])) {  
                     $LoadingArray[14] = $Row->{"Transport reaction"}->[0];  
                 }  
                 if (defined($Row->{"Gap filling reactions"}->[0])) {  
                     $LoadingArray[15] = $Row->{"Gap filling reactions"}->[0];  
                 }  
                 if (defined($Row->{"Gap filling time"}->[0])) {  
                     $LoadingArray[16] = $Row->{"Gap filling time"}->[0];  
                 }  
                 if (defined($Row->{"Gap filling objective"}->[0])) {  
                     $LoadingArray[17] = $Row->{"Gap filling objective"}->[0];  
                 }  
                 if (defined($Row->{"Gap filling minimal objective"}->[0])) {  
                     $LoadingArray[18] = $Row->{"Gap filling minimal objective"}->[0];  
                 }  
                 if (defined($Row->{"Build date"}->[0])) {  
                     $LoadingArray[19] = $Row->{"Build date"}->[0];  
                 }  
                 if (defined($Row->{"Gap fill date"}->[0])) {  
                     $LoadingArray[20] = $Row->{"Gap fill date"}->[0];  
                 }  
                 if (defined($Row->{"Version"}->[0])) {  
                     $LoadingArray[21] = $Row->{"Version"}->[0];  
                 }  
                 if (defined($Row->{"Gap fill version"}->[0])) {  
                     $LoadingArray[22] = $Row->{"Gap fill version"}->[0];  
                 }  
                 if ($Row->{"Model ID"}->[0] =~ m/Core\d+\.\d+V\d+\.\d+/) {  
                     $LoadingArray[25] = 1;  
                 } elsif (defined($ModelList->get_row_by_key($Row->{"Model ID"}->[0],"MODEL ID"))) {  
                     if (defined($ModelList->get_row_by_key($Row->{"Model ID"}->[0],"MODEL ID")->{"DIRECTORY"}->[0])) {  
                         $LoadingArray[23] = $ModelList->get_row_by_key($Row->{"Model ID"}->[0],"MODEL ID")->{"DIRECTORY"}->[0];  
                     }  
                     if (defined($ModelList->get_row_by_key($Row->{"Model ID"}->[0],"MODEL ID")->{"JOB ID"}->[0]) && $ModelList->get_row_by_key($Row->{"Model ID"}->[0],"MODEL ID")->{"JOB ID"}->[0] ne "NONE") {  
                         $LoadingArray[24] = $ModelList->get_row_by_key($Row->{"Model ID"}->[0],"MODEL ID")->{"JOB ID"}->[0];  
                     }  
                 }  
                 for my $j (3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,21,22,24,25) {  
                     $LoadingArray[$j] = 0 if ($LoadingArray[$j] =~ /[a-z]/i);  
                 }  
                 $self->PutE(Model => $LoadingArray[0], organismName => $LoadingArray[1], source => $LoadingArray[2], totalGenes => $LoadingArray[3], gramPositiveGenes => $LoadingArray[4],gramNegativeGenes => $LoadingArray[5], class => $LoadingArray[6], genesWithFunction => $LoadingArray[7], genesWithReactions => $LoadingArray[8], subsystemGenes => $LoadingArray[9], subsystemGenesWithReactions => $LoadingArray[10], nonsubsystemGenes => $LoadingArray[11], nonsubsystemGenesWithReactions => $LoadingArray[12], numberOfReactions => $LoadingArray[13], numberOfTransporters => $LoadingArray[14], gapFillingReactions => $LoadingArray[15], gapFillingTime => $LoadingArray[16], gapFillingObjective => $LoadingArray[17], gapFillingMinimalObjective => $LoadingArray[18], buildDate => $LoadingArray[19], gapFillDate => $LoadingArray[20], version => $LoadingArray[21], gapFillVersion => $LoadingArray[22], directory => $LoadingArray[23], jobid => $LoadingArray[24], obsolete => $LoadingArray[25]);  
                 #Adding the relationship between model and genome  
                 if (defined($Row->{"Genome ID"}->[0])) {  
                     $self->PutR(IsModeledBy => $Row->{"Genome ID"}->[0],$LoadingArray[0]);  
                 }  
                 #If the model is not obsolete, we add the relationships between model and reaction and featureset  
                 if ($LoadingArray[25] == 0) {  
                     #Loading the model from file  
                     my $ModelTable = $model->database()->GetDBModel($LoadingArray[0]);  
                     if (! defined $ModelTable) {  
                         $self->Add(missingModelTable => 1);  
223                      } else {                      } else {
224                          for (my $j=0; $j < $ModelTable->size(); $j++) {          # No, so trace the open.
225                              my $RxnRow = $ModelTable->get_row($j);          Trace("Processing $fileName.") if T(ERDBLoadGroup => 2);
                             if (defined($RxnRow) && defined($RxnRow->{"LOAD"}->[0])) {  
                                 my @SubLoadingArray = ("R","c","NONE",10,"V","NONE","UNKNOWN");  
                                 if (defined($RxnRow->{"DIRECTIONALITY"}->[0])) {  
                                     my $code = $RxnRow->{"DIRECTIONALITY"}->[0];  
                                     if ($code eq '<=>') {  
                                         $SubLoadingArray[0] = 'R';  
                                     } elsif ($code eq '<=') {  
                                         $SubLoadingArray[0] = 'B';  
                                     } elsif ($code eq '=>') {  
                                         $SubLoadingArray[0] = 'F';  
                                     }  
                                 }  
                                 if (defined($RxnRow->{"COMPARTMENT"}->[0])) {  
                                     $SubLoadingArray[1] = $RxnRow->{"COMPARTMENT"}->[0];  
                                 }  
                                 if (defined($RxnRow->{"SUBSYSTEM"})) {  
                                     $SubLoadingArray[2] = join(";",@{$RxnRow->{"SUBSYSTEM"}});  
                                 }  
                                 if (defined($RxnRow->{"CONFIDENCE"}->[0])) {  
                                     $SubLoadingArray[3] = $RxnRow->{"CONFIDENCE"}->[0];  
                                     if ($SubLoadingArray[3] eq 'NONE') {  
                                         $SubLoadingArray[3] = 10;  
                                     }  
                                 }  
                                 if (defined($RxnRow->{"NOTES"})) {  
                                     $SubLoadingArray[5] = join(";",@{$RxnRow->{"NOTES"}});  
                                 }  
                                 if (defined($RxnRow->{"ASSOCIATED PEG"})) {  
                                     #Adding the role set entities  
                                     foreach my $FeatureSet (@{$RxnRow->{"ASSOCIATED PEG"}}) {  
                                         if ($FeatureSet =~ m/peg\.\d+/) {  
                                             my $DigestedKey = $sapling->DigestKey($FeatureSet);  
                                             $self->PutE(FeatureSet => $DigestedKey, source => "NONE");  
                                             #Adding the relationship between the reaction and roleset  
                                             $self->PutR(IsStimulatedBy => $RxnRow->{"LOAD"}->[0],$DigestedKey);  
                                             #Adding the relationship between the model and featureset  
                                             #$self->PutR(Encompasses => $LoadingArray[0],$DigestedKey);  
                                             #Adding the relationship between FeatureSet and feature  
                                             my @PegArray = split(/\+/,$FeatureSet);  
                                             foreach my $Feature (@PegArray) {  
                                                 if ($Feature =~ m/(peg\.\d+)/) {  
                                                     $self->PutR(IsSetOf => $DigestedKey,"fig|".$Row->{"Genome ID"}->[0].".".$1);  
                                                 }  
                                             }  
                                         }  
                                     }  
                                     $SubLoadingArray[6] = join(";",@{$RxnRow->{"ASSOCIATED PEG"}});  
                                 }  
                                 $self->PutR(IsRequiredBy => $RxnRow->{"LOAD"}->[0],$LoadingArray[0], direction => $SubLoadingArray[0], compartment => $SubLoadingArray[1], confidence => $SubLoadingArray[3], class => $SubLoadingArray[4], notes => $SubLoadingArray[5], dependency => $SubLoadingArray[6]);  
                             }  
                         }  
                     }  
                     #Clearing the model data from memmory  
                     undef $ModelTable;  
                     $model->database()->ClearDBModel($LoadingArray[0],"DELETE");  
226                  }                  }
227        # Return the file handle.
228        return $retVal;
229              }              }
230    
231    =head3 ReadLine
232    
233        my @fields = $sl->ReadLine($ih);
234    
235    Read a line of data from an input file.
236    
237    =over 4
238    
239    =item ih
240    
241    Open file handle for the input file.
242    
243    =item RETURN
244    
245    Returns a list of the field values for the next record in the file.
246    
247    =back
248    
249    =cut
250    
251    sub ReadLine {
252        # Get the parameters.
253        my ($self, $ih) = @_;
254        # Read the line.
255        my @retVal = Tracer::GetLine($ih);
256        # Count this record.
257        $self->Track(records => $retVal[0], 1000);
258        # Return the data.
259        return @retVal;
260          }          }
261    
262    
263    =head3 CheckReaction
264    
265        $sl->CheckReaction($reaction);
266    
267    Insure we have created a rectord for the specified reaction.
268    
269    =over 4
270    
271    =item reaction
272    
273    ID of the reaction in question.
274    
275    =back
276    
277    =cut
278    
279    sub CreateReaction {
280        # Get the parameters.
281        my ($self, $reaction) = @_;
282        # Get the reaction hash.
283        my $reactionH = $self->{reactions};
284        # See if this reaction is new.
285        if (! $reactionH->{$reaction}) {
286            # It is, so create it.
287            $self->PutE(Reaction => $reaction);
288            # Insure we don't create it again.
289            $reactionH->{$reaction} = 1;
290      }      }
291  }  }
292    

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.14

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3