Skip to content
Snippets Groups Projects
tripal_feature_alignments.tpl.php 7.02 KiB
<?php
/*
* Typically in a Tripal template, the data needed is retrieved using a call to
* chado_expand_var function.  For example, to retrieve all
* of the feature alignments for this node, the following function call would be made:
*
*   $feature = chado_expand_var($feature,'table','featureloc');
*
* However, this will return all records from the featureloc table without any context.
* To help provide context, a special variable is provided to this template named
* 'all_featurelocs'.
*
*   $feature->all_featurelocs
*
* The records in the 'all_featurelocs' array are all properly arranged for easy iteration.
*
* However, access to the original alignment records is possible through the
* $feature->featureloc object.  In the following ways:
*
* Alignment context #1:
* --------------------
* If the feature for this node is the parent in the alignment relationships,
* then those alignments are available in this variable:
*
*    $feature->featureloc->srcfeature_id;
*
*
* Alignment context #2:
* ---------------------
* If the feature for this node is the child in the alignment relationsips,
* then those alignments are available in this variable:
*
*   $feature->featureloc->feature_id;
*
*
* Alignment context #3:
* --------------------
* If the feature is aligned to another through an intermediary feature (e.g.
* a feature of type 'match', 'EST_match', 'primer_match', etc) then those
* alignments are stored in this variable:
*   feature->matched_featurelocs
*
* Below is an example of a feature that may be aligned to another through
* an intermediary:
*
*    Feature 1: Contig      ---------------   (left feature)
*    Feature 2: EST_match           -------
*    Feature 3: EST                 --------- (right feature)
*
* The feature for this node is always "Feature 1".  The purpose of this type
* alignment is to indicate cases where there is the potential for overhang
* in the alignments, or, the ends of the features are not part of the alignment
* prehaps due to poor quality of the ends.  Blast results and ESTs mapped to
* contigs in Unigenes would fall under this category.
*
*/
$feature = $variables['node']->feature;
$alignments = $feature->all_featurelocs;

if(count($alignments) > 0){ ?>
  <div class="tripal_feature-data-block-desc tripal-data-block-desc">The following features are aligned</div><?php

  // the $headers array is an array of fields to use as the colum headers.
  // additional documentation can be found here
  // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
  $headers = array('Aligned Feature' ,'Feature Type', 'Alignment Location');

  // the $rows array contains an array of rows where each row is an array
  // of values for each column of the table in that row.  Additional documentation
  // can be found here:
  // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
  $rows = array();

  foreach ($alignments as $alignment){
    $feature_name = $alignment->name;
    if (property_exists($alignment, 'nid')) {
      $feature_name = l($feature_name, "node/" . $alignment->nid);
    }
    $feature_loc = '';
    $strand = '.';
    if ($alignment->strand == -1) {
      $strand = '-';
    }
    elseif ($alignment->strand == 1) {
       $strand = '+';
    }
    // if this is a match then make the other location
    if(property_exists($alignment, 'right_feature')){
      $rstrand = '.';
      if ($alignment->right_strand == -1) {
        $rstrand = '-';
      }
      elseif ($alignment->right_strand == 1) {
        $rstrand = '+';
      }
      $feature_loc = $feature->name .":". ($alignment->fmin + 1) . ".." . $alignment->fmax . " " . $strand;
      $feature_loc .= "<br>" . $alignment->name .":". ($alignment->right_fmin + 1) . ".." . $alignment->right_fmax . " " . $rstrand;
    }
    else {
      $feature_loc = $alignment->name .":". ($alignment->fmin + 1) . ".." . $alignment->fmax . " " . $strand;
    }

    if ($alignment->type == 'contig' && getenv('ENABLE_JBROWSE')) {
        $links = getenv(JBROWSE_LINKS);
        $found_link = false;
        if ($links) {
            $cur_org = $feature->organism_id->abbreviation;
            $dlist = explode(';', $links);

            foreach ($dlist as $delem) {
                $d = explode('>', $delem);
                if ($cur_org === $d[0] || substr($alignment->name, 0, strlen($d[0])) === $d[0]) {
                    $url = "/jbrowse?data=data/".$d[1]."&";
                    $found_link = true;
                    break;
                }
            }
        }

        if (!$found_link) {
            if (getenv('ENABLE_JBROWSE') == "1")
                $url = '/jbrowse?';
            else {
                // Some url was given
                $url = getenv('ENABLE_JBROWSE');
                if (strpos($url, '?') !== false)
                    $url .= '&';
                else
                    $url .= '?';
            }
        }
        $feature_loc = "<a href='".$GLOBALS['base_url'].$url."loc=".$alignment->name."%3A".($alignment->fmin + 1)."..".$alignment->fmax."'>".$feature_loc."</a>";
    }

    if ($alignment->type == 'contig' && getenv('ENABLE_APOLLO')) {
        $links = getenv(APOLLO_LINKS);
        if (!$links && getenv(JBROWSE_LINKS))
            $links = getenv(JBROWSE_LINKS);
        $found_link = false;
        if ($links) {
            $cur_org = $feature->organism_id->abbreviation;
            $dlist = explode(';', $links);

            foreach ($dlist as $delem) {
                $d = explode('>', $delem);
                if ($cur_org === $d[0] || substr($alignment->name, 0, strlen($d[0])) === $d[0]) {
                    $url = "/apollo/annotator/loadLink?organism=".$d[1]."&";
                    $found_link = true;
                    break;
                }
            }
        }

        if (!$found_link) {
            if (getenv('ENABLE_APOLLO') == "1")
                $url = $GLOBALS['base_url'] . '/apollo/annotator/loadLink?';
            else {
                // Some url was given
                $url = getenv('ENABLE_APOLLO');
                if (strpos($url, '?') !== false)
                    $url .= '&';
                else
                    $url .= '?';
            }
        }

        $feature_loc .= " &nbsp;&nbsp; View in <a href='".$url."loc=".$alignment->name."%3A".($alignment->fmin + 1)."..".$alignment->fmax."'>Apollo</a>";
    }

    $rows[] = array(
      $feature_name,
      $alignment->type,
      $feature_loc
    );
  }

  // the $table array contains the headers and rows array as well as other
  // options for controlling the display of the table.  Additional
  // documentation can be found here:
  // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
  $table = array(
    'header' => $headers,
    'rows' => $rows,
    'attributes' => array(
      'id' => 'tripal_feature-table-alignments',
      'class' => 'tripal-data-table'
    ),
    'sticky' => FALSE,
    'caption' => '',
    'colgroups' => array(),
    'empty' => '',
  );

  // once we have our table array structure defined, we call Drupal's theme_table()
  // function to generate the table.
  print theme_table($table);
}