Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<?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);
if ($links) {
$dlist = explode(';', $links);
foreach ($dlist as $delem) {
$d = explode('>', $delem);
if (substr($alignment->name, 0, strlen($d[0])) === $d[0]) {
$dataset = "data=data/".$d[1]."&";
break;
}
}
}
$feature_loc = "<a href='".$GLOBALS['base_url']."/../jbrowse?".$dataset."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);
if ($links) {
$dlist = explode(';', $links);
foreach ($dlist as $delem) {
$d = explode('>', $delem);
if (substr($alignment->name, 0, strlen($d[0])) === $d[0]) {
$dataset = "data=data/".$d[1]."&";
break;
}
}
}
$feature_loc .= " <a href='".$GLOBALS['base_url']."/../apollo/jbrowse?".$dataset."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);
}