|  | @@ -62,273 +62,264 @@ $no_hits = TRUE;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <div class="blast-report">
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -<!-- Provide Information to the user about their blast job -->
 | 
	
		
			
				|  |  | -<div class="blast-job-info">
 | 
	
		
			
				|  |  | -<?php 
 | 
	
		
			
				|  |  | -  $output_files = array();
 | 
	
		
			
				|  |  | -  if (file_exists($blast_job->files->result->html))
 | 
	
		
			
				|  |  | -    $output_files['html'] = array('path' => $blast_job->files->result->html, 'title' => 'Alignment');
 | 
	
		
			
				|  |  | -  if (file_exists($blast_job->files->result->tsv))
 | 
	
		
			
				|  |  | -    $output_files['tsv'] = array('path' => $blast_job->files->result->tsv, 'title' => 'Tab-Delimited');
 | 
	
		
			
				|  |  | -  if (file_exists($blast_job->files->result->gff))
 | 
	
		
			
				|  |  | -    $output_files['gff'] = array('path' => $blast_job->files->result->gff, 'title' => 'GFF3');
 | 
	
		
			
				|  |  | -  if (file_exists($blast_job->files->result->xml))
 | 
	
		
			
				|  |  | -    $output_files['xml'] = array('path' => $blast_job->files->result->xml, 'title' => 'XML');
 | 
	
		
			
				|  |  | -?>
 | 
	
		
			
				|  |  | -  <?php if(!empty($output_files)): ?>
 | 
	
		
			
				|  |  | -  <div class="blast-download-info"><strong>Download</strong>:
 | 
	
		
			
				|  |  | -    <?php
 | 
	
		
			
				|  |  | -      $i = 0;
 | 
	
		
			
				|  |  | -      foreach($output_files as $file) {
 | 
	
		
			
				|  |  | -        $i++;
 | 
	
		
			
				|  |  | -        print l($file['title'], $file['path']);
 | 
	
		
			
				|  |  | -        if (sizeof($output_files) != $i) print ', ';
 | 
	
		
			
				|  |  | -    } ?>
 | 
	
		
			
				|  |  | -  </div>
 | 
	
		
			
				|  |  | -  <?php endif; ?>
 | 
	
		
			
				|  |  | -  <br />
 | 
	
		
			
				|  |  | -  <div class="blast-query-info"><strong>Query Information</strong>:
 | 
	
		
			
				|  |  | -    <?php print $blast_job->files->query;?></div>
 | 
	
		
			
				|  |  | -  <div class="blast-target-info"><strong>Search Target</strong>:
 | 
	
		
			
				|  |  | -    <?php print $blast_job->blastdb->db_name;?></div>
 | 
	
		
			
				|  |  | -  <div class="blast-date-info"><strong>Submission Date</strong>:
 | 
	
		
			
				|  |  | -    <?php print format_date($blast_job->date_submitted, 'medium');?></div>
 | 
	
		
			
				|  |  | -  <div class="blast-cmd-info"><strong>BLAST Command executed</strong>:
 | 
	
		
			
				|  |  | -    <?php print $blast_job->blast_cmd;?></div>
 | 
	
		
			
				|  |  | +  <div class="blast-job-info">
 | 
	
		
			
				|  |  | +    <!-- Provide Information to the user about their blast job -->
 | 
	
		
			
				|  |  | +    <div class="blast-job-info">
 | 
	
		
			
				|  |  | +      <div class="blast-download-info"><strong>Download</strong>:
 | 
	
		
			
				|  |  | +        <a href="<?php print '../../' . $blast_job->files->result->html; ?>">Alignment</a>,
 | 
	
		
			
				|  |  | +        <a href="<?php print '../../' . $blast_job->files->result->tsv; ?>">Tab-Delimited</a>,
 | 
	
		
			
				|  |  | +        <a href="<?php print '../../' . $blast_job->files->result->xml; ?>">XML</a>,
 | 
	
		
			
				|  |  | +        <a href="<?php print '../../' . $blast_job->files->result->gff; ?>">GFF3</a>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +      <br />
 | 
	
		
			
				|  |  | +      <div class="blast-query-info"><strong>Query Information</strong>: 
 | 
	
		
			
				|  |  | +        <?php print $blast_job->files->query;?></div>
 | 
	
		
			
				|  |  | +      <div class="blast-target-info"><strong>Search Target</strong>: 
 | 
	
		
			
				|  |  | +        <?php print $blast_job->blastdb->db_name;?></div>
 | 
	
		
			
				|  |  | +      <div class="blast-date-info"><strong>Submission Date</strong>: 
 | 
	
		
			
				|  |  | +        <?php print format_date($blast_job->date_submitted, 'medium');?></div>
 | 
	
		
			
				|  |  | +      <div class="blast-cmd-info"><strong>BLAST Command executed</strong>: 
 | 
	
		
			
				|  |  | +        <?php print $blast_job->blast_cmd;?></div>
 | 
	
		
			
				|  |  | +      <br />
 | 
	
		
			
				|  |  | +      <div class="num-results">
 | 
	
		
			
				|  |  | +        <strong>Number of Results</strong>: <?php print $num_results; ?>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    <br />
 | 
	
		
			
				|  |  | +    <div class="num-results">
 | 
	
		
			
				|  |  | +      <strong>Number of Results</strong>: <?php print $num_results; ?>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  </div>
 | 
	
		
			
				|  |  |    <br />
 | 
	
		
			
				|  |  | -  <div class="num-results"><strong>Number of Results</strong>: <?php print $num_results; ?></div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -</div>
 | 
	
		
			
				|  |  | -<br />
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -<?php
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * We are using the drupal table theme functionality to create this listing
 | 
	
		
			
				|  |  | - * @see theme_table() for additional documentation
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | +  <div class="report-table">
 | 
	
		
			
				|  |  | +    <?php
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * We are using the drupal table theme functionality to create this listing
 | 
	
		
			
				|  |  | +     * @see theme_table() for additional documentation
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -if ($xml) {
 | 
	
		
			
				|  |  | -?>
 | 
	
		
			
				|  |  | +    if ($xml) {
 | 
	
		
			
				|  |  | +    ?>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -<p>The following table summarizes the results of your BLAST.
 | 
	
		
			
				|  |  | -Click on a <em>triangle </em> on the left to see the alignment and a visualization of the hit,
 | 
	
		
			
				|  |  | -and click the <em>target name </em> to get more information about the target hit.</p>
 | 
	
		
			
				|  |  | +    <p>The following table summarizes the results of your BLAST.
 | 
	
		
			
				|  |  | +    Click on a <em>triangle </em> on the left to see the alignment and a visualization of the hit,
 | 
	
		
			
				|  |  | +    and click the <em>target name </em> to get more information about the target hit.</p>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -<?php
 | 
	
		
			
				|  |  | -  // Specify the header of the table
 | 
	
		
			
				|  |  | -  $header = array(
 | 
	
		
			
				|  |  | -    'arrow-col' =>  array('data' => '', 'class' => array('arrow-col')),
 | 
	
		
			
				|  |  | -    'number' =>  array('data' => '#', 'class' => array('number')),
 | 
	
		
			
				|  |  | -    'query' =>  array('data' => 'Query Name  (Click for alignment & visualization)', 'class' => array('query')),
 | 
	
		
			
				|  |  | -    'hit' =>  array('data' => 'Target Name', 'class' => array('hit')),
 | 
	
		
			
				|  |  | -    'evalue' =>  array('data' => 'E-Value', 'class' => array('evalue')),
 | 
	
		
			
				|  |  | -  );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  $rows = array();
 | 
	
		
			
				|  |  | -  $count = 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Parse the BLAST XML to generate the rows of the table
 | 
	
		
			
				|  |  | -  // where each hit results in two rows in the table: 1) A summary of the query/hit and
 | 
	
		
			
				|  |  | -  // significance and 2) additional information including the alignment
 | 
	
		
			
				|  |  | -  foreach ($xml->{'BlastOutput_iterations'}->children() as $iteration) {
 | 
	
		
			
				|  |  | -    $children_count = $iteration->{'Iteration_hits'}->children()->count();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // Save some information needed for the hit visualization.
 | 
	
		
			
				|  |  | -    $target_name = '';
 | 
	
		
			
				|  |  | -    $q_name = $xml->{'BlastOutput_query-def'};
 | 
	
		
			
				|  |  | -    $query_size = $xml->{'BlastOutput_query-len'};
 | 
	
		
			
				|  |  | -    $target_size = $iteration->{'Iteration_stat'}->{'Statistics'}->{'Statistics_db-len'};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if ($children_count != 0) {
 | 
	
		
			
				|  |  | -      foreach ($iteration->{'Iteration_hits'}->children() as $hit) {
 | 
	
		
			
				|  |  | -        if (is_object($hit)) {
 | 
	
		
			
				|  |  | -          $count +=1;
 | 
	
		
			
				|  |  | -          $zebra_class = ($count % 2 == 0) ? 'even' : 'odd';
 | 
	
		
			
				|  |  | -          $no_hits = FALSE;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // SUMMARY ROW
 | 
	
		
			
				|  |  | -          // -- Save additional information needed for the summary.
 | 
	
		
			
				|  |  | -          $score = (float) $hit->{'Hit_hsps'}->{'Hsp'}->{'Hsp_score'};
 | 
	
		
			
				|  |  | -          $evalue = (float) $hit->{'Hit_hsps'}->{'Hsp'}->{'Hsp_evalue'};
 | 
	
		
			
				|  |  | -          $query_name = (string) $iteration->{'Iteration_query-def'};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // If the id is of the form gnl|BL_ORD_ID|### then the parseids flag
 | 
	
		
			
				|  |  | -          // to makeblastdb did a really poor job. In thhis case we want to use
 | 
	
		
			
				|  |  | -          // the def to provide the original FASTA header.
 | 
	
		
			
				|  |  | -          // @todo Deepak changed this to use just the hit_def; inquire as to why.
 | 
	
		
			
				|  |  | -          $hit_name = (preg_match('/BL_ORD_ID/', $hit->{'Hit_id'})) ? $hit->{'Hit_def'} : $hit->{'Hit_id'};
 | 
	
		
			
				|  |  | -          // Used for the hit visualization to ensure the name isn't truncated.
 | 
	
		
			
				|  |  | -          $hit_name_short = (preg_match('/^([^\s]+)/', $hit_name, $matches)) ? $matches[1] : $hit_name;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // Round e-value to two decimal values.
 | 
	
		
			
				|  |  | -          $rounded_evalue = '';
 | 
	
		
			
				|  |  | -          if (strpos($evalue,'e') != false) {
 | 
	
		
			
				|  |  | -            $evalue_split = explode('e', $evalue);
 | 
	
		
			
				|  |  | -            $rounded_evalue = round($evalue_split[0], 2, PHP_ROUND_HALF_EVEN);
 | 
	
		
			
				|  |  | -            $rounded_evalue .= 'e' . $evalue_split[1];
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          else {
 | 
	
		
			
				|  |  | -            $rounded_evalue = $evalue;
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // State what should be in the summary row for theme_table() later.
 | 
	
		
			
				|  |  | -          $summary_row = array(
 | 
	
		
			
				|  |  | -            'data' => array(
 | 
	
		
			
				|  |  | -              'arrow-col' => array('data' => '<div class="arrow"></div>', 'class' => array('arrow-col')),
 | 
	
		
			
				|  |  | -              'number' => array('data' => $count, 'class' => array('number')),
 | 
	
		
			
				|  |  | -              'query' => array('data' => $query_name, 'class' => array('query')),
 | 
	
		
			
				|  |  | -              'hit' => array('data' => $hit_name, 'class' => array('hit')),
 | 
	
		
			
				|  |  | -              'evalue' => array('data' => $rounded_evalue, 'class' => array('evalue')),
 | 
	
		
			
				|  |  | -            ),
 | 
	
		
			
				|  |  | -            'class' => array('result-summary')
 | 
	
		
			
				|  |  | -          );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // ALIGNMENT ROW (collapsed by default)
 | 
	
		
			
				|  |  | -          // Process HSPs
 | 
	
		
			
				|  |  | -          $HSPs = array();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // We need to save some additional summary information in order to draw the
 | 
	
		
			
				|  |  | -          // hit visualization. First, initialize some variables...
 | 
	
		
			
				|  |  | -          $track_start = INF;
 | 
	
		
			
				|  |  | -          $track_end = -1;
 | 
	
		
			
				|  |  | -          $hsps_range = '';
 | 
	
		
			
				|  |  | -          $hit_hsps = '';
 | 
	
		
			
				|  |  | -          $hit_hsp_score = '';
 | 
	
		
			
				|  |  | -          $target_size = $hit->{'Hit_len'};
 | 
	
		
			
				|  |  | -          $Hsp_bit_score = '';
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // Then for each hit hsp, keep track of the start of first hsp and the end of
 | 
	
		
			
				|  |  | -          // the last hsp. Keep in mind that hsps might not be recorded in order.
 | 
	
		
			
				|  |  | -          foreach ($hit->{'Hit_hsps'}->children() as $hsp_xml) {
 | 
	
		
			
				|  |  | -            $HSPs[] = (array) $hsp_xml;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if ($track_start > $hsp_xml->{'Hsp_hit-from'}) {
 | 
	
		
			
				|  |  | -              $track_start = $hsp_xml->{'Hsp_hit-from'} . "";
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if ($track_end < $hsp_xml->{'Hsp_hit-to'}) {
 | 
	
		
			
				|  |  | -              $track_end = $hsp_xml->{'Hsp_hit-to'} . "";
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // The BLAST visualization code requires the hsps to be formatted in a
 | 
	
		
			
				|  |  | -            // very specific manner. Here we build up the strings to be submitted.
 | 
	
		
			
				|  |  | -            // hits=4263001_4262263_1_742;4260037_4259524_895_1411;&scores=722;473;
 | 
	
		
			
				|  |  | -            $hit_hsps .=  $hsp_xml->{'Hsp_hit-from'} . '_' .
 | 
	
		
			
				|  |  | -                          $hsp_xml->{'Hsp_hit-to'} . '_' .
 | 
	
		
			
				|  |  | -                          $hsp_xml->{'Hsp_query-from'} . '_' . $hsp_xml->{'Hsp_query-to'} .
 | 
	
		
			
				|  |  | -                          ';';
 | 
	
		
			
				|  |  | -            $Hsp_bit_score .=   $hsp_xml->{'Hsp_bit-score'} .';';
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          // Finally record the range.
 | 
	
		
			
				|  |  | -          // @todo figure out why we arbitrarily subtract 50,000 here...
 | 
	
		
			
				|  |  | -          // @more removing the 50,000 and using track start/end appears to cause no change...
 | 
	
		
			
				|  |  | -          $range_start = (int) $track_start;// - 50000;
 | 
	
		
			
				|  |  | -          $range_end = (int) $track_end;// + 50000;
 | 
	
		
			
				|  |  | -          if ($range_start < 1) $range_start = 1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // Call the function to generate the hit image.
 | 
	
		
			
				|  |  | -          $hit_img = generate_blast_hit_image($target_name, $Hsp_bit_score, $hit_hsps,
 | 
	
		
			
				|  |  | -                                   $target_size, $query_size, $q_name, $hit_name_short);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // State what should be in the alignment row for theme_table() later.
 | 
	
		
			
				|  |  | -          $alignment_row = array(
 | 
	
		
			
				|  |  | -            'data' => array(
 | 
	
		
			
				|  |  | -              'arrow' => array(
 | 
	
		
			
				|  |  | -                'data' => theme('blast_report_alignment_row', array('HSPs' => $HSPs, 'hit_visualization' => $hit_img)),
 | 
	
		
			
				|  |  | -                'colspan' => 5,
 | 
	
		
			
				|  |  | -              ),
 | 
	
		
			
				|  |  | -            ),
 | 
	
		
			
				|  |  | -            'class' => array('alignment-row', $zebra_class),
 | 
	
		
			
				|  |  | -            'no_striping' => TRUE
 | 
	
		
			
				|  |  | -          );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // LINK-OUTS.
 | 
	
		
			
				|  |  | -          // It was determined above whether link-outs were supported for the
 | 
	
		
			
				|  |  | -          // tripal blast database used as a search target. Thus we only want to
 | 
	
		
			
				|  |  | -          // determine a link-out if it's actually supported... ;-)
 | 
	
		
			
				|  |  | -          if ($linkout) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // First extract the linkout text using the regex provided through
 | 
	
		
			
				|  |  | -            // the Tripal blast database node.
 | 
	
		
			
				|  |  | -            if (preg_match($linkout_regex, $hit_name, $linkout_match)) {
 | 
	
		
			
				|  |  | -              $hit->{'linkout_id'} = $linkout_match[1];
 | 
	
		
			
				|  |  | -              $hit->{'hit_name'} = $hit_name;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -              // Allow custom functions to determine the URL to support more complicated
 | 
	
		
			
				|  |  | -              // link-outs rather than just using the tripal database prefix.
 | 
	
		
			
				|  |  | -              $hit_name = call_user_func(
 | 
	
		
			
				|  |  | -                $url_function,
 | 
	
		
			
				|  |  | -                $linkout_urlprefix,
 | 
	
		
			
				|  |  | -                $hit,
 | 
	
		
			
				|  |  | -                array(
 | 
	
		
			
				|  |  | -                  'query_name' => $query_name,
 | 
	
		
			
				|  |  | -                  'score'      => $score,
 | 
	
		
			
				|  |  | -                  'e-value'    => $evalue,
 | 
	
		
			
				|  |  | -                  'HSPs'       => $HSPs,
 | 
	
		
			
				|  |  | -                  'Target'     => $blast_job->blastdb->db_name,
 | 
	
		
			
				|  |  | -                )
 | 
	
		
			
				|  |  | +    <?php
 | 
	
		
			
				|  |  | +      // Specify the header of the table
 | 
	
		
			
				|  |  | +      $header = array(
 | 
	
		
			
				|  |  | +        'arrow-col' =>  array('data' => '', 'class' => array('arrow-col')),
 | 
	
		
			
				|  |  | +        'number' =>  array('data' => '#', 'class' => array('number')),
 | 
	
		
			
				|  |  | +        'query' =>  array('data' => 'Query Name  (Click for alignment & visualization)', 'class' => array('query')),
 | 
	
		
			
				|  |  | +        'hit' =>  array('data' => 'Target Name', 'class' => array('hit')),
 | 
	
		
			
				|  |  | +        'evalue' =>  array('data' => 'E-Value', 'class' => array('evalue')),
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      $rows = array();
 | 
	
		
			
				|  |  | +      $count = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // Parse the BLAST XML to generate the rows of the table
 | 
	
		
			
				|  |  | +      // where each hit results in two rows in the table: 1) A summary of the query/hit and
 | 
	
		
			
				|  |  | +      // significance and 2) additional information including the alignment
 | 
	
		
			
				|  |  | +      foreach ($xml->{'BlastOutput_iterations'}->children() as $iteration) {
 | 
	
		
			
				|  |  | +        $children_count = $iteration->{'Iteration_hits'}->children()->count();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Save some information needed for the hit visualization.
 | 
	
		
			
				|  |  | +        $target_name = '';
 | 
	
		
			
				|  |  | +        $q_name = $xml->{'BlastOutput_query-def'};
 | 
	
		
			
				|  |  | +        $query_size = $xml->{'BlastOutput_query-len'};
 | 
	
		
			
				|  |  | +        $target_size = $iteration->{'Iteration_stat'}->{'Statistics'}->{'Statistics_db-len'};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if ($children_count != 0) {
 | 
	
		
			
				|  |  | +          foreach ($iteration->{'Iteration_hits'}->children() as $hit) {
 | 
	
		
			
				|  |  | +            if (is_object($hit)) {
 | 
	
		
			
				|  |  | +              $count +=1;
 | 
	
		
			
				|  |  | +              $zebra_class = ($count % 2 == 0) ? 'even' : 'odd';
 | 
	
		
			
				|  |  | +              $no_hits = FALSE;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // SUMMARY ROW
 | 
	
		
			
				|  |  | +              // -- Save additional information needed for the summary.
 | 
	
		
			
				|  |  | +              $score = (float) $hit->{'Hit_hsps'}->{'Hsp'}->{'Hsp_score'};
 | 
	
		
			
				|  |  | +              $evalue = (float) $hit->{'Hit_hsps'}->{'Hsp'}->{'Hsp_evalue'};
 | 
	
		
			
				|  |  | +              $query_name = (string) $iteration->{'Iteration_query-def'};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // If the id is of the form gnl|BL_ORD_ID|### then the parseids flag
 | 
	
		
			
				|  |  | +              // to makeblastdb did a really poor job. In thhis case we want to use
 | 
	
		
			
				|  |  | +              // the def to provide the original FASTA header.
 | 
	
		
			
				|  |  | +              // @todo Deepak changed this to use just the hit_def; inquire as to why.
 | 
	
		
			
				|  |  | +              $hit_name = (preg_match('/BL_ORD_ID/', $hit->{'Hit_id'})) ? $hit->{'Hit_def'} : $hit->{'Hit_id'};
 | 
	
		
			
				|  |  | +              // Used for the hit visualization to ensure the name isn't truncated.
 | 
	
		
			
				|  |  | +              $hit_name_short = (preg_match('/^([^\s]+)/', $hit_name, $matches)) ? $matches[1] : $hit_name;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // Round e-value to two decimal values.
 | 
	
		
			
				|  |  | +              $rounded_evalue = '';
 | 
	
		
			
				|  |  | +              if (strpos($evalue,'e') != false) {
 | 
	
		
			
				|  |  | +                $evalue_split = explode('e', $evalue);
 | 
	
		
			
				|  |  | +                $rounded_evalue = round($evalue_split[0], 2, PHP_ROUND_HALF_EVEN);
 | 
	
		
			
				|  |  | +                $rounded_evalue .= 'e' . $evalue_split[1];
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +              else {
 | 
	
		
			
				|  |  | +                $rounded_evalue = $evalue;
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // State what should be in the summary row for theme_table() later.
 | 
	
		
			
				|  |  | +              $summary_row = array(
 | 
	
		
			
				|  |  | +                'data' => array(
 | 
	
		
			
				|  |  | +                  'arrow-col' => array('data' => '<div class="arrow"></div>', 'class' => array('arrow-col')),
 | 
	
		
			
				|  |  | +                  'number' => array('data' => $count, 'class' => array('number')),
 | 
	
		
			
				|  |  | +                  'query' => array('data' => $query_name, 'class' => array('query')),
 | 
	
		
			
				|  |  | +                  'hit' => array('data' => $hit_name, 'class' => array('hit')),
 | 
	
		
			
				|  |  | +                  'evalue' => array('data' => $rounded_evalue, 'class' => array('evalue')),
 | 
	
		
			
				|  |  | +                ),
 | 
	
		
			
				|  |  | +                'class' => array('result-summary')
 | 
	
		
			
				|  |  |                );
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // Replace the target name with the link.
 | 
	
		
			
				|  |  | -            $summary_row['data']['hit']['data'] = $hit_name;
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // ADD TO TABLE ROWS
 | 
	
		
			
				|  |  | -          $rows[] = $summary_row;
 | 
	
		
			
				|  |  | -          $rows[] = $alignment_row;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        }//end of if - checks $hit
 | 
	
		
			
				|  |  | -      }//end of foreach - iteration_hits
 | 
	
		
			
				|  |  | -    }//end of if - check for iteration_hits
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    else {
 | 
	
		
			
				|  |  | -      // Currently where the "no results" is added.
 | 
	
		
			
				|  |  | -      $query_name = $iteration->{'Iteration_query-def'};
 | 
	
		
			
				|  |  | -      $query_with_no_hits[] = $query_name;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    }//no results
 | 
	
		
			
				|  |  | -  }//end of foreach - BlastOutput_iterations
 | 
	
		
			
				|  |  | +              // ALIGNMENT ROW (collapsed by default)
 | 
	
		
			
				|  |  | +              // Process HSPs
 | 
	
		
			
				|  |  | +              $HSPs = array();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // We need to save some additional summary information in order to draw the
 | 
	
		
			
				|  |  | +              // hit visualization. First, initialize some variables...
 | 
	
		
			
				|  |  | +              $track_start = INF;
 | 
	
		
			
				|  |  | +              $track_end = -1;
 | 
	
		
			
				|  |  | +              $hsps_range = '';
 | 
	
		
			
				|  |  | +              $hit_hsps = '';
 | 
	
		
			
				|  |  | +              $hit_hsp_score = '';
 | 
	
		
			
				|  |  | +              $target_size = $hit->{'Hit_len'};
 | 
	
		
			
				|  |  | +              $Hsp_bit_score = '';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // Then for each hit hsp, keep track of the start of first hsp and the end of
 | 
	
		
			
				|  |  | +              // the last hsp. Keep in mind that hsps might not be recorded in order.
 | 
	
		
			
				|  |  | +              foreach ($hit->{'Hit_hsps'}->children() as $hsp_xml) {
 | 
	
		
			
				|  |  | +                $HSPs[] = (array) $hsp_xml;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if ($track_start > $hsp_xml->{'Hsp_hit-from'}) {
 | 
	
		
			
				|  |  | +                  $track_start = $hsp_xml->{'Hsp_hit-from'} . "";
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if ($track_end < $hsp_xml->{'Hsp_hit-to'}) {
 | 
	
		
			
				|  |  | +                  $track_end = $hsp_xml->{'Hsp_hit-to'} . "";
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // The BLAST visualization code requires the hsps to be formatted in a
 | 
	
		
			
				|  |  | +                // very specific manner. Here we build up the strings to be submitted.
 | 
	
		
			
				|  |  | +                // hits=4263001_4262263_1_742;4260037_4259524_895_1411;&scores=722;473;
 | 
	
		
			
				|  |  | +                $hit_hsps .=  $hsp_xml->{'Hsp_hit-from'} . '_' .
 | 
	
		
			
				|  |  | +                              $hsp_xml->{'Hsp_hit-to'} . '_' .
 | 
	
		
			
				|  |  | +                              $hsp_xml->{'Hsp_query-from'} . '_' . $hsp_xml->{'Hsp_query-to'} .
 | 
	
		
			
				|  |  | +                              ';';
 | 
	
		
			
				|  |  | +                $Hsp_bit_score .=   $hsp_xml->{'Hsp_bit-score'} .';';
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +              
 | 
	
		
			
				|  |  | +              // Finally record the range.
 | 
	
		
			
				|  |  | +              // @todo figure out why we arbitrarily subtract 50,000 here...
 | 
	
		
			
				|  |  | +              // @more removing the 50,000 and using track start/end appears to cause no change...
 | 
	
		
			
				|  |  | +              $range_start = (int) $track_start;// - 50000;
 | 
	
		
			
				|  |  | +              $range_end = (int) $track_end;// + 50000;
 | 
	
		
			
				|  |  | +              if ($range_start < 1) $range_start = 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // Call the function to generate the hit image.
 | 
	
		
			
				|  |  | +              $hit_img = generate_blast_hit_image($target_name, $Hsp_bit_score, $hit_hsps,
 | 
	
		
			
				|  |  | +                                       $target_size, $query_size, $q_name, $hit_name_short);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // State what should be in the alignment row for theme_table() later.
 | 
	
		
			
				|  |  | +              $alignment_row = array(
 | 
	
		
			
				|  |  | +                'data' => array(
 | 
	
		
			
				|  |  | +                  'arrow' => array(
 | 
	
		
			
				|  |  | +                    'data' => theme('blast_report_alignment_row', array('HSPs' => $HSPs, 'hit_visualization' => $hit_img)),
 | 
	
		
			
				|  |  | +                    'colspan' => 5,
 | 
	
		
			
				|  |  | +                  ),
 | 
	
		
			
				|  |  | +                ),
 | 
	
		
			
				|  |  | +                'class' => array('alignment-row', $zebra_class),
 | 
	
		
			
				|  |  | +                'no_striping' => TRUE
 | 
	
		
			
				|  |  | +              );
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if ($no_hits) {
 | 
	
		
			
				|  |  | -    print '<p class="no-hits-message">No results found.</p>';
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  else {
 | 
	
		
			
				|  |  | -    // We want to warn the user if some of their query sequences had no hits.
 | 
	
		
			
				|  |  | -    if (!empty($query_with_no_hits)) {
 | 
	
		
			
				|  |  | -      print '<p class="no-hits-message">Some of your query sequences did not '
 | 
	
		
			
				|  |  | -      . 'match to the database/template. They are: '
 | 
	
		
			
				|  |  | -      . implode(', ', $query_with_no_hits) . '.</p>';
 | 
	
		
			
				|  |  | +              // LINK-OUTS.
 | 
	
		
			
				|  |  | +              // It was determined above whether link-outs were supported for the
 | 
	
		
			
				|  |  | +              // tripal blast database used as a search target. Thus we only want to
 | 
	
		
			
				|  |  | +              // determine a link-out if it's actually supported... ;-)
 | 
	
		
			
				|  |  | +              if ($linkout) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // First extract the linkout text using the regex provided through
 | 
	
		
			
				|  |  | +                // the Tripal blast database node.
 | 
	
		
			
				|  |  | +                if (preg_match($linkout_regex, $hit_name, $linkout_match)) {
 | 
	
		
			
				|  |  | +                  $hit->{'linkout_id'} = $linkout_match[1];
 | 
	
		
			
				|  |  | +                  $hit->{'hit_name'} = $hit_name;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                  // Allow custom functions to determine the URL to support more complicated
 | 
	
		
			
				|  |  | +                  // link-outs rather than just using the tripal database prefix.
 | 
	
		
			
				|  |  | +                  $hit_name = call_user_func(
 | 
	
		
			
				|  |  | +                    $url_function,
 | 
	
		
			
				|  |  | +                    $linkout_urlprefix,
 | 
	
		
			
				|  |  | +                    $hit,
 | 
	
		
			
				|  |  | +                    array(
 | 
	
		
			
				|  |  | +                      'query_name' => $query_name,
 | 
	
		
			
				|  |  | +                      'score'      => $score,
 | 
	
		
			
				|  |  | +                      'e-value'    => $evalue,
 | 
	
		
			
				|  |  | +                      'HSPs'       => $HSPs,
 | 
	
		
			
				|  |  | +                      'Target'     => $blast_job->blastdb->db_name,
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +                  );
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // Replace the target name with the link.
 | 
	
		
			
				|  |  | +                $summary_row['data']['hit']['data'] = $hit_name;
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              // ADD TO TABLE ROWS
 | 
	
		
			
				|  |  | +              $rows[] = $summary_row;
 | 
	
		
			
				|  |  | +              $rows[] = $alignment_row;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            }//end of if - checks $hit
 | 
	
		
			
				|  |  | +          }//end of foreach - iteration_hits
 | 
	
		
			
				|  |  | +        }//end of if - check for iteration_hits
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        else {
 | 
	
		
			
				|  |  | +          // Currently where the "no results" is added.
 | 
	
		
			
				|  |  | +          $query_name = $iteration->{'Iteration_query-def'};
 | 
	
		
			
				|  |  | +          $query_with_no_hits[] = $query_name;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }//no results
 | 
	
		
			
				|  |  | +      }//end of foreach - BlastOutput_iterations
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if ($no_hits) {
 | 
	
		
			
				|  |  | +        print '<p class="no-hits-message">No results found.</p>';
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      else {
 | 
	
		
			
				|  |  | +        // We want to warn the user if some of their query sequences had no hits.
 | 
	
		
			
				|  |  | +        if (!empty($query_with_no_hits)) {
 | 
	
		
			
				|  |  | +          print '<p class="no-hits-message">Some of your query sequences did not '
 | 
	
		
			
				|  |  | +          . 'match to the database/template. They are: '
 | 
	
		
			
				|  |  | +          . implode(', ', $query_with_no_hits) . '.</p>';
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Actually print the table.
 | 
	
		
			
				|  |  | +        if (!empty($rows)) {
 | 
	
		
			
				|  |  | +          print theme('table', array(
 | 
	
		
			
				|  |  | +            'header' => $header,
 | 
	
		
			
				|  |  | +            'rows' => $rows,
 | 
	
		
			
				|  |  | +            'attributes' => array('id' => 'blast_report'),
 | 
	
		
			
				|  |  | +            'sticky' => FALSE
 | 
	
		
			
				|  |  | +          ));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }//handle no hits
 | 
	
		
			
				|  |  | +    }//XML exists
 | 
	
		
			
				|  |  | +    elseif ($too_many_results) {
 | 
	
		
			
				|  |  | +      print '<div class="messages error">Your BLAST resulted in '. number_format(floatval($num_results)) .' results which is too many to reasonably display. We have provided the result files for Download at the top of this page; however, we suggest you re-submit your query using a more stringent e-value (i.e. a smaller number).</div>';
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // Actually print the table.
 | 
	
		
			
				|  |  | -    if (!empty($rows)) {
 | 
	
		
			
				|  |  | -      print theme('table', array(
 | 
	
		
			
				|  |  | -        'header' => $header,
 | 
	
		
			
				|  |  | -        'rows' => $rows,
 | 
	
		
			
				|  |  | -        'attributes' => array('id' => 'blast_report'),
 | 
	
		
			
				|  |  | -        'sticky' => FALSE
 | 
	
		
			
				|  |  | -      ));
 | 
	
		
			
				|  |  | +    else {
 | 
	
		
			
				|  |  | +      drupal_set_title('BLAST: Error Encountered');
 | 
	
		
			
				|  |  | +      print '<div class="messages error">We encountered an error and are unable to load your BLAST results.</div>';
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -  }//handle no hits
 | 
	
		
			
				|  |  | -}//XML exists
 | 
	
		
			
				|  |  | -elseif ($too_many_results) {
 | 
	
		
			
				|  |  | -  print '<div class="messages error">Your BLAST resulted in '. number_format(floatval($num_results)) .' results which is too many to reasonably display. We have provided the result files for Download at the top of this page; however, we suggest you re-submit your query using a more stringent e-value (i.e. a smaller number).</div>';
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -else {
 | 
	
		
			
				|  |  | -  drupal_set_title('BLAST: Error Encountered');
 | 
	
		
			
				|  |  | -  print '<div class="messages error">We encountered an error and are unable to load your BLAST results.</div>';
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -?>
 | 
	
		
			
				|  |  | +  ?>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -<p><?php print l(
 | 
	
		
			
				|  |  | -  'Edit this query and re-submit',
 | 
	
		
			
				|  |  | -  $blast_form_url,
 | 
	
		
			
				|  |  | -  array('query' => array('resubmit' => blast_ui_make_secret($job_id))));
 | 
	
		
			
				|  |  | -?></p>
 | 
	
		
			
				|  |  | +  <p><?php print l(
 | 
	
		
			
				|  |  | +    'Edit this query and re-submit',
 | 
	
		
			
				|  |  | +    $blast_form_url,
 | 
	
		
			
				|  |  | +    array('query' => array('resubmit' => blast_ui_make_secret($job_id))));
 | 
	
		
			
				|  |  | +  ?></p>
 | 
	
		
			
				|  |  |  </div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <?php print theme('blast_recent_jobs', array()); ?>
 |