Codebase list fastaq / b3417d8
Merge tag 'upstream/1.6.0' Upstream version 1.6.0 Andreas Tille 9 years ago
24 changed file(s) with 76 addition(s) and 1155 deletion(s). Raw diff Collapse all Expand all
+0
-5
debian/changelog less more
0 fastaq (1.5.0-1) unstable; urgency=medium
1
2 * Initial release (Closes: #766321)
3
4 -- Jorge Soares <j.s.soares@gmail.com> Thu, 23 Oct 2014 20:23:54 +0200
+0
-1
debian/compat less more
0 9
+0
-174
debian/control less more
0 Source: fastaq
1 Maintainer: Debian Med Packaging Team <debian-med-packaging@lists.alioth.debian.org>
2 Uploaders: Andreas Tille <tille@debian.org>,
3 Jorge Soares <j.s.soares@gmail.com>
4 Section: science
5 Priority: optional
6 Build-Depends: debhelper (>= 9),
7 python3,
8 python3-setuptools,
9 python3-numpy,
10 python3-nose,
11 samtools,
12 help2man
13 Standards-Version: 3.9.6
14 Vcs-Browser: https://anonscm.debian.org/cgit/debian-med/fastaq.git
15 Homepage: https://github.com/sanger-pathogens/Fastaq
16
17 Package: fastaq
18 Architecture: all
19 Depends: ${python3:Depends},
20 ${misc:Depends}
21 Description: FASTA and FASTQ file manipulation tools
22 A collection of scripts that perform useful and common
23 fasta/q manipulation tasks.
24 .
25 All scripts automatically detect whether the input is
26 a FASTA or FASTQ file.
27 .
28 Input and output files can be gzipped.
29 .
30 fastaq_capillary_to_pairs -
31 Given a fasta/q file of capillary reads,
32 makes an interleaved file of read pairs
33 .
34 fastaq_chunker -
35 Splits a multi fasta/q file into separate files.
36 Splits sequences into chunks of a fixed size.
37 .
38 fastaq_count_sequences -
39 Counts the number of sequences in a fasta/q file
40 .
41 fastaq_deinterleave -
42 Deinterleaves fasta/q file, so that reads are written
43 alternately between two output files
44 .
45 fastaq_enumerate_names -
46 Renames sequences in a file, calling them 1,2,3...
47 .
48 fastaq_expand_nucleotides -
49 Makes all combinations of sequences in input file
50 by using all possibilities of redundant bases.
51 e.g. ART could be AAT or AGT.
52 .
53 fastaq_extend_gaps -
54 Extends the length of all gaps (and trims the start/end
55 of sequences) in a fasta/q file.
56 .
57 fastaq_fasta_to_fastq -
58 Given a fasta and qual file, makes a fastq file.
59 .
60 fastaq_filter -
61 Filters a fasta/q file by sequence length and/or
62 by name matching a regular expression.
63 .
64 fastaq_get_ids -
65 Gets IDs from each sequence in a fasta or fastq file.
66 .
67 fastaq_get_seq_flanking_gaps -
68 Gets the sequences either side of gaps in a fasta/q file.
69 .
70 fastaq_insert_or_delete_bases -
71 Deletes or inserts bases at given position(s)
72 from a fasta/q file.
73 .
74 fastaq_interleave -
75 Interleaves two fasta/q files, so that reads are written
76 alternately first/second in output file.
77 .
78 fastaq_long_read_simulate -
79 Simulates long reads from a fasta/q file. Can optionally
80 make insertions into the reads, like pacbio does.
81 .
82 fastaq_make_random_contigs -
83 Makes a multi-fasta file of random sequences,
84 all of the same length. Each base has equal chance of
85 being A,C,G or T
86 .
87 fastaq_merge -
88 Converts multi fasta/q file to single sequence file,
89 preserving original order of sequences.
90 .
91 fastaq_replace_bases -
92 Replaces all occurences of one letter with another in
93 a fasta/q file.
94 .
95 fastaq_reverse_complement -
96 Reverse complements all sequences in a fasta/q file
97 .
98 fastaq_scaffolds_to_contigs -
99 Creates a file of contigs from a file of scaffolds - i.e.
100 breaks at every gap in the input.
101 .
102 fastaq_search_for_seq -
103 Searches for an exact match on a given string and its
104 reverese complement, in every sequences of a fasta/q file.
105 Case insensitive. Guaranteed to find all hits.
106 .
107 fastaq_sequence_trim -
108 Trims sequences off the start of all sequences in a pair
109 of fasta/q files, whenever there is a perfect match.
110 Only keeps a read pair if both reads of the pair are at
111 least a minimum length after any trimming.
112 .
113 fastaq_split_by_base_count -
114 Splits a multi fasta/q file into separate files.
115 Does not split sequences. Puts up to max_bases
116 into each split file. The exception is that any
117 sequence longer than max_bases is put into its own file.
118 .
119 fastaq_strip_illumina_suffix -
120 Strips /1 or /2 off the end of every read name
121 in a fasta/q file.
122 .
123 fastaq_to_fake_qual -
124 Makes fake quality scores file from a fasta/q file.
125 .
126 fastaq_to_fasta -
127 Converts sequence file to FASTA format.
128 .
129 fastaq_to_mira_xml -
130 Creates an xml file from a fasta/q file of reads,
131 for use with Mira assembler.
132 .
133 fastaq_to_orfs_gff -
134 Writes a GFF file of open reading frames from a fasta/q file
135 .
136 fastaq_to_perfect_reads -
137 Makes perfect paired end fastq reads from a fasta/q file,
138 with insert sizes sampled from a normal distribution.
139 Read orientation is innies. Output is an interleaved fastq file.
140 .
141 fastaq_to_quasr_primers_file -
142 Converts a fasta/q file to QUASR primers format:
143 just the sequence on each line and its reverse complement,
144 tab separated.
145 .
146 fastaq_to_random_subset -
147 Takes a random subset of reads from a fasta/q file and optionally
148 the corresponding read from a mates file.
149 Ouptut is interleaved if mates file given.
150 .
151 fastaq_to_tiling_bam -
152 Takes a fasta/q file. Makes a BAM file containing perfect
153 (unpaired) reads tiling the whole genome.
154 .
155 fastaq_to_unique_by_id -
156 Removes duplicate sequences from a fasta/q file,
157 based on their names. If the same name is found
158 more than once, then the longest sequence is kept.
159 Order of sequences is preserved in output.
160 .
161 fastaq_translate -
162 Translates all sequences in a fasta or fastq file.
163 Output is always fasta format
164 .
165 fastaq_trim_ends -
166 Trims set number of bases off each sequence in a fasta/q file
167 .
168 fastaq_trim_Ns_at_end -
169 Trims any Ns off each sequence in a fasta/q file.
170 Does nothing to gaps in the middle, just trims the ends
171 .
172 A developer API is also provided by this package.
173 There are plenty of examples in tasks.py
+0
-22
debian/copyright less more
0 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
1 Upstream-Name: Fastaq
2 Source: https://github.com/sanger-pathogens/Fastaq
3
4 Files: *
5 Copyright: © 2012-2013 Martin Hunt <mh12@sanger.ac.uk>
6 License: GPL-3+
7 This package is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11 .
12 This package is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 .
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>
19 .
20 On Debian systems, the complete text of the GNU General
21 Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+0
-1
debian/fastaq.manpages less more
0 debian/man/*
+0
-737
debian/patches/delay-import-statements-for-manpage-creation.patch less more
0 Description: Delay import of Fastaq modules by the python executables
1 Man pages for this package are being automatically created with through the
2 help2man wrapper called usage_to_man. help2man calls the python executables
3 with the -h option and converts the usage into a man page.
4 .
5 The first step done by all the executables is the import of the modules deployed
6 by this package. Since the package is not installed in the system at build time,
7 the man pages would never be properly created.
8 .
9 This patch solves this problem by importing the modules in this package after
10 the argument parsing code.
11 .
12 Upstream prefered to keep the code as it is for styling reasons, which is
13 perfectly reasonable
14 .
15 fastaq (1.5.0-1) UNRELEASED; urgency=low
16 .
17 * Initial release (Closes: #1234)
18 Author: DMPT <debian-med-packaging@lists.alioth.debian.org>
19 --- a/scripts/fastaq_capillary_to_pairs
20 +++ b/scripts/fastaq_capillary_to_pairs
21 @@ -1,7 +1,6 @@
22 #!/usr/bin/env python3
23
24 import argparse
25 -from fastaq import tasks
26
27 parser = argparse.ArgumentParser(
28 description = 'Given a fasta/q file of capillary reads, makes an interleaved file of read pairs (where more than read from same ligation, takes the longest read) and a file of unpaired reads. Replaces the .p1k/.q1k part of read names to denote fwd/rev reads with /1 and /2',
29 @@ -9,4 +8,8 @@
30 parser.add_argument('infile', help='Name of input fasta/q file')
31 parser.add_argument('outprefix', help='Prefix of output files', metavar='outfiles prefix')
32 options = parser.parse_args()
33 +
34 +
35 +from fastaq import tasks
36 +
37 tasks.capillary_to_pairs(options.infile, options.outprefix)
38 --- a/scripts/fastaq_chunker
39 +++ b/scripts/fastaq_chunker
40 @@ -1,7 +1,6 @@
41 #!/usr/bin/env python3
42
43 import argparse
44 -from fastaq import tasks
45
46 parser = argparse.ArgumentParser(
47 description = 'Splits a multi fasta/q file into separate files. Splits sequences into chunks of a fixed size. Aims for chunk_size chunks in each file, but allows a little extra, so chunk can be up to (chunk_size + tolerance), to prevent tiny chunks made from the ends of sequences',
48 @@ -12,6 +11,10 @@
49 parser.add_argument('tolerance', type=int, help='Tolerance allowed in chunk size')
50 parser.add_argument('--skip_all_Ns', action='store_true', help='Do not output any sequence that consists of all Ns')
51 options = parser.parse_args()
52 +
53 +
54 +from fastaq import tasks
55 +
56 tasks.split_by_fixed_size(
57 options.infile,
58 options.outprefix,
59 --- a/scripts/fastaq_count_sequences
60 +++ b/scripts/fastaq_count_sequences
61 @@ -1,11 +1,14 @@
62 #!/usr/bin/env python3
63
64 import argparse
65 -from fastaq import tasks
66
67 parser = argparse.ArgumentParser(
68 description = 'Counts the number of sequences in a fasta/q file',
69 usage = '%(prog)s <fasta/q in>')
70 parser.add_argument('infile', help='Name of input fasta/q file')
71 options = parser.parse_args()
72 +
73 +
74 +from fastaq import tasks
75 +
76 print(tasks.count_sequences(options.infile))
77 --- a/scripts/fastaq_deinterleave
78 +++ b/scripts/fastaq_deinterleave
79 @@ -1,7 +1,6 @@
80 #!/usr/bin/env python3
81
82 import argparse
83 -from fastaq import tasks
84
85 parser = argparse.ArgumentParser(
86 description = 'Deinterleaves fasta/q file, so that reads are written alternately between two output files',
87 @@ -11,4 +10,8 @@
88 parser.add_argument('out_fwd', help='Name of output fasta/q file of forwards reads')
89 parser.add_argument('out_rev', help='Name of output fasta/q file of reverse reads')
90 options = parser.parse_args()
91 +
92 +
93 +from fastaq import tasks
94 +
95 tasks.deinterleave(options.infile, options.out_fwd, options.out_rev, fasta_out=options.fasta_out)
96 --- a/scripts/fastaq_enumerate_names
97 +++ b/scripts/fastaq_enumerate_names
98 @@ -1,7 +1,6 @@
99 #!/usr/bin/env python3
100
101 import argparse
102 -from fastaq import tasks
103
104 parser = argparse.ArgumentParser(
105 description = 'Renames sequences in a file, calling them 1,2,3... etc',
106 @@ -12,6 +11,10 @@
107 parser.add_argument('infile', help='Name of fasta/q file to be read')
108 parser.add_argument('outfile', help='Name of output fasta/q file')
109 options = parser.parse_args()
110 +
111 +
112 +from fastaq import tasks
113 +
114 tasks.enumerate_names(options.infile,
115 options.outfile,
116 start_index=options.start_index,
117 --- a/scripts/fastaq_expand_nucleotides
118 +++ b/scripts/fastaq_expand_nucleotides
119 @@ -1,7 +1,6 @@
120 #!/usr/bin/env python3
121
122 import argparse
123 -from fastaq import tasks
124
125 parser = argparse.ArgumentParser(
126 description = 'Makes all combinations of sequences in input file by using all possibilities of redundant bases. e.g. ART could be AAT or AGT. Assumes input is nucleotides, not amino acids',
127 @@ -9,6 +8,10 @@
128 parser.add_argument('infile', help='Name of input file. Can be any of FASTA, FASTQ, GFF3, EMBL, GBK, Phylip')
129 parser.add_argument('outfile', help='Name of output file')
130 options = parser.parse_args()
131 +
132 +
133 +from fastaq import tasks
134 +
135 tasks.expand_nucleotides(
136 options.infile,
137 options.outfile,
138 --- a/scripts/fastaq_extend_gaps
139 +++ b/scripts/fastaq_extend_gaps
140 @@ -1,7 +1,6 @@
141 #!/usr/bin/env python3
142
143 import argparse
144 -from fastaq import tasks
145
146 parser = argparse.ArgumentParser(
147 description = 'Extends the length of all gaps (and trims the start/end of sequences) in a fasta/q file. Does this by replacing a set number of bases either side of each gap with Ns. Any sequence that ends up as all Ns is lost',
148 @@ -10,4 +9,8 @@
149 parser.add_argument('infile', help='Name of input fasta/q file')
150 parser.add_argument('outfile', help='Name of output fasta/q file')
151 options = parser.parse_args()
152 +
153 +
154 +from fastaq import tasks
155 +
156 tasks.extend_gaps(options.infile, options.outfile, options.trim_number)
157 --- a/scripts/fastaq_fasta_to_fastq
158 +++ b/scripts/fastaq_fasta_to_fastq
159 @@ -1,7 +1,6 @@
160 #!/usr/bin/env python3
161
162 import argparse
163 -from fastaq import tasks
164
165 parser = argparse.ArgumentParser(
166 description = 'Given a fasta and qual file, makes a fastq file',
167 @@ -10,4 +9,8 @@
168 parser.add_argument('qual', help='Name of input quality scores file', metavar='qual in')
169 parser.add_argument('outfile', help='Name of output fastq file', metavar='fastq out')
170 options = parser.parse_args()
171 +
172 +
173 +from fastaq import tasks
174 +
175 tasks.fasta_to_fastq(options.fasta, options.qual, options.outfile)
176 --- a/scripts/fastaq_filter
177 +++ b/scripts/fastaq_filter
178 @@ -1,7 +1,6 @@
179 #!/usr/bin/env python3
180
181 import argparse
182 -from fastaq import tasks
183
184 parser = argparse.ArgumentParser(
185 description = 'Filters a fasta/q file by sequence length and/or by name matching a regular expression',
186 @@ -14,6 +13,10 @@
187 parser.add_argument('infile', help='Name of fasta/q file to be filtered')
188 parser.add_argument('outfile', help='Name of output fasta/q file')
189 options = parser.parse_args()
190 +
191 +
192 +from fastaq import tasks
193 +
194 tasks.filter(options.infile,
195 options.outfile,
196 minlength=options.min_length,
197 --- a/scripts/fastaq_get_ids
198 +++ b/scripts/fastaq_get_ids
199 @@ -1,7 +1,6 @@
200 #!/usr/bin/env python3
201
202 import argparse
203 -from fastaq import tasks
204
205 parser = argparse.ArgumentParser(
206 description = 'Gets IDs from each sequence in a fasta or fastq file',
207 @@ -9,4 +8,8 @@
208 parser.add_argument('infile', help='Name of input fasta/q file')
209 parser.add_argument('outfile', help='Name of output file')
210 options = parser.parse_args()
211 +
212 +
213 +from fastaq import tasks
214 +
215 tasks.get_ids(options.infile, options.outfile)
216 --- a/scripts/fastaq_get_seq_flanking_gaps
217 +++ b/scripts/fastaq_get_seq_flanking_gaps
218 @@ -1,7 +1,6 @@
219 #!/usr/bin/env python3
220
221 import argparse
222 -from fastaq import tasks
223
224 parser = argparse.ArgumentParser(
225 description = 'Gets the sequences either side of gaps in a fasta/q file',
226 @@ -11,4 +10,8 @@
227 parser.add_argument('infile', help='Name of input fasta/q file')
228 parser.add_argument('outfile', help='Name of output fasta/q file')
229 options = parser.parse_args()
230 +
231 +
232 +from fastaq import tasks
233 +
234 tasks.get_seqs_flanking_gaps(options.infile, options.outfile, options.left, options.right)
235 --- a/scripts/fastaq_insert_or_delete_bases
236 +++ b/scripts/fastaq_insert_or_delete_bases
237 @@ -1,9 +1,6 @@
238 #!/usr/bin/env python3
239
240 import argparse
241 -import sys
242 -import random
243 -from fastaq import sequences, utils, intervals
244
245 parser = argparse.ArgumentParser(
246 description = 'Deletes or inserts bases at given position(s) from a fasta/q file',
247 @@ -16,6 +13,11 @@
248 parser.add_argument('--insert_range', help='Inserts random bases starting after position P in each sequence of the input file. Inserts start + (n-1)*step bases into sequence n.', metavar='P,start,step')
249 options = parser.parse_args()
250
251 +
252 +import sys
253 +import random
254 +from fastaq import sequences, utils, intervals
255 +
256 test_ops = [int(x is not None) for x in [options.delete, options.insert, options.delete_range, options.insert_range]]
257
258 if sum(test_ops) != 1:
259 --- a/scripts/fastaq_interleave
260 +++ b/scripts/fastaq_interleave
261 @@ -1,7 +1,6 @@
262 #!/usr/bin/env python3
263
264 import argparse
265 -from fastaq import tasks
266
267 parser = argparse.ArgumentParser(
268 description = 'Interleaves two fasta/q files, so that reads are written alternately first/second in output file',
269 @@ -10,4 +9,8 @@
270 parser.add_argument('infile_2', help='Name of second input fasta/q file')
271 parser.add_argument('outfile', help='Name of output fasta/q file of interleaved reads')
272 options = parser.parse_args()
273 +
274 +
275 +from fastaq import tasks
276 +
277 tasks.interleave(options.infile_1, options.infile_2, options.outfile)
278 --- a/scripts/fastaq_long_read_simulate
279 +++ b/scripts/fastaq_long_read_simulate
280 @@ -1,7 +1,6 @@
281 #!/usr/bin/env python3
282
283 import argparse
284 -from fastaq import tasks
285
286 parser = argparse.ArgumentParser(
287 description = 'Simulates long reads from a fasta/q file. Can optionally make insertions into the reads, like pacbio does. If insertions made, coverage calculation is done before the insertions (so total read length may appear longer then expected).',
288 @@ -16,7 +15,6 @@
289 parser.add_argument('--fixed_read_length', type=int, help='Length of each read. Only applies if method is tile or uniform. [%(default)s]', default=20000, metavar='INT')
290 parser.add_argument('--coverage', type=float, help='Read coverage. Only applies if method is gamma or uniform. [%(default)s]', default=2, metavar='FLOAT')
291
292 -
293 tiling_group = parser.add_argument_group('tiling options')
294 tiling_group.add_argument('--tile_step', type=int, help='Distance between start of each read [%(default)s]', default=10000, metavar='INT')
295
296 @@ -29,8 +27,11 @@
297 ins_group.add_argument('--ins_skip', type=int, help='Insert a random base every --skip bases plus or minus --ins_window. If this option is used, must also use --ins_window.', metavar='INT')
298 ins_group.add_argument('--ins_window', type=int, help='See --ins_skip. If this option is used, must also use --ins_skip.', metavar='INT')
299
300 -
301 options = parser.parse_args()
302 +
303 +
304 +from fastaq import tasks
305 +
306 tasks.make_long_reads(
307 options.infile,
308 options.outfile,
309 --- a/scripts/fastaq_make_random_contigs
310 +++ b/scripts/fastaq_make_random_contigs
311 @@ -1,7 +1,6 @@
312 #!/usr/bin/env python3
313
314 import argparse
315 -from fastaq import tasks
316
317 parser = argparse.ArgumentParser(
318 description = 'Makes a multi-fasta file of random sequences, all of the same length. Each base has equal chance of being A,C,G or T',
319 @@ -14,6 +13,10 @@
320 parser.add_argument('length', type=int, help='Length of each contig')
321 parser.add_argument('outfile', help='Name of output file')
322 options = parser.parse_args()
323 +
324 +
325 +from fastaq import tasks
326 +
327 tasks.make_random_contigs(
328 options.contigs,
329 options.length,
330 --- a/scripts/fastaq_merge
331 +++ b/scripts/fastaq_merge
332 @@ -1,7 +1,6 @@
333 #!/usr/bin/env python3
334
335 import argparse
336 -from fastaq import tasks
337
338 parser = argparse.ArgumentParser(
339 description = 'Converts multi fasta/q file to single sequence file, preserving original order of sequences',
340 @@ -10,6 +9,10 @@
341 parser.add_argument('outfile', help='Name of output file')
342 parser.add_argument('-n', '--name', help='Name of sequence in output file [%(default)s]', default='union')
343 options = parser.parse_args()
344 +
345 +
346 +from fastaq import tasks
347 +
348 tasks.merge_to_one_seq(
349 options.infile,
350 options.outfile,
351 --- a/scripts/fastaq_replace_bases
352 +++ b/scripts/fastaq_replace_bases
353 @@ -1,7 +1,6 @@
354 #!/usr/bin/env python3
355
356 import argparse
357 -from fastaq import tasks
358
359 parser = argparse.ArgumentParser(
360 description = 'Replaces all occurences of one letter with another in a fasta/q file',
361 @@ -11,4 +10,8 @@
362 parser.add_argument('old', help='Base to be replaced')
363 parser.add_argument('new', help='Replace with this letter')
364 options = parser.parse_args()
365 +
366 +
367 +from fastaq import tasks
368 +
369 tasks.replace_bases(options.infile, options.outfile, options.old, options.new)
370 --- a/scripts/fastaq_reverse_complement
371 +++ b/scripts/fastaq_reverse_complement
372 @@ -1,7 +1,6 @@
373 #!/usr/bin/env python3
374
375 import argparse
376 -from fastaq import tasks
377
378 parser = argparse.ArgumentParser(
379 description = 'Reverse complements all sequences in a fasta/q file',
380 @@ -9,4 +8,8 @@
381 parser.add_argument('infile', help='Name of input fasta/q file')
382 parser.add_argument('outfile', help='Name of output fasta/q file')
383 options = parser.parse_args()
384 +
385 +
386 +from fastaq import tasks
387 +
388 tasks.reverse_complement(options.infile, options.outfile)
389 --- a/scripts/fastaq_scaffolds_to_contigs
390 +++ b/scripts/fastaq_scaffolds_to_contigs
391 @@ -1,7 +1,6 @@
392 #!/usr/bin/env python3
393
394 import argparse
395 -from fastaq import tasks
396
397 parser = argparse.ArgumentParser(
398 description = 'Creates a file of contigs from a file of scaffolds - i.e. breaks at every gap in the input',
399 @@ -10,4 +9,8 @@
400 parser.add_argument('infile', help='Name of input fasta/q file')
401 parser.add_argument('outfile', help='Name of output contigs file')
402 options = parser.parse_args()
403 +
404 +
405 +from fastaq import tasks
406 +
407 tasks.scaffolds_to_contigs(options.infile, options.outfile, number_contigs=options.number_contigs)
408 --- a/scripts/fastaq_search_for_seq
409 +++ b/scripts/fastaq_search_for_seq
410 @@ -1,7 +1,6 @@
411 #!/usr/bin/env python3
412
413 import argparse
414 -from fastaq import tasks
415
416 parser = argparse.ArgumentParser(
417 description = 'Searches for an exact match on a given string and its reverese complement, in every sequences of a fasta/q file. Case insensitive. Guaranteed to find all hits',
418 @@ -10,4 +9,8 @@
419 parser.add_argument('outfile', help='Name of outputfile. Tab-delimited output: sequence name, position, strand')
420 parser.add_argument('search_string', help='String to search for in the sequences')
421 options = parser.parse_args()
422 +
423 +
424 +from fastaq import tasks
425 +
426 tasks.search_for_seq(options.infile, options.outfile, options.search_string)
427 --- a/scripts/fastaq_sequence_trim
428 +++ b/scripts/fastaq_sequence_trim
429 @@ -1,7 +1,6 @@
430 #!/usr/bin/env python3
431
432 import argparse
433 -from fastaq import tasks
434
435 parser = argparse.ArgumentParser(
436 description = 'Trims sequences off the start of all sequences in a pair of fasta/q files, whenever there is a perfect match. Only keeps a read pair if both reads of the pair are at least a minimum length after any trimming',
437 @@ -13,6 +12,10 @@
438 parser.add_argument('outfile_2', help='Name of output reverse fasta/q file', metavar='out_2')
439 parser.add_argument('trim_seqs', help='Name of fasta/q file of sequences to search for at the start of each input sequence', metavar='trim_seqs')
440 options = parser.parse_args()
441 +
442 +
443 +from fastaq import tasks
444 +
445 tasks.sequence_trim(
446 options.infile_1,
447 options.infile_2,
448 --- a/scripts/fastaq_split_by_base_count
449 +++ b/scripts/fastaq_split_by_base_count
450 @@ -1,7 +1,6 @@
451 #!/usr/bin/env python3
452
453 import argparse
454 -from fastaq import tasks
455
456 parser = argparse.ArgumentParser(
457 description = 'Splits a multi fasta/q file into separate files. Does not split sequences. Puts up to max_bases into each split file. The exception is that any sequence longer than max_bases is put into its own file.',
458 @@ -10,6 +9,9 @@
459 parser.add_argument('outprefix', help='Name of output fasta/q file')
460 parser.add_argument('max_bases', type=int, help='Max bases in each output split file', metavar='max_bases')
461 parser.add_argument('--max_seqs', type=int, help='Max number of sequences in each output split file [no limit]', metavar='INT')
462 -
463 options = parser.parse_args()
464 +
465 +
466 +from fastaq import tasks
467 +
468 tasks.split_by_base_count(options.infile, options.outprefix, options.max_bases, options.max_seqs)
469 --- a/scripts/fastaq_strip_illumina_suffix
470 +++ b/scripts/fastaq_strip_illumina_suffix
471 @@ -1,7 +1,6 @@
472 #!/usr/bin/env python3
473
474 import argparse
475 -from fastaq import tasks
476
477 parser = argparse.ArgumentParser(
478 description = 'Strips /1 or /2 off the end of every read name in a fasta/q file',
479 @@ -9,4 +8,8 @@
480 parser.add_argument('infile', help='Name of input fasta/q file')
481 parser.add_argument('outfile', help='Name of output fasta/q file')
482 options = parser.parse_args()
483 +
484 +
485 +from fastaq import tasks
486 +
487 tasks.strip_illumina_suffix(options.infile, options.outfile)
488 --- a/scripts/fastaq_to_fake_qual
489 +++ b/scripts/fastaq_to_fake_qual
490 @@ -1,7 +1,6 @@
491 #!/usr/bin/env python3
492
493 import argparse
494 -from fastaq import tasks
495
496 parser = argparse.ArgumentParser(
497 description = 'Makes fake quality scores file from a fasta/q file',
498 @@ -10,6 +9,10 @@
499 parser.add_argument('outfile', help='Name of output file')
500 parser.add_argument('-q', '--qual', type=int, help='Quality score to assign to all bases [%(default)s]', default=40)
501 options = parser.parse_args()
502 +
503 +
504 +from fastaq import tasks
505 +
506 tasks.fastaq_to_fake_qual(
507 options.infile,
508 options.outfile,
509 --- a/scripts/fastaq_to_fasta
510 +++ b/scripts/fastaq_to_fasta
511 @@ -1,7 +1,6 @@
512 #!/usr/bin/env python3
513
514 import argparse
515 -from fastaq import tasks
516
517 parser = argparse.ArgumentParser(
518 description = 'Converts sequence file to FASTA format',
519 @@ -11,6 +10,10 @@
520 parser.add_argument('-l', '--line_length', type=int, help='Number of bases on each sequence line of output file [%(default)s]', default=60)
521 parser.add_argument('-s', '--strip_after_whitespace', action='store_true', help='Remove everything after first whitesapce in every sequence name')
522 options = parser.parse_args()
523 +
524 +
525 +from fastaq import tasks
526 +
527 tasks.to_fasta(
528 options.infile,
529 options.outfile,
530 --- a/scripts/fastaq_to_mira_xml
531 +++ b/scripts/fastaq_to_mira_xml
532 @@ -1,7 +1,6 @@
533 #!/usr/bin/env python3
534
535 import argparse
536 -from fastaq import tasks
537
538 parser = argparse.ArgumentParser(
539 description = 'Creates an xml file from a fasta/q file of reads, for use with Mira assembler',
540 @@ -9,4 +8,8 @@
541 parser.add_argument('infile', help='Name of input fasta/q file')
542 parser.add_argument('xml_out', help='Name of output xml file')
543 options = parser.parse_args()
544 +
545 +
546 +from fastaq import tasks
547 +
548 tasks.fastaq_to_mira_xml(options.infile, options.xml_out)
549 --- a/scripts/fastaq_to_orfs_gff
550 +++ b/scripts/fastaq_to_orfs_gff
551 @@ -1,7 +1,6 @@
552 #!/usr/bin/env python3
553
554 import argparse
555 -from fastaq import tasks
556
557 parser = argparse.ArgumentParser(
558 description = 'Writes a GFF file of open reading frames from a fasta/q file',
559 @@ -10,4 +9,8 @@
560 parser.add_argument('infile', help='Name of input fasta/q file')
561 parser.add_argument('gff_out', help='Name of output gff file')
562 options = parser.parse_args()
563 +
564 +
565 +from fastaq import tasks
566 +
567 tasks.fastaq_to_orfs_gff(options.infile, options.gff_out, min_length=options.min_length)
568 --- a/scripts/fastaq_to_perfect_reads
569 +++ b/scripts/fastaq_to_perfect_reads
570 @@ -1,10 +1,6 @@
571 #!/usr/bin/env python3
572
573 import argparse
574 -import random
575 -from math import floor, ceil
576 -from fastaq import sequences, utils
577 -import sys
578
579 parser = argparse.ArgumentParser(
580 description = 'Makes perfect paired end fastq reads from a fasta/q file, with insert sizes sampled from a normal distribution. Read orientation is innies. Output is an interleaved fastq file.',
581 @@ -20,6 +16,12 @@
582 parser.add_argument('--seed', type=int, help='Seed for random number generator. Default is to use python\'s default', default=None, metavar='INT')
583 options = parser.parse_args()
584
585 +
586 +import random
587 +from math import floor, ceil
588 +from fastaq import sequences, utils
589 +import sys
590 +
591 random.seed(a=options.seed)
592
593 seq_reader = sequences.file_reader(options.infile)
594 --- a/scripts/fastaq_to_quasr_primers_file
595 +++ b/scripts/fastaq_to_quasr_primers_file
596 @@ -1,7 +1,6 @@
597 #!/usr/bin/env python3
598
599 import argparse
600 -from fastaq import tasks
601
602 parser = argparse.ArgumentParser(
603 description = 'Converts a fasta/q file to QUASR primers format: just the sequence on each line and its reverse complement, tab separated',
604 @@ -9,4 +8,8 @@
605 parser.add_argument('infile', help='Name of input fasta/q file')
606 parser.add_argument('outfile', help='Name of output file')
607 options = parser.parse_args()
608 +
609 +
610 +from fastaq import tasks
611 +
612 tasks.to_quasr_primers(options.infile, options.outfile)
613 --- a/scripts/fastaq_to_random_subset
614 +++ b/scripts/fastaq_to_random_subset
615 @@ -1,9 +1,6 @@
616 #!/usr/bin/env python3
617
618 -import sys
619 import argparse
620 -import random
621 -from fastaq import sequences, utils
622
623 parser = argparse.ArgumentParser(
624 description = 'Takes a random subset of reads from a fasta/q file and optionally the corresponding read ' +
625 @@ -15,6 +12,11 @@
626 parser.add_argument('probability', type=int, help='Probability of keeping any given read (pair) in [0,100]', metavar='INT')
627 options = parser.parse_args()
628
629 +
630 +import sys
631 +import random
632 +from fastaq import sequences, utils
633 +
634 seq_reader = sequences.file_reader(options.infile)
635 fout = utils.open_file_write(options.outfile)
636
637 --- a/scripts/fastaq_to_tiling_bam
638 +++ b/scripts/fastaq_to_tiling_bam
639 @@ -1,9 +1,6 @@
640 #!/usr/bin/env python3
641
642 import argparse
643 -import sys
644 -import os
645 -from fastaq import sequences, utils
646
647 parser = argparse.ArgumentParser(
648 description = 'Takes a fasta/q file. Makes a BAM file containing perfect (unpaired) reads tiling the whole genome',
649 @@ -17,6 +14,11 @@
650 parser.add_argument('--read_group', help='Add the given read group ID to all reads [%(default)s]' ,default='42')
651 options = parser.parse_args()
652
653 +
654 +import sys
655 +import os
656 +from fastaq import sequences, utils
657 +
658 # make a header first - we need to add the @RG line to the default header made by samtools
659 tmp_empty_file = options.outfile + '.tmp.empty'
660 f = utils.open_file_write(tmp_empty_file)
661 --- a/scripts/fastaq_to_unique_by_id
662 +++ b/scripts/fastaq_to_unique_by_id
663 @@ -1,7 +1,6 @@
664 #!/usr/bin/env python3
665
666 import argparse
667 -from fastaq import tasks
668
669 parser = argparse.ArgumentParser(
670 description = 'Removes duplicate sequences from a fasta/q file, based on their names. If the same name is found more than once, then the longest sequence is kept. Order of sequences is preserved in output',
671 @@ -9,4 +8,8 @@
672 parser.add_argument('infile', help='Name of input fasta/q file')
673 parser.add_argument('outfile', help='Name of output fasta/q file')
674 options = parser.parse_args()
675 +
676 +
677 +from fastaq import tasks
678 +
679 tasks.to_unique_by_id(options.infile, options.outfile)
680 --- a/scripts/fastaq_translate
681 +++ b/scripts/fastaq_translate
682 @@ -1,7 +1,6 @@
683 #!/usr/bin/env python3
684
685 import argparse
686 -from fastaq import tasks
687
688 parser = argparse.ArgumentParser(
689 description = 'Translates all sequences in a fasta or fastq file. Output is always fasta format',
690 @@ -10,4 +9,8 @@
691 parser.add_argument('infile', help='Name of fasta/q file to be translated', metavar='in.fasta/q')
692 parser.add_argument('outfile', help='Name of output fasta file', metavar='out.fasta')
693 options = parser.parse_args()
694 +
695 +
696 +from fastaq import tasks
697 +
698 tasks.translate(options.infile, options.outfile, frame=options.frame)
699 --- a/scripts/fastaq_trim_Ns_at_end
700 +++ b/scripts/fastaq_trim_Ns_at_end
701 @@ -1,7 +1,6 @@
702 #!/usr/bin/env python3
703
704 import argparse
705 -from fastaq import tasks
706
707 parser = argparse.ArgumentParser(
708 description = 'Trims any Ns off each sequence in a fasta/q file. Does nothing to gaps in the middle, just trims the ends',
709 @@ -9,4 +8,8 @@
710 parser.add_argument('infile', help='Name of input fasta/q file')
711 parser.add_argument('outfile', help='Name of output fasta/q file')
712 options = parser.parse_args()
713 +
714 +
715 +from fastaq import tasks
716 +
717 tasks.trim_Ns_at_end(options.infile, options.outfile)
718 --- a/scripts/fastaq_trim_ends
719 +++ b/scripts/fastaq_trim_ends
720 @@ -1,7 +1,6 @@
721 #!/usr/bin/env python3
722
723 import argparse
724 -from fastaq import tasks
725
726 parser = argparse.ArgumentParser(
727 description = 'Trims set number of bases off each sequence in a fasta/q file',
728 @@ -11,4 +10,8 @@
729 parser.add_argument('end_trim', type=int, help='Number of bases to trim off end')
730 parser.add_argument('outfile', help='Name of output fasta/q file')
731 options = parser.parse_args()
732 +
733 +
734 +from fastaq import tasks
735 +
736 tasks.trim(options.infile, options.outfile, options.start_trim, options.end_trim)
+0
-1
debian/patches/series less more
0 delay-import-statements-for-manpage-creation.patch
+0
-25
debian/rules less more
0 #!/usr/bin/make -f
1
2 export DH_VERBOSE := 1
3 export PYBUILD_NAME=fastaq
4
5 mandir := $(CURDIR)/debian/man
6 debfolder := $(CURDIR)/debian
7
8 %:
9 dh $@ --with python3 --buildsystem=pybuild
10
11 override_dh_auto_build:
12 dh_python3
13 dh_auto_build
14 mkdir $(CURDIR)/doc
15 cd $(CURDIR)/doc
16
17 override_dh_auto_clean:
18 rm -rf build .pybuild
19 rm -rf $(mandir)
20
21 override_dh_installman:
22 mkdir -p $(mandir)
23 $(debfolder)/usage_to_man
24 dh_installman --
+0
-1
debian/source/format less more
0 3.0 (quilt)
+0
-12
debian/upstream/metadata less more
0 Reference:
1 Author:
2 Title:
3 Journal:
4 Year:
5 Volume:
6 Number:
7 Pages:
8 DOI:
9 PMID:
10 URL:
11 eprint:
+0
-99
debian/usage_to_man less more
0 #!/usr/bin/perl
1 use strict;
2 use warnings;
3
4 #Converts Fastaq python scripts usage into man pages.
5 #The man pages are placed in the man folder of the main Fastaq directory
6
7 createManPages();
8
9 sub createManPages {
10
11 my $source= 'scripts';
12 my $destination= 'debian/man';
13 my $app_name = 'Fastaq';
14
15
16 unless ( -d $destination ) {
17 system(mkdir $destination);
18 }
19
20 my @files;
21
22 push(@files,`ls $source/fastaq_*`);
23
24 if ( scalar @files > 0 ) {
25
26 print "Creating manpages\n";
27 for my $file ( @files ) {
28 $file =~ s/\n$//;
29
30 my $filename = $file;
31 $filename =~ s/$source\///;
32
33 my $uc_filename = uc($filename);
34 my $man_file = $filename;
35
36 $man_file = $destination . '/' . $man_file . '.1';
37
38 open (my $man_fh, ">", $man_file);
39
40 my $grep_string = $filename . ': error: too few arguments';
41
42 my $cmd = "help2man -m $filename -n $filename --no-discard-stderr $file | sed 's/usage://gi'";
43 my @output;
44 push(@output, `$cmd`);
45
46 for my $line (@output) {
47 $line =~ s/\n$//;
48
49 }
50
51 for (my $i = 0; $i < scalar @output; $i++) {
52 my $output_line = $output[$i];
53
54 if ($output_line =~ m/^\.TH/) {
55 $output_line =~ s/\s+/ /g;
56 $output_line =~ s/(\.TH) ("\d+") ("[a-zA-Z0-9_ ]*") ("[a-zA-Z0-9_<>\[\]\/\.\(\), ]*") ("[a-zA-Z0-9_]*")/$1 $uc_filename $2 $3 "$app_name" "Fastaq executables"/;
57 }
58
59 $output_line =~ s/ \\- $filename/$filename/;
60
61 if ( $output_line =~ m/^.PP/ && $output[$i + 1] =~ m/^$filename\:/ ) {
62 $output_line = $output[$i + 1] = '';
63 }
64
65 if ($output_line =~ m/^\.SH "SEE ALSO"/) {
66 last;
67 }
68 print $man_fh "$output_line\n";
69 }
70
71 writeAuthorAndCopyright($man_fh,$filename);
72 close($man_fh);
73 }
74 print "Manpage creation complete\n";
75 }
76 }
77
78 sub writeAuthorAndCopyright {
79
80 my ($man_fh,$filename) = @_;
81
82 my $author_blurb = <<END_OF_AUTHOR_BLURB;
83 .SH "AUTHOR"
84 .sp
85 $filename was originally written by Martin Hunt (mh12\@sanger.ac.uk)
86 END_OF_AUTHOR_BLURB
87
88 print $man_fh "$author_blurb\n";
89
90 my $copyright_blurb = <<'END_OF_C_BLURB';
91 .SH "COPYING"
92 .sp
93 Wellcome Trust Sanger Institute Copyright \(co 2013 Wellcome Trust Sanger Institute This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version\&.
94 END_OF_C_BLURB
95
96 print $man_fh "$copyright_blurb\n";
97
98 }
+0
-3
debian/watch less more
0 version=3
1 https://github.com/sanger-pathogens/fastaq/releases .*/archive/v(\d[\d.-]+)\.(?:tar(?:\.gz|\.bz2)?|tgz)
2
466466 utils.close(fout)
467467
468468
469 def sequence_trim(infile_1, infile_2, outfile_1, outfile_2, to_trim_file, min_length=50):
470 trim_seqs = {}
471 file_to_dict(to_trim_file, trim_seqs)
472 trim_seqs = [x.seq for x in trim_seqs.values()]
469 def sequence_trim(infile_1, infile_2, outfile_1, outfile_2, to_trim_file, min_length=50, check_revcomp=False):
470 to_trim_seqs = {}
471 file_to_dict(to_trim_file, to_trim_seqs)
472 trim_seqs = [x.seq for x in to_trim_seqs.values()]
473 if check_revcomp:
474 for seq in to_trim_seqs.values():
475 seq.revcomp()
476 trim_seqs_revcomp = [x.seq for x in to_trim_seqs.values()]
477 else:
478 trim_seqs_revcomp = []
473479
474480 seq_reader_1 = sequences.file_reader(infile_1)
475481 seq_reader_2 = sequences.file_reader(infile_2)
487493 for trim_seq in trim_seqs:
488494 if seq.seq.startswith(trim_seq):
489495 seq.trim(len(trim_seq),0)
496 break
497
498 for trim_seq in trim_seqs_revcomp:
499 if seq.seq.endswith(trim_seq):
500 seq.trim(0,len(trim_seq))
490501 break
491502
492503 if len(seq_1) >= min_length and len(seq_2) >= min_length:
678689 sequences.Fasta.line_length = original_line_length
679690
680691
681 def to_quasr_primers(infile, outfile):
682 seq_reader = sequences.file_reader(infile)
683 f_out = utils.open_file_write(outfile)
684
685 for seq in seq_reader:
686 seq2 = copy.copy(seq)
687 seq2.revcomp()
688 print(seq.seq, seq2.seq, sep='\t', file=f_out)
689
690 utils.close(f_out)
691
692
693692 def to_fasta_union(infile, outfile, seqname='union'):
694693 seq_reader = sequences.file_reader(infile)
695694 new_seq = []
+0
-2
fastaq/tests/data/sequences_test_fastaq_to_quasr_primers.expected less more
0 ACGT ACGT
1 AG CT
+0
-4
fastaq/tests/data/sequences_test_fastaq_to_quasr_primers.fa less more
0 >1
1 ACGT
2 >2
3 AG
00 >1/1
1 TRIM1GCTCGAGCT
1 1234567890
22 >2/1
3 TRIM1AGCTAGCTAG
3 AACG123456789
44 >3/1
5 CGCTAGCTAG
5 1234567890
66 >4/1
7 TRIM2AGCTAGCTAG
7 AACG1234567890
88 >5/1
9 AGCTAGCTAG
9 1234567890
1010 >6/1
11 TRIM4AGCTAGCTAG
11 AACG1234567890
12 >7/1
13 123456789AGGC
14 >8/1
15 123456789
16 >9/1
17 1234567890AGGC
18 >10/1
19 AACG123456789CGTT
20 >11/1
21 AACG1234567890CGTT
22 >12/1
23 AACG1234567890CGTT
0 >3/1
1 CGCTAGCTAG
0 >1/1
1 1234567890
22 >4/1
3 AGCTAGCTAG
3 1234567890
44 >5/1
5 AGCTAGCTAG
5 1234567890
66 >6/1
7 AGCTAGCTAG
7 1234567890
8 >9/1
9 1234567890
10 >12/1
11 1234567890
00 >1/2
1 TRIM1ACGTACGTAC
1 1234567890
22 >2/2
3 TRIM2ACGTAGTGA
3 1234567890
44 >3/2
5 ACGCTGCAGTCAGTCAGTAT
5 AACG123456789
66 >4/2
7 TRIM3CGATCGATCG
7 1234567890
88 >5/2
9 TRIM3CGATCGATCG
9 AACG1234567890
1010 >6/2
11 CGATCGATCG
11 GCCT1234567890
12 >7/2
13 1234567890
14 >8/2
15 123456789AGGC
16 >9/2
17 1234567890CGTT
18 >10/2
19 AACG1234567890CGTT
20 >11/2
21 AACG123456789CGTT
22 >12/2
23 AACG1234567890CGTT
0 >3/2
1 ACGCTGCAGTCAGTCAGTAT
0 >1/2
1 1234567890
22 >4/2
3 CGATCGATCG
3 1234567890
44 >5/2
5 CGATCGATCG
5 1234567890
66 >6/2
7 CGATCGATCG
7 1234567890
8 >9/2
9 1234567890
10 >12/2
11 1234567890
00 >1
1 TRIM1
1 AACG
22 >2
3 TRIM2
4 >3
5 TRIM3
6 >4
7 TRIM4
3 GCCT
290290 to_trim = os.path.join(data_dir, 'tasks_test_sequences_to_trim.fa')
291291 expected1 = os.path.join(data_dir, 'tasks_test_sequence_trim_1.trimmed.fa')
292292 expected2 = os.path.join(data_dir, 'tasks_test_sequence_trim_2.trimmed.fa')
293 tasks.sequence_trim(in1, in2, tmp1, tmp2, to_trim, min_length=10)
293 tasks.sequence_trim(in1, in2, tmp1, tmp2, to_trim, min_length=10, check_revcomp=True)
294294 self.assertTrue(filecmp.cmp(expected1, tmp1))
295295 self.assertTrue(filecmp.cmp(expected2, tmp2))
296296 os.unlink(tmp1)
477477 os.unlink(tmpfile)
478478
479479
480 class TestToQuasrPrimers(unittest.TestCase):
481 def test_to_quasr_primers(self):
482 '''Check that fasta file gets converted to QUASR sequence file'''
483 tmpfile = 'tmp.primers'
484 tasks.to_quasr_primers(os.path.join(data_dir, 'sequences_test_fastaq_to_quasr_primers.fa'), tmpfile)
485 self.assertTrue(filecmp.cmp(os.path.join(data_dir, 'sequences_test_fastaq_to_quasr_primers.expected'), tmpfile))
486 os.unlink(tmpfile)
487
488
489480 class TestToFasta(unittest.TestCase):
490481 def test_to_fasta(self):
491482 '''Test to_fasta'''
66 description = 'Trims sequences off the start of all sequences in a pair of fasta/q files, whenever there is a perfect match. Only keeps a read pair if both reads of the pair are at least a minimum length after any trimming',
77 usage = '%(prog)s [options] <fasta/q 1 in> <fastaq/2 in> <out 1> <out 2> <trim_seqs>')
88 parser.add_argument('--min_length', type=int, help='Minimum length of output sequences [%(default)s]', default=50, metavar='INT')
9 parser.add_argument('--revcomp', action='store_true', help='Trim the end of each sequence if it matches the reverse complement. This option is intended for PCR primer trimming')
910 parser.add_argument('infile_1', help='Name of forward fasta/q file to be trimmed', metavar='fasta/q 1 in')
1011 parser.add_argument('infile_2', help='Name of reverse fasta/q file to be trimmed', metavar='fasta/q 2 in')
1112 parser.add_argument('outfile_1', help='Name of output forward fasta/q file', metavar='out_1')
1819 options.outfile_1,
1920 options.outfile_2,
2021 options.trim_seqs,
21 min_length=options.min_length
22 min_length=options.min_length,
23 check_revcomp=options.revcomp
2224 )
+0
-12
scripts/fastaq_to_quasr_primers_file less more
0 #!/usr/bin/env python3
1
2 import argparse
3 from fastaq import tasks
4
5 parser = argparse.ArgumentParser(
6 description = 'Converts a fasta/q file to QUASR primers format: just the sequence on each line and its reverse complement, tab separated',
7 usage = '%(prog)s <fasta/q in> <outfile>')
8 parser.add_argument('infile', help='Name of input fasta/q file')
9 parser.add_argument('outfile', help='Name of output file')
10 options = parser.parse_args()
11 tasks.to_quasr_primers(options.infile, options.outfile)
66
77 setup(
88 name='Fastaq',
9 version='1.5.0',
9 version='1.6.0',
1010 description='Scripts to manipulate FASTA and FASTQ files, plus API for developers',
1111 long_description=read('README.md'),
1212 packages = find_packages(),