Prechádzať zdrojové kódy

Merge pull request #43 from Jiu9Shen/35-multiple_jbrowses_41organism

35 multiple jbrowses 41organism
Lacey-Anne Sanderson 5 rokov pred
rodič
commit
d3834a31b4

+ 43 - 2
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt.api.inc

@@ -54,6 +54,7 @@ function tripal_jbrowse_mgmt_save_settings($settings) {
 function tripal_jbrowse_mgmt_get_instances($conditions = NULL) {
   static $users = [];
   static $organisms = [];
+  static $analysis = [];
 
   $instances = db_select('tripal_jbrowse_mgmt_instances', 'H')->fields('H');
 
@@ -76,8 +77,16 @@ function tripal_jbrowse_mgmt_get_instances($conditions = NULL) {
         [':id' => $instance->organism_id])->fetchObject();
     }
     $instance->organism = $organisms[$instance->organism_id];
-  }
 
+    if($instance->analysis_id){
+      if (!isset($analysis[$instance->analysis_id])){
+        $analysis[$instance->analysis_id] = chado_query('SELECT * FROM {analysis} WHERE analysis_id=:id',
+          [':id' => $instance->analysis_id])->fetchObject();
+      }
+      $instance->analysis = $analysis[$instance->analysis_id];
+    }
+
+  }
   return $instances;
 }
 
