t('Accession Prefix'), '#type' => t('textfield'), '#description' => t("Accession numbers for features consist of the ". "chado feature_id and a site specific prefix. Set the prefix that ". "will be incorporated in front of each feature_id to form a unique ". "accession number for this site."), '#required' => TRUE, '#default_value' => variable_get('chado_feature_accession_prefix','ID'), ); $form['chado_feature_types'] = array( '#title' => t('Feature Types'), '#type' => 'textarea', '#description' => t('Enter the names of the sequence types that the ". "site will support with independent pages. Pages for these data ". "types will be built automatically for features that exist in the ". "chado database. The names listed here should be spearated by ". "spaces or entered separately on new lines. The names must match ". "exactly (spelling and case) with terms in the sequence ontology'), '#required' => TRUE, '#default_value' => variable_get('chado_feature_types','EST contig'), ); $form['browser'] = array( '#type' => 'fieldset', '#title' => t('Feature Browser') ); $allowedoptions1 = array ( 'show_feature_browser' => "Show the feature browser on the organism page. The browser loads when page loads. This may be slow for large sites.", 'hide_feature_browser' => "Hide the feature browser on the organism page. Disables the feature browser completely.", ); // $allowedoptions ['allow_feature_browser'] = "Allow loading of the feature browsing through AJAX. For large sites the initial page load will be quick with the feature browser loading afterwards."; $form['browser']['browse_features'] = array( '#title' => 'Feature Browser on Organism Page', '#description' => 'A feature browser can be added to an organism page to allow users to quickly '. 'access a feature. This will most likely not be the ideal mechanism for accessing feature '. 'information, especially for large sites, but it will alow users exploring the site (such '. 'as students) to better understand the data types available on the site.', '#type' => 'radios', '#options' => $allowedoptions1, '#default_value'=>variable_get('tripal_feature_browse_setting', 'show_feature_browser'), ); $form['browser']['set_browse_button'] = array( '#type' => 'submit', '#value' => t('Set Browser'), '#weight' => 2, ); $form['summary'] = array( '#type' => 'fieldset', '#title' => t('Feature Summary') ); $allowedoptions2 ['show_feature_summary'] = "Show the feature summary on the organism page. The summary loads when page loads."; $allowedoptions2 ['hide_feature_summary'] = "Hide the feature summary on the organism page. Disables the feature summary."; $form['summary']['feature_summary'] = array( '#title' => 'Feature Summary on Organism Page', '#description' => 'A feature summary can be added to an organism page to allow users to see the '. 'type and quantity of features available for the organism.', '#type' => 'radios', '#options' => $allowedoptions2, '#default_value'=>variable_get('tripal_feature_summary_setting', 'show_feature_summary'), ); $form['summary']['set_summary_button'] = array( '#type' => 'submit', '#value' => t('Set Summary'), '#weight' => 2, ); get_tripal_feature_admin_form_sync_set($form); get_tripal_feature_admin_form_taxonomy_set($form); get_tripal_feature_admin_form_reindex_set($form); get_tripal_feature_admin_form_cleanup_set($form); } else { $form['notice'] = array( '#type' => 'fieldset', '#title' => t('Feature Management Temporarily Unavailable') ); $form['notice']['message'] = array( '#value' => t('Currently, feature management jobs are waiting or ". "are running. Managemment features have been hidden until these ". "jobs complete. Please check back later once these jobs have ". "finished. You can view the status of pending jobs in the Tripal ". "jobs page.'), ); } return system_settings_form($form); } /************************************************************************ * */ function tripal_feature_admin_validate($form, &$form_state) { global $user; // we need access to the user info $job_args = array(); // if the user wants to sync up the chado features then // add the job to the management queue if ($form_state['values']['op'] == t('Sync all Features')) { tripal_add_job('Sync all features','tripal_feature', 'tripal_feature_sync_features',$job_args,$user->uid); } if ($form_state['values']['op'] == t('Set/Reset Taxonomy for all feature nodes')) { tripal_add_job('Set all feature taxonomy','tripal_feature', 'tripal_features_set_taxonomy',$job_args,$user->uid); } if ($form_state['values']['op'] == t('Reindex all feature nodes')) { tripal_add_job('Reindex all features','tripal_feature', 'tripal_features_reindex',$job_args,$user->uid); } if ($form_state['values']['op'] == t('Clean up orphaned features')) { tripal_add_job('Cleanup orphaned features','tripal_feature', 'tripal_features_cleanup',$job_args,$user->uid); } if ($form_state['values']['op'] == t('Set Browser')) { variable_set('tripal_feature_browse_setting',$form_state['values']['browse_features']); } if ($form_state['values']['op'] == t('Set Summary')) { variable_set('tripal_feature_summary_setting',$form_state['values']['feature_summary']); } } /************************************************************************ * */ function get_tripal_feature_admin_form_cleanup_set(&$form) { $form['cleanup'] = array( '#type' => 'fieldset', '#title' => t('Clean Up') ); $form['cleanup']['description'] = array( '#type' => 'item', '#value' => t("With Drupal and chado residing in different databases ". "it is possible that nodes in Drupal and features in Chado become ". "\"orphaned\". This can occur if a feature node in Drupal is ". "deleted but the corresponding chado feature is not and/or vice ". "versa. The Cleanup function will also remove nodes for features ". "that are not in the list of allowed feature types as specified ". "above. This is helpful when a feature type needs to be ". "removed but was previously present as Drupal nodes. ". "Click the button below to resolve these discrepancies."), '#weight' => 1, ); $form['cleanup']['button'] = array( '#type' => 'submit', '#value' => t('Clean up orphaned features'), '#weight' => 2, ); } /************************************************************************ * */ function get_tripal_feature_admin_form_reindex_set(&$form) { $form['reindex'] = array( '#type' => 'fieldset', '#title' => t('Reindex') ); $form['reindex']['description'] = array( '#type' => 'item', '#value' => t("Reindexing of nodes is important when content for nodes ". "is updated external to drupal, such as external uploads to chado. ". "Features need to be reindexed to ensure that updates to features ". "are searchable. Depending on the number of features this may take ". "quite a while. Click the button below to begin reindexing of ". "features."), '#weight' => 1, ); $form['reindex']['button'] = array( '#type' => 'submit', '#value' => t('Reindex all feature nodes'), '#weight' => 2, ); } /************************************************************************ * */ function get_tripal_feature_admin_form_taxonomy_set (&$form) { $form['taxonomy'] = array( '#type' => 'fieldset', '#title' => t('Set Taxonomy') ); $form['taxonomy']['description'] = array( '#type' => 'item', '#value' => t("Drupal allows for assignment of \"taxonomy\" or ". "catagorical terms to nodes. These terms allow for advanced ". "filtering during searching."), '#weight' => 1, ); $tax_options = array ( 'organism' => t('Organism name'), 'feature_type' => t('Feature Type (e.g. EST, mRNA, etc.)'), 'analysis' => t('Analysis Name'), 'library' => t('Library Name'), ); $form['taxonomy']['tax_classes'] = array ( '#title' => t('Available Taxonomic Classes'), '#type' => t('checkboxes'), '#description' => t("Please select the class of terms to assign to ". "chado features"), '#required' => FALSE, '#prefix' => '
'.t("Displays links to nodes created on this date").'
'; break; } return $output; } /************************************************************************ * Provide information to drupal about the node types that we're creating * in this module */ function tripal_feature_node_info() { $nodes = array(); $nodes['chado_feature'] = array( 'name' => t('Feature'), 'module' => 'chado_feature', 'description' => t('A feature from the chado database'), 'has_title' => FALSE, 'title_label' => t('Feature'), 'has_body' => FALSE, 'body_label' => t('Feature 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_feature_perm(){ return array( 'access chado_feature content', 'create chado_feature content', 'delete chado_feature content', 'edit chado_feature content', ); } /************************************************************************ * Set the permission types that the module uses. */ function chado_feature_access($op, $node, $account) { if ($op == 'create') { return user_access('create chado_feature content', $account); } if ($op == 'update') { if (user_access('edit chado_feature content', $account)) { return TRUE; } } if ($op == 'delete') { if (user_access('delete chado_feature content', $account)) { return TRUE; } } if ($op == 'view') { if (user_access('access chado_feature content', $account)) { return TRUE; } } return FALSE; } /************************************************************************ * 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_feature_menu() { $items = array(); // the administative settings menu $items['admin/tripal/tripal_feature'] = array( 'title' => 'Features', 'description' => 'Settings for Chado Features', 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_feature_admin'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM, ); $items['admin/settings/tripal/tripal_feature/load'] = array( 'title' => 'Bulk Load', 'description' => 'Upload Data into Chado & Drupal', 'page callback' => 'tripal_feature_bulkload', 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM, ); return $items; } /************************************************************************ * When a new chado_feature node is created we also need to add information * to our chado_feature table. This function is called on insert of a new node * of type 'chado_feature' and inserts the necessary information. */ function chado_feature_insert($node){ // remove spaces, newlines from residues $residues = preg_replace("/[\n\r\s]/","",$node->residues); // If this feature already exists then don't recreate it in chado // TODO: the unique index in chado for this also includes the type_id. If the site // ever needs to have the same feature name for different types then this will break. $feature_sql = "SELECT * FROM {Feature} WHERE uniquename = '%s' and organism_id = %d"; $previous_db = tripal_db_set_active('chado'); $feature = db_fetch_object(db_query($feature_sql,$node->title,$node->organism_id)); tripal_db_set_active($previous_db); // if the feature doesn't exist then let's create it in chado. if(!$feature){ $sql = "INSERT INTO {feature} (organism_id, name, uniquename, residues, seqlen,". " is_obsolete, type_id)". " VALUES(%d,'%s','%s','%s',%d, %s, ". " (SELECT cvterm_id ". " FROM {CVTerm} CVT ". " INNER JOIN CV ON CVT.cv_id = CV.cv_id ". " WHERE CV.name = 'sequence' and CVT.name = '%s'))"; $obsolete = 'FALSE'; if($node->is_obsolete){ $obsolete = 'TRUE'; } // use chado database $previous_db = tripal_db_set_active('chado'); db_query($sql,$node->organism_id,$node->title,$node->title, $residues,strlen($residues),$obsolete,$node->feature_type); // now that we've added the feature, get the feature id for this feature $feature = db_fetch_object(db_query($feature_sql,$node->title,$node->organism_id)); // now use drupal database tripal_db_set_active($previous_db); } // add the genbank accession and synonyms chado_feature_add_synonyms($node->synonyms,$feature->feature_id); // make sure the entry for this feature doesn't already exist in the chado_feature table // if it doesn't exist then we want to add it. $node_check_sql = "SELECT * FROM {chado_feature} ". "WHERE feature_id = '%s'"; $node_check = db_fetch_object(db_query($node_check_sql,$feature->feature_id)); if(!$node_check){ // next add the item to the drupal table $sql = "INSERT INTO {chado_feature} (nid, vid, feature_id, sync_date) ". "VALUES (%d, %d, %d, " . time() . ")"; db_query($sql,$node->nid,$node->vid,$feature->feature_id); } } /************************************************************************ */ function chado_feature_delete($node){ // get feature_id so we can remove it from chado database $sql_drupal = "SELECT feature_id ". "FROM {chado_feature} ". "WHERE nid = %d AND vid = %d"; $feature_id = db_result(db_query($sql_drupal, $node->nid, $node->vid)); // remove the drupal content $sql_del = "DELETE FROM {chado_feature} ". "WHERE nid = %d ". "AND vid = %d"; db_query($sql_del, $node->nid, $node->vid); $sql_del = "DELETE FROM {node} ". "WHERE nid = %d ". "AND vid = %d"; db_query($sql_del, $node->nid, $node->vid); $sql_del = "DELETE FROM {node_revisions} ". "WHERE nid = %d ". "AND vid = %d"; db_query($sql_del, $node->nid, $node->vid); // Remove data from feature tables of chado database. This will // cause a cascade delete and remove all data in referencing tables // for this feature $previous_db = tripal_db_set_active('chado'); db_query("DELETE FROM {feature} WHERE feature_id = %d", $feature_id); tripal_db_set_active($previous_db); drupal_set_message("The feature and all associated data were removed from ". "chado"); } /************************************************************************ */ function chado_feature_update($node){ if($node->revision){ // TODO -- decide what to do about revisions } else { // get the feature for this node: $sql = 'SELECT feature_id FROM {chado_feature} WHERE vid = %d'; $feature = db_fetch_object(db_query($sql, $node->vid)); // remove spaces, newlines from residues $residues = preg_replace("/[\n\r\s]/","",$node->residues); $sql = "UPDATE {feature} ". " SET residues = '%s', ". " name = '%s', ". " uniquename = '%s', ". " seqlen = %d, ". " organism_id = %d, ". " is_obsolete = %s, ". " type_id = (SELECT cvterm_id ". " FROM {CVTerm} CVT ". " INNER JOIN CV ON CVT.cv_id = CV.cv_id ". " WHERE CV.name = 'sequence' and CVT.name = '%s') ". "WHERE feature_id = %d "; $obsolete = 'FALSE'; if($node->is_obsolete){ $obsolete = 'TRUE'; } $previous_db = tripal_db_set_active('chado'); // use chado database db_query($sql,$residues,$node->title,$node->title, strlen($residues),$node->organism_id,$obsolete,$node->feature_type, $feature->feature_id); tripal_db_set_active($previous_db); // now use drupal database // add the genbank accession & synonyms // chado_feature_add_gbaccession($node->gbaccession,$feature->feature_id); chado_feature_add_synonyms($node->synonyms,$feature->feature_id); } } /************************************************************************ * */ function chado_feature_add_synonyms($synonyms,$feature_id){ // make sure we only have a single space between each synonym $synonyms = preg_replace("/[\s\n\r]+/"," ",$synonyms); // split the synonyms into an array based on a space as the delimieter $syn_array = array(); $syn_array = explode(" ",$synonyms); // use the chado database $previous_db = tripal_db_set_active('chado'); // remove any old synonyms $feature_syn_dsql = "DELETE FROM {feature_synonym} WHERE feature_id = %d"; if(!db_query($feature_syn_dsql,$feature_id)){ $error .= "Could not remove synonyms from feature. "; } // return if we don't have any synonmys to add if(!$synonyms){ tripal_db_set_active($previous_db); return; } // iterate through each synonym and add it to the database foreach($syn_array as $syn){ // skip this item if it's empty if(!$syn){ break; } // check to see if we have this accession number already in the database // if so then don't add it again. it messes up drupal if the insert fails. // It is possible for the accession number to be present and not the feature $synonym_sql = "SELECT synonym_id FROM {synonym} ". "WHERE name = '%s'"; $synonym = db_fetch_object(db_query($synonym_sql,$syn)); if(!$synonym){ $synonym_isql = "INSERT INTO {synonym} (name,synonym_sgml,type_id) ". "VALUES ('%s','%s', ". " (SELECT cvterm_id ". " FROM {CVTerm} CVT ". " INNER JOIN CV ON CVT.cv_id = CV.cv_id ". " WHERE CV.name = 'feature_property' and CVT.name = 'synonym'))"; if(!db_query($synonym_isql,$syn,$syn)){ $error .= "Could not add synonym. "; } // now get the synonym we just added $synonym_sql = "SELECT synonym_id FROM {synonym} ". "WHERE name = '%s'"; $synonym = db_fetch_object(db_query($synonym_sql,$syn)); } // now add in our new sysnonym $feature_syn_isql = "INSERT INTO {feature_synonym} (synonym_id,feature_id,pub_id) ". "VALUES (%d,%d,1)"; if(!db_query($feature_syn_isql,$synonym->synonym_id,$feature_id)){ $error .= "Could not add synonyms to feature. "; } } // return to the drupal database tripal_db_set_active($previous_db); return $error; } /************************************************************************ * */ function chado_feature_add_gbaccession($accession,$feature_id){ // use chado database $previous_db = tripal_db_set_active('chado'); // remove any old accession from genbank dbEST $fdbxref_dsql = "DELETE FROM {feature_dbxref} ". "WHERE feature_id = %d and dbxref_id IN ". " (SELECT DBX.dbxref_id FROM {dbxref} DBX ". " INNER JOIN DB ON DB.db_id = DBX.db_id ". " INNER JOIN feature_dbxref FDBX ON DBX.dbxref_id = FDBX.dbxref_id ". " WHERE DB.name = 'DB:Genbank' and FDBX.feature_id = %d)"; if(!db_query($fdbxref_dsql,$feature_id,$feature_id)){ $error .= "Could not remove accession from feature. "; } // if we don't have an accession number to add then just return if(!$accession){ tripal_db_set_active($previous_db); return; } // get the db_id $db_sql = "SELECT db_id FROM {DB} ". "WHERE name = 'DB:Genbank_est'"; $db = db_fetch_object(db_query($db_sql)); // check to see if we have this accession number already in the database // if so then don't add it again. it messes up drupal if the insert fails. // It is possible for the accession number to be present and not the feature $dbxref_sql = "SELECT dbxref_id FROM {dbxref} ". "WHERE db_id = %d and accession = '%s'"; $dbxref = db_fetch_object(db_query($dbxref_sql,$db->db_id,$accession)); if(!$dbxref){ // add the accession number $dbxref_isql = "INSERT INTO {dbxref} (db_id,accession) ". " VALUES (%d, '%s') "; if(!db_query($dbxref_isql,$db->db_id,$accession)){ $error .= 'Could not add accession as a database reference '; } // get the dbxref_id for the just added accession number $dbxref_sql = "SELECT dbxref_id FROM {dbxref} ". "WHERE db_id = %d and accession = '%s'"; $dbxref = db_fetch_object(db_query($dbxref_sql,$db->db_id,$accession)); } // associate the accession number with the feature $feature_dbxref_isql = "INSERT INTO {feature_dbxref} (feature_id,dbxref_id) ". " VALUES (%d, %d) "; if(!db_query($feature_dbxref_isql,$feature_id,$dbxref->dbxref_id)){ $error .= 'Could not add feature database reference. '; } tripal_db_set_active($previous_db); return $error; } /************************************************************************ * */ function chado_feature_form ($node,$param){ $type = node_get_types('type', $node); $form = array(); $feature = $node->feature; $synonyms = $node->synonyms; $analyses = $node->analyses; $references = $node->references; // We need to pass above variables for preview to show $form['feature'] = array( '#type' => 'value', '#value' => $feature ); // This field is read when previewing a node $form['synonyms'] = array( '#type' => 'value', '#value' => $synonyms ); // This field is read when previewing a node $form['analyses'] = array( '#type' => 'value', '#value' => $analyses ); // This field is read when previewing a node $form['references'] = array( '#type' => 'value', '#value' => $references ); // keep track of the feature id if we have one. If we do have one then // this would indicate an update as opposed to an insert. $form['feature_id'] = array( '#type' => 'value', '#value' => $feature->feature_id, ); $form['title']= array( '#type' => 'textfield', '#title' => t('Unique Feature Name'), '#required' => TRUE, '#default_value' => $feature->featurename, '#description' => t('Enter a unique name for this feature'), '#weight' => 1, '#maxlength' => 255 ); // get the list of supported feature types $ftypes = array(); $ftypes[''] = ''; $supported_ftypes = split("[ \n]",variable_get('chado_feature_types','EST contig')); foreach($supported_ftypes as $ftype){ $ftypes["$ftype"] = $ftype; } $form['feature_type'] = array ( '#title' => t('Feature Type'), '#type' => t('select'), '#description' => t("Choose the feature type."), '#required' => TRUE, '#default_value' => $feature->cvname, '#options' => $ftypes, '#weight' => 2 ); // get the list of organisms $sql = "SELECT * FROM {Organism} ORDER BY genus, species"; $previous_db = tripal_db_set_active('chado'); // use chado database $org_rset = db_query($sql); tripal_db_set_active($previous_db); // now use drupal database // $organisms = array(); $organisms[''] = ''; while($organism = db_fetch_object($org_rset)){ $organisms[$organism->organism_id] = "$organism->genus $organism->species ($organism->common_name)"; } $form['organism_id'] = array ( '#title' => t('Organism'), '#type' => t('select'), '#description' => t("Choose the organism with which this feature is associated "), '#required' => TRUE, '#default_value' => $feature->organism_id, '#options' => $organisms, '#weight' => 3, ); // Get synonyms if ($synonyms) { if (is_array($synonyms)) { foreach ($synonyms as $synonym){ $syn_text .= "$synonym->name\n"; } } else { $syn_text = $synonyms; } } $form['synonyms']= array( '#type' => 'textarea', '#title' => t('Synonyms'), '#required' => FALSE, '#default_value' => $syn_text, '#description' => t('Enter alternate names (synonmys) for this feature to help in searching and identification. You may enter as many alternate names as needed separated by spaces or on different lines.'), '#weight' => 5, ); $form['residues']= array( '#type' => 'textarea', '#title' => t('Residues'), '#required' => FALSE, '#default_value' => $feature->residues, '#description' => t('Enter the nucelotide sequences for this feature'), '#weight' => 6 ); $checked = ''; if($feature->is_obsolete == 't'){ $checked = '1'; } $form['is_obsolete']= array( '#type' => 'checkbox', '#title' => t('Is Obsolete'), '#required' => FALSE, '#default_value' => $checked, '#description' => t('Check this box if this sequence should be retired and no longer included in further analysis.'), '#weight' => 8 ); return $form; } /************************************************************************ * */ function chado_feature_validate($node){ $result = 0; // if this is an update, we want to make sure that a different feature for // the organism doesn't already have this uniquename. We don't want to give // two sequences the same uniquename if($node->feature_id){ $sql = "SELECT * FROM {Feature} WHERE uniquename = '%s' ". " AND organism_id = %d AND NOT feature_id = %d"; $previous_db = tripal_db_set_active('chado'); $result = db_fetch_object(db_query($sql, $node->title,$node->organism_id,$node->feature_id)); tripal_db_set_active($previous_db); if($result){ form_set_error('title',t("Feature update cannot proceed. The feature name '$node->title' is not unique for this organism. Please provide a unique name for this feature. ")); } } // if this is an insert then we just need to make sure this name doesn't // already exist for this organism if it does then we need to throw an error else { $sql = "SELECT * FROM {Feature} WHERE uniquename = '%s' AND organism_id = %d"; $previous_db = tripal_db_set_active('chado'); $result = db_fetch_object(db_query($sql, $node->title,$node->organism_id)); tripal_db_set_active($previous_db); if($result){ form_set_error('title',t("Feature insert cannot proceed. The feature name '$node->title' already exists for this organism. Please provide a unique name for this feature. ")); } } // we want to remove all characters except IUPAC nucleotide characters from the // the residues. however, residues are not required so if blank then we'll skip // this step if($node->residues){ $residues = preg_replace("/[^\w]/",'',$node->residues); if(!preg_match("/^[ACTGURYMKSWBDHVN]+$/i",$residues)){ form_set_error('residues',t("The residues in feature $node->title contains more than the nucleotide IUPAC characters. Only the following characters are allowed: A,C,T,G,U,R,Y,M,K,S,W,B,D,H,V,N: '" . $residues ."'")); } } // we don't allow a genbank accession number for a contig if($node->feature_type == 'contig' and $node->gbaccession){ form_set_error('gbaccession',t("Contigs cannot have a genbank accession number. Please change the feature type or remove the accession number")); } } /************************************************************************ * When a node is requested by the user this function is called to allow us * to add auxiliary data to the node object. */ function chado_feature_load($node){ // get the feature_id for this node: $sql = 'SELECT feature_id FROM {chado_feature} WHERE vid = %d'; $map = db_fetch_object(db_query($sql, $node->vid)); $previous_db = tripal_db_set_active('chado'); // use chado database // get information about this organism and add it to the items in this node $sql = "SELECT F.feature_id, F.name as featurename, F.uniquename, ". "F.residues, F.seqlen, O.genus, O.species, O.common_name, ". " CVT.name as cvname, O.organism_id, F.type_id, F.is_obsolete ". "FROM {Feature} F ". " INNER JOIN Organism O ON F.organism_id = O.organism_id ". " INNER JOIN CVterm CVT ON F.type_id = CVT.cvterm_id ". "WHERE F.feature_id = %d"; $feature = db_fetch_object(db_query($sql,$map->feature_id)); $additions->feature = $feature; $additions->seqlen = $feature->seqlen; // get the feature synonyms $sql = "SELECT S.name ". "FROM {Feature_Synonym} FS ". " INNER JOIN Synonym S ". " ON FS.synonym_id = S.Synonym_id ". "WHERE FS.feature_id = %d"; $results = db_query($sql,$map->feature_id); $synonyms = array(); $i=0; while($synonym = db_fetch_object($results)){ $synonyms[$i++] = $synonym; } $additions->synonyms = $synonyms; // get feature references in external databases $sql = "SELECT F.uniquename,F.Feature_id,DBX.accession,DB.description as dbdesc, ". " DB.db_id, DB.name as db_name, DB.urlprefix ". "FROM {Feature} F ". " INNER JOIN Feature_dbxref FDBX on F.feature_id = FDBX.feature_id ". " INNER JOIN Dbxref DBX on DBX.dbxref_id = FDBX.dbxref_id ". " INNER JOIN DB on DB.db_id = DBX.db_id ". "WHERE F.feature_id = %d"; $results = db_query($sql,$map->feature_id); $references = array(); $i=0; while($accession = db_fetch_object($results)){ $references[$i++] = $accession; // we want to specifically pull out the genbank id if(preg_match("/Genbank_est/",$accession->db_name)){ $additions->gbaccession = $accession; } } $additions->references = $references; tripal_db_set_active($previous_db); // now use drupal database // get organism node nid $sql = "SELECT nid FROM {chado_organism} WHERE organism_id = %d"; $org_nid = db_result(db_query($sql, $additions->feature->organism_id)); $additions->org_nid = $org_nid; return $additions; } /************************************************************************ * This function customizes the view of the chado_feature node. It allows * us to generate the markup. */ function chado_feature_view ($node, $teaser = FALSE, $page = FALSE) { if (!$teaser) { // use drupal's default node view: $node = node_prepare($node, $teaser); // if we're building the node for searching then // we want to handle this within the module and // not allow theme customization. We don't want to // index all items (such as DNA sequence). if($node->build_mode == NODE_BUILD_SEARCH_INDEX){ $node->content['index_version'] = array( '#value' => theme('tripal_feature_search_index',$node), '#weight' => 1, ); } else if($node->build_mode == NODE_BUILD_SEARCH_RESULT){ $node->content['index_version'] = array( '#value' => theme('tripal_feature_search_results',$node), '#weight' => 1, ); } else { // do nothing here, let the theme derived template handle display } } return $node; } /******************************************************************************* * Display feature information for associated organisms. This function also * provides contents for indexing */ function tripal_feature_nodeapi(&$node, $op, $teaser, $page) { switch ($op) { // Note that this function only adds feature view to an organism node. // The view of a feature node is controled by the theme *.tpl file case 'view': // Set the node types for showing feature information $types_to_show = array('chado_organism', 'chado_library'); // Abort if this node is not one of the types we should show. if (!in_array($node->type, $types_to_show, TRUE)) { break; } // Add feature to the content item if it's not a teaser if (!$teaser) { // Show feature browser $node->content['tripal_feature_browser'] = array( '#value' => theme('tripal_feature_browser', $node), '#weight' => 5 ); $node->content['tripal_feature_org_counts'] = array( '#value' => theme('tripal_feature_counts', $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_feature_theme () { return array( 'tripal_feature_search_index' => array ( 'arguments' => array('node'), ), 'tripal_feature_search_results' => array ( 'arguments' => array('node'), ), 'tripal_feature_browser' => array ( 'arguments' => array('node'), ), 'tripal_feature_counts' => array ( 'arguments' => array('node'), ) ); } /******************************************************************************* * create a list of features for the organism and pie chart */ function theme_tripal_feature_counts($node){ // don't show the summary if the settings in the admin page is turned off $show_browser = variable_get('tripal_feature_summary_setting',array('show_feature_summary')); if(strcmp($show_browser[0],'show_feature_summary')!=0){ return; } // get the feature counts. This is dependent on a materialized view // installed with the organism module $content = ''; if ($node->organism_id && $node->type == 'chado_organism') { $sql = "SELECT * FROM {organism_feature_count} ". "WHERE organism_id = %d AND NOT feature_type = 'EST_match' ". "ORDER BY num_features desc"; $features = array(); $previous_db = tripal_db_set_active('chado'); // use chado database $results = db_query($sql,$node->organism_id); tripal_db_set_active($previous_db); // now use drupal database $feature = db_fetch_object($results); // retrieve the first result if ($feature) { $content .= "