1# Copyright 2004 by Frank Kauff.  All rights reserved.
2# Revisions copyright 2008-2013 by Peter Cock. All rights reserved.
3# Revisions copyright 2009-2009 by Michiel de Hoon. All rights reserved.
4# This code is part of the Biopython distribution and governed by its
5# license.  Please see the LICENSE file that should have been included
6# as part of this package.
7
8"""Tests for Ace module."""
9
10import unittest
11
12from Bio.Sequencing import Ace
13
14
15class AceTestOne(unittest.TestCase):
16    def setUp(self):
17        self.handle = open("Ace/contig1.ace")
18
19    def tearDown(self):
20        self.handle.close()
21
22    def test_check_ACEParser(self):
23        """Test to check that ACEParser can parse the whole file into one record."""
24        record = Ace.read(self.handle)
25        self.assertEqual(record.ncontigs, 2)
26        self.assertEqual(record.nreads, 16)
27        self.assertEqual(len(record.wa), 1)
28        self.assertEqual(record.wa[0].tag_type, "phrap_params")
29        self.assertEqual(record.wa[0].program, "phrap")
30        self.assertEqual(record.wa[0].date, "040203:114710")
31        self.assertEqual(
32            record.wa[0].info,
33            [
34                "phrap 304_nuclsu.fasta.screen -new_ace -retain_duplicates",
35                "phrap version 0.990329",
36            ],
37        )
38        self.assertEqual(len(record.contigs), 2)
39        self.assertEqual(len(record.contigs[0].reads), 2)
40        self.assertEqual(record.contigs[0].name, "Contig1")
41        self.assertEqual(record.contigs[0].nbases, 856)
42        self.assertEqual(record.contigs[0].nreads, 2)
43        self.assertEqual(record.contigs[0].nsegments, 31)
44        self.assertEqual(record.contigs[0].uorc, "U")
45        center = len(record.contigs[0].sequence) // 2
46        self.assertEqual(record.contigs[0].sequence[:10], "aatacgGGAT")
47        self.assertEqual(
48            record.contigs[0].sequence[center - 5 : center + 5], "ACATCATCTG"
49        )
50        self.assertEqual(record.contigs[0].sequence[-10:], "cATCTAGtac")
51        center = len(record.contigs[0].quality) // 2
52        self.assertEqual(
53            record.contigs[0].quality[:10], [0, 0, 0, 0, 0, 0, 22, 23, 25, 28]
54        )
55        self.assertEqual(
56            record.contigs[0].quality[center - 5 : center + 5],
57            [90, 90, 90, 90, 90, 90, 90, 90, 90, 90],
58        )
59        self.assertEqual(
60            record.contigs[0].quality[-10:], [15, 22, 30, 24, 28, 22, 21, 15, 19, 0]
61        )
62        self.assertEqual(len(record.contigs[0].af), 2)
63        self.assertEqual(record.contigs[0].af[1].name, "BL060c3-LR0R.b.ab1")
64        self.assertEqual(record.contigs[0].af[1].coru, "U")
65        self.assertEqual(record.contigs[0].af[1].padded_start, 1)
66        self.assertEqual(len(record.contigs[0].bs), 31)
67        self.assertEqual(record.contigs[0].bs[15].name, "BL060c3-LR5.g.ab1")
68        self.assertEqual(record.contigs[0].bs[15].padded_start, 434)
69        self.assertEqual(record.contigs[0].bs[15].padded_end, 438)
70        self.assertEqual(record.contigs[0].bs[30].name, "BL060c3-LR0R.b.ab1")
71        self.assertEqual(record.contigs[0].bs[30].padded_start, 823)
72        self.assertEqual(record.contigs[0].bs[30].padded_end, 856)
73        self.assertEqual(len(record.contigs[0].ct), 1)
74        self.assertEqual(record.contigs[0].ct[0].name, "Contig1")
75        self.assertEqual(record.contigs[0].ct[0].tag_type, "repeat")
76        self.assertEqual(record.contigs[0].ct[0].program, "phrap")
77        self.assertEqual(record.contigs[0].ct[0].padded_start, 52)
78        self.assertEqual(record.contigs[0].ct[0].padded_end, 53)
79        self.assertEqual(record.contigs[0].ct[0].date, "555456:555432")
80        self.assertEqual(
81            record.contigs[0].ct[0].info,
82            ["This is the forst line of comment for c1", "and this the second for c1"],
83        )
84        self.assertIsNone(record.contigs[0].wa)
85        self.assertEqual(len(record.contigs[0].reads), 2)
86        self.assertEqual(record.contigs[0].reads[0].rd.name, "BL060c3-LR5.g.ab1")
87        self.assertEqual(record.contigs[0].reads[0].rd.padded_bases, 868)
88        self.assertEqual(record.contigs[0].reads[0].rd.info_items, 0)
89        self.assertEqual(record.contigs[0].reads[0].rd.read_tags, 0)
90        center = len(record.contigs[0].reads[0].rd.sequence) // 2
91        self.assertEqual(record.contigs[0].reads[0].rd.sequence[:10], "tagcgaggaa")
92        self.assertEqual(
93            record.contigs[0].reads[0].rd.sequence[center - 5 : center + 5],
94            "CCGAGGCCAA",
95        )
96        self.assertEqual(record.contigs[0].reads[0].rd.sequence[-10:], "gaaccatcag")
97        self.assertEqual(record.contigs[0].reads[0].qa.qual_clipping_start, 80)
98        self.assertEqual(record.contigs[0].reads[0].qa.qual_clipping_end, 853)
99        self.assertEqual(record.contigs[0].reads[0].qa.align_clipping_start, 22)
100        self.assertEqual(record.contigs[0].reads[0].qa.align_clipping_end, 856)
101        self.assertIsNone(record.contigs[0].reads[0].ds)
102        self.assertEqual(len(record.contigs[0].reads[0].rt), 4)
103        self.assertEqual(record.contigs[0].reads[0].rt[0].name, "BL060c3-LR5.g.ab1")
104        self.assertEqual(
105            record.contigs[0].reads[0].rt[0].tag_type, "matchElsewhereHighQual"
106        )
107        self.assertEqual(record.contigs[0].reads[0].rt[0].program, "phrap")
108        self.assertEqual(record.contigs[0].reads[0].rt[0].padded_start, 590)
109        self.assertEqual(record.contigs[0].reads[0].rt[0].padded_end, 607)
110        self.assertEqual(record.contigs[0].reads[0].rt[0].date, "040217:110357")
111        self.assertEqual(record.contigs[0].reads[0].rt[1].name, "BL060c3-LR5.g.ab1")
112        self.assertEqual(
113            record.contigs[0].reads[0].rt[1].tag_type, "matchElsewhereHighQual"
114        )
115        self.assertEqual(record.contigs[0].reads[0].rt[1].program, "phrap")
116        self.assertEqual(record.contigs[0].reads[0].rt[1].padded_start, 617)
117        self.assertEqual(record.contigs[0].reads[0].rt[1].padded_end, 631)
118        self.assertEqual(record.contigs[0].reads[0].rt[1].date, "040217:110357")
119        self.assertEqual(record.contigs[0].reads[0].rt[2].name, "BL060c3-LR5.g.ab1")
120        self.assertEqual(
121            record.contigs[0].reads[0].rt[2].tag_type, "matchElsewhereHighQual"
122        )
123        self.assertEqual(record.contigs[0].reads[0].rt[2].program, "phrap")
124        self.assertEqual(record.contigs[0].reads[0].rt[2].padded_start, 617)
125        self.assertEqual(record.contigs[0].reads[0].rt[2].padded_end, 631)
126        self.assertEqual(record.contigs[0].reads[0].rt[2].date, "040217:110357")
127        self.assertEqual(record.contigs[0].reads[0].rt[3].name, "BL060c3-LR5.g.ab1")
128        self.assertEqual(
129            record.contigs[0].reads[0].rt[3].tag_type, "matchElsewhereHighQual"
130        )
131        self.assertEqual(record.contigs[0].reads[0].rt[3].program, "phrap")
132        self.assertEqual(record.contigs[0].reads[0].rt[3].padded_start, 617)
133        self.assertEqual(record.contigs[0].reads[0].rt[3].padded_end, 631)
134        self.assertEqual(record.contigs[0].reads[0].rt[3].date, "040217:110357")
135
136        self.assertEqual(len(record.contigs[0].reads[0].wr), 1)
137        self.assertEqual(record.contigs[0].reads[0].wr[0].name, "BL060c3-LR5.g.ab1")
138        self.assertEqual(record.contigs[0].reads[0].wr[0].aligned, "unaligned")
139        self.assertEqual(record.contigs[0].reads[0].wr[0].program, "phrap")
140        self.assertEqual(record.contigs[0].reads[0].wr[0].date, "040217:110357")
141        self.assertEqual(record.contigs[0].reads[1].rd.name, "BL060c3-LR0R.b.ab1")
142        self.assertEqual(record.contigs[0].reads[1].rd.padded_bases, 856)
143        self.assertEqual(record.contigs[0].reads[1].rd.info_items, 0)
144        self.assertEqual(record.contigs[0].reads[1].rd.read_tags, 0)
145        center = len(record.contigs[0].reads[1].rd.sequence) // 2
146        self.assertEqual(record.contigs[0].reads[1].rd.sequence[:10], "aatacgGGAT")
147        self.assertEqual(
148            record.contigs[0].reads[1].rd.sequence[center - 5 : center + 5],
149            "ACATCATCTG",
150        )
151        self.assertEqual(record.contigs[0].reads[1].rd.sequence[-10:], "cATCTAGtac")
152        self.assertEqual(record.contigs[0].reads[1].qa.qual_clipping_start, 7)
153        self.assertEqual(record.contigs[0].reads[1].qa.qual_clipping_end, 778)
154        self.assertEqual(record.contigs[0].reads[1].qa.align_clipping_start, 1)
155        self.assertEqual(record.contigs[0].reads[1].qa.align_clipping_end, 856)
156        self.assertIsNone(record.contigs[0].reads[1].ds)
157        self.assertIsNone(record.contigs[0].reads[1].rt)
158        self.assertIsNone(record.contigs[0].reads[1].wr)
159
160        self.assertEqual(len(record.contigs[1].reads), 14)
161        self.assertEqual(record.contigs[1].name, "Contig2")
162        self.assertEqual(record.contigs[1].nbases, 3296)
163        self.assertEqual(record.contigs[1].nreads, 14)
164        self.assertEqual(record.contigs[1].nsegments, 214)
165        self.assertEqual(record.contigs[1].uorc, "U")
166        center = len(record.contigs[1].sequence) // 2
167        self.assertEqual(record.contigs[1].sequence[:10], "cacggatgat")
168        self.assertEqual(
169            record.contigs[1].sequence[center - 5 : center + 5], "TTTGAATATT"
170        )
171        self.assertEqual(record.contigs[1].sequence[-10:], "Atccttgtag")
172        center = len(record.contigs[1].quality) // 2
173        self.assertEqual(record.contigs[1].quality[:10], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
174        self.assertEqual(
175            record.contigs[1].quality[center - 5 : center + 5],
176            [90, 90, 90, 90, 90, 90, 90, 90, 90, 90],
177        )
178        self.assertEqual(
179            record.contigs[1].quality[-10:], [24, 0, 0, 0, 0, 0, 0, 0, 0, 0]
180        )
181        self.assertEqual(len(record.contigs[1].af), 14)
182        self.assertEqual(record.contigs[1].af[7].name, "BL060-LR3R.b.ab1")
183        self.assertEqual(record.contigs[1].af[7].coru, "C")
184        self.assertEqual(record.contigs[1].af[7].padded_start, 1601)
185        self.assertEqual(record.contigs[1].af[13].name, "BL060c2-LR0R.b.ab1")
186        self.assertEqual(record.contigs[1].af[13].coru, "C")
187        self.assertEqual(record.contigs[1].af[13].padded_start, 2445)
188        self.assertEqual(len(record.contigs[1].bs), 214)
189        self.assertEqual(record.contigs[1].bs[107].name, "BL060-c1-LR3R.b.ab1")
190        self.assertEqual(record.contigs[1].bs[107].padded_start, 2286)
191        self.assertEqual(record.contigs[1].bs[107].padded_end, 2292)
192        self.assertEqual(record.contigs[1].bs[213].name, "BL060c2-LR0R.b.ab1")
193        self.assertEqual(record.contigs[1].bs[213].padded_start, 3236)
194        self.assertEqual(record.contigs[1].bs[213].padded_end, 3296)
195        self.assertEqual(len(record.contigs[1].ct), 1)
196        self.assertEqual(record.contigs[1].ct[0].name, "Contig2")
197        self.assertEqual(record.contigs[1].ct[0].tag_type, "repeat")
198        self.assertEqual(record.contigs[1].ct[0].program, "phrap")
199        self.assertEqual(record.contigs[1].ct[0].padded_start, 42)
200        self.assertEqual(record.contigs[1].ct[0].padded_end, 43)
201        self.assertEqual(record.contigs[1].ct[0].date, "123456:765432")
202        self.assertEqual(
203            record.contigs[1].ct[0].info,
204            ["This is the forst line of comment for c2", "and this the second for c2"],
205        )
206        self.assertEqual(len(record.contigs[1].wa), 1)
207        self.assertEqual(record.contigs[1].wa[0].tag_type, "phrap_params")
208        self.assertEqual(record.contigs[1].wa[0].program, "phrap")
209        self.assertEqual(record.contigs[1].wa[0].date, "040203:114710")
210        self.assertEqual(
211            record.contigs[1].wa[0].info,
212            [
213                "phrap 304_nuclsu.fasta.screen -new_ace -retain_duplicates",
214                "phrap version 0.990329",
215            ],
216        )
217
218        self.assertEqual(len(record.contigs[1].reads), 14)
219
220        # Read 0
221        self.assertEqual(record.contigs[1].reads[0].rd.name, "BL060-c1-LR12.g.ab1")
222        self.assertEqual(record.contigs[1].reads[0].rd.padded_bases, 862)
223        self.assertEqual(record.contigs[1].reads[0].rd.info_items, 0)
224        self.assertEqual(record.contigs[1].reads[0].rd.read_tags, 0)
225        center = len(record.contigs[1].reads[0].rd.sequence) // 2
226        self.assertEqual(record.contigs[1].reads[0].rd.sequence[:10], "cacggatgat")
227        self.assertEqual(
228            record.contigs[1].reads[0].rd.sequence[center - 5 : center + 5],
229            "GTTCTCGTTG",
230        )
231        self.assertEqual(record.contigs[1].reads[0].rd.sequence[-10:], "CGTTTACCcg")
232        self.assertEqual(record.contigs[1].reads[0].qa.qual_clipping_start, 81)
233        self.assertEqual(record.contigs[1].reads[0].qa.qual_clipping_end, 842)
234        self.assertEqual(record.contigs[1].reads[0].qa.align_clipping_start, 1)
235        self.assertEqual(record.contigs[1].reads[0].qa.align_clipping_end, 862)
236        self.assertEqual(
237            record.contigs[1].reads[0].ds.chromat_file, "BL060-c1-LR12.g.ab1"
238        )
239        self.assertEqual(
240            record.contigs[1].reads[0].ds.phd_file, "BL060-c1-LR12.g.ab1.phd.1"
241        )
242        self.assertEqual(record.contigs[1].reads[0].ds.time, "Tue Feb  3 11:01:16 2004")
243        self.assertEqual(record.contigs[1].reads[0].ds.chem, "term")
244        self.assertEqual(record.contigs[1].reads[0].ds.dye, "big")
245        self.assertEqual(record.contigs[1].reads[0].ds.template, "")
246        self.assertEqual(record.contigs[1].reads[0].ds.direction, "")
247        self.assertIsNone(record.contigs[1].reads[0].rt)
248        self.assertIsNone(record.contigs[1].reads[0].wr)
249
250        # Read 1
251        self.assertEqual(record.contigs[1].reads[1].rd.name, "BL060-c1-LR11.g.ab1")
252        self.assertEqual(record.contigs[1].reads[1].rd.padded_bases, 880)
253        self.assertEqual(record.contigs[1].reads[1].rd.info_items, 0)
254        self.assertEqual(record.contigs[1].reads[1].rd.read_tags, 0)
255        center = len(record.contigs[1].reads[1].rd.sequence) // 2
256        self.assertEqual(record.contigs[1].reads[1].rd.sequence[:10], "ctttctgacC")
257        self.assertEqual(
258            record.contigs[1].reads[1].rd.sequence[center - 5 : center + 5],
259            "CTGTGGTTTC",
260        )
261        self.assertEqual(record.contigs[1].reads[1].rd.sequence[-10:], "cggagttacg")
262        self.assertEqual(record.contigs[1].reads[1].qa.qual_clipping_start, 11)
263        self.assertEqual(record.contigs[1].reads[1].qa.qual_clipping_end, 807)
264        self.assertEqual(record.contigs[1].reads[1].qa.align_clipping_start, 8)
265        self.assertEqual(record.contigs[1].reads[1].qa.align_clipping_end, 880)
266        self.assertEqual(
267            record.contigs[1].reads[1].ds.chromat_file, "BL060-c1-LR11.g.ab1"
268        )
269        self.assertEqual(
270            record.contigs[1].reads[1].ds.phd_file, "BL060-c1-LR11.g.ab1.phd.1"
271        )
272        self.assertEqual(record.contigs[1].reads[1].ds.time, "Tue Feb  3 11:01:16 2004")
273        self.assertEqual(record.contigs[1].reads[1].ds.chem, "term")
274        self.assertEqual(record.contigs[1].reads[1].ds.dye, "big")
275        self.assertEqual(record.contigs[1].reads[1].ds.template, "")
276        self.assertEqual(record.contigs[1].reads[1].ds.direction, "")
277        self.assertEqual(len(record.contigs[1].reads[1].rt), 0)
278        self.assertIsNone(record.contigs[1].reads[1].wr)
279
280        # Read 2
281        self.assertEqual(record.contigs[1].reads[2].rd.name, "BL060-c1-LR9.g.ab1")
282        self.assertEqual(record.contigs[1].reads[2].rd.padded_bases, 864)
283        self.assertEqual(record.contigs[1].reads[2].rd.info_items, 0)
284        self.assertEqual(record.contigs[1].reads[2].rd.read_tags, 0)
285        center = len(record.contigs[1].reads[2].rd.sequence) // 2
286        self.assertEqual(record.contigs[1].reads[2].rd.sequence[:10], "cacccaCTTT")
287        self.assertEqual(
288            record.contigs[1].reads[2].rd.sequence[center - 5 : center + 5],
289            "ACCAAACATT",
290        )
291        self.assertEqual(record.contigs[1].reads[2].rd.sequence[-10:], "GGTAGCACgc")
292        self.assertEqual(record.contigs[1].reads[2].qa.qual_clipping_start, 7)
293        self.assertEqual(record.contigs[1].reads[2].qa.qual_clipping_end, 840)
294        self.assertEqual(record.contigs[1].reads[2].qa.align_clipping_start, 4)
295        self.assertEqual(record.contigs[1].reads[2].qa.align_clipping_end, 864)
296        self.assertEqual(
297            record.contigs[1].reads[2].ds.chromat_file, "BL060-c1-LR9.g.ab1"
298        )
299        self.assertEqual(
300            record.contigs[1].reads[2].ds.phd_file, "BL060-c1-LR9.g.ab1.phd.1"
301        )
302        self.assertEqual(record.contigs[1].reads[2].ds.time, "Tue Feb  3 11:01:16 2004")
303        self.assertEqual(record.contigs[1].reads[2].ds.chem, "term")
304        self.assertEqual(record.contigs[1].reads[2].ds.dye, "big")
305        self.assertEqual(record.contigs[1].reads[2].ds.template, "")
306        self.assertEqual(record.contigs[1].reads[2].ds.direction, "")
307        self.assertIsNone(record.contigs[1].reads[2].rt)
308        self.assertIsNone(record.contigs[1].reads[2].wr)
309
310        # Read 3
311        self.assertEqual(record.contigs[1].reads[3].rd.name, "BL060-c1-LR17R.b.ab1")
312        self.assertEqual(record.contigs[1].reads[3].rd.padded_bases, 863)
313        self.assertEqual(record.contigs[1].reads[3].rd.info_items, 0)
314        self.assertEqual(record.contigs[1].reads[3].rd.read_tags, 0)
315        center = len(record.contigs[1].reads[3].rd.sequence) // 2
316        self.assertEqual(record.contigs[1].reads[3].rd.sequence[:10], "ctaattggcc")
317        self.assertEqual(
318            record.contigs[1].reads[3].rd.sequence[center - 5 : center + 5],
319            "GGAACCTTTC",
320        )
321        self.assertEqual(record.contigs[1].reads[3].rd.sequence[-10:], "CAACCTgact")
322        self.assertEqual(record.contigs[1].reads[3].qa.qual_clipping_start, 63)
323        self.assertEqual(record.contigs[1].reads[3].qa.qual_clipping_end, 857)
324        self.assertEqual(record.contigs[1].reads[3].qa.align_clipping_start, 1)
325        self.assertEqual(record.contigs[1].reads[3].qa.align_clipping_end, 861)
326        self.assertEqual(
327            record.contigs[1].reads[3].ds.chromat_file, "BL060-c1-LR17R.b.ab1"
328        )
329        self.assertEqual(
330            record.contigs[1].reads[3].ds.phd_file, "BL060-c1-LR17R.b.ab1.phd.1"
331        )
332        self.assertEqual(record.contigs[1].reads[3].ds.time, "Tue Feb  3 11:01:16 2004")
333        self.assertEqual(record.contigs[1].reads[3].ds.chem, "term")
334        self.assertEqual(record.contigs[1].reads[3].ds.dye, "big")
335        self.assertEqual(record.contigs[1].reads[3].ds.template, "")
336        self.assertEqual(record.contigs[1].reads[3].ds.direction, "")
337        self.assertEqual(record.contigs[1].reads[3].rt, [])
338        self.assertIsNone(record.contigs[1].reads[3].wr)
339
340        # Read 4
341        self.assertEqual(record.contigs[1].reads[4].rd.name, "BL060-LR8.5.g.ab1")
342        self.assertEqual(record.contigs[1].reads[4].rd.padded_bases, 877)
343        self.assertEqual(record.contigs[1].reads[4].rd.info_items, 0)
344        self.assertEqual(record.contigs[1].reads[4].rd.read_tags, 0)
345        center = len(record.contigs[1].reads[4].rd.sequence) // 2
346        self.assertEqual(record.contigs[1].reads[4].rd.sequence[:10], "tgCTGCGGTT")
347        self.assertEqual(
348            record.contigs[1].reads[4].rd.sequence[center - 5 : center + 5],
349            "GGCAGTTTCA",
350        )
351        self.assertEqual(record.contigs[1].reads[4].rd.sequence[-10:], "tactcataaa")
352        self.assertEqual(record.contigs[1].reads[4].qa.qual_clipping_start, 13)
353        self.assertEqual(record.contigs[1].reads[4].qa.qual_clipping_end, 729)
354        self.assertEqual(record.contigs[1].reads[4].qa.align_clipping_start, 1)
355        self.assertEqual(record.contigs[1].reads[4].qa.align_clipping_end, 877)
356        self.assertEqual(
357            record.contigs[1].reads[4].ds.chromat_file, "BL060-LR8.5.g.ab1"
358        )
359        self.assertEqual(
360            record.contigs[1].reads[4].ds.phd_file, "BL060-LR8.5.g.ab1.phd.1"
361        )
362        self.assertEqual(record.contigs[1].reads[4].ds.time, "Fri Nov 14 09:46:03 2003")
363        self.assertEqual(record.contigs[1].reads[4].ds.chem, "term")
364        self.assertEqual(record.contigs[1].reads[4].ds.dye, "big")
365        self.assertEqual(record.contigs[1].reads[4].ds.template, "")
366        self.assertEqual(record.contigs[1].reads[4].ds.direction, "")
367        self.assertIsNone(record.contigs[1].reads[4].rt)
368        self.assertIsNone(record.contigs[1].reads[4].wr)
369
370        # Read 5
371        self.assertEqual(record.contigs[1].reads[5].rd.name, "BL060-LR3R.b.ab1")
372        self.assertEqual(record.contigs[1].reads[5].rd.padded_bases, 874)
373        self.assertEqual(record.contigs[1].reads[5].rd.info_items, 0)
374        self.assertEqual(record.contigs[1].reads[5].rd.read_tags, 0)
375        center = len(record.contigs[1].reads[5].rd.sequence) // 2
376        self.assertEqual(record.contigs[1].reads[5].rd.sequence[:10], "ctCTTAGGAT")
377        self.assertEqual(
378            record.contigs[1].reads[5].rd.sequence[center - 5 : center + 5],
379            "AACTCACATT",
380        )
381        self.assertEqual(record.contigs[1].reads[5].rd.sequence[-10:], "*CACCCAAac")
382        self.assertEqual(record.contigs[1].reads[5].qa.qual_clipping_start, 65)
383        self.assertEqual(record.contigs[1].reads[5].qa.qual_clipping_end, 874)
384        self.assertEqual(record.contigs[1].reads[5].qa.align_clipping_start, 1)
385        self.assertEqual(record.contigs[1].reads[5].qa.align_clipping_end, 874)
386        self.assertEqual(record.contigs[1].reads[5].ds.chromat_file, "BL060-LR3R.b.ab1")
387        self.assertEqual(
388            record.contigs[1].reads[5].ds.phd_file, "BL060-LR3R.b.ab1.phd.1"
389        )
390        self.assertEqual(record.contigs[1].reads[5].ds.time, "Fri Nov 14 09:46:03 2003")
391        self.assertEqual(record.contigs[1].reads[5].ds.chem, "term")
392        self.assertEqual(record.contigs[1].reads[5].ds.dye, "big")
393        self.assertEqual(record.contigs[1].reads[5].ds.template, "")
394        self.assertEqual(record.contigs[1].reads[5].ds.direction, "")
395        self.assertIsNone(record.contigs[1].reads[5].rt)
396        self.assertIsNone(record.contigs[1].reads[5].wr)
397
398        # Read 6
399        self.assertEqual(record.contigs[1].reads[6].rd.name, "BL060-c1-LR3R.b.ab1")
400        self.assertEqual(record.contigs[1].reads[6].rd.padded_bases, 864)
401        self.assertEqual(record.contigs[1].reads[6].rd.info_items, 0)
402        self.assertEqual(record.contigs[1].reads[6].rd.read_tags, 0)
403        center = len(record.contigs[1].reads[6].rd.sequence) // 2
404        self.assertEqual(record.contigs[1].reads[6].rd.sequence[:10], "CCaTGTCCAA")
405        self.assertEqual(
406            record.contigs[1].reads[6].rd.sequence[center - 5 : center + 5],
407            "AAGGGTT*CA",
408        )
409        self.assertEqual(record.contigs[1].reads[6].rd.sequence[-10:], "ACACTCGCga")
410        self.assertEqual(record.contigs[1].reads[6].qa.qual_clipping_start, 73)
411        self.assertEqual(record.contigs[1].reads[6].qa.qual_clipping_end, 862)
412        self.assertEqual(record.contigs[1].reads[6].qa.align_clipping_start, 1)
413        self.assertEqual(record.contigs[1].reads[6].qa.align_clipping_end, 863)
414        self.assertEqual(
415            record.contigs[1].reads[6].ds.chromat_file, "BL060-c1-LR3R.b.ab1"
416        )
417        self.assertEqual(
418            record.contigs[1].reads[6].ds.phd_file, "BL060-c1-LR3R.b.ab1.phd.1"
419        )
420        self.assertEqual(record.contigs[1].reads[6].ds.time, "Tue Feb  3 11:01:16 2004")
421        self.assertEqual(record.contigs[1].reads[6].ds.chem, "term")
422        self.assertEqual(record.contigs[1].reads[6].ds.dye, "big")
423        self.assertEqual(record.contigs[1].reads[6].ds.template, "")
424        self.assertEqual(record.contigs[1].reads[6].ds.direction, "")
425        self.assertIsNone(record.contigs[1].reads[6].rt)
426        self.assertIsNone(record.contigs[1].reads[6].wr)
427
428        # Read 7
429        self.assertEqual(record.contigs[1].reads[7].rd.name, "BL060-LR3R.b.ab1")
430        self.assertEqual(record.contigs[1].reads[7].rd.padded_bases, 857)
431        self.assertEqual(record.contigs[1].reads[7].rd.info_items, 0)
432        self.assertEqual(record.contigs[1].reads[7].rd.read_tags, 0)
433        center = len(record.contigs[1].reads[7].rd.sequence) // 2
434        self.assertEqual(record.contigs[1].reads[7].rd.sequence[:10], "agaaagagga")
435        self.assertEqual(
436            record.contigs[1].reads[7].rd.sequence[center - 5 : center + 5],
437            "nnnannnnnn",
438        )
439        self.assertEqual(record.contigs[1].reads[7].rd.sequence[-10:], "gtctttgctc")
440        self.assertEqual(record.contigs[1].reads[7].qa.qual_clipping_start, 548)
441        self.assertEqual(record.contigs[1].reads[7].qa.qual_clipping_end, 847)
442        self.assertEqual(record.contigs[1].reads[7].qa.align_clipping_start, 442)
443        self.assertEqual(record.contigs[1].reads[7].qa.align_clipping_end, 854)
444        self.assertEqual(record.contigs[1].reads[7].ds.chromat_file, "BL060-LR3R.b.ab1")
445        self.assertEqual(
446            record.contigs[1].reads[7].ds.phd_file, "BL060-LR3R.b.ab1.phd.1"
447        )
448        self.assertEqual(record.contigs[1].reads[7].ds.time, "Fri Jan 16 09:01:10 2004")
449        self.assertEqual(record.contigs[1].reads[7].ds.chem, "term")
450        self.assertEqual(record.contigs[1].reads[7].ds.dye, "big")
451        self.assertEqual(record.contigs[1].reads[7].ds.template, "")
452        self.assertEqual(record.contigs[1].reads[7].ds.direction, "")
453        self.assertIsNone(record.contigs[1].reads[7].rt)
454        self.assertIsNone(record.contigs[1].reads[7].wr)
455
456        # Read 8
457        self.assertEqual(record.contigs[1].reads[8].rd.name, "BL060-c1-LR7.g.ab1")
458        self.assertEqual(record.contigs[1].reads[8].rd.padded_bases, 878)
459        self.assertEqual(record.contigs[1].reads[8].rd.info_items, 0)
460        self.assertEqual(record.contigs[1].reads[8].rd.read_tags, 0)
461        center = len(record.contigs[1].reads[8].rd.sequence) // 2
462        self.assertEqual(record.contigs[1].reads[8].rd.sequence[:10], "agTttc*ctc")
463        self.assertEqual(
464            record.contigs[1].reads[8].rd.sequence[center - 5 : center + 5],
465            "TCATAAAACT",
466        )
467        self.assertEqual(record.contigs[1].reads[8].rd.sequence[-10:], "xxxxxxxxxx")
468        self.assertEqual(record.contigs[1].reads[8].qa.qual_clipping_start, 20)
469        self.assertEqual(record.contigs[1].reads[8].qa.qual_clipping_end, 798)
470        self.assertEqual(record.contigs[1].reads[8].qa.align_clipping_start, 1)
471        self.assertEqual(record.contigs[1].reads[8].qa.align_clipping_end, 798)
472        self.assertEqual(
473            record.contigs[1].reads[8].ds.chromat_file, "BL060-c1-LR7.g.ab1"
474        )
475        self.assertEqual(
476            record.contigs[1].reads[8].ds.phd_file, "BL060-c1-LR7.g.ab1.phd.1"
477        )
478        self.assertEqual(record.contigs[1].reads[8].ds.time, "Tue Feb  3 11:01:16 2004")
479        self.assertEqual(record.contigs[1].reads[8].ds.chem, "term")
480        self.assertEqual(record.contigs[1].reads[8].ds.dye, "big")
481        self.assertEqual(record.contigs[1].reads[8].ds.template, "")
482        self.assertEqual(record.contigs[1].reads[8].ds.direction, "")
483        self.assertIsNone(record.contigs[1].reads[8].rt)
484        self.assertIsNone(record.contigs[1].reads[8].wr)
485
486        # Read 9
487        self.assertEqual(record.contigs[1].reads[9].rd.name, "BL060-LR7.g.ab1")
488        self.assertEqual(record.contigs[1].reads[9].rd.padded_bases, 880)
489        self.assertEqual(record.contigs[1].reads[9].rd.info_items, 0)
490        self.assertEqual(record.contigs[1].reads[9].rd.read_tags, 0)
491        center = len(record.contigs[1].reads[9].rd.sequence) // 2
492        self.assertEqual(record.contigs[1].reads[9].rd.sequence[:10], "ggctaCGCCc")
493        self.assertEqual(
494            record.contigs[1].reads[9].rd.sequence[center - 5 : center + 5],
495            "ATTGAGTTTC",
496        )
497        self.assertEqual(record.contigs[1].reads[9].rd.sequence[-10:], "tggcgttgcg")
498        self.assertEqual(record.contigs[1].reads[9].qa.qual_clipping_start, 14)
499        self.assertEqual(record.contigs[1].reads[9].qa.qual_clipping_end, 765)
500        self.assertEqual(record.contigs[1].reads[9].qa.align_clipping_start, 4)
501        self.assertEqual(record.contigs[1].reads[9].qa.align_clipping_end, 765)
502        self.assertEqual(record.contigs[1].reads[9].ds.chromat_file, "BL060-LR7.g.ab1")
503        self.assertEqual(
504            record.contigs[1].reads[9].ds.phd_file, "BL060-LR7.g.ab1.phd.1"
505        )
506        self.assertEqual(record.contigs[1].reads[9].ds.time, "Fri Nov 14 09:46:03 2003")
507        self.assertEqual(record.contigs[1].reads[9].ds.chem, "term")
508        self.assertEqual(record.contigs[1].reads[9].ds.dye, "big")
509        self.assertEqual(record.contigs[1].reads[9].ds.template, "")
510        self.assertEqual(record.contigs[1].reads[9].ds.direction, "")
511        self.assertIsNone(record.contigs[1].reads[9].rt)
512        self.assertIsNone(record.contigs[1].reads[9].wr)
513
514        # Read 10
515        self.assertEqual(record.contigs[1].reads[10].rd.name, "BL060c5-LR5.g.ab1")
516        self.assertEqual(record.contigs[1].reads[10].rd.padded_bases, 871)
517        self.assertEqual(record.contigs[1].reads[10].rd.info_items, 0)
518        self.assertEqual(record.contigs[1].reads[10].rd.read_tags, 0)
519        center = len(record.contigs[1].reads[10].rd.sequence) // 2
520        self.assertEqual(record.contigs[1].reads[10].rd.sequence[:10], "ggtTCGATTA")
521        self.assertEqual(
522            record.contigs[1].reads[10].rd.sequence[center - 5 : center + 5],
523            "ACCAATTGAC",
524        )
525        self.assertEqual(record.contigs[1].reads[10].rd.sequence[-10:], "ACCACCCatt")
526        self.assertEqual(record.contigs[1].reads[10].qa.qual_clipping_start, 12)
527        self.assertEqual(record.contigs[1].reads[10].qa.qual_clipping_end, 767)
528        self.assertEqual(record.contigs[1].reads[10].qa.align_clipping_start, 1)
529        self.assertEqual(record.contigs[1].reads[10].qa.align_clipping_end, 871)
530        self.assertEqual(
531            record.contigs[1].reads[10].ds.chromat_file, "BL060c5-LR5.g.ab1"
532        )
533        self.assertEqual(
534            record.contigs[1].reads[10].ds.phd_file, "BL060c5-LR5.g.ab1.phd.1"
535        )
536        self.assertEqual(
537            record.contigs[1].reads[10].ds.time, "Fri Nov 14 09:46:03 2003"
538        )
539        self.assertEqual(record.contigs[1].reads[10].ds.chem, "term")
540        self.assertEqual(record.contigs[1].reads[10].ds.dye, "big")
541        self.assertEqual(record.contigs[1].reads[10].ds.template, "")
542        self.assertEqual(record.contigs[1].reads[10].ds.direction, "")
543        self.assertIsNone(record.contigs[1].reads[10].rt)
544        self.assertIsNone(record.contigs[1].reads[10].wr)
545
546        # Read 11
547        self.assertEqual(record.contigs[1].reads[11].rd.name, "BL060c2-LR5.g.ab1")
548        self.assertEqual(record.contigs[1].reads[11].rd.padded_bases, 839)
549        self.assertEqual(record.contigs[1].reads[11].rd.info_items, 0)
550        self.assertEqual(record.contigs[1].reads[11].rd.read_tags, 0)
551        center = len(record.contigs[1].reads[11].rd.sequence) // 2
552        self.assertEqual(record.contigs[1].reads[11].rd.sequence[:10], "ggttcatatg")
553        self.assertEqual(
554            record.contigs[1].reads[11].rd.sequence[center - 5 : center + 5],
555            "TAAAATCAGT",
556        )
557        self.assertEqual(record.contigs[1].reads[11].rd.sequence[-10:], "TCTTGCaata")
558        self.assertEqual(record.contigs[1].reads[11].qa.qual_clipping_start, 11)
559        self.assertEqual(record.contigs[1].reads[11].qa.qual_clipping_end, 757)
560        self.assertEqual(record.contigs[1].reads[11].qa.align_clipping_start, 10)
561        self.assertEqual(record.contigs[1].reads[11].qa.align_clipping_end, 835)
562        self.assertIsNone(record.contigs[1].reads[11].ds)
563        self.assertEqual(len(record.contigs[1].reads[11].rt), 1)
564        self.assertEqual(record.contigs[1].reads[11].rt[0].name, "BL060c2-LR5.g.ab1")
565        self.assertEqual(
566            record.contigs[1].reads[11].rt[0].tag_type, "matchElsewhereHighQual"
567        )
568        self.assertEqual(record.contigs[1].reads[11].rt[0].program, "phrap")
569        self.assertEqual(record.contigs[1].reads[11].rt[0].padded_start, 617)
570        self.assertEqual(record.contigs[1].reads[11].rt[0].padded_end, 631)
571        self.assertEqual(record.contigs[1].reads[11].rt[0].date, "040217:110357")
572        self.assertIsNone(record.contigs[1].reads[11].wr)
573
574        # Read 12
575        self.assertEqual(record.contigs[1].reads[12].rd.name, "BL060c5-LR0R.b.ab1")
576        self.assertEqual(record.contigs[1].reads[12].rd.padded_bases, 855)
577        self.assertEqual(record.contigs[1].reads[12].rd.info_items, 0)
578        self.assertEqual(record.contigs[1].reads[12].rd.read_tags, 0)
579        center = len(record.contigs[1].reads[12].rd.sequence) // 2
580        self.assertEqual(record.contigs[1].reads[12].rd.sequence[:10], "cACTCGCGTA")
581        self.assertEqual(
582            record.contigs[1].reads[12].rd.sequence[center - 5 : center + 5],
583            "CTCGTAAAAT",
584        )
585        self.assertEqual(record.contigs[1].reads[12].rd.sequence[-10:], "aacccctgca")
586        self.assertEqual(record.contigs[1].reads[12].qa.qual_clipping_start, 94)
587        self.assertEqual(record.contigs[1].reads[12].qa.qual_clipping_end, 835)
588        self.assertEqual(record.contigs[1].reads[12].qa.align_clipping_start, 1)
589        self.assertEqual(record.contigs[1].reads[12].qa.align_clipping_end, 847)
590        self.assertEqual(
591            record.contigs[1].reads[12].ds.chromat_file, "BL060c5-LR0R.b.ab1"
592        )
593        self.assertEqual(
594            record.contigs[1].reads[12].ds.phd_file, "BL060c5-LR0R.b.ab1.phd.1"
595        )
596        self.assertEqual(
597            record.contigs[1].reads[12].ds.time, "Wed Nov 12 08:16:30 2003"
598        )
599        self.assertEqual(record.contigs[1].reads[12].ds.chem, "term")
600        self.assertEqual(record.contigs[1].reads[12].ds.dye, "big")
601        self.assertEqual(record.contigs[1].reads[12].ds.template, "")
602        self.assertEqual(record.contigs[1].reads[12].ds.direction, "")
603        self.assertEqual(len(record.contigs[1].reads[12].rt), 1)
604        self.assertEqual(record.contigs[1].reads[12].rt[0].name, "BL060c5-LR0R.b.ab1")
605        self.assertEqual(
606            record.contigs[1].reads[12].rt[0].tag_type, "matchElsewhereHighQual"
607        )
608        self.assertEqual(record.contigs[1].reads[12].rt[0].program, "phrap")
609        self.assertEqual(record.contigs[1].reads[12].rt[0].padded_start, 617)
610        self.assertEqual(record.contigs[1].reads[12].rt[0].padded_end, 631)
611        self.assertEqual(record.contigs[1].reads[12].rt[0].date, "040217:110357")
612        self.assertIsNone(record.contigs[1].reads[12].wr)
613
614        # Read 13
615        self.assertEqual(record.contigs[1].reads[13].rd.name, "BL060c2-LR0R.b.ab1")
616        self.assertEqual(record.contigs[1].reads[13].rd.padded_bases, 852)
617        self.assertEqual(record.contigs[1].reads[13].rd.info_items, 0)
618        self.assertEqual(record.contigs[1].reads[13].rd.read_tags, 0)
619        center = len(record.contigs[1].reads[13].rd.sequence) // 2
620        self.assertEqual(record.contigs[1].reads[13].rd.sequence[:10], "cgCGTa*tTG")
621        self.assertEqual(
622            record.contigs[1].reads[13].rd.sequence[center - 5 : center + 5],
623            "GTAAAATATT",
624        )
625        self.assertEqual(record.contigs[1].reads[13].rd.sequence[-10:], "Atccttgtag")
626        self.assertEqual(record.contigs[1].reads[13].qa.qual_clipping_start, 33)
627        self.assertEqual(record.contigs[1].reads[13].qa.qual_clipping_end, 831)
628        self.assertEqual(record.contigs[1].reads[13].qa.align_clipping_start, 1)
629        self.assertEqual(record.contigs[1].reads[13].qa.align_clipping_end, 852)
630        self.assertEqual(
631            record.contigs[1].reads[13].ds.chromat_file, "BL060c2-LR0R.b.ab1"
632        )
633        self.assertEqual(
634            record.contigs[1].reads[13].ds.phd_file, "BL060c2-LR0R.b.ab1.phd.1"
635        )
636        self.assertEqual(
637            record.contigs[1].reads[13].ds.time, "Wed Nov 12 08:16:29 2003"
638        )
639        self.assertEqual(record.contigs[1].reads[13].ds.chem, "term")
640        self.assertEqual(record.contigs[1].reads[13].ds.dye, "big")
641        self.assertEqual(record.contigs[1].reads[13].ds.template, "")
642        self.assertEqual(record.contigs[1].reads[13].ds.direction, "")
643        self.assertEqual(record.contigs[1].reads[13].rt, [])
644        self.assertEqual(len(record.contigs[1].reads[13].wr), 1)
645        self.assertEqual(record.contigs[1].reads[13].wr[0].name, "BL060c2-LR0R.b.ab1")
646        self.assertEqual(record.contigs[1].reads[13].wr[0].aligned, "unaligned")
647        self.assertEqual(record.contigs[1].reads[13].wr[0].program, "phrap")
648        self.assertEqual(record.contigs[1].reads[13].wr[0].date, "040217:110357")
649
650    def test_check_record_parser(self):
651        """Test to check that contig parser parses each contig into a contig."""
652        contigs = Ace.parse(self.handle)
653
654        # First contig
655        contig = next(contigs)
656        self.assertEqual(len(contig.reads), 2)
657        self.assertEqual(contig.name, "Contig1")
658        self.assertEqual(contig.nbases, 856)
659        self.assertEqual(contig.nreads, 2)
660        self.assertEqual(contig.nsegments, 31)
661        self.assertEqual(contig.uorc, "U")
662        center = len(contig.sequence) // 2
663        self.assertEqual(contig.sequence[:10], "aatacgGGAT")
664        self.assertEqual(contig.sequence[center - 5 : center + 5], "ACATCATCTG")
665        self.assertEqual(contig.sequence[-10:], "cATCTAGtac")
666        center = len(contig.quality) // 2
667        self.assertEqual(contig.quality[:10], [0, 0, 0, 0, 0, 0, 22, 23, 25, 28])
668        self.assertEqual(
669            contig.quality[center - 5 : center + 5],
670            [90, 90, 90, 90, 90, 90, 90, 90, 90, 90],
671        )
672        self.assertEqual(contig.quality[-10:], [15, 22, 30, 24, 28, 22, 21, 15, 19, 0])
673        self.assertEqual(len(contig.af), 2)
674        self.assertEqual(contig.af[1].name, "BL060c3-LR0R.b.ab1")
675        self.assertEqual(contig.af[1].coru, "U")
676        self.assertEqual(contig.af[1].padded_start, 1)
677        self.assertEqual(len(contig.bs), 31)
678        self.assertEqual(contig.bs[15].name, "BL060c3-LR5.g.ab1")
679        self.assertEqual(contig.bs[15].padded_start, 434)
680        self.assertEqual(contig.bs[15].padded_end, 438)
681        self.assertEqual(contig.bs[30].name, "BL060c3-LR0R.b.ab1")
682        self.assertEqual(contig.bs[30].padded_start, 823)
683        self.assertEqual(contig.bs[30].padded_end, 856)
684        self.assertIsNone(contig.ct)
685        self.assertIsNone(contig.wa)
686        self.assertEqual(len(contig.reads), 2)
687        self.assertEqual(contig.reads[0].rd.name, "BL060c3-LR5.g.ab1")
688        self.assertEqual(contig.reads[0].rd.padded_bases, 868)
689        self.assertEqual(contig.reads[0].rd.info_items, 0)
690        self.assertEqual(contig.reads[0].rd.read_tags, 0)
691        center = len(contig.reads[0].rd.sequence) // 2
692        self.assertEqual(contig.reads[0].rd.sequence[:10], "tagcgaggaa")
693        self.assertEqual(
694            contig.reads[0].rd.sequence[center - 5 : center + 5], "CCGAGGCCAA"
695        )
696        self.assertEqual(contig.reads[0].rd.sequence[-10:], "gaaccatcag")
697        self.assertEqual(contig.reads[0].qa.qual_clipping_start, 80)
698        self.assertEqual(contig.reads[0].qa.qual_clipping_end, 853)
699        self.assertEqual(contig.reads[0].qa.align_clipping_start, 22)
700        self.assertEqual(contig.reads[0].qa.align_clipping_end, 856)
701        self.assertIsNone(contig.reads[0].ds)
702        self.assertEqual(len(contig.reads[0].rt), 2)
703        self.assertEqual(contig.reads[0].rt[0].name, "BL060c3-LR5.g.ab1")
704        self.assertEqual(contig.reads[0].rt[0].tag_type, "matchElsewhereHighQual")
705        self.assertEqual(contig.reads[0].rt[0].program, "phrap")
706        self.assertEqual(contig.reads[0].rt[0].padded_start, 590)
707        self.assertEqual(contig.reads[0].rt[0].padded_end, 607)
708        self.assertEqual(contig.reads[0].rt[0].date, "040217:110357")
709        self.assertEqual(contig.reads[0].rt[1].name, "BL060c3-LR5.g.ab1")
710        self.assertEqual(contig.reads[0].rt[1].tag_type, "matchElsewhereHighQual")
711        self.assertEqual(contig.reads[0].rt[1].program, "phrap")
712        self.assertEqual(contig.reads[0].rt[1].padded_start, 617)
713        self.assertEqual(contig.reads[0].rt[1].padded_end, 631)
714        self.assertEqual(contig.reads[0].rt[1].date, "040217:110357")
715
716        self.assertEqual(len(contig.reads[0].wr), 1)
717        self.assertEqual(contig.reads[0].wr[0].name, "BL060c3-LR5.g.ab1")
718        self.assertEqual(contig.reads[0].wr[0].aligned, "unaligned")
719        self.assertEqual(contig.reads[0].wr[0].program, "phrap")
720        self.assertEqual(contig.reads[0].wr[0].date, "040217:110357")
721
722        self.assertEqual(contig.reads[1].rd.name, "BL060c3-LR0R.b.ab1")
723        self.assertEqual(contig.reads[1].rd.padded_bases, 856)
724        self.assertEqual(contig.reads[1].rd.info_items, 0)
725        self.assertEqual(contig.reads[1].rd.read_tags, 0)
726        center = len(contig.reads[1].rd.sequence) // 2
727        self.assertEqual(contig.reads[1].rd.sequence[:10], "aatacgGGAT")
728        self.assertEqual(
729            contig.reads[1].rd.sequence[center - 5 : center + 5], "ACATCATCTG"
730        )
731        self.assertEqual(contig.reads[1].rd.sequence[-10:], "cATCTAGtac")
732        self.assertEqual(contig.reads[1].qa.qual_clipping_start, 7)
733        self.assertEqual(contig.reads[1].qa.qual_clipping_end, 778)
734        self.assertEqual(contig.reads[1].qa.align_clipping_start, 1)
735        self.assertEqual(contig.reads[1].qa.align_clipping_end, 856)
736        self.assertIsNone(contig.reads[1].ds)
737        self.assertIsNone(contig.reads[1].rt)
738        self.assertIsNone(contig.reads[1].wr)
739
740        # Second contig
741        contig = next(contigs)
742        self.assertEqual(len(contig.reads), 14)
743        self.assertEqual(contig.name, "Contig2")
744        self.assertEqual(contig.nbases, 3296)
745        self.assertEqual(contig.nreads, 14)
746        self.assertEqual(contig.nsegments, 214)
747        self.assertEqual(contig.uorc, "U")
748        center = len(contig.sequence) // 2
749        self.assertEqual(contig.sequence[:10], "cacggatgat")
750        self.assertEqual(contig.sequence[center - 5 : center + 5], "TTTGAATATT")
751        self.assertEqual(contig.sequence[-10:], "Atccttgtag")
752        center = len(contig.quality) // 2
753        self.assertEqual(contig.quality[:10], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
754        self.assertEqual(
755            contig.quality[center - 5 : center + 5],
756            [90, 90, 90, 90, 90, 90, 90, 90, 90, 90],
757        )
758        self.assertEqual(contig.quality[-10:], [24, 0, 0, 0, 0, 0, 0, 0, 0, 0])
759        self.assertEqual(len(contig.af), 14)
760        self.assertEqual(contig.af[7].name, "BL060-LR3R.b.ab1")
761        self.assertEqual(contig.af[7].coru, "C")
762        self.assertEqual(contig.af[7].padded_start, 1601)
763        self.assertEqual(contig.af[13].name, "BL060c2-LR0R.b.ab1")
764        self.assertEqual(contig.af[13].coru, "C")
765        self.assertEqual(contig.af[13].padded_start, 2445)
766        self.assertEqual(len(contig.bs), 214)
767        self.assertEqual(contig.bs[107].name, "BL060-c1-LR3R.b.ab1")
768        self.assertEqual(contig.bs[107].padded_start, 2286)
769        self.assertEqual(contig.bs[107].padded_end, 2292)
770        self.assertEqual(contig.bs[213].name, "BL060c2-LR0R.b.ab1")
771        self.assertEqual(contig.bs[213].padded_start, 3236)
772        self.assertEqual(contig.bs[213].padded_end, 3296)
773        self.assertEqual(len(contig.ct), 3)
774        self.assertEqual(contig.ct[0].name, "Contig2")
775        self.assertEqual(contig.ct[0].tag_type, "repeat")
776        self.assertEqual(contig.ct[0].program, "phrap")
777        self.assertEqual(contig.ct[0].padded_start, 42)
778        self.assertEqual(contig.ct[0].padded_end, 43)
779        self.assertEqual(contig.ct[0].date, "123456:765432")
780        self.assertEqual(
781            contig.ct[0].info,
782            ["This is the forst line of comment for c2", "and this the second for c2"],
783        )
784        self.assertEqual(contig.ct[1].name, "unrelated_Contig")
785        self.assertEqual(contig.ct[1].tag_type, "repeat")
786        self.assertEqual(contig.ct[1].program, "phrap")
787        self.assertEqual(contig.ct[1].padded_start, 1142)
788        self.assertEqual(contig.ct[1].padded_end, 143)
789        self.assertEqual(contig.ct[1].date, "122226:722232")
790        self.assertEqual(
791            contig.ct[1].info,
792            [
793                "This is the forst line of comment for the unrelated ct tag",
794                "and this the second",
795            ],
796        )
797
798        self.assertEqual(contig.ct[2].name, "Contig1")
799        self.assertEqual(contig.ct[2].tag_type, "repeat")
800        self.assertEqual(contig.ct[2].program, "phrap")
801        self.assertEqual(contig.ct[2].padded_start, 52)
802        self.assertEqual(contig.ct[2].padded_end, 53)
803        self.assertEqual(contig.ct[2].date, "555456:555432")
804        self.assertEqual(
805            contig.ct[2].info,
806            ["This is the forst line of comment for c1", "and this the second for c1"],
807        )
808
809        self.assertEqual(len(contig.wa), 1)
810        self.assertEqual(contig.wa[0].tag_type, "phrap_params")
811        self.assertEqual(contig.wa[0].program, "phrap")
812        self.assertEqual(contig.wa[0].date, "040203:114710")
813        self.assertEqual(
814            contig.wa[0].info,
815            [
816                "phrap 304_nuclsu.fasta.screen -new_ace -retain_duplicates",
817                "phrap version 0.990329",
818            ],
819        )
820
821        self.assertEqual(len(contig.reads), 14)
822
823        # Read 0
824        self.assertEqual(contig.reads[0].rd.name, "BL060-c1-LR12.g.ab1")
825        self.assertEqual(contig.reads[0].rd.padded_bases, 862)
826        self.assertEqual(contig.reads[0].rd.info_items, 0)
827        self.assertEqual(contig.reads[0].rd.read_tags, 0)
828        center = len(contig.reads[0].rd.sequence) // 2
829        self.assertEqual(contig.reads[0].rd.sequence[:10], "cacggatgat")
830        self.assertEqual(
831            contig.reads[0].rd.sequence[center - 5 : center + 5], "GTTCTCGTTG"
832        )
833        self.assertEqual(contig.reads[0].rd.sequence[-10:], "CGTTTACCcg")
834        self.assertEqual(contig.reads[0].qa.qual_clipping_start, 81)
835        self.assertEqual(contig.reads[0].qa.qual_clipping_end, 842)
836        self.assertEqual(contig.reads[0].qa.align_clipping_start, 1)
837        self.assertEqual(contig.reads[0].qa.align_clipping_end, 862)
838        self.assertEqual(contig.reads[0].ds.chromat_file, "BL060-c1-LR12.g.ab1")
839        self.assertEqual(contig.reads[0].ds.phd_file, "BL060-c1-LR12.g.ab1.phd.1")
840        self.assertEqual(contig.reads[0].ds.time, "Tue Feb  3 11:01:16 2004")
841        self.assertEqual(contig.reads[0].ds.chem, "term")
842        self.assertEqual(contig.reads[0].ds.dye, "big")
843        self.assertEqual(contig.reads[0].ds.template, "")
844        self.assertEqual(contig.reads[0].ds.direction, "")
845        self.assertIsNone(contig.reads[0].rt)
846        self.assertIsNone(contig.reads[0].wr)
847
848        # Read 1
849        self.assertEqual(contig.reads[1].rd.name, "BL060-c1-LR11.g.ab1")
850        self.assertEqual(contig.reads[1].rd.padded_bases, 880)
851        self.assertEqual(contig.reads[1].rd.info_items, 0)
852        self.assertEqual(contig.reads[1].rd.read_tags, 0)
853        center = len(contig.reads[1].rd.sequence) // 2
854        self.assertEqual(contig.reads[1].rd.sequence[:10], "ctttctgacC")
855        self.assertEqual(
856            contig.reads[1].rd.sequence[center - 5 : center + 5], "CTGTGGTTTC"
857        )
858        self.assertEqual(contig.reads[1].rd.sequence[-10:], "cggagttacg")
859        self.assertEqual(contig.reads[1].qa.qual_clipping_start, 11)
860        self.assertEqual(contig.reads[1].qa.qual_clipping_end, 807)
861        self.assertEqual(contig.reads[1].qa.align_clipping_start, 8)
862        self.assertEqual(contig.reads[1].qa.align_clipping_end, 880)
863        self.assertEqual(contig.reads[1].ds.chromat_file, "BL060-c1-LR11.g.ab1")
864        self.assertEqual(contig.reads[1].ds.phd_file, "BL060-c1-LR11.g.ab1.phd.1")
865        self.assertEqual(contig.reads[1].ds.time, "Tue Feb  3 11:01:16 2004")
866        self.assertEqual(contig.reads[1].ds.chem, "term")
867        self.assertEqual(contig.reads[1].ds.dye, "big")
868        self.assertEqual(contig.reads[1].ds.template, "")
869        self.assertEqual(contig.reads[1].ds.direction, "")
870        self.assertEqual(len(contig.reads[1].rt), 1)
871        self.assertEqual(contig.reads[1].rt[0].name, "BL060c3-LR5.g.ab1")
872        self.assertEqual(contig.reads[1].rt[0].tag_type, "matchElsewhereHighQual")
873        self.assertEqual(contig.reads[1].rt[0].program, "phrap")
874        self.assertEqual(contig.reads[1].rt[0].padded_start, 617)
875        self.assertEqual(contig.reads[1].rt[0].padded_end, 631)
876        self.assertEqual(contig.reads[1].rt[0].date, "040217:110357")
877        self.assertIsNone(contig.reads[1].wr)
878
879        # Read 2
880        self.assertEqual(contig.reads[2].rd.name, "BL060-c1-LR9.g.ab1")
881        self.assertEqual(contig.reads[2].rd.padded_bases, 864)
882        self.assertEqual(contig.reads[2].rd.info_items, 0)
883        self.assertEqual(contig.reads[2].rd.read_tags, 0)
884        center = len(contig.reads[2].rd.sequence) // 2
885        self.assertEqual(contig.reads[2].rd.sequence[:10], "cacccaCTTT")
886        self.assertEqual(
887            contig.reads[2].rd.sequence[center - 5 : center + 5], "ACCAAACATT"
888        )
889        self.assertEqual(contig.reads[2].rd.sequence[-10:], "GGTAGCACgc")
890        self.assertEqual(contig.reads[2].qa.qual_clipping_start, 7)
891        self.assertEqual(contig.reads[2].qa.qual_clipping_end, 840)
892        self.assertEqual(contig.reads[2].qa.align_clipping_start, 4)
893        self.assertEqual(contig.reads[2].qa.align_clipping_end, 864)
894        self.assertEqual(contig.reads[2].ds.chromat_file, "BL060-c1-LR9.g.ab1")
895        self.assertEqual(contig.reads[2].ds.phd_file, "BL060-c1-LR9.g.ab1.phd.1")
896        self.assertEqual(contig.reads[2].ds.time, "Tue Feb  3 11:01:16 2004")
897        self.assertEqual(contig.reads[2].ds.chem, "term")
898        self.assertEqual(contig.reads[2].ds.dye, "big")
899        self.assertEqual(contig.reads[2].ds.template, "")
900        self.assertEqual(contig.reads[2].ds.direction, "")
901        self.assertIsNone(contig.reads[2].rt)
902        self.assertIsNone(contig.reads[2].wr)
903
904        # Read 3
905        self.assertEqual(contig.reads[3].rd.name, "BL060-c1-LR17R.b.ab1")
906        self.assertEqual(contig.reads[3].rd.padded_bases, 863)
907        self.assertEqual(contig.reads[3].rd.info_items, 0)
908        self.assertEqual(contig.reads[3].rd.read_tags, 0)
909        center = len(contig.reads[3].rd.sequence) // 2
910        self.assertEqual(contig.reads[3].rd.sequence[:10], "ctaattggcc")
911        self.assertEqual(
912            contig.reads[3].rd.sequence[center - 5 : center + 5], "GGAACCTTTC"
913        )
914        self.assertEqual(contig.reads[3].rd.sequence[-10:], "CAACCTgact")
915        self.assertEqual(contig.reads[3].qa.qual_clipping_start, 63)
916        self.assertEqual(contig.reads[3].qa.qual_clipping_end, 857)
917        self.assertEqual(contig.reads[3].qa.align_clipping_start, 1)
918        self.assertEqual(contig.reads[3].qa.align_clipping_end, 861)
919        self.assertEqual(contig.reads[3].ds.chromat_file, "BL060-c1-LR17R.b.ab1")
920        self.assertEqual(contig.reads[3].ds.phd_file, "BL060-c1-LR17R.b.ab1.phd.1")
921        self.assertEqual(contig.reads[3].ds.time, "Tue Feb  3 11:01:16 2004")
922        self.assertEqual(contig.reads[3].ds.chem, "term")
923        self.assertEqual(contig.reads[3].ds.dye, "big")
924        self.assertEqual(contig.reads[3].ds.template, "")
925        self.assertEqual(contig.reads[3].ds.direction, "")
926        self.assertEqual(len(contig.reads[3].rt), 1)
927        self.assertEqual(contig.reads[3].rt[0].name, "BL060c3-LR5.g.ab1")
928        self.assertEqual(contig.reads[3].rt[0].tag_type, "matchElsewhereHighQual")
929        self.assertEqual(contig.reads[3].rt[0].program, "phrap")
930        self.assertEqual(contig.reads[3].rt[0].padded_start, 617)
931        self.assertEqual(contig.reads[3].rt[0].padded_end, 631)
932        self.assertEqual(contig.reads[3].rt[0].date, "040217:110357")
933        self.assertIsNone(contig.reads[3].wr)
934
935        # Read 4
936        self.assertEqual(contig.reads[4].rd.name, "BL060-LR8.5.g.ab1")
937        self.assertEqual(contig.reads[4].rd.padded_bases, 877)
938        self.assertEqual(contig.reads[4].rd.info_items, 0)
939        self.assertEqual(contig.reads[4].rd.read_tags, 0)
940        center = len(contig.reads[4].rd.sequence) // 2
941        self.assertEqual(contig.reads[4].rd.sequence[:10], "tgCTGCGGTT")
942        self.assertEqual(
943            contig.reads[4].rd.sequence[center - 5 : center + 5], "GGCAGTTTCA"
944        )
945        self.assertEqual(contig.reads[4].rd.sequence[-10:], "tactcataaa")
946        self.assertEqual(contig.reads[4].qa.qual_clipping_start, 13)
947        self.assertEqual(contig.reads[4].qa.qual_clipping_end, 729)
948        self.assertEqual(contig.reads[4].qa.align_clipping_start, 1)
949        self.assertEqual(contig.reads[4].qa.align_clipping_end, 877)
950        self.assertEqual(contig.reads[4].ds.chromat_file, "BL060-LR8.5.g.ab1")
951        self.assertEqual(contig.reads[4].ds.phd_file, "BL060-LR8.5.g.ab1.phd.1")
952        self.assertEqual(contig.reads[4].ds.time, "Fri Nov 14 09:46:03 2003")
953        self.assertEqual(contig.reads[4].ds.chem, "term")
954        self.assertEqual(contig.reads[4].ds.dye, "big")
955        self.assertEqual(contig.reads[4].ds.template, "")
956        self.assertEqual(contig.reads[4].ds.direction, "")
957        self.assertIsNone(contig.reads[4].rt)
958        self.assertIsNone(contig.reads[4].wr)
959
960        # Read 5
961        self.assertEqual(contig.reads[5].rd.name, "BL060-LR3R.b.ab1")
962        self.assertEqual(contig.reads[5].rd.padded_bases, 874)
963        self.assertEqual(contig.reads[5].rd.info_items, 0)
964        self.assertEqual(contig.reads[5].rd.read_tags, 0)
965        center = len(contig.reads[5].rd.sequence) // 2
966        self.assertEqual(contig.reads[5].rd.sequence[:10], "ctCTTAGGAT")
967        self.assertEqual(
968            contig.reads[5].rd.sequence[center - 5 : center + 5], "AACTCACATT"
969        )
970        self.assertEqual(contig.reads[5].rd.sequence[-10:], "*CACCCAAac")
971        self.assertEqual(contig.reads[5].qa.qual_clipping_start, 65)
972        self.assertEqual(contig.reads[5].qa.qual_clipping_end, 874)
973        self.assertEqual(contig.reads[5].qa.align_clipping_start, 1)
974        self.assertEqual(contig.reads[5].qa.align_clipping_end, 874)
975        self.assertEqual(contig.reads[5].ds.chromat_file, "BL060-LR3R.b.ab1")
976        self.assertEqual(contig.reads[5].ds.phd_file, "BL060-LR3R.b.ab1.phd.1")
977        self.assertEqual(contig.reads[5].ds.time, "Fri Nov 14 09:46:03 2003")
978        self.assertEqual(contig.reads[5].ds.chem, "term")
979        self.assertEqual(contig.reads[5].ds.dye, "big")
980        self.assertEqual(contig.reads[5].ds.template, "")
981        self.assertEqual(contig.reads[5].ds.direction, "")
982        self.assertIsNone(contig.reads[5].rt)
983        self.assertIsNone(contig.reads[5].wr)
984
985        # Read 6
986        self.assertEqual(contig.reads[6].rd.name, "BL060-c1-LR3R.b.ab1")
987        self.assertEqual(contig.reads[6].rd.padded_bases, 864)
988        self.assertEqual(contig.reads[6].rd.info_items, 0)
989        self.assertEqual(contig.reads[6].rd.read_tags, 0)
990        center = len(contig.reads[6].rd.sequence) // 2
991        self.assertEqual(contig.reads[6].rd.sequence[:10], "CCaTGTCCAA")
992        self.assertEqual(
993            contig.reads[6].rd.sequence[center - 5 : center + 5], "AAGGGTT*CA"
994        )
995        self.assertEqual(contig.reads[6].rd.sequence[-10:], "ACACTCGCga")
996        self.assertEqual(contig.reads[6].qa.qual_clipping_start, 73)
997        self.assertEqual(contig.reads[6].qa.qual_clipping_end, 862)
998        self.assertEqual(contig.reads[6].qa.align_clipping_start, 1)
999        self.assertEqual(contig.reads[6].qa.align_clipping_end, 863)
1000        self.assertEqual(contig.reads[6].ds.chromat_file, "BL060-c1-LR3R.b.ab1")
1001        self.assertEqual(contig.reads[6].ds.phd_file, "BL060-c1-LR3R.b.ab1.phd.1")
1002        self.assertEqual(contig.reads[6].ds.time, "Tue Feb  3 11:01:16 2004")
1003        self.assertEqual(contig.reads[6].ds.chem, "term")
1004        self.assertEqual(contig.reads[6].ds.dye, "big")
1005        self.assertEqual(contig.reads[6].ds.template, "")
1006        self.assertEqual(contig.reads[6].ds.direction, "")
1007        self.assertIsNone(contig.reads[6].rt)
1008        self.assertIsNone(contig.reads[6].wr)
1009
1010        # Read 7
1011        self.assertEqual(contig.reads[7].rd.name, "BL060-LR3R.b.ab1")
1012        self.assertEqual(contig.reads[7].rd.padded_bases, 857)
1013        self.assertEqual(contig.reads[7].rd.info_items, 0)
1014        self.assertEqual(contig.reads[7].rd.read_tags, 0)
1015        center = len(contig.reads[7].rd.sequence) // 2
1016        self.assertEqual(contig.reads[7].rd.sequence[:10], "agaaagagga")
1017        self.assertEqual(
1018            contig.reads[7].rd.sequence[center - 5 : center + 5], "nnnannnnnn"
1019        )
1020        self.assertEqual(contig.reads[7].rd.sequence[-10:], "gtctttgctc")
1021        self.assertEqual(contig.reads[7].qa.qual_clipping_start, 548)
1022        self.assertEqual(contig.reads[7].qa.qual_clipping_end, 847)
1023        self.assertEqual(contig.reads[7].qa.align_clipping_start, 442)
1024        self.assertEqual(contig.reads[7].qa.align_clipping_end, 854)
1025        self.assertEqual(contig.reads[7].ds.chromat_file, "BL060-LR3R.b.ab1")
1026        self.assertEqual(contig.reads[7].ds.phd_file, "BL060-LR3R.b.ab1.phd.1")
1027        self.assertEqual(contig.reads[7].ds.time, "Fri Jan 16 09:01:10 2004")
1028        self.assertEqual(contig.reads[7].ds.chem, "term")
1029        self.assertEqual(contig.reads[7].ds.dye, "big")
1030        self.assertEqual(contig.reads[7].ds.template, "")
1031        self.assertEqual(contig.reads[7].ds.direction, "")
1032        self.assertIsNone(contig.reads[7].rt)
1033        self.assertIsNone(contig.reads[7].wr)
1034
1035        # Read 8
1036        self.assertEqual(contig.reads[8].rd.name, "BL060-c1-LR7.g.ab1")
1037        self.assertEqual(contig.reads[8].rd.padded_bases, 878)
1038        self.assertEqual(contig.reads[8].rd.info_items, 0)
1039        self.assertEqual(contig.reads[8].rd.read_tags, 0)
1040        center = len(contig.reads[8].rd.sequence) // 2
1041        self.assertEqual(contig.reads[8].rd.sequence[:10], "agTttc*ctc")
1042        self.assertEqual(
1043            contig.reads[8].rd.sequence[center - 5 : center + 5], "TCATAAAACT"
1044        )
1045        self.assertEqual(contig.reads[8].rd.sequence[-10:], "xxxxxxxxxx")
1046        self.assertEqual(contig.reads[8].qa.qual_clipping_start, 20)
1047        self.assertEqual(contig.reads[8].qa.qual_clipping_end, 798)
1048        self.assertEqual(contig.reads[8].qa.align_clipping_start, 1)
1049        self.assertEqual(contig.reads[8].qa.align_clipping_end, 798)
1050        self.assertEqual(contig.reads[8].ds.chromat_file, "BL060-c1-LR7.g.ab1")
1051        self.assertEqual(contig.reads[8].ds.phd_file, "BL060-c1-LR7.g.ab1.phd.1")
1052        self.assertEqual(contig.reads[8].ds.time, "Tue Feb  3 11:01:16 2004")
1053        self.assertEqual(contig.reads[8].ds.chem, "term")
1054        self.assertEqual(contig.reads[8].ds.dye, "big")
1055        self.assertEqual(contig.reads[8].ds.template, "")
1056        self.assertEqual(contig.reads[8].ds.direction, "")
1057        self.assertIsNone(contig.reads[8].rt)
1058        self.assertIsNone(contig.reads[8].wr)
1059
1060        # Read 9
1061        self.assertEqual(contig.reads[9].rd.name, "BL060-LR7.g.ab1")
1062        self.assertEqual(contig.reads[9].rd.padded_bases, 880)
1063        self.assertEqual(contig.reads[9].rd.info_items, 0)
1064        self.assertEqual(contig.reads[9].rd.read_tags, 0)
1065        center = len(contig.reads[9].rd.sequence) // 2
1066        self.assertEqual(contig.reads[9].rd.sequence[:10], "ggctaCGCCc")
1067        self.assertEqual(
1068            contig.reads[9].rd.sequence[center - 5 : center + 5], "ATTGAGTTTC"
1069        )
1070        self.assertEqual(contig.reads[9].rd.sequence[-10:], "tggcgttgcg")
1071        self.assertEqual(contig.reads[9].qa.qual_clipping_start, 14)
1072        self.assertEqual(contig.reads[9].qa.qual_clipping_end, 765)
1073        self.assertEqual(contig.reads[9].qa.align_clipping_start, 4)
1074        self.assertEqual(contig.reads[9].qa.align_clipping_end, 765)
1075        self.assertEqual(contig.reads[9].ds.chromat_file, "BL060-LR7.g.ab1")
1076        self.assertEqual(contig.reads[9].ds.phd_file, "BL060-LR7.g.ab1.phd.1")
1077        self.assertEqual(contig.reads[9].ds.time, "Fri Nov 14 09:46:03 2003")
1078        self.assertEqual(contig.reads[9].ds.chem, "term")
1079        self.assertEqual(contig.reads[9].ds.dye, "big")
1080        self.assertEqual(contig.reads[9].ds.template, "")
1081        self.assertEqual(contig.reads[9].ds.direction, "")
1082        self.assertIsNone(contig.reads[9].rt)
1083        self.assertIsNone(contig.reads[9].wr)
1084
1085        # Read 10
1086        self.assertEqual(contig.reads[10].rd.name, "BL060c5-LR5.g.ab1")
1087        self.assertEqual(contig.reads[10].rd.padded_bases, 871)
1088        self.assertEqual(contig.reads[10].rd.info_items, 0)
1089        self.assertEqual(contig.reads[10].rd.read_tags, 0)
1090        center = len(contig.reads[10].rd.sequence) // 2
1091        self.assertEqual(contig.reads[10].rd.sequence[:10], "ggtTCGATTA")
1092        self.assertEqual(
1093            contig.reads[10].rd.sequence[center - 5 : center + 5], "ACCAATTGAC"
1094        )
1095        self.assertEqual(contig.reads[10].rd.sequence[-10:], "ACCACCCatt")
1096        self.assertEqual(contig.reads[10].qa.qual_clipping_start, 12)
1097        self.assertEqual(contig.reads[10].qa.qual_clipping_end, 767)
1098        self.assertEqual(contig.reads[10].qa.align_clipping_start, 1)
1099        self.assertEqual(contig.reads[10].qa.align_clipping_end, 871)
1100        self.assertEqual(contig.reads[10].ds.chromat_file, "BL060c5-LR5.g.ab1")
1101        self.assertEqual(contig.reads[10].ds.phd_file, "BL060c5-LR5.g.ab1.phd.1")
1102        self.assertEqual(contig.reads[10].ds.time, "Fri Nov 14 09:46:03 2003")
1103        self.assertEqual(contig.reads[10].ds.chem, "term")
1104        self.assertEqual(contig.reads[10].ds.dye, "big")
1105        self.assertEqual(contig.reads[10].ds.template, "")
1106        self.assertEqual(contig.reads[10].ds.direction, "")
1107        self.assertIsNone(contig.reads[10].rt)
1108        self.assertIsNone(contig.reads[10].wr)
1109
1110        # Read 11
1111        self.assertEqual(contig.reads[11].rd.name, "BL060c2-LR5.g.ab1")
1112        self.assertEqual(contig.reads[11].rd.padded_bases, 839)
1113        self.assertEqual(contig.reads[11].rd.info_items, 0)
1114        self.assertEqual(contig.reads[11].rd.read_tags, 0)
1115        center = len(contig.reads[11].rd.sequence) // 2
1116        self.assertEqual(contig.reads[11].rd.sequence[:10], "ggttcatatg")
1117        self.assertEqual(
1118            contig.reads[11].rd.sequence[center - 5 : center + 5], "TAAAATCAGT"
1119        )
1120        self.assertEqual(contig.reads[11].rd.sequence[-10:], "TCTTGCaata")
1121        self.assertEqual(contig.reads[11].qa.qual_clipping_start, 11)
1122        self.assertEqual(contig.reads[11].qa.qual_clipping_end, 757)
1123        self.assertEqual(contig.reads[11].qa.align_clipping_start, 10)
1124        self.assertEqual(contig.reads[11].qa.align_clipping_end, 835)
1125        self.assertIsNone(contig.reads[11].ds)
1126        self.assertEqual(len(contig.reads[11].rt), 1)
1127        self.assertEqual(contig.reads[11].rt[0].name, "BL060c2-LR5.g.ab1")
1128        self.assertEqual(contig.reads[11].rt[0].tag_type, "matchElsewhereHighQual")
1129        self.assertEqual(contig.reads[11].rt[0].program, "phrap")
1130        self.assertEqual(contig.reads[11].rt[0].padded_start, 617)
1131        self.assertEqual(contig.reads[11].rt[0].padded_end, 631)
1132        self.assertEqual(contig.reads[11].rt[0].date, "040217:110357")
1133        self.assertIsNone(contig.reads[11].wr)
1134
1135        # Read 12
1136        self.assertEqual(contig.reads[12].rd.name, "BL060c5-LR0R.b.ab1")
1137        self.assertEqual(contig.reads[12].rd.padded_bases, 855)
1138        self.assertEqual(contig.reads[12].rd.info_items, 0)
1139        self.assertEqual(contig.reads[12].rd.read_tags, 0)
1140        center = len(contig.reads[12].rd.sequence) // 2
1141        self.assertEqual(contig.reads[12].rd.sequence[:10], "cACTCGCGTA")
1142        self.assertEqual(
1143            contig.reads[12].rd.sequence[center - 5 : center + 5], "CTCGTAAAAT"
1144        )
1145        self.assertEqual(contig.reads[12].rd.sequence[-10:], "aacccctgca")
1146        self.assertEqual(contig.reads[12].qa.qual_clipping_start, 94)
1147        self.assertEqual(contig.reads[12].qa.qual_clipping_end, 835)
1148        self.assertEqual(contig.reads[12].qa.align_clipping_start, 1)
1149        self.assertEqual(contig.reads[12].qa.align_clipping_end, 847)
1150        self.assertEqual(contig.reads[12].ds.chromat_file, "BL060c5-LR0R.b.ab1")
1151        self.assertEqual(contig.reads[12].ds.phd_file, "BL060c5-LR0R.b.ab1.phd.1")
1152        self.assertEqual(contig.reads[12].ds.time, "Wed Nov 12 08:16:30 2003")
1153        self.assertEqual(contig.reads[12].ds.chem, "term")
1154        self.assertEqual(contig.reads[12].ds.dye, "big")
1155        self.assertEqual(contig.reads[12].ds.template, "")
1156        self.assertEqual(contig.reads[12].ds.direction, "")
1157        self.assertIsNone(contig.reads[12].rt)
1158        self.assertIsNone(contig.reads[12].wr)
1159
1160        # Read 13
1161        self.assertEqual(contig.reads[13].rd.name, "BL060c2-LR0R.b.ab1")
1162        self.assertEqual(contig.reads[13].rd.padded_bases, 852)
1163        self.assertEqual(contig.reads[13].rd.info_items, 0)
1164        self.assertEqual(contig.reads[13].rd.read_tags, 0)
1165        center = len(contig.reads[13].rd.sequence) // 2
1166        self.assertEqual(contig.reads[13].rd.sequence[:10], "cgCGTa*tTG")
1167        self.assertEqual(
1168            contig.reads[13].rd.sequence[center - 5 : center + 5], "GTAAAATATT"
1169        )
1170        self.assertEqual(contig.reads[13].rd.sequence[-10:], "Atccttgtag")
1171        self.assertEqual(contig.reads[13].qa.qual_clipping_start, 33)
1172        self.assertEqual(contig.reads[13].qa.qual_clipping_end, 831)
1173        self.assertEqual(contig.reads[13].qa.align_clipping_start, 1)
1174        self.assertEqual(contig.reads[13].qa.align_clipping_end, 852)
1175        self.assertEqual(contig.reads[13].ds.chromat_file, "BL060c2-LR0R.b.ab1")
1176        self.assertEqual(contig.reads[13].ds.phd_file, "BL060c2-LR0R.b.ab1.phd.1")
1177        self.assertEqual(contig.reads[13].ds.time, "Wed Nov 12 08:16:29 2003")
1178        self.assertEqual(contig.reads[13].ds.chem, "term")
1179        self.assertEqual(contig.reads[13].ds.dye, "big")
1180        self.assertEqual(contig.reads[13].ds.template, "")
1181        self.assertEqual(contig.reads[13].ds.direction, "")
1182        self.assertEqual(len(contig.reads[13].rt), 1)
1183        self.assertEqual(contig.reads[13].rt[0].name, "BL060c5-LR0R.b.ab1")
1184        self.assertEqual(contig.reads[13].rt[0].tag_type, "matchElsewhereHighQual")
1185        self.assertEqual(contig.reads[13].rt[0].program, "phrap")
1186        self.assertEqual(contig.reads[13].rt[0].padded_start, 617)
1187        self.assertEqual(contig.reads[13].rt[0].padded_end, 631)
1188        self.assertEqual(contig.reads[13].rt[0].date, "040217:110357")
1189        self.assertEqual(len(contig.reads[13].wr), 1)
1190        self.assertEqual(contig.reads[13].wr[0].name, "BL060c2-LR0R.b.ab1")
1191        self.assertEqual(contig.reads[13].wr[0].aligned, "unaligned")
1192        self.assertEqual(contig.reads[13].wr[0].program, "phrap")
1193        self.assertEqual(contig.reads[13].wr[0].date, "040217:110357")
1194
1195        # Make sure there are no more contigs
1196        self.assertRaises(StopIteration, next, contigs)
1197
1198
1199class AceTestTwo(unittest.TestCase):
1200    """Test parsing example output from CAP3.
1201
1202    The sample input file seq.cap.ace was downloaded from:
1203    http://genome.cs.mtu.edu/cap/data/seq.cap.ace
1204    """
1205
1206    def setUp(self):
1207        self.handle = open("Ace/seq.cap.ace")
1208
1209    def tearDown(self):
1210        self.handle.close()
1211
1212    def test_check_ACEParser(self):
1213        """Test to check that ACEParser can parse the whole file into one record."""
1214        record = Ace.read(self.handle)
1215        self.assertEqual(record.ncontigs, 1)
1216        self.assertEqual(record.nreads, 6)
1217        self.assertIsNone(record.wa)
1218        self.assertEqual(len(record.contigs), 1)
1219
1220        self.assertEqual(len(record.contigs[0].reads), 6)
1221        self.assertEqual(record.contigs[0].name, "Contig1")
1222        self.assertEqual(record.contigs[0].nbases, 1222)
1223        self.assertEqual(record.contigs[0].nreads, 6)
1224        self.assertEqual(record.contigs[0].nsegments, 0)
1225        self.assertEqual(record.contigs[0].uorc, "U")
1226        center = len(record.contigs[0].sequence) // 2
1227        self.assertEqual(record.contigs[0].sequence[:10], "AGTTTTAGTT")
1228        self.assertEqual(
1229            record.contigs[0].sequence[center - 5 : center + 5], "TGTGCGCGCA"
1230        )
1231        self.assertEqual(record.contigs[0].sequence[-10:], "ATATCACATT")
1232        center = len(record.contigs[0].quality) // 2
1233        self.assertEqual(
1234            record.contigs[0].quality[:10], [61, 66, 67, 70, 71, 73, 73, 77, 77, 87]
1235        )
1236        self.assertEqual(
1237            record.contigs[0].quality[center - 5 : center + 5],
1238            [97, 97, 97, 97, 97, 97, 97, 97, 97, 97],
1239        )
1240        self.assertEqual(
1241            record.contigs[0].quality[-10:], [56, 51, 49, 41, 38, 39, 45, 44, 49, 46]
1242        )
1243        self.assertEqual(len(record.contigs[0].af), 6)
1244        self.assertEqual(len(record.contigs[0].bs), 0)
1245        self.assertEqual(record.contigs[0].af[3].name, "R5")
1246        self.assertEqual(record.contigs[0].af[3].coru, "C")
1247        self.assertEqual(record.contigs[0].af[3].padded_start, 320)
1248        self.assertEqual(record.contigs[0].af[5].name, "R6")
1249        self.assertEqual(record.contigs[0].af[5].coru, "C")
1250        self.assertEqual(record.contigs[0].af[5].padded_start, 517)
1251        self.assertEqual(record.contigs[0].bs, [])
1252        self.assertIsNone(record.contigs[0].ct)
1253        self.assertIsNone(record.contigs[0].wa)
1254        self.assertEqual(len(record.contigs[0].reads), 6)
1255
1256        self.assertEqual(record.contigs[0].reads[0].rd.name, "R3")
1257        self.assertEqual(record.contigs[0].reads[0].rd.padded_bases, 919)
1258        self.assertEqual(record.contigs[0].reads[0].rd.info_items, 0)
1259        self.assertEqual(record.contigs[0].reads[0].rd.read_tags, 0)
1260        center = len(record.contigs[0].reads[0].rd.sequence) // 2
1261        self.assertEqual(record.contigs[0].reads[0].rd.sequence[:10], "NNNNNNNNNN")
1262        self.assertEqual(
1263            record.contigs[0].reads[0].rd.sequence[center - 5 : center + 5],
1264            "ATGTGCGCTC",
1265        )
1266        self.assertEqual(record.contigs[0].reads[0].rd.sequence[-10:], "CAGCTCACCA")
1267        self.assertEqual(record.contigs[0].reads[0].qa.qual_clipping_start, 55)
1268        self.assertEqual(record.contigs[0].reads[0].qa.qual_clipping_end, 916)
1269        self.assertEqual(record.contigs[0].reads[0].qa.align_clipping_start, 55)
1270        self.assertEqual(record.contigs[0].reads[0].qa.align_clipping_end, 916)
1271        self.assertEqual(record.contigs[0].reads[0].ds.chromat_file, "")
1272        self.assertEqual(record.contigs[0].reads[0].ds.phd_file, "")
1273        self.assertEqual(record.contigs[0].reads[0].ds.time, "")
1274        self.assertEqual(record.contigs[0].reads[0].ds.chem, "")
1275        self.assertEqual(record.contigs[0].reads[0].ds.dye, "")
1276        self.assertEqual(record.contigs[0].reads[0].ds.template, "")
1277        self.assertEqual(record.contigs[0].reads[0].ds.direction, "")
1278        self.assertIsNone(record.contigs[0].reads[0].rt)
1279        self.assertIsNone(record.contigs[0].reads[0].wr)
1280
1281        self.assertEqual(record.contigs[0].reads[1].rd.name, "R1")
1282        self.assertEqual(record.contigs[0].reads[1].rd.padded_bases, 864)
1283        self.assertEqual(record.contigs[0].reads[1].rd.info_items, 0)
1284        self.assertEqual(record.contigs[0].reads[1].rd.read_tags, 0)
1285        center = len(record.contigs[0].reads[1].rd.sequence) // 2
1286        self.assertEqual(record.contigs[0].reads[1].rd.sequence[:10], "AGCCGGTACC")
1287        self.assertEqual(
1288            record.contigs[0].reads[1].rd.sequence[center - 5 : center + 5],
1289            "GGGATGGCAC",
1290        )
1291        self.assertEqual(record.contigs[0].reads[1].rd.sequence[-10:], "GGGCTGGGAG")
1292        self.assertEqual(record.contigs[0].reads[1].qa.qual_clipping_start, 12)
1293        self.assertEqual(record.contigs[0].reads[1].qa.qual_clipping_end, 863)
1294        self.assertEqual(record.contigs[0].reads[1].qa.align_clipping_start, 12)
1295        self.assertEqual(record.contigs[0].reads[1].qa.align_clipping_end, 863)
1296        self.assertEqual(record.contigs[0].reads[1].ds.chromat_file, "")
1297        self.assertEqual(record.contigs[0].reads[1].ds.phd_file, "")
1298        self.assertEqual(record.contigs[0].reads[1].ds.time, "")
1299        self.assertEqual(record.contigs[0].reads[1].ds.chem, "")
1300        self.assertEqual(record.contigs[0].reads[1].ds.dye, "")
1301        self.assertEqual(record.contigs[0].reads[1].ds.template, "")
1302        self.assertEqual(record.contigs[0].reads[1].ds.direction, "")
1303        self.assertIsNone(record.contigs[0].reads[1].rt)
1304        self.assertIsNone(record.contigs[0].reads[1].wr)
1305
1306        self.assertEqual(record.contigs[0].reads[2].rd.name, "R2")
1307        self.assertEqual(record.contigs[0].reads[2].rd.padded_bases, 1026)
1308        self.assertEqual(record.contigs[0].reads[2].rd.info_items, 0)
1309        self.assertEqual(record.contigs[0].reads[2].rd.read_tags, 0)
1310        center = len(record.contigs[0].reads[2].rd.sequence) // 2
1311        self.assertEqual(record.contigs[0].reads[2].rd.sequence[:10], "NNNNNNNNNN")
1312        self.assertEqual(
1313            record.contigs[0].reads[2].rd.sequence[center - 5 : center + 5],
1314            "GGATGCCTGG",
1315        )
1316        self.assertEqual(record.contigs[0].reads[2].rd.sequence[-10:], "GGTTGAGGCC")
1317        self.assertEqual(record.contigs[0].reads[2].qa.qual_clipping_start, 55)
1318        self.assertEqual(record.contigs[0].reads[2].qa.qual_clipping_end, 1000)
1319        self.assertEqual(record.contigs[0].reads[2].qa.align_clipping_start, 55)
1320        self.assertEqual(record.contigs[0].reads[2].qa.align_clipping_end, 1000)
1321        self.assertEqual(record.contigs[0].reads[2].ds.chromat_file, "")
1322        self.assertEqual(record.contigs[0].reads[2].ds.phd_file, "")
1323        self.assertEqual(record.contigs[0].reads[2].ds.time, "")
1324        self.assertEqual(record.contigs[0].reads[2].ds.chem, "")
1325        self.assertEqual(record.contigs[0].reads[2].ds.dye, "")
1326        self.assertEqual(record.contigs[0].reads[2].ds.template, "")
1327        self.assertEqual(record.contigs[0].reads[2].ds.direction, "")
1328        self.assertIsNone(record.contigs[0].reads[2].rt)
1329        self.assertIsNone(record.contigs[0].reads[2].wr)
1330
1331        self.assertEqual(record.contigs[0].reads[3].rd.name, "R5")
1332        self.assertEqual(record.contigs[0].reads[3].rd.padded_bases, 925)
1333        self.assertEqual(record.contigs[0].reads[3].rd.info_items, 0)
1334        self.assertEqual(record.contigs[0].reads[3].rd.read_tags, 0)
1335        center = len(record.contigs[0].reads[3].rd.sequence) // 2
1336        self.assertEqual(record.contigs[0].reads[3].rd.sequence[:10], "NNNNNNNNNN")
1337        self.assertEqual(
1338            record.contigs[0].reads[3].rd.sequence[center - 5 : center + 5],
1339            "CCTCCCTACA",
1340        )
1341        self.assertEqual(record.contigs[0].reads[3].rd.sequence[-10:], "GCCCCCGGNN")
1342        self.assertEqual(record.contigs[0].reads[3].qa.qual_clipping_start, 293)
1343        self.assertEqual(record.contigs[0].reads[3].qa.qual_clipping_end, 874)
1344        self.assertEqual(record.contigs[0].reads[3].qa.align_clipping_start, 293)
1345        self.assertEqual(record.contigs[0].reads[3].qa.align_clipping_end, 874)
1346        self.assertEqual(record.contigs[0].reads[3].ds.chromat_file, "")
1347        self.assertEqual(record.contigs[0].reads[3].ds.phd_file, "")
1348        self.assertEqual(record.contigs[0].reads[3].ds.time, "")
1349        self.assertEqual(record.contigs[0].reads[3].ds.chem, "")
1350        self.assertEqual(record.contigs[0].reads[3].ds.dye, "")
1351        self.assertEqual(record.contigs[0].reads[3].ds.template, "")
1352        self.assertEqual(record.contigs[0].reads[3].ds.direction, "")
1353        self.assertIsNone(record.contigs[0].reads[3].rt)
1354        self.assertIsNone(record.contigs[0].reads[3].wr)
1355
1356        self.assertEqual(record.contigs[0].reads[4].rd.name, "R4")
1357        self.assertEqual(record.contigs[0].reads[4].rd.padded_bases, 816)
1358        self.assertEqual(record.contigs[0].reads[4].rd.info_items, 0)
1359        self.assertEqual(record.contigs[0].reads[4].rd.read_tags, 0)
1360        center = len(record.contigs[0].reads[4].rd.sequence) // 2
1361        self.assertEqual(record.contigs[0].reads[4].rd.sequence[:10], "CACTCAGCTC")
1362        self.assertEqual(
1363            record.contigs[0].reads[4].rd.sequence[center - 5 : center + 5],
1364            "TCCAAAGGGT",
1365        )
1366        self.assertEqual(record.contigs[0].reads[4].rd.sequence[-10:], "AGCTGAATCG")
1367        self.assertEqual(record.contigs[0].reads[4].qa.qual_clipping_start, 1)
1368        self.assertEqual(record.contigs[0].reads[4].qa.qual_clipping_end, 799)
1369        self.assertEqual(record.contigs[0].reads[4].qa.align_clipping_start, 1)
1370        self.assertEqual(record.contigs[0].reads[4].qa.align_clipping_end, 799)
1371        self.assertEqual(record.contigs[0].reads[4].ds.chromat_file, "")
1372        self.assertEqual(record.contigs[0].reads[4].ds.phd_file, "")
1373        self.assertEqual(record.contigs[0].reads[4].ds.time, "")
1374        self.assertEqual(record.contigs[0].reads[4].ds.chem, "")
1375        self.assertEqual(record.contigs[0].reads[4].ds.dye, "")
1376        self.assertEqual(record.contigs[0].reads[4].ds.template, "")
1377        self.assertEqual(record.contigs[0].reads[4].ds.direction, "")
1378        self.assertIsNone(record.contigs[0].reads[4].rt)
1379        self.assertIsNone(record.contigs[0].reads[4].wr)
1380
1381        self.assertEqual(record.contigs[0].reads[5].rd.name, "R6")
1382        self.assertEqual(record.contigs[0].reads[5].rd.padded_bases, 857)
1383        self.assertEqual(record.contigs[0].reads[5].rd.info_items, 0)
1384        self.assertEqual(record.contigs[0].reads[5].rd.read_tags, 0)
1385        center = len(record.contigs[0].reads[5].rd.sequence) // 2
1386        self.assertEqual(record.contigs[0].reads[5].rd.sequence[:10], "CCGGCAGTGA")
1387        self.assertEqual(
1388            record.contigs[0].reads[5].rd.sequence[center - 5 : center + 5],
1389            "AAAAAAAACC",
1390        )
1391        self.assertEqual(record.contigs[0].reads[5].rd.sequence[-10:], "NNNNNNNNNN")
1392        self.assertEqual(record.contigs[0].reads[5].qa.qual_clipping_start, 24)
1393        self.assertEqual(record.contigs[0].reads[5].qa.qual_clipping_end, 706)
1394        self.assertEqual(record.contigs[0].reads[5].qa.align_clipping_start, 24)
1395        self.assertEqual(record.contigs[0].reads[5].qa.align_clipping_end, 706)
1396        self.assertEqual(record.contigs[0].reads[5].ds.chromat_file, "")
1397        self.assertEqual(record.contigs[0].reads[5].ds.phd_file, "")
1398        self.assertEqual(record.contigs[0].reads[5].ds.time, "")
1399        self.assertEqual(record.contigs[0].reads[5].ds.chem, "")
1400        self.assertEqual(record.contigs[0].reads[5].ds.dye, "")
1401        self.assertEqual(record.contigs[0].reads[5].ds.template, "")
1402        self.assertEqual(record.contigs[0].reads[5].ds.direction, "")
1403        self.assertIsNone(record.contigs[0].reads[5].rt)
1404        self.assertIsNone(record.contigs[0].reads[5].wr)
1405
1406    def test_check_record_parser(self):
1407        """Test to check that record parser parses each contig into a record."""
1408        contigs = Ace.parse(self.handle)
1409
1410        # First (and only) contig
1411        contig = next(contigs)
1412
1413        self.assertEqual(len(contig.reads), 6)
1414        self.assertEqual(contig.name, "Contig1")
1415        self.assertEqual(contig.nbases, 1222)
1416        self.assertEqual(contig.nreads, 6)
1417        self.assertEqual(contig.nsegments, 0)
1418        self.assertEqual(contig.uorc, "U")
1419        center = len(contig.sequence) // 2
1420        self.assertEqual(contig.sequence[:10], "AGTTTTAGTT")
1421        self.assertEqual(contig.sequence[center - 5 : center + 5], "TGTGCGCGCA")
1422        self.assertEqual(contig.sequence[-10:], "ATATCACATT")
1423        center = len(contig.quality) // 2
1424        self.assertEqual(contig.quality[:10], [61, 66, 67, 70, 71, 73, 73, 77, 77, 87])
1425        self.assertEqual(
1426            contig.quality[center - 5 : center + 5],
1427            [97, 97, 97, 97, 97, 97, 97, 97, 97, 97],
1428        )
1429        self.assertEqual(contig.quality[-10:], [56, 51, 49, 41, 38, 39, 45, 44, 49, 46])
1430        self.assertEqual(len(contig.af), 6)
1431        self.assertEqual(len(contig.bs), 0)
1432        self.assertEqual(contig.af[3].name, "R5")
1433        self.assertEqual(contig.af[3].coru, "C")
1434        self.assertEqual(contig.af[3].padded_start, 320)
1435        self.assertEqual(contig.af[5].name, "R6")
1436        self.assertEqual(contig.af[5].coru, "C")
1437        self.assertEqual(contig.af[5].padded_start, 517)
1438        self.assertEqual(contig.bs, [])
1439        self.assertIsNone(contig.ct)
1440        self.assertIsNone(contig.wa)
1441        self.assertEqual(len(contig.reads), 6)
1442
1443        self.assertEqual(contig.reads[0].rd.name, "R3")
1444        self.assertEqual(contig.reads[0].rd.padded_bases, 919)
1445        self.assertEqual(contig.reads[0].rd.info_items, 0)
1446        self.assertEqual(contig.reads[0].rd.read_tags, 0)
1447        center = len(contig.reads[0].rd.sequence) // 2
1448        self.assertEqual(contig.reads[0].rd.sequence[:10], "NNNNNNNNNN")
1449        self.assertEqual(
1450            contig.reads[0].rd.sequence[center - 5 : center + 5], "ATGTGCGCTC"
1451        )
1452        self.assertEqual(contig.reads[0].rd.sequence[-10:], "CAGCTCACCA")
1453        self.assertEqual(contig.reads[0].qa.qual_clipping_start, 55)
1454        self.assertEqual(contig.reads[0].qa.qual_clipping_end, 916)
1455        self.assertEqual(contig.reads[0].qa.align_clipping_start, 55)
1456        self.assertEqual(contig.reads[0].qa.align_clipping_end, 916)
1457        self.assertEqual(contig.reads[0].ds.chromat_file, "")
1458        self.assertEqual(contig.reads[0].ds.phd_file, "")
1459        self.assertEqual(contig.reads[0].ds.time, "")
1460        self.assertEqual(contig.reads[0].ds.chem, "")
1461        self.assertEqual(contig.reads[0].ds.dye, "")
1462        self.assertEqual(contig.reads[0].ds.template, "")
1463        self.assertEqual(contig.reads[0].ds.direction, "")
1464        self.assertIsNone(contig.reads[0].rt)
1465        self.assertIsNone(contig.reads[0].wr)
1466
1467        self.assertEqual(contig.reads[1].rd.name, "R1")
1468        self.assertEqual(contig.reads[1].rd.padded_bases, 864)
1469        self.assertEqual(contig.reads[1].rd.info_items, 0)
1470        self.assertEqual(contig.reads[1].rd.read_tags, 0)
1471        center = len(contig.reads[1].rd.sequence) // 2
1472        self.assertEqual(contig.reads[1].rd.sequence[:10], "AGCCGGTACC")
1473        self.assertEqual(
1474            contig.reads[1].rd.sequence[center - 5 : center + 5], "GGGATGGCAC"
1475        )
1476        self.assertEqual(contig.reads[1].rd.sequence[-10:], "GGGCTGGGAG")
1477        self.assertEqual(contig.reads[1].qa.qual_clipping_start, 12)
1478        self.assertEqual(contig.reads[1].qa.qual_clipping_end, 863)
1479        self.assertEqual(contig.reads[1].qa.align_clipping_start, 12)
1480        self.assertEqual(contig.reads[1].qa.align_clipping_end, 863)
1481        self.assertEqual(contig.reads[1].ds.chromat_file, "")
1482        self.assertEqual(contig.reads[1].ds.phd_file, "")
1483        self.assertEqual(contig.reads[1].ds.time, "")
1484        self.assertEqual(contig.reads[1].ds.chem, "")
1485        self.assertEqual(contig.reads[1].ds.dye, "")
1486        self.assertEqual(contig.reads[1].ds.template, "")
1487        self.assertEqual(contig.reads[1].ds.direction, "")
1488        self.assertIsNone(contig.reads[1].rt)
1489        self.assertIsNone(contig.reads[1].wr)
1490
1491        self.assertEqual(contig.reads[2].rd.name, "R2")
1492        self.assertEqual(contig.reads[2].rd.padded_bases, 1026)
1493        self.assertEqual(contig.reads[2].rd.info_items, 0)
1494        self.assertEqual(contig.reads[2].rd.read_tags, 0)
1495        center = len(contig.reads[2].rd.sequence) // 2
1496        self.assertEqual(contig.reads[2].rd.sequence[:10], "NNNNNNNNNN")
1497        self.assertEqual(
1498            contig.reads[2].rd.sequence[center - 5 : center + 5], "GGATGCCTGG"
1499        )
1500        self.assertEqual(contig.reads[2].rd.sequence[-10:], "GGTTGAGGCC")
1501        self.assertEqual(contig.reads[2].qa.qual_clipping_start, 55)
1502        self.assertEqual(contig.reads[2].qa.qual_clipping_end, 1000)
1503        self.assertEqual(contig.reads[2].qa.align_clipping_start, 55)
1504        self.assertEqual(contig.reads[2].qa.align_clipping_end, 1000)
1505        self.assertEqual(contig.reads[2].ds.chromat_file, "")
1506        self.assertEqual(contig.reads[2].ds.phd_file, "")
1507        self.assertEqual(contig.reads[2].ds.time, "")
1508        self.assertEqual(contig.reads[2].ds.chem, "")
1509        self.assertEqual(contig.reads[2].ds.dye, "")
1510        self.assertEqual(contig.reads[2].ds.template, "")
1511        self.assertEqual(contig.reads[2].ds.direction, "")
1512        self.assertIsNone(contig.reads[2].rt)
1513        self.assertIsNone(contig.reads[2].wr)
1514
1515        self.assertEqual(contig.reads[3].rd.name, "R5")
1516        self.assertEqual(contig.reads[3].rd.padded_bases, 925)
1517        self.assertEqual(contig.reads[3].rd.info_items, 0)
1518        self.assertEqual(contig.reads[3].rd.read_tags, 0)
1519        center = len(contig.reads[3].rd.sequence) // 2
1520        self.assertEqual(contig.reads[3].rd.sequence[:10], "NNNNNNNNNN")
1521        self.assertEqual(
1522            contig.reads[3].rd.sequence[center - 5 : center + 5], "CCTCCCTACA"
1523        )
1524        self.assertEqual(contig.reads[3].rd.sequence[-10:], "GCCCCCGGNN")
1525        self.assertEqual(contig.reads[3].qa.qual_clipping_start, 293)
1526        self.assertEqual(contig.reads[3].qa.qual_clipping_end, 874)
1527        self.assertEqual(contig.reads[3].qa.align_clipping_start, 293)
1528        self.assertEqual(contig.reads[3].qa.align_clipping_end, 874)
1529        self.assertEqual(contig.reads[3].ds.chromat_file, "")
1530        self.assertEqual(contig.reads[3].ds.phd_file, "")
1531        self.assertEqual(contig.reads[3].ds.time, "")
1532        self.assertEqual(contig.reads[3].ds.chem, "")
1533        self.assertEqual(contig.reads[3].ds.dye, "")
1534        self.assertEqual(contig.reads[3].ds.template, "")
1535        self.assertEqual(contig.reads[3].ds.direction, "")
1536        self.assertIsNone(contig.reads[3].rt)
1537        self.assertIsNone(contig.reads[3].wr)
1538
1539        self.assertEqual(contig.reads[4].rd.name, "R4")
1540        self.assertEqual(contig.reads[4].rd.padded_bases, 816)
1541        self.assertEqual(contig.reads[4].rd.info_items, 0)
1542        self.assertEqual(contig.reads[4].rd.read_tags, 0)
1543        center = len(contig.reads[4].rd.sequence) // 2
1544        self.assertEqual(contig.reads[4].rd.sequence[:10], "CACTCAGCTC")
1545        self.assertEqual(
1546            contig.reads[4].rd.sequence[center - 5 : center + 5], "TCCAAAGGGT"
1547        )
1548        self.assertEqual(contig.reads[4].rd.sequence[-10:], "AGCTGAATCG")
1549        self.assertEqual(contig.reads[4].qa.qual_clipping_start, 1)
1550        self.assertEqual(contig.reads[4].qa.qual_clipping_end, 799)
1551        self.assertEqual(contig.reads[4].qa.align_clipping_start, 1)
1552        self.assertEqual(contig.reads[4].qa.align_clipping_end, 799)
1553        self.assertEqual(contig.reads[4].ds.chromat_file, "")
1554        self.assertEqual(contig.reads[4].ds.phd_file, "")
1555        self.assertEqual(contig.reads[4].ds.time, "")
1556        self.assertEqual(contig.reads[4].ds.chem, "")
1557        self.assertEqual(contig.reads[4].ds.dye, "")
1558        self.assertEqual(contig.reads[4].ds.template, "")
1559        self.assertEqual(contig.reads[4].ds.direction, "")
1560        self.assertIsNone(contig.reads[4].rt)
1561        self.assertIsNone(contig.reads[4].wr)
1562
1563        self.assertEqual(contig.reads[5].rd.name, "R6")
1564        self.assertEqual(contig.reads[5].rd.padded_bases, 857)
1565        self.assertEqual(contig.reads[5].rd.info_items, 0)
1566        self.assertEqual(contig.reads[5].rd.read_tags, 0)
1567        center = len(contig.reads[5].rd.sequence) // 2
1568        self.assertEqual(contig.reads[5].rd.sequence[:10], "CCGGCAGTGA")
1569        self.assertEqual(
1570            contig.reads[5].rd.sequence[center - 5 : center + 5], "AAAAAAAACC"
1571        )
1572        self.assertEqual(contig.reads[5].rd.sequence[-10:], "NNNNNNNNNN")
1573        self.assertEqual(contig.reads[5].qa.qual_clipping_start, 24)
1574        self.assertEqual(contig.reads[5].qa.qual_clipping_end, 706)
1575        self.assertEqual(contig.reads[5].qa.align_clipping_start, 24)
1576        self.assertEqual(contig.reads[5].qa.align_clipping_end, 706)
1577        self.assertEqual(contig.reads[5].ds.chromat_file, "")
1578        self.assertEqual(contig.reads[5].ds.phd_file, "")
1579        self.assertEqual(contig.reads[5].ds.time, "")
1580        self.assertEqual(contig.reads[5].ds.chem, "")
1581        self.assertEqual(contig.reads[5].ds.dye, "")
1582        self.assertEqual(contig.reads[5].ds.template, "")
1583        self.assertEqual(contig.reads[5].ds.direction, "")
1584        self.assertIsNone(contig.reads[5].rt)
1585        self.assertIsNone(contig.reads[5].wr)
1586
1587        # Make sure there are no more contigs
1588        self.assertRaises(StopIteration, next, contigs)
1589
1590
1591class AceTestThree(unittest.TestCase):
1592    """Test parsing example ACE input file for CONSED.
1593
1594    The sample input file was downloaded from:
1595    http://bozeman.mbt.washington.edu/consed/distributions/README.16.0.txt
1596    """
1597
1598    def setUp(self):
1599        self.handle = open("Ace/consed_sample.ace")
1600
1601    def tearDown(self):
1602        self.handle.close()
1603
1604    def test_check_ACEParser(self):
1605        """Test to check that ACEParser can parse the whole file into one record."""
1606        record = Ace.read(self.handle)
1607        self.assertEqual(record.ncontigs, 1)
1608        self.assertEqual(record.nreads, 8)
1609        self.assertEqual(len(record.wa), 1)
1610        self.assertEqual(record.wa[0].tag_type, "phrap_params")
1611        self.assertEqual(record.wa[0].program, "phrap")
1612        self.assertEqual(record.wa[0].date, "990621:161947")
1613        self.assertEqual(
1614            record.wa[0].info,
1615            [
1616                "/usr/local/genome/bin/phrap standard.fasta.screen -new_ace -view",
1617                "phrap version 0.990319",
1618            ],
1619        )
1620        self.assertEqual(len(record.contigs), 1)
1621
1622        self.assertEqual(len(record.contigs[0].reads), 8)
1623        self.assertEqual(record.contigs[0].name, "Contig1")
1624        self.assertEqual(record.contigs[0].nbases, 1475)
1625        self.assertEqual(record.contigs[0].nreads, 8)
1626        self.assertEqual(record.contigs[0].nsegments, 156)
1627        self.assertEqual(record.contigs[0].uorc, "U")
1628        center = len(record.contigs[0].sequence) // 2
1629        self.assertEqual(record.contigs[0].sequence[:10], "agccccgggc")
1630        self.assertEqual(
1631            record.contigs[0].sequence[center - 5 : center + 5], "CTTCCCCAGG"
1632        )
1633        self.assertEqual(record.contigs[0].sequence[-10:], "gttgggtttg")
1634        center = len(record.contigs[0].quality) // 2
1635        self.assertEqual(record.contigs[0].quality[:10], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
1636        self.assertEqual(
1637            record.contigs[0].quality[center - 5 : center + 5],
1638            [90, 90, 90, 90, 90, 90, 90, 90, 89, 89],
1639        )
1640        self.assertEqual(
1641            record.contigs[0].quality[-10:], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1642        )
1643        self.assertEqual(len(record.contigs[0].af), 8)
1644        self.assertEqual(len(record.contigs[0].bs), 156)
1645        self.assertEqual(record.contigs[0].af[4].name, "K26-291s")
1646        self.assertEqual(record.contigs[0].af[4].coru, "U")
1647        self.assertEqual(record.contigs[0].af[4].padded_start, 828)
1648        self.assertEqual(record.contigs[0].af[7].name, "K26-766c")
1649        self.assertEqual(record.contigs[0].af[7].coru, "C")
1650        self.assertEqual(record.contigs[0].af[7].padded_start, 408)
1651        self.assertEqual(record.contigs[0].bs[78].name, "K26-394c")
1652        self.assertEqual(record.contigs[0].bs[78].padded_start, 987)
1653        self.assertEqual(record.contigs[0].bs[78].padded_end, 987)
1654        self.assertEqual(record.contigs[0].bs[155].name, "K26-822c")
1655        self.assertEqual(record.contigs[0].bs[155].padded_start, 1303)
1656        self.assertEqual(record.contigs[0].bs[155].padded_end, 1475)
1657        self.assertEqual(len(record.contigs[0].ct), 3)
1658        self.assertEqual(record.contigs[0].ct[0].name, "Contig1")
1659        self.assertEqual(record.contigs[0].ct[0].tag_type, "repeat")
1660        self.assertEqual(record.contigs[0].ct[0].program, "consed")
1661        self.assertEqual(record.contigs[0].ct[0].padded_start, 976)
1662        self.assertEqual(record.contigs[0].ct[0].padded_end, 986)
1663        self.assertEqual(record.contigs[0].ct[0].date, "971218:180623")
1664        self.assertEqual(record.contigs[0].ct[0].info, [])
1665        self.assertEqual(record.contigs[0].ct[1].name, "Contig1")
1666        self.assertEqual(record.contigs[0].ct[1].tag_type, "comment")
1667        self.assertEqual(record.contigs[0].ct[1].program, "consed")
1668        self.assertEqual(record.contigs[0].ct[1].padded_start, 996)
1669        self.assertEqual(record.contigs[0].ct[1].padded_end, 1007)
1670        self.assertEqual(record.contigs[0].ct[1].date, "971218:180623")
1671        self.assertEqual(
1672            record.contigs[0].ct[1].info,
1673            ["This is line 1 of a comment", "There may be any number of lines"],
1674        )
1675        self.assertEqual(record.contigs[0].ct[2].name, "Contig1")
1676        self.assertEqual(record.contigs[0].ct[2].tag_type, "oligo")
1677        self.assertEqual(record.contigs[0].ct[2].program, "consed")
1678        self.assertEqual(record.contigs[0].ct[2].padded_start, 963)
1679        self.assertEqual(record.contigs[0].ct[2].padded_end, 987)
1680        self.assertEqual(record.contigs[0].ct[2].date, "971218:180623")
1681        self.assertEqual(
1682            record.contigs[0].ct[2].info,
1683            ["standard.1 acataagacattctaaatttttact 50 U", "seq from clone"],
1684        )
1685        self.assertEqual(len(record.contigs[0].wa), 1)
1686        self.assertEqual(record.contigs[0].wa[0].tag_type, "phrap_params")
1687        self.assertEqual(record.contigs[0].wa[0].program, "phrap")
1688        self.assertEqual(record.contigs[0].wa[0].date, "990621:161947")
1689        self.assertEqual(
1690            record.contigs[0].wa[0].info,
1691            [
1692                "/usr/local/genome/bin/phrap standard.fasta.screen -new_ace -view",
1693                "phrap version 0.990319",
1694            ],
1695        )
1696
1697        self.assertEqual(len(record.contigs[0].reads), 8)
1698
1699        self.assertEqual(record.contigs[0].reads[0].rd.name, "K26-217c")
1700        self.assertEqual(record.contigs[0].reads[0].rd.padded_bases, 563)
1701        self.assertEqual(record.contigs[0].reads[0].rd.info_items, 0)
1702        self.assertEqual(record.contigs[0].reads[0].rd.read_tags, 0)
1703        center = len(record.contigs[0].reads[0].rd.sequence) // 2
1704        self.assertEqual(record.contigs[0].reads[0].rd.sequence[:10], "tcccCgtgag")
1705        self.assertEqual(
1706            record.contigs[0].reads[0].rd.sequence[center - 5 : center + 5],
1707            "CTCCTGcctg",
1708        )
1709        self.assertEqual(record.contigs[0].reads[0].rd.sequence[-10:], "ggcccccctc")
1710        self.assertEqual(record.contigs[0].reads[0].qa.qual_clipping_start, 19)
1711        self.assertEqual(record.contigs[0].reads[0].qa.qual_clipping_end, 349)
1712        self.assertEqual(record.contigs[0].reads[0].qa.align_clipping_start, 19)
1713        self.assertEqual(record.contigs[0].reads[0].qa.align_clipping_end, 424)
1714        self.assertEqual(record.contigs[0].reads[0].ds.chromat_file, "K26-217c")
1715        self.assertEqual(record.contigs[0].reads[0].ds.phd_file, "K26-217c.phd.1")
1716        self.assertEqual(record.contigs[0].reads[0].ds.time, "Thu Sep 12 15:42:38 1996")
1717        self.assertEqual(record.contigs[0].reads[0].ds.chem, "")
1718        self.assertEqual(record.contigs[0].reads[0].ds.dye, "")
1719        self.assertEqual(record.contigs[0].reads[0].ds.template, "")
1720        self.assertEqual(record.contigs[0].reads[0].ds.direction, "")
1721        self.assertIsNone(record.contigs[0].reads[0].rt)
1722        self.assertIsNone(record.contigs[0].reads[0].wr)
1723
1724        self.assertEqual(record.contigs[0].reads[1].rd.name, "K26-526t")
1725        self.assertEqual(record.contigs[0].reads[1].rd.padded_bases, 687)
1726        self.assertEqual(record.contigs[0].reads[1].rd.info_items, 0)
1727        self.assertEqual(record.contigs[0].reads[1].rd.read_tags, 0)
1728        center = len(record.contigs[0].reads[1].rd.sequence) // 2
1729        self.assertEqual(record.contigs[0].reads[1].rd.sequence[:10], "ccgtcctgag")
1730        self.assertEqual(
1731            record.contigs[0].reads[1].rd.sequence[center - 5 : center + 5],
1732            "cacagcccT*",
1733        )
1734        self.assertEqual(record.contigs[0].reads[1].rd.sequence[-10:], "Ttttgtttta")
1735        self.assertEqual(record.contigs[0].reads[1].qa.qual_clipping_start, 12)
1736        self.assertEqual(record.contigs[0].reads[1].qa.qual_clipping_end, 353)
1737        self.assertEqual(record.contigs[0].reads[1].qa.align_clipping_start, 9)
1738        self.assertEqual(record.contigs[0].reads[1].qa.align_clipping_end, 572)
1739        self.assertEqual(record.contigs[0].reads[1].ds.chromat_file, "K26-526t")
1740        self.assertEqual(record.contigs[0].reads[1].ds.phd_file, "K26-526t.phd.1")
1741        self.assertEqual(record.contigs[0].reads[1].ds.time, "Thu Sep 12 15:42:33 1996")
1742        self.assertEqual(record.contigs[0].reads[1].ds.chem, "")
1743        self.assertEqual(record.contigs[0].reads[1].ds.dye, "")
1744        self.assertEqual(record.contigs[0].reads[1].ds.template, "")
1745        self.assertEqual(record.contigs[0].reads[1].ds.direction, "")
1746        self.assertIsNone(record.contigs[0].reads[1].rt)
1747        self.assertIsNone(record.contigs[0].reads[1].wr)
1748
1749        self.assertEqual(record.contigs[0].reads[2].rd.name, "K26-961c")
1750        self.assertEqual(record.contigs[0].reads[2].rd.padded_bases, 517)
1751        self.assertEqual(record.contigs[0].reads[2].rd.info_items, 0)
1752        self.assertEqual(record.contigs[0].reads[2].rd.read_tags, 0)
1753        center = len(record.contigs[0].reads[2].rd.sequence) // 2
1754        self.assertEqual(record.contigs[0].reads[2].rd.sequence[:10], "aatattaccg")
1755        self.assertEqual(
1756            record.contigs[0].reads[2].rd.sequence[center - 5 : center + 5],
1757            "CAGATGGGTT",
1758        )
1759        self.assertEqual(record.contigs[0].reads[2].rd.sequence[-10:], "ctattcaggg")
1760        self.assertEqual(record.contigs[0].reads[2].qa.qual_clipping_start, 20)
1761        self.assertEqual(record.contigs[0].reads[2].qa.qual_clipping_end, 415)
1762        self.assertEqual(record.contigs[0].reads[2].qa.align_clipping_start, 26)
1763        self.assertEqual(record.contigs[0].reads[2].qa.align_clipping_end, 514)
1764        self.assertEqual(record.contigs[0].reads[2].ds.chromat_file, "K26-961c")
1765        self.assertEqual(record.contigs[0].reads[2].ds.phd_file, "K26-961c.phd.1")
1766        self.assertEqual(record.contigs[0].reads[2].ds.time, "Thu Sep 12 15:42:37 1996")
1767        self.assertEqual(record.contigs[0].reads[2].ds.chem, "")
1768        self.assertEqual(record.contigs[0].reads[2].ds.dye, "")
1769        self.assertEqual(record.contigs[0].reads[2].ds.template, "")
1770        self.assertEqual(record.contigs[0].reads[2].ds.direction, "")
1771        self.assertIsNone(record.contigs[0].reads[2].rt)
1772        self.assertIsNone(record.contigs[0].reads[2].wr)
1773
1774        self.assertEqual(record.contigs[0].reads[3].rd.name, "K26-394c")
1775        self.assertEqual(record.contigs[0].reads[3].rd.padded_bases, 628)
1776        self.assertEqual(record.contigs[0].reads[3].rd.info_items, 0)
1777        self.assertEqual(record.contigs[0].reads[3].rd.read_tags, 0)
1778        center = len(record.contigs[0].reads[3].rd.sequence) // 2
1779        self.assertEqual(record.contigs[0].reads[3].rd.sequence[:10], "ctgcgtatcg")
1780        self.assertEqual(
1781            record.contigs[0].reads[3].rd.sequence[center - 5 : center + 5],
1782            "AGGATTGCTT",
1783        )
1784        self.assertEqual(record.contigs[0].reads[3].rd.sequence[-10:], "aaccctgggt")
1785        self.assertEqual(record.contigs[0].reads[3].qa.qual_clipping_start, 18)
1786        self.assertEqual(record.contigs[0].reads[3].qa.qual_clipping_end, 368)
1787        self.assertEqual(record.contigs[0].reads[3].qa.align_clipping_start, 11)
1788        self.assertEqual(record.contigs[0].reads[3].qa.align_clipping_end, 502)
1789        self.assertEqual(record.contigs[0].reads[3].ds.chromat_file, "K26-394c")
1790        self.assertEqual(record.contigs[0].reads[3].ds.phd_file, "K26-394c.phd.1")
1791        self.assertEqual(record.contigs[0].reads[3].ds.time, "Thu Sep 12 15:42:32 1996")
1792        self.assertEqual(record.contigs[0].reads[3].ds.chem, "")
1793        self.assertEqual(record.contigs[0].reads[3].ds.dye, "")
1794        self.assertEqual(record.contigs[0].reads[3].ds.template, "")
1795        self.assertEqual(record.contigs[0].reads[3].ds.direction, "")
1796        self.assertIsNone(record.contigs[0].reads[3].rt)
1797        self.assertIsNone(record.contigs[0].reads[3].wr)
1798
1799        self.assertEqual(record.contigs[0].reads[4].rd.name, "K26-291s")
1800        self.assertEqual(record.contigs[0].reads[4].rd.padded_bases, 556)
1801        self.assertEqual(record.contigs[0].reads[4].rd.info_items, 0)
1802        self.assertEqual(record.contigs[0].reads[4].rd.read_tags, 0)
1803        center = len(record.contigs[0].reads[4].rd.sequence) // 2
1804        self.assertEqual(record.contigs[0].reads[4].rd.sequence[:10], "gaggatcgct")
1805        self.assertEqual(
1806            record.contigs[0].reads[4].rd.sequence[center - 5 : center + 5],
1807            "GTgcgaggat",
1808        )
1809        self.assertEqual(record.contigs[0].reads[4].rd.sequence[-10:], "caggcagatg")
1810        self.assertEqual(record.contigs[0].reads[4].qa.qual_clipping_start, 11)
1811        self.assertEqual(record.contigs[0].reads[4].qa.qual_clipping_end, 373)
1812        self.assertEqual(record.contigs[0].reads[4].qa.align_clipping_start, 11)
1813        self.assertEqual(record.contigs[0].reads[4].qa.align_clipping_end, 476)
1814        self.assertEqual(record.contigs[0].reads[4].ds.chromat_file, "K26-291s")
1815        self.assertEqual(record.contigs[0].reads[4].ds.phd_file, "K26-291s.phd.1")
1816        self.assertEqual(record.contigs[0].reads[4].ds.time, "Thu Sep 12 15:42:31 1996")
1817        self.assertEqual(record.contigs[0].reads[4].ds.chem, "")
1818        self.assertEqual(record.contigs[0].reads[4].ds.dye, "")
1819        self.assertEqual(record.contigs[0].reads[4].ds.template, "")
1820        self.assertEqual(record.contigs[0].reads[4].ds.direction, "")
1821        self.assertIsNone(record.contigs[0].reads[4].rt)
1822        self.assertIsNone(record.contigs[0].reads[4].wr)
1823
1824        self.assertEqual(record.contigs[0].reads[5].rd.name, "K26-822c")
1825        self.assertEqual(record.contigs[0].reads[5].rd.padded_bases, 593)
1826        self.assertEqual(record.contigs[0].reads[5].rd.info_items, 0)
1827        self.assertEqual(record.contigs[0].reads[5].rd.read_tags, 0)
1828        center = len(record.contigs[0].reads[5].rd.sequence) // 2
1829        self.assertEqual(record.contigs[0].reads[5].rd.sequence[:10], "ggggatccg*")
1830        self.assertEqual(
1831            record.contigs[0].reads[5].rd.sequence[center - 5 : center + 5],
1832            "GCaAgacCCt",
1833        )
1834        self.assertEqual(record.contigs[0].reads[5].rd.sequence[-10:], "gttgggtttg")
1835
1836        self.assertEqual(record.contigs[0].reads[5].qa.qual_clipping_start, 25)
1837        self.assertEqual(record.contigs[0].reads[5].qa.qual_clipping_end, 333)
1838        self.assertEqual(record.contigs[0].reads[5].qa.align_clipping_start, 16)
1839        self.assertEqual(record.contigs[0].reads[5].qa.align_clipping_end, 593)
1840        self.assertEqual(record.contigs[0].reads[5].ds.chromat_file, "K26-822c")
1841        self.assertEqual(record.contigs[0].reads[5].ds.phd_file, "K26-822c.phd.1")
1842        self.assertEqual(record.contigs[0].reads[5].ds.time, "Thu Sep 12 15:42:36 1996")
1843        self.assertEqual(record.contigs[0].reads[5].ds.chem, "")
1844        self.assertEqual(record.contigs[0].reads[5].ds.dye, "")
1845        self.assertEqual(record.contigs[0].reads[5].ds.template, "")
1846        self.assertEqual(record.contigs[0].reads[5].ds.direction, "")
1847        self.assertIsNone(record.contigs[0].reads[5].rt)
1848        self.assertIsNone(record.contigs[0].reads[5].wr)
1849
1850        self.assertEqual(record.contigs[0].reads[6].rd.name, "K26-572c")
1851        self.assertEqual(record.contigs[0].reads[6].rd.padded_bases, 594)
1852        self.assertEqual(record.contigs[0].reads[6].rd.info_items, 0)
1853        self.assertEqual(record.contigs[0].reads[6].rd.read_tags, 0)
1854        center = len(record.contigs[0].reads[6].rd.sequence) // 2
1855        self.assertEqual(record.contigs[0].reads[6].rd.sequence[:10], "agccccgggc")
1856        self.assertEqual(
1857            record.contigs[0].reads[6].rd.sequence[center - 5 : center + 5],
1858            "ggatcACATA",
1859        )
1860        self.assertEqual(record.contigs[0].reads[6].rd.sequence[-10:], "aatagtaaca")
1861        self.assertEqual(record.contigs[0].reads[6].qa.qual_clipping_start, 249)
1862        self.assertEqual(record.contigs[0].reads[6].qa.qual_clipping_end, 584)
1863        self.assertEqual(record.contigs[0].reads[6].qa.align_clipping_start, 1)
1864        self.assertEqual(record.contigs[0].reads[6].qa.align_clipping_end, 586)
1865        self.assertEqual(record.contigs[0].reads[6].ds.chromat_file, "K26-572c")
1866        self.assertEqual(record.contigs[0].reads[6].ds.phd_file, "K26-572c.phd.1")
1867        self.assertEqual(record.contigs[0].reads[6].ds.time, "Thu Sep 12 15:42:34 1996")
1868        self.assertEqual(record.contigs[0].reads[6].ds.chem, "")
1869        self.assertEqual(record.contigs[0].reads[6].ds.dye, "")
1870        self.assertEqual(record.contigs[0].reads[6].ds.template, "")
1871        self.assertEqual(record.contigs[0].reads[6].ds.direction, "")
1872        self.assertIsNone(record.contigs[0].reads[6].rt)
1873        self.assertIsNone(record.contigs[0].reads[6].wr)
1874
1875        self.assertEqual(record.contigs[0].reads[7].rd.name, "K26-766c")
1876        self.assertEqual(record.contigs[0].reads[7].rd.padded_bases, 603)
1877        self.assertEqual(record.contigs[0].reads[7].rd.info_items, 0)
1878        self.assertEqual(record.contigs[0].reads[7].rd.read_tags, 0)
1879        center = len(record.contigs[0].reads[7].rd.sequence) // 2
1880        self.assertEqual(record.contigs[0].reads[7].rd.sequence[:10], "gaataattgg")
1881        self.assertEqual(
1882            record.contigs[0].reads[7].rd.sequence[center - 5 : center + 5],
1883            "TggCCCATCT",
1884        )
1885        self.assertEqual(record.contigs[0].reads[7].rd.sequence[-10:], "gaaccacacg")
1886        self.assertEqual(record.contigs[0].reads[7].qa.qual_clipping_start, 240)
1887        self.assertEqual(record.contigs[0].reads[7].qa.qual_clipping_end, 584)
1888        self.assertEqual(record.contigs[0].reads[7].qa.align_clipping_start, 126)
1889        self.assertEqual(record.contigs[0].reads[7].qa.align_clipping_end, 583)
1890        self.assertEqual(record.contigs[0].reads[7].ds.chromat_file, "K26-766c")
1891        self.assertEqual(record.contigs[0].reads[7].ds.phd_file, "K26-766c.phd.1")
1892        self.assertEqual(record.contigs[0].reads[7].ds.time, "Thu Sep 12 15:42:35 1996")
1893        self.assertEqual(record.contigs[0].reads[7].ds.chem, "")
1894        self.assertEqual(record.contigs[0].reads[7].ds.dye, "")
1895        self.assertEqual(record.contigs[0].reads[7].ds.template, "")
1896        self.assertEqual(record.contigs[0].reads[7].ds.direction, "")
1897        self.assertIsNone(record.contigs[0].reads[7].rt)
1898        self.assertIsNone(record.contigs[0].reads[7].wr)
1899
1900    def test_check_record_parser(self):
1901        """Test to check that record parser parses each contig into a record."""
1902        contigs = Ace.parse(self.handle)
1903
1904        # First (and only) contig
1905        contig = next(contigs)
1906
1907        self.assertEqual(len(contig.reads), 8)
1908        self.assertEqual(contig.name, "Contig1")
1909        self.assertEqual(contig.nbases, 1475)
1910        self.assertEqual(contig.nreads, 8)
1911        self.assertEqual(contig.nsegments, 156)
1912        self.assertEqual(contig.uorc, "U")
1913        center = len(contig.sequence) // 2
1914        self.assertEqual(contig.sequence[:10], "agccccgggc")
1915        self.assertEqual(contig.sequence[center - 5 : center + 5], "CTTCCCCAGG")
1916        self.assertEqual(contig.sequence[-10:], "gttgggtttg")
1917        center = len(contig.quality) // 2
1918        self.assertEqual(contig.quality[:10], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
1919        self.assertEqual(
1920            contig.quality[center - 5 : center + 5],
1921            [90, 90, 90, 90, 90, 90, 90, 90, 89, 89],
1922        )
1923        self.assertEqual(contig.quality[-10:], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
1924        self.assertEqual(len(contig.af), 8)
1925        self.assertEqual(len(contig.bs), 156)
1926        self.assertEqual(contig.af[4].name, "K26-291s")
1927        self.assertEqual(contig.af[4].coru, "U")
1928        self.assertEqual(contig.af[4].padded_start, 828)
1929        self.assertEqual(contig.af[7].name, "K26-766c")
1930        self.assertEqual(contig.af[7].coru, "C")
1931        self.assertEqual(contig.af[7].padded_start, 408)
1932        self.assertEqual(contig.bs[78].name, "K26-394c")
1933        self.assertEqual(contig.bs[78].padded_start, 987)
1934        self.assertEqual(contig.bs[78].padded_end, 987)
1935        self.assertEqual(contig.bs[155].name, "K26-822c")
1936        self.assertEqual(contig.bs[155].padded_start, 1303)
1937        self.assertEqual(contig.bs[155].padded_end, 1475)
1938        self.assertEqual(len(contig.ct), 3)
1939        self.assertEqual(contig.ct[0].name, "Contig1")
1940        self.assertEqual(contig.ct[0].tag_type, "repeat")
1941        self.assertEqual(contig.ct[0].program, "consed")
1942        self.assertEqual(contig.ct[0].padded_start, 976)
1943        self.assertEqual(contig.ct[0].padded_end, 986)
1944        self.assertEqual(contig.ct[0].date, "971218:180623")
1945        self.assertEqual(contig.ct[0].info, [])
1946        self.assertEqual(contig.ct[1].name, "Contig1")
1947        self.assertEqual(contig.ct[1].tag_type, "comment")
1948        self.assertEqual(contig.ct[1].program, "consed")
1949        self.assertEqual(contig.ct[1].padded_start, 996)
1950        self.assertEqual(contig.ct[1].padded_end, 1007)
1951        self.assertEqual(contig.ct[1].date, "971218:180623")
1952        self.assertEqual(
1953            contig.ct[1].info,
1954            ["This is line 1 of a comment", "There may be any number of lines"],
1955        )
1956        self.assertEqual(contig.ct[2].name, "Contig1")
1957        self.assertEqual(contig.ct[2].tag_type, "oligo")
1958        self.assertEqual(contig.ct[2].program, "consed")
1959        self.assertEqual(contig.ct[2].padded_start, 963)
1960        self.assertEqual(contig.ct[2].padded_end, 987)
1961        self.assertEqual(contig.ct[2].date, "971218:180623")
1962        self.assertEqual(
1963            contig.ct[2].info,
1964            ["standard.1 acataagacattctaaatttttact 50 U", "seq from clone"],
1965        )
1966        self.assertEqual(len(contig.wa), 1)
1967        self.assertEqual(contig.wa[0].tag_type, "phrap_params")
1968        self.assertEqual(contig.wa[0].program, "phrap")
1969        self.assertEqual(contig.wa[0].date, "990621:161947")
1970        self.assertEqual(
1971            contig.wa[0].info,
1972            [
1973                "/usr/local/genome/bin/phrap standard.fasta.screen -new_ace -view",
1974                "phrap version 0.990319",
1975            ],
1976        )
1977
1978        self.assertEqual(len(contig.reads), 8)
1979
1980        self.assertEqual(contig.reads[0].rd.name, "K26-217c")
1981        self.assertEqual(contig.reads[0].rd.padded_bases, 563)
1982        self.assertEqual(contig.reads[0].rd.info_items, 0)
1983        self.assertEqual(contig.reads[0].rd.read_tags, 0)
1984        center = len(contig.reads[0].rd.sequence) // 2
1985        self.assertEqual(contig.reads[0].rd.sequence[:10], "tcccCgtgag")
1986        self.assertEqual(
1987            contig.reads[0].rd.sequence[center - 5 : center + 5], "CTCCTGcctg"
1988        )
1989        self.assertEqual(contig.reads[0].rd.sequence[-10:], "ggcccccctc")
1990        self.assertEqual(contig.reads[0].qa.qual_clipping_start, 19)
1991        self.assertEqual(contig.reads[0].qa.qual_clipping_end, 349)
1992        self.assertEqual(contig.reads[0].qa.align_clipping_start, 19)
1993        self.assertEqual(contig.reads[0].qa.align_clipping_end, 424)
1994        self.assertEqual(contig.reads[0].ds.chromat_file, "K26-217c")
1995        self.assertEqual(contig.reads[0].ds.phd_file, "K26-217c.phd.1")
1996        self.assertEqual(contig.reads[0].ds.time, "Thu Sep 12 15:42:38 1996")
1997        self.assertEqual(contig.reads[0].ds.chem, "")
1998        self.assertEqual(contig.reads[0].ds.dye, "")
1999        self.assertEqual(contig.reads[0].ds.template, "")
2000        self.assertEqual(contig.reads[0].ds.direction, "")
2001        self.assertIsNone(contig.reads[0].rt)
2002        self.assertIsNone(contig.reads[0].wr)
2003
2004        self.assertEqual(contig.reads[1].rd.name, "K26-526t")
2005        self.assertEqual(contig.reads[1].rd.padded_bases, 687)
2006        self.assertEqual(contig.reads[1].rd.info_items, 0)
2007        self.assertEqual(contig.reads[1].rd.read_tags, 0)
2008        center = len(contig.reads[1].rd.sequence) // 2
2009        self.assertEqual(contig.reads[1].rd.sequence[:10], "ccgtcctgag")
2010        self.assertEqual(
2011            contig.reads[1].rd.sequence[center - 5 : center + 5], "cacagcccT*"
2012        )
2013        self.assertEqual(contig.reads[1].rd.sequence[-10:], "Ttttgtttta")
2014        self.assertEqual(contig.reads[1].qa.qual_clipping_start, 12)
2015        self.assertEqual(contig.reads[1].qa.qual_clipping_end, 353)
2016        self.assertEqual(contig.reads[1].qa.align_clipping_start, 9)
2017        self.assertEqual(contig.reads[1].qa.align_clipping_end, 572)
2018        self.assertEqual(contig.reads[1].ds.chromat_file, "K26-526t")
2019        self.assertEqual(contig.reads[1].ds.phd_file, "K26-526t.phd.1")
2020        self.assertEqual(contig.reads[1].ds.time, "Thu Sep 12 15:42:33 1996")
2021        self.assertEqual(contig.reads[1].ds.chem, "")
2022        self.assertEqual(contig.reads[1].ds.dye, "")
2023        self.assertEqual(contig.reads[1].ds.template, "")
2024        self.assertEqual(contig.reads[1].ds.direction, "")
2025        self.assertIsNone(contig.reads[1].rt)
2026        self.assertIsNone(contig.reads[1].wr)
2027
2028        self.assertEqual(contig.reads[2].rd.name, "K26-961c")
2029        self.assertEqual(contig.reads[2].rd.padded_bases, 517)
2030        self.assertEqual(contig.reads[2].rd.info_items, 0)
2031        self.assertEqual(contig.reads[2].rd.read_tags, 0)
2032        center = len(contig.reads[2].rd.sequence) // 2
2033        self.assertEqual(contig.reads[2].rd.sequence[:10], "aatattaccg")
2034        self.assertEqual(
2035            contig.reads[2].rd.sequence[center - 5 : center + 5], "CAGATGGGTT"
2036        )
2037        self.assertEqual(contig.reads[2].rd.sequence[-10:], "ctattcaggg")
2038        self.assertEqual(contig.reads[2].qa.qual_clipping_start, 20)
2039        self.assertEqual(contig.reads[2].qa.qual_clipping_end, 415)
2040        self.assertEqual(contig.reads[2].qa.align_clipping_start, 26)
2041        self.assertEqual(contig.reads[2].qa.align_clipping_end, 514)
2042        self.assertEqual(contig.reads[2].ds.chromat_file, "K26-961c")
2043        self.assertEqual(contig.reads[2].ds.phd_file, "K26-961c.phd.1")
2044        self.assertEqual(contig.reads[2].ds.time, "Thu Sep 12 15:42:37 1996")
2045        self.assertEqual(contig.reads[2].ds.chem, "")
2046        self.assertEqual(contig.reads[2].ds.dye, "")
2047        self.assertEqual(contig.reads[2].ds.template, "")
2048        self.assertEqual(contig.reads[2].ds.direction, "")
2049        self.assertIsNone(contig.reads[2].rt)
2050        self.assertIsNone(contig.reads[2].wr)
2051
2052        self.assertEqual(contig.reads[3].rd.name, "K26-394c")
2053        self.assertEqual(contig.reads[3].rd.padded_bases, 628)
2054        self.assertEqual(contig.reads[3].rd.info_items, 0)
2055        self.assertEqual(contig.reads[3].rd.read_tags, 0)
2056        center = len(contig.reads[3].rd.sequence) // 2
2057        self.assertEqual(contig.reads[3].rd.sequence[:10], "ctgcgtatcg")
2058        self.assertEqual(
2059            contig.reads[3].rd.sequence[center - 5 : center + 5], "AGGATTGCTT"
2060        )
2061        self.assertEqual(contig.reads[3].rd.sequence[-10:], "aaccctgggt")
2062        self.assertEqual(contig.reads[3].qa.qual_clipping_start, 18)
2063        self.assertEqual(contig.reads[3].qa.qual_clipping_end, 368)
2064        self.assertEqual(contig.reads[3].qa.align_clipping_start, 11)
2065        self.assertEqual(contig.reads[3].qa.align_clipping_end, 502)
2066        self.assertEqual(contig.reads[3].ds.chromat_file, "K26-394c")
2067        self.assertEqual(contig.reads[3].ds.phd_file, "K26-394c.phd.1")
2068        self.assertEqual(contig.reads[3].ds.time, "Thu Sep 12 15:42:32 1996")
2069        self.assertEqual(contig.reads[3].ds.chem, "")
2070        self.assertEqual(contig.reads[3].ds.dye, "")
2071        self.assertEqual(contig.reads[3].ds.template, "")
2072        self.assertEqual(contig.reads[3].ds.direction, "")
2073        self.assertIsNone(contig.reads[3].rt)
2074        self.assertIsNone(contig.reads[3].wr)
2075
2076        self.assertEqual(contig.reads[4].rd.name, "K26-291s")
2077        self.assertEqual(contig.reads[4].rd.padded_bases, 556)
2078        self.assertEqual(contig.reads[4].rd.info_items, 0)
2079        self.assertEqual(contig.reads[4].rd.read_tags, 0)
2080        center = len(contig.reads[4].rd.sequence) // 2
2081        self.assertEqual(contig.reads[4].rd.sequence[:10], "gaggatcgct")
2082        self.assertEqual(
2083            contig.reads[4].rd.sequence[center - 5 : center + 5], "GTgcgaggat"
2084        )
2085        self.assertEqual(contig.reads[4].rd.sequence[-10:], "caggcagatg")
2086        self.assertEqual(contig.reads[4].qa.qual_clipping_start, 11)
2087        self.assertEqual(contig.reads[4].qa.qual_clipping_end, 373)
2088        self.assertEqual(contig.reads[4].qa.align_clipping_start, 11)
2089        self.assertEqual(contig.reads[4].qa.align_clipping_end, 476)
2090        self.assertEqual(contig.reads[4].ds.chromat_file, "K26-291s")
2091        self.assertEqual(contig.reads[4].ds.phd_file, "K26-291s.phd.1")
2092        self.assertEqual(contig.reads[4].ds.time, "Thu Sep 12 15:42:31 1996")
2093        self.assertEqual(contig.reads[4].ds.chem, "")
2094        self.assertEqual(contig.reads[4].ds.dye, "")
2095        self.assertEqual(contig.reads[4].ds.template, "")
2096        self.assertEqual(contig.reads[4].ds.direction, "")
2097        self.assertIsNone(contig.reads[4].rt)
2098        self.assertIsNone(contig.reads[4].wr)
2099
2100        self.assertEqual(contig.reads[5].rd.name, "K26-822c")
2101        self.assertEqual(contig.reads[5].rd.padded_bases, 593)
2102        self.assertEqual(contig.reads[5].rd.info_items, 0)
2103        self.assertEqual(contig.reads[5].rd.read_tags, 0)
2104        center = len(contig.reads[5].rd.sequence) // 2
2105        self.assertEqual(contig.reads[5].rd.sequence[:10], "ggggatccg*")
2106        self.assertEqual(
2107            contig.reads[5].rd.sequence[center - 5 : center + 5], "GCaAgacCCt"
2108        )
2109        self.assertEqual(contig.reads[5].rd.sequence[-10:], "gttgggtttg")
2110
2111        self.assertEqual(contig.reads[5].qa.qual_clipping_start, 25)
2112        self.assertEqual(contig.reads[5].qa.qual_clipping_end, 333)
2113        self.assertEqual(contig.reads[5].qa.align_clipping_start, 16)
2114        self.assertEqual(contig.reads[5].qa.align_clipping_end, 593)
2115        self.assertEqual(contig.reads[5].ds.chromat_file, "K26-822c")
2116        self.assertEqual(contig.reads[5].ds.phd_file, "K26-822c.phd.1")
2117        self.assertEqual(contig.reads[5].ds.time, "Thu Sep 12 15:42:36 1996")
2118        self.assertEqual(contig.reads[5].ds.chem, "")
2119        self.assertEqual(contig.reads[5].ds.dye, "")
2120        self.assertEqual(contig.reads[5].ds.template, "")
2121        self.assertEqual(contig.reads[5].ds.direction, "")
2122        self.assertIsNone(contig.reads[5].rt)
2123        self.assertIsNone(contig.reads[5].wr)
2124
2125        self.assertEqual(contig.reads[6].rd.name, "K26-572c")
2126        self.assertEqual(contig.reads[6].rd.padded_bases, 594)
2127        self.assertEqual(contig.reads[6].rd.info_items, 0)
2128        self.assertEqual(contig.reads[6].rd.read_tags, 0)
2129        center = len(contig.reads[6].rd.sequence) // 2
2130        self.assertEqual(contig.reads[6].rd.sequence[:10], "agccccgggc")
2131        self.assertEqual(
2132            contig.reads[6].rd.sequence[center - 5 : center + 5], "ggatcACATA"
2133        )
2134        self.assertEqual(contig.reads[6].rd.sequence[-10:], "aatagtaaca")
2135        self.assertEqual(contig.reads[6].qa.qual_clipping_start, 249)
2136        self.assertEqual(contig.reads[6].qa.qual_clipping_end, 584)
2137        self.assertEqual(contig.reads[6].qa.align_clipping_start, 1)
2138        self.assertEqual(contig.reads[6].qa.align_clipping_end, 586)
2139        self.assertEqual(contig.reads[6].ds.chromat_file, "K26-572c")
2140        self.assertEqual(contig.reads[6].ds.phd_file, "K26-572c.phd.1")
2141        self.assertEqual(contig.reads[6].ds.time, "Thu Sep 12 15:42:34 1996")
2142        self.assertEqual(contig.reads[6].ds.chem, "")
2143        self.assertEqual(contig.reads[6].ds.dye, "")
2144        self.assertEqual(contig.reads[6].ds.template, "")
2145        self.assertEqual(contig.reads[6].ds.direction, "")
2146        self.assertIsNone(contig.reads[6].rt)
2147        self.assertIsNone(contig.reads[6].wr)
2148
2149        self.assertEqual(contig.reads[7].rd.name, "K26-766c")
2150        self.assertEqual(contig.reads[7].rd.padded_bases, 603)
2151        self.assertEqual(contig.reads[7].rd.info_items, 0)
2152        self.assertEqual(contig.reads[7].rd.read_tags, 0)
2153        center = len(contig.reads[7].rd.sequence) // 2
2154        self.assertEqual(contig.reads[7].rd.sequence[:10], "gaataattgg")
2155        self.assertEqual(
2156            contig.reads[7].rd.sequence[center - 5 : center + 5], "TggCCCATCT"
2157        )
2158        self.assertEqual(contig.reads[7].rd.sequence[-10:], "gaaccacacg")
2159        self.assertEqual(contig.reads[7].qa.qual_clipping_start, 240)
2160        self.assertEqual(contig.reads[7].qa.qual_clipping_end, 584)
2161        self.assertEqual(contig.reads[7].qa.align_clipping_start, 126)
2162        self.assertEqual(contig.reads[7].qa.align_clipping_end, 583)
2163        self.assertEqual(contig.reads[7].ds.chromat_file, "K26-766c")
2164        self.assertEqual(contig.reads[7].ds.phd_file, "K26-766c.phd.1")
2165        self.assertEqual(contig.reads[7].ds.time, "Thu Sep 12 15:42:35 1996")
2166        self.assertEqual(contig.reads[7].ds.chem, "")
2167        self.assertEqual(contig.reads[7].ds.dye, "")
2168        self.assertEqual(contig.reads[7].ds.template, "")
2169        self.assertEqual(contig.reads[7].ds.direction, "")
2170        self.assertIsNone(contig.reads[7].rt)
2171        self.assertIsNone(contig.reads[7].wr)
2172
2173        # Make sure there are no more contigs
2174        self.assertRaises(StopIteration, next, contigs)
2175
2176
2177if __name__ == "__main__":
2178    runner = unittest.TextTestRunner(verbosity=2)
2179    unittest.main(testRunner=runner)
2180