[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.40, Thu Jun 8 15:37:32 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 375  Line 375 
375                  for my $coupleData (@couplings) {                  for my $coupleData (@couplings) {
376                      my ($peg2, $score) = @{$coupleData};                      my ($peg2, $score) = @{$coupleData};
377                      # Compute the coupling ID.                      # Compute the coupling ID.
378                      my $coupleID = Sprout::CouplingID($peg1, $peg2);                      my $coupleID = $self->{erdb}->CouplingID($peg1, $peg2);
379                      if (! exists $dupHash{$coupleID}) {                      if (! exists $dupHash{$coupleID}) {
380                          $loadCoupling->Add("couplingIn");                          $loadCoupling->Add("couplingIn");
381                          # Here we have a new coupling to store in the load files.                          # Here we have a new coupling to store in the load files.
# 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 634  Line 655 
655  The following relations are loaded by this method.  The following relations are loaded by this method.
656    
657      Subsystem      Subsystem
658        SubsystemClass
659      Role      Role
660      RoleEC      RoleEC
661      SSCell      SSCell
# Line 696  Line 718 
718      my $loadConsistsOfGenomes = $self->_TableLoader('ConsistsOfGenomes', $self->PrimaryOnly);      my $loadConsistsOfGenomes = $self->_TableLoader('ConsistsOfGenomes', $self->PrimaryOnly);
719      my $loadHasRoleSubset = $self->_TableLoader('HasRoleSubset', $self->PrimaryOnly);      my $loadHasRoleSubset = $self->_TableLoader('HasRoleSubset', $self->PrimaryOnly);
720      my $loadHasGenomeSubset = $self->_TableLoader('HasGenomeSubset', $self->PrimaryOnly);      my $loadHasGenomeSubset = $self->_TableLoader('HasGenomeSubset', $self->PrimaryOnly);
721        my $loadSubsystemClass = $self->_TableLoader('SubsystemClass', $self->PrimaryOnly);
722      if ($self->{options}->{loadOnly}) {      if ($self->{options}->{loadOnly}) {
723          Trace("Loading from existing files.") if T(2);          Trace("Loading from existing files.") if T(2);
724      } else {      } else {
# Line 721  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 $classList = $fig->subsystem_classification($subsysID);
748                    my @classes = @$classList;
749                    if (@classes) {
750                        for my $class (@classes) {
751                            $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 785  Line 815 
815                          if ($pegCount > 0) {                          if ($pegCount > 0) {
816                              Trace("$pegCount PEGs in $cellCount cells for $genomeID.") if T(3);                              Trace("$pegCount PEGs in $cellCount cells for $genomeID.") if T(3);
817                              $loadParticipatesIn->Put($genomeID, $subsysID, $variantCode);                              $loadParticipatesIn->Put($genomeID, $subsysID, $variantCode);
                             # Partition the PEGs found into clusters.  
                             my @clusters = $fig->compute_clusters(\@pegsFound, $sub);  
818                              # Create a hash mapping PEG IDs to cluster numbers.                              # Create a hash mapping PEG IDs to cluster numbers.
819                              # We default to -1 for all of them.                              # We default to -1 for all of them.
820                              my %clusterOf = map { $_ => -1 } @pegsFound;                              my %clusterOf = map { $_ => -1 } @pegsFound;
821                                # Partition the PEGs found into clusters.
822                                my @clusters = $fig->compute_clusters([keys %clusterOf], $sub);
823                              for (my $i = 0; $i <= $#clusters; $i++) {                              for (my $i = 0; $i <= $#clusters; $i++) {
824                                  my $subList = $clusters[$i];                                  my $subList = $clusters[$i];
825                                  for my $peg (@{$subList}) {                                  for my $peg (@{$subList}) {
# Line 837  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 870  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 923  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 1042  Line 1072 
1072                  # Get the annotation tuple.                  # Get the annotation tuple.
1073                  my ($peg, $timestamp, $user, $text) = @{$tuple};                  my ($peg, $timestamp, $user, $text) = @{$tuple};
1074                  # Here we fix up the annotation text. "\r" is removed,                  # Here we fix up the annotation text. "\r" is removed,
1075                  # and "\t" and "\n" are escaped. Note we use the "s"                  # and "\t" and "\n" are escaped. Note we use the "gs"
1076                  # modifier so that new-lines inside the text do not                  # modifier so that new-lines inside the text do not
1077                  # stop the substitution search.                  # stop the substitution search.
1078                  $text =~ s/\r//gs;                  $text =~ s/\r//gs;
# Line 1205  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 1217  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 1377  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 1396  Line 1426 
1426      return $retVal;      return $retVal;
1427  }  }
1428    
1429    =head3 LoadSynonymData
1430    
1431    C<< my $stats = $spl->LoadSynonymData(); >>
1432    
1433    Load the synonym groups into Sprout.
1434    
1435    The following relations are loaded by this method.
1436    
1437        SynonymGroup
1438        IsSynonymGroupFor
1439    
1440    The source information for these relations is taken from the C<maps_to_id> method
1441    of the B<FIG> object. Unfortunately, to make this work, we need to use direct
1442    SQL against the FIG database.
1443    
1444    =over 4
1445    
1446    =item RETURNS
1447    
1448    Returns a statistics object for the loads.
1449    
1450    =back
1451    
1452    =cut
1453    #: Return Type $%;
1454    sub LoadSynonymData {
1455        # Get this object instance.
1456        my ($self) = @_;
1457        # Get the FIG object.
1458        my $fig = $self->{fig};
1459        # Get the genome hash.
1460        my $genomeHash = $self->{genomes};
1461        # Create a load object for the table we're loading.
1462        my $loadSynonymGroup = $self->_TableLoader('SynonymGroup');
1463        my $loadIsSynonymGroupFor = $self->_TableLoader('IsSynonymGroupFor');
1464        if ($self->{options}->{loadOnly}) {
1465            Trace("Loading from existing files.") if T(2);
1466        } else {
1467            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.
1550            for my $genomeID (sort keys %{$genomeHash}) {
1551                Trace("Processing features for $genomeID.") if T(2);
1552                # Loop through this genome's PEGs.
1553                for my $fid ($fig->all_features($genomeID, "peg")) {
1554                    $loadIsFamilyForFeature->Add("features", 1);
1555                    # Get this feature's families.
1556                    my @families = $fig->families_for_protein($fid);
1557                    # Loop through the families, connecting them to the feature.
1558                    for my $family (@families) {
1559                        $loadIsFamilyForFeature->Put($family, $fid);
1560                        # If this is a new family, create a record for it.
1561                        if (! exists $familyHash{$family}) {
1562                            $familyHash{$family} = 1;
1563                            $loadFamily->Add("families", 1);
1564                            my $size = $fig->sz_family($family);
1565                            my $func = $fig->family_function($family);
1566                            $loadFamily->Put($family, $size, $func);
1567                        }
1568                    }
1569                }
1570            }
1571        }
1572        # Finish the load.
1573        my $retVal = $self->_FinishAll();
1574        return $retVal;
1575    }
1576    
1577  =head2 Internal Utility Methods  =head2 Internal Utility Methods
1578    
1579  =head3 TableLoader  =head3 TableLoader
# Line 1463  Line 1641 
1641      my $retVal = Stats->new();      my $retVal = Stats->new();
1642      # Get the loader list.      # Get the loader list.
1643      my $loadList = $self->{loaders};      my $loadList = $self->{loaders};
1644        # Create a hash to hold the statistics objects, keyed on relation name.
1645        my %loaderHash = ();
1646      # Loop through the list, finishing the loads. Note that if the finish fails, we die      # Loop through the list, finishing the loads. Note that if the finish fails, we die
1647      # ignominiously. At some future point, we want to make the loads restartable.      # ignominiously. At some future point, we want to make the loads more restartable.
1648      while (my $loader = pop @{$loadList}) {      while (my $loader = pop @{$loadList}) {
1649          # Get the relation name.          # Get the relation name.
1650          my $relName = $loader->RelName;          my $relName = $loader->RelName;
# Line 1475  Line 1655 
1655              # Here we really need to finish.              # Here we really need to finish.
1656              Trace("Finishing $relName.") if T(2);              Trace("Finishing $relName.") if T(2);
1657              my $stats = $loader->Finish();              my $stats = $loader->Finish();
1658                $loaderHash{$relName} = $stats;
1659            }
1660        }
1661        # Now we loop through again, actually loading the tables. We want to finish before
1662        # loading so that if something goes wrong at this point, all the load files are usable
1663        # and we don't have to redo all that work.
1664        for my $relName (sort keys %loaderHash) {
1665            # Get the statistics for this relation.
1666            my $stats = $loaderHash{$relName};
1667            # Check for a database load.
1668              if ($self->{options}->{dbLoad}) {              if ($self->{options}->{dbLoad}) {
1669                  # Here we want to use the load file just created to load the database.                  # Here we want to use the load file just created to load the database.
1670                  Trace("Loading relation $relName.") if T(2);                  Trace("Loading relation $relName.") if T(2);
# Line 1485  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.40  
changed lines
  Added in v.1.67

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3