Repository 'jbrowsearchivecreator'
hg clone https://testtoolshed.g2.bx.psu.edu/repos/yating-l/jbrowsearchivecreator

Changeset 38:d17f629f5486 (2018-04-06)
Previous changeset 37:43909f065bee (2018-02-15) Next changeset 39:4a69515eed63 (2018-04-13)
Commit message:
planemo upload for repository https://github.com/Yating-L/jbrowse-archive-creator.git commit e4c1d387db160a3bf4a1e8abc288bdffbbbe2818-dirty
modified:
TrackHub.py
datatypes/Datatype.py
datatypes/interval/Interval.py
jbrowseArchiveCreator.xml
tool_dependencies.xml
tracks/CanvasFeatures.py
util/subtools.py
added:
tracks/IntervalFeatures.py
b
diff -r 43909f065bee -r d17f629f5486 TrackHub.py
--- a/TrackHub.py Thu Feb 15 16:54:36 2018 -0500
+++ b/TrackHub.py Fri Apr 06 13:44:56 2018 -0400
[
@@ -42,7 +42,7 @@
         # Init the Datatype 
         Datatype.pre_init(self.reference_genome, self.chromSizesFile,
                           self.extra_files_path, self.tool_directory,
-                          self.mySpecieFolderPath, self.myTracksFolderPath, self.myBinaryFolderPath, self.trackType)  
+                          self.mySpecieFolderPath, self.myTracksFolderPath, self.myFinalTracksFolderPath, self.myBinaryFolderPath, self.trackType)
 
         self._prepareRefseq()
         self.trackList = os.path.join(self.mySpecieFolderPath, "trackList.json")
@@ -66,8 +66,12 @@
         else: 
             if trackDbObject['trackType'] == 'HTMLFeatures':
                 self._customizeHTMLFeature(trackDbObject)
-            subtools.flatfile_to_json(trackDbObject['trackDataURL'], trackDbObject['dataType'], trackDbObject['trackType'], trackDbObject['trackLabel'], self.mySpecieFolderPath, trackDbObject['options'])
-
+                subtools.flatfile_to_json(trackDbObject['trackDataURL'], trackDbObject['dataType'], trackDbObject['trackType'], trackDbObject['trackLabel'], self.mySpecieFolderPath, trackDbObject['options'])
+            # Use Tabix index tracks by default for CanvasFeatures
+            # TODO: add support for HTMLFeatures
+            else:
+                subtools.generate_tabix_indexed_track(trackDbObject['trackDataURL'], trackDbObject['dataType'], self.myFinalTracksFolderPath)
+                subtools.add_track_json(self.trackList, trackDbObject['options'])
 
     def terminate(self, debug=False):
         """ Write html file """
@@ -163,23 +167,23 @@
             os.makedirs(myHubPath)
 
         # Create the specie folder
-        # TODO: Generate the name depending on the specie
         mySpecieFolderPath = os.path.join(myHubPath, self.genome_name)
         if not os.path.exists(mySpecieFolderPath):
             os.makedirs(mySpecieFolderPath)
         self.mySpecieFolderPath = mySpecieFolderPath
 
-        # We create the 2bit file while we just created the specie folder
-        #self.twoBitName = self.genome_name + ".2bit"
-        #self.two_bit_final_path = os.path.join(self.mySpecieFolderPath, self.twoBitName)
-        #shutil.copyfile(twoBitFile.name, self.two_bit_final_path)
-
-        # Create the folder tracks into the specie folder
+        # Create the folder named 'raw' inside the specie folder to place raw files
         tracksFolderPath = os.path.join(mySpecieFolderPath, "raw")
         if not os.path.exists(tracksFolderPath):
             os.makedirs(tracksFolderPath)
         self.myTracksFolderPath = tracksFolderPath
 
