소스 검색

Initial import of version 0.2

spficklin 15 년 전
부모
커밋
eba6db0376

+ 23 - 0
tripal_analysis_go/go_path_counts

@@ -0,0 +1,23 @@
+SELECT  CVTP.subject_id, CVT.name, CVT2.name, CVTP.object_id, CVT3.name, CVTP.pathdistance, count(F.name)
+FROM {cvtermpath} CVTP
+   INNER JOIN CVTerm CVT ON CVTP.subject_id = CVT.cvterm_id
+   INNER JOIN CVTerm CVT2 on CVTP.type_id = CVT2.cvterm_id
+   INNER JOIN CVTerm CVT3 on CVTP.object_id = CVT3.cvterm_id
+   INNER JOIN Feature_cvterm FCVT on FCVT.cvterm_id = CVT.cvterm_id
+   INNER JOIN Feature F on FCVT.feature_id = F.feature_id
+WHERE object_id = 7438
+GROUP BY CVTP.subject_id, CVT.name, CVT2.name, CVTP.object_id, CVT3.name, CVTP.pathdistance
+ORDER BY pathdistance
+
+
+// THE MATERIALIZED VIEW!!!
+SELECT  CVT3.name, CVTP.object_id, count(F.name)
+FROM {cvtermpath} CVTP
+   INNER JOIN CVTerm CVT ON CVTP.subject_id = CVT.cvterm_id
+   INNER JOIN CVTerm CVT2 on CVTP.type_id = CVT2.cvterm_id
+   INNER JOIN CVTerm CVT3 on CVTP.object_id = CVT3.cvterm_id
+   INNER JOIN Feature_cvterm FCVT on FCVT.cvterm_id = CVT.cvterm_id
+   INNER JOIN Feature F on FCVT.feature_id = F.feature_id
+   INNER JOIN CV on CV.cv_id = CVT.cv_id
+WHERE CV.name = 'biological_process' or CV.name = 'molecular_function' or CV.name = 'cellular_component'
+GROUP BY CVT3.name, CVTP.object_id

+ 11 - 0
tripal_analysis_go/tripal_analysis_go.info

@@ -0,0 +1,11 @@
+; $Id: tripal_analysis_go.info,v 1.2 2009/10/23 02:12:16 ccheng Exp $
+name = Tripal GO
+description = An analysis sub-module for displaying GO analysis and GO assignments to features.
+core = 6.x
+project = tripal_analysis_go
+package = Tripal
+version = "6.x-0.2b-m0.1"
+dependencies[] = tripal_core
+dependencies[] = tripal_feature
+dependencies[] = tripal_analysis
+dependencies[] = tripal_organism

+ 133 - 0
tripal_analysis_go/tripal_analysis_go.install

