annotate data_manager/data_manager_snpsift_dbnsfp.py @ 0:da5d5dc2e55c draft default tip

Uploaded
author jjohnson
date Wed, 09 Dec 2015 13:58:01 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
1 #!/usr/bin/env python
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
2
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
3 import sys
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
4 import os
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
5 import re
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
6 import optparse
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
7 import urllib
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
8 import tarfile
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
9 import gzip
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
10 import json
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
11 import pysam
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
12 from pysam import ctabix
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
13 import zipfile
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
14 import os.path
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
15 import shutil
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
16
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
17 """
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
18 # Install dbNSFP databases
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
19 # from DbNsfp site
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
20 # Download dbNSFP database
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
21 $ wget ftp://dbnsfp:dbnsfp@dbnsfp.softgenetics.com/dbNSFPv2.4.zip
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
22 # Uncompress
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
23 $ unzip dbNSFP2.4.zip
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
24 # Create a single file version
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
25 $ (head -n 1 dbNSFP2.4_variant.chr1 ; cat dbNSFP2.4_variant.chr* | grep -v "^#") > dbNSFP2.4.txt
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
26 # Compress using block-gzip algorithm
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
27 bgzip dbNSFP2.4.txt
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
28 # Create tabix index
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
29 tabix -s 1 -b 2 -e 2 dbNSFP2.4.txt.gz
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
30
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
31 data_table:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
32
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
33 <table name="snpsift_dbnsfps" comment_char="#">
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
34 <columns>key, build, name, value, annotations</columns>
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
35 <file path="tool-data/snpsift_dbnsfps.loc" />
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
36 </table>
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
37
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
38 #id build description path annotations
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
39 #GRCh37_dbNSFP2.4 GRCh37 GRCh37 dbNSFP2.4 /depot/snpeff/dbNSFP2.4.gz SIFT_pred,Uniprot_acc
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
40 #GRCh38_dbNSFP2.7 GRCh38 GRCh38 dbNSFP2.7 /depot/snpeff/dbNSFP2.7.gz SIFT_pred,Uniprot_acc
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
41
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
42 """
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
43
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
44
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
45 data_table = 'snpsift_dbnsfps'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
46 softgenetics_url = 'ftp://dbnsfp:dbnsfp@dbnsfp.softgenetics.com/'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
47 dbNSFP_file_pat = '(dbNSFP(.*)_variant|dbscSNV(.*)).chr(.*)'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
48 tokenize = re.compile(r'(\d+)|(\D+)').findall
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
49 dbNSFP_name_pat = 'dbNSFP(v|_light)?(\d*).*?'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
50
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
51
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
52 def stop_err(msg):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
53 sys.stderr.write(msg)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
54 sys.exit(1)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
55
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
56 def get_nsfp_genome_version(name):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
57 genome_version = 'hg19'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
58 dbNSFP_name_pat = '(dbscSNV|dbNSFP(v|_light)?)(\d*).*?'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
59 m = re.match(dbNSFP_name_pat,name)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
60 if m:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
61 (base,mid,ver) = m.groups()
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
62 if base == 'dbscSNV':
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
63 genome_version = 'hg19'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
64 else:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
65 genome_version = 'hg38' if ver == '3' else 'hg19' if ver == '2' else 'hg18'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
66 return genome_version
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
67
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
68 def get_annotations(gzip_path):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
69 annotations = None
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
70 fh = None
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
71 try:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
72 fh = gzip.open(gzip_path, 'r')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
73 buf = fh.read(10000)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
74 lines = buf.splitlines()
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
75 headers = lines[0].split('\t')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
76 annotations = ','.join([x.strip() for x in headers[4:]])
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
77 except Exception, e:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
78 stop_err('Error Reading annotations %s : %s' % (gzip_path, e))
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
79 finally:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
80 if fh:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
81 fh.close()
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
82 return annotations
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
83
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
84
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
85 def tabix_file(input_fname, output_fname):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
86 print >> sys.stdout, "tabix_file: %s -> %s" % (input_fname, output_fname)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
87 ctabix.tabix_compress(input_fname, output_fname, force=True)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
88 # Column indices are 0-based.
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
89 ctabix.tabix_index(output_fname, seq_col=0, start_col=1, end_col=1)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
90
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
91
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
92 def natural_sortkey(string):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
93 return tuple(int(num) if num else alpha for num, alpha in tokenize(string))
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
94
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
95
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
96 def download_dbnsfp_database(url, output_file):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
97 dbnsfp_tsv = None
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
98 file_path = 'downloaded_file'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
99 urllib.urlretrieve(url, file_path)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
100 if zipfile.is_zipfile(file_path):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
101 dbnsfp_tsv = output_file if output_file else 'dbnsfp_tsv'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
102 wtr = open(dbnsfp_tsv, 'w')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
103 my_zip = zipfile.ZipFile(file_path, 'r')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
104 allfiles = [info.filename for info in my_zip.infolist()]
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
105 files = [f for f in allfiles if re.match(dbNSFP_file_pat, f)]
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
106 files = sorted(files, key=natural_sortkey)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
107 for j, file in enumerate(files):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
108 fh = my_zip.open(file, 'rU')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
109 for i, line in enumerate(fh):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
110 if j > 0 and i == 0:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
111 continue
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
112 wtr.write(line)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
113 return dbnsfp_tsv
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
114
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
115
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
116 def main():
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
117 # Parse Command Line
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
118 parser = optparse.OptionParser()
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
119 parser.add_option('-g', '--dbkey', dest='dbkey', action='store', type="string", default=None, help='dbkey genome version')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
120 parser.add_option('-n', '--db_name', dest='db_name', action='store', type="string", default=None, help='A name for a history snpsiftdbnsfp dataset')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
121 parser.add_option('-s', '--softgenetics', dest='softgenetics', action='store', type="string", default=None, help='A name for softgenetics dbNSFP file')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
122 parser.add_option('-H', '--snpsiftdbnsfp', dest='snpsiftdbnsfp', action='store', type="string", default=None, help='A history snpsiftdbnsfp dataset')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
123 parser.add_option('-T', '--dbnsfp_tabular', dest='dbnsfp_tabular', action='store', type="string", default=None, help='A history dbnsfp_tabular dataset')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
124 (options, args) = parser.parse_args()
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
125
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
126 filename = args[0]
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
127 params = json.loads(open(filename).read())
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
128 target_directory = params['output_data'][0]['extra_files_path']
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
129 if not os.path.exists(target_directory):
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
130 os.mkdir(target_directory)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
131 data_manager_dict = {}
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
132 genome_version = options.dbkey if options.dbkey else 'unknown'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
133 dbnsfp_tsv = None
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
134 db_name = None
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
135 bzip_name = None
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
136 bzip_path = None
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
137 if options.softgenetics:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
138 dbnsfp_url = softgenetics_url + options.softgenetics
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
139 db_name = options.db_name if options.db_name else re.sub('\.zip$', '', options.softgenetics)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
140 genome_version = get_nsfp_genome_version(options.softgenetics)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
141 tsv = db_name + '.tsv'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
142 dbnsfp_tsv = download_dbnsfp_database(dbnsfp_url, tsv)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
143 elif options.dbnsfp_tabular:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
144 db_name = options.db_name
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
145 dbnsfp_tsv = options.dbnsfp_tabular
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
146 elif options.snpsiftdbnsfp:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
147 (dirpath,bgzip_name) = os.path.split(options.snpsiftdbnsfp)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
148 idxpath = options.snpsiftdbnsfp + '.tbi'
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
149 shutil.copy(options.snpsiftdbnsfp,target_directory)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
150 shutil.copy(idxpath,target_directory)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
151 bzip_path = os.path.join(target_directory, bgzip_name)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
152 db_name = re.sub('(.txt)?.gz$','',bgzip_name)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
153 else:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
154 stop_err('Either --softgenetics or --dbnsfp_tabular required')
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
155 if dbnsfp_tsv:
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
156 bgzip_name = '%s.txt.gz' % db_name
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
157 bzip_path = os.path.join(target_directory, bgzip_name)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
158 tabix_file(dbnsfp_tsv,bzip_path)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
159 annotations = get_annotations(bzip_path)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
160 # Create the SnpSift dbNSFP Reference Data
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
161 data_table_entry = dict(key='%s_%s' % (genome_version, db_name), build=genome_version, name='%s %s' % (genome_version, db_name), value=bgzip_name, annotations=annotations)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
162 data_manager_dict['data_tables'] = data_manager_dict.get('data_tables', {})
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
163 data_manager_dict['data_tables'][data_table] = data_manager_dict['data_tables'].get(data_table, [])
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
164 data_manager_dict['data_tables'][data_table].append(data_table_entry)
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
165
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
166 # save info to json file
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
167 open(filename, 'wb').write(json.dumps(data_manager_dict))
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
168
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
169 if __name__ == "__main__":
da5d5dc2e55c Uploaded
jjohnson
parents:
diff changeset
170 main()