annotate data_manager/fetch_mlst_data.py @ 0:c01ac945b067 draft

Uploaded
author ulfschaefer
date Mon, 11 Jul 2016 05:23:33 -0400
parents
children 577ff220eaea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
1 #!/usr/bin/env python
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
2
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
3 '''
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
4 Download MLST datasets from this site: http://pubmlst.org/data/ by
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
5 parsing an xml file (http://pubmlst.org/data/dbases.xml).
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
6
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
7 Data is downloaded for a species determined by the user:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
8 - profiles (maps STs to allele numbers)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
9 - numbered sequences for each locus in the scheme
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
10
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
11 In addition, the alleles are concatenated together for use with SRST2.
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
12
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
13 A log file is also generated in the working directory, detailing the
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
14 time, date and location of all files downloaded, as well as the <retrieved>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
15 tag which tells us when the XML entry was last updated.
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
16
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
17 If the species name input by the user matches multiple <species> in the
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
18 xml file, the script simply reports the possible matches so the user can
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
19 try again.
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
20 '''
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
21
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
22 """
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
23 - Remove empty line at the end of profiles.txt file.
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
24 - Ensure the allele names at the profiles.txt file don't contain "_".
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
25
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
26 """
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
27 from argparse import ArgumentParser
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
28 import xml.dom.minidom as xml
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
29 import urllib2 as url
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
30 import re
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
31 import os
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
32 import sys
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
33 import glob
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
34 import csv
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
35 import shutil
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
36 from urlparse import urlparse
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
37 import time
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
38 import subprocess
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
39
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
40 try:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
41 from galaxy.util.json import from_json_string, to_json_string
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
42 has_galaxy = True
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
43 except ImportError:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
44 sys.stderr.write("Will download some stuff to the current dir but can't do Galaxy stuff!")
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
45 has_galaxy = False
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
46
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
47 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
48
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
49 def parse_args():
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
50 parser = ArgumentParser(description='Download MLST datasets by species'
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
51 'from pubmlst.org.')
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
52
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
53 parser.add_argument('--repository_url',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
54 metavar = 'URL',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
55 default = 'http://pubmlst.org/data/dbases.xml',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
56 help = 'URL for MLST repository XML index')
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
57
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
58 parser.add_argument('--species',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
59 metavar = 'NAME',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
60 required = True,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
61 help = 'The name of the species that you want to download (e.g. "Escherichia coli")')
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
62
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
63 parser.add_argument('--outfile',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
64 metavar = 'FILE',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
65 required = True,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
66 help = 'The name of the Json file to write that galaxy stuff to.')
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
67
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
68 parser.add_argument('--reference',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
69 metavar = 'ACCESSION',
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
70 required = True,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
71 help = 'NCBI accession number of the reference genome to use for flanking regions.')
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
72
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
73 return parser.parse_args()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
74
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
75 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
76
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
77 def main():
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
78
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
79 """
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
80 <species>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
81 Achromobacter spp.
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
82 <mlst>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
83 <database>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
84 <url>http://pubmlst.org/achromobacter</url>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
85 <retrieved>2015-08-11</retrieved>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
86 <profiles>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
87 <count>272</count>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
88 <url>http://pubmlst.org/data/profiles/achromobacter.txt</url>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
89 </profiles>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
90 <loci>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
91 <locus>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
92 nusA
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
93 <url>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
94 http://pubmlst.org/data/alleles/achromobacter/nusA.tfa
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
95 </url>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
96 </locus>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
97 <locus>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
98 rpoB
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
99 <url>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
100 http://pubmlst.org/data/alleles/achromobacter/rpoB.tfa
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
101 </url>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
102 </locus>
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
103 """
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
104
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
105 args = parse_args()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
106 docFile = url.urlopen(args.repository_url) # url address #args.repository_url =http://pubmlst.org/data/dbases.xml
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
107
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
108 doc = xml.parse(docFile)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
109 root = doc.childNodes[0]
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
110 found_species = []
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
111
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
112 if args.species == "Escherichia coli":
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
113 args.species = "Escherichia coli#1"
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
114 elif args.species == "Acinetobacter baumannii":
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
115 args.species = "Acinetobacter baumannii#1"
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
116 elif args.species == "Pasteurella multocida":
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
117 args.species = "Pasteurella multocida#1"
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
118 else:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
119 pass
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
120
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
121 for species_node in root.getElementsByTagName('species'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
122 info = getSpeciesInfo(species_node, args.species)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
123 if info != None:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
124 found_species.append(info)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
125
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
126 if len(found_species) == 0:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
127 sys.stderr.write("No species matched your query.\n")
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
128 exit(1)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
129
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
130 if len(found_species) > 1:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
131 sys.stderr.write("The following %i species match your query, please be more specific:\n" % (len(found_species)))
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
132 for info in found_species:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
133 sys.stderr.write(info.name + '\n')
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
134 exit(2)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
135
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
136 # output information for the single matching species
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
137 assert len(found_species) == 1
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
138 species_info = found_species[0]
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
139 species_name_underscores = species_info.name.replace(' ', '_')
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
140 timestamp = time.strftime("%Y%m%d%H%M%S")
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
141
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
142 params = None
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
143 if has_galaxy == True:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
144 params = from_json_string(open(args.outfile).read())
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
145 folder = os.path.join(params['output_data'][0]['extra_files_path'], species_name_underscores, timestamp)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
146 else:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
147 folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), species_name_underscores, timestamp)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
148
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
149 if not os.path.isdir(folder):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
150 os.makedirs(folder)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
151
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
152 profile_doc = url.urlopen(species_info.profiles_url)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
153 with open(os.path.join(folder, 'profiles.txt'), 'w') as f:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
154 sys.stdout.write("Writing to %s\n" % (os.path.join(folder, 'profiles.txt')))
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
155 for line in profile_doc.readlines():
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
156 cols = line.split("\t")
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
157 f.write("%s\n" % ('\t'.join(cols[0:8])))
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
158 profile_doc.close()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
159
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
160 for locus in species_info.loci:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
161 locus_path = urlparse(locus.url).path
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
162 locus_filename = locus_path.split('/')[-1]
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
163 locus_filename = locus_filename.replace("_.tfa", ".fas")
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
164 locus_filename = locus_filename.replace("tfa", "fas")
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
165 locus_doc = url.urlopen(locus.url)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
166 with open(os.path.join(folder, locus_filename), 'w') as locus_file:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
167 locus_fasta_content = locus_doc.read()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
168 locus_fasta_content = locus_fasta_content.replace("_","-").replace("--","-")
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
169 sys.stdout.write("Writing to %s\n" % (os.path.join(folder, locus_filename)))
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
170 locus_file.write(locus_fasta_content)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
171 locus_doc.close()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
172
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
173 get_reference(folder, args.reference)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
174
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
175
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
176 # do Galaxy stuff
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
177 if has_galaxy == True:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
178 data_manager_dict = {}
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
179 data_manager_dict['data_tables'] = {}
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
180 name = "%s-%s" % (species_info.name, timestamp)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
181 data_manager_dict['data_tables']['mlst_data'] = [dict(value=species_name_underscores,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
182 dbkey=species_name_underscores,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
183 name=name,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
184 time_stamp=timestamp,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
185 file_path=folder)]
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
186 #save info to json file
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
187 with open(args.outfile, 'wb') as fjson:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
188 fjson.write(to_json_string(data_manager_dict))
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
189
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
190 # end of main --------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
191
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
192 def get_reference(folder, acc):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
193
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
194 # We're getting this file from Japan!
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
195 # It seems to work pretty well until they take down or change their website
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
196 # See: http://www.ncbi.nlm.nih.gov/pubmed/20472643
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
197 refurl = 'http://togows.dbcls.jp/entry/ncbi-nucleotide/%s.fasta' % (acc)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
198 remote_ref = url.urlopen(refurl)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
199 ref_filename = os.path.join(folder, 'reference.seq')
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
200 with open(ref_filename, 'wb') as fRef:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
201 fRef.write(remote_ref.read())
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
202 remote_ref.close()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
203
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
204 cmd = "makeblastdb -in %s -dbtype nucl -out %s" \
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
205 % (ref_filename, ref_filename.replace("reference.seq", "reference"))
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
206 p = subprocess.Popen(cmd,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
207 shell=True,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
208 stdin=None,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
209 stdout=subprocess.PIPE,
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
210 stderr=subprocess.PIPE, close_fds=True)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
211 p.wait()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
212
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
213 return
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
214
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
215 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
216
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
217 # test if a node is an Element and that it has a specific tag name
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
218 def testElementTag(node, name):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
219 return node.nodeType == node.ELEMENT_NODE and node.localName == name
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
220
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
221 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
222
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
223 # Get the text from an element node with a text node child
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
224 def getText(element):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
225 result = ''
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
226 for node in element.childNodes:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
227 if node.nodeType == node.TEXT_NODE:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
228 result += node.data
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
229 return normaliseText(result)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
230
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
231 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
232
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
233 # remove unwanted whitespace including linebreaks etc.
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
234 def normaliseText(str):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
235 return ' '.join(str.split())
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
236
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
237 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
238
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
239 # A collection of interesting information about a taxa
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
240 class SpeciesInfo(object):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
241 def __init__(self):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
242 self.name = None # String name of species
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
243 self.database_url = None # URL as string
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
244 self.retrieved = None # date as string
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
245 self.profiles_url = None # URL as string
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
246 self.profiles_count = None # positive integer
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
247 self.loci = [] # list of loci
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
248
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
249 def __str__(self):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
250 s = "Name: %s\n" % self.name
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
251 s += "Database URL: %s\n" % self.database_url
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
252 s += "Retrieved: %s\n" % self.retrieved
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
253 s += "Profiles URL: %s\n" % self.profiles_url
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
254 s += "Profiles count: %s\n" % self.profiles_count
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
255 s += "Loci: %s\n" % (','.join([str(x) for x in self.loci]))
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
256 return s
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
257
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
258 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
259
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
260 class LocusInfo(object):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
261 def __init__(self):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
262 self.url = None
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
263 self.name = None
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
264 def __str__(self):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
265 return "Locus: name:%s,url:%s" % (self.name, self.url)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
266
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
267 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
268
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
269 # retrieve the interesting information for a given sample element
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
270 def getSpeciesInfo(species_node, species):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
271 this_name = getText(species_node)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
272 print this_name
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
273 if this_name.startswith(species):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
274 info = SpeciesInfo()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
275 info.name = this_name
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
276 for mlst_node in species_node.getElementsByTagName('mlst'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
277 for database_node in mlst_node.getElementsByTagName('database'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
278 for database_child_node in database_node.childNodes:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
279 if testElementTag(database_child_node, 'url'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
280 info.database_url = getText(database_child_node)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
281 elif testElementTag(database_child_node, 'retrieved'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
282 info.retrieved = getText(database_child_node)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
283 elif testElementTag(database_child_node, 'profiles'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
284 for profile_count in database_child_node.getElementsByTagName('count'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
285 info.profiles_count = getText(profile_count)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
286 for profile_url in database_child_node.getElementsByTagName('url'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
287 info.profiles_url = getText(profile_url)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
288 elif testElementTag(database_child_node, 'loci'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
289 for locus_node in database_child_node.getElementsByTagName('locus'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
290 locus_info = LocusInfo()
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
291 locus_info.name = getText(locus_node)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
292 for locus_url in locus_node.getElementsByTagName('url'):
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
293 locus_info.url = getText(locus_url)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
294 info.loci.append(locus_info)
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
295
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
296 return info
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
297 else:
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
298 return None
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
299
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
300 # --------------------------------------------------------------------------------------------------
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
301
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
302 if __name__ == '__main__':
c01ac945b067 Uploaded
ulfschaefer
parents:
diff changeset
303 main()