+        # Create the folder tracks into the specie folder
+        finalTracksFolderPath = os.path.join(mySpecieFolderPath, "tracks")
+        if not os.path.exists(finalTracksFolderPath):
+            os.makedirs(finalTracksFolderPath)
+        self.myFinalTracksFolderPath = finalTracksFolderPath
+
         myBinaryFolderPath = os.path.join(mySpecieFolderPath, 'bbi')
         if not os.path.exists(myBinaryFolderPath):
             os.makedirs(myBinaryFolderPath)
b
diff -r 43909f065bee -r d17f629f5486 datatypes/Datatype.py
--- a/datatypes/Datatype.py Thu Feb 15 16:54:36 2018 -0500
+++ b/datatypes/Datatype.py Fri Apr 06 13:44:56 2018 -0400
b
@@ -53,13 +53,14 @@
 
     @staticmethod
     def pre_init(reference_genome, chrom_sizes_file,
-                 extra_files_path, tool_directory, specie_folder, tracks_folder, binary_folder, track_type):
+                 extra_files_path, tool_directory, specie_folder, tracks_folder, final_tracks_folder, binary_folder, track_type):
         Datatype.extra_files_path = extra_files_path
         Datatype.tool_directory = tool_directory
 
         # TODO: All this should be in TrackHub and not in Datatype
         Datatype.mySpecieFolderPath = specie_folder
-        Datatype.myTrackFolderPath = tracks_folder
+        Datatype.myTrackFolderPath = tracks_folder  # temporary raw data files
+        Datatype.myFinalTrackFolderPath = final_tracks_folder # final tracks folder
         Datatype.myBinaryFolderPath = binary_folder
 
         Datatype.input_fasta_file = reference_genome
b
diff -r 43909f065bee -r d17f629f5486 datatypes/interval/Interval.py
--- a/datatypes/interval/Interval.py Thu Feb 15 16:54:36 2018 -0500
+++ b/datatypes/interval/Interval.py Fri Apr 06 13:44:56 2018 -0400
b
@@ -14,7 +14,7 @@
     def __init__(self):
         super(Interval, self).__init__()
         if not Datatype.trackType:
-            self.trackType = "HTMLFeatures"
+            self.trackType = "CanvasFeatures"
         else:
             self.trackType = Datatype.trackType
         logging.debug("Set default trackType = %s for feature tracks", self.trackType)
b
diff -r 43909f065bee -r d17f629f5486 jbrowseArchiveCreator.xml
--- a/jbrowseArchiveCreator.xml Thu Feb 15 16:54:36 2018 -0500
+++ b/jbrowseArchiveCreator.xml Fri Apr 06 13:44:56 2018 -0400
b
@@ -10,7 +10,8 @@
         <requirement type="package" version="1.9">numpy</requirement>
         <requirement type="package" version="1.68">biopython</requirement>
         <requirement type="package" version="340">ucsc_hac</requirement>
-        <requirement type="package" version="1.12.3">jbrowse_tools</requirement>
+        <requirement type="package" version="1.12.4">jbrowse_tools</requirement>
+        <requirement type="package" version="1.0">gff3sort</requirement>
     </requirements>
 
     <stdio>
b
diff -r 43909f065bee -r d17f629f5486 tool_dependencies.xml
--- a/tool_dependencies.xml Thu Feb 15 16:54:36 2018 -0500
+++ b/tool_dependencies.xml Fri Apr 06 13:44:56 2018 -0400
b
@@ -52,7 +52,7 @@
         </install>
     </package>
 
-    <package name="jbrowse_tools" version="1.12.3">
+    <package name="jbrowse_tools" version="1.12.4">
         <install version="1.0">
             <actions_group>
                 <actions architecture="x86_64" os="linux">
@@ -77,4 +77,23 @@
          <readme>The perl scripts for converting flat files to json.</readme>
     </package>
 
