# HG changeset patch
# User yating-l
# Date 1523036696 14400
# Node ID d17f629f5486099979dec572d78034f33f58cfb2
# Parent 43909f065beef0639184567b84e5497db90445fe
planemo upload for repository https://github.com/Yating-L/jbrowse-archive-creator.git commit e4c1d387db160a3bf4a1e8abc288bdffbbbe2818-dirty
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)
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
@@ -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
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
@@ -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)
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
@@ -10,7 +10,8 @@
numpy
biopython
ucsc_hac
- jbrowse_tools
+ jbrowse_tools
+ gff3sort
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
@@ -52,7 +52,7 @@
-
+
@@ -77,4 +77,23 @@
The perl scripts for converting flat files to json.
+
+
+
+
+ https://github.com/billzt/gff3sort/archive/v0.1-alpha.zip
+ $INSTALL_DIR/gff3sort
+
+ .
+ $INSTALL_DIR/gff3sort
+
+
+ $INSTALL_DIR/gff3sort
+
+
+
+
+ A Perl Script to sort gff3 files and produce suitable results for tabix tools.
+
+
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
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
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"