@@ -92,7 +101,6 @@ function tripal_jbrowse_mgmt_get_instances($conditions = NULL) {
  */
 function tripal_jbrowse_mgmt_create_instance($data) {
   global $user;
-
   // Check that required fields are provided.
   $required = ['organism_id', 'created_at'];
   foreach ($required as $key) {
@@ -111,6 +119,7 @@ function tripal_jbrowse_mgmt_create_instance($data) {
   return db_insert('tripal_jbrowse_mgmt_instances')->fields([
     'uid' => $user->uid,
     'organism_id' => $data['organism_id'],
+    'analysis_id' => $data['analysis_id'],
     'title' => $data['title'],
     'description' => isset($data['description']) ? $data['description'] : '',
     'created_at' => $data['created_at'],
@@ -132,6 +141,20 @@ function tripal_jbrowse_mgmt_get_instance($instance_id) {
   return reset($instance);
 }
 
+/**
+ * Get analysis_id from string(autocomplete analysis)
+ *
+ * @param $analysis_string (in format: ******** (###))
+ *
+ * @return int
+ */
+function tripal_jbrowse_mgmt_get_analysis_id_from_string($analysis_string){
+  preg_match_all('!\d+!', $analysis_string, $match_analysis);
+  $analysis_id =  array_pop($match_analysis[0]);
+  return $analysis_id;
+}
+
+
 /**
  * Update an instance.
  *
@@ -282,6 +305,18 @@ function tripal_jbrowse_mgmt_get_organisms_list() {
     ->fetchAll();
 }
 
+/**
+ * parse analysis to obtain analysis_id
+ *
+ * @return mixed
+ */
+function tripal_jbrowse_mgmt_analysis_parse_4id($name_id) {
+
+
+  return $analysis_id;
+}
+
+
 /**
  * Format the name of the organism to `Genus species (Common Name)`.
  *
@@ -411,6 +446,9 @@ function tripal_jbrowse_mgmt_copy_file($source, $destination, $sym_link) {
  */
 function tripal_jbrowse_mgmt_build_http_query($instance) {
   $path = tripal_jbrowse_mgmt_make_slug($instance->title);
+  if(isset($instance->analysis_id)){
+    $path = $path . '_' . $instance->analysis_id;
+  }
   $added_tracks = tripal_jbrowse_mgmt_get_tracks($instance);
   $properties = tripal_jbrowse_mgmt_get_instance_properties($instance->id);
 
@@ -547,6 +585,9 @@ function tripal_jbrowse_mgmt_get_track_list_file_path($instance) {
 
   $path = $settings['data_dir'];
   $path .= '/' . tripal_jbrowse_mgmt_make_slug($instance->title);
+  if(isset($instance->analysis_id)){
+    $path = $path . '_' . $instance->analysis_id;
+  }
   $path .= '/data/trackList.json';
 
   return $path;

+ 85 - 8
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt_add.form.inc

@@ -44,6 +44,23 @@ function tripal_jbrowse_mgmt_add_form($form, &$form_state) {
     '#weight' => -8,
   ];
 
+  $analysis_term_entity = tripal_load_term_entity([
+    'vocabulary'=>'operation',
+    'accession'=>'2945',
+  ]);
+  
+  $analysis_bundle_entity = tripal_load_bundle_entity([
+    'term_id'=>$analysis_term_entity->id,
+  ]);
+
+  $form['analysis'] = [
+    '#title' => t('Analysis'),
+    '#description' => 'Select the analysis to which this instance will be related. Analysis can be created in '.l('Add Tripal Content', 'bio_data/add/' . $analysis_bundle_entity->id).' if wanted analysis is not available.<br><strong>Please choose analysis carefully</strong> since it can not change once instance is created.',
+    '#type' => 'textfield',
+    '#autocomplete_path' => 'admin/tripal/extension/tripal_jbrowse/management/instances/analysis/autocomplete',
+    '#weight' => -6,
+  ];
+
   $form['description'] = [
     '#title' => t('Description'),
     '#description' => t('Optional description for the instance.'),
@@ -184,12 +201,28 @@ function tripal_jbrowse_mgmt_add_form_validate($form, &$form_state) {
     }
   }
 
+  //  if selected organism already exist, analysis_id is required
+  //  also make sure organism+analysis does not exist
   $instances = tripal_jbrowse_mgmt_get_instances(['organism_id' => $organism]);
-  if (!empty($instances)) {
-    form_set_error(
-      'organism',
-      'A JBrowse instance for the selected organism already exists. You can edit the instance from the instances page.'
-    );
+
+  if (empty($values['analysis'])) {
+    if (!empty($instances)){
+      form_set_error(
+        'analysis',
+        'A JBrowse instance for the selected organism already exists. Please choose one analysis for this instance.'
+      );
+    }
+  }
+  else{
+    $values_analysis_id = tripal_jbrowse_mgmt_get_analysis_id_from_string($values['analysis']);
+    foreach ($instances as $instance){
+      if ($values_analysis_id == $instance->analysis_id){
+        form_set_error(
+          'analysis',
+          'The analysis for selected organism is taken. Please choose another analysis/organism for this instance.'
+        );
+      }
+    }
   }
 
   $organism = db_select('chado.organism', 'CO')
@@ -211,9 +244,13 @@ function tripal_jbrowse_mgmt_add_form_validate($form, &$form_state) {
  */
 function tripal_jbrowse_mgmt_add_form_submit($form, &$form_state) {
   global $user;
-
   $values = $form_state['values'];
   $organism_id = $values['organism'];
+  if ($values['analysis']){
+    $analysis_id = tripal_jbrowse_mgmt_get_analysis_id_from_string($values['analysis']);
+  }
+  preg_match_all('!\d+!', $values['analysis'], $match_analysis);
+  $analysis_id = array_pop($match_analysis[0]);
   $description = isset($values['description']) ? $values['description'] : '';
 
   if (empty($values['uploaded_file'])) {
@@ -232,6 +269,7 @@ function tripal_jbrowse_mgmt_add_form_submit($form, &$form_state) {
   $instance_id = tripal_jbrowse_mgmt_create_instance(
     [
       'organism_id' => $organism_id,
+      'analysis_id' => $analysis_id,
       'title' => tripal_jbrowse_mgmt_construct_organism_name($organism),
       'description' => $description,
       'created_at' => time(),
@@ -254,8 +292,47 @@ function tripal_jbrowse_mgmt_add_form_submit($form, &$form_state) {
     $form_state['redirect'] = "admin/tripal/extension/tripal_jbrowse/management/instances/$instance_id";
   }
   else {
-    drupal_set_message('Failed to create instance!', 'error');
-    return;
+    if (empty($values['uploaded_file'])) {
+      $file = $values['ref_seq_path'];
+    }
+    else {
+      $file = $values['uploaded_file'];
+    }
+
+    $organism = db_select('chado.organism', 'CO')
+      ->fields('CO')
+      ->condition('organism_id', $organism_id)
+      ->execute()
+      ->fetchObject();
+
+    $instance_id = tripal_jbrowse_mgmt_create_instance(
+      [
+        'organism_id' => $organism_id,
+        'analysis_id' => $analysis_id,
+        'title' => tripal_jbrowse_mgmt_construct_organism_name($organism),
+        'description' => $description,
+        'created_at' => time(),
+        'file' => $file,
+      ]
+    );
+
+    if ($instance_id) {
+      drupal_set_message('Instance created successfully!');
+      $name = 'Create JBrowse instance for ';
+      $name .= tripal_jbrowse_mgmt_construct_organism_name($organism);
+
+      tripal_add_job(
+        $name,
+        'tripal_jbrowse_mgmt',
+        'tripal_jbrowse_mgmt_create_instance_files',
+        [$instance_id],
+        $user->uid
+      );
+      $form_state['redirect'] = "admin/tripal/extension/tripal_jbrowse/management/instances/$instance_id";
+    }
+    else {
+      drupal_set_message('Failed to create instance!', 'error');
+    }
   }
 
   // Now save the instance properties.

+ 16 - 2
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt_commands.inc

@@ -10,11 +10,14 @@
  */
 function tripal_jbrowse_mgmt_cmd_prepare_refseq($instance) {
   $settings = tripal_jbrowse_mgmt_get_settings();
-
   $data = $settings['data_dir'];
   $bin = $settings['bin_path'];
 
   $path = $data . '/' . tripal_jbrowse_mgmt_make_slug($instance->title);
+  if(isset($instance->analysis_id)){
+    $path = $path . '_' . $instance->analysis_id;
+  }
+
   if (!file_exists($path)) {
     if (!mkdir($path)) {
       throw new Exception(
@@ -58,6 +61,9 @@ function tripal_jbrowse_mgmt_cmd_add_track($track) {
   $menu_template = $settings['menu_template'];
 
   $path = $data . '/' . tripal_jbrowse_mgmt_make_slug($instance->title);
+  if(isset($instance->analysis_id)){
+    $path = $path . '_' . $instance->analysis_id;
+  }
   $out = $path . '/data';
 
   if (!file_exists($out)) {
@@ -110,7 +116,7 @@ function tripal_jbrowse_mgmt_cmd_add_track($track) {
       $basename = pathinfo($track->file)['basename'];
 
       $json['tracks'][] = [
-        'label' => $track->label,
+        'label' => tripal_jbrowse_mgmt_make_slug($track->label),
         'key' => $track->label,
         'storeClass' => 'JBrowse/Store/SeqFeature/BigWig',
         'urlTemplate' => 'wig/' . $basename,
@@ -158,6 +164,10 @@ function tripal_jbrowse_mgmt_cmd_generate_names($instance) {
   $bin = $settings['bin_path'];
 
   $path = $data . '/' . tripal_jbrowse_mgmt_make_slug($instance->title);
+  if(isset($instance->analysis_id)){
+    $path = $path . '_' . $instance->analysis_id;
+  }
+
   if (!file_exists($path)) {
     if (!mkdir($path)) {
       throw new Exception(
@@ -198,6 +208,10 @@ function tripal_jbrowse_mgmt_cmd_delete_track($track) {
   $instance = $track->instance;
 
   $path = $data . '/' . tripal_jbrowse_mgmt_make_slug($instance->title);
+  if(isset($instance->analysis_id)){
+    $path = $path . '_' . $instance->analysis_id;
+  }
+
   $out = $path . '/data';
 
   if (!file_exists($out)) {

+ 1 - 0
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt_instance.page.inc

@@ -36,6 +36,7 @@ function tripal_jbrowse_mgmt_instance_page($instance_id) {
         'header' => ['Key', 'Value'],
         'rows' => [
           ['Instance Name', $instance->title],
+          ['Analysis Name', $instance->analysis->name ?? 'Not provided'],
           ['Created At', date('m/d/Y', $instance->created_at)],
           [
             'Organism',

+ 2 - 0
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt_list.page.inc

@@ -29,6 +29,7 @@ function tripal_jbrowse_mgmt_instances_page() {
 
   $header = [
     'Organism',
+    'Analysis',
     'Submitter',
     'Description',
     'Tracks',
@@ -43,6 +44,7 @@ function tripal_jbrowse_mgmt_instances_page() {
         $instance->title,
         'admin/tripal/extension/tripal_jbrowse/management/instances/' . $instance->id
       ),
+      $instance->analysis->name ?? 'Not provided',
       $instance->user->name,
       $instance->description ?: 'Not provided',
       l('Manage Tracks', 'admin/tripal/extension/tripal_jbrowse/management/instances/' . $instance->id),

+ 6 - 3
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt_tracks.form.inc

@@ -130,18 +130,21 @@ function tripal_jbrowse_mgmt_add_track_form_validate($form, &$form_state) {
   $symbolic_link = $values['symbolic_link'];
   $path = NULL;
 
-  $base_path = $data . '/' . tripal_jbrowse_mgmt_make_slug($instance->title) . '/data';
+  $base_path = $data . '/' . tripal_jbrowse_mgmt_make_slug($instance->title);
+  if(isset($instance->analysis_id)){
+    $base_path = $base_path . '_' . $instance->analysis_id;
+  }
+  $base_path = $base_path . '/data';
 
   if ($file_type === 'vcf') {
     $path = $base_path . '/vcf';
   }
-  elseif ($file === 'bw') {
+  elseif ($file_type === 'bw') {
     $path = $base_path . '/wig';
   }
   else {
     $path = $base_path;
   }
-
   switch ($file_type) {
     case 'vcf':
       $index = $_FILES['files']['tmp_name']['file2'];

+ 16 - 0
tripal_jbrowse_mgmt/tripal_jbrowse_mgmt.install

@@ -25,6 +25,10 @@ function tripal_jbrowse_mgmt_schema() {
         'type' => 'int',
         'not null' => TRUE,
       ],
+      'analysis_id' => [
+        'type' => 'int',
+        'not null' => FALSE,
+      ],
       'title' => [
         'type' => 'varchar',
         'length' => 255,
@@ -128,3 +132,15 @@ function tripal_jbrowse_mgmt_update_7001(&$sandbox) {
   $table = $schema[$name];
   db_create_table($name, $table);
 }
+
+/**
+ * adding a new column analysis_id to table tripal_jbrowse_mgmt_instances
+ */
+function tripal_jbrowse_mgmt_update_7002(&$sandbox){
+  $new_col_spec = [
+    'type' => 'int',
+    'not null' => FALSE,
+  ];
+  $schema = Database::getConnection()->schema();
+  $schema->addField('tripal_jbrowse_mgmt_instances', 'analysis_id', $new_col_spec);
+}

+ 26 - 0
tripal_jbrowse_mgmt/tripal_jbrowse_mgmt.module

@@ -134,6 +134,13 @@ function tripal_jbrowse_mgmt_menu() {
     'type' => MENU_LOCAL_ACTION,
   ];
 
+  $items['admin/tripal/extension/tripal_jbrowse/management/instances/analysis/autocomplete'] = [
+    'title' => 'autocomplete for JBrowse instance analysis',
+    'page callback' => '_mgmt_add_analysis_autocomplete',
+    'access arguments' => ['administer tripal_jbrowse_mgmt'],
+    'type' => MENU_CALLBACK,
+  ];
+
   return $items;
 }
 
@@ -153,3 +160,22 @@ function tripal_jbrowse_mgmt_permission() {
 
   return $items;
 }
+
+/**
+ * autocomplete helper
+ * $string = string for autocomplete search
+ * to provide analysis names for form in tripal_jbrowse_mgmt_add.form.inc
+ */
+ function _mgmt_add_analysis_autocomplete($string){
+   $analysis_4match =array();
+   $analysis = db_select('chado.analysis', 'CA')
+     ->fields('CA', ['analysis_id', 'name'])
+     ->condition('name','%'.db_like($string).'%','LIKE')
+     ->execute();
+
+    foreach($analysis as $one_analysis){
+      $key = $one_analysis->name . ' (' . $one_analysis->analysis_id . ')';
+      $analysis_4match[$key] = $one_analysis->name;
+    }
+    drupal_json_output($analysis_4match);
+ }

+ 5 - 1
tripal_jbrowse_page/theme/jbrowse-instance--public-listing.tpl.php

@@ -6,7 +6,11 @@
 
     <div class="jbrowse-instance">
       <h3><?php print l($instance->title, $instance->url); ?></h3>
-      <p><?php print $instance->description; ?></p>
+      <p><?php
+      if(property_exists($instance, 'analysis')) {
+        print 'Analysis: ' . $instance->analysis->name . "<br>";
+      }
+      print $instance->description; ?></p>
       <span class="jbrowse-launch-link"><?php print l('Launch JBrowse', $instance->url); ?></span>
     </div>