annotate data_manager/fetch_mlst_data.py @ 4:577ff220eaea draft default tip

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