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 |