t('EST Assemblies'),
'page callback' => 'tripal_analysis_unigene_organism_assembly',
'page arguments' => array(1),
'access callback' => 'tripal_analysis_unigene_node_has_menu',
'access arguments' => array('access chado_analysis content',1),
'type' => MENU_LOCAL_TASK | MENU_NORMAL_ITEM
);
return $items;
}
/*******************************************************************************
* Dynamic addition/removal of menu item
*/
function tripal_analysis_unigene_node_has_menu($type,$vid){
// check to see if this node is an organism node
$sql = 'SELECT organism_id FROM {chado_organism} WHERE vid = %d';
$result = db_query($sql, $vid);
// menu status
$box_status =variable_get("tripal_analysis_unigene-box-assembly","menu_off");
// if this node is not an organism or a feature node then return false
// we don't want the menu item to be shown, otherwise get the normal perms
if($org_id = db_fetch_object($result)){
if(strcmp($box_status,"menu_on")==0){
return user_access($type);
}
} else {
return FALSE;
}
}
/*******************************************************************************
* tripal_analysis_unigene_nodeapi()
* HOOK: Implementation of hook_nodeapi()
* Display unigene results for allowed node types
*/
function tripal_analysis_unigene_nodeapi(&$node, $op, $teaser, $page) {
switch ($op) {
case 'view':
// Find out which node types for showing the unigene
$types_to_show = variable_get('tripal_analysis_unigene_setting',
array('chado_feature','chado_organism'));
// Abort if this node is not one of the types we should show.
if (!in_array($node->type, $types_to_show, TRUE)) {
// Turn the menu off if it's on
$box_status = variable_get("tripal_analysis_unigene-box-assembly","menu_off");
if (strcmp($box_status,"menu_on")==0 && $node->type =='chado_organism'){
variable_set("tripal_analysis_unigene-box-assembly","menu_off");
}
break;
}
// Add unigene to the content item if it's not a teaser
if (!$teaser) {
// add the alignment to the feature search indexing
if($node->build_mode == NODE_BUILD_SEARCH_INDEX){
$node->content['tripal_analysis_unigene_index_version'] = array(
'#value' => theme('tripal_analysis_unigene_search_index',$node),
'#weight' => 4,
);
} else if ($node->build_mode == NODE_BUILD_SEARCH_RESULT) {
$node->content['tripal_analysis_unigene_index_version'] = array(
'#value' => theme('tripal_analysis_unigene_search_result',$node),
'#weight' => 4,
);
} else {
if(strcmp($node->type,'chado_organism')==0){
// Show unigene content if not at teaser view
$node->content['tripal_analysis_unigene_node_add'] = array(
'#value' => theme('tripal_analysis_unigene_node_add', $node),
'#weight' => 4
);
}
}
}
}
}
/************************************************************************
* We need to let drupal know about our theme functions and their arguments.
* We create theme functions to allow users of the module to customize the
* look and feel of the output generated in this module
*/
function tripal_analysis_unigene_theme () {
return array(
'tripal_analysis_unigene_search_index' => array (
'arguments' => array('node'),
),
'tripal_analysis_unigene_search_result' => array (
'arguments' => array('node'),
),
'tripal_analysis_unigene_node_add' => array (
'arguments' => array('node'),
),
);
}
/************************************************************************
* This function is an extension of the chado_feature_view by providing
* the markup for the feature object THAT WILL BE INDEXED.
*/
function theme_tripal_analysis_unigene_search_index ($node) {
$feature = $node->feature;
$obj_feature = tripal_analysis_unigene_get_alignments($feature);
$alignments = $obj_feature->alignments;
$content = "";
if(count($alignments) > 0){
// iterate through each alignment
foreach ($alignments as $result){
// EST alignments in chado use an EST_match type to map ESTs to
// contigs and a rank to indicate the major srcfeature.
// We don't want to show EST_matches on the alignment view
// since that doesn't make much sense to the end user. If this
// is an EST_match and the feature is an EST then we want to show
// the contig in the alignments. The contig name is part of the
// uniquename in the EST_match
if($node->feature->cvname == 'EST' && $result->cvname == 'EST_match'){
$sql = "SELECT srcfeature_id ".
"FROM {featureloc} ".
"WHERE feature_id = $result->feature_id ".
"ORDER BY rank";
$previous_db = tripal_db_set_active ('chado');
$contig_fid = db_result(db_query($sql));
$sql = "SELECT name FROM {feature} WHERE feature_id = $contig_fid";
$contig_name = db_result(db_query($sql));
tripal_db_set_active($previous_db);
$sql = "SELECT nid ".
"FROM {chado_feature} ".
"WHERE feature_id = $contig_fid";
$contig_nid = db_result(db_query($sql));
// Check if the EST exists as a drupal node. If yes, add a link to
// it. If no, just show the name
if ($contig_nid != 0) {
$sql = "SELECT nid FROM {node} WHERE nid=$contig_nid";
$node_exists = db_result(db_query($sql));
}
$content .= "$contig_name " ;
}
elseif($node->feature->cvname == 'contig' && $result->cvname == 'EST_match'){
$sql = "SELECT vid ".
"FROM {node} ".
"WHERE title = '$result->feature_name'".
"ORDER BY vid DESC";
// since the feature name is also the node title we can look it up
$est_node = db_fetch_object(db_query($sql));
$content .= "$result->feature_name ";
}
else {
$content .= "$result->cvname $result->feature_name ";
}
}
}
$content .= "";
return $content;
}
/************************************************************************
* This function is an extension of the chado_feature_view by providing
* the markup for the feature object to show on a search result page.
*/
function theme_tripal_analysis_unigene_search_result ($node) {
$feature = $node->feature;
$obj_feature = tripal_analysis_unigene_get_alignments($feature);
$alignments = $obj_feature->alignments;
$content = "";
if(count($alignments) > 0){
// iterate through each alignment
foreach ($alignments as $result){
// EST alignments in chado use an EST_match type to map ESTs to
// contigs and a rank to indicate the major srcfeature.
// We don't want to show EST_matches on the alignment view
// since that doesn't make much sense to the end user. If this
// is an EST_match and the feature is an EST then we want to show
// the contig in the alignments. The contig name is part of the
// uniquename in the EST_match
if($node->feature->cvname == 'EST' && $result->cvname == 'EST_match'){
$sql = "SELECT srcfeature_id ".
"FROM {featureloc} ".
"WHERE feature_id = $result->feature_id ".
"ORDER BY rank";
$previous_db = tripal_db_set_active ('chado');
$contig_fid = db_result(db_query($sql));
$sql = "SELECT name FROM {feature} WHERE feature_id = $contig_fid";
$contig_name = db_result(db_query($sql));
tripal_db_set_active($previous_db);
$sql = "SELECT nid ".
"FROM {chado_feature} ".
"WHERE feature_id = $contig_fid";
$contig_nid = db_result(db_query($sql));
// Check if the EST exists as a drupal node. If yes, add a link to
// it. If no, just show the name
if ($contig_nid != 0) {
$sql = "SELECT nid FROM {node} WHERE nid=$contig_nid";
$node_exists = db_result(db_query($sql));
}
$content .= "Alignment to contig $contig_name. " ;
}
elseif($node->feature->cvname == 'contig' && $result->cvname == 'EST_match'){
$sql = "SELECT vid ".
"FROM {node} ".
"WHERE title = '$result->feature_name'".
"ORDER BY vid DESC";
// since the feature name is also the node title we can look it up
$est_node = db_fetch_object(db_query($sql));
$content .= "Aligned EST: $result->feature_name ";
}
else {
$content .= "Aligned $result->cvname: $result->feature_name ";
}
}
}
$content .= "";
return $content;
}
/*******************************************************************************
* tripal_analysis_unigene_results ()
* Prepare unigene result for the feature shown on the page
*/
function theme_tripal_analysis_unigene_feature_alignments($node) {
$feature = $node->feature;
$obj_feature = tripal_analysis_unigene_get_alignments($feature);
$alignments = $obj_feature->alignments;
if(count($alignments) > 0){
$content = "
";
// we're showing contig alignments in GBrowse so create a link here for
// that if this feature is a contig
if($node->feature->cvname == 'contig'){
$content .= "
".
"
ESTs in this contig
".
"";
$content .= "
";
} else {
$content .= "
".
"
Alignments
".
"";
$content .= "
";
}
$content .= "".
"
".
" ".
" Type | ".
" Feature | ".
" Position | ".
"
";
// iterate through each alignment
foreach ($alignments as $result){
// EST alignments in chado use an EST_match type to map ESTs to
// contigs and a rank to indicate the major srcfeature.
// We don't want to show EST_matches on the alignment view
// since that doesn't make much sense to the end user. If this
// is an EST_match and the feature is an EST then we want to show
// the contig in the alignments. The contig name is part of the
// uniquename in the EST_match
if($node->feature->cvname == 'EST' && $result->cvname == 'EST_match'){
$sql = "SELECT srcfeature_id ".
"FROM {featureloc} ".
"WHERE feature_id = $result->feature_id ".
"ORDER BY rank";
$previous_db = tripal_db_set_active ('chado');
$contig_fid = db_result(db_query($sql));
$sql = "SELECT name FROM {feature} WHERE feature_id = $contig_fid";
$contig_name = db_result(db_query($sql));
tripal_db_set_active($previous_db);
$sql = "SELECT nid ".
"FROM {chado_feature} ".
"WHERE feature_id = $contig_fid";
$contig_nid = db_result(db_query($sql));
// Check if the EST exists as a drupal node. If yes, add a link to
// it. If no, just show the name
if ($contig_nid != 0) {
$sql = "SELECT nid FROM {node} WHERE nid=$contig_nid";
$node_exists = db_result(db_query($sql));
}
$content .=
"".
" Contig | ".
" ";
if ($node_exists != 0) {
$content .= "".
"$contig_name";
} else {
$content .= $contig_name;
}
$content .=
" | ".
" ".
number_format($result->fmin).
"-".
number_format($result->fmax).
" | ".
"
";
}
elseif($node->feature->cvname == 'contig' &&
$result->cvname == 'EST_match'){
$sql = "SELECT vid ".
"FROM {node} ".
"WHERE title = '$result->feature_name'".
"ORDER BY vid DESC";
// since the feature name is also the node title we can look it up
$est_node = db_fetch_object(db_query($sql));
$content .=
"".
" EST | ".
" ";
//Check if the EST exists as a drupal node before adding a hyperlink
if ($est_node->vid != 0) {
$content .=
"vid")."\">".
$result->feature_name.
"";
} else {
$content .= $result->feature_name;
}
$content .=
" | ".
" ".
number_format($result->fmin).
"-".
number_format($result->fmax).
" | ".
"
";
}
else {
$content .= "".
"".
" $result->cvname | ".
" $result->feature_name | ".
" $result->fmin | ".
" $result->fmax | ".
" $result->strand | ".
"
";
}
}
$content .= "
";
/* if this is a contig then get the alignment
if($node->feature->cvname == 'contig'){
// get the directory prefix
$prefix = preg_replace("/^(\d*)\d{3}$/","$1",$node->feature_id);
if(!$prefix){
$prefix = '0';
}
$data_url = variable_get('chado_feature_data_url','sites/default/files/data');
$fh = fopen("$data_url/misc/$prefix/$node->feature->feature_id/alignment.txt", 'r');
if($fh){
$content .= "
Alignment:";
while(!feof($fh)){
$content .= fgets($fh);
}
$content .="
";
}
fclose($fh);
}
*/
$content .= "
";
}
return $content;
}
/*******************************************************************************
*
*/
function tripal_analysis_unigene_get_alignments($map) {
// get the alignments for this feature
$sql = "SELECT F.name as feature_name, FL.fmin, FL.fmax, FL.strand, ".
" FL.phase, CVT.name as cvname, F.feature_id, F.uniquename, ".
" FL.featureloc_id ".
"FROM {featureloc} FL ".
" INNER JOIN Feature F ON F.feature_id = FL.feature_id ".
" INNER JOIN Cvterm CVT ON CVT.cvterm_id = F.type_id ".
"WHERE srcfeature_id = %d AND ".
" NOT(CVT.name = 'match' or CVT.name = 'match_part') ".
"ORDER BY FL.fmin, FL.fmax";
$previous_db = tripal_db_set_active('chado');
$results = db_query($sql,$map->feature_id);
$alignments = array();
$i=0;
while($subfeature = db_fetch_object($results)){
$alignments[$i++] = $subfeature;
}
$additions->alignments = $alignments;
/* get the GO Terms
$sql = "SELECT DISTINCT * FROM {go_results_mview} ".
"WHERE feature_id = %d";
$results = db_query($sql,$map->feature_id);
$go_terms = array();
$i=0;
while($term = db_fetch_object($results)){
$go_terms[$i++] = $term;
}
$additions->go_terms = $go_terms;
// get the feature properties
$sql = "SELECT FP.value,FP.rank,CVT.name,CVT.definition ".
"FROM {featureprop} FP".
" INNER JOIN Cvterm CVT ".
" ON FP.type_id = CVT.cvterm_id ".
"WHERE feature_id = %d";
$results = db_query($sql,$map->feature_id);
$properties = array();
$i=0;
while($property = db_fetch_object($results)){
$properties[$i++] = $property;
}
$additions->properties = $properties;
*/
tripal_db_set_active($previous_db);
return $additions;
}
/************************************************************************
*
*/
function tripal_analysis_unigene_organism_assembly($node){
$node = node_load($node);
return tripal_analysis_unigene_organism_add($node);
}
/************************************************************************
*
*/
function theme_tripal_analysis_unigene_node_add ($node){
if(strcmp($node->type,'chado_organism')==0){
$box_status = variable_get("tripal_analysis_unigene-box-assembly","menu_off");
if (strcmp($box_status,"menu_off")==0){
$content = tripal_analysis_unigene_organism_add($node);
}
}
return $content;
}
/************************************************************************
*
*/
function tripal_analysis_unigene_organism_add($node){
// get the organism_id for this node:
$sql = 'SELECT * FROM {chado_organism} WHERE vid = %d';
$org_id = db_fetch_object(db_query($sql, $node->nid));
// get information about this organism
$sql = "SELECT * FROM {organism} ".
"WHERE organism_id = %d";
$previous_db = tripal_db_set_active('chado'); // use chado database
$organism = db_fetch_object(db_query($sql,$org_id->organism_id));
tripal_db_set_active($previous_db); // now use drupal database
// get information about this assembly and add it to the items in this node
$sql = "SELECT * FROM {unigene_mview} ".
"WHERE organism_id = %d ".
"ORDER BY analysis_id DESC";
$previous_db = tripal_db_set_active('chado'); // use chado database
$results = db_query($sql,$org_id->organism_id);
tripal_db_set_active($previous_db); // now use drupal database
//$i = 0;
//while ($assembly = db_fetch_object($results)){
// get information about this organism and add it to the items in this node
//$libraries = array();
//$libraries_sql = "SELECT library_id, library_name ".
//"FROM {unigene_libraries_mview} ".
//"WHERE analysis_id = %d ";
//$previous_db = tripal_db_set_active('chado'); // use chado database
//$libraries_result = db_query($libraries_sql,$assembly->analysis_id);
//tripal_db_set_active($previous_db); // now use drupal database
//$library_sql = "SELECT * FROM {chado_library} WHERE library_id = %d";
//$k = 0;
//while ($library = db_fetch_object($libraries_result)){
//$library_node = db_fetch_object(db_query($library_sql,$library->library_id));
//$library->node_id = $library_node->nid;
//$libraries[$k++] = $library;
//}
//$assembly->libraries = $libraries;
//$assemblies[$i++] = $assembly;
//}
// if this content is intended to be a menu item the
// we need to know so we can format the content slightly different
$box_status =variable_get("tripal_analysis_unigene-box-assembly","menu_off");
if(count($assemblies) > 0){
$content = "
".
"
New assemblies are built after a significant number of sequences are added to the project or new software is available. ".
"Click on name for more information.
";
foreach($assemblies as $assembly){
$content .= "
".
"
".
"
";
$content .= "
".
" Version | ".
" $assembly->uversion |
".
" Analysis ID | ".
" $assembly->analysis_id |
".
" Date | ".
" $assembly->adate |
".
" Software | ".
" $assembly->program |
".
" Software Version | ".
" $assembly->programversion |
".
" Number of Contigs | ".
" $assembly->num_contigs |
".
" Description | ".
" $assembly->description |
".
" Libraries Included in Assembly | ".
" ";
//# TODO: THIS SHOULD NOT HAVE A LINK IF THERE IS NO LIBRARY NODE IN DRUPAL
//foreach($assembly->libraries as $library){
//$content .= "node_id\">$library->library_name ";
//}
$content .= " |
".
"
";
# Generate the download linkes
$a_dir = tripal_get_moddir('tripal_analysis_unigene') .
"/$assembly->analysis_id";
if(is_dir($a_dir)){
$content .= "
";
if($target_file = file_scan_directory($a_dir,'\.contigs.fasta$',
array('.','..','CVS'),0,FALSE)){
foreach($target_file as $key=>$value){
$target = $target_file[$key];
}
$link = url($target->filename);
$content .= "
-
Download contigs
";
}
if($target_file = file_scan_directory($a_dir,'\.contigs.qual$',
array('.','..','CVS'),0,FALSE)){
foreach($target_file as $key=>$value){
$target = $target_file[$key];
}
$link = url($target->filename);
$content .= "
-
Download contigs quality
";
}
if($target_file = file_scan_directory($a_dir,'\.singlets.fasta$',
array('.','..','CVS'),0,FALSE)){
foreach($target_file as $key=>$value){
$target = $target_file[$key];
}
$link = url($target->filename);
$content .= "
-
Download singlets
";
}
if($target_file = file_scan_directory($a_dir,'\.singlets.qual$',
array('.','..','CVS'),0,FALSE)){
foreach($target_file as $key=>$value){
$target = $target_file[$key];
}
$link = url($target->filename);
$content .= "
-
Download singlets quality
";
}
if($target_file = file_scan_directory($a_dir,'\.ace$',
array('.','..','CVS'),0,FALSE)){
foreach($target_file as $key=>$value){
$target = $target_file[$key];
}
$link = url($target->filename);
$content .= "
-
Download ace file
";
;
}
$content .= "
";
}
if(user_access('access administrative pages')){
$link = url("tripal_toggle_box_menu/tripal_analysis_unigene/assembly/$node->nid");
if(strcmp($box_status,"menu_off")==0){
$content .= "
Show on menu";
} else {
$content .= "
Remove from menu";
}
}
$content .= "
";
}
$content .= "
";
}
return $content;
}
/*******************************************************************************
* Tripal Unigene administrative setting form. This function is called by
* tripal_analysis module which asks for an admin form to show on the page
*/
function tripal_analysis_unigene_get_settings() {
// Get an array of node types with internal names as keys
$options = node_get_types('names');
// Add 'chado_feature' to allowed content types for showing unigene results
$allowedoptions ['chado_feature'] = "Show 'ESTs in this contig' on feature pages";
$allowedoptions ['chado_organism'] = "Show assemblies on organism pages";
$form['description'] = array(
'#type' => 'item',
'#value' => t("This option allows user to display the unigene assembly ".
"information. For contigs, this would include an alignment and for ".
"organisms this would be a list of assemblies. Check the box to ".
"enable the display of unigene information. Uncheck to disable."),
'#weight' => 0,
);
$form['tripal_analysis_unigene_setting'] = array(
'#type' => 'checkboxes',
'#options' => $allowedoptions,
'#default_value'=>variable_get('tripal_analysis_unigene_setting',array()),
);
$settings->form = $form;
$settings->title = "Tripal Unigene";
return $settings;
}
/*******************************************************************************
* Set the permission types that the chado module uses. Essentially we
* want permissionis that protect creation, editing and deleting of chado
* data objects
*/
function tripal_analysis_unigene_perm(){
return array(
'access chado_analysis_unigene content',
'create chado_analysis_unigene content',
'delete chado_analysis_unigene content',
'edit chado_analysis_unigene content',
);
}
/*******************************************************************************
* The following function proves access control for users trying to
* perform actions on data managed by this module
*/
function chado_analysis_unigene_access($op, $node, $account){
if ($op == 'create') {
return user_access('create chado_analysis_unigene content', $account);
}
if ($op == 'update') {
if (user_access('edit chado_analysis_unigene content', $account)) {
return TRUE;
}
}
if ($op == 'delete') {
if (user_access('delete chado_analysis_unigene content', $account)) {
return TRUE;
}
}
if ($op == 'view') {
if (user_access('access chado_analysis_unigene content', $account)) {
return TRUE;
}
}
return FALSE;
}