|
@@ -343,8 +343,11 @@ function tripal_feature_block($op = 'list', $delta = 0, $edit=array()) {
|
|
|
$blocks['alignments']['info'] = t('Tripal Feature Alignments');
|
|
|
$blocks['alignments']['cache'] = BLOCK_NO_CACHE;
|
|
|
|
|
|
- $blocks['relationships']['info'] = t('Tripal Feature Relationships');
|
|
|
- $blocks['relationships']['cache'] = BLOCK_NO_CACHE;
|
|
|
+ $blocks['object_relationships']['info'] = t('Tripal Feature Object Relationships');
|
|
|
+ $blocks['object_relationships']['cache'] = BLOCK_NO_CACHE;
|
|
|
+
|
|
|
+ $blocks['subject_relationships']['info'] = t('Tripal Feature Subject Relationships');
|
|
|
+ $blocks['subject_relationships']['cache'] = BLOCK_NO_CACHE;
|
|
|
|
|
|
$blocks['org_feature_counts']['info'] = t('Tripal Organism Feature Counts');
|
|
|
$blocks['org_feature_counts']['cache'] = BLOCK_NO_CACHE;
|
|
@@ -392,11 +395,15 @@ function tripal_feature_block($op = 'list', $delta = 0, $edit=array()) {
|
|
|
break;
|
|
|
case 'alignments':
|
|
|
$block['subject'] = t('Alignments');
|
|
|
- $block['content'] = theme('tripal_feature_featurelocs', $node);
|
|
|
+ $block['content'] = theme('tripal_feature_alignments', $node);
|
|
|
+ break;
|
|
|
+ case 'object_relationships':
|
|
|
+ $block['subject'] = t('Object Relationships');
|
|
|
+ $block['content'] = theme('tripal_feature_object_relationships', $node);
|
|
|
break;
|
|
|
- case 'relationships':
|
|
|
- $block['subject'] = t('Relationships');
|
|
|
- $block['content'] = theme('tripal_feature_relationships', $node);
|
|
|
+ case 'subject_relationships':
|
|
|
+ $block['subject'] = t('Subject Relationships');
|
|
|
+ $block['content'] = theme('tripal_feature_object_relationships', $node);
|
|
|
break;
|
|
|
case 'org_feature_counts':
|
|
|
$block['subject'] = t('Feature Type Summary');
|
|
@@ -1334,6 +1341,73 @@ function tripal_feature_load_featureloc_sequences($feature_id, $featurelocs) {
|
|
|
}
|
|
|
return $floc_sequences;
|
|
|
}
|
|
|
+/**
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * @ingroup tripal_feature
|
|
|
+ */
|
|
|
+function tripal_feature_get_matched_alignments($feature){
|
|
|
+ // This function is for features that align through an intermediate such
|
|
|
+ // as 'EST_match' or 'match'. This occurs in the case where two sequences
|
|
|
+ // align but where one does not align perfectly. Some ESTs may be in a contig
|
|
|
+ // but not all of the EST. Portions may overhang and not be included in the
|
|
|
+ // consensus if quality is bad.
|
|
|
+ // For example:
|
|
|
+ //
|
|
|
+ // Feature 1: Contig --------------------
|
|
|
+ // Feature 2: EST_match -------
|
|
|
+ // Feature 3: EST ---------
|
|
|
+ //
|
|
|
+ // The feature provided to the function will always be the feature 1. The
|
|
|
+ // featureloc columns prefixed with 'right' (e.g. right_fmin) belong to the
|
|
|
+ // alignment of feature 3 with feature 2
|
|
|
+ //
|
|
|
+ // Features may align to more than one feature and are not matches. We do
|
|
|
+ // not want to include these, so we have to filter on the SO terms:
|
|
|
+ // match, or %_match
|
|
|
+ //
|
|
|
+ $sql = "SELECT ".
|
|
|
+ " FL1.featureloc_id as left_featureloc_id, ".
|
|
|
+ " FL1.srcfeature_id as left_srcfeature_id, ".
|
|
|
+ " FL1.feature_id as left_feature_id, ".
|
|
|
+ " FL1.fmin as left_fmin, ".
|
|
|
+ " FL1.is_fmin_partial as left_is_fmin_partial, ".
|
|
|
+ " FL1.fmax as left_fmax, ".
|
|
|
+ " FL1.is_fmax_partial as left_is_fmax_partial, ".
|
|
|
+ " FL1.strand as left_strand, ".
|
|
|
+ " FL1.phase as left_phase, ".
|
|
|
+ " FL1.locgroup as left_locgroup, ".
|
|
|
+ " FL1.rank as left_rank, ".
|
|
|
+ " FL2.featureloc_id as right_featureloc_id, ".
|
|
|
+ " FL2.srcfeature_id as right_srcfeature_id, ".
|
|
|
+ " FL2.feature_id as right_feature_id, ".
|
|
|
+ " FL2.fmin as right_fmin, ".
|
|
|
+ " FL2.is_fmin_partial as right_is_fmin_partial, ".
|
|
|
+ " FL2.fmax as right_fmax, ".
|
|
|
+ " FL2.is_fmax_partial as right_is_fmax_partial, ".
|
|
|
+ " FL2.strand as right_strand, ".
|
|
|
+ " FL2.phase as right_phase, ".
|
|
|
+ " FL2.locgroup as right_locgroup, ".
|
|
|
+ " FL2.rank as right_rank ".
|
|
|
+ "FROM feature F1 ".
|
|
|
+ " INNER JOIN featureloc FL1 on FL1.srcfeature_id = F1.feature_id ".
|
|
|
+ " INNER JOIN feature F2 on FL1.feature_id = F2.feature_id ".
|
|
|
+ " INNER JOIN featureloc FL2 on FL2.feature_id = F2.feature_id ".
|
|
|
+ " INNER JOIN feature F3 on FL2.srcfeature_id = F3.feature_id ".
|
|
|
+ " INNER JOIN cvterm CVT2 on F2.type_id = CVT2.cvterm_id ".
|
|
|
+ "WHERE F1.feature_id = %d and NOT F3.feature_id = %d ".
|
|
|
+ " AND (CVT2.name = 'match' or CVT2.name like '%_match') ".
|
|
|
+ "ORDER BY FL1.fmin";
|
|
|
+
|
|
|
+ $results = db_query($sql,$feature->feature_id,$feature->feature_id);
|
|
|
+
|
|
|
+ // iterate through the results and add them to our featurelocs array
|
|
|
+ $featurelocs = array();
|
|
|
+ while($fl = db_fetch_object($results)){
|
|
|
+ $featurelocs[] = $fl ;
|
|
|
+ }
|
|
|
+ return $featurelocs;
|
|
|
+}
|
|
|
/**
|
|
|
*
|
|
|
*
|
|
@@ -1812,13 +1886,17 @@ function tripal_feature_theme() {
|
|
|
'arguments' => array('node' => NULL),
|
|
|
'template' => 'tripal_feature_properties',
|
|
|
),
|
|
|
- 'tripal_feature_featurelocs' => array(
|
|
|
+ 'tripal_feature_alignments' => array(
|
|
|
+ 'arguments' => array('node' => NULL),
|
|
|
+ 'template' => 'tripal_feature_alignments',
|
|
|
+ ),
|
|
|
+ 'tripal_feature_object_relationships' => array(
|
|
|
'arguments' => array('node' => NULL),
|
|
|
- 'template' => 'tripal_feature_featurelocs',
|
|
|
+ 'template' => 'tripal_feature_object_relationships',
|
|
|
),
|
|
|
- 'tripal_feature_relationships' => array(
|
|
|
+ 'tripal_feature_subject_relationships' => array(
|
|
|
'arguments' => array('node' => NULL),
|
|
|
- 'template' => 'tripal_feature_relationships',
|
|
|
+ 'template' => 'tripal_feature_subject_relationships',
|
|
|
),
|
|
|
'tripal_feature_edit_ALL_properties_form' => array(
|
|
|
'arguments' => array('form' => NULL),
|
|
@@ -1827,7 +1905,100 @@ function tripal_feature_theme() {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+/**
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * @ingroup tripal_feature
|
|
|
+ */
|
|
|
+function tripal_feature_preprocess_tripal_feature_alignments(&$variables) {
|
|
|
+ // we want to provide a new variable that contains the matched features.
|
|
|
+ $feature = $variables['node']->feature;
|
|
|
+
|
|
|
+ // get alignments as child
|
|
|
+ $cfeaturelocs = $feature->featureloc->feature_id;
|
|
|
+ if (!$cfeaturelocs) {
|
|
|
+ $cfeaturelocs = array();
|
|
|
+ } elseif (!is_array($cfeaturelocs)) {
|
|
|
+ $cfeaturelocs = array($cfeaturelocs);
|
|
|
+ }
|
|
|
+ // get alignment as parent
|
|
|
+ $pfeaturelocs = $feature->featureloc->srcfeature_id;
|
|
|
+ if (!$pfeaturelocs) {
|
|
|
+ $pfeaturelocs = array();
|
|
|
+ } elseif (!is_array($pfeaturelocs)) {
|
|
|
+ $pfeaturelocs = array($pfeaturelocs);
|
|
|
+ }
|
|
|
+
|
|
|
+ // get matched alignments (those with an itermediate 'match' or 'EST_match', etc
|
|
|
+ $mfeaturelocs = tripal_feature_get_matched_alignments($feature);
|
|
|
+ $feature->matched_featurelocs = tripal_feature_get_matched_alignments($feature);
|
|
|
+
|
|
|
+ // combine all three alignments into a single array for printing together in
|
|
|
+ // a single list
|
|
|
+ $alignments = array();
|
|
|
+ foreach ($pfeaturelocs as $featureloc){
|
|
|
+ // if type is a 'match' then ignore it. We will handle those below
|
|
|
+ if(preg_match('/(^match$|^.*?_match)$/',$featureloc->feature_id->type_id->name)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ $alignment = new stdClass();
|
|
|
+ $alignment->record = $featureloc;
|
|
|
+ $alignment->name = $featureloc->feature_id->name;
|
|
|
+ $alignment->nid = $featureloc->feature_id->nid;
|
|
|
+ $alignment->type = $featureloc->feature_id->type_id->name;
|
|
|
+ $alignment->fmin = $featureloc->fmin;
|
|
|
+ $alignment->fmax = $featureloc->fmax;
|
|
|
+ $alignment->phase = $featureloc->phase;
|
|
|
+ $alignment->strand = $featureloc->strand;
|
|
|
+ $alignments[] = $alignment;
|
|
|
+ }
|
|
|
+ foreach ($cfeaturelocs as $featureloc){
|
|
|
+ // if type is a 'match' then ignore it. We will handle those below
|
|
|
+ if(preg_match('/(^match$|^.*?_match)$/',$featureloc->feature_id->type_id->name)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ $alignment = new stdClass();
|
|
|
+ $alignment->record = $featureloc;
|
|
|
+ $alignment->name = $featureloc->srcfeature_id->name;
|
|
|
+ $alignment->nid = $featureloc->srcfeature_id->nid;
|
|
|
+ $alignment->type = $featureloc->srcfeature_id->type_id->name;
|
|
|
+ $alignment->fmin = $featureloc->fmin;
|
|
|
+ $alignment->is_fmin_partial = $featureloc->is_fmin_partial;
|
|
|
+ $alignment->fmax = $featureloc->fmax;
|
|
|
+ $alignment->is_fmax_partial = $featureloc->is_fmax_partial;
|
|
|
+ $alignment->phase = $featureloc->phase;
|
|
|
+ $alignment->strand = $featureloc->strand;
|
|
|
+ $alignments[] = $alignment;
|
|
|
+ }
|
|
|
+ // in matching features, the left feature is always the feature
|
|
|
+ // provided to this function.
|
|
|
+ foreach ($mfeaturelocs as $featureloc){
|
|
|
+ // get more information about the right feature
|
|
|
+ $select = array('feature_id' => $featureloc->right_srcfeature_id);
|
|
|
+ $rfeature = tripal_core_generate_chado_var('feature',$select);
|
|
|
+ // now add to the list
|
|
|
+ $alignment = new stdClass();
|
|
|
+ $alignment->record = $featureloc;
|
|
|
+ $alignment->right_feature = $rfeature;
|
|
|
+ $alignment->name = $rfeature->name;
|
|
|
+ $alignment->nid = $rfeature->nid;
|
|
|
+ $alignment->type = $rfeature->type_id->name;
|
|
|
+ $alignment->fmin = $left_featureloc->fmin;
|
|
|
+ $alignment->is_fmin_partial = $featureloc->left_is_fmin_partial;
|
|
|
+ $alignment->fmax = $featureloc->left_fmax;
|
|
|
+ $alignment->is_fmax_partial = $featureloc->left_is_fmax_partial;
|
|
|
+ $alignment->phase = $featureloc->left_phase;
|
|
|
+ $alignment->strand = $featureloc->left_strand;
|
|
|
+ $alignment->right_fmin = $left_featureloc->fmin;
|
|
|
+ $alignment->right_is_fmin_partial = $featureloc->right_is_fmin_partial;
|
|
|
+ $alignment->right_fmax = $featureloc->right_fmax;
|
|
|
+ $alignment->right_is_fmax_partial = $featureloc->right_is_fmax_partial;
|
|
|
+ $alignment->right_phase = $featureloc->right_phase;
|
|
|
+ $alignment->right_strand = $featureloc->right_strand;
|
|
|
+ $alignments[] = $alignment;
|
|
|
+ }
|
|
|
+ $feature->all_featurelocs = $alignments;
|
|
|
+}
|
|
|
/**
|
|
|
*
|
|
|
*
|