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