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

Diff of /Sprout/SproutLoad.pm

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

revision 1.48, Fri Jul 7 00:24:16 2006 UTC revision 1.67, Tue Sep 19 00:11:12 2006 UTC
# Line 120  Line 120 
120                      # an omitted access code can be defaulted to 1.                      # an omitted access code can be defaulted to 1.
121                      for my $genomeLine (@genomeList) {                      for my $genomeLine (@genomeList) {
122                          my ($genomeID, $accessCode) = split("\t", $genomeLine);                          my ($genomeID, $accessCode) = split("\t", $genomeLine);
123                          if (undef $accessCode) {                          if (! defined($accessCode)) {
124                              $accessCode = 1;                              $accessCode = 1;
125                          }                          }
126                          $genomes{$genomeID} = $accessCode;                          $genomes{$genomeID} = $accessCode;
# Line 136  Line 136 
136      # We only need it if load-only is NOT specified.      # We only need it if load-only is NOT specified.
137      if (! $options->{loadOnly}) {      if (! $options->{loadOnly}) {
138          if (! defined $subsysFile || $subsysFile eq '') {          if (! defined $subsysFile || $subsysFile eq '') {
139              # Here we want all the NMPDR subsystems. First we get the whole list.              # Here we want all the usable subsystems. First we get the whole list.
140              my @subs = $fig->all_subsystems();              my @subs = $fig->all_subsystems();
141              # Loop through, checking for the NMPDR file.              # Loop through, checking for usability.
142              for my $sub (@subs) {              for my $sub (@subs) {
143                  if (-e "$FIG_Config::data/Subsystems/$sub/NMPDR") {                  if ($fig->usable_subsystem($sub)) {
144                      $subsystems{$sub} = 1;                      $subsystems{$sub} = 1;
145                  }                  }
146              }              }
# Line 340  Line 340 
340      my $fig = $self->{fig};      my $fig = $self->{fig};
341      # Get the genome hash.      # Get the genome hash.
342      my $genomeFilter = $self->{genomes};      my $genomeFilter = $self->{genomes};
343      my $genomeCount = (keys %{$genomeFilter});      # Set up an ID counter for the PCHs.
344      my $featureCount = $genomeCount * 4000;      my $pchID = 0;
345      # Start the loads.      # Start the loads.
346      my $loadCoupling = $self->_TableLoader('Coupling');      my $loadCoupling = $self->_TableLoader('Coupling');
347      my $loadIsEvidencedBy = $self->_TableLoader('IsEvidencedBy', $self->PrimaryOnly);      my $loadIsEvidencedBy = $self->_TableLoader('IsEvidencedBy', $self->PrimaryOnly);
# Line 411  Line 411 
411                              }                              }
412                          }                          }
413                          for my $evidenceID (keys %evidenceMap) {                          for my $evidenceID (keys %evidenceMap) {
414                                # Get the ID for this evidence.
415                                $pchID++;
416                              # Create the evidence record.                              # Create the evidence record.
417                              my ($peg3, $peg4, $usage) = @{$evidenceMap{$evidenceID}};                              my ($peg3, $peg4, $usage) = @{$evidenceMap{$evidenceID}};
418                              $loadPCH->Put($evidenceID, $usage);                              $loadPCH->Put($pchID, $usage);
419                              # Connect it to the coupling.                              # Connect it to the coupling.
420                              $loadIsEvidencedBy->Put($coupleID, $evidenceID);                              $loadIsEvidencedBy->Put($coupleID, $pchID);
421                              # Connect it to the features.                              # Connect it to the features.
422                              $loadUsesAsEvidence->Put($evidenceID, $peg3, 1);                              $loadUsesAsEvidence->Put($pchID, $peg3, 1);
423                              $loadUsesAsEvidence->Put($evidenceID, $peg4, 2);                              $loadUsesAsEvidence->Put($pchID, $peg4, 2);
424                          }                          }
425                      }                      }
426                  }                  }
# Line 486  Line 488 
488              $loadFeature->Add("genomeIn");              $loadFeature->Add("genomeIn");
489              # Get the feature list for this genome.              # Get the feature list for this genome.
490              my $features = $fig->all_features_detailed($genomeID);              my $features = $fig->all_features_detailed($genomeID);
491                # Sort and count the list.
492                my @featureTuples = sort { $a->[0] cmp $b->[0] } @{$features};
493                my $count = scalar @featureTuples;
494                Trace("$count features found for genome $genomeID.") if T(3);
495                # Set up for our duplicate-feature check.
496                my $oldFeatureID = "";
497              # Loop through the features.              # Loop through the features.
498              for my $featureData (@{$features}) {              for my $featureTuple (@featureTuples) {
                 $loadFeature->Add("featureIn");  
499                  # Split the tuple.                  # Split the tuple.
500                  my ($featureID, $locations, undef, $type) = @{$featureData};                  my ($featureID, $locations, undef, $type) = @{$featureTuple};
501                    # Check for duplicates.
502                    if ($featureID eq $oldFeatureID) {
503                        Trace("Duplicate feature $featureID found.") if T(1);
504                    } else {
505                        $oldFeatureID = $featureID;
506                        # Count this feature.
507                        $loadFeature->Add("featureIn");
508                        # Get the functional assignment.
509                        my $assignment = $fig->function_of($featureID);
510                  # Create the feature record.                  # Create the feature record.
511                  $loadFeature->Put($featureID, 1, $type);                      $loadFeature->Put($featureID, 1, $type, $assignment);
512                  # Link it to the parent genome.                  # Link it to the parent genome.
513                  $loadHasFeature->Put($genomeID, $featureID, $type);                  $loadHasFeature->Put($genomeID, $featureID, $type);
514                  # Create the aliases.                  # Create the aliases.
# Line 546  Line 562 
562              }              }
563          }          }
564      }      }
565        }
566      # Finish the loads.      # Finish the loads.
567      my $retVal = $self->_FinishAll();      my $retVal = $self->_FinishAll();
568      return $retVal;      return $retVal;
# Line 594  Line 611 
611              Trace("Processing features for genome $genomeID.") if T(3);              Trace("Processing features for genome $genomeID.") if T(3);
612              # Get the feature list for this genome.              # Get the feature list for this genome.
613              my $features = $fig->all_features_detailed($genomeID);              my $features = $fig->all_features_detailed($genomeID);
614                # Count the BBHs we find.
615                my $bbhCount = 0;
616              # Loop through the features.              # Loop through the features.
617              for my $featureData (@{$features}) {              for my $featureData (@{$features}) {
618                  # Split the tuple.                  # Split the tuple.
# Line 609  Line 628 
628                      if ($genomeHash->{$targetGenomeID}) {                      if ($genomeHash->{$targetGenomeID}) {
629                          $loadIsBidirectionalBestHitOf->Put($featureID, $targetID, $targetGenomeID,                          $loadIsBidirectionalBestHitOf->Put($featureID, $targetID, $targetGenomeID,
630                                                             $score);                                                             $score);
631                            $bbhCount++;
632                      }                      }
633                  }                  }
634              }              }
635                Trace("$bbhCount BBHs found for $genomeID.") if T(3);
636          }          }
637      }      }
638      # Finish the loads.      # Finish the loads.
# Line 723  Line 744 
744                  my $curator = $sub->get_curator();                  my $curator = $sub->get_curator();
745                  my $notes = $sub->get_notes();                  my $notes = $sub->get_notes();
746                  $loadSubsystem->Put($subsysID, $curator, $notes);                  $loadSubsystem->Put($subsysID, $curator, $notes);
747                  my $class = $fig->subsystem_classification($subsysID);                  my $classList = $fig->subsystem_classification($subsysID);
748                  if ($class) {                  my @classes = @$classList;
749                    if (@classes) {
750                        for my $class (@classes) {
751                      $loadSubsystemClass->Put($subsysID, $class);                      $loadSubsystemClass->Put($subsysID, $class);
752                  }                  }
753                    }
754                  # Connect it to its roles. Each role is a column in the subsystem spreadsheet.                  # Connect it to its roles. Each role is a column in the subsystem spreadsheet.
755                  for (my $col = 0; defined($roleID = $sub->get_role($col)); $col++) {                  for (my $col = 0; defined($roleID = $sub->get_role($col)); $col++) {
756                      # Connect to this role.                      # Connect to this role.
# Line 843  Line 867 
867                      }                      }
868                  }                  }
869              }              }
870            }
871              # Now we loop through the diagrams. We need to create the diagram records              # Now we loop through the diagrams. We need to create the diagram records
872              # and link each diagram to its roles. Note that only roles which occur              # and link each diagram to its roles. Note that only roles which occur
873              # in subsystems (and therefore appear in the %ecToRoles hash) are              # in subsystems (and therefore appear in the %ecToRoles hash) are
# Line 876  Line 901 
901                  }                  }
902              }              }
903          }          }
     }  