@@ -0,0 +1,133 @@
+<?php
+
+/*******************************************************************************
+*  Implementation of hook_install();
+*/
+function tripal_analysis_go_install(){
+  
+   tripal_analysis_register_child('tripal_analysis_go');
+   
+   // The following view will create counts of features that are assigned
+   // either directly or by ancestry each GO term. The count is organized by
+   // organisms.
+   $previous_db = db_set_active('chado');
+   if (db_table_exists('go_count_organism')) {
+      $sql = "DROP TABLE go_count_organism";
+      db_query($sql);
+   }
+   if (db_table_exists('go_count_analysis')) {
+      $sql = "DROP TABLE go_count_analysis";
+      db_query($sql);
+   }
+   db_set_active($previous_db);
+   
+   tripal_add_mview(
+      // view name
+      'go_count_organism',
+      // tripal module name
+      'tripal_analysis_go',
+      // table name
+      'go_count_organism',
+      // table schema definition
+      'cvname character varying(255),
+       cvterm_id integer,
+       organism_id integer,
+       feature_count integer',
+      // columns for indexing
+      'cvterm_id,organism_id',
+      // SQL statement to populate the view
+      "SELECT T1.cvname, T1.object_id, T1.organism_id, count(T1.feature_id)
+       FROM
+         (SELECT DISTINCT CVT3.name as cvname, CVTP.object_id, 
+            O.organism_id, F.feature_id
+          FROM {cvtermpath} CVTP
+            INNER JOIN CVTerm CVT          ON CVTP.subject_id = CVT.cvterm_id
+            INNER JOIN CVTerm CVT2         ON CVTP.type_id = CVT2.cvterm_id
+            INNER JOIN CVTerm CVT3         ON CVTP.object_id = CVT3.cvterm_id
+            INNER JOIN Feature_cvterm FCVT ON FCVT.cvterm_id = CVT.cvterm_id
+            INNER JOIN Feature F           ON FCVT.feature_id = F.feature_id
+            INNER JOIN CV                  ON CV.cv_id = CVT.cv_id
+            INNER JOIN Organism O          ON O.organism_id = F.organism_id
+          WHERE (CV.name = 'biological_process' or 
+                 CV.name = 'molecular_function' or 
+                 CV.name = 'cellular_component')
+         ) as T1
+       GROUP BY T1.cvname,T1.object_id,T1.organism_id",
+      // special index
+      ''
+   );
+
+   // The following view will create counts of features that are assigned
+   // either directly or by ancestry each GO term. The count is organized by
+   // tripal_go_analysis analyses.
+   tripal_add_mview(
+      // view name
+      'go_count_analysis',
+      // tripal module name
+      'tripal_analysis_go',
+      // table name
+      'go_count_analysis',
+      // table schema definition
+      'cvname character varying(255),
+       cvterm_id integer,
+       analysis_id integer,
+       organism_id integer,
+       feature_count integer',
+      // columns for indexing
+      'cvterm_id,analysis_id,organism_id',
+      // SQL statement to populate the view
+      "SELECT T1.cvname,T1.cvterm_id,T1.analysis_id,T1.organism_id,count(*) as feature_count 
+       FROM
+        (SELECT DISTINCT AF.analysis_id, AF.feature_id,CVT.name as cvname,
+           CVT.cvterm_id,CVTP.object_id,CV.name, F.organism_id 
+         FROM {analysisfeatureprop} AFP
+           INNER JOIN analysisfeature AF ON AF.analysisfeature_id = AFP.analysisfeature_id
+           INNER JOIN feature F          ON AF.feature_id = F.feature_id
+           INNER JOIN cvtermpath CVTP    ON CVTP.subject_id = AFP.type_id
+           INNER JOIN cvterm CVT         ON CVTP.object_id = CVT.cvterm_id
+           INNER JOIN CV                 ON CV.cv_id = CVT.cv_id
+
+         WHERE  
+           (CV.name = 'biological_process' or 
+            CV.name = 'molecular_function' or 
+            CV.name = 'cellular_component')) as T1
+       GROUP BY T1.cvname,T1.cvterm_id,T1.analysis_id,T1.organism_id",
+      // special index
+      ''
+   );
+}
+
+/*******************************************************************************
+* Implementation of hook_uninstall()
+*/
+function tripal_analysis_go_uninstall(){
+
+   $mview = tripal_mviews_get_mview_id('go_count_organism');
+   if($mview){
+      tripal_mviews_action('delete',$mview);
+   }
+   $mview = tripal_mviews_get_mview_id('go_count_analysis');
+   if($mview){
+      tripal_mviews_action('delete',$mview);
+   }
+   tripal_analysis_unregister_child('tripal_analysis_go');
+
+}
+
+/*******************************************************************************
+ * Implementation of hook_requirements(). Make sure 'Tripal Core' and 'Tripal
+ * Analysis' are enabled before installation
+ */
+function tripal_analysis_go_requirements($phase) {
+   $requirements = array();
+   if ($phase == 'install') {
+      if (!function_exists('tripal_create_moddir') || !function_exists('tripal_analysis_register_child')) {
+         $requirements ['tripal_analysis_go'] = array(
+            'title' => "tripal_analysis_go",
+            'value' => "error. Some required modules are just being installed. Please try again.",
+            'severity' => REQUIREMENT_ERROR,
+         );
+      }
+   }
+   return $requirements;
+}

