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"))