Mercurial > repos > yating-l > jbrowsearchivecreator
comparison TrackHub.py @ 0:8d1cf7ce65cd draft
planemo upload for repository https://github.com/Yating-L/jbrowse-archive-creator.git commit d583ac16a6c6942730ea536eb59cc37941816030-dirty
| author | yating-l |
|---|---|
| date | Thu, 18 May 2017 17:25:33 -0400 |
| parents | |
| children | 91b3558fa73f |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:8d1cf7ce65cd |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 | |
| 3 import os | |
| 4 import subprocess | |
| 5 import shutil | |
| 6 import json | |
| 7 import utils | |
| 8 | |
| 9 | |
| 10 class TrackHub: | |
| 11 def __init__(self, inputFiles, reference, outputDirect, tool_dir, genome, extra_files_path, metaData, jbrowse_host): | |
| 12 self.input_files = inputFiles.tracks | |
| 13 self.outfile = outputDirect | |
| 14 self.outfolder = extra_files_path | |
| 15 self.out_path = os.path.join(extra_files_path, genome) | |
| 16 self.reference = reference | |
| 17 self.tool_dir = tool_dir | |
| 18 self.metaData = metaData | |
| 19 self.raw = os.path.join(self.out_path, 'raw') | |
| 20 self.json = os.path.join(self.out_path, 'json') | |
| 21 self.jbrowse_host = jbrowse_host | |
| 22 try: | |
| 23 if os.path.exists(self.json): | |
| 24 shutil.rmtree(self.json) | |
| 25 os.makedirs(self.json) | |
| 26 except OSError as e: | |
| 27 print "Cannot create json folder error({0}): {1}".format(e.errno, e.strerror) | |
| 28 else: | |
| 29 print "Create jbrowse folder {}".format(self.out_path) | |
| 30 | |
| 31 def createHub(self): | |
| 32 self.prepareRefseq() | |
| 33 for input_file in self.input_files: | |
| 34 self.addTrack(input_file) | |
| 35 self.indexName() | |
| 36 slink = self.makeArchive() | |
| 37 self.outHtml(slink) | |
| 38 print "Success!\n" | |
| 39 | |
| 40 def prepareRefseq(self): | |
| 41 try: | |
| 42 #print os.path.join(self.tool_dir, 'prepare-refseqs.pl') + ", '--fasta', " + self.reference +", '--out', self.json])" | |
| 43 subprocess.call(['prepare-refseqs.pl', '--fasta', self.reference, '--out', self.json]) | |
| 44 except OSError as e: | |
| 45 print "Cannot prepare reference error({0}): {1}".format(e.errno, e.strerror) | |
| 46 #TODO: hard coded the bam and bigwig tracks. Need to allow users to customize the settings | |
| 47 def addTrack(self, track): | |
| 48 #print "false_path" , track['false_path'] | |
| 49 if track['false_path'] in self.metaData.keys(): | |
| 50 metadata = self.metaData[track['false_path']] | |
| 51 else: | |
| 52 metadata = {} | |
| 53 self.SetMetadata(track, metadata) | |
| 54 if track['dataType'] == 'bam': | |
| 55 self.Bam(track, metadata) | |
| 56 # print "add bam track\n" | |
| 57 elif track['dataType'] == 'bigwig': | |
| 58 self.BigWig(track, metadata) | |
| 59 else: | |
| 60 flat_file = os.path.join(self.raw, track['fileName']) | |
| 61 if track['dataType'] == 'bed': | |
| 62 subprocess.call(['flatfile-to-json.pl', '--bed', flat_file, '--trackType', metadata['type'], '--trackLabel', metadata['label'], '--Config', '{"category" : "%s"}' % metadata['category'], '--clientConfig', '{"color" : "%s"}' % metadata['color'], '--out', self.json]) | |
| 63 elif track['dataType'] == 'bedSpliceJunctions' or track['dataType'] == 'gtf' or track['dataType'] == 'blastxml': | |
| 64 subprocess.call(['flatfile-to-json.pl', '--gff', flat_file, '--trackType', metadata['type'], '--trackLabel', metadata['label'], '--Config', '{"glyph": "JBrowse/View/FeatureGlyph/Segments", "category" : "%s"}' % metadata['category'], '--clientConfig', '{"color" : "%s"}' % metadata['color'], '--out', self.json]) | |
| 65 elif track['dataType'] == 'gff3_transcript': | |
| 66 subprocess.call(['flatfile-to-json.pl', '--gff', flat_file, '--trackType', metadata['type'], '--trackLabel', metadata['label'], '--Config', '{"transcriptType": "transcript", "category" : "%s"}' % metadata['category'], '--clientConfig', '{"color" : "%s"}' % metadata['color'], '--out', self.json]) | |
| 67 else: | |
| 68 subprocess.call(['flatfile-to-json.pl', '--gff', flat_file, '--trackType', metadata['type'], '--trackLabel', metadata['label'], '--Config', '{"category" : "%s"}' % metadata['category'], '--clientConfig', '{"color" : "%s"}' % metadata['color'], '--out', self.json]) | |
| 69 | |
| 70 def indexName(self): | |
| 71 subprocess.call(['generate-names.pl', '-v', '--out', self.json]) | |
| 72 print "finished name index \n" | |
| 73 | |
| 74 def makeArchive(self): | |
| 75 shutil.make_archive(self.out_path, 'zip', self.out_path) | |
| 76 file_dir = os.path.abspath(self.outfile) | |
| 77 source_dir = os.path.dirname(file_dir) | |
| 78 folder_name = os.path.basename(self.outfolder) | |
| 79 source_name = os.path.basename(self.out_path) | |
| 80 source = os.path.join(source_dir, folder_name, source_name) | |
| 81 slink = source.replace('/', '_') | |
| 82 slink = os.path.join('/var/www/html/JBrowse-1.12.1/data', slink) | |
| 83 try: | |
| 84 if os.path.islink(slink): | |
| 85 os.unlink(slink) | |
| 86 except OSError as oserror: | |
| 87 print "Cannot create symlink to the data({0}): {1}".format(oserror.errno, oserror.strerror) | |
| 88 os.symlink(source, slink) | |
| 89 return slink | |
| 90 | |
| 91 #TODO: this will list all zip files in the filedir and sub-dirs. worked in Galaxy but all list zip files in test-data when | |
| 92 #run it locally. May need modify | |
| 93 def outHtml(self, slink): | |
| 94 with open(self.outfile, 'w') as htmlfile: | |
| 95 htmlstr = 'The JBrowse Hub is created: <br>' | |
| 96 zipfiles = '<li><a href = "%s">Download</a></li>' | |
| 97 url = self.jbrowse_host + "/JBrowse-1.12.1/index.html?data=%s" | |
| 98 jbrowse_hub = '<li><a href = "%s" target="_blank">View JBrowse Hub</a></li>' % url | |
| 99 filedir_abs = os.path.abspath(self.outfile) | |
| 100 filedir = os.path.dirname(filedir_abs) | |
| 101 filedir = os.path.join(filedir, self.outfolder) | |
| 102 for root, dirs, files in os.walk(filedir): | |
| 103 for file in files: | |
| 104 if file.endswith('.zip'): | |
| 105 relative_directory = os.path.relpath(root, filedir) | |
| 106 relative_file_path = os.path.join(relative_directory, file) | |
| 107 htmlstr += zipfiles % relative_file_path | |
| 108 link_name = os.path.basename(slink) | |
| 109 relative_path = os.path.join('data', link_name + '/json') | |
| 110 htmlstr += jbrowse_hub % relative_path | |
| 111 htmlfile.write(htmlstr) | |
| 112 | |
| 113 def createTrackList(self): | |
| 114 trackList = os.path.join(self.json, "trackList.json") | |
| 115 if not os.path.exists(trackList): | |
| 116 os.mknod(trackList) | |
| 117 | |
| 118 def Bam(self, track, metadata): | |
| 119 #create trackList.json if not exist | |
| 120 self.createTrackList() | |
| 121 json_file = os.path.join(self.json, "trackList.json") | |
| 122 bam_track = dict() | |
| 123 bam_track['type'] = 'JBrowse/View/Track/Alignments2' | |
| 124 bam_track['storeClass'] = 'JBrowse/Store/SeqFeature/BAM' | |
| 125 bam_track['urlTemplate'] = os.path.join('../raw', track['fileName']) | |
| 126 bam_track['baiUrlTemplate'] = os.path.join('../raw', track['index']) | |
| 127 bam_track['label'] = metadata['label'] | |
| 128 bam_track['category'] = metadata['category'] | |
| 129 bam_track = json.dumps(bam_track) | |
| 130 #Use add-track-json.pl to add bam track to json file | |
| 131 new_track = subprocess.Popen(['echo', bam_track], stdout=subprocess.PIPE) | |
| 132 subprocess.call(['add-track-json.pl', json_file], stdin=new_track.stdout) | |
| 133 | |
| 134 def BigWig(self, track, metadata): | |
| 135 #create trackList.json if not exist | |
| 136 self.createTrackList() | |
| 137 json_file = os.path.join(self.json, "trackList.json") | |
| 138 bigwig_track = dict() | |
| 139 bigwig_track['urlTemplate'] = os.path.join('../raw', track['fileName']) | |
| 140 bigwig_track['type'] = 'JBrowse/View/Track/Wiggle/XYPlot' | |
| 141 bigwig_track['storeClass'] = 'JBrowse/Store/SeqFeature/BigWig' | |
| 142 bigwig_track['label'] = metadata['label'] | |
| 143 bigwig_track['style'] = metadata['style'] | |
| 144 bigwig_track['category'] = metadata['category'] | |
| 145 bigwig_track = json.dumps(bigwig_track) | |
| 146 #Use add-track-json.pl to add bigwig track to json file | |
| 147 new_track = subprocess.Popen(['echo', bigwig_track], stdout=subprocess.PIPE) | |
| 148 #output = new_track.communicate()[0] | |
| 149 subprocess.call(['add-track-json.pl', json_file], stdin=new_track.stdout) | |
| 150 | |
| 151 #If the metadata is not set, use the default value | |
| 152 def SetMetadata(self, track, metadata): | |
| 153 if 'label' not in metadata.keys() or metadata['label'] == '': | |
| 154 metadata['label'] = track['fileName'] | |
| 155 if 'color' not in metadata.keys() or metadata['color'] == '': | |
| 156 metadata['color'] = "#daa520" | |
| 157 if track['dataType'] == 'bigwig': | |
| 158 if 'style' not in metadata.keys(): | |
| 159 metadata['style'] = {} | |
| 160 if 'pos_color' not in metadata['style'] or metadata['style']['pos_color'] == '': | |
| 161 metadata['style']['pos_color'] = "#FFA600" | |
| 162 if 'neg_color' not in metadata['style'] or metadata['style']['neg_color'] == '': | |
| 163 metadata['style']['neg_color'] = "#005EFF" | |
| 164 if 'category' not in metadata.keys() or metadata['category'] == '': | |
| 165 metadata['category'] = "Default group" | |
| 166 if track['dataType'] == 'blastxml': | |
| 167 metadata['type'] = "G-OnRamp_plugin/BlastAlignment" | |
| 168 elif track['dataType'] == 'gff3_transcript' or track['dataType'] == 'gff3_mrna': | |
| 169 metadata['type'] = "G-OnRamp_plugin/GenePred" | |
| 170 else: | |
| 171 metadata['type'] = "CanvasFeatures" | |
| 172 | |
| 173 | |
| 174 | |
| 175 | |
| 176 | |
| 177 | |
| 178 |
