Mercurial > repos > iuc > data_manager_primer_scheme_bedfiles
comparison data_manager/install_primer_scheme_bedfiles.py @ 0:ae730ecdc7e7 draft
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/data_managers/data_manager_primer_scheme_bedfiles commit f78536f45aa5ce801251a9725e468a47de1be44a"
author | iuc |
---|---|
date | Sun, 19 Apr 2020 09:22:19 -0400 |
parents | |
children | cce5d9327cd6 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:ae730ecdc7e7 |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 from __future__ import print_function, division | |
4 | |
5 import argparse | |
6 import json | |
7 import os | |
8 import os.path | |
9 import re | |
10 import sys | |
11 import shutil | |
12 | |
13 import requests | |
14 | |
15 DATA_TABLE_NAME = "primer_scheme_bedfiles" | |
16 | |
17 | |
18 def fetch_artic_primers(output_directory, primers): | |
19 primer_sets = { | |
20 "ARTICv1": "https://raw.githubusercontent.com/artic-network/artic-ncov2019/master/primer_schemes/nCoV-2019/V1/nCoV-2019.bed", | |
21 "ARTICv2": "https://raw.githubusercontent.com/artic-network/artic-ncov2019/master/primer_schemes/nCoV-2019/V2/nCoV-2019.bed", | |
22 "ARTICv3": "https://raw.githubusercontent.com/artic-network/artic-ncov2019/master/primer_schemes/nCoV-2019/V3/nCoV-2019.bed", | |
23 } | |
24 | |
25 data = [] | |
26 for name, url in primer_sets.items(): | |
27 if name not in primers: | |
28 continue | |
29 response = requests.get(url) | |
30 if response.status_code != 200: | |
31 print( | |
32 "Error: download of", | |
33 url, | |
34 "failed with code", | |
35 response.status_code, | |
36 file=sys.stderr, | |
37 ) | |
38 exit(response.status_code) | |
39 bed_output_filename = os.path.join(output_directory, name + ".bed") | |
40 open(bed_output_filename, "w").write(response.text) | |
41 description = name[:-2] + " " + name[-2:] + " primer set" | |
42 data.append(dict(value=name, path=bed_output_filename, description=description)) | |
43 return data | |
44 | |
45 | |
46 def install_primer_file( | |
47 output_directory, input_filename, primer_name, primer_description | |
48 ): | |
49 name = re.sub(r"\W", "", str(primer_name).replace(" ", "_")) | |
50 output_filename = os.path.join(output_directory, name + ".bed") | |
51 shutil.copyfile(input_filename, output_filename) | |
52 data = [dict(value=name, description=primer_description, path=output_filename)] | |
53 return data | |
54 | |
55 | |
56 class SplitArgs(argparse.Action): | |
57 def __call__(self, parser, namespace, values, option_string=None): | |
58 setattr(namespace, self.dest, values.split(",")) | |
59 | |
60 | |
61 if __name__ == "__main__": | |
62 parser = argparse.ArgumentParser( | |
63 description="Fetch ARTIC SARS-CoV-2 primer files for Galaxy/IRIDA use" | |
64 ) | |
65 parser.add_argument( | |
66 "--output_directory", default="tmp", help="Directory to write output to" | |
67 ) | |
68 primer_file = parser.add_argument_group() | |
69 primer_file.add_argument( | |
70 "--primer_file", help="BED format file containing primer scheme" | |
71 ) | |
72 primer_file.add_argument( | |
73 "--primer_name", | |
74 help="Name of primer scheme (one word). Required if --primer_file is used", | |
75 ) | |
76 primer_file.add_argument( | |
77 "--primer_description", | |
78 help="Description of primer scheme. Required if --primer_file is used", | |
79 ) | |
80 artic = parser.add_argument_group() | |
81 artic.add_argument( | |
82 "--artic_primers", | |
83 action=SplitArgs, | |
84 help="Comma separated list of primers to fetch", | |
85 ) | |
86 parser.add_argument( | |
87 "galaxy_datamanager_filename", | |
88 help="Galaxy JSON format file describing data manager inputs", | |
89 ) | |
90 args = parser.parse_args() | |
91 | |
92 if args.artic_primers is None and args.primer_file is None: | |
93 print( | |
94 "One of --artic_primers or --primer_file + --primer_name + --primer_description is required.", | |
95 file=sys.stderr, | |
96 ) | |
97 exit(1) | |
98 elif args.primer_file is not None and ( | |
99 args.primer_name is None or args.primer_description is None | |
100 ): | |
101 print( | |
102 "If --primer_file is used --primer_name and --primer_description is also required", | |
103 file=sys.stderr, | |
104 ) | |
105 exit(1) | |
106 elif args.primer_file is not None and args.artic_primers is not None: | |
107 print( | |
108 "Only one of --artic_primers or --primer_file + --primer_name + --primer_description can be chosen" | |
109 ) | |
110 exit(1) | |
111 | |
112 config = json.load(open(args.galaxy_datamanager_filename)) | |
113 output_directory = config.get("output_data", [{}])[0].get("extra_files_path", None) | |
114 if output_directory is None: | |
115 output_directory = args.output_directory | |
116 | |
117 if not os.path.isdir(output_directory): | |
118 os.makedirs(output_directory) | |
119 | |
120 data_manager_dict = {} | |
121 data_manager_dict["data_tables"] = json.load( | |
122 open(args.galaxy_datamanager_filename) | |
123 ).get("data_tables", {}) | |
124 data_manager_dict["data_tables"] = data_manager_dict.get("data_tables", {}) | |
125 data_manager_dict["data_tables"][DATA_TABLE_NAME] = data_manager_dict[ | |
126 "data_tables" | |
127 ].get(DATA_TABLE_NAME, []) | |
128 | |
129 if args.artic_primers: | |
130 data = fetch_artic_primers(output_directory, args.artic_primers) | |
131 else: | |
132 data = install_primer_file( | |
133 output_directory, | |
134 args.primer_file, | |
135 args.primer_name, | |
136 args.primer_description, | |
137 ) | |
138 | |
139 data_manager_dict["data_tables"][DATA_TABLE_NAME].extend(data) | |
140 print(data_manager_dict) | |
141 json.dump(data_manager_dict, open(args.galaxy_datamanager_filename, "w")) |