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 .= "". "". " ". " ". " ". " ". " "; // 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 .= "". " ". " ". " ". ""; } 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 .= "". " ". " ". " ". ""; } else { $content .= "". "". " ". " ". " ". " ". " ". ""; } } $content .= "
TypeFeaturePosition
Contig"; if ($node_exists != 0) { $content .= "". "$contig_name"; } else { $content .= $contig_name; } $content .= " ". number_format($result->fmin). "-". number_format($result->fmax). "
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). "
$result->cvname$result->feature_name$result->fmin$result->fmax$result->strand
"; /* 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; }