feature;
// number of bases per line in FASTA format
$num_bases = 50; 
// we don't want to get the sequence for traditionally large types. They are
// too big,  bog down the web browser, take longer to load and it's not
// reasonable to print them on a page.
$residues ='';
if(strcmp($feature->type_id->name,'scaffold') !=0 and
   strcmp($feature->type_id->name,'chromosome') !=0 and
   strcmp($feature->type_id->name,'supercontig') !=0 and
   strcmp($feature->type_id->name,'pseudomolecule') !=0) {
  $feature = chado_expand_var($feature,'field','feature.residues');
  $residues = $feature->residues;
} 
// get the sequence derived from alignments
$feature = $variables['node']->feature;
$featureloc_sequences = $feature->featureloc_sequences;
if ($residues or count($featureloc_sequences) > 0) { 
  $sequences_html = '';  // a variable for holding all sequences HTML text
  $list_items = array(); // a list to be used for theming of content on this page
  
  // ADD IN RESIDUES FOR THIS FEATURE
  // add in the residues if they are present
  if ($residues) {
    $list_items[] = '' . $feature->type_id->name . ' sequence';
     
    // format the sequence to break every 50 residues
    $sequences_html .= '';
    $sequences_html .= '
';
    $sequences_html .= '
' . $feature->type_id->name . ' sequence
';
    $sequences_html .= '
';
    $sequences_html .= '>' . tripal_get_fasta_defline($feature, '', NULL, '', strlen($feature->residues)) . "
";
    $sequences_html .= wordwrap($feature->residues, $num_bases, "
", TRUE);
    $sequences_html .= '';
    $sequences_html .= '
back to top';
    $sequences_html .= '
 ';
    
  }
  
  // ADD IN RELATIONSHIP SEQUENCES (e.g. proteins)
  // see the explanation in the tripal_feature_relationships.tpl.php 
  // template for how the 'all_relationships' is provided. It is this
  // variable that we use to get the proteins.
  $all_relationships = $feature->all_relationships;
  $object_rels = $all_relationships['object'];
  $has_coding_seq = 0;
  $coding_seq = '';
  foreach ($object_rels as $rel_type => $rels){
    foreach ($rels as $subject_type => $subjects){
      foreach ($subjects as $subject){
        
        // add in protein sequence if it has residues
        if ($rel_type == 'derives from' and $subject_type == 'polypeptide') {
          $protein = $subject->record->subject_id;
          $protein = chado_expand_var($protein, 'field', 'feature.residues');
          
          if ($protein->residues) {
            $list_items[] = 'protein sequence';
            $sequences_html .= '';
            $sequences_html .= '';
            $sequences_html .= '
protein sequence of ' . $protein->name . '
';
            $sequences_html .= '
';
            $sequences_html .= '>' . tripal_get_fasta_defline($protein, '', NULL, '', strlen($protein->residues)) . "\n";
            $sequences_html .= wordwrap($protein->residues, $num_bases, "
", TRUE);
            $sequences_html .= '';
            $sequences_html .= '
back to top';
            $sequences_html .= '
 ';
          }
        }
        
        // If the CDS has sequences then concatenate those. The objects 
        // should be returned in order of rank
        if ($rel_type == 'part of' and $subject_type == 'CDS') {
          $cds = $subject->record->subject_id;
          $cds = chado_expand_var($cds, 'field', 'feature.residues');
          if ($cds->residues) {
            $has_coding_seq = 1;
            $coding_seq .= $cds->residues;
          }
        }
        
        // add any other sequences that are related through a relationship
        // and that have values in the 'residues' column
        
      }
    }
  }
  
  // CODING SEQUENCES FROM RELATIONSHIPS
  // add in any CDS sequences.
  if ($has_coding_seq) {
    $list_items[] = 'coding sequence ';
    $sequences_html .= '';
    $sequences_html .= '';
    $sequences_html .= '
coding sequence
';
    $sequences_html .= '
';
    $sequences_html .= wordwrap($coding_seq, $num_bases, "
", TRUE);
    $sequences_html .= '';
    $sequences_html .= '
back to top';
    $sequences_html .= '
 ';
  }
  
  /* ADD IN ALIGNMENT SEQUENCES FOR THIS FEATURE
   * For retreiving the sequence from an alignment we would typically make a call to
   * chado_expand_var function.  For example, to retrieve all
   * of the featurelocs in order to get the sequences needed for this template, the
   * following function call would be made:
   *
   *   $feature = chado_expand_var($feature,'table','featureloc');
   *
   * Then all of the sequences would need to be retreived from the alignments and
   * formatted for display below.  However, to simplify this template, this has already
   * been done by the tripal_feature module and the sequences are made available in
   * the variable: 
   *
   *   $feature->featureloc_sequences
   */
  if(count($featureloc_sequences) > 0){
    foreach($featureloc_sequences as $src => $attrs){
      // the $attrs array has the following keys
      //   * id:  a unique identifier combining the feature id with the cvterm id
      //   * type: the type of sequence (e.g. mRNA, etc)
      //   * location:  the alignment location
      //   * defline: the definition line
      //   * formatted_seq: the formatted sequences
      //   * featureloc:  the feature object aligned to
      $list_items[] = ''. $feature->type_id->name . ' from alignment at  ' . $attrs['location'] . "";
      $sequences_html .= '';
      $sequences_html .= '';
      $sequences_html .= '
'. $feature->type_id->name . ' from alignment at  ' . $attrs['location'] .'
';
      $sequences_html .= $attrs['formatted_seq'];
      $sequences_html .= '
back to top';
      $sequences_html .= '
 ';
    }
    
    // check to see if this alignment has any CDS. If so, generate a CDS sequence
    $cds_sequence = tripal_get_feature_sequences(
        array(
          'feature_id' => $feature->feature_id,
          'parent_id' => $attrs['featureloc']->srcfeature_id->feature_id,
          'name' => $feature->name,
          'featureloc_id' => $attrs['featureloc']->featureloc_id,
        ),
        array(
          'width' => $num_bases,  // FASTA sequence should have $num_bases chars per line
          'derive_from_parent' => 1, // CDS are in parent-child relationships so we want to use the sequence from the parent
          'aggregate' => 1, // we want to combine all CDS for this feature into a single sequence
          'sub_feature_types' => array('CDS'), // we're looking for CDS features
          'is_html' => 1
        )
    );
    if (count($cds_sequence) > 0) {
      // the tripal_get_feature_sequences() function can return multiple sequences
      // if a feature is aligned to multiple places. In the case of CDSs we expect
      // that one mRNA is only aligned to a single location on the assembly so we
      // can access the CDS sequence with index 0.
      if ($cds_sequence[0]['residues']) {
        $list_items[] = 'coding sequence from alignment at  ' . $attrs['location'] . "";
        $sequences_html .= '';
        $sequences_html .= '';
        $sequences_html .= '
Coding sequence (CDS) from alignment at  ' . $attrs['location'] . '
';
        $sequences_html .= '
';
        $sequences_html .= '>' . tripal_get_fasta_defline($feature, '', $attrs['featureloc'], 'CDS', $cds_sequence[0]['length']) . "
";
        $sequences_html .= $cds_sequence[0]['residues'];
        $sequences_html .= '';
        $sequences_html .= '
back to top';
        $sequences_html .= '
 ';
      }
    }
  } 
  ?>
  The following sequences are available for this feature:
 
  ';
  print theme_item_list(array(
    'items' => $list_items,
    'title' => '',
    'type' => 'ul',
    'attributes' => array(),
  ));
  $message = 'Administrators, sequences will appear on this page if:
    
For any feature type:
    
      - This feature has residues stored in the "residues" field of the feature table of Chado.
 
      - This feature is aligned to another feature (e.g. scaffold, or chromosome). In this case, the
          sequence underlying the alignment will be shown.
 
    
    
For gene models:
    
      - This feature has a "polypeptide" (protein) feature associated via the "feature_relationship" table of Chado with a
          relationship of type "derives from" and the protein feature has residues. Typically, a protein
          is associated with an mRNA feature and protein sequences will appear on the mRNA page.
 
      - This feature has one or more CDS features associated via the "feature_relationship" table of Chado with a
          relationship of type "part of". If the CDS features have residues then those will be concatenated
          and presented as a sequence. Typically, CDSs are associated with an mRNA feature and CDS sequences 
          will appear on the mRNA page.
 
      - This feature is aligned to another feature (e.g. scaffold, or chromosome) and this feature has
          one or more CDS features associated.  The CDS sequenes underlying the alignment will be
          shown.
 
    
    ';
  print tripal_set_message($message, TRIPAL_INFO, array('return_html' => 1));
  
  // now print the sequences
  print $sequences_html;
}