904      # Finish the load.      # Finish the load.
905      my $retVal = $self->_FinishAll();      my $retVal = $self->_FinishAll();
906      return $retVal;      return $retVal;
# Line 929  Line 953 
953          my %propertyKeys = ();          my %propertyKeys = ();
954          my $nextID = 1;          my $nextID = 1;
955          # Loop through the genomes.          # Loop through the genomes.
956          for my $genomeID (keys %{$genomeHash}) {          for my $genomeID (sort keys %{$genomeHash}) {
957              $loadProperty->Add("genomeIn");              $loadProperty->Add("genomeIn");
958              Trace("Generating properties for $genomeID.") if T(3);              Trace("Generating properties for $genomeID.") if T(3);
959              # Get the genome's features. The feature ID is the first field in the              # Get the genome's features. The feature ID is the first field in the
# Line 1211  Line 1235 
1235      } else {      } else {
1236          Trace("Generating external data.") if T(2);          Trace("Generating external data.") if T(2);
1237          # We loop through the files one at a time. First, the organism file.          # We loop through the files one at a time. First, the organism file.
1238          Open(\*ORGS, "<$FIG_Config::global/ext_org.table");          Open(\*ORGS, "sort +0 -1 -u -t\"\t\" $FIG_Config::global/ext_org.table |");
1239          my $orgLine;          my $orgLine;
1240          while (defined($orgLine = <ORGS>)) {          while (defined($orgLine = <ORGS>)) {
1241              # Clean the input line.              # Clean the input line.
# Line 1223  Line 1247 
1247          close ORGS;          close ORGS;
1248          # Now the function file.          # Now the function file.
1249          my $funcLine;          my $funcLine;
1250          Open(\*FUNCS, "<$FIG_Config::global/ext_func.table");          Open(\*FUNCS, "sort +0 -1 -u -t\"\t\" $FIG_Config::global/ext_func.table |");
1251          while (defined($funcLine = <FUNCS>)) {          while (defined($funcLine = <FUNCS>)) {
1252              # Clean the line ending.              # Clean the line ending.
1253              chomp $funcLine;              chomp $funcLine;
# Line 1383  Line 1407 
1407          Trace("Generating group data.") if T(2);          Trace("Generating group data.") if T(2);
1408          # Loop through the genomes.          # Loop through the genomes.
1409          my $line;          my $line;
1410          for my $genomeID (keys %{$genomeHash}) {          for my $genomeID (sort keys %{$genomeHash}) {
1411              Trace("Processing $genomeID.") if T(3);              Trace("Processing $genomeID.") if T(3);
1412              # Open the NMPDR group file for this genome.              # Open the NMPDR group file for this genome.
1413              if (open(TMP, "<$FIG_Config::organisms/$genomeID/NMPDR") &&              if (open(TMP, "<$FIG_Config::organisms/$genomeID/NMPDR") &&
# Line 1414  Line 1438 
1438      IsSynonymGroupFor      IsSynonymGroupFor
1439    
1440  The source information for these relations is taken from the C<maps_to_id> method  The source information for these relations is taken from the C<maps_to_id> method
1441  of the B<FIG> object. The process starts from the features, so it is possible  of the B<FIG> object. Unfortunately, to make this work, we need to use direct
1442  that there will be duplicates in the SynonymGroup load file, since the relationship  SQL against the FIG database.
 is one-to-many toward the features. The automatic sort on primary entity relations  
 will fix this for us.  
1443    
1444  =over 4  =over 4
1445    
# Line 1443  Line 1465 
1465          Trace("Loading from existing files.") if T(2);          Trace("Loading from existing files.") if T(2);
1466      } else {      } else {
1467          Trace("Generating synonym group data.") if T(2);          Trace("Generating synonym group data.") if T(2);
1468            # Get the database handle.
1469            my $dbh = $fig->db_handle();
1470            # Ask for the synonyms.
1471            my $sth = $dbh->prepare_command("SELECT maps_to, syn_id FROM peg_synonyms ORDER BY maps_to");
1472            my $result = $sth->execute();
1473            if (! defined($result)) {
1474                Confess("Database error in Synonym load: " . $sth->errstr());
1475            } else {
1476                # Remember the current synonym.
1477                my $current_syn = "";
1478                # Count the features.
1479                my $featureCount = 0;
1480                # Loop through the synonym/peg pairs.
1481                while (my @row = $sth->fetchrow()) {
1482                    # Get the synonym ID and feature ID.
1483                    my ($syn_id, $peg) = @row;
1484                    # Insure it's for one of our genomes.
1485                    my $genomeID = FIG::genome_of($peg);
1486                    if (exists $genomeHash->{$genomeID}) {
1487                        # Verify the synonym.
1488                        if ($syn_id ne $current_syn) {
1489                            # It's new, so put it in the group table.
1490                            $loadSynonymGroup->Put($syn_id);
1491                            $current_syn = $syn_id;
1492                        }
1493                        # Connect the synonym to the peg.
1494                        $loadIsSynonymGroupFor->Put($syn_id, $peg);
1495                        # Count this feature.
1496                        $featureCount++;
1497                        if ($featureCount % 1000 == 0) {
1498                            Trace("$featureCount features processed.") if T(3);
1499                        }
1500                    }
1501                }
1502            }
1503        }
1504        # Finish the load.
1505        my $retVal = $self->_FinishAll();
1506        return $retVal;
1507    }
1508    
1509    =head3 LoadFamilyData
1510    
1511    C<< my $stats = $spl->LoadFamilyData(); >>
1512    
1513    Load the protein families into Sprout.
1514    
1515    The following relations are loaded by this method.
1516    
1517        Family
1518        IsFamilyForFeature
1519    
1520    The source information for these relations is taken from the C<families_for_protein>,
1521    C<family_function>, and C<sz_family> methods of the B<FIG> object.
1522    
1523    =over 4
1524    
1525    =item RETURNS
1526    
1527    Returns a statistics object for the loads.
1528    
1529    =back
1530    
1531    =cut
1532    #: Return Type $%;
1533    sub LoadFamilyData {
1534        # Get this object instance.
1535        my ($self) = @_;
1536        # Get the FIG object.
1537        my $fig = $self->{fig};
1538        # Get the genome hash.
1539        my $genomeHash = $self->{genomes};
1540        # Create load objects for the tables we're loading.
1541        my $loadFamily = $self->_TableLoader('Family');
1542        my $loadIsFamilyForFeature = $self->_TableLoader('IsFamilyForFeature');
1543        if ($self->{options}->{loadOnly}) {
1544            Trace("Loading from existing files.") if T(2);
1545        } else {
1546            Trace("Generating family data.") if T(2);
1547            # Create a hash for the family IDs.
1548            my %familyHash = ();
1549          # Loop through the genomes.          # Loop through the genomes.
1550          for my $genomeID (sort keys %{$genomeHash}) {          for my $genomeID (sort keys %{$genomeHash}) {
1551              Trace("Processing $genomeID.") if T(3);              Trace("Processing features for $genomeID.") if T(2);
1552              # Get all of the features for this genome. The only method that does this is              # Loop through this genome's PEGs.
1553              # all_features_detailed, which returns extra baggage that we discard.              for my $fid ($fig->all_features($genomeID, "peg")) {
1554              my $featureData = $fig->all_features_detailed($genomeID);                  $loadIsFamilyForFeature->Add("features", 1);
1555              my @fids = map { $_->[0] } @{$featureData};                  # Get this feature's families.
1556              Trace(scalar(@fids) . " features found for genome $genomeID.") if T(3);                  my @families = $fig->families_for_protein($fid);
1557              # Loop through the feature IDs.                  # Loop through the families, connecting them to the feature.
1558              for my $fid (@fids) {                  for my $family (@families) {
1559                  # Get the group for this feature.                      $loadIsFamilyForFeature->Put($family, $fid);
1560                  my $synonym = $fig->maps_to_id($fid);                      # If this is a new family, create a record for it.
1561                  # Only proceed if the synonym is a real group.                      if (! exists $familyHash{$family}) {
1562                  if ($synonym ne $fid) {                          $familyHash{$family} = 1;
1563                      $loadSynonymGroup->Put($synonym);                          $loadFamily->Add("families", 1);
1564                      $loadIsSynonymGroupFor->Put($synonym, $fid);                          my $size = $fig->sz_family($family);
1565                            my $func = $fig->family_function($family);
1566                            $loadFamily->Put($family, $size, $func);
1567                        }
1568                  }                  }
1569              }              }
1570          }          }
# Line 1468  Line 1574 
1574      return $retVal;      return $retVal;
1575  }  }
1576    
   
1577  =head2 Internal Utility Methods  =head2 Internal Utility Methods
1578    
1579  =head3 TableLoader  =head3 TableLoader
# Line 1570  Line 1675 
1675          $retVal->Accumulate($stats);          $retVal->Accumulate($stats);
1676          Trace("Statistics for $relName:\n" . $stats->Show()) if T(2);          Trace("Statistics for $relName:\n" . $stats->Show()) if T(2);
1677          }          }
     }  
1678      # Return the load statistics.      # Return the load statistics.
1679      return $retVal;      return $retVal;
1680  }  }

Legend:
Removed from v.1.48  
changed lines
  Added in v.1.67

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3