t('GBrowse Management'), 'description' => ('GBrowse management allows a user to create a database, register a GBrowse instance and to load/delete feature libraries'), 'page callback' => 'tripal_gbrowse_administration_description_page', 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/configuration'] = array( 'title' => t('Configuration'), 'description' => t('Configuration for this module'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_administration_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/register_gbrowse'] = array( 'title' => t('Register GBrowse Instance'), 'description' => t('Interface to enter gbrowse details and save to the database'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_register_gbrowse_form'), 'access arguments' => array('administer site configuration'), 'weight' => 20, 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/unregister_gbrowse']=array( 'title' => t('Un-Register GBrowse Instance'), 'description' => t('Interface to remove gbrowse details from the database'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_unregister_gbrowse_instances_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/load_library_features'] = array( 'title' => t('Load Library Features'), 'description' => t('Load features associated with a specified library into a GBrowse instance.'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_load_library_features_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/load_analysis_features'] = array( 'title' => t('Load Analysis Features'), 'description' => t('Load features associated with a specified analyses into a GBrowse instance.'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_load_analyses_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/delete_library_features']=array( 'title' => t('Delete Library Features'), 'description' => t('Interface to delete features of a given library from a GBrowse Instance'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_delete_library_features_from_gbrowse_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/delete_analysis_features']=array( 'title' => t('Delete Analysis Features'), 'description' => t('Interface to delete features of a given analysis from a GBrowse Instance'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_delete_analysis_features_from_gbrowse_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/add_tracks']=array( 'title' => t('Add Tracks'), 'description' => t('Interface for Adding tracks to a GBrowse Instance'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_add_tracks_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items['admin/tripal/tripal_gbrowse/delete_tracks']=array( 'title' => t('Delete Tracks'), 'description' => t('Interface for Deleting tracks from a GBrowse Instance'), 'page callback' => 'drupal_get_form', 'page arguments' => array('tripal_gbrowse_delete_tracks_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); return $items; } /** * Implements hook_theme(): Register themeing functions for this module * * Contains the seperate tripal_gbrowse_X.tpl.php files, so as they can be included in the * theme for the designed module * * @return * An array of themeing functions to register * */ function tripal_gbrowse_theme() { return array( // Block Templates------------------------------ 'tripal_gbrowse_database_details' => array ( 'arguments' => array('node'=> null), 'template' => 'tripal_gbrowse_database_details', ), 'tripal_gbrowse_details' => array ( 'arguments' => array('node'=> null), 'template' => 'tripal_gbrowse_details', ), 'tripal_gbrowse_gbrowse_instance' => array ( 'arguments' => array('node'=> null), 'template' => 'tripal_gbrowse_gbrowse_instance', ), 'tripal_gbrowse_teaser' => array ( 'arguments' => array('node'=> null), 'template' => 'tripal_gbrowse_teaser', ), 'tripal_gbrowse_loaded_sources' => array ( 'arguments' => array('node'=> null), 'template' => 'tripal_gbrowse_loaded_sources', ), ); } /** * Purpose: Implement Blocks relating to Tripal GBrowse content * * @param $op * What kind of information to retrieve about the block or blocks. * Possible values include list, configure, save, view. * @param $delta * Which block to return (not applicable if $op is 'list'). * @param $edit * If $op is 'save', the submitted form data from the configuration form. * * @return * One of the following depending on $op: An array of block descriptions (list), the configuration * form (configure), nothing (save), an array defining subject and content for the block indexed * by $delta (view) * */ function tripal_gbrowse_block ($op = 'list', $delta = 0, $edit=array()) { switch($op) { case 'list': $blocks['database_details']['info'] = t('Tripal GBrowse Database Details'); $blocks['database_details']['cache'] = BLOCK_NO_CACHE; $blocks['details']['info'] = t('Tripal GBrowse Details'); $blocks['details']['cache'] = BLOCK_NO_CACHE; $blocks['gbrowse_instance']['info'] = t('Tripal GBrowse Instance'); $blocks['gbrowse_instance']['cache'] = BLOCK_NO_CACHE; $blocks['teaser']['info'] = t('Tripal GBrowse Teaser'); $blocks['teaser']['cache'] = BLOCK_NO_CACHE; $blocks['teaser']['info'] = t('Tripal GBrowse Sources'); $blocks['teaser']['cache'] = BLOCK_NO_CACHE; return $blocks; case 'view': if(user_access('access tripal_gbrowse content') and arg(0) == 'node' and is_numeric(arg(1))) { $nid = arg(1); $node = node_load($nid); $block = array(); switch($delta){ case 'database_details': $block['subject'] = t('Tripal GBrowse Database Details'); $block['content'] = theme('tripal_gbrowse_database_details',$node); break; case 'details': $block['subject'] = t('Tripal GBrowse Details'); $block['content'] = theme('tripal_gbrowse_details',$node); break; case 'gbrowse_instance': $block['subject'] = t('Tripal GBrowse Instance'); $block['content'] = theme('tripal_gbrowse_gbrowse_instance',$node); break; case 'teaser': $block['subject'] = t('Tripal GBrowse Teaser'); $block['content'] = theme('tripal_gbrowse_teaser',$node); break; case 'teaser': $block['subject'] = t('Tripal GBrowse Sources'); $block['content'] = theme('tripal_gbrowse_loaded_sources',$node); break; } return $block; } } } /** * Implements hook_views_api() * Purpose: Essentially this hook tells drupal that there is views support * for this module which then includes tripal_db.views.inc where all the * views integration code is */ function tripal_gbrowse_views_api() { return array( 'api' => 2.0, ); } /** * This section uses HTML to output the descriptions of the module, through the Tripal Management * Administation window.Any installation instructions are given as well as included features * as well as a overview of the purpose Module. * * @return * Returns '$text'The HTML description of the Module, its instructions, features, and any other * important aspects. This is returned when the Administration page is selected. */ function tripal_gbrowse_administration_description_page() { $text = ' '; $text .= '
This module provides an interface to register already existing GBrowse instances with Drupal/Tripal and/or create new ' .'GBrowse Instances. Furthermore, it allows basic management of these GBrowse instances including un-registering and/or ' .'deleting and loading of features in Tripal/Chado into a MySQL GBrowse instance. As such, it provides interoperability ' .'and syncronization between a Tripal/Chado installation and GBrowse
'; $text .= ''. t('Module created by:Chad Krilow (e-mail:cnk046@mail.usask.ca)') .'
'; break; } } /** * Implements hook_perm() * * This function sets the permission for the user to access the information in the database. * This includes creating, inserting, deleting and updating of information in the database * */ function tripal_gbrowse_perm(){ return array('create tripal_gbrowse', 'edit own tripal_gbrowse', 'access database-related details' ,'access tripal_gbrowse content'); } /** * Implements tripal_gbrowse_access() * * This function sets the access permission for operations on the database. * * * @parm $op * The operation that is to be performed * * @parm $node * The specific node that is to have the operation performed * * @parm $account * The account of the user that is performing the operations * * @return * True if a operation was performed * */ function tripal_gbrowse_access($op, $node, $account) { if($op == 'create') { // Only users with permission to do so may create this node type. if(!user_access('create tripal_gbrowse', $account)){ return FALSE; } } // Users who create a node may edit or delete it later, assuming they have the // necessary permissions. if($op == 'update' || $op == 'delete') { if(!user_access('edit own tripal_gbrowse',$account)){ return FALSE; } if(user_access('edit own tripal_gbrowse',$account) && $account->uid != $node->uid){ return FALSE; } } return NULL; } /** * Implementation of tripal_gbrowse_insert() * * This function inserts user entered information pertaining to the GBrowse instance into the * 'tripal_gbrowse_instances' talble of the database, requiring that a 'Check Box' has been selected. * * @parm $node * Then node which contains the information stored within the node-ID * * * */ function tripal_gbrowse_insert($node) { $values = array( 'database_name'=> $node->database_name, 'database_user'=> $node->database_user, 'user_password'=> $node->user_password, 'gbrowse_name'=> $node->title, 'gbrowse_link'=> $node->gbrowse_link, 'config_file'=> $node->config_file, 'library_id'=>$node->library_id, 'nid'=>$node->nid, 'vid'=>$node->vid, ); //used to write to a database table described by Drupal Schema (not workable for chado) drupal_write_record('tripal_gbrowse_instances', $values); if($node->check_box==1){ tripal_gbrowse_create_gbrowse_instance($values); }else{ drupal_set_message("Create instance check box not selected, unable initialize instance"); } } /** * Implementation of tripal_gbrowse_delete(). * * This function takes a node and if the variable 'tripal_gbrowse_delete_all' has been defined, * the GBrowse instance pertaining to the node passed into the function is deleted. Following, * given the node-ID, the instance will be deleted from the 'tripal_gbrowse_instances' table. * * * @parm $node * Then node which contains the information stored within the node-ID * */ function tripal_gbrowse_delete($node){ if(variable_get('tripal_gbrowse_delete_all', '')){ tripal_gbrowse_delete_gbrowse_instance($node->gbrowse); } //deleteing in drupal chado_gbrowse table db_query('DELETE FROM {tripal_gbrowse_instances} WHERE nid = %d', $node->nid); } /* * * Implements hook_update * * The purpose of the function is to allow the module to take action when an edited node is being * updated in the database. It also updates any name changes to the configuration file that was * created upon registering a GBrowse instance. This is done by moving the contents of the original * configuration file to the newly named file.As well, the database will be changed, if the name * is altered by a registered user.If this is the case, the function 'tripal_gbrowse_database_modification' * is called and the node and the old database infromation is passed, so as it may be altered and updated * accordingley. * * @param $node * The node being updated * */ function tripal_gbrowse_update($node){ //select from table before doing this, cause i wont be able to see the old details afterwards $old_data = db_fetch_object( db_query('SELECT database_name,config_file FROM {tripal_gbrowse_instances} WHERE nid=%d AND vid=%d', $node->nid, $node->vid)); $old_config_file=$old_data->config_file; $old_database_name=$old_data->database_name; $match= array( 'nid', 'vid', ); $values = array( 'database_name' => $node->database_name, 'database_user' => $node->database_user, 'user_password' => $node->user_password, 'gbrowse_name' => $node->gbrowse_name, 'gbrowse_link' => $node->gbrowse_link, 'config_file' => $node->config_file, 'library_id'=>$node->library_id, 'nid' => $node->nid, 'vid' => $node->vid, ); //Pulling out the configuration file $config_file = $node->config_file; if(strcmp($old_config_file, $config_file)!=0){ //Removing configuration file from the directory $command = "mv " .$old_config_file ." ".$config_file; exec($command); } if($old_database_name != $node->database_name){ tripal_gbrowse_database_modification($node,$old_database_name); } drupal_write_record('tripal_gbrowse_instances', $values, $match); } /** * Implementation of tripal_gbrowse_load(). * * * @param $node * The node that is to be accessed from the database * * @return $node * The node with the information to be loaded into the database * */ function tripal_gbrowse_load($node) { $result = db_fetch_object(db_query('SELECT gbrowse_id,database_name,database_user,user_password, gbrowse_name,gbrowse_link,config_file FROM {tripal_gbrowse_instances} WHERE nid=%d AND vid=%d',$node->nid, $node->vid)); $node->gbrowse = $result; return $node; } //----------------------------------------------------------------------------- // SECTION: Configuration form //----------------------------------------------------------------------------- /** * Implemets hook_menu(): Adds menu items for the tripal_gbrowse module * * This form creates a specific Configuration File directory and sets a specific * GBrowse web address for later access * * @return * An array of menu items '$form' */ function tripal_gbrowse_administration_form () { //Creating Fieldset for multiple fields in form $form['configuration_features'] = array( '#type' => 'fieldset', '#title' => t('Module Configuration Fields'), ); //Configuration File Directory $form['configuration_features']['configuration_file'] = array( '#type' => 'textfield', '#title' => t('Set Default Configuration File Directory'), '#size' => 30, '#maxlength' => 64, '#description' => t('Specific Configuration File Directory'), '#default_value' => variable_get('tripal_gbrowse_configuration_file_path', ''), ); //GBrowse Web Address $form['configuration_features']['gbrowse_address'] = array( '#type' => 'textfield', '#title' => t('Set Default GBrowse Web Address'), '#size' => 30, '#maxlength' => 64, '#description' => t('Desired GBrowse web address'), '#default_value' => variable_get('tripal_gbrowse_gbrowse_address_stub', ''), ); //A box if checked creates GBrowse Instances(.conf file and database) $form['configuration_features']['delete_check_box'] = array( '#type' => 'checkbox', '#title' => t('Delete Instance'), '#description' => t('Delete GBrowse Configuration file and Database '), '#default_value'=>variable_get('tripal_gbrowse_delete_all', ''), ); $form['configuration_features']['submit'] = array( '#type' => 'submit', '#weight' => 10, '#value' => t('Submit') ); return $form; } /** * Validate User-submitted data for Register GBrowse Instances Form * * This function validates the user input for each form element in the Register GBrowse * instances form that is a text field. Validations checked include: * -parse_url-checks that the url can be parsed * * @param $form * The form that the user submitted and whose input is being validated * @param $form_state * An array containing the state of the form being validated including user-input */ function tripal_gbrowse_administration_form_validate ($form, $form_state) { if ( !valid_url($form_state['values']['gbrowse_address'])) { form_set_error('gbrowse_address', 'Invalid URL'); } } /** * * Configuration-Form * * @param $form * -The submitted form containing the user entered infromation * @param $form_state * -Is the state of the form: i.e what button was pressed, what infromation was entered,etc. * The key is the 'values' */ function tripal_gbrowse_administration_form_submit ($form, $form_state) { if(!preg_match('/\/$/', $form_state['values']['configuration_file'])) { $form_state['values']['configuration_file'] = $form_state['values']['configuration_file'] . "/"; } variable_set('tripal_gbrowse_configuration_file_path',$form_state['values']['configuration_file'] ); drupal_set_message('Configuration File Path set to: '.variable_get('tripal_gbrowse_configuration_file_path', '')); variable_set('tripal_gbrowse_gbrowse_address_stub',$form_state['values']['gbrowse_address'] ); drupal_set_message('GBrowse Default Address set to: '.variable_get('tripal_gbrowse_gbrowse_address_stub', '')); if($form_state['values']['delete_check_box']==1){ variable_set('tripal_gbrowse_delete_all',$form_state['values']['delete_check_box'] ); drupal_set_message('Selected GBrowse instance will be deleted: '.variable_get('tripal_gbrowse_delete_all', 'NOT SET')); } } //----------------------------------------------------------------------------- // SECTION: Register-GBrowse-Instance //----------------------------------------------------------------------------- /** * * Register & Create GBrowse instance ( called by the node form ) * * This form submit takes it's fields from the form for registering a GBrowse instance. The 'sed'command * is used to select certain lines of a template 'conf' file and replaces them with the user specified GBrowse instance * and data base name. It then removes the temporary file that was created. This function utilizes the MySQL database * and uses the commands for MySQL to create a database for the registered GBrowse instance, appropriate warnings * are issued if there are problems connecting/registering/accessing the database. * * @param $form * -The submitted form containing the user entered infromation * * @param $form_state * This is the state of the form: i.e what button was pressed.The key is * the name of the fields in database * */ function tripal_gbrowse_create_gbrowse_instance($values) { global $user; //make current user details available so access of user id is available //checking for existance of configuration file, if allready created a warning is issued if ( file_exists($values['config_file']) ){ drupal_set_message('Configuration File Already Exists', 'warning'); }else{ $config_path = variable_get('tripal_gbrowse_configuration_file_path', ''); if(empty($config_path)){ drupal_set_message( "Invalid or Non-Existent Configuration Path (Check Configuration Menu Defaults)", 'error'); } $temp_file = '/tmp/temporary_gbrowse_'.time().'.conf'; // Using 'sed' to select the second line of the template.config substitute <#gbrowse_name> //for .$values['gbrowse_name'] $command = "sed '2 s/<#gbrowse_name#>/".$values['gbrowse_name']."/' ".$config_path."template.conf > ".$temp_file; exec($command); // Using 'sed' to select the fifth line of the template.config substitute <#database_name> //for .$values['database_name'] $command = "sed '5 s/<#database_name#>/".$values['database_name']."/' ".$temp_file." > ".$values['config_file']; exec($command); // Check configuration file is there if (file_exists($values['config_file'])) { drupal_set_message('Configuration File created successfully'); } else { drupal_set_message('Unable to create configuration file','error'); } //To create a database use the mysql_query() function to execute an SQL query $link = mysql_connect('localhost', $values['database_user'],$values['user_password']); if (!$link) { drupal_set_message('Could not connect: ' . mysql_error()); return false; } $sql = 'CREATE DATABASE ' . $values['database_name']; if (mysql_query($sql, $link)) { drupal_set_message( "Database created successfully\n"); } else { drupal_set_message( 'Error creating database: ' . mysql_error() . "\n"); return false; } mysql_query( "GRANT SELECT ON " .$values['database_name'].".* TO 'www-data'@'localhost'",$link); mysql_close($link); $job_args=array($values['database_name'],$values['database_user'],$values['user_password'],$values['library_id'],TRUE); //registering a job with the tripal system, this job calls the function when executed $job_id = tripal_add_job('Loading Features Into GBrowse', 'tripal_gbrowse','tripal_gbrowse_load_library_features_into_gbrowse', $job_args, $user->uid); drupal_set_message(' The Backbone needs to be loaded into GBrowse (done by executing Tripal Jobs Loading script), Before loaded libraries or GBrowse Instance will be displayed. '); } } //----------------------------------------------------------------------------- // SECTION: Un-Register Existing GBrowse Instances //----------------------------------------------------------------------------- /** * Un-Register GBrowse Instance Form Submit * * This is the Form-Submit section of the Un-Register GBrowse instance function. Depending on * which instance was selected, it will be removed from the database. A check box is provided * which, if checked is true, will delete all data/files that was associated with the selected * GBrowse instance.SQL commands are used in order to remove the selected instances from the * SQL database. * * @param $form * the submitted form containing the user entered infromation * @param $form_state * The state of the form: i.e if check-box was checked and what gbrowse_instance was selected to be deleted * The key is the 'values' * * @return * true or false, depending wheater the check box had been selected, if true, the * selected GBrowse instance will be deleted */ function tripal_gbrowse_delete_gbrowse_instance($gbrowse) { // Retrieve current gbrowse instance details $gbrowse_instance = db_fetch_object( db_query('SELECT * FROM {tripal_gbrowse_instances} WHERE gbrowse_id=%d', $gbrowse->gbrowse_id ) ); //Pulling out the configuration file $config_file = $gbrowse->config_file; //Removing configuration file from the directory $command = "rm ".$config_file; exec($command); if (file_exists($config_file)) { drupal_set_message('Configuration File ('.$config_file.') not removed!', 'error'); } else { drupal_set_message('Configuration File removed successfully'); } $user_name = $gbrowse->database_user; $user_password = $gbrowse->user_password; $link = mysql_connect('localhost', $user_name,$user_password); if (!$link) { drupal_set_message('Could not connect: ' . mysql_error(), 'error'); return false; } $sql = 'DROP DATABASE ' . $gbrowse->database_name; if(mysql_query($sql, $link)){ drupal_set_message( "Database removed successfully\n"); }else{ drupal_set_message( 'Error removing database: ' . mysql_error(), 'error'); return false; } mysql_close($link); } //----------------------------------------------------------------------------- // SECTION: Load Library features into GBrowse Form & Form Submit //----------------------------------------------------------------------------- /** * Implements hook_form * * This function creates a form for the database name, user name for database operation and a * password for access.The module uses these features to access information regarding the user's * operations and needs. * * @return * An array describing the form to be rendered */ function tripal_gbrowse_load_library_features_form() { $new_array=array(); $result = tripal_core_chado_select ( 'library', array('library_id','name'), array() ); foreach ($result as $value) { $new_array[$value->library_id]=$value->name; //options for the select list } //Creating Fieldset for multiple fields in form $form['load_features'] = array( '#type' => 'fieldset' ); //Library ID $form['load_features']['library_id'] = array( '#type' => 'select', '#title' => t('Libraries'), '#options' => $new_array, '#description' => t('Library of Genetic Sequences.'), ); //Sending query to the database $resource = db_query('SELECT * FROM {tripal_gbrowse_instances}'); $items = array(); while($record = db_fetch_object($resource)){ $items[$record->gbrowse_id]= $record->gbrowse_name; } //GBrowse Instances $form['load_features']['gbrowse_id'] = array( '#type' => 'select', '#title' => t('GBrowse Instances'), '#options' => $items, '#description' => t('Selected GBrowse Instances to be Loaded.'), ); //A checkbox to update features for the gbrowse $form['load_features']['check_box'] = array( '#type' => 'checkbox', '#title' => t('Update Features'), '#description' => t('Existing Same Name Features Updated Accordingly.'), ); $form['load_features']['submit'] = array( '#type' => 'submit', '#weight' => 10, '#value' => t('Submit Job') ); return $form; } /** * Load-Features-Form * * @param $form * -The submitted form containing the user entered infromation * @param $form_state * -Is the state of the form: i.e what button was pressed, what infromation was entered,etc. * The key is the 'values' */ function tripal_gbrowse_load_library_features_form_submit($form,$form_state) { global $user; //needed to make the current users details available so access of user id is available $record = db_fetch_object(db_query('SELECT * FROM {tripal_gbrowse_instances} WHERE gbrowse_id=%d', $form_state['values']['gbrowse_id'])); $name = $record->database_name; $user_name = $record->database_user; $password= $record->user_password; $job_args = array($name,$user_name,$password,$form_state['values']['library_id'], FALSE); //Checking state of check box, if checked delete features from GBrowse if($form_state['values']['check_box']==1){ //registering a delete job with the tripal system, this job calls the function when executed $job_id = tripal_add_job('Deleting Features From GBrowse', 'tripal_gbrowse', 'tripal_gbrowse_delete_library_features_from_gbrowse', $job_args, $user->uid); } //registering a job with the tripal system, this job calls the function when executed $job_id = tripal_add_job('Loading Features Into GBrowse', 'tripal_gbrowse', 'tripal_gbrowse_load_library_features_into_gbrowse', $job_args, $user->uid); } //----------------------------------------------------------------------------- // SECTION:Load Library Features into GBrowse //----------------------------------------------------------------------------- /** * Load Library features into database * * This loading function firstly creates a output GFF3 format file for verification purposes. Then, a 'Chado' table * is selected,depending which table the user is interested in, from this table specific infromation * is taken out and placed in the GFF3 file.The Featurelocation(fmin) & featurelocation (fmax) are used * to set the featureloc.feature_id = feature.feature_id, the fmin = start & fmax = end of the desired gene. * The testing if the phase is empty is done, if so a '.' is inserted into $phase variable. If the parent * feature is indicated in feature location for the child feature will be set.The Attributes section * sets the, ID, Name, Alias, Dbrexf to variables to be put into a CONF file.The strand is either a * positive, negative, or zero value and is represented by +/./- accordingley. * * @param $name * name of GBrowse database * * @param $user_name * GBrowse MySQL user name * * @param $password * user password for GBrowse * * @param $library_id * GBrowse MySQL user name * * @param $clear_database * Used to clear the database of its backbone structure */ function tripal_gbrowse_load_library_features_into_gbrowse($database_name, $user_name, $password, $library_id,$clear_database){ //A test file created to verify output $myFile = "/tmp/temporaryGBrowse_".time().".gff3"; //Test opening the file, will print warning if file is not able to be opened $fh = fopen($myFile, 'w') or die("WARNING: Can not open file"); print "Creating GFF3 file of features for library...\n"; if (!preg_match('/^\d+$/', $library_id)) { print "ERROR: Invalid Library ID supplied (Library ID = ".$library_id.")\n"; return false; } // Selecting all features $values = array('library_id' => $library_id); $prime_result = tripal_core_chado_select ( 'library_feature', array('feature_id'), $values ); // Select Table:library; column:uniquename $result = tripal_core_chado_select ( 'library', array('uniquename'), $values ); $source = $result[0]->uniquename ; // Check source: ERROR //For each feature, type id form feature table, specific record the feature id containing $feature_id foreach ($prime_result as $value) { $feature_id = $value->feature_id; if (!preg_match('/^\d+$/', $feature_id)) { print "ERROR: Invalid feature ID (".$feature_id.") associated with Library (Library ID = ".$library_id.")\n"; } $result = tripal_core_chado_select('feature', array('type_id'), array('feature_id'=>$feature_id)); $type_id = $result[0]->type_id; if (empty($type_id)) { print "ERROR: No Type associated with Feature (Feature ID = ".$feature_id.")\n"; } //Taking the cvterm name from the cvterm table given the type-id($type_id) $result = tripal_core_chado_select('cvterm', array('name'), array('cvterm_id'=>$type_id)); //The extracted cvterm name $type = $result[0]->name; if (empty($type)) { print "ERROR: Type associated with Feature (".$type_id.") doesn't exist in cvterm table (Feature ID = ".$feature_id.")\n"; } //Featureloc.fmin & featureloc.fmax ( where featureloc.feature_id = feature.feature_id ) //fmin = start & fmax = end $result = tripal_core_chado_select('featureloc', array('fmin','fmax', 'strand', 'phase', 'srcfeature_id'), array('feature_id'=>$feature_id)); $start = $result[0]->fmin; if (!preg_match('/^\d+$/', $start)) { print "ERROR: Invalid Start (".$start.") of Feature (Feature ID= ".$feature_id.")\n"; } $end = $result[0]->fmax; if (!preg_match('/^\d+$/', $end)) { print "ERROR: Invalid End (".$end.") of Feature (Feature ID= ".$feature_id.")\n"; } $score = '.'; //Converting from +1/0/-1 to +/./- as there are only three possible values if ($result[0]->strand < 0) { $strand= '-'; } elseif ($result[0]->strand == 0) { $strand = '.'; } elseif($result[0]->strand > 0) { $strand = '+'; } else{ $strand = '.'; } //Testing if phase is empty, if so a '.' is inserted into $phase variable $phase = $result[0]->phase; if(empty($phase)){ $phase = '.'; } //This is the parent feature as indicated in feature location for the child feature and //the current line described the child feature $srcfeature_id = $result[0]->srcfeature_id; if (empty($srcfeature_id)) { print "ERROR: No Parent associated with Feature Location (Feature ID = ".$feature_id.")\n"; } $result = tripal_core_chado_select('feature', array('name'), array('feature_id'=>$srcfeature_id)); $seqid = $result[0]->name; if (empty($seqid)) { print "ERROR: Parent (Parent Feature ID = ".$seqid.") associated with Feature doesn't exist in feature table (Feature ID =".$feature_id."\n"; } //Attributes section, ID, Name, Alias, Dbrexf $result = tripal_core_chado_select('feature', array('uniquename', 'name'), array('feature_id'=>$feature_id)); $id = $result[0]->uniquename; if (empty($id)) { print "ERROR: Missing Unique Name for Feature (Feature ID = ".$feature_id.")\n"; } $name = $result[0]->name; if (empty($name)) { print "WARNING: Missing Name for Feature (Feature ID = ".$feature_id.")\n"; } //Synonym $result = tripal_core_chado_select('feature_synonym', array('synonym_id'), array('feature_id'=>$feature_id)); $synonyms = array(); foreach ($result as $obj){ $synonym_id = $obj->synonym_id; $sub_result = tripal_core_chado_select('synonym', array('name'), array('synonym_id'=>$synonym_id)); // check that $sub_result[0]->name isn't empty if (empty($sub_result[0]->name)) { print "ERROR: Synonym (".$synonym_id.") associated with feature not found in synonym table (Feature ID = ".$feature_id.")\n"; } else { $synonyms[] = $sub_result[0]->name; } } // Additional Dbxref's $result = tripal_core_chado_select('feature_dbxref', array('dbxref_id'), array('feature_id'=>$feature_id)); $dbxref = array(); foreach ($result as $obj){ $dbxref_id = $obj->dbxref_id; if (!empty($dbxref_id)) { $sub1_result = tripal_core_chado_select('dbxref', array('db_id', 'accession'), array('dbxref_id'=>$dbxref_id)); $dbxref_accession = $sub1_result[0]->accession; $db_id = $sub1_result[0]->db_id; if (!empty($db_id)) { $sub_sub_result =tripal_core_chado_select('db', array('name'), array('db_id'=>$db_id)); $db_name = $sub_sub_result[0]->name; if (empty($db_name)) { print "ERROR: Database (".$db_id.") associated with database reference not in db table (Database Reference ID = ".$dbxref_id.")\n"; } elseif (empty($dbxref_accession)) { print "WARNING: Missing Accession for Database Reference (Database Reference ID = ".$dbxref_id.")\n"; } else { $dbxref[] = $db_name . ':' . $dbxref_accession; } } } } //Main Dbxref $result = tripal_core_chado_select('feature', array('dbxref_id'), array('feature_id'=>$feature_id)); $dbxref_id = $result[0]->dbxref_id; if (empty($dbxref_id)) { print "WARNING: No Database Reference associated directly with Feature (Feature ID = ".$feature_id.")\n"; } $result = tripal_core_chado_select('dbxref', array('accession','db_id'), array('dbxref_id'=>$dbxref_id)); $dbxref_accession = $result[0]->accession; //checking $dbrexf_accession for emptyness if(!empty($dbxref_accession)){ $db_id = $result[0]->db_id; $sub_sub_result =tripal_core_chado_select('db', array('name'), array('db_id'=>$db_id)); $db_name = $sub_sub_result[0]->name; $dbxref[] = $db_name . ':' . $dbxref_accession; } else { print "WARNING: Missing Accession for Database Reference (Database Reference ID = ".$dbxref_id.")\n"; } //attributes array is assigned given elements based on previous initializations $attributes = array(); $attributes[] = 'ID='.$id; if (!empty($name)) { $attributes[] = 'Name='.$name; } if (!empty($synonyms)) { $attributes[] = 'Alias='.implode(',',$synonyms); } if (!empty($dbxref)) { $attributes[] = 'Dbxref=' .implode(',', $dbxref); } //write to string for printing $stringData = implode("\t", array($seqid,$source,$type,$start,$end,$score,$strand,$phase, implode(';',$attributes)))."\n"; //Write concatinated data ($stringData) to file fwrite($fh, $stringData); } //Closing file fclose($fh); if($clear_database){ //The loading script: bp_seqfeature_load.pl, allows loading of data to specific file $command= "bp_seqfeature_load.pl -c -u '" .$user_name. "' -p '" .$password. "' -d " .$database_name. " " . $myFile; }else{ //The loading script: bp_seqfeature_load.pl, allows loading of data to specific file $command= "bp_seqfeature_load.pl -u '" .$user_name. "' -p '" .$password. "' -d " .$database_name. " " . $myFile; } //optional 'print' statement to verify that the above comman is being called and executed properly print 'Executing Command:'.$command."\n"; exec($command, $out_put, $return_var); } //----------------------------------------------------------------------------- // SECTION: Delete library features from database Form & Form submit //----------------------------------------------------------------------------- /** * * This form's purpose is to delete library featues from a selected GBrowse insatance. By selecting * a Library of genetic sequences and a GBrowse instance, the instance will be removed as will all the * associated libraries. This form allows access to a specified database and will delete any * selected Library features. It will return the form that contains all of the neccessary * information to send to the 'form_submit' function. * * @return $form * An array of menu items allowing deletion of features from the library */ function tripal_gbrowse_delete_library_features_from_gbrowse_form() { $form = array(); $result = tripal_core_chado_select ( 'library', array('library_id','name'), array() ); foreach ($result as $value){ $newArray[$value->library_id]=$value->name; //options for the select list } //Creating Fieldset for multiple fields in form $form['delete_gbrowse'] = array( '#type' => 'fieldset', '#title' => t(''), ); //Library ID $form['delete_gbrowse']['library_id'] = array( '#type' => 'select', '#title' => t('Libraries'), '#options' => $newArray, '#description' => t('Genetic Sequences.'), ); //Sending query to the database $resource = db_query('SELECT * FROM {tripal_gbrowse_instances}'); $items = array(); while($record = db_fetch_object($resource)){ $items[$record->gbrowse_id]= $record->gbrowse_name; } $form['delete_gbrowse']['gbrowse_id'] = array( '#type' => 'select', '#title' => t('GBrowse Instances'), '#options' => $items, '#description' => t('Selected Instances to be Removed.'), ); //Delete button to remove Library $form['delete_gbrowse']['submit'] = array( '#type' => 'submit', '#weight' => 10, '#value' => t('Delete') ); return $form; } /** * This 'form_submit' function uses MySQL commands to select the GBrowse instance from a selected database. * Then the selected features are deleted from the library. * * * @param $form * The submitted form that * * @param $form_state * The state of the form, includes the selected library and the GBrowse instance to be removed * The key is the 'values' */ function tripal_gbrowse_delete_library_features_from_gbrowse_form_submit($form, $form_state) { global $user; //needed to make the current users details available so access of user id is available $record = db_fetch_object(db_query('SELECT * FROM {tripal_gbrowse_instances} WHERE gbrowse_id=%d', $form_state['values']['gbrowse_id'])); $name = $record->database_name; $user_name = $record->database_user; $password= $record->user_password; $job_args = array($name,$user_name,$password,$form_state['values']['library_id']); //Checking state of submit button, if selected delete features from library if($form_state['values']['op'] == 'Delete'){ //registering a delete job with the tripal system, this job calls the function when executed $job_id = tripal_add_job('Deleting Library Features From GBrowse', 'tripal_gbrowse', 'tripal_gbrowse_delete_library_features_from_gbrowse', $job_args, $user->uid); } } //----------------------------------------------------------------------------- // SECTION: Delete Library Features from GBrowse //----------------------------------------------------------------------------- /** * Delete-GBrowse-Feature * * This form Removes features from library that the user has specified. The form allows the user * to select a desired instance. Once the library and instance are selected and deleted, the selected * libraries * * * * @param $database_name * name of GBrowse database * @param $user_name * GBrowse MySQL user name * @param $password * user password for GBrowse * @param $library_id * The id of the library that is being selected from * */ function tripal_gbrowse_delete_library_features_from_gbrowse($database_name, $user_name, $password, $library_id){ $result = tripal_core_chado_select ( 'library', array('name'), array('library_id' => $library_id) ); $library_name = $result[0]->name; print "Removing Features of all types related to the ".$library_name." library...\n"; $sql = 'SELECT cvterm.name FROM feature JOIN cvterm cvterm ON cvterm.cvterm_id=feature.type_id JOIN library_feature library_feature ON library_feature.feature_id=feature.feature_id JOIN library library ON library.library_id=library_feature.library_id WHERE library.library_id=%d GROUP BY cvterm.name'; $previous_db = tripal_db_set_active('chado'); $resource = db_query($sql, $library_id); tripal_db_set_active($previous_db); while($record = db_fetch_object($resource)){ $type = $record->name; //The loading script: bp_seqfeature_delete.pl, allows removal of data to specific file $command= "bp_seqfeature_delete.pl -u '".$user_name."' -p '".$password."' -d '" .$database_name. "' -t '" .$type. ":".$library_name."'"; print "Executing Command: ".$command."\n"; //exec() allows for execution of a external program: given the input exec($command); } } //----------------------------------------------------------------------------- // SECTION: Load analyses into GBrowse Form and Form Submit //----------------------------------------------------------------------------- /** * Implements hook_form * * This function creates a form for the database name, user name for database operation and a * password for access.The module uses these analyses to access information regarding the user's * operations and needs. * * @return * An array describing the form to be rendered */ function tripal_gbrowse_load_analyses_form(){ $newArray=array(); $result = tripal_core_chado_select ( 'analysis', array('analysis_id','name'), array() ); foreach ($result as $value) { $newArray[$value->analysis_id]=$value->name; //options for the select list } //Creating Fieldset for multiple fields in form $form['load_analyses'] = array( '#type' => 'fieldset', ); //Library ID $form['load_analyses']['analysis_id'] = array( '#type' => 'select', '#title' => t('Analyses'), '#options' => $newArray, '#description' => t('Analyses.'), ); //Sending query to the database $resource = db_query('SELECT * FROM {tripal_gbrowse_instances}'); $items = array(); while($record = db_fetch_object($resource)){ $items[$record->gbrowse_id]= $record->gbrowse_name; } //GBrowse Instances $form['load_analyses']['gbrowse_id'] = array( '#type' => 'select', '#title' => t('GBrowse Instances'), '#options' => $items, '#description' => t('Selected GBrowse Instances to be Loaded.'), ); //A checkbox to update features for the gbrowse $form['load_analyses']['check_box'] = array( '#type' => 'checkbox', '#title' => t('Update Analyses'), '#description' => t('Existing Same Name Analyses Updated Accordingly.'), ); $form['load_analyses']['submit'] = array( '#type' => 'submit', '#weight' => 10, '#value' => t('Submit Job') ); return $form; } /** * Load-Features-Form * * @param $form * -The submitted form containing the user entered infromation * * @param $form_state * -Is the state of the form: i.e what button was pressed, what infromation was entered,etc. * The key is the 'values' */ function tripal_gbrowse_load_analyses_form_submit($form, $form_state) { global $user; //needed to make the current users details available so access of user id is available $record = db_fetch_object(db_query('SELECT * FROM {tripal_gbrowse_instances} WHERE gbrowse_id=%d', $form_state['values']['gbrowse_id'])); $name = $record->database_name; $user_name = $record->database_user; $password= $record->user_password; $job_args = array($name,$user_name,$password,$form_state['values']['analysis_id'], FALSE); //Checking state of check box, if checked delete features from GBrowse if($form_state['values']['check_box']==1){ //registering a delete job with the tripal system, this job calls the function when executed $job_id = tripal_add_job('Deleting Features From GBrowse', 'tripal_gbrowse', 'tripal_gbrowse_delete_analysis_features_from_gbrowse', $job_args, $user->uid); } //registering a job with the tripal system, this job calls the function when executed $job_id = tripal_add_job('Loading Features Into GBrowse', 'tripal_gbrowse', 'tripal_gbrowse_load_analysis_features_into_gbrowse', $job_args, $user->uid); } //----------------------------------------------------------------------------- // SECTION:Load Analysis Features into GBrowse //----------------------------------------------------------------------------- /** * Load Analysis features into database * * This loading function firstly creates a output GFF3 format file for verification purposes. Then, a 'Chado' table * is selected,depending which table the user is interested in, from this table specific infromation * is taken out and placed in the GFF3 file.The Featurelocation(fmin) & featurelocation (fmax) are used * to set the featureloc.feature_id = feature.feature_id, the fmin = start & fmax = end of the desired gene. * The testing if the phase is empty is done, if so a '.' is inserted into $phase variable. If the parent * feature is indicated in feature location for the child feature will be set.The Attributes section * sets the, ID, Name, Alias, Dbrexf to variables to be put into a CONF file.The strand is either a * positive, negative, or zero value and is represented by +/./- accordingley. * * @param $name * name of GBrowse database * * @param $user_name * GBrowse MySQL user name * * @param $password * user password for GBrowse * * @param $library_id * GBrowse MySQL user name * * @param $clear_database * Used to clear the database of its backbone structure */ function tripal_gbrowse_load_analysis_features_into_gbrowse($database_name, $user_name, $password, $analysis_id,$clear_database){ //print 'Analysis ID: '.$analysis_id.".\n"; //A test file created to verify output $myFile = "/tmp/temporaryGBrowse_".time().".gff3"; //Test opening the file, will print warning if file is not able to be opened $fh = fopen($myFile, 'w') or die("WARNING: Can not open file"); print "Creating GFF3 file of features for Analysis...\n"; if (!preg_match('/^\d+$/', $analysis_id)) { print "ERROR: Invalid Analysis ID supplied (Analysis ID= ".$analysis_id.")\n"; return false; } // Selecting all analyses $values = array('analysis_id' => $analysis_id); $prime_result = tripal_core_chado_select ( 'analysisfeature', array('feature_id'), $values); // Select Table:library; column:uniquename $result = tripal_core_chado_select ( 'analysis', array('name'), $values ); $source = $result[0]->name ; // Check source: ERROR //For each feature, type id form feature table, specific record the feature id containing $feature_id foreach ($prime_result as $value) { $feature_id = $value->feature_id; if (!preg_match('/^\d+$/', $feature_id)) { print "ERROR: Invalid feature ID (".$feature_id.") associated with Library (Library ID = ".$analysis_id.")\n"; } $result = tripal_core_chado_select('feature', array('type_id'), array('feature_id'=>$feature_id)); $type_id = $result[0]->type_id; if (empty($type_id)) { print "ERROR: No Type associated with Feature ( Feature ID = ".$feature_id.")\n"; } //Taking the cvterm name from the cvterm table given the type-id($type_id) $result = tripal_core_chado_select('cvterm', array('name'), array('cvterm_id'=>$type_id)); //The extracted cvterm name $type = $result[0]->name; if (empty($type)) { print "ERROR: Type associated with Feature (".$type_id.") doesn't exist in cvterm table (Feature ID = ".$feature_id.")\n"; } //Featureloc.fmin & featureloc.fmax ( where featureloc.feature_id = feature.feature_id ) //fmin = start & fmax = end $result = tripal_core_chado_select('featureloc', array('fmin','fmax', 'strand', 'phase', 'srcfeature_id'), array('feature_id'=>$feature_id)); $start = $result[0]->fmin; if (!preg_match('/^\d+$/', $start)) { print "ERROR: Invalid Start (".$start.") of Feature (Feature ID= ".$feature_id.")\n"; } $end = $result[0]->fmax; if (!preg_match('/^\d+$/', $end)) { print "ERROR: Invalid End (".$end.") of Feature (Feature ID= ".$feature_id.")\n"; } $score = '.'; //Converting from +1/0/-1 to +/./- as there are only three possible values if ($result[0]->strand < 0) { $strand= '-'; } elseif ($result[0]->strand == 0) { $strand = '.'; } elseif($result[0]->strand > 0) { $strand = '+'; } else{ $strand = '.'; } //Testing if phase is empty, if so a '.' is inserted into $phase variable $phase = $result[0]->phase; if(empty($phase)){ $phase = '.'; } //This is the parent feature as indicated in feature location for the child feature and //the current line described the child feature $srcfeature_id = $result[0]->srcfeature_id; if (empty($srcfeature_id)) { print "ERROR: No Parent associated with Feature Location (Feature ID = ".$feature_id.")\n"; } $result = tripal_core_chado_select('feature', array('name'), array('feature_id'=>$srcfeature_id)); $seqid = $result[0]->name; if (empty($seqid)) { print "ERROR: Parent (Parent Feature ID = ".$seqid.") associated with Feature doesn't exist in feature table (Feature ID =".$feature_id."\n"; } //Attributes section, ID, Name, Alias, Dbrexf $result = tripal_core_chado_select('feature', array('uniquename', 'name'), array('feature_id'=>$feature_id)); $id = $result[0]->uniquename; if (empty($id)) { print "ERROR: Missing Unique Name for Feature (Feature ID = ".$feature_id.")\n"; } $name = $result[0]->name; if (empty($name)) { print "WARNING: Missing Name for Feature (Feature ID = ".$feature_id.")\n"; } //Synonym $result = tripal_core_chado_select('feature_synonym', array('synonym_id'), array('feature_id'=>$feature_id)); $synonyms = array(); foreach ($result as $obj){ $synonym_id = $obj->synonym_id; $sub_result = tripal_core_chado_select('synonym', array('name'), array('synonym_id'=>$synonym_id)); // check that $sub_result[0]->name isn't empty if (empty($sub_result[0]->name)) { print "ERROR: Synonym (".$synonym_id.") associated with feature not found in synonym table (Feature ID = ".$feature_id.")\n"; } else { $synonyms[] = $sub_result[0]->name; } } // Additional Dbxref's $result = tripal_core_chado_select('feature_dbxref', array('dbxref_id'), array('feature_id'=>$feature_id)); $dbxref = array(); foreach ($result as $obj){ $dbxref_id = $obj->dbxref_id; if (!empty($dbxref_id)) { $sub1_result = tripal_core_chado_select('dbxref', array('db_id', 'accession'), array('dbxref_id'=>$dbxref_id)); $dbxref_accession = $sub1_result[0]->accession; $db_id = $sub1_result[0]->db_id; if (!empty($db_id)) { $sub_sub_result =tripal_core_chado_select('db', array('name'), array('db_id'=>$db_id)); $db_name = $sub_sub_result[0]->name; if (empty($db_name)) { print "ERROR: Database (".$db_id.") associated with database reference not in db table (Database Reference ID = ".$dbxref_id.")\n"; } elseif (empty($dbxref_accession)) { print "WARNING: Missing Accession for Database Reference (Database Reference ID = ".$dbxref_id.")\n"; } else { $dbxref[] = $db_name . ':' . $dbxref_accession; } } } } //Main Dbxref $result = tripal_core_chado_select('feature', array('dbxref_id'), array('feature_id'=>$feature_id)); $dbxref_id = $result[0]->dbxref_id; if (empty($dbxref_id)) { print "WARNING: No Database Reference associated directly with Feature (Feature ID = ".$feature_id.")\n"; } $result = tripal_core_chado_select('dbxref', array('accession','db_id'), array('dbxref_id'=>$dbxref_id)); $dbxref_accession = $result[0]->accession; //checking $dbrexf_accession for emptyness if(!empty($dbxref_accession)){ $db_id = $result[0]->db_id; $sub_sub_result =tripal_core_chado_select('db', array('name'), array('db_id'=>$db_id)); $db_name = $sub_sub_result[0]->name; $dbxref[] = $db_name . ':' . $dbxref_accession; } else { print "WARNING: Missing Accession for Database Reference (Database Reference ID = ".$dbxref_id.")\n"; } //attributes array is assigned given elements based on previous initializations $attributes = array(); $attributes[] = 'ID='.$id; if (!empty($name)) { $attributes[] = 'Name='.$name; } if (!empty($synonyms)) { $attributes[] = 'Alias='.implode(',',$synonyms); } if (!empty($dbxref)) { $attributes[] = 'Dbxref=' .implode(',', $dbxref); } //write to string for printing $stringData = implode("\t", array($seqid,$source,$type,$start,$end,$score,$strand,$phase, implode(';',$attributes)))."\n"; //Write concatinated data ($stringData) to file fwrite($fh, $stringData); } //Closing file fclose($fh); if($clear_database){ //The loading script: bp_seqfeature_load.pl, allows loading of data to specific file $command= "bp_seqfeature_load.pl -c -u '" .$user_name. "' -p '" .$password. "' -d " .$database_name. " " . $myFile; }else{ //The loading script: bp_seqfeature_load.pl, allows loading of data to specific file $command= "bp_seqfeature_load.pl -u '" .$user_name. "' -p '" .$password. "' -d " .$database_name. " " . $myFile; } //optional 'print' statement to verify that the above comman is being called and executed properly print 'Executing Command:'.$command."\n"; exec($command, $out_put, $return_var); } //----------------------------------------------------------------------------- // SECTION: Delete analysis features from database Form & Form submit //----------------------------------------------------------------------------- /** * This form's purpose is to delete analysis featues from a selected GBrowse insatance. By selecting * a Library of analyses and a GBrowse instance, the instance will be removed as will all the * associated analysis library. This form allows access to a specified database and will delete any * selected Analysis features. It will return the form that contains all of the neccessary * information to send to the 'form_submit' function. * * @return $form * An array of menu items allowing deletion of features from the library */ function tripal_gbrowse_delete_analysis_features_from_gbrowse_form() { $form = array(); $result = tripal_core_chado_select ( 'analysis', array('analysis_id','name'), array() ); foreach ($result as $value){ $newArray[$value->analysis_id]=$value->name; //options for the select list } //Creating Fieldset for multiple fields in form $form['delete_analysis'] = array( '#type' => 'fieldset', '#title' => t(''), ); //Library ID $form['delete_analysis']['analysis_id'] = array( '#type' => 'select', '#title' => t('Analysis Features'), '#options' => $newArray, '#description' => t('Analysis.'), ); //Sending query to the database $resource = db_query('SELECT * FROM {tripal_gbrowse_instances}'); $items = array(); while($record = db_fetch_object($resource)){ $items[$record->gbrowse_id]= $record->gbrowse_name; } $form['delete_analysis']['gbrowse_id'] = array( '#type' => 'select', '#title' => t('GBrowse Instances'), '#options' => $items, '#description' => t('Selected Instances to be Removed.'), ); //Delete button to remove Library $form['delete_analysis']['submit'] = array( '#type' => 'submit', '#weight' => 10, '#value' => t('Delete') ); return $form; } /** * This 'form_submit' function uses MySQL commands to select the GBrowse instance from a selected database. * Then the selected features are deleted from the library. * * * @param $form * The submitted form that * * @param $form_state * The state of the form, includes the selected library and the GBrowse instance to be removed * The key is the 'values' */ function tripal_gbrowse_delete_analysis_features_from_gbrowse_form_submit($form, $form_state) { global $user; //needed to make the current users details available so access of user id is available $record = db_fetch_object(db_query('SELECT * FROM {tripal_gbrowse_instances} WHERE gbrowse_id=%d', $form_state['values']['gbrowse_id'])); $name = $record->database_name; $user_name = $record->database_user; $password= $record->user_password; $job_args = array($name,$user_name,$password,$form_state['values']['analysis_id']); //Checking state of submit button, if selected delete features from library if($form_state['values']['op'] == 'Delete'){ //registering a delete job with the tripal system, this job calls the function when executed $job_id = tripal_add_job('Deleting Analysis Features From GBrowse', 'tripal_gbrowse', 'tripal_gbrowse_delete_analysis_features_from_gbrowse', $job_args, $user->uid); } } //----------------------------------------------------------------------------- // SECTION: Delete Analysis Features from GBrowse //----------------------------------------------------------------------------- /** * Delete-GBrowse-Feature * * This form Removes features from Analysis that the user has specified. The form allows the user * to select a desired instance. Once the analysis and instance are selected and deleted, the selected * analyses will be disassociated with the specified instance. * * @param $database_name * name of GBrowse database * * @param $user_name * GBrowse MySQL user name * * @param $password * user password for GBrowse * * @param $library_id * The id of the library that is being selected from * */ function tripal_gbrowse_delete_analysis_features_from_gbrowse($database_name, $user_name, $password, $analysis_id){ $result = tripal_core_chado_select ( 'analysis', array('name'), array('analysis_id' => $analysis_id) ); $analysis_name = $result[0]->name; print "Removing Analysis Features of all types related to the ".$analysis_name." analysis...\n"; $sql = 'SELECT cvterm.name FROM feature JOIN cvterm cvterm ON cvterm.cvterm_id=feature.type_id JOIN analysisfeature analysisfeature ON analysisfeature.feature_id=feature.feature_id JOIN analysis analysis ON analysis.analysis_id=analysisfeature.analysis_id WHERE analysis.analysis_id=%d GROUP BY cvterm.name'; $previous_db = tripal_db_set_active('chado'); $resource = db_query($sql, $analysis_id); tripal_db_set_active($previous_db); while($record = db_fetch_object($resource)){ $type = $record->name; //The loading script: bp_seqfeature_delete.pl, allows removal of data to specific file $command= "bp_seqfeature_delete.pl -u '".$user_name."' -p '".$password."' -d '" .$database_name. "' -t '" .$type. ":".$analysis_name."'"; print "Executing Command: ".$command."\n"; //exec() allows for execution of a external program: given the input exec($command); } } //----------------------------------------------------------------------------- // SECTION: Add Tracks Form & Form submit //----------------------------------------------------------------------------- /** * Add-GBrowse-Tracks * This Menu item is implemented to allow users to define and add tracks including their name, * glyph, colour (fore and back ground), size and link. By adding tracks, the user is able to * visually inspect the features of their genomic data. The Glyph library has been hardcoded * into the software and represents the most used Glyph representations. The "Glyph" option * determines the shape of each of the displayed genomic features associated with a specific * GBrowse track. It presents a configurable set of parameters specific to its type allowing * further control over the display features such as height, color (foreground & backround) etc. * * * @return * An '$form' that is an array of menu items that allows the user to Register a GBrowse instance */ function tripal_gbrowse_add_tracks_form() { //Creating Fieldset for multiple fields in form $form['add_tracks_field_set'] = array( '#type' => 'fieldset', '#title' => t('Content-Related Fields'), ); //Sending query to the database for GBrowse Instances $resource = db_query('SELECT * FROM {tripal_gbrowse_instances}'); $items = array(); while($record = db_fetch_object($resource)){ $items[$record->gbrowse_id]= $record->gbrowse_name; } //GBrowse Instances $form['add_tracks_field_set']['gbrowse_instances'] = array( '#type' => 'select', '#title' => t('Registered GBrowse Instances'), '#options' => $items, '#description' => t('Selected GBrowse Instances to be Loaded.'), '#required' => TRUE, ); //Feature Type $sql = 'SELECT name as type, cvterm_id ' .'FROM cvterm ' .'WHERE cvterm_id IN (SELECT type_id FROM feature)'; $previous_db = tripal_db_set_active('chado'); $resource = db_query($sql); tripal_db_set_active($previous_db); $items = array(); while($record = db_fetch_object($resource)){ $items[$record->type] = $record->type; } $form['add_tracks_field_set']['type_name'] = array( '#type' => 'select', '#title' => t('Feature Type'), '#options' => $items, '#description' => t('Selected GBrowse Instances to be Loaded.'), '#required' => TRUE, ); //Populating Select list for Library $newArray['none'] = 'None'; //No option for select list $result = tripal_core_chado_select ( 'library', array('library_id','name'), array() ); foreach ($result as $value) { $newArray[$value->name]=$value->name; //options for the select list } //Library $form['add_tracks_field_set']['library_id'] = array( '#type' => 'select', '#title' => t('Library'), '#options' => $newArray, '#description' => t('Selected GBrowse Instances to be Loaded.'), ); //Creating Fieldset for multiple fields in form $form['track_text'] = array( '#type' => 'fieldset', '#title' => 'Track-Specific Fields' ); //Specify Track Identifier $form['track_text']['identifier'] = array( '#type' => 'textfield', '#title' => t('Track Identifier'), '#size' => 30, '#maxlength' => 64, '#description' => t('Specify Track Identifier (Must be Unique and Specific)'), '#required' => TRUE, ); //Specify Track Name $form['track_text']['track_name'] = array( '#type' => 'textfield', '#title' => t('Track Name'), '#size' => 30, '#maxlength' => 64, '#description' => t('Specify Track Name (Must be Unique and Specific)'), '#required' => TRUE, ); //Populating Array of Glyph List $item = array(); $item[''] = 'Default Glyph'; $item['generic'] = 'Generic'; $item['allele_tower '] = 'Allele Tower'; $item['anchored_arrow'] = 'Anchored Arrow'; $item['arrow'] = 'Arrow'; $item['box'] = 'Box'; $item['cds'] = 'CDS'; $item['crossbox'] = 'Cross Box'; $item['diamond'] = 'Diamond'; $item['dna'] = 'DNA'; $item['dot'] = 'Dot'; $item['ellipse'] = 'Ellipse'; $item['extending_arrow'] = 'Extending Arrow'; $item['generic'] = 'Generic'; $item['graded_segments'] = 'Graded Segments'; $item['heterogeneous_segments '] = 'Heterogeneous Segments'; $item['image'] = 'Image'; $item['line'] = 'Line'; $item['primers'] = 'Primers'; $item['processed_transcript'] = 'Processed Transcript'; $item['rndrect'] = 'Rndrect'; $item['ruler_arrow'] = 'Ruler Arrow'; $item['segments'] = 'Segments'; $item['span'] = 'Span'; $item['toomany'] = 'Too Many'; $item['transcript'] = 'Transcript'; $item['transcript2'] = 'Transcript2'; $item['translation'] = 'Translation'; $item['triangle'] = 'Triangle'; $item['wiggle_densit'] = 'Wiggle Densit'; $item['wiggle_xyplot'] = 'Wiggle XYplot'; $item['xyplot'] = 'XYplot'; //Glyphs $form['track_text']['glyph'] = array( '#type' => 'select', '#title' => t('Glyph'), '#options' => $item, '#description' => t('Shape of Genomic Feature Track '), ); //Modify The foreground colour of track $form['track_text']['foreground_colour'] = array( '#type' => 'textfield', '#title' => t('Foreground Colour'), '#size' => 30, '#maxlength' => 64, '#description' => t('Enter name/Hex-code for identifying foreground colour of glyph. List of available colours here:'.l("GBrowse Colour Palette.pdf", "http://gmod.org/mediawiki/images/a/ae/Gbrowse_Color_Palette.pdf")), ); //Modify The Backround colour of track $form['track_text']['backround_colour'] = array( '#type' => 'textfield', '#title' => t('Background Colour'), '#size' => 30, '#maxlength' => 20, '#description' => t('Enter name/Hex-code for identifying background colour of glyph. List of available colours here:'.l("GBrowse Colour Palette.pdf", "http://gmod.org/mediawiki/images/a/ae/Gbrowse_Color_Palette.pdf")), ); //Modify The Height of track $form['track_text']['track_height'] = array( '#type' => 'textfield', '#title' => t('Height'), '#size' => 30, '#maxlength' => 20, '#description' => t('Modify Track Height'), ); //Specify Link $form['track_text']['link'] = array( '#type' => 'textfield', '#title' => t('Link'), '#size' => 30, '#maxlength' => 64, '#description' => t('Specify to Further details (HTML address)'), ); //Register job submit button $form['create_instance']['submit'] = array( '#type' => 'submit', '#value' => t('Add Track') ); return $form; } /** * Validate User-submitted data for Register GBrowse Instances * * This function validates the user input for each form element in the Register GBrowse * instances form that is a text field. Validations checked include: * - database_name: contains only word characters not including punctuation * or white-space ([A-Z][a-z][0-1]_) * * @param $form * The form that the user submitted and whose input is being validated * * @param $form_state * An array containing the state of the form being validated including user-input */ function tripal_gbrowse_add_tracks_form_validate ($form, $form_state) { if (!empty($form_state['values']['foreground_colour'])) { // foreground colour is present and a valid colour if ( !preg_match('/^[\w#]+$/', $form_state['values']['foreground_colour'])) { form_set_error('foreground_colour', 'The Foreground Colour should be either the name of a colour listed in the linked to pdf or a valid hex colour'); } } if (!empty($form_state['values']['backround_colour'])) { if(!preg_match('/^[\w#]+$/', $form_state['values']['backround_colour'])){ form_set_error('backround_colour','The Background Colour should be either the name of a colour listed in the linked to pdf or a valid hex colour'); } } if (!empty($form_state['values']['track_height'])){ if(!preg_match('/^\d*$/', $form_state['values']['track_height'])){ form_set_error('track_height','The Track Height must be a positive integer'); } } if(!preg_match('/^\w+$/', $form_state['values']['identifier'])){ form_set_error('identifier','The Identifier must be composed of the following characters only: [A-Z][a-z][0-9] and _'); } if (!empty($form_state['values']['link'])){ if(!preg_match('/^http:/', $form_state['values']['link'])){ form_set_error('link','The Link must be a conventional web site name, beginging with http: '); } } } /** *Add-GBrowse-Tracks Form_Submit * * @param $form * The form for the information that the user has entered * * @param $form_state * This is the state of the form: i.e what button was pressed.The key is * the name of the fields in database * * @return * An '$form' that is an array of menu items that allows the user to Register a GBrowse instance */ function tripal_gbrowse_add_tracks_form_submit($form, $form_state) { $string = "\n[".$form_state['values']['identifier']."]\n" ."key = ".$form_state['values']['track_name']."\n"; if($form_state['values']['library_id'] == 'none'){ $string .= "feature = ".$form_state['values']['type_name']."\n"; } else { $string .= "feature = ".$form_state['values']['type_name'].":" .$form_state['values']['library_id']."\n"; } if (!empty($form_state['values']['glyph'])) { $string .= "glyph = ".$form_state['values']['glyph']."\n"; } if (!empty($form_state['values']['track_height'])) { $string .= "height = ".$form_state['values']['track_height']."\n"; } if (!empty($form_state['values']['foreground_colour'])) { $string .= "bgcolor = ".$form_state['values']['foreground_colour']."\n"; } if (!empty($form_state['values']['backround_colour'])) { $string .= "fgcolor = ".$form_state['values']['backround_colour']."\n"; } if (!empty($form_state['values']['link'])) { $string .= "link = ".$form_state['values']['link']."\n"; } $string .= "\n"; $record = db_fetch_object(db_query('SELECT * FROM {tripal_gbrowse_instances} WHERE gbrowse_id=%d', $form_state['values']['gbrowse_instances'])); $config_file = $record->config_file; $command = "echo '".$string."' >> ".$config_file; exec($command); } //----------------------------------------------------------------------------- // SECTION: Delete Tracks Form & Form submit //----------------------------------------------------------------------------- /** *Delete-GBrowse-Tracks * * This Form allows selection for a specific GBrowse Instance to be removed in a multi-submit form outline. * Once the GBrowse instance is selected,the corresponding track list that corresponds to * the selected GBrowse instance is deleted. This can be done one track at a time. As * there is no limit to the number of tracks that can be added to a particular GBrowse instance and * thus all the tracks that have bee added can be deleted, one track at a time. The track that is to * be deleted is to be selected from the list. When selected and the delete button is pushed, * the track that was selected is removed from the 'configuration' file. * * @param $form_state * The state of the form as it is setting the default value of $form_state is NULL * * @return * An '$form' that is an array of menu items that allows the user to Register a GBrowse instance */ function tripal_gbrowse_delete_tracks_form(&$form_state=NULL) { //Creating Fieldset for multiple fields in form $form['delete_tracks_field_set'] = array( '#type' => ($form_state['storage']['gbrowse_id']) ? 'hidden' : 'fieldset', '#title' => t('GBrowse Specific Fields'), ); //Sending query to the database for GBrowse Instances $resource = db_query('SELECT * FROM {tripal_gbrowse_instances}'); $items = array(); while($record = db_fetch_object($resource)){ $items[$record->gbrowse_id]= $record->gbrowse_name; } //GBrowse Instance Select List $form['delete_tracks_field_set']['gbrowse_instances'] = array( '#type' => 'select', '#title' => t('Registered GBrowse Instances'), '#options' => $items, '#description' => t('Selected GBrowse Instances to be Loaded.'), '#default_value' => $form_state['values']['gbrowse_instances'], ); //Set Instance Submit button $form['delete_tracks_field_set']['submit_instance'] = array( '#type' => 'submit', '#value' => t('Set Instance') ); //Creating Fieldset for multiple fields in form $form['delete_tracks'] = array( '#type' => ($form_state['storage']['gbrowse_id']) ? 'fieldset' : 'hidden', '#title' => t('Track Specific Fields'), ); $gbrowse_id = $form_state['storage']['gbrowse_id']; if ($gbrowse_id){ $items = track_name_options($gbrowse_id); }else { $items = array(); } //Track Name Select List $form['delete_tracks']['track_line_number'] = array( '#type' => 'select', '#title' => t('Track Name'), '#options' => $items, '#description' => t('Name of Track to Remove '), '#default_value' => $form_state['values']['gbrowse_id'], ); //Remove Track button $form['delete_tracks']['remove_track'] = array( '#type' => 'submit', '#value' => t('Remove Track') ); return $form; } /** *Delete-GBrowse-Tracks * *@param $form * The form that is completed in the above section * * @param $form_state * The state of the form, as it is completed by the user and will contain all of the user's * selected infromation that is to be removed from the configuration file. * */ function tripal_gbrowse_delete_tracks_form_submit($form, &$form_state) { $form_state['storage']['gbrowse_id'] = $form_state['values']['gbrowse_instances']; //Checking that the "Remove Track" button was selected if($form_state['clicked_button']['#value']=='Remove Track'){ //selecting GBrowse-ID from the database $resource= db_fetch_object(db_query('SELECT * FROM {tripal_gbrowse_instances} WHERE gbrowse_id=%d', $form_state['storage']['gbrowse_id'])); //putting contents of the configuration file into an variable $config_file = (string) $resource->config_file; $read_file_handle = fopen($config_file,'r') or drupal_set_message("WARNING: Can not open file:" .$config_file, 'error'); $track_number = $form_state['values']['track_line_number']; $line_num = 0; //create temp file $new_conf_file = '/tmp/temp_config_file.temp'; //making '.temp' file in the /tmp directory $command = 'touch /tmp/temp_config_file.temp'; exec($command); //Checking that the newly created file is writable if (is_writable($new_conf_file)) { //opening file for writing to $write_file_handle = fopen($new_conf_file, 'w') or drupal_set_message("WARNING: Can not open file:" .$new_conf_file, 'error'); }else{ drupal_set_message("WARNING: Attempting to create a temporary file -insufficient permissions: ".$new_conf_file, 'error'); } while(!feof($read_file_handle)){ $file_line = fgets($read_file_handle); $line_num++; if($line_num == $track_number){ $remove_track = TRUE; } if(preg_match('/^\s*$/',$file_line)){ $remove_track=FALSE; } if($remove_track==FALSE){ fwrite($write_file_handle, $file_line); } } $command = 'cp '.$new_conf_file.' '.$config_file ; exec($command); $command = 'rm '.$new_conf_file ; exec($command); } } /** * Populate Track-Name List * * This section takes a GBrowse ID so the coresponding configuration file can be accessed. Once it has been * obtained from the database, by the db_query() command. The configuration file is is searched for lines * that start with "[ ]". This corresponds to the framework of the conf file, as the Track Names are * enclosed within "[ ]". The file is then scanned from the spots that contain the "[ ]". * * * @param gbrowse_id * The Selected GBrowse instance's identification * * @return * $items() and array with the tracks that are in the selected GBrowse instance. */ function track_name_options($gbrowse_id) { $items = array(); // Use GBrowse ID to get configuration filename $record = db_fetch_object(db_query('SELECT * FROM {tripal_gbrowse_instances} WHERE gbrowse_id=%d', $gbrowse_id)); //putting contents of the configuration file into an variable $config_file = (string) $record->config_file; $config_array = array(); //command to select the lines that begin with '[' and have characters within the '[ ]' $command = 'grep -n "^\[.*\]" ' .$config_file; //execution of the command exec($command , $config_array); $config_array_size = count($config_array); //while the end-of-file has not been reached for($i = 0 ; $i < $config_array_size; $i++){ $file_line = $config_array[$i]; if ($is_track_definition){ if(preg_match('/^(\d+):\[(.+)\]$/', $file_line, $matches)){ $items[$matches[1]] = $matches[2]; } } if(preg_match('/\[TRACK DEFAULTS\]/', $file_line)){ $is_track_definition = TRUE; } } return $items; } //----------------------------------------------------------------------------- // END OF SOFTWARE //-----------------------------------------------------------------------------