t('Analysis: Unigene'), 'module' => 'chado_analysis_unigene', 'description' => t('A unigene assembly constructed from transcriptomic reads.'), 'has_title' => FALSE, 'title_label' => t('Analysis: Unigene'), 'has_body' => FALSE, 'body_label' => t('Unigene Analysis Description'), 'locked' => TRUE ); return $nodes; } /******************************************************************************* * 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; } /** * */ function chado_analysis_unigene_form ($node){ // add in the default fields $form = chado_analysis_form($node); $unigene = $node->analysis->tripal_analysis_unigene; $unigene_name = $unigene->unigene_name; $num_reads = $unigene->num_reads; $num_clusters = $unigene->num_clusters; $num_contigs = $unigene->num_contigs; $num_singlets = $unigene->num_singlets; $form['unigene_name'] = array( '#title' => t('Unigene Name'), '#type' => 'textfield', '#required' => TRUE, '#description' => t('A distinct name used to identify this unigene'), '#default_value' => $unigene_name, ); $form['num_reads'] = array( '#title' => t('Number of Reads'), '#type' => 'textfield', '#required' => FALSE, '#description' => t('Provide the number of reads, after filtering that were used for input into the assembly'), '#default_value' => $num_reads, ); $form['num_clusters'] = array( '#title' => t('Number of Clusters'), '#type' => 'textfield', '#required' => FALSE, '#description' => t('Provide the number of clusters generated by the asssembly if a clustering mechanism was used for unigene constructions'), '#default_value' => $num_clusters, ); $form['num_contigs'] = array( '#title' => t('Number of Contigs'), '#type' => 'textfield', '#required' => FALSE, '#description' => t('Provide the number of contigs generated by the assembly'), '#default_value' => $num_contigs, ); $form['num_singlets'] = array( '#title' => t('Number of Singlets'), '#type' => 'textfield', '#required' => FALSE, '#description' => t('Provide the number of singlets remaining in the assembly'), '#default_value' => $num_singlets, ); } /** * */ function chado_analysis_unigene_insert($node){ // insert the analysis chado_analysis_insert($node); // add the unigene name as a property of the anslysis tripal_analysis_insert_property($node->analysis->analysis_id,'analysis_type','tripal_analysis_unigene'); tripal_analysis_insert_property($node->analysis->analysis_id,'analysis_unigene_name',$node->unigene_name); tripal_analysis_insert_property($node->analysis->analysis_id,'analysis_unigene_num_contigs',$node->num_contigs); tripal_analysis_insert_property($node->analysis->analysis_id,'analysis_unigene_num_reads',$node->num_reads); tripal_analysis_insert_property($node->analysis->analysis_id,'analysis_unigene_num_clusters',$node->num_clusters); tripal_analysis_insert_property($node->analysis->analysis_id,'analysis_unigene_num_singlets',$node->num_clusters); } /** * */ function chado_analysis_unigene_update($node){ chado_analysis_update($node); tripal_analysis_update_property($node->analysis_id,'analysis_unigene_name',$node->unigene_name,1); tripal_analysis_update_property($node->analysis_id,'analysis_unigene_num_contigs',$node->num_contigs,1); tripal_analysis_update_property($node->analysis_id,'analysis_unigene_num_reads',$node->num_reads,1); tripal_analysis_update_property($node->analysis_id,'analysis_unigene_num_clusters',$node->num_clusters,1); tripal_analysis_update_property($node->analysis_id,'analysis_unigene_num_singlets',$node->num_singlets,1); } /** * */ function chado_analysis_unigene_delete($node){ chado_analysis_delete($node); } /** * */ function chado_analysis_unigene_view ($node, $teaser = FALSE, $page = FALSE) { // use drupal's default node view: $node = node_prepare($node, $teaser); return $node; } /** * */ function chado_analysis_unigene_load($node){ // load the default set of analysis fields $additions = chado_analysis_load($node); // create some variables for easier lookup $analysis = $additions->analysis; $analysis_id = $analysis->analysis_id; // add in the properties $unigene_name = tripal_analysis_get_property($analysis_id,'analysis_unigene_name'); $num_contigs = tripal_analysis_get_property($analysis_id,'analysis_unigene_num_contigs'); $num_reads = tripal_analysis_get_property($analysis_id,'analysis_unigene_num_reads'); $num_clusters = tripal_analysis_get_property($analysis_id,'analysis_unigene_num_clusters'); $num_singlets = tripal_analysis_get_property($analysis_id,'analysis_unigene_num_singlets'); $analysis->tripal_analysis_unigene->unigene_name = $unigene_name->value; $analysis->tripal_analysis_unigene->num_contigs = $num_contigs->value; $analysis->tripal_analysis_unigene->num_reads = $num_reads->value; $analysis->tripal_analysis_unigene->num_clusters = $num_clusters->value; $analysis->tripal_analysis_unigene->num_singlets = $num_singlets->value; // add in organism information using the materialized view $sql = "SELECT * FROM {organism_unigene_mview} OUM ". " INNER JOIN {organism} O on OUM.organism_id = O.organism_id ". "WHERE OUM.analysis_id = %d ". "ORDER BY O.genus, O.species"; $previous_db = tripal_db_set_active('chado'); // use chado database $organisms = db_query($sql,$analysis_id); tripal_db_set_active($previous_db); // now use drupal database while($organism = db_fetch_object($organisms)){ $sql = "SELECT nid FROM {chado_organism} WHERE organism_id = %d"; $c_org = db_fetch_object(db_query($sql,$organism->organism_id)); $organism->nid = $c_org->nid; $analysis->tripal_analysis_unigene->organisms[] = $organism; } return $additions; } /******************************************************************************* * 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)) { // Add unigene to the content item if it's not a teaser if ($teaser) { return ''; } // 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){ $node->content['tripal_organism_unigenes'] = array( '#value' => theme('tripal_organism_unigenes', $node), '#weight' => 4 ); } } } break; } } /************************************************************************ * 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_organism_unigenes' => array ( 'arguments' => array('node'=> null), 'template' => 'tripal_organism_unigenes', ), 'tripal_analysis_unigene_base' => array ( 'arguments' => array('node'=> null), 'template' => 'tripal_analysis_unigene_base', ), ); } /******************************************************************************* * */ function tripal_analysis_unigene_preprocess_tripal_organism_unigenes(&$variables){ $node = $variables['node']; $organism = $node->organism; $unigenes = tripal_analysis_unigene_load_organism_unigenes($organism); $node->organism->tripal_analysis_unigene->unigenes = $unigenes; } /************************************************************************ * 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 = "