+    <package name="gff3sort" version="1.0">
+        <install version="1.0">
+            <actions_group>
+                <actions architecture="x86_64" os="linux">
+                <action type="download_by_url">https://github.com/billzt/gff3sort/archive/v0.1-alpha.zip</action>
+                    <action type="make_directory">$INSTALL_DIR/gff3sort</action>
+                    <action type="move_directory_files">
+                        <source_directory>.</source_directory>
+                        <destination_directory>$INSTALL_DIR/gff3sort</destination_directory>
+                    </action>
+                    <action type="set_environment">
+                        <environment_variable action="prepend_to" name="PATH">$INSTALL_DIR/gff3sort</environment_variable>
+                    </action>
+                </actions>
+            </actions_group>
+        </install>
+    <readme>A Perl Script to sort gff3 files and produce suitable results for tabix tools. </readme>
+    </package>
+
 </tool_dependency>
b
diff -r 43909f065bee -r d17f629f5486 tracks/CanvasFeatures.py
--- a/tracks/CanvasFeatures.py Thu Feb 15 16:54:36 2018 -0500
+++ b/tracks/CanvasFeatures.py Fri Apr 06 13:44:56 2018 -0400
[
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+import os
 import json
 import logging
 
@@ -11,22 +12,41 @@
         super(CanvasFeatures, self).__init__(trackName, trackLabel, trackDataURL, trackType, dataType, extraSettings)
 
     def prepareExtraSetting(self):
-        """ set CanvasFeatures configuration options """
-        extraConfigs = dict()
-        self.extraSettings["clientConfig"] = dict()
-        self.extraSettings["config"] = dict()
+        if 'category' not in self.extraSettings or not self.extraSettings['category']:
+            self.extraSettings['category'] = "Default group"
+        self.extraSettings['style'] = {}
+        self.extraSettings['style']['className'] = 'feature'
         if 'color' not in self.extraSettings or not self.extraSettings['color']:
-            self.extraSettings["clientConfig"]['color'] = "#daa520"
+            self.extraSettings['style']['color'] = "#FFA600"
         else:
-            self.extraSettings["clientConfig"]['color'] = self.extraSettings['color']
-        if 'category' not in self.extraSettings or not self.extraSettings['category']:
-            self.extraSettings["config"]['category'] = "Default group"
-        else:
-            self.extraSettings["config"]['category'] = self.extraSettings['category']
-        if 'glyph' in self.extraSettings:
-            self.extraSettings["config"]['glyph'] = self.extraSettings['glyph']
-        if 'transcriptType' in self.extraSettings:
-            self.extraSettings['config']['transcriptType'] = self.extraSettings['transcriptType']
-        extraConfigs["config"] = json.dumps(self.extraSettings["config"])
-        extraConfigs["clientConfig"] = json.dumps(self.extraSettings["clientConfig"])
-        return extraConfigs
\ No newline at end of file
+            self.extraSettings['style']['color'] = self.extraSettings['color']
+        track = dict()
+        track['type'] = 'JBrowse/View/Track/' + self.trackType
+        track['storeClass'] = 'JBrowse/Store/SeqFeature/GFF3Tabix'
+        track['urlTemplate'] = os.path.join('tracks', self.trackName)
+        track['label'] = self.trackLabel
+        track['category'] = self.extraSettings['category']
+        track['style'] = self.extraSettings['style']
+        extraConfigs = track
+        return extraConfigs
+
+    # def prepareExtraSetting(self):
+    #     """ set CanvasFeatures configuration options """
+    #     extraConfigs = dict()
+    #     self.extraSettings["clientConfig"] = dict()
+    #     self.extraSettings["config"] = dict()
+    #     if 'color' not in self.extraSettings or not self.extraSettings['color']:
+    #         self.extraSettings["clientConfig"]['color'] = "#daa520"
+    #     else:
+    #         self.extraSettings["clientConfig"]['color'] = self.extraSettings['color']
+    #     if 'category' not in self.extraSettings or not self.extraSettings['category']:
+    #         self.extraSettings["config"]['category'] = "Default group"
+    #     else:
+    #         self.extraSettings["config"]['category'] = self.extraSettings['category']
+    #     if 'glyph' in self.extraSettings:
+    #         self.extraSettings["config"]['glyph'] = self.extraSettings['glyph']
+    #     if 'transcriptType' in self.extraSettings:
+    #         self.extraSettings['config']['transcriptType'] = self.extraSettings['transcriptType']
+    #     extraConfigs["config"] = json.dumps(self.extraSettings["config"])
+    #     extraConfigs["clientConfig"] = json.dumps(self.extraSettings["clientConfig"])
+    #     return extraConfigs
\ No newline at end of file
b
diff -r 43909f065bee -r d17f629f5486 tracks/IntervalFeatures.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tracks/IntervalFeatures.py Fri Apr 06 13:44:56 2018 -0400
[
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+import json
+import logging
+import collections
+
+from TrackDb import TrackDb
+from util import subtools
+from util import santitizer
+
+class Features(TrackDb):
+    def __init__(self, trackName, trackLabel, trackDataURL, trackType, dataType, extraSettings=None):
+        super(Features, self).__init__(trackName, trackLabel, trackDataURL, trackType, dataType, extraSettings)
+
+    def prepareExtraSetting(self):
+        if self.trackType == 'HTMLFeatures':
+            self.prepareHTMLExtraSetting()
+        else:
+            self.prepareCanvasExtraSetting()
+
+    def prepareHTMLExtraSetting(self):
+        """ set HTMLFeatures configuration options """
+        extraConfigs = dict()
+        self.extraSettings["clientConfig"] = dict()
+        self.extraSettings["config"] = dict()
+        if 'type' in self.extraSettings:
+            extraConfigs["type"] = self.extraSettings['type']
+        if 'color' in self.extraSettings and self.extraSettings['color']:
+            extraConfigs['feature_color'] = self.extraSettings['color']
+        else:
+            extraConfigs['feature_color'] = "#000000"
+        #self.extraSettings['clientConfig']['color'] = self.extraSettings['color']
+        if 'subfeatureClasses' in self.extraSettings:
+            subfeature_css_class = santitizer.sanitize_name(self.trackLabel + "_" + self.extraSettings['subfeatureClasses'])
+            extraConfigs['subfeatureClasses'] = {self.extraSettings['subfeatureClasses']: subfeature_css_class}
+
+        if 'category' not in self.extraSettings or not self.extraSettings['category']:
+            self.extraSettings['config']['category'] = "Default group"
+        else:
+            self.extraSettings['config']['category'] = self.extraSettings['category']
+
+        extraConfigs['config'] = json.dumps(self.extraSettings["config"])
+        extraConfigs['clientConfig'] = json.dumps(self.extraSettings["clientConfig"])
+        return extraConfigs
+
+    def prepareCanvasExtraSetting(self):
+        """ set CanvasFeatures configuration options """
+        extraConfigs = dict()
+        self.extraSettings["clientConfig"] = dict()
+        self.extraSettings["config"] = dict()
+        if 'color' not in self.extraSettings or not self.extraSettings['color']:
+            self.extraSettings["clientConfig"]['color'] = "#daa520"
+        else:
+            self.extraSettings["clientConfig"]['color'] = self.extraSettings['color']
+        if 'category' not in self.extraSettings or not self.extraSettings['category']:
+            self.extraSettings["config"]['category'] = "Default group"
+        else:
+            self.extraSettings["config"]['category'] = self.extraSettings['category']
+        if 'glyph' in self.extraSettings:
+            self.extraSettings["config"]['glyph'] = self.extraSettings['glyph']
+        if 'transcriptType' in self.extraSettings:
+            self.extraSettings['config']['transcriptType'] = self.extraSettings['transcriptType']
+        extraConfigs["config"] = json.dumps(self.extraSettings["config"])
+        extraConfigs["clientConfig"] = json.dumps(self.extraSettings["clientConfig"])
+        return extraConfigs
+
+    def createTrackDb(self):
+        self.track_db = collections.OrderedDict([("track",self.trackName),
+                                                 ("trackLabel",self.trackLabel),
+                                                 ("trackDataURL",self.trackDataURL),
+                                                 ("dataType", self.dataType),
+                                                 ("trackType", self.trackType)]
+                                                )
+
+
+        htmlExtraConfigs = self.prepareHTMLExtraSetting()
+        self.logger.debug("Generate extraConfigs for htmlFeatures = %s", json.dumps(htmlExtraConfigs))
+        self.track_db["html"]["options"] = htmlExtraConfigs
+        canvasExtraConfigs = self.prepareCanvasExtraSetting()
+        self.logger.debug("Generate extraConfigs for canvasFeatures = %s", json.dumps(canvasExtraConfigs))
+        self.track_db["canvas"]["options"] = canvasExtraConfigs
+        self.logger.debug("TrackDb object is created track_db = %s ", json.dumps(self.track_db))
\ No newline at end of file
b
diff -r 43909f065bee -r d17f629f5486 util/subtools.py
--- a/util/subtools.py Thu Feb 15 16:54:36 2018 -0500
+++ b/util/subtools.py Fri Apr 06 13:44:56 2018 -0400
[
@@ -9,7 +9,7 @@
 import os
 import sys
 import tempfile
-import string
+import shutil
 import logging
 
 class PopenError(Exception):
@@ -229,6 +229,58 @@
     else:
         raise ValueError('Did not find bai file')
 
+def createFastaIndex(fastaFile):
+    subprocess.call(['samtools', 'faidx', fastaFile])
+    filename = fastaFile + '.fai'
+    if os.path.exists(filename):
+        return filename
+    else:
+        raise ValueError('Did not find fai file')
+
+def gff3sort(inputFile, outputFile, precise=False):
+    array_call = ['gff3sort.pl', inputFile, '>', outputFile]
+    if precise:
+        array_call.append('--precise')
+    p = _handleExceptionAndCheckCall(array_call)
+    return p
+
+def bedSort(inputFile, outputFile):
+    array_call = ['sort', '-k1,1', '-k2,2n', '-k6,6', inputFile, '>', outputFile]
+    p = _handleExceptionAndCheckCall(array_call)
+    return p
+
+def bgzip(inputFile):
+    subprocess.call(['bgzip', inputFile])
+    filename = inputFile + '.gz'
+    if os.path.exists(filename):
+        return filename
+    else:
+        raise ValueError('Did not find gz file')
+
+def createTabix(inputFile, dataType):
+    subprocess.call(['tabix', '-p', dataType, inputFile])
+    filename = inputFile + '.tbi'
+    if os.path.exists(filename):
+        return filename
+    else:
+        raise ValueError('Did not find tbi file')
+
+def generate_tabix_indexed_track(inputFile, dataType, outputFolder):
+    if "bed" in dataType:
+        fileType = 'bed'
+        sortedFile = tempfile.NamedTemporaryFile(bufsize=0)
+        bedSort(inputFile, sortedFile.name)
+    elif "gff" in dataType:
+        fileType = 'gff'
+        sortedFile = tempfile.NamedTemporaryFile(bufsize=0)
+        gff3sort(inputFile, sortedFile.name)
+    compressedFile = bgzip(sortedFile)
+    tabixFile = createTabix(compressedFile, fileType)
+    trackPath = os.path.join(outputFolder, inputFile)
+    trackIndexPath = os.path.join(outputFolder, inputFile+'.tbi')
+    shutil.copy(compressedFile, trackPath)
+    shutil.copy(tabixFile, trackIndexPath)
+
 def flatfile_to_json(inputFile, dataType, trackType, trackLabel, outputFolder, options=None, compress=True):
     if "bed" in dataType:
         fileType = "--bed"