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 = []; // 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)) . "
"; $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( [ 'feature_id' => $feature->feature_id, 'parent_id' => $attrs['featureloc']->srcfeature_id->feature_id, 'name' => $feature->name, 'featureloc_id' => $attrs['featureloc']->featureloc_id, ], [ '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' => ['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([ 'items' => $list_items, 'title' => '', 'type' => 'ul', 'attributes' => [], ]); $message = 'Administrators, sequences will appear on this page if:

For any feature type:
For gene models:

'; print tripal_set_message($message, TRIPAL_INFO, ['return_html' => 1]); // now print the sequences print $sequences_html; }