+ 582 - 0
tripal_analysis_go/tripal_analysis_go.module

@@ -0,0 +1,582 @@
+<?php
+
+//
+// Copyright 2009 Clemson University
+//
+
+function tripal_analysis_go_init(){
+   // Add style sheet
+   drupal_add_css(drupal_get_path('theme', 'tripal').
+                                  '/css/tripal_analysis_go.css');
+
+   drupal_add_js(drupal_get_path('theme', 'tripal').
+       '/js/tripal_analysis_go.js');
+}
+
+/*******************************************************************************
+ * Menu items are automatically added for the new node types created
+ * by this module to the 'Create Content' Navigation menu item.  This function
+ * adds more menu items needed for this module.
+ */
+function tripal_analysis_go_menu() {
+   $items = array();
+
+   $items['node/%/goterms'] = array(
+     'title' => t('GO Analysis'),
+     'page callback' => 'tripal_analysis_go_organism_goterms',
+     'page arguments' => array(1),
+     'access callback' => 'tripal_analysis_go_node_has_menu',
+     'access arguments' => array('access chado_analysis_go content',1),
+     'type' => MENU_LOCAL_TASK | MENU_NORMAL_ITEM
+   );
+   $items['download_goterm_features'] = array(
+      'path' => 'download_goterm_features',
+      'title' => t('Get GO Term Features'),
+      'page callback' => 'tripal_analysis_go_get_goterm_features',
+      'page arguments' => array(1,2),
+      'access arguments' => array('access chado_analysis_go content'),
+      'type' => MENU_CALLBACK
+   );
+   $items['tripal_analysis_go_org_charts'] = array(
+      'path' => 'tripal_analysis_go_org_charts',
+      'title' => t('Analysis GO Charts'),
+      'page callback' => 'tripal_analysis_go_org_charts',
+      'page arguments' => array(1),
+      'access arguments' => array('access chado_analysis_go content'),
+      'type' => MENU_CALLBACK
+   );
+
+
+   return $items;
+}
+/*******************************************************************************
+ * 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_go_perm(){
+   return array(
+      'access chado_analysis_go content',
+      'create chado_analysis_go content',
+      'delete chado_analysis_go content',
+      'edit chado_analysis_go content',
+   );
+}
+/*******************************************************************************
+ *  The following function proves access control for users trying to
+ *  perform actions on data managed by this module
+ */
+function chado_analysis_go_access($op, $node, $account){
+   if ($op == 'create') {
+      return user_access('create chado_analysis_go content', $account);
+   }
+
+   if ($op == 'update') {
+      if (user_access('edit chado_analysis_go content', $account)) {
+         return TRUE;
+      }
+   }
+   if ($op == 'delete') {
+      if (user_access('delete chado_analysis_go content', $account)) {
+         return TRUE;
+      }
+   }
+   if ($op == 'view') {
+      if (user_access('access chado_analysis_go content', $account)) {
+         return TRUE;
+      }
+   }
+   return FALSE;
+}
+/*******************************************************************************
+ * Dynamic addition/removal of menu item
+ */
+function tripal_analysis_go_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_go-box-goterms","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;
+   }
+}
+/*******************************************************************************
+ * HOOK: Implementation of hook_nodeapi()
+ * Display library information for associated features or organisms
+ * This function also provides contents for indexing
+ */
+function tripal_analysis_go_nodeapi(&$node, $op, $teaser, $page) {
+
+   switch ($op) {
+      // Note that this function only adds library view to an organism/feature
+      // node. The view of a library node is controled by the theme *.tpl file
+      case 'view':
+      
+         // Set the node types for showing library information
+         $types_to_show = variable_get('tripal_analysis_go_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_go-box-goterms","menu_off");
+            if (strcmp($box_status,"menu_on")==0 && $node->type =='chado_organism'){
+               variable_set("tripal_analysis_go-box-goterms","menu_off");
+            }
+            break;
+         }
+
+         // Add library to the content item if it's not a teaser
+         if (!$teaser) {
+            // add the library to the organism/feature search indexing
+            if($node->build_mode == NODE_BUILD_SEARCH_INDEX){
+               $node->content['tripal_analysis_go_search_index'] = array(
+						'#value' => theme('tripal_analysis_go_search_index',$node),
+						'#weight' => 5,
+               );
+            } else if ($node->build_mode == NODE_BUILD_SEARCH_RESULT) {
+               $node->content['tripal_analysis_go_search_result'] = array(
+						'#value' => theme('tripal_analysis_go_search_result',$node),
+						'#weight' => 5,
+               );
+            } else {
+               // Show go terms if the organism/feature is not at teaser view               
+               $node->content['tripal_analysis_go_node_add'] = array(
+						'#value' => theme('tripal_analysis_go_node_add', $node),
+					   '#weight' => 5
+               );
+            }
+         }
+   }
+}
+
+/************************************************************************
+ *  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_go_theme () {
+   return array(
+   	  
+      'tripal_analysis_go_search_index' => array (
+         'arguments' => array('node'),
+      ),
+      'tripal_analysis_go_search_result' => array (
+         'arguments' => array('node'),
+      ),
+      'tripal_analysis_go_node_add' => array (
+         'arguments' => array('node'),
+      )
+   );
+}
+/************************************************************************
+*/
+function theme_tripal_analysis_go_search_index($node){
+
+}
+
+/************************************************************************
+*/
+function theme_tripal_analysis_go_search_result($node){
+
+}
+/************************************************************************
+*/
+function theme_tripal_analysis_go_node_add($node){
+   $content = '';
+   if(strcmp($node->type,'chado_feature')==0){
+      $content = tripal_analysis_go_feature_add($node);
+   }
+   if(strcmp($node->type,'chado_organism')==0){
+      $box_status = variable_get("tripal_analysis_go-box-goterms","menu_off");
+      if (strcmp($box_status,"menu_off")==0){
+         $content = tripal_analysis_go_organism_add($node);
+      }
+   }
+   return $content;
+}
+/************************************************************************
+*/
+function tripal_analysis_go_organism_goterms($node) {
+   $node = node_load($node);
+   return tripal_analysis_go_organism_add($node);
+}
+/************************************************************************
+*/
+function tripal_analysis_go_select_form(&$form_state = NULL,$node){
+
+   $form = array();
+   // find analyses that have GO terms
+   $sql = "
+     SELECT DISTINCT A.analysis_id, A.name, GCA.organism_id
+     FROM {go_count_analysis} GCA
+       INNER JOIN Analysis A on GCA.analysis_id = A.analysis_id
+     WHERE organism_id = %d
+     ORDER BY analysis_id DESC
+   ";
+   $previous_db = db_set_active('chado');
+   $results = db_query($sql,$node->organism_id);
+   db_set_active($previous_db);
+
+   $analyses = array();
+   $analyses[''] = '';
+   while($analysis = db_fetch_object($results)){
+      $analyses[$analysis->analysis_id."-".$analysis->organism_id] = "$analysis->name";
+   }
+  
+   # create the select box
+   $form['analysis_select'] = array(
+      '#title' => t('Select a GO report to view'),
+      '#description' => t('Any analysis with GO results related to this organism are available for viewing. For further information, see the analysis information page.'),
+      '#type'  => 'select',
+      '#options' => $analyses,
+      '#attributes' => array (
+         'onchange' => 'tripal_analysis_go_org_charts(this.options[this.selectedIndex].value)'
+      ),
+   );
+   return $form;
+}
+/************************************************************************
+*/
+function tripal_analysis_go_org_charts ($element) {
+   $analysis_id = preg_replace("/^(\d+)-(\d+)$/","$1",$element);
+   $organism_id = preg_replace("/^(\d+)-(\d+)$/","$2",$element);
+   $content = '';
+
+   if($analysis_id and $organism_id){
+      $content = "
+
+        <b>Biological Process</b>
+        <br><i>Expand the tree to browse term counts. Click a term to view term details.</i>
+        <div class=\"tripal_cv_tree\"  id=\"tripal_analysis_go_cv_tree_".$organism_id."-".$analysis_id."_bp\"></div>
+	<br><br><img class=\"tripal_cv_chart\" id=\"tripal_analysis_go_cv_chart_".$organism_id."-".$analysis_id."_bp\" src=\"\" border=\"0\">	   
+	<br><br><br><br>
+
+        <b>Cellular Component</b>
+        <br><i>Expand the tree to browse term counts. Click a term to view term details.</i>
+        <div class=\"tripal_cv_tree\"  id=\"tripal_analysis_go_cv_tree_".$organism_id."-".$analysis_id."_cc\"></div>
+        <br><br><img class=\"tripal_cv_chart\" id=\"tripal_analysis_go_cv_chart_".$organism_id."-".$analysis_id."_cc\" src=\"\" border=\"0\">
+
+        <br><br><br><br>
+        <b>Molecular Function</b>       
+        <br><i>Expand the tree to browse term counts. Click a term to view term details.</i>
+        <div class=\"tripal_cv_tree\"  id=\"tripal_analysis_go_cv_tree_".$organism_id."-".$analysis_id."_mf\"></div>      
+        <br><br><img class=\"tripal_cv_chart\" id=\"tripal_analysis_go_cv_chart_".$organism_id."-".$analysis_id."_mf\" src=\"\" border=\"0\">
+      ";
+   }
+   $opt = array($content);
+   return drupal_json($opt);
+}
+/************************************************************************
+*/
+function tripal_analysis_go_organism_add($node) {
+   // Show GO information in a expandable box for a organism page.
+   // Make sure we have $node->organism_id. In the case of creating a new
+   // organism, the organism_id is not created until we save. This will cause
+   // an error when users preview the creation without a $node->organism_id
+   $box_status = variable_get("tripal_analysis_go-box-goterms","menu_off");
+      
+   if(strcmp($box_status,"menu_off")==0){
+      $content .= "
+      <div class=\"tripal_go_summary-info-box\">
+        <div class=\"tripal_expandableBox\">
+	       <h3>Gene Ontology Summary</h3>
+	     </div>
+        <div class=\"tripal_expandableBoxContent\">
+      ";
+   } 
+
+   // check to see if we have any analyses
+   $sql = "
+     SELECT DISTINCT A.analysis_id, A.name, GCA.organism_id
+     FROM {go_count_analysis} GCA
+       INNER JOIN Analysis A on GCA.analysis_id = A.analysis_id
+     WHERE organism_id = %d
+     ORDER BY analysis_id DESC
+   ";
+   $previous_db = db_set_active('chado');
+   $results = db_fetch_object(db_query($sql,$node->organism_id));
+   db_set_active($previous_db);
+
+   if($results){
+      $select_analysis = drupal_get_form('tripal_analysis_go_select_form',$node);
+
+      $url = url("sites/all/themes/theme_tripal/images/ajax-loader.gif");
+      $content .= "
+        $select_analysis
+        <div id=\"tripal_cv_cvterm_info_box\">
+           <a href=\"#\" onclick=\"$('#tripal_cv_cvterm_info_box').hide()\" style=\"float: right\">Close [X]</a>
+           <h3>Term Information</h3>
+           <div id=\"tripal_cv_cvterm_info\"></div>
+        </div>
+        <div id=\"tripal_ajaxLoading\" style=\"display:none\">
+        <div id=\"loadingText\">Loading...</div>
+        <img src=\"$url\"></div><div id=\"tripal_analysis_go_org_charts\"></div>
+      ";
+   } else {
+      $content .= "There are currently no Gene Ontology (GO) reports for this organism\n";
+   }
+
+   if(user_access('access administrative pages')){
+      $link = url("tripal_toggle_box_menu/tripal_analysis_go/goterms/$node->nid");
+   	if(strcmp($box_status,"menu_off")==0){
+         $content .= "<br><a href=\"$link\">Show on menu</a>";
+      } else {
+         $content .= "<br><a href=\"$link\">Remove from menu</a>";
+      }
+   }
+   if(strcmp($box_status,"menu_off")==0){
+      $content .= "</div></div>";
+   }
+
+   return $content;
+}
+/************************************************************************
+ *
+ */
+function tripal_analysis_go_cv_chart($chart_id){
+
+  // The CV module will create the JSON array necessary for buillding a
+  // pie chart using jgChart and Google Charts.  We have to pass to it
+  // a table that contains count information, tell it which column 
+  // contains the cvterm_id and provide a filter for getting the
+  // results we want from the table.
+  $organism_id = preg_replace("/^tripal_analysis_go_cv_chart_(\d+)-(\d+)_(bp|cc|mf)$/","$1",$chart_id);
+  $analysis_id = preg_replace("/^tripal_analysis_go_cv_chart_(\d+)-(\d+)_(bp|cc|mf)$/","$2",$chart_id);
+  $type        = preg_replace("/^tripal_analysis_go_cv_chart_(\d+)-(\d+)_(bp|cc|mf)$/","$3",$chart_id);
+
+  $sql = "SELECT * FROM {Analysis} WHERE analysis_id = %d";
+  $previous_db = db_set_active('chado');  // use chado database
+  $analysis = db_fetch_object(db_query($sql,$analysis_id));
+  db_set_active($previous_db);  // now use drupal database  
+ 
+  if(strcmp($type,'mf')==0){
+     $class = 'molecular_function';
+     $title = "Number of Molecular Function Terms From $analysis->name Analysis";
+  }
+  if(strcmp($type,'cc')==0){
+     $class = 'cellular_component';
+     $title = "Number of Cellular Component Terms From $analysis->name Analysis";
+  }
+  if(strcmp($type,'bp')==0){
+     $class = 'biological_process';
+     $title = "Number of Biological Process Terms From $analysis->name Analysis";
+  }
+  $options = array(
+     count_mview      => 'go_count_analysis',
+     cvterm_id_column => 'cvterm_id',
+     count_column     => 'feature_count',
+     filter           => "
+        CNT.organism_id = $organism_id AND 
+        CNT.analysis_id = $analysis_id AND 
+        CNT.cvterm_id IN ( 
+          SELECT CVTR.subject_id 
+          FROM {CVTerm_relationship} CVTR 
+            INNER JOIN CVTerm CVT on CVTR.object_id = CVT.cvterm_id
+            INNER JOIN CV on CVT.cv_id = CV.cv_id
+          WHERE CVT.name = '$class' AND  
+                 CV.name = '$class'
+        )
+     ",
+     type             => 'p',
+     size             => '680x230',
+     title            => $title,
+  );
+  return $options;
+}
+/************************************************************************
+ *
+ */
+function tripal_analysis_go_cv_tree($tree_id){
+
+  $organism_id = preg_replace("/^tripal_analysis_go_cv_tree_(\d+)-(\d+)_(bp|cc|mf)$/","$1",$tree_id);
+  $analysis_id = preg_replace("/^tripal_analysis_go_cv_tree_(\d+)-(\d+)_(bp|cc|mf)$/","$2",$tree_id);
+  $type        = preg_replace("/^tripal_analysis_go_cv_tree_(\d+)-(\d+)_(bp|cc|mf)$/","$3",$tree_id);
+
+  if(strcmp($type,'mf')==0){
+     $class = 'molecular_function';
+  }
+  if(strcmp($type,'cc')==0){
+     $class = 'cellular_component';
+  }
+  if(strcmp($type,'bp')==0){
+     $class = 'biological_process';
+  }
+
+  $options = array(
+     cv_id            => tripal_cv_get_cv_id($class),
+     count_mview      => 'go_count_analysis',
+     cvterm_id_column => 'cvterm_id',
+     count_column     => 'feature_count',
+     filter           => "CNT.organism_id = $organism_id AND CNT.analysis_id = $analysis_id",
+     label            => 'Features',
+  );
+  return $options;
+}
+/************************************************************************
+*/
+function tripal_analysis_go_cvterm_add($cvterm_id,$tree_id){
+  $organism_id = preg_replace("/^tripal_analysis_go_cv_tree_(\d+)-(\d+)_(bp|cc|mf)$/","$1",$tree_id);
+  $analysis_id = preg_replace("/^tripal_analysis_go_cv_tree_(\d+)-(\d+)_(bp|cc|mf)$/","$2",$tree_id);
+
+  $sql = "
+     SELECT DBX.accession
+     FROM {cvterm} CVT
+       INNER JOIN dbxref DBX on DBX.dbxref_id = CVT.dbxref_id
+     WHERE cvterm_id = %d
+  ";
+  $previous_db = db_set_active('chado');
+  $xref = db_fetch_object(db_query($sql,$cvterm_id));
+  db_set_active($previous_db);
+
+  $link = url("download_goterm_features/$cvterm_id/$tree_id");
+  $options = array(
+     'Download sequences' => "<a href=\"$link\">GO_".$xref->accession.".fasta</a>",
+  );
+  return $options;
+}
+/************************************************************************
+*/
+function tripal_analysis_go_get_goterm_features($cvterm_id,$tree_id){
+
+   // get hte accession number for this cvterm and use it in naming the download
+   $sql = "
+      SELECT DBX.accession
+      FROM {cvterm} CVT
+        INNER JOIN dbxref DBX on DBX.dbxref_id = CVT.dbxref_id
+      WHERE cvterm_id = %d
+   ";
+   $previous_db = db_set_active('chado');
+   $xref = db_fetch_object(db_query($sql,$cvterm_id));
+   db_set_active($previous_db);
+
+   drupal_set_header('Content-Type: text');
+   drupal_set_header('Content-Disposition: attachment; filename="GO_'.$xref->accession.'.fasta"');
+
+   $organism_id = preg_replace("/^tripal_analysis_go_cv_tree_(\d+)-(\d+)_(bp|cc|mf)$/","$1",$tree_id);
+   $analysis_id = preg_replace("/^tripal_analysis_go_cv_tree_(\d+)-(\d+)_(bp|cc|mf)$/","$2",$tree_id);
+   $sql = "
+      SELECT DISTINCT F.name,F.residues,F.feature_id
+      FROM {cvtermpath} CVTP
+         INNER JOIN CVTerm CVT1 on CVTP.subject_id = CVT1.cvterm_id
+         INNER JOIN CVTerm CVT2 on CVTP.object_id = CVT2.cvterm_id
+         INNER JOIN AnalysisFeatureProp AFP on AFP.type_id = CVTP.subject_id 
+         INNER JOIN AnalysisFeature AF on AF.analysisfeature_id = AFP.analysisfeature_id
+         INNER JOIN Feature F on AF.feature_id = F.feature_id
+      WHERE CVTP.object_id = %d and F.organism_id = %d and AF.analysis_id = %d
+      ORDER BY F.name
+   ";
+   $previous_db = db_set_active('chado');
+   $results = db_query($sql,$cvterm_id,$organism_id,$analysis_id);
+   db_set_active($previous_db);
+   while($feature = db_fetch_object($results)){
+      // get the go term information for each sequence
+      $sql = "
+         SELECT CVT.name,DBX.accession 
+         FROM {Feature_CVTerm} FCVT 
+           INNER JOIN CVTerm CVT on FCVT.cvterm_id = CVT.cvterm_id
+           INNER JOIN DBXref DBX on CVT.dbxref_id = DBX.dbxref_id
+         WHERE FCVT.feature_id = %d
+      ";
+
+      $previous_db = db_set_active('chado');
+      $terms = db_query($sql,$feature->feature_id);
+      db_set_active($previous_db);
+      $desc = '[';
+      while($term = db_fetch_object($terms)){
+         $desc .= "GO:$term->accession $term->name; ";
+      }
+      $desc = chop($desc);
+      $desc = chop($desc,';');
+      $desc .= ']';
+      print tripal_feature_return_fasta($feature, $desc);   
+   }
+   return;
+}
+/************************************************************************
+*/
+function tripal_analysis_go_feature_add($node) {
+   $content = "";
+   $sql = "
+       SELECT DISTINCT FCVT.feature_id,DBX.accession,CVT.name as goterm, 
+          CVT.cvterm_id as go_id, CV.name as cvname
+       FROM {Feature_Cvterm} FCVT  
+          INNER JOIN Cvterm CVT           ON CVT.cvterm_ID = FCVT.cvterm_ID
+          INNER JOIN CV                   ON CV.cv_id = CVT.cv_id  
+          INNER JOIN dbxref DBX           ON DBX.dbxref_id = CVT.dbxref_id
+        WHERE      
+          (CV.name = 'biological_process' OR 
+           CV.name = 'cellular_component' OR 
+           CV.name = 'molecular_function') AND 
+          FCVT.feature_id = %d
+        ORDER BY CV.name, CVT.name
+   ";
+
+   $previous_db = db_set_active('chado');
+   $results = db_query($sql,$node->feature->feature_id);
+   db_set_active($previous_db);
+   $term = db_fetch_object($results); // retrive the first result
+   if ($term) {
+      $content .= "<div id=\"tripal_go_box\" class=\"tripal_go-info-box\">";
+      $content .= "<div class=\"tripal_expandableBox\">".
+            	   "<h3>GO terms assigned to this feature</h3>".
+                  "</div>";
+      $content .= "<div class=\"tripal_expandableBoxContent\">";
+      $content .= "<table class=\"feature-go-terms\">";
+      $content .= "  <tr>";
+      $content .= "    <th class=\"dbfieldname\">Accession</th>";
+      $content .= "    <th class=\"dbfieldname\">Category</th>";
+      $content .= "    <th class=\"dbfieldname\">Term</th>";
+      $content .= "  </tr>";
+      do {
+         $content .= "<tr>";
+         $content .= "  <td>GO:$term->accession</td>";
+         $content .= "  <td>$term->cvname</td>";
+         $content .= "  <td>$term->goterm</td>";
+         $content .= "</tr>";      
+      } while($term = db_fetch_object($results));
+      $content .= "</table>";
+      $content .= "</div></div>";
+   }
+   return $content;
+}
+
+/*******************************************************************************
+ * Tripal GO 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_go_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 GO terms on feature pages";
+   $allowedoptions ['chado_organism'] = "Show GO analysis on organism pages";
+
+   $form['description'] = array(
+       '#type' => 'item',
+       '#value' => t("This option allows user to display the Gene Ontology (GO) ".
+          "information. For features, this would include all GO terms assigned to a feature ".
+          "and for organisms this would be statistical pie charts of GO terms for a organism. Check the box to ".
+          "enable the display of GO information. Uncheck to disable."),
+       '#weight' => 0,
+   );
+
+   $form['tripal_analysis_go_setting'] = array(
+      '#type' => 'checkboxes',
+      '#options' => $allowedoptions,
+      '#default_value'=>variable_get('tripal_analysis_go_setting',array('chado_feature', 'chado_organism')),
+   );
+   $settings->form = $form;
+   $settings->title = "Tripal GO";
+   return $settings;
+}