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

Diff of /Sprout/SearchHelper.pm

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

revision 1.10, Fri Oct 13 21:45:11 2006 UTC revision 1.11, Mon Oct 16 07:44:13 2006 UTC
# Line 609  Line 609 
609    
610  =head3 PutFeature  =head3 PutFeature
611    
612  C<< $shelp->PutFeature($fquery); >>  C<< $shelp->PutFeature($fdata); >>
613    
614  Store a feature in the result cache. This is the workhorse method for most  Store a feature in the result cache. This is the workhorse method for most
615  searches, since the primary data item in the database is features.  searches, since the primary data item in the database is features.
# Line 620  Line 620 
620  the feature query object using the B<AddExtraColumns> method. For example, the following  the feature query object using the B<AddExtraColumns> method. For example, the following
621  code adds columns for essentiality and virulence.  code adds columns for essentiality and virulence.
622    
623      $fq->AddExtraColumns(essential => $essentialFlag, virulence => $vfactor);      $fd->AddExtraColumns(essential => $essentialFlag, virulence => $vfactor);
624      $shelp->PutFeature($fq);      $shelp->PutFeature($fd);
625    
626  For correct results, all values should be specified for all extra columns in all calls to  For correct results, all values should be specified for all extra columns in all calls to
627  B<PutFeature>. (In particular, the column header names are computed on the first  B<PutFeature>. (In particular, the column header names are computed on the first
# Line 631  Line 631 
631      if (! $essentialFlag) {      if (! $essentialFlag) {
632          $essentialFlag = undef;          $essentialFlag = undef;
633      }      }
634      $fq->AddExtraColumns(essential => $essentialFlag, virulence => $vfactor);      $fd->AddExtraColumns(essential => $essentialFlag, virulence => $vfactor);
635      $shelp->PutFeature($fq);      $shelp->PutFeature($fd);
636    
637  =over 4  =over 4
638    
639  =item fquery  =item fdata
640    
641  FeatureQuery object containing the current feature data.  B<FeatureData> object containing the current feature data.
642    
643  =back  =back
644    
# Line 646  Line 646 
646    
647  sub PutFeature {  sub PutFeature {
648      # Get the parameters.      # Get the parameters.
649      my ($self, $fq) = @_;      my ($self, $fd) = @_;
650      # Get the CGI query object.      # Get the CGI query object.
651      my $cgi = $self->Q();      my $cgi = $self->Q();
652      # Get the feature data.      # Get the feature data.
653      my $record = $fq->Feature();      my $record = $fd->Feature();
654      my $extraCols = $fq->ExtraCols();      my $extraCols = $fd->ExtraCols();
655      # Check for a first-call situation.      # Check for a first-call situation.
656      if (! defined $self->{cols}) {      if (! defined $self->{cols}) {
657          # Here we need to set up the column information. Start with the defaults.          # Here we need to set up the column information. Start with the defaults.
658          $self->{cols} = $self->DefaultFeatureColumns();          $self->{cols} = $self->DefaultFeatureColumns();
659          # Add the externals if they were requested.          # Add any additional columns requested by the feature filter.
660          if ($cgi->param('ShowAliases')) {          push @{$self->{cols}}, FeatureQuery::AdditionalColumns($self);
             push @{$self->{cols}}, 'alias';  
         }  
661          # Append the extras, sorted by column name.          # Append the extras, sorted by column name.
662          for my $col (sort keys %{$extraCols}) {          for my $col (sort keys %{$extraCols}) {
663              push @{$self->{cols}}, "X=$col";              push @{$self->{cols}}, "X=$col";
# Line 669  Line 667 
667          $self->WriteColumnHeaders(map { $self->FeatureColumnTitle($_) } @{$self->{cols}});          $self->WriteColumnHeaders(map { $self->FeatureColumnTitle($_) } @{$self->{cols}});
668      }      }
669      # Get the feature ID.      # Get the feature ID.
670      my ($fid) = $record->Value('Feature(id)');      my $fid = $fd->FID();
671      # Loop through the column headers, producing the desired data.      # Loop through the column headers, producing the desired data.
672      my @output = ();      my @output = ();
673      for my $colName (@{$self->{cols}}) {      for my $colName (@{$self->{cols}}) {
# Line 677  Line 675 
675      }      }
676      # Compute the sort key. The sort key usually floats NMPDR organism features to the      # Compute the sort key. The sort key usually floats NMPDR organism features to the
677      # top of the return list.      # top of the return list.
678      my $key = $self->SortKey($record);      my $key = $self->SortKey($fd);
679      # Write the feature data.      # Write the feature data.
680      $self->WriteColumnData($key, @output);      $self->WriteColumnData($key, @output);
681  }  }
# Line 979  Line 977 
977      my ($self, $incomingType, $desiredType, $sequence) = @_;      my ($self, $incomingType, $desiredType, $sequence) = @_;
978      # Declare the return variable. If an error occurs, it will remain undefined.      # Declare the return variable. If an error occurs, it will remain undefined.
979      my $retVal;      my $retVal;
980        # This variable will be cleared if an error is detected.
981        my $okFlag = 1;
982      # Create variables to hold the FASTA label and data.      # Create variables to hold the FASTA label and data.
983      my ($fastaLabel, $fastaData);      my ($fastaLabel, $fastaData);
984        Trace("FASTA incoming type is $incomingType, desired type is $desiredType.") if T(4);
985      # Check for a feature specification.      # Check for a feature specification.
986      if ($sequence =~ /^\s*(\w+\|\S+)\s*$/) {      if ($sequence =~ /^\s*(\w+\|\S+)\s*$/) {
987          # Here we have a feature ID in $1. We'll need the Sprout object to process          # Here we have a feature ID in $1. We'll need the Sprout object to process
988          # it.          # it.
989          my $fid = $1;          my $fid = $1;
990            Trace("Feature ID for fasta is $fid.") if T(3);
991          my $sprout = $self->DB();          my $sprout = $self->DB();
992          # Get the FIG ID. Note that we only use the first feature found. We are not          # Get the FIG ID. Note that we only use the first feature found. We are not
993          # supposed to have redundant aliases, though we may have an ID that doesn't          # supposed to have redundant aliases, though we may have an ID that doesn't
# Line 993  Line 995 
995          my ($figID) = $sprout->FeaturesByAlias($fid);          my ($figID) = $sprout->FeaturesByAlias($fid);
996          if (! $figID) {          if (! $figID) {
997              $self->SetMessage("No feature found with the ID \"$fid\".");              $self->SetMessage("No feature found with the ID \"$fid\".");
998                $okFlag = 0;
999          } else {          } else {
1000              # Set the FASTA label.              # Set the FASTA label.
1001              my $fastaLabel = $fid;              my $fastaLabel = $fid;
1002              # Now proceed according to the sequence type.              # Now proceed according to the sequence type.
1003              if ($desiredType =~ /prot/i) {              if ($desiredType eq 'prot') {
1004                  # We want protein, so get the translation.                  # We want protein, so get the translation.
1005                  $fastaData = $sprout->FeatureTranslation($figID);                  $fastaData = $sprout->FeatureTranslation($figID);
1006                    Trace(length $fastaData . " characters returned for translation of $fastaLabel.") if T(3);
1007              } else {              } else {
1008                  # We want DNA, so get the DNA sequence. This is a two-step process.                  # We want DNA, so get the DNA sequence. This is a two-step process.
1009                  my @locList = $sprout->FeatureLocation($figID);                  my @locList = $sprout->FeatureLocation($figID);
1010                  $fastaData = $sprout->DNASeq(\@locList);                  $fastaData = $sprout->DNASeq(\@locList);
1011                    Trace(length $fastaData . " characters returned for DNA of $fastaLabel.") if T(3);
1012              }              }
1013          }          }
1014      } elsif ($incomingType =~ /prot/ && $desiredType =~ /dna/) {      } elsif ($incomingType eq 'prot' && $desiredType eq 'dna') {
1015          # Here we're being asked to do an impossible conversion.          # Here we're being asked to do an impossible conversion.
1016          $self->SetMessage("Cannot convert a protein sequence to DNA.");          $self->SetMessage("Cannot convert a protein sequence to DNA.");
1017            $okFlag = 0;
1018      } else {      } else {
1019            Trace("Analyzing FASTA sequence.") if T(4);
1020          # Here we are expecting a FASTA. We need to see if there's a label.          # Here we are expecting a FASTA. We need to see if there's a label.
1021          if ($sequence =~ /^>\s*(\S.*)\s*\n(.+)$/) {          if ($sequence =~ /^>[\n\s]*(\S[^\n]*)\n(.+)$/s) {
1022                Trace("Label \"$1\" found in match to sequence:\n$sequence") if T(4);
1023              # Here we have a label, so we split it from the data.              # Here we have a label, so we split it from the data.
1024              $fastaLabel = $1;              $fastaLabel = $1;
1025              $fastaData = $2;              $fastaData = $2;
1026          } else {          } else {
1027                Trace("No label found in match to sequence:\n$sequence") if T(4);
1028              # Here we have no label, so we create one and use the entire sequence              # Here we have no label, so we create one and use the entire sequence
1029              # as data.              # as data.
1030              $fastaLabel = "User-specified $incomingType sequence";              $fastaLabel = "User-specified $incomingType sequence";
# Line 1028  Line 1037 
1037          # we've already prevented a conversion from protein to DNA.          # we've already prevented a conversion from protein to DNA.
1038          if ($incomingType ne $desiredType) {          if ($incomingType ne $desiredType) {
1039              $fastaData = Sprout::Protein($fastaData);              $fastaData = Sprout::Protein($fastaData);
1040                # Check for bad characters.
1041                if ($fastaData =~ /X/) {
1042                    $self->SetMessage("Invalid characters detected. Is the input really of type $incomingType?");
1043                    $okFlag = 0;
1044                }
1045            } elsif ($desiredType eq 'dna' && $fastaData =~ /[^agct]/i) {
1046                $self->SetMessage("Invaid characters detected. Is the input really a DNA sequence?");
1047                $okFlag = 0;
1048          }          }
1049      }      }
1050      # At this point, either "$fastaLabel" and "$fastaData" have values or an error is      Trace("FASTA data sequence: $fastaData") if T(4);
1051      # in progress.      # Only proceed if no error was detected.
1052      if (defined $fastaLabel) {      if ($okFlag) {
1053          # We need to format the sequence into 60-byte chunks. We use the infamous          # We need to format the sequence into 60-byte chunks. We use the infamous
1054          # grep-split trick. The split, because of the presence of the parentheses,          # grep-split trick. The split, because of the presence of the parentheses,
1055          # includes the matched delimiters in the output list. The grep strips out          # includes the matched delimiters in the output list. The grep strips out
1056          # the empty list items that appear between the so-called delimiters, since          # the empty list items that appear between the so-called delimiters, since
1057          # the delimiters are what we want.          # the delimiters are what we want.
1058          my @chunks = grep { $_ } split /(.{1,60})/, $fastaData;          my @chunks = grep { $_ } split /(.{1,60})/, $fastaData;
1059          my $retVal = join("\n", ">$fastaLabel", @chunks, "");          $retVal = join("\n", ">$fastaLabel", @chunks, "");
1060      }      }
1061      # Return the result.      # Return the result.
1062      return $retVal;      return $retVal;
# Line 1354  Line 1371 
1371    
1372  C<< my $htmlText = $shelp->FeatureFilterRows(); >>  C<< my $htmlText = $shelp->FeatureFilterRows(); >>
1373    
1374  This method creates table rows that can be used to filter features. There are  This method creates table rows that can be used to filter features. The form
1375  two rows returned, and the values can be used to select features by genome  values can be used to select features by genome using the B<FeatureQuery>
1376  using the B<FeatureQuery> object.  object.
1377    
1378  =cut  =cut
1379    
# Line 2006  Line 2023 
2023    
2024  =head3 SortKey  =head3 SortKey
2025    
2026  C<< my $key = $shelp->SortKey($record); >>  C<< my $key = $shelp->SortKey($fdata); >>
2027    
2028  Return the sort key for the specified record. The default is to sort by feature name,  Return the sort key for the specified feature data. The default is to sort by feature name,
2029  floating NMPDR organisms to the top. If a full-text search is used, then the default  floating NMPDR organisms to the top. If a full-text search is used, then the default
2030  sort is by relevance followed by feature name. This sort may be overridden by the  sort is by relevance followed by feature name. This sort may be overridden by the
2031  search class to provide fancier functionality. This method is called by  search class to provide fancier functionality. This method is called by
# Line 2019  Line 2036 
2036    
2037  =item record  =item record
2038    
2039  The C<DBObject> from which the current row of data is derived.  The C<FeatureData> containing the current feature.
2040    
2041  =item RETURN  =item RETURN
2042    
# Line 2031  Line 2048 
2048    
2049  sub SortKey {  sub SortKey {
2050      # Get the parameters.      # Get the parameters.
2051      my ($self, $record) = @_;      my ($self, $fdata) = @_;
2052      # Get the feature ID from the record.      # Get the feature ID from the record.
2053      my ($fid) = $record->Value('Feature(id)');      my $fid = $fdata->FID();
2054      # Get the group from the feature ID.      # Get the group from the feature ID.
2055      my $group = $self->FeatureGroup($fid);      my $group = $self->FeatureGroup($fid);
2056      # Ask the feature query object to form the sort key.      # Ask the feature query object to form the sort key.
2057      my $retVal = FeatureQuery::SortKey($self, $group, $record);      my $retVal = $fdata->SortKey($self, $group);
2058      # Return the result.      # Return the result.
2059      return $retVal;      return $retVal;
2060  }